ZGlmZiAtLWdpdCBhL3VuaXgvQUJPVVQtTkxTIGIvdW5peC9BQk9VVC1OTFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1MGM2NgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvQUJPVVQtTkxTCkBAIC0wLDAgKzEsNzY4IEBACitOb3RlcyBvbiB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0ZyZWUgc29mdHdhcmUgaXMgZ29pbmcgaW50ZXJuYXRpb25hbCEgIFRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgaXMKK2Egd2F5IHRvIGdldCBtYWludGFpbmVycyBvZiBmcmVlIHNvZnR3YXJlLCB0cmFuc2xhdG9ycywgYW5kIHVzZXJzIGFsbAordG9nZXRoZXIsIHNvIHRoYXQgd2lsbCBncmFkdWFsbHkgYmVjb21lIGFibGUgdG8gc3BlYWsgbWFueSBsYW5ndWFnZXMuCitBIGZldyBwYWNrYWdlcyBhbHJlYWR5IHByb3ZpZGUgdHJhbnNsYXRpb25zIGZvciB0aGVpciBtZXNzYWdlcy4KKworICAgSWYgeW91IGZvdW5kIHRoaXMgYEFCT1VULU5MUycgZmlsZSBpbnNpZGUgYSBkaXN0cmlidXRpb24sIHlvdSBtYXkKK2Fzc3VtZSB0aGF0IHRoZSBkaXN0cmlidXRlZCBwYWNrYWdlIGRvZXMgdXNlIEdOVSBgZ2V0dGV4dCcgaW50ZXJuYWxseSwKK2l0c2VsZiBhdmFpbGFibGUgYXQgeW91ciBuZWFyZXN0IEdOVSBhcmNoaXZlIHNpdGUuICBCdXQgeW91IGRvIF9ub3RfCituZWVkIHRvIGluc3RhbGwgR05VIGBnZXR0ZXh0JyBwcmlvciB0byBjb25maWd1cmluZywgaW5zdGFsbGluZyBvciB1c2luZwordGhpcyBwYWNrYWdlIHdpdGggbWVzc2FnZXMgdHJhbnNsYXRlZC4KKworICAgSW5zdGFsbGVycyB3aWxsIGZpbmQgaGVyZSBzb21lIHVzZWZ1bCBoaW50cy4gIFRoZXNlIG5vdGVzIGFsc28KK2V4cGxhaW4gaG93IHVzZXJzIHNob3VsZCBwcm9jZWVkIGZvciBnZXR0aW5nIHRoZSBwcm9ncmFtcyB0byB1c2UgdGhlCithdmFpbGFibGUgdHJhbnNsYXRpb25zLiAgVGhleSB0ZWxsIGhvdyBwZW9wbGUgd2FudGluZyB0byBjb250cmlidXRlIGFuZAord29yayBhdCB0cmFuc2xhdGlvbnMgc2hvdWxkIGNvbnRhY3QgdGhlIGFwcHJvcHJpYXRlIHRlYW0uCisKKyAgIFdoZW4gcmVwb3J0aW5nIGJ1Z3MgaW4gdGhlIGBpbnRsLycgZGlyZWN0b3J5IG9yIGJ1Z3Mgd2hpY2ggbWF5IGJlCityZWxhdGVkIHRvIGludGVybmF0aW9uYWxpemF0aW9uLCB5b3Ugc2hvdWxkIHRlbGwgYWJvdXQgdGhlIHZlcnNpb24gb2YKK2BnZXR0ZXh0JyB3aGljaCBpcyB1c2VkLiAgVGhlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUKK2BpbnRsL1ZFUlNJT04nIGZpbGUsIGluIGludGVybmF0aW9uYWxpemVkIHBhY2thZ2VzLgorCitRdWljayBjb25maWd1cmF0aW9uIGFkdmljZQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSWYgeW91IHdhbnQgdG8gZXhwbG9pdCB0aGUgZnVsbCBwb3dlciBvZiBpbnRlcm5hdGlvbmFsaXphdGlvbiwgeW91CitzaG91bGQgY29uZmlndXJlIGl0IHVzaW5nCisKKyAgICAgLi9jb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQKKwordG8gZm9yY2UgdXNhZ2Ugb2YgaW50ZXJuYXRpb25hbGl6aW5nIHJvdXRpbmVzIHByb3ZpZGVkIHdpdGhpbiB0aGlzCitwYWNrYWdlLCBkZXNwaXRlIHRoZSBleGlzdGVuY2Ugb2YgaW50ZXJuYXRpb25hbGl6aW5nIGNhcGFiaWxpdGllcyBpbiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gd2hlcmUgdGhpcyBwYWNrYWdlIGlzIGJlaW5nIGluc3RhbGxlZC4gIFNvIGZhciwgb25seQordGhlIGBnZXR0ZXh0JyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgR05VIEMgbGlicmFyeSB2ZXJzaW9uIDIgcHJvdmlkZXMgYXMKK21hbnkgZmVhdHVyZXMgKHN1Y2ggYXMgbG9jYWxlIGFsaWFzLCBtZXNzYWdlIGluaGVyaXRhbmNlLCBhdXRvbWF0aWMKK2NoYXJzZXQgY29udmVyc2lvbiBvciBwbHVyYWwgZm9ybSBoYW5kbGluZykgYXMgdGhlIGltcGxlbWVudGF0aW9uIGhlcmUuCitJdCBpcyBhbHNvIG5vdCBwb3NzaWJsZSB0byBvZmZlciB0aGlzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvbiB0b3AKK29mIGEgYGNhdGdldHMnIGltcGxlbWVudGF0aW9uLiAgRnV0dXJlIHZlcnNpb25zIG9mIEdOVSBgZ2V0dGV4dCcgd2lsbAordmVyeSBsaWtlbHkgY29udmV5IGV2ZW4gbW9yZSBmdW5jdGlvbmFsaXR5LiAgU28gaXQgbWlnaHQgYmUgYSBnb29kIGlkZWEKK3RvIGNoYW5nZSB0byBHTlUgYGdldHRleHQnIGFzIHNvb24gYXMgcG9zc2libGUuCisKKyAgIFNvIHlvdSBuZWVkIF9ub3RfIHByb3ZpZGUgdGhpcyBvcHRpb24gaWYgeW91IGFyZSB1c2luZyBHTlUgbGliYyAyIG9yCit5b3UgaGF2ZSBpbnN0YWxsZWQgYSByZWNlbnQgY29weSBvZiB0aGUgR05VIGdldHRleHQgcGFja2FnZSB3aXRoIHRoZQoraW5jbHVkZWQgYGxpYmludGwnLgorCitJTlNUQUxMIE1hdHRlcnMKKz09PT09PT09PT09PT09PQorCitTb21lIHBhY2thZ2VzIGFyZSAibG9jYWxpemFibGUiIHdoZW4gcHJvcGVybHkgaW5zdGFsbGVkOyB0aGUgcHJvZ3JhbXMKK3RoZXkgY29udGFpbiBjYW4gYmUgbWFkZSB0byBzcGVhayB5b3VyIG93biBuYXRpdmUgbGFuZ3VhZ2UuICBNb3N0IHN1Y2gKK3BhY2thZ2VzIHVzZSBHTlUgYGdldHRleHQnLiAgT3RoZXIgcGFja2FnZXMgaGF2ZSB0aGVpciBvd24gd2F5cyB0bworaW50ZXJuYXRpb25hbGl6YXRpb24sIHByZWRhdGluZyBHTlUgYGdldHRleHQnLgorCisgICBCeSBkZWZhdWx0LCB0aGlzIHBhY2thZ2Ugd2lsbCBiZSBpbnN0YWxsZWQgdG8gYWxsb3cgdHJhbnNsYXRpb24gb2YKK21lc3NhZ2VzLiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRoZSBzeXN0ZW0gYWxyZWFkeQorcHJvdmlkZXMgdGhlIEdOVSBgZ2V0dGV4dCcgZnVuY3Rpb25zLiAgSWYgbm90LCB0aGUgR05VIGBnZXR0ZXh0JyBvd24KK2xpYnJhcnkgd2lsbCBiZSB1c2VkLiAgVGhpcyBsaWJyYXJ5IGlzIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoaXMKK3BhY2thZ2UsIHVzdWFsbHkgaW4gdGhlIGBpbnRsLycgc3ViZGlyZWN0b3J5LCBzbyBwcmlvciBpbnN0YWxsYXRpb24gb2YKK3RoZSBHTlUgYGdldHRleHQnIHBhY2thZ2UgaXMgX25vdF8gcmVxdWlyZWQuICBJbnN0YWxsZXJzIG1heSB1c2UKK3NwZWNpYWwgb3B0aW9ucyBhdCBjb25maWd1cmF0aW9uIHRpbWUgZm9yIGNoYW5naW5nIHRoZSBkZWZhdWx0CitiZWhhdmlvdXIuICBUaGUgY29tbWFuZHM6CisKKyAgICAgLi9jb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQKKyAgICAgLi9jb25maWd1cmUgLS1kaXNhYmxlLW5scworCit3aWxsIHJlc3BlY3RpdmVseSBieXBhc3MgYW55IHByZS1leGlzdGluZyBgZ2V0dGV4dCcgdG8gdXNlIHRoZQoraW50ZXJuYXRpb25hbGl6aW5nIHJvdXRpbmVzIHByb3ZpZGVkIHdpdGhpbiB0aGlzIHBhY2thZ2UsIG9yIGVsc2UsCitfdG90YWxseV8gZGlzYWJsZSB0cmFuc2xhdGlvbiBvZiBtZXNzYWdlcy4KKworICAgV2hlbiB5b3UgYWxyZWFkeSBoYXZlIEdOVSBgZ2V0dGV4dCcgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBydW4KK2NvbmZpZ3VyZSB3aXRob3V0IGFuIG9wdGlvbiBmb3IgeW91ciBuZXcgcGFja2FnZSwgYGNvbmZpZ3VyZScgd2lsbAorcHJvYmFibHkgZGV0ZWN0IHRoZSBwcmV2aW91c2x5IGJ1aWx0IGFuZCBpbnN0YWxsZWQgYGxpYmludGwuYScgZmlsZSBhbmQKK3dpbGwgZGVjaWRlIHRvIHVzZSB0aGlzLiAgVGhpcyBtaWdodCBiZSBub3Qgd2hhdCBpcyBkZXNpcmFibGUuICBZb3UKK3Nob3VsZCB1c2UgdGhlIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4gIEkuZS4KK2lmIHRoZSBmaWxlIGBpbnRsL1ZFUlNJT04nIHNob3dzIHRoYXQgdGhlIGxpYnJhcnkgd2hpY2ggY29tZXMgd2l0aCB0aGlzCitwYWNrYWdlIGlzIG1vcmUgcmVjZW50LCB5b3Ugc2hvdWxkIHVzZQorCisgICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0CisKK3RvIHByZXZlbnQgYXV0by1kZXRlY3Rpb24uCisKKyAgIFRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBub3QgdGVzdCBmb3IgdGhlIGBjYXRnZXRzJyBmdW5jdGlvbgorYW5kIHRoZXJlZm9yZSBpdCB3aWxsIG5vdCBiZSB1c2VkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGV2ZW4gYW4KK2VtdWxhdGlvbiBvZiBgZ2V0dGV4dCcgb24gdG9wIG9mIGBjYXRnZXRzJyBjb3VsZCBub3QgcHJvdmlkZSBhbGwgdGhlCitleHRlbnNpb25zIG9mIHRoZSBHTlUgYGdldHRleHQnIGxpYnJhcnkuCisKKyAgIEludGVybmF0aW9uYWxpemVkIHBhY2thZ2VzIGhhdmUgdXN1YWxseSBtYW55IGBwby9MTC5wbycgZmlsZXMsIHdoZXJlCitMTCBnaXZlcyBhbiBJU08gNjM5IHR3by1sZXR0ZXIgY29kZSBpZGVudGlmeWluZyB0aGUgbGFuZ3VhZ2UuICBVbmxlc3MKK3RyYW5zbGF0aW9ucyBoYXZlIGJlZW4gZm9yYmlkZGVuIGF0IGBjb25maWd1cmUnIHRpbWUgYnkgdXNpbmcgdGhlCitgLS1kaXNhYmxlLW5scycgc3dpdGNoLCBhbGwgYXZhaWxhYmxlIHRyYW5zbGF0aW9ucyBhcmUgaW5zdGFsbGVkCit0b2dldGhlciB3aXRoIHRoZSBwYWNrYWdlLiAgSG93ZXZlciwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGBMSU5HVUFTJworbWF5IGJlIHNldCwgcHJpb3IgdG8gY29uZmlndXJhdGlvbiwgdG8gbGltaXQgdGhlIGluc3RhbGxlZCBzZXQuCitgTElOR1VBUycgc2hvdWxkIHRoZW4gY29udGFpbiBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHR3by1sZXR0ZXIKK2NvZGVzLCBzdGF0aW5nIHdoaWNoIGxhbmd1YWdlcyBhcmUgYWxsb3dlZC4KKworVXNpbmcgVGhpcyBQYWNrYWdlCis9PT09PT09PT09PT09PT09PT0KKworQXMgYSB1c2VyLCBpZiB5b3VyIGxhbmd1YWdlIGhhcyBiZWVuIGluc3RhbGxlZCBmb3IgdGhpcyBwYWNrYWdlLCB5b3UKK29ubHkgaGF2ZSB0byBzZXQgdGhlIGBMQU5HJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUKK2BMTF9DQycgY29tYmluYXRpb24uICBIZXJlIGBMTCcgaXMgYW4gSVNPIDYzOSB0d28tbGV0dGVyIGxhbmd1YWdlIGNvZGUsCithbmQgYENDJyBpcyBhbiBJU08gMzE2NiB0d28tbGV0dGVyIGNvdW50cnkgY29kZS4gIEZvciBleGFtcGxlLCBsZXQncworc3VwcG9zZSB0aGF0IHlvdSBzcGVhayBHZXJtYW4gYW5kIGxpdmUgaW4gR2VybWFueS4gIEF0IHRoZSBzaGVsbAorcHJvbXB0LCBtZXJlbHkgZXhlY3V0ZSBgc2V0ZW52IExBTkcgZGVfREUnIChpbiBgY3NoJyksCitgZXhwb3J0IExBTkc7IExBTkc9ZGVfREUnIChpbiBgc2gnKSBvciBgZXhwb3J0IExBTkc9ZGVfREUnIChpbiBgYmFzaCcpLgorVGhpcyBjYW4gYmUgZG9uZSBmcm9tIHlvdXIgYC5sb2dpbicgb3IgYC5wcm9maWxlJyBmaWxlLCBvbmNlIGFuZCBmb3IKK2FsbC4KKworICAgWW91IG1pZ2h0IHRoaW5rIHRoYXQgdGhlIGNvdW50cnkgY29kZSBzcGVjaWZpY2F0aW9uIGlzIHJlZHVuZGFudC4KK0J1dCBpbiBmYWN0LCBzb21lIGxhbmd1YWdlcyBoYXZlIGRpYWxlY3RzIGluIGRpZmZlcmVudCBjb3VudHJpZXMuICBGb3IKK2V4YW1wbGUsIGBkZV9BVCcgaXMgdXNlZCBmb3IgQXVzdHJpYSwgYW5kIGBwdF9CUicgZm9yIEJyYXppbC4gIFRoZQorY291bnRyeSBjb2RlIHNlcnZlcyB0byBkaXN0aW5ndWlzaCB0aGUgZGlhbGVjdHMuCisKKyAgIFRoZSBsb2NhbGUgbmFtaW5nIGNvbnZlbnRpb24gb2YgYExMX0NDJywgd2l0aCBgTEwnIGRlbm90aW5nIHRoZQorbGFuZ3VhZ2UgYW5kIGBDQycgZGVub3RpbmcgdGhlIGNvdW50cnksIGlzIHRoZSBvbmUgdXNlIG9uIHN5c3RlbXMgYmFzZWQKK29uIEdOVSBsaWJjLiAgT24gb3RoZXIgc3lzdGVtcywgc29tZSB2YXJpYXRpb25zIG9mIHRoaXMgc2NoZW1lIGFyZQordXNlZCwgc3VjaCBhcyBgTEwnIG9yIGBMTF9DQy5FTkNPRElORycuICBZb3UgY2FuIGdldCB0aGUgbGlzdCBvZgorbG9jYWxlcyBzdXBwb3J0ZWQgYnkgeW91ciBzeXN0ZW0gZm9yIHlvdXIgY291bnRyeSBieSBydW5uaW5nIHRoZSBjb21tYW5kCitgbG9jYWxlIC1hIHwgZ3JlcCAnXkxMJycuCisKKyAgIE5vdCBhbGwgcHJvZ3JhbXMgaGF2ZSB0cmFuc2xhdGlvbnMgZm9yIGFsbCBsYW5ndWFnZXMuICBCeSBkZWZhdWx0LCBhbgorRW5nbGlzaCBtZXNzYWdlIGlzIHNob3duIGluIHBsYWNlIG9mIGEgbm9uZXhpc3RlbnQgdHJhbnNsYXRpb24uICBJZiB5b3UKK3VuZGVyc3RhbmQgb3RoZXIgbGFuZ3VhZ2VzLCB5b3UgY2FuIHNldCB1cCBhIHByaW9yaXR5IGxpc3Qgb2YgbGFuZ3VhZ2VzLgorVGhpcyBpcyBkb25lIHRocm91Z2ggYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGNhbGxlZAorYExBTkdVQUdFJy4gIEdOVSBgZ2V0dGV4dCcgZ2l2ZXMgcHJlZmVyZW5jZSB0byBgTEFOR1VBR0UnIG92ZXIgYExBTkcnCitmb3IgdGhlIHB1cnBvc2Ugb2YgbWVzc2FnZSBoYW5kbGluZywgYnV0IHlvdSBzdGlsbCBuZWVkIHRvIGhhdmUgYExBTkcnCitzZXQgdG8gdGhlIHByaW1hcnkgbGFuZ3VhZ2U7IHRoaXMgaXMgcmVxdWlyZWQgYnkgb3RoZXIgcGFydHMgb2YgdGhlCitzeXN0ZW0gbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUsIHNvbWUgU3dlZGlzaCB1c2VycyB3aG8gd291bGQgcmF0aGVyCityZWFkIHRyYW5zbGF0aW9ucyBpbiBHZXJtYW4gdGhhbiBFbmdsaXNoIGZvciB3aGVuIFN3ZWRpc2ggaXMgbm90CithdmFpbGFibGUsIHNldCBgTEFOR1VBR0UnIHRvIGBzdjpkZScgd2hpbGUgbGVhdmluZyBgTEFORycgdG8gYHN2X1NFJy4KKworICAgU3BlY2lhbCBhZHZpY2UgZm9yIE5vcndlZ2lhbiB1c2VyczogVGhlIGxhbmd1YWdlIGNvZGUgZm9yIE5vcndlZ2lhbgorYm9rbWEqbCBjaGFuZ2VkIGZyb20gYG5vJyB0byBgbmInIHJlY2VudGx5IChpbiAyMDAzKS4gIER1cmluZyB0aGUKK3RyYW5zaXRpb24gcGVyaW9kLCB3aGlsZSBzb21lIG1lc3NhZ2UgY2F0YWxvZ3MgZm9yIHRoaXMgbGFuZ3VhZ2UgYXJlCitpbnN0YWxsZWQgdW5kZXIgYG5iJyBhbmQgc29tZSBvbGRlciBvbmVzIHVuZGVyIGBubycsIGl0J3MgcmVjb21tZW5kZWQKK2ZvciBOb3J3ZWdpYW4gdXNlcnMgdG8gc2V0IGBMQU5HVUFHRScgdG8gYG5iOm5vJyBzbyB0aGF0IGJvdGggbmV3ZXIgYW5kCitvbGRlciB0cmFuc2xhdGlvbnMgYXJlIHVzZWQuCisKKyAgIEluIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgbm90IGluIHRoZSBgTEFORycKK2Vudmlyb25tZW50IHZhcmlhYmxlLCBgTExfQ0MnIGNvbWJpbmF0aW9ucyBjYW4gYmUgYWJicmV2aWF0ZWQgYXMgYExMJwordG8gZGVub3RlIHRoZSBsYW5ndWFnZSdzIG1haW4gZGlhbGVjdC4gIEZvciBleGFtcGxlLCBgZGUnIGlzIGVxdWl2YWxlbnQKK3RvIGBkZV9ERScgKEdlcm1hbiBhcyBzcG9rZW4gaW4gR2VybWFueSksIGFuZCBgcHQnIHRvIGBwdF9QVCcKKyhQb3J0dWd1ZXNlIGFzIHNwb2tlbiBpbiBQb3J0dWdhbCkgaW4gdGhpcyBjb250ZXh0LgorCitUcmFuc2xhdGluZyBUZWFtcworPT09PT09PT09PT09PT09PT0KKworRm9yIHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgdG8gYmUgYSBzdWNjZXNzLCB3ZSBuZWVkIGludGVyZXN0ZWQKK3Blb3BsZSB3aG8gbGlrZSB0aGVpciBvd24gbGFuZ3VhZ2UgYW5kIHdyaXRlIGl0IHdlbGwsIGFuZCB3aG8gYXJlIGFsc28KK2FibGUgdG8gc3luZXJnaXplIHdpdGggb3RoZXIgdHJhbnNsYXRvcnMgc3BlYWtpbmcgdGhlIHNhbWUgbGFuZ3VhZ2UuCitFYWNoIHRyYW5zbGF0aW9uIHRlYW0gaGFzIGl0cyBvd24gbWFpbGluZyBsaXN0LiAgVGhlIHVwLXRvLWRhdGUgbGlzdCBvZgordGVhbXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QncyBob21lcGFnZSwKK2BodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvY29udHJpYi9wby9IVE1MLycsIGluIHRoZSAiTmF0aW9uYWwgdGVhbXMiCithcmVhLgorCisgICBJZiB5b3UnZCBsaWtlIHRvIHZvbHVudGVlciB0byBfd29ya18gYXQgdHJhbnNsYXRpbmcgbWVzc2FnZXMsIHlvdQorc2hvdWxkIGJlY29tZSBhIG1lbWJlciBvZiB0aGUgdHJhbnNsYXRpbmcgdGVhbSBmb3IgeW91ciBvd24gbGFuZ3VhZ2UuCitUaGUgc3Vic2NyaWJpbmcgYWRkcmVzcyBpcyBfbm90XyB0aGUgc2FtZSBhcyB0aGUgbGlzdCBpdHNlbGYsIGl0IGhhcworYC1yZXF1ZXN0JyBhcHBlbmRlZC4gIEZvciBleGFtcGxlLCBzcGVha2VycyBvZiBTd2VkaXNoIGNhbiBzZW5kIGEKK21lc3NhZ2UgdG8gYHN2LXJlcXVlc3RAbGkub3JnJywgaGF2aW5nIHRoaXMgbWVzc2FnZSBib2R5OgorCisgICAgIHN1YnNjcmliZQorCisgICBLZWVwIGluIG1pbmQgdGhhdCB0ZWFtIG1lbWJlcnMgYXJlIGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlCitfYWN0aXZlbHlfIGluIHRyYW5zbGF0aW9ucywgb3IgYXQgc29sdmluZyB0cmFuc2xhdGlvbmFsIGRpZmZpY3VsdGllcywKK3JhdGhlciB0aGFuIG1lcmVseSBsdXJraW5nIGFyb3VuZC4gIElmIHlvdXIgdGVhbSBkb2VzIG5vdCBleGlzdCB5ZXQgYW5kCit5b3Ugd2FudCB0byBzdGFydCBvbmUsIG9yIGlmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHdoYXQgdG8gZG8gb3IgaG93IHRvCitnZXQgc3RhcnRlZCwgcGxlYXNlIHdyaXRlIHRvIGB0cmFuc2xhdGlvbkBpcm8udW1vbnRyZWFsLmNhJyB0byByZWFjaCB0aGUKK2Nvb3JkaW5hdG9yIGZvciBhbGwgdHJhbnNsYXRvciB0ZWFtcy4KKworICAgVGhlIEVuZ2xpc2ggdGVhbSBpcyBzcGVjaWFsLiAgSXQgd29ya3MgYXQgaW1wcm92aW5nIGFuZCB1bmlmb3JtaXppbmcKK3RoZSB0ZXJtaW5vbG9neSBpbiB1c2UuICBQcm92ZW4gbGluZ3Vpc3RpYyBza2lsbCBhcmUgcHJhaXNlZCBtb3JlIHRoYW4KK3Byb2dyYW1taW5nIHNraWxsLCBoZXJlLgorCitBdmFpbGFibGUgUGFja2FnZXMKKz09PT09PT09PT09PT09PT09PQorCitMYW5ndWFnZXMgYXJlIG5vdCBlcXVhbGx5IHN1cHBvcnRlZCBpbiBhbGwgcGFja2FnZXMuICBUaGUgZm9sbG93aW5nCittYXRyaXggc2hvd3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIGFzIG9mIEphbnVhcnkKKzIwMDQuICBUaGUgbWF0cml4IHNob3dzLCBpbiByZWdhcmQgb2YgZWFjaCBwYWNrYWdlLCBmb3Igd2hpY2ggbGFuZ3VhZ2VzCitQTyBmaWxlcyBoYXZlIGJlZW4gc3VibWl0dGVkIHRvIHRyYW5zbGF0aW9uIGNvb3JkaW5hdGlvbiwgd2l0aCBhCit0cmFuc2xhdGlvbiBwZXJjZW50YWdlIG9mIGF0IGxlYXN0IDUwJS4KKworICAgICBSZWFkeSBQTyBmaWxlcyAgICAgICBhZiBhbSBhciBheiBiZSBiZyBicyBjYSBjcyBkYSBkZSBlbCBlbiBlbl9HQiBlbyBlcworICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgfAorICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICB8CisgICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBibHVlei1waW4gICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gfAorICAgICBjb25zb2xlLXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBkYXJrc3RhdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgW10gfAorICAgICBlbnNjcmlwdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgW10gICAgICAgICB8CisgICAgIGVycm9yICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICBbXSAgICAgIFtdIHwKKyAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gKCkgW10gW10gW10gICAgICAgICAgICAgW10gfAorICAgICBmaWxldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGZpbmR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBnYmlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gfAorICAgICBnZXR0ZXh0ICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBnZXR0ZXh0LXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdpbXAtcHJpbnQgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICBbXSAgICAgIFtdIHwKKyAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnbHVuYXJjbG9jayAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgKCkgICAgICAgIFtdICAgICAgW10gfAorICAgICBnbnVjYXNoLWdsb3NzYXJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdudXBnICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jb250YWN0cyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtZ28gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtc2tldGNoYm9vayAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1zdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdGltZXNoZWV0ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGhvdG8yICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgICAgICAgKCkgfAorICAgICBncmFtYWRvaXIgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorICAgICBndGljayAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICB8CisgICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgfAorICAgICBpbmRlbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSB8CisgICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgaXNvXzMxNjZfMSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gW10gICAgICAgICAgICAgW10gfAorICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGlzb18zMTY2XzMgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBpc29fNjM5ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBqd2hvaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgfAorICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSB8CisgICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2hfbGVzc29ucyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICgpIHwKKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgICAgICAgfAorICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAoKSBbXSBbXSAgICAgICAgICAgICAgICAoKSB8CisgICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAoKSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIG5hbm9fMV8wICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHB0eCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgfAorICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNjcm9sbGtlZXBlciAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgW10gW10gfAorICAgICBzaC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gW10gICAgICAgICAgICAgW10gfAorICAgICBzaWxreSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICB8CisgICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgICAgICAgICAgICAgW10gfAorICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICB8CisgICAgIHRleHR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICgpICAgICAgICAgfAorICAgICB0cC1yb2JvdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICBbXSAgICAgIFtdIHwKKyAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgW10gfAorICAgICB3YXN0ZXNlZGdlICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICB8CisgICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gW10gW10gICAgICAgICAgICAgW10gfAorICAgICB4Y2hhdCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSB8CisgICAgIHhmcmVlODZfeGtiX3htbCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFmIGFtIGFyIGF6IGJlIGJnIGJzIGNhIGNzIGRhIGRlIGVsIGVuIGVuX0dCIGVvIGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAwICAwICAxICA5ICA0ICAxIDQwIDQxIDYwIDc4IDE3ICAxICAgNSAgIDEzIDY4CisgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBldCBldSBmYSBmaSBmciBnYSBnbCBoZSBociBodSBpZCBpcyBpdCBqYSBrbyBsZworICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgIGEycHMgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICgpICAgICgpICAgIHwKKyAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgfAorICAgICBibHVlei1waW4gICAgICAgICAgfCAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBjb25zb2xlLXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGNvcmV1dGlscyAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIHwKKyAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgW10gICAgfAorICAgICBkYXJrc3RhdCAgICAgICAgICAgfCAgICAgICAgICAgICAoKSBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgIFtdIFtdICAgICAgIFtdICAgICAgIHwKKyAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBlbnNjcmlwdCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGVycm9yICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorICAgICBmaWxldXRpbHMgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICB8CisgICAgIGZpbmR1dGlscyAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdIFtdICAgIFtdIFtdIFtdICAgIFtdIFtdIFtdICAgIHwKKyAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAorICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgfAorICAgICBnYmlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnZXR0ZXh0ICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICB8CisgICAgIGdldHRleHQtZXhhbXBsZXMgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKKyAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgfAorICAgICBnZXR0ZXh0LXRvb2xzICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICB8CisgICAgIGdpbXAtcHJpbnQgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKKyAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnbHVuYXJjbG9jayAgICAgICAgfCAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorICAgICBnbnVjYXNoLWdsb3NzYXJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIGdudXBnICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdICAgIFtdICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgIHwKKyAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jb250YWN0cyAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorICAgICBncGUtZ28gICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorICAgICBncGUtc2tldGNoYm9vayAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1zdSAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdGltZXNoZWV0ICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8CisgICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorICAgICBncGhvdG8yICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICB8CisgICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgKCkgKCkgICAgICAgfAorICAgICBncmFtYWRvaXIgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdyZXAgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdICAgIFtdIFtdICAgICAgIHwKKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGhlbGxvICAgICAgICAgICAgICB8IFtdICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdICAgIFtdIFtdIFtdICAgIHwKKyAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgICAgfAorICAgICBpbmRlbnQgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSBbXSAgICAgICBbXSBbXSAgICBbXSBbXSAgICAgICB8CisgICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdIFtdICAgICAgIFtdIFtdIFtdICAgIFtdICAgICAgICAgIHwKKyAgICAgaXNvXzMxNjZfMSAgICAgICAgIHwgICAgW10gICAgICAgW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGlzb18zMTY2XzMgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgW10gW10gICAgICAgfAorICAgICBpc29fNjM5ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgIHwKKyAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBqd2hvaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICAgICAgICB8CisgICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgIFtdIFtdICAgIHwKKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorICAgICBsaWJpY29udiAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSBbXSAgICBbXSBbXSBbXSAgICBbXSAgICAgICAgICB8CisgICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2hfbGVzc29ucyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgfAorICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICAgICBbXSAgICAgICB8CisgICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgICAgW10gW10gICAgfAorICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAoKSAgICAgICB8CisgICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgIHwKKyAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICAgICB8CisgICAgIG5hbm9fMV8wICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIHwKKyAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8CisgICAgIHB0eCAgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgIFtdIFtdICAgIFtdICAgICAgICAgIHwKKyAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAorICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNjcm9sbGtlZXBlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgICAgW10gW10gICAgW10gW10gICAgICAgfAorICAgICBzaC11dGlscyAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICB8CisgICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgW10gICAgICAgfAorICAgICBzaWxreSAgICAgICAgICAgICAgfCAgICAgICAgICAoKSBbXSAgICAgICAgICAgICAoKSAgICAgICAoKSAgICAgICAgICB8CisgICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgIHwKKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgW10gICAgW10gW10gW10gICAgW10gW10gICAgICAgfAorICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICB8CisgICAgIHRleHR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgIFtdICAgICAgICAgIFtdIFtdICAgIHwKKyAgICAgdGluICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICB0cC1yb2JvdCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICAgIFtdICAgIFtdIFtdIFtdIFtdIFtdIFtdICAgIHwKKyAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHV0aWwtbGludXggICAgICAgICB8IFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICgpIFtdICAgICAgIHwKKyAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICB3YXN0ZXNlZGdlICAgICAgICAgfCAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHdkaWZmICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgd2dldCAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgW10gICAgW10gW10gICAgICAgICAgW10gICAgICAgfAorICAgICB4Y2hhdCAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHhmcmVlODZfeGtiX3htbCAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV0IGV1IGZhIGZpIGZyIGdhIGdsIGhlIGhyIGh1IGlkIGlzIGl0IGphIGtvIGxnCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIyICAyICAxIDI2IDEwNiAyOCAyNCAgOCAxMCA0MSAzMyAgMSAyNiAzMyAxMiAgMAorICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbHQgbHYgbWsgbW4gbXMgbXQgbmIgbmwgbm4gbm8gbnNvIHBsIHB0IHB0X0JSIHJvIHJ1CisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICgpICAgICAoKSAgICAgW10gICBbXSBbXSB8CisgICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAoKSAoKSB8CisgICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAoKSAgICAgICAgICBbXSAgICB8CisgICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICBbXSBbXSB8CisgICAgIGJhdGNoZWxvciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSBbXSB8CisgICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICB8CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSB8CisgICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIGRhcmtzdGF0ICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSAgICB8CisgICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8CisgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSBbXSB8CisgICAgIGVycm9yICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSAgICB8CisgICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgKCkgICAgICBbXSB8CisgICAgIGZpbGV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIGZpbmR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgW10gICBbXSAgICB8CisgICAgIGdiaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdldHRleHQgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIGdldHRleHQtZXhhbXBsZXMgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICB8CisgICAgIGdldHRleHQtcnVudGltZSAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICB8CisgICAgIGdpbXAtcHJpbnQgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSAgICB8CisgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSB8CisgICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgKCkgICAgICBbXSB8CisgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICAgICAgICB8CisgICAgIGdudXBnICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1jb250YWN0cyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSB8CisgICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS1zdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS10YXNrbWFuYWdlciAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwZS10b2RvICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICBbXSAgICB8CisgICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICgpICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgW10gICBbXSBbXSB8CisgICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSB8CisgICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdICAgIFtdIFtdIFtdIFtdICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIGlkLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSBbXSB8CisgICAgIGluZGVudCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSBbXSB8CisgICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICB8CisgICAgIGlzb18zMTY2XzEgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGlzb18zMTY2XzMgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGlzb180MjE3ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIFtdICAgICBbXSBbXSAgW10gICAgICBbXSB8CisgICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICgpICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGp0YWcgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSAoKSB8CisgICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICB8CisgICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICBbXSAgICAgW10gICAgICAgICB8CisgICAgIGxpYmdwZXdpZGdldCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICB8CisgICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2hfbGVzc29ucyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGx5bnggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICBbXSB8CisgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICAgICBbXSB8CisgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIG15c2VjcmV0ZGlhcnkgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICBbXSAgICB8CisgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIG5hbm9fMV8wICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgIFtdICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICBbXSBbXSAgW10gICAgICAgICB8CisgICAgIHB0eCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdICAgICBbXSBbXSAgW10gICBbXSBbXSB8CisgICAgIHB5dGhvbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSB8CisgICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICBbXSB8CisgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNjcm9sbGtlZXBlciAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIHNlZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgW10gICBbXSAgICB8CisgICAgIHNoLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNoYXJ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHNpbGt5ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSB8CisgICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICB8CisgICAgIHNrZXRjaCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICB8CisgICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHRhciAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICBbXSAgICAgW10gICBbXSAgICB8CisgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIHRleHR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHRpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHRwLXJvYm90ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHR1eHBhaW50ICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICBbXSBbXSAgW10gICBbXSAgICB8CisgICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICBbXSB8CisgICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSB8CisgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgW10gICBbXSBbXSB8CisgICAgIHdnZXQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHhmcmVlODZfeGtiX3htbCAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgIGx0IGx2IG1rIG1uIG1zIG10IG5iIG5sIG5uIG5vIG5zbyBwbCBwdCBwdF9CUiBybyBydQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgMiAgMCAgMyAxMiAgMCAxMCA2OSAgNiAgNyAgMSAgNDAgMjYgIDM2ICAgNzYgNjMKKyAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNrIHNsIHNyIHN2IHRhIHRoIHRyIHVrIHZlbiB2aSB3YSB4aCB6aF9DTiB6aF9UVyB6dQorICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAorICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorICAgICBiYXRjaGVsb3IgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgorICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAgOAorICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNAorICAgICBibHVlei1waW4gICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfCAxNAorICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBjb25zb2xlLXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNgorICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNAorICAgICBkYXJrc3RhdCAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICgpICAgICAgfCAxMgorICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAyMworICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgorICAgICBlbnNjcmlwdCAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgorICAgICBlcnJvciAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNQorICAgICBmZXRjaG1haWwgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQorICAgICBmaWxldXRpbHMgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgfCAxNworICAgICBmaW5kdXRpbHMgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAyOQorICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMworICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgorICAgICBnYmlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAorICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAorICAgICBnY2MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAorICAgICBnZXR0ZXh0ICAgICAgICAgICAgfCBbXSBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNgorICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNAorICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgfCAyMgorICAgICBnZXR0ZXh0LXRvb2xzICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNAorICAgICBnaW1wLXByaW50ICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAorICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBnbHVuYXJjbG9jayAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfCAxMworICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBnbnVjYXNoICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAgOQorICAgICBnbnVjYXNoLWdsb3NzYXJ5ICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAgOAorICAgICBnbnVwZyAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNworICAgICBncGUtYWVyaWFsICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNworICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOAorICAgICBncGUtY2FsZW5kYXIgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMworICAgICBncGUtY2xvY2sgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAorICAgICBncGUtY29uZiAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorICAgICBncGUtY29udGFjdHMgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMQorICAgICBncGUtZWRpdCAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMgorICAgICBncGUtZ28gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBncGUtbG9naW4gICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMworICAgICBncGUtb3duZXJpbmZvICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMworICAgICBncGUtc2tldGNoYm9vayAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorICAgICBncGUtc3UgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAorICAgICBncGUtdGFza21hbmFnZXIgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAorICAgICBncGUtdGltZXNoZWV0ICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMgorICAgICBncGUtdG9kYXkgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMworICAgICBncGUtdG9kbyAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfCAxMgorICAgICBncGhvdG8yICAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxMQorICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorICAgICBncHNkcml2ZSAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBncmFtYWRvaXIgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBncmVwICAgICAgICAgICAgICAgfCAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNgorICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNworICAgICBoZWxsbyAgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzNAorICAgICBpZC11dGlscyAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgorICAgICBpbmRlbnQgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMQorICAgICBpc29fMzE2NiAgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgfCAyNworICAgICBpc29fMzE2Nl8xICAgICAgICAgfCBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICBpc29fMzE2Nl8zICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICBpc29fNDIxNyAgICAgICAgICAgfCBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAyNAorICAgICBpc29fNjM5ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQorICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgW10gICAgICAgIFtdICAgIFtdICAgICAgfCAgOQorICAgICBqdGFnICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICBqd2hvaXMgICAgICAgICAgICAgfCAgICAgICAgICAoKSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMQorICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQorICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBsaWJjICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAyMAorICAgICBsaWJncGV3aWRnZXQgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfCAxMworICAgICBsaWJpY29udiAgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgfCAyNworICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICBsaW5nb3RlYWNoX2xlc3NvbnMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgfCAgMAorICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNAorICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNQorICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNgorICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQorICAgICBteXNlY3JldGRpYXJ5ICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAorICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNworICAgICBuYW5vXzFfMCAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNworICAgICBvcGNvZGVzICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgorICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNQorICAgICBwdHggICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMgorICAgICBweXRob24gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAorICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICAgICBycG0gICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQorICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAgMgorICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNQorICAgICBzZWQgICAgICAgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAorICAgICBzaC11dGlscyAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNAorICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNworICAgICBzaGFydXRpbHMgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNworICAgICBzaWxreSAgICAgICAgICAgICAgfCAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgorICAgICBza2V0Y2ggICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgorICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNworICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICB0YXIgICAgICAgICAgICAgICAgfCBbXSBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAyNAorICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNAorICAgICB0ZXh0dXRpbHMgICAgICAgICAgfCAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNgorICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQorICAgICB0cC1yb2JvdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICB0dXhwYWludCAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgfCAyOQorICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNQorICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOAorICAgICB3YXN0ZXNlZGdlICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICB3ZGlmZiAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOAorICAgICB3Z2V0ICAgICAgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgfCAyNAorICAgICB4Y2hhdCAgICAgICAgICAgICAgfCBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxNQorICAgICB4ZnJlZTg2X3hrYl94bWwgICAgfCBbXSAgICBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgfCAxMQorICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgIDYzIHRlYW1zICAgICAgICAgICBzayBzbCBzciBzdiB0YSB0aCB0ciB1ayB2ZW4gdmkgd2EgeGggemhfQ04gemhfVFcgenUKKyAgICAgIDEzMSBkb21haW5zICAgICAgICAgNDcgMTkgMjggODMgIDAgIDAgNTkgMTMgIDEgICAxIDExICAwICAyMiAgICAyMiAgICAwICAxMzczCisKKyAgIFNvbWUgY291bnRlcnMgaW4gdGhlIHByZWNlZGluZyBtYXRyaXggYXJlIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YKK3Zpc2libGUgYmxvY2tzIGxldCB1cyBleHBlY3QuICBUaGlzIGlzIGJlY2F1c2UgYSBmZXcgZXh0cmEgUE8gZmlsZXMgYXJlCit1c2VkIGZvciBpbXBsZW1lbnRpbmcgcmVnaW9uYWwgdmFyaWFudHMgb2YgbGFuZ3VhZ2VzLCBvciBsYW5ndWFnZQorZGlhbGVjdHMuCisKKyAgIEZvciBhIFBPIGZpbGUgaW4gdGhlIG1hdHJpeCBhYm92ZSB0byBiZSBlZmZlY3RpdmUsIHRoZSBwYWNrYWdlIHRvCit3aGljaCBpdCBhcHBsaWVzIHNob3VsZCBhbHNvIGhhdmUgYmVlbiBpbnRlcm5hdGlvbmFsaXplZCBhbmQKK2Rpc3RyaWJ1dGVkIGFzIHN1Y2ggYnkgaXRzIG1haW50YWluZXIuICBUaGVyZSBtaWdodCBiZSBhbiBvYnNlcnZhYmxlCitsYWcgYmV0d2VlbiB0aGUgbWVyZSBleGlzdGVuY2UgYSBQTyBmaWxlIGFuZCBpdHMgd2lkZSBhdmFpbGFiaWxpdHkgaW4gYQorZGlzdHJpYnV0aW9uLgorCisgICBJZiBKYW51YXJ5IDIwMDQgc2VlbXMgdG8gYmUgb2xkLCB5b3UgbWF5IGZldGNoIGEgbW9yZSByZWNlbnQgY29weSBvZgordGhpcyBgQUJPVVQtTkxTJyBmaWxlIG9uIG1vc3QgR05VIGFyY2hpdmUgc2l0ZXMuICBUaGUgbW9zdCB1cC10by1kYXRlCittYXRyaXggd2l0aCBmdWxsIHBlcmNlbnRhZ2UgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKK2BodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvY29udHJpYi9wby9IVE1ML21hdHJpeC5odG1sJy4KKworVXNpbmcgYGdldHRleHQnIGluIG5ldyBwYWNrYWdlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3UgYXJlIHdyaXRpbmcgYSBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW0gYW5kIHdhbnQgdG8KK2ludGVybmF0aW9uYWxpemUgaXQgeW91IGFyZSB3ZWxjb21lIHRvIHVzZSBHTlUgYGdldHRleHQnIGluIHlvdXIKK3BhY2thZ2UuICBPZiBjb3Vyc2UgeW91IGhhdmUgdG8gcmVzcGVjdCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2Ugd2hpY2ggY292ZXJzIHRoZSB1c2Ugb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4gIFRoaXMgbWVhbnMKK2luIHBhcnRpY3VsYXIgdGhhdCBldmVuIG5vbi1mcmVlIHByb2dyYW1zIGNhbiB1c2UgYGxpYmludGwnIGFzIGEgc2hhcmVkCitsaWJyYXJ5LCB3aGVyZWFzIG9ubHkgZnJlZSBzb2Z0d2FyZSBjYW4gdXNlIGBsaWJpbnRsJyBhcyBhIHN0YXRpYworbGlicmFyeSBvciB1c2UgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYGxpYmludGwnLgorCisgICBPbmNlIHRoZSBzb3VyY2VzIGFyZSBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkgYW5kIHRoZSBzZXR1cCBjYW4gaGFuZGxlCit0aGUgdXNlIG9mIGBnZXR0ZXh0JyB0aGUgb25seSB0aGluZyBtaXNzaW5nIGFyZSB0aGUgdHJhbnNsYXRpb25zLiAgVGhlCitGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgaXMgYWxzbyBhdmFpbGFibGUgZm9yIHBhY2thZ2VzIHdoaWNoIGFyZSBub3QKK2RldmVsb3BlZCBpbnNpZGUgdGhlIEdOVSBwcm9qZWN0LiAgVGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBhYm92ZQorYXBwbGllcyBhbHNvIGZvciBldmVyeSBvdGhlciBGcmVlIFNvZnR3YXJlIFByb2plY3QuICBDb250YWN0CitgdHJhbnNsYXRpb25AaXJvLnVtb250cmVhbC5jYScgdG8gbWFrZSB0aGUgYC5wb3QnIGZpbGVzIGF2YWlsYWJsZSB0bwordGhlIHRyYW5zbGF0aW9uIHRlYW1zLgorCmRpZmYgLS1naXQgYS91bml4L01ha2VmaWxlLmluIGIvdW5peC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTM4NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDggQEAKKworUEFDS0FHRSA9IEBQQUNLQUdFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorCitTVUJESVJTID0gQFpMSUJfRElSQCBASlBFR19ESVJAIGludGwgcmRyIG5ldHdvcmsgWHJlZ2lvbiByZmIgdHggeDB2bmNzZXJ2ZXIgXAorICAgICAgICAgIHZuY3ZpZXdlcl91bml4IHBvIHZuY3Bhc3N3ZCBAVk5DQ09ORklHX0RJUkAKKworIyBmb2xsb3dlZCBieSBib2lsZXJwbGF0ZS5tawpkaWZmIC0tZ2l0IGEvdW5peC9SRUFETUUgYi91bml4L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg3MTcyCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9SRUFETUUKQEAgLTAsMCArMSwyODQgQEAKKworVGlnaHRWTkMgU291cmNlIERpc3RyaWJ1dGlvbiBmb3IgVW5peCBwbGF0Zm9ybXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA0IENvbnN0YW50aW4gS2FwbGluc2t5LgorQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUGV0ZXIgQXN0cmFuZCwgQ2VuZGlvIEFCCisKK1RoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFNlZSB0aGUgZmlsZSBMSUNFTkNFLlRYVAorZm9yIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoaXMgc29mdHdhcmUgaXMgbWFkZSBhdmFpbGFibGUuCitUaWdodFZOQyBhbHNvIGNvbnRhaW5zIGNvZGUgZnJvbSBvdGhlciBzb3VyY2VzLiAgU2VlIHRoZQorQWNrbm93bGVkZ2VtZW50cyBzZWN0aW9uIGJlbG93LCBhbmQgdGhlIGluZGl2aWR1YWwgZmlsZXMgZm9yIGRldGFpbHMKK29mIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZXkgYXJlIG1hZGUgYXZhaWxhYmxlLgorCisKK1RoZXJlIGFyZSBzaXggcHJvZ3JhbXMgaGVyZToKKworICB2bmN2aWV3ZXIgLSB0aGlzIGlzIHRoZSBWTkMgdmlld2VyLCBvciBjbGllbnQsIHByb2dyYW0gZm9yIFguCisKKyAgWHZuYyAtIHRoaXMgaXMgdGhlIFggVk5DIHNlcnZlciAtIGl0IGlzIGJvdGggYSBWTkMgc2VydmVyIGFuZCBhbiBYIHNlcnZlcgorICAgICAgICAgd2l0aCBhICJ2aXJ0dWFsIiBmcmFtZWJ1ZmZlci4gIFlvdSBub3JtYWxseSB1c2UgdGhlIHZuY3NlcnZlciBzY3JpcHQKKyAgICAgICAgIHRvIHN0YXJ0IFh2bmMuCisKKyAgdm5jc2VydmVyIC0gdGhpcyBpcyBhIHdyYXBwZXIgc2NyaXB0IHdoaWNoIG1ha2VzIHN0YXJ0aW5nIGFuIFggVk5DIHNlcnZlcgorICAgICAgICAgICAgICAoaS5lLiBkZXNrdG9wKSBtb3JlIGNvbnZlbmllbnQuICBJdCBpcyB3cml0dGVuIGluIFBlcmwsIHNvIHRvIHVzZQorICAgICAgICAgICAgICB0aGUgc2NyaXB0IHlvdSBuZWVkIHRoYXQuCisKKyAgdm5jcGFzc3dkIC0gdGhpcyBwcm9ncmFtIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBwYXNzd29yZCB1c2VkIHRvIGFjY2VzcworICAgICAgICAgICAgICB5b3VyIFggVk5DIGRlc2t0b3BzLiAgVGhlIHZuY3NlcnZlciBzY3JpcHQgdXNlcyB0aGlzIHByb2dyYW0gd2hlbgorICAgICAgICAgICAgICB5b3UgZmlyc3Qgc3RhcnQgYSBWTkMgc2VydmVyLgorCisgIHZuY2NvbmZpZyAtIHRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBhbmQgY29udHJvbCBhIHJ1bm5pbmcgaW5zdGFuY2UKKyAgICAgICAgICAgICAgb2YgWHZuYy4KKworICB4MHZuY3NlcnZlciAtIHRoaXMgaXMgYW4gaW5lZmZpY2llbnQgVk5DIHNlcnZlciB3aGljaCBjb250aW51b3VzbHkgcG9sbHMgYW55CisgICAgICAgICAgICAgICAgWCBkaXNwbGF5LCBhbGxvd2luZyBpdCB0byBiZSBjb250cm9sbGVkIHZpYSBWTkMuICBJdCBpcworICAgICAgICAgICAgICAgIGludGVuZGVkIG1haW5seSBhcyBhIGRlbW9uc3RyYXRpb24gb2YgYSBzaW1wbGUgVk5DIHNlcnZlci4KKworSW4gYWRkaXRpb24gdG8gdGhlc2Ugc3RhbmRhbG9uZSBwcm9ncmFtcywgdGhpcyBkaXN0cmlidXRpb24gY2FuIGFsc28KK2JlIHVzZWQgdG8gdHVybiB0aGUgbmF0aXZlIFggc2VydmVyIGZvciBhIHBsYXRmb3JtIGludG8gYSBWTkMgc2VydmVyLgorRm9yIFguT3JnIHNlcnZlcnMsIHRoaXMgaXMgZG9uZSB1c2luZyBhIG1vZHVsZSBsb2FkZWQgYXQgcnVuLXRpbWUuCitGb3Igb3RoZXIgWCBzZXJ2ZXJzIGl0IHJlcXVpcmVzIHJlcGxhY2luZyB0aGUgbmF0aXZlIFggc2VydmVyIGJpbmFyeS4KKworVG8gYnVpbGQgdGhpcyBkaXN0cmlidXRpb24geW91IG5lZWQgYSBDKysgY29tcGlsZXIgYXMgd2VsbCBhcyBhIEMgY29tcGlsZXIuCitZb3UgYWxzbyBuZWVkIGEgcmVhc29uYWJseSByZWNlbnQgdmVyc2lvbiBvZiB0aGUgWCB3aW5kb3cgc3lzdGVtIGluc3RhbGxlZC4KK1RoaXMgY29tZXMgYXMgc3RhbmRhcmQgd2l0aCBtb3N0IHVuaXggbWFjaGluZXMuICBJZiB5b3UgZG9uJ3QgaGF2ZSBpdAoraW5zdGFsbGVkLCBzZWUgaHR0cDovL3d3dy54Lm9yZy4gCisKK1RvIGJ1aWxkIGV2ZXJ5dGhpbmcgYnV0IFh2bmMsIGRvOgorCisgICUgLi9jb25maWd1cmUKKyAgJSBtYWtlCisKK1RoaXMgc2hvdWxkIGJ1aWxkIGZpcnN0IHNvbWUgbGlicmFyaWVzIC0gemxpYiwgcmRyLCBuZXR3b3JrLCBYcmVnaW9uLCByZmIgYW5kCit0eCAtIHRoZW4gdm5jdmlld2VyLCB2bmNjb25maWcgYW5kIHZuY3Bhc3N3ZC4gIElmIHlvdSBhbHJlYWR5IGhhdmUgemxpYgoraW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIHlvdSBjYW4gcnVuICIuL2NvbmZpZ3VyZSAtLXdpdGgtaW5zdGFsbGVkLXpsaWIiIGlmIHlvdQorcHJlZmVyICh0aGlzIGlzIHN0cm9uZ2x5IGFkdmlzZWQgb24gRnJlZUJTRCwgc2luY2Ugd2UndmUgYmVlbiB0b2xkIHRoZXJlIGFyZQorcHJvYmxlbXMgb3RoZXJ3aXNlKS4KKworQnVpbGRpbmcgWHZuYworPT09PT09PT09PT09PQorCitCdWlsZGluZyBYdm5jIGFuZCB0aGUgVk5DIHN1cHBvcnQgZm9yIG5hdGl2ZSBYIHNlcnZlcnMgaXMgbXVjaCBtb3JlIGNvbXBsZXguCitJZiB5b3UgZG9uJ3QgbmVlZCB0byBidWlsZCBpdCwgc2tpcCB0byB0aGUgc2VjdGlvbiBiZWxvdyBvbiBpbnN0YWxsaW5nLgorCitYdm5jIGRpZmZlcnMgZnJvbSB0aGUgb3RoZXIgcHJvZ3JhbXMgaW4gdGhhdCBpdCBpcyBidWlsdCBpbnNpZGUgdGhlIFggc291cmNlCit0cmVlLiAgVW5saWtlIHByZXZpb3VzIHZlcnNpb25zIG9mIFh2bmMsIHdlIGRvIG5vdCBwcm92aWRlIGFuIFggc291cmNlIHRyZWUKK3dpdGggdGhpcyBkaXN0cmlidXRpb24uICBXZSBoYXZlIGRlc2lnbmVkIHRoZSBkaXN0cmlidXRpb24gdG8gYmUgYXMgaW5kZXBlbmRlbnQKK2FzIHBvc3NpYmxlIG9mIHRoZSBYIHRyZWUgdXNlZC4KKworV2UgaGF2ZSBzdWNjZXNzZnVsbHkgdXNlZCBYLk9yZyA2LjguMiAoYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy54Lm9yZy8pLiAgCitOb3RlIHRoYXQgdGhlIFggdHJlZSBpcyBlbm9ybW91cyBhbmQgbm90b3Jpb3VzbHkgZGlmZmljdWx0IHRvIGRlYWwgd2l0aCAtCitidWlsZGluZyBpdCBpcyBub3QgZm9yIHRoZSBmYWludC1oZWFydGVkIQorCitPbmNlIHlvdSBoYXZlIGEgY29weSBvZiB0aGUgWCBzb3VyY2UgdHJlZSwgbWFrZSBzdXJlIGl0IGlzIHVucGFja2VkIGF0IHRoZSB0b3AKK2xldmVsIG9mIHRoaXMgZGlzdHJpYnV0aW9uLCBzbyB0aGF0IHRoZSB4YyBkaXJlY3Rvcnkgb2YgdGhlIFggc291cmNlIHRyZWUKK21hdGNoZXMgdGhlIHhjIG9mIHRoaXMgZGlzdHJpYnV0aW9uLCBmb3IgZXhhbXBsZToKKworICAlIHRhciB4emYgWDExUjYuOC4yLXNyYy50YXIuYnoyCisKK1RoZW4geW91IG11c3QgYXBwbHkgYSBwYXRjaCB0byBzb21lIGZpbGVzIGluIHRoZSBYIHNvdXJjZSB0cmVlOgorCisgICUgcGF0Y2ggLU5wMCA8eGMucGF0Y2gKKworSWYgdGhpcyB3b3JrcywgeW91IHNob3VsZCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBlbnRpcmUgWCB0cmVlLCBpbmNsdWRpbmcgWHZuYzoKKworICAlIGNkIHhjCisgICUgbWFrZSBXb3JsZAorCitUaGlzIHdpbGwgdGFrZSBhIGxvbmcgdGltZSwgYW5kIHdpbGwgcXVpdGUgcHJvYmFibHkgZmFpbCBmb3Igb25lIHJlYXNvbiBvcgorYW5vdGhlciEgIElmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUsIHdlIHN1Z2dlc3QgeW91IHRyeSB0byBidWlsZCB0aGUgWCB0cmVlIGluCitpc29sYXRpb24gZmlyc3QgYmVmb3JlIGF0dGVtcHRpbmcgaXQgd2l0aCB0aGUgVk5DIGFkZGl0aW9ucy4KKworSWYgc3VjY2Vzc2Z1bCwgaW4gdGhlIHhjL3Byb2dyYW1zL1hzZXJ2ZXIgZGlyZWN0b3J5IHlvdSBzaG91bGQgZmluZCBhbiBYdm5jCitiaW5hcnksIHBsdXMgdGhlIG5hdGl2ZSBYIHNlcnZlciBiaW5hcnkoaWVzKSBmb3IgeW91ciBwbGF0Zm9ybSB3aXRoIFZOQyBzdXBwb3J0Citjb21waWxlZCBpbi4gIElmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBhbiBYLk9yZyB0cmVlIG9uIGEgc3VwcG9ydGVkCitwbGF0Zm9ybSwgeW91IHNob3VsZCBhbHNvIGZpbmQgYSB2bmMuc28gbW9kdWxlIGluCit4Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9tb2R1bGVzLgorCitFeGFjdGx5IHdoaWNoIFggZXh0ZW5zaW9ucyBhbmQgZmVhdHVyZXMgYXJlIGJ1aWx0IGludG8gWHZuYyBhbmQgdGhlIG5hdGl2ZSBYCitzZXJ2ZXIgYmluYXJ5IGlzIGRldGVybWluZWQgYnkgdGhlIHNldHRpbmdzIGluIHhjL2NvbmZpZy9jZi4gIFRoZSBmaWxlIHZuYy5kZWYKK2NvbnRhaW5zIHRoZSBzZXR0aW5ncyB3ZSB1c2UgdG8gYnVpbGQgb3VyIGJpbmFyeSBkaXN0cmlidXRpb25zLiAgWW91IG1heSBuZWVkCit0byBlZGl0IHRoaXMgYW5kIHRoZSBvdGhlciBmaWxlcyBhcyBhcHByb3ByaWF0ZS4KKworSW5zdGFsbGluZworPT09PT09PT09PQorCitEaWZmZXJlbnQgdW5peCBwbGF0Zm9ybXMgaGF2ZSBkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIHdoZXJlIHNvZnR3YXJlIHNob3VsZAorYmUgaW5zdGFsbGVkLiAgVG8gY29weSB0aGUgcHJvZ3JhbXMgdG8gc29tZSBkaXJlY3Rvcnkgd2hpY2ggaXMgaW4geW91ciBQQVRICitlbnZpcm9ubWVudCB2YXJpYWJsZSwgc3VjaCBhcyAvdXNyL2xvY2FsL2JpbiwgdGhlcmUgaXMgYSBzY3JpcHQgY2FsbGVkCit2bmNpbnN0YWxsIHdoaWNoIHlvdSBjYW4gdXNlOgorCisgICUgY2QgLi4KKyAgJSAuL3ZuY2luc3RhbGwgL3Vzci9sb2NhbC9iaW4KKworVGhpcyB3aWxsIGFsc28gYXR0ZW1wdCB0byBpbnN0YWxsIHRoZSBtYW51YWwgcGFnZXMgaW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgorWW91IGNhbiBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGRpcmVjdG9yeSBhcyBhIHNlY29uZCBhcmd1bWVudCB0byB2bmNpbnN0YWxsOgorCisgICUgLi92bmNpbnN0YWxsIC91c3IvbG9jYWwvYmluIC91c3IvbG9jYWwvbWFuCisKK0l0IHdpbGwgYWxzbyB0cnkgdG8gaW5zdGFsbCB0aGUgdm5jLnNvIFguT3JnIG1vZHVsZSBpZiBhcHByb3ByaWF0ZS4KK1RoaXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIC91c3IvWDExUjYvbGliL21vZHVsZXMvZXh0ZW5zaW9ucyBkaXJlY3RvcnkgYW5kIGNhbgorYmUgZW5hYmxlZCBsaWtlIGFueSBvdGhlciBtb2R1bGUgYnkgYWRkaW5nIGEgTG9hZCAidm5jIiBsaW5lIHRvIHRoZSBNb2R1bGUKK3NlY3Rpb24gb2YgeG9yZy5jb25mLiAgVGhlIHBhcmFtZXRlcnMgbGlzdGVkIGluIHRoZSBYdm5jIG1hbnVhbCBwYWdlIGNhbiBiZQorc2V0IGFzIG9wdGlvbnMgaW4geG9yZy5jb25mIGUuZy4gT3B0aW9uICJwYXNzd29yZEZpbGUiICIvcm9vdC8udm5jL3Bhc3N3ZCIuCitOb3RlIHRoYXQgZm9yIHNvbWUgcmVhc29uIG9wdGlvbnMgY2Fubm90IGJlIHNldCBpbiB0aGUgTW9kdWxlIHNlY3Rpb24gb2YKK3hvcmcuY29uZiAtIHRyeSB0aGUgU2NyZWVuIHNlY3Rpb24uCisKK0lmIHlvdSB3YW50IHRvIHVzZSB0aGUgSmF2YSBWTkMgdmlld2VyLCB5b3Ugc2hvdWxkIGNvcHkgdGhlIGZpbGVzIGZyb20KK3RoZSBqYXZhIGRpcmVjdG9yeSB0byBzb21lIHN1aXRhYmxlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgc3VjaCBhcworL3Vzci9sb2NhbC92bmMvY2xhc3NlczoKKworICAlIG1rZGlyIC1wIC91c3IvbG9jYWwvdm5jL2NsYXNzZXMKKyAgJSBjcCBqYXZhLyogL3Vzci9sb2NhbC92bmMvY2xhc3NlcworCitXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHRoZSB2bmNzZXJ2ZXIgc2NyaXB0IHRvIHJ1biBYdm5jIGZvciB5b3UuICBZb3UgY2FuCitlZGl0IHRoZSBzY3JpcHQgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgc2l0ZS4gIFRoaW5ncyB5b3UgbWF5IG5lZWQgdG8gY2hhbmdlCitpbmNsdWRlOgorCisgKiBUaGUgbG9jYXRpb24gb2YgUGVybCAtIGlmIFBlcmwgaXMgbm90IGluc3RhbGxlZCBpbiAvdXNyL2JpbiB5b3UnbGwgbmVlZAorICAgdG8gZWRpdCB0aGUgIiMhL3Vzci9iaW4vcGVybCIgZmlyc3QgbGluZSBvZiB2bmNzZXJ2ZXIuCisKKyAqIFh2bmMncyBmb250IHBhdGggYW5kIGNvbG9yIGRhdGFiYXNlLiAgSWYgeW91IGhhdmUgYW4gaW5zdGFsbGF0aW9uIG9mCisgICBYIHdoaWNoIGlzIG5vdCBpbiB0aGUgc3RhbmRhcmQgcGxhY2UgeW91IG1heSBuZWVkIHRvIGFkZCBhcmd1bWVudHMgdG8gdGhlCisgICBYdm5jIGNvbW1hbmQgbGluZSB0byBzZXQgdGhlc2UuICBUaGVzZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlICRjbWQKKyAgIHZhcmlhYmxlIGF0IHRoZSBjb21tZW50ICIjIEFkZCBmb250IHBhdGggYW5kIGNvbG9yIGRhdGFiYXNlLi4uIi4KKworICogJHZuY0phdmFGaWxlcyAtIHRoaXMgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZXMgZm9yCisgICB0aGUgVk5DIHZpZXdlciBKYXZhIGFwcGxldC4gIFRoZSBkZWZhdWx0IGlzIC91c3IvbG9jYWwvdm5jL2NsYXNzZXMuCisKKworQUNLTk9XTEVER0VNRU5UUworPT09PT09PT09PT09PT09PQorCitUaGlzIGRpc3RyaWJ1dGlvbiBjb250YWlucyBwdWJsaWMgZG9tYWluIERFUyBzb2Z0d2FyZSBieSBSaWNoYXJkIE91dGVyYnJpZGdlLgorVGhpcyBpczoKKworICAgIENvcHlyaWdodCAoYykgMTk4OCwxOTg5LDE5OTAsMTk5MSwxOTkyIGJ5IFJpY2hhcmQgT3V0ZXJicmlkZ2UuCisgICAgKEdFbmllIDogT1VURVI7IENJUyA6IFs3MTc1NSwyMDRdKSBHcmF2ZW4gSW1hZ2VyeSwgMTk5Mi4KKworCitUaGlzIGRpc3RyaWJ1dGlvbiBjb250YWlucyBzb2Z0d2FyZSBmcm9tIHRoZSBYIFdpbmRvdyBTeXN0ZW0uICBUaGlzIGlzOgorCisgQ29weXJpZ2h0IDE5ODcsIDE5ODgsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisgCisgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgZG9jdW1lbnRhdGlvbi4KKyAKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIAorIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIAorIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQorIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAKKyAKKyBDb3B5cmlnaHQgMTk4NywgMTk4OCBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgCisgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAorIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCisgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKKyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCisgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCisgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisgCisgRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCisgRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKKyBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyBTT0ZUV0FSRS4KKworCitUaGlzIGRpc3RyaWJ1dGlvbiBjb250YWlucyB6bGliIGNvbXByZXNzaW9uIHNvZnR3YXJlLiAgVGhpcyBpczoKKworICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKK1RoaXMgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIEphdmEgREVTIHNvZnR3YXJlIGJ5IERhdmUgWmltbWVybWFuCis8ZHppbW1Ad2lkZ2V0LmNvbT4gYW5kIEplZiBQb3NrYW56ZXIgPGplZkBhY21lLmNvbT4uICBUaGlzIGlzOgorCisgICAgQ29weXJpZ2h0IChjKSAxOTk2IFdpZGdldCBXb3Jrc2hvcCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgICAgZG9jdW1lbnRhdGlvbiBmb3IgTk9OLUNPTU1FUkNJQUwgb3IgQ09NTUVSQ0lBTCBwdXJwb3NlcyBhbmQgd2l0aG91dCBmZWUKKyAgICBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMga2VwdCBpbnRhY3QuCisgICAgCisgICAgV0lER0VUIFdPUktTSE9QIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTIEFCT1VUIFRIRQorICAgIFNVSVRBQklMSVRZIE9GIFRIRSBTT0ZUV0FSRSwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAorICAgIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCisgICAgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5ULiBXSURHRVQgV09SS1NIT1AgU0hBTEwgTk9UIEJFCisgICAgTElBQkxFIEZPUiBBTlkgREFNQUdFUyBTVUZGRVJFRCBCWSBMSUNFTlNFRSBBUyBBIFJFU1VMVCBPRiBVU0lORywKKyAgICBNT0RJRllJTkcgT1IgRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLgorICAgIAorICAgIFRISVMgU09GVFdBUkUgSVMgTk9UIERFU0lHTkVEIE9SIElOVEVOREVEIEZPUiBVU0UgT1IgUkVTQUxFIEFTIE9OLUxJTkUKKyAgICBDT05UUk9MIEVRVUlQTUVOVCBJTiBIQVpBUkRPVVMgRU5WSVJPTk1FTlRTIFJFUVVJUklORyBGQUlMLVNBRkUKKyAgICBQRVJGT1JNQU5DRSwgU1VDSCBBUyBJTiBUSEUgT1BFUkFUSU9OIE9GIE5VQ0xFQVIgRkFDSUxJVElFUywgQUlSQ1JBRlQKKyAgICBOQVZJR0FUSU9OIE9SIENPTU1VTklDQVRJT04gU1lTVEVNUywgQUlSIFRSQUZGSUMgQ09OVFJPTCwgRElSRUNUIExJRkUKKyAgICBTVVBQT1JUIE1BQ0hJTkVTLCBPUiBXRUFQT05TIFNZU1RFTVMsIElOIFdISUNIIFRIRSBGQUlMVVJFIE9GIFRIRQorICAgIFNPRlRXQVJFIENPVUxEIExFQUQgRElSRUNUTFkgVE8gREVBVEgsIFBFUlNPTkFMIElOSlVSWSwgT1IgU0VWRVJFCisgICAgUEhZU0lDQUwgT1IgRU5WSVJPTk1FTlRBTCBEQU1BR0UgKCJISUdIIFJJU0sgQUNUSVZJVElFUyIpLiAgV0lER0VUCisgICAgV09SS1NIT1AgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZIE9GCisgICAgRklUTkVTUyBGT1IgSElHSCBSSVNLIEFDVElWSVRJRVMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTYgYnkgSmVmIFBvc2thbnplciA8amVmQGFjbWUuY29tPi4gIEFsbCByaWdodHMKKyAgICByZXNlcnZlZC4KKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAgICBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAgICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMKKyAgICBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAgICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICAgIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyAgICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFZpc2l0IHRoZSBBQ01FIExhYnMgSmF2YSBwYWdlIGZvciB1cC10by1kYXRlIHZlcnNpb25zIG9mIHRoaXMgYW5kIG90aGVyCisgICAgZmluZSBKYXZhIHV0aWxpdGllczogaHR0cDovL3d3dy5hY21lLmNvbS9qYXZhLwpkaWZmIC0tZ2l0IGEvdW5peC9SRUFETUUuaHB1eCBiL3VuaXgvUkVBRE1FLmhwdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwYzU2YQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvUkVBRE1FLmhwdXgKQEAgLTAsMCArMSwzOSBAQAorSSBoYXZlIG1hbmFnZWQgdG8gYnVpbGQgWHZuYyBvbiBIUFVYIGJ1dCBvbmx5IHdpdGggc29tZSB1Z2x5IGhhY2tpbmcgb2YKK3RoZSBYIHRyZWUuICBUaGUgWCB0cmVlIEkgdXNlZCBhcyB0aGUgYmFzaXMgZm9yIHRoZSBidWlsZCBpcyB0aGUgWEZyZWU4NiA0LjIuMAordHJlZS4gIFRoZSBYRnJlZTg2IDQuMy4wIHRyZWUgaXMgdW5zdWl0YWJsZSBhcyBpdCBzZWVtcyB0byBoYXZlIGhhZCBzb21lIEhQVVgKK3N0dWZmIHJlbW92ZWQgZnJvbSBpdC4gIEkgYnVpbHQgdXNpbmcgdGhlIGFDQyBDKysgY29tcGlsZXIuCisKK1NldCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKKworICAlIENYWD0vb3B0L2FDQy9iaW4vYUNDCisgICUgQ0ZMQUdTPSIrREFwb3J0YWJsZSIKKyAgJSBDWFhGTEFHUz0iK0RBcG9ydGFibGUgLUFBICtXNzQ5ICtXNzQwIgorICAlIEJPT1RTVFJBUENGTEFHUz0tRGhwdXgKKyAgJSBleHBvcnQgQ1hYIENGTEFHUyBDWFhGTEFHUyBCT09UU1RSQVBDRkxBR1MKKworQnVpbGQgdGhlIG1haW4gcGFydCBvZiB0aGUgVk5DIGRpc3RyaWJ1dGlvbiBhcyBub3JtYWw6CisKKyAgJSAuL2NvbmZpZ3VyZQorICAlIG1ha2UKKworVW5wYWNrIHRoZSBYIHRyZWUgYW5kIGFwcGx5IHRoZSBwYXRjaGVzIGluIHhjLnBhdGNoOgorCisgICUgZ3VuemlwIC1jIFg0MjBzcmMtMS50Z3ogfCB0YXIgeGYgLQorICAlIHBhdGNoIC1OcDAgPHhjLnBhdGNoCisKK1RoZW4gYWRkaXRpb25hbGx5IGFwcGx5IHRoZSBwYXRjaGVzIGluIGhwdXgucGF0Y2g6CisKKyAgJSBwYXRjaCAtTnAwIDxocHV4LnBhdGNoCisKK0ZpbmFsbHkgdHJ5IGJ1aWxkaW5nIHRoZSBYIHRyZWU6CisKKyAgJSBjZCB4YworICAlIG1ha2UgV29ybGQKKworSWYgaXQgYWxsIGdvZXMgdG8gcGxhbiB5b3Ugd2lsbCBiZSBsZWZ0IHdpdGggWHZuYyBpbiB4Yy9wcm9ncmFtcy9Yc2VydmVyLiAgWW91Cit3aWxsIHByb2JhYmx5IGhhdmUgdG8gbW9kaWZ5IHRoZSB2bmNzZXJ2ZXIgc2NyaXB0IHRvIHNldCB1cCBhIHNlbnNpYmxlIGZvbnQKK3BhdGgsIHNpbmNlIG1hbnkgb2YgdGhlIGZvbnQgZGlyZWN0b3JpZXMgb24gSFBVWCBhcmUgZGlmZmVyZW50IGZyb20gdGhlCitkZWZhdWx0cyBjb21waWxlZCBpbnRvIFh2bmMuCisKK0lmIGFueW9uZSBjYW4gZmluZCBhIG5lYXRlciB3YXkgb2YgYnVpbGRpbmcgYSBWTkMtY29tcGF0aWJsZSBYIHRyZWUgb24gSFBVWAorcGxlYXNlIGxldCB1cyBrbm93IChzZWUgaHR0cDovL3d3dy50aWdodHZuYy5jb20gZm9yIGNvbnRhY3QgZGV0YWlscykuCmRpZmYgLS1naXQgYS91bml4L2FjbG9jYWwubTQgYi91bml4L2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0YzJmMwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvYWNsb2NhbC5tNApAQCAtMCwwICsxLDI2MDIgQEAKKyMgY29kZXNldC5tNCBzZXJpYWwgQU0xIChnZXR0ZXh0LTAuMTAuNDApCitkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW0FNX0xBTkdJTkZPX0NPREVTRVRdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIG5sX2xhbmdpbmZvIGFuZCBDT0RFU0VUXSwgYW1fY3ZfbGFuZ2luZm9fY29kZXNldCwKKyAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsYW5naW5mby5oPl0sCisgICAgICBbY2hhciogY3MgPSBubF9sYW5naW5mbyhDT0RFU0VUKTtdLAorICAgICAgYW1fY3ZfbGFuZ2luZm9fY29kZXNldD15ZXMsCisgICAgICBhbV9jdl9sYW5naW5mb19jb2Rlc2V0PW5vKQorICAgIF0pCisgIGlmIHRlc3QgJGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9MQU5HSU5GT19DT0RFU0VULCAxLAorICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSA8bGFuZ2luZm8uaD4gYW5kIG5sX2xhbmdpbmZvKENPREVTRVQpLl0pCisgIGZpCitdKQorIyBnZXR0ZXh0Lm00IHNlcmlhbCAyOCAoZ2V0dGV4dC0wLjEzKQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUtMjAwMC4KK2RubCAgIEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPiwgMjAwMC0yMDAzLgorCitkbmwgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKworZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVChbSU5UTFNZTUJPTF0sIFtORUVEU1lNQk9MXSwgW0lOVExESVJdKS4KK2RubCBJTlRMU1lNQk9MIGNhbiBiZSBvbmUgb2YgJ2V4dGVybmFsJywgJ25vLWxpYnRvb2wnLCAndXNlLWxpYnRvb2wnLiBUaGUKK2RubCAgICBkZWZhdWx0IChpZiBpdCBpcyBub3Qgc3BlY2lmaWVkIG9yIGVtcHR5KSBpcyAnbm8tbGlidG9vbCcuCitkbmwgICAgSU5UTFNZTUJPTCBzaG91bGQgYmUgJ2V4dGVybmFsJyBmb3IgcGFja2FnZXMgd2l0aCBubyBpbnRsIGRpcmVjdG9yeSwKK2RubCAgICBhbmQgJ25vLWxpYnRvb2wnIG9yICd1c2UtbGlidG9vbCcgZm9yIHBhY2thZ2VzIHdpdGggYW4gaW50bCBkaXJlY3RvcnkuCitkbmwgICAgSWYgSU5UTFNZTUJPTCBpcyAndXNlLWxpYnRvb2wnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5CitkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5sYSB3aWxsIGJlIGNyZWF0ZWQgKHNoYXJlZCBhbmQvb3Igc3RhdGljLAorZG5sICAgIGRlcGVuZGluZyBvbiAtLXtlbmFibGUsZGlzYWJsZX0te3NoYXJlZCxzdGF0aWN9IGFuZCBvbiB0aGUgcHJlc2VuY2Ugb2YKK2RubCAgICBBTS1ESVNBQkxFLVNIQVJFRCkuIElmIElOVExTWU1CT0wgaXMgJ25vLWxpYnRvb2wnLCBhIHN0YXRpYyBsaWJyYXJ5CitkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5hIHdpbGwgYmUgY3JlYXRlZC4KK2RubCBJZiBORUVEU1lNQk9MIGlzIHNwZWNpZmllZCBhbmQgaXMgJ25lZWQtbmdldHRleHQnLCB0aGVuIEdOVSBnZXR0ZXh0CitkbmwgICAgaW1wbGVtZW50YXRpb25zIChpbiBsaWJjIG9yIGxpYmludGwpIHdpdGhvdXQgdGhlIG5nZXR0ZXh0KCkgZnVuY3Rpb24KK2RubCAgICB3aWxsIGJlIGlnbm9yZWQuICBJZiBORUVEU1lNQk9MIGlzIHNwZWNpZmllZCBhbmQgaXMKK2RubCAgICAnbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zJywgdGhlbiBHTlUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkb24ndAorZG5sICAgIHN1cHBvcnQgdGhlIElTTyBDIDk5IDxpbnR0eXBlcy5oPiBmb3JtYXRzdHJpbmcgbWFjcm9zIHdpbGwgYmUgaWdub3JlZC4KK2RubCBJTlRMRElSIGlzIHVzZWQgdG8gZmluZCB0aGUgaW50bCBsaWJyYXJpZXMuICBJZiBlbXB0eSwKK2RubCAgICB0aGUgdmFsdWUgYCQodG9wX2J1aWxkZGlyKS9pbnRsLycgaXMgdXNlZC4KK2RubAorZG5sIFRoZSByZXN1bHQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgb25lIG9mIHRocmVlIGNhc2VzOgorZG5sIDEpIEdOVSBnZXR0ZXh0LCBhcyBpbmNsdWRlZCBpbiB0aGUgaW50bCBzdWJkaXJlY3RvcnksIHdpbGwgYmUgY29tcGlsZWQKK2RubCAgICBhbmQgdXNlZC4KK2RubCAgICBDYXRhbG9nIGZvcm1hdDogR05VIC0tPiBpbnN0YWxsIGluICQoZGF0YWRpcikKK2RubCAgICBDYXRhbG9nIGV4dGVuc2lvbjogLm1vIGFmdGVyIGluc3RhbGxhdGlvbiwgLmdtbyBpbiBzb3VyY2UgdHJlZQorZG5sIDIpIEdOVSBnZXR0ZXh0IGhhcyBiZWVuIGZvdW5kIGluIHRoZSBzeXN0ZW0ncyBDIGxpYnJhcnkuCitkbmwgICAgQ2F0YWxvZyBmb3JtYXQ6IEdOVSAtLT4gaW5zdGFsbCBpbiAkKGRhdGFkaXIpCitkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IC5tbyBhZnRlciBpbnN0YWxsYXRpb24sIC5nbW8gaW4gc291cmNlIHRyZWUKK2RubCAzKSBObyBpbnRlcm5hdGlvbmFsaXphdGlvbiwgYWx3YXlzIHVzZSBFbmdsaXNoIG1zZ2lkLgorZG5sICAgIENhdGFsb2cgZm9ybWF0OiBub25lCitkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IG5vbmUKK2RubCBJZiBJTlRMU1lNQk9MIGlzICdleHRlcm5hbCcsIG9ubHkgY2FzZXMgMiBhbmQgMyBjYW4gb2NjdXIuCitkbmwgVGhlIHVzZSBvZiAuZ21vIGlzIGhpc3RvcmljYWwgKGl0IHdhcyBuZWVkZWQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdGhlCitkbmwgR05VIGZvcm1hdCBjYXRhbG9ncyB3aGVuIGJ1aWxkaW5nIG9uIGEgcGxhdGZvcm0gd2l0aCBhbiBYL09wZW4gZ2V0dGV4dCksCitkbmwgYnV0IHdlIGtlZXAgaXQgaW4gb3JkZXIgbm90IHRvIGZvcmNlIGlycmVsZXZhbnQgZmlsZW5hbWUgY2hhbmdlcyBvbiB0aGUKK2RubCBtYWludGFpbmVycy4KK2RubAorQUNfREVGVU4oW0FNX0dOVV9HRVRURVhUXSwKK1sKKyAgZG5sIEFyZ3VtZW50IGNoZWNraW5nLgorICBpZmVsc2UoWyQxXSwgW10sICwgW2lmZWxzZShbJDFdLCBbZXh0ZXJuYWxdLCAsIFtpZmVsc2UoWyQxXSwgW25vLWxpYnRvb2xdLCAsIFtpZmVsc2UoWyQxXSwgW3VzZS1saWJ0b29sXSwgLAorICAgIFtlcnJwcmludChbRVJST1I6IGludmFsaWQgZmlyc3QgYXJndW1lbnQgdG8gQU1fR05VX0dFVFRFWFQKK10pXSldKV0pXSkKKyAgaWZlbHNlKFskMl0sIFtdLCAsIFtpZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCAsIFtpZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sICwKKyAgICBbZXJycHJpbnQoW0VSUk9SOiBpbnZhbGlkIHNlY29uZCBhcmd1bWVudCB0byBBTV9HTlVfR0VUVEVYVAorXSldKV0pXSkKKyAgZGVmaW5lKGd0X2luY2x1ZGVkX2ludGwsIGlmZWxzZShbJDFdLCBbZXh0ZXJuYWxdLCBbbm9dLCBbeWVzXSkpCisgIGRlZmluZShndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXgsIGlmZWxzZShbJDFdLCBbdXNlLWxpYnRvb2xdLCBbbF0sIFtdKSkKKworICBBQ19SRVFVSVJFKFtBTV9QT19TVUJESVJTXSlkbmwKKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgIEFDX1JFUVVJUkUoW0FNX0lOVExfU1VCRElSXSlkbmwKKyAgXSkKKworICBkbmwgUHJlcmVxdWlzaXRlcyBvZiBBQ19MSUJfTElOS0ZMQUdTX0JPRFkuCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisKKyAgZG5sIFNvbWV0aW1lcyBsaWJpbnRsIHJlcXVpcmVzIGxpYmljb252LCBzbyBmaXJzdCBzZWFyY2ggZm9yIGxpYmljb252LgorICBkbmwgSWRlYWxseSB3ZSB3b3VsZCBkbyB0aGlzIHNlYXJjaCBvbmx5IGFmdGVyIHRoZQorICBkbmwgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICBkbmwgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKyAgZG5sIHRlc3RzLiBCdXQgaWYgY29uZmlndXJlLmluIGludm9rZXMgQU1fSUNPTlYgYWZ0ZXIgQU1fR05VX0dFVFRFWFQKKyAgZG5sIHRoZSBjb25maWd1cmUgc2NyaXB0IHdvdWxkIG5lZWQgdG8gY29udGFpbiB0aGUgc2FtZSBzaGVsbCBjb2RlCisgIGRubCBhZ2Fpbiwgb3V0c2lkZSBhbnkgJ2lmJy4gVGhlcmUgYXJlIHR3byBzb2x1dGlvbnM6CisgIGRubCAtIEludm9rZSBBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWSBoZXJlLCBvdXRzaWRlIGFueSAnaWYnLgorICBkbmwgLSBDb250cm9sIHRoZSBleHBhbnNpb25zIGluIG1vcmUgZGV0YWlsIHVzaW5nIEFDX1BST1ZJREVfSUZFTFNFLgorICBkbmwgU2luY2UgQUNfUFJPVklERV9JRkVMU0UgaXMgb25seSBpbiBhdXRvY29uZiA+PSAyLjUyIGFuZCBub3QKKyAgZG5sIGRvY3VtZW50ZWQsIHdlIGF2b2lkIGl0LgorICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCAsIFsKKyAgICBBQ19SRVFVSVJFKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0pCisgIF0pCisKKyAgZG5sIFNldCBVU0VfTkxTLgorICBBTV9OTFMKKworICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCisgICAgQlVJTERfSU5DTFVERURfTElCSU5UTD1ubworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisgIF0pCisgIExJQklOVEw9CisgIExUTElCSU5UTD0KKyAgUE9TVUI9CisKKyAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgIGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dD1ubworICAgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCisgICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAorICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCisgICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgIF0pCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIEdOVSBnZXR0ZXh0IGlzIGF2YWlsYWJsZSB3ZSB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZQorICAgICAgICBkbmwgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKworICAgICAgICBkbmwgQWRkIGEgdmVyc2lvbiBudW1iZXIgdG8gdGhlIGNhY2hlIG1hY3Jvcy4KKyAgICAgICAgZGVmaW5lKFtndF9hcGlfdmVyc2lvbl0sIGlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwgMywgaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgMiwgMSkpKQorICAgICAgICBkZWZpbmUoW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjXSwgW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF1ndF9hcGlfdmVyc2lvbltfbGliY10pCisgICAgICAgIGRlZmluZShbZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGxdLCBbZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0XWd0X2FwaV92ZXJzaW9uW19saWJpbnRsXSkKKworICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dudWdldHRleHRfbGliYywKKyAgICAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD4KK11pZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sCitbI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgorI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgKChtYWpvcikgPT0gMCA/IDAgOiAtMSkKKyNlbmRpZgorY2hhbmdlcXVvdGUoLClkbmwKK3R5cGVkZWYgaW50IGFycmF5IFsyICogKF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKDApID49IDEpIC0gMV07CitjaGFuZ2VxdW90ZShbLF0pZG5sCitdLCBbXSlbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworZXh0ZXJuIGludCAqX25sX2RvbWFpbl9iaW5kaW5ncztdLAorICAgICAgICAgICAgW2JpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV1pZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCBbICsgKGludCkgbmdldHRleHQgKCIiLCAiIiwgMCldLCBbXSlbICsgX25sX21zZ19jYXRfY250ciArICpfbmxfZG9tYWluX2JpbmRpbmdzXSwKKyAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjPXllcywKKyAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjPW5vKV0pCisKKyAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgIGRubCBTb21ldGltZXMgbGliaW50bCByZXF1aXJlcyBsaWJpY29udiwgc28gZmlyc3Qgc2VhcmNoIGZvciBsaWJpY29udi4KKyAgICAgICAgICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCAsIFsKKyAgICAgICAgICAgIEFNX0lDT05WX0xJTksKKyAgICAgICAgICBdKQorICAgICAgICAgIGRubCBTZWFyY2ggZm9yIGxpYmludGwgYW5kIGRlZmluZSBMSUJJTlRMLCBMVExJQklOVEwgYW5kIElOQ0lOVEwKKyAgICAgICAgICBkbmwgYWNjb3JkaW5nbHkuIERvbid0IHVzZSBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoW2ludGxdLFtpY29udl0pCisgICAgICAgICAgZG5sIGJlY2F1c2UgdGhhdCB3b3VsZCBhZGQgIi1saWNvbnYiIHRvIExJQklOVEwgYW5kIExUTElCSU5UTAorICAgICAgICAgIGRubCBldmVuIGlmIGxpYmljb252IGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAgQUNfTElCX0xJTktGTEFHU19CT0RZKFtpbnRsXSkKKyAgICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmludGxdLAorICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwsCisgICAgICAgICAgIFtndF9zYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRJTkNJTlRMIgorICAgICAgICAgICAgZ3Rfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgICAgIExJQlM9IiRMSUJTICRMSUJJTlRMIgorICAgICAgICAgICAgZG5sIE5vdyBzZWUgd2hldGhlciBsaWJpbnRsIGV4aXN0cyBhbmQgZG9lcyBub3QgZGVwZW5kIG9uIGxpYmljb252LgorICAgICAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CitdaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLAorWyNpZm5kZWYgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisjZW5kaWYKK2NoYW5nZXF1b3RlKCwpZG5sCit0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworY2hhbmdlcXVvdGUoWyxdKWRubAorXSwgW10pW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKK2V4dGVybgorI2lmZGVmIF9fY3BsdXNwbHVzCisiQyIKKyNlbmRpZgorY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoKTtdLAorICAgICAgICAgICAgICBbYmluZHRleHRkb21haW4gKCIiLCAiIik7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXWlmZWxzZShbJDJdLCBbbmVlZC1uZ2V0dGV4dF0sIFsgKyAoaW50KSBuZ2V0dGV4dCAoIiIsICIiLCAwKV0sIFtdKVsgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9leHBhbmRfYWxpYXMgKDApXSwKKyAgICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGw9eWVzLAorICAgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bD1ubykKKyAgICAgICAgICAgIGRubCBOb3cgc2VlIHdoZXRoZXIgbGliaW50bCBleGlzdHMgYW5kIGRlcGVuZHMgb24gbGliaWNvbnYuCisgICAgICAgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiICE9IHllcyAmJiB0ZXN0IC1uICIkTElCSUNPTlYiOyB0aGVuCisgICAgICAgICAgICAgIExJQlM9IiRMSUJTICRMSUJJQ09OViIKKyAgICAgICAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CitdaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLAorWyNpZm5kZWYgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisjZW5kaWYKK2NoYW5nZXF1b3RlKCwpZG5sCit0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworY2hhbmdlcXVvdGUoWyxdKWRubAorXSwgW10pW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKK2V4dGVybgorI2lmZGVmIF9fY3BsdXNwbHVzCisiQyIKKyNlbmRpZgorY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoKTtdLAorICAgICAgICAgICAgICAgIFtiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgWyArIChpbnQpIG5nZXR0ZXh0ICgiIiwgIiIsIDApXSwgW10pWyArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2V4cGFuZF9hbGlhcyAoMCldLAorICAgICAgICAgICAgICAgW0xJQklOVEw9IiRMSUJJTlRMICRMSUJJQ09OViIKKyAgICAgICAgICAgICAgICBMVExJQklOVEw9IiRMVExJQklOVEwgJExUTElCSUNPTlYiCisgICAgICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGw9eWVzCisgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIENQUEZMQUdTPSIkZ3Rfc2F2ZV9DUFBGTEFHUyIKKyAgICAgICAgICAgIExJQlM9IiRndF9zYXZlX0xJQlMiXSkKKyAgICAgICAgZmkKKworICAgICAgICBkbmwgSWYgYW4gYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZCBHTlUgZ2V0dGV4dCgpIGlzIGZvdW5kLAorICAgICAgICBkbmwgdXNlIGl0LiAgQnV0IGlmIHRoaXMgbWFjcm8gaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCwgYW5kIEdOVQorICAgICAgICBkbmwgZ2V0dGV4dCBpcyBhbHJlYWR5IHByZWluc3RhbGxlZCBpbiBsaWJpbnRsLCB3ZSB1cGRhdGUgdGhpcworICAgICAgICBkbmwgbGliaW50bC4gIChDZi4gdGhlIGluc3RhbGwgcnVsZSBpbiBpbnRsL01ha2VmaWxlLmluLikKKyAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKyAgICAgICAgICAgfHwgeyB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiID0gInllcyIgXAorICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXJ1bnRpbWUgXAorICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXRvb2xzOyB9OyB0aGVuCisgICAgICAgICAgZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0PXllcworICAgICAgICBlbHNlCisgICAgICAgICAgZG5sIFJlc2V0IHRoZSB2YWx1ZXMgc2V0IGJ5IHNlYXJjaGluZyBmb3IgbGliaW50bC4KKyAgICAgICAgICBMSUJJTlRMPQorICAgICAgICAgIExUTElCSU5UTD0KKyAgICAgICAgICBJTkNJTlRMPQorICAgICAgICBmaQorCisgICAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgICAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgIGRubCBHTlUgZ2V0dGV4dCBpcyBub3QgZm91bmQgaW4gdGhlIEMgbGlicmFyeS4KKyAgICAgICAgICBkbmwgRmFsbCBiYWNrIG9uIGluY2x1ZGVkIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCisgICAgICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCisgICAgICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBMSUJJTlRMPSJpZmVsc2UoWyQzXSxbXSxcJHt0b3BfYnVpbGRkaXJ9L2ludGwsWyQzXSkvbGliaW50bC5bXWd0X2xpYnRvb2xfc3VmZml4X3ByZWZpeFtdYSAkTElCSUNPTlYiCisgICAgICAgIExUTElCSU5UTD0iaWZlbHNlKFskM10sW10sXCR7dG9wX2J1aWxkZGlyfS9pbnRsLFskM10pL2xpYmludGwuW11ndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXhbXWEgJExUTElCSUNPTlYiCisgICAgICAgIExJQlM9YGVjaG8gIiAkTElCUyAiIHwgc2VkIC1lICdzLyAtbGludGwgLyAvJyAtZSAncy9eIC8vJyAtZSAncy8gJC8vJ2AKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAorICAgICAgICAgfHwgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB0byB1c2UgR05VIGdldHRleHQgdG9vbHMuCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICBmaQorICAgIF0pCisKKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiIFwKKyAgICAgICB8fCB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsCisgICAgICAgIFtEZWZpbmUgdG8gMSBpZiB0cmFuc2xhdGlvbiBvZiBwcm9ncmFtIG1lc3NhZ2VzIHRvIHRoZSB1c2VyJ3MgbmF0aXZlIGxhbmd1YWdlCisgICBpcyByZXF1ZXN0ZWQuXSkKKyAgICBlbHNlCisgICAgICBVU0VfTkxTPW5vCisgICAgZmkKKyAgZmkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gdXNlIE5MU10pCisgIEFDX01TR19SRVNVTFQoWyRVU0VfTkxTXSkKKyAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXJlIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGNvbWVzIGZyb21dKQorICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorICAgICAgICBndF9zb3VyY2U9ImV4dGVybmFsIGxpYmludGwiCisgICAgICBlbHNlCisgICAgICAgIGd0X3NvdXJjZT0ibGliYyIKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZ3Rfc291cmNlPSJpbmNsdWRlZCBpbnRsIGRpcmVjdG9yeSIKKyAgICBmaQorICAgIEFDX01TR19SRVNVTFQoWyRndF9zb3VyY2VdKQorICBmaQorCisgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisKKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gbGluayB3aXRoIGxpYmludGxdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskTElCSU5UTF0pCisgICAgICAgIEFDX0xJQl9BUFBFTkRUT1ZBUihbQ1BQRkxBR1NdLCBbJElOQ0lOVExdKQorICAgICAgZmkKKworICAgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIHBhY2thZ2VzIG1heSBiZSB1c2luZyB0aGlzLgorICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKKyAgICAgICBbRGVmaW5lIGlmIHRoZSBHTlUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBvciBwcmVpbnN0YWxsZWQuXSkKKyAgICAgIEFDX0RFRklORShIQVZFX0RDR0VUVEVYVCwgMSwKKyAgICAgICBbRGVmaW5lIGlmIHRoZSBHTlUgZGNnZXR0ZXh0KCkgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZC5dKQorICAgIGZpCisKKyAgICBkbmwgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgIFBPU1VCPXBvCisgIGZpCisKKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgIGRubCBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgQlVJTERfSU5DTFVERURfTElCSU5UTAorICAgIGRubCB0byAneWVzJyBiZWNhdXNlIHNvbWUgb2YgdGhlIHRlc3RzdWl0ZSByZXF1aXJlcyBpdC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0LXJ1bnRpbWUgfHwgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dC10b29sczsgdGhlbgorICAgICAgQlVJTERfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCisgICAgQUNfU1VCU1QoQlVJTERfSU5DTFVERURfTElCSU5UTCkKKyAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKKyAgICBBQ19TVUJTVChDQVRPQkpFWFQpCisKKyAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgY29uZmlndXJlLmlucyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBubHNfY3ZfaGVhZGVyX2ludGw9CisgICAgbmxzX2N2X2hlYWRlcl9saWJndD0KKworICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKworICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisgICAgSU5TVE9CSkVYVD0ubW8KKyAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQorCisgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBHRU5DQVQ9Z2VuY2F0CisgICAgQUNfU1VCU1QoR0VOQ0FUKQorCisgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBpZiB0ZXN0ICIkVVNFX0lOQ0xVREVEX0xJQklOVEwiID0geWVzOyB0aGVuCisgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgIGZpCisgICAgQUNfU1VCU1QoSU5UTE9CSlMpCisKKyAgICBkbmwgRW5hYmxlIGxpYnRvb2wgc3VwcG9ydCBpZiB0aGUgc3Vycm91bmRpbmcgcGFja2FnZSB3aXNoZXMgaXQuCisgICAgSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVg9Z3RfbGlidG9vbF9zdWZmaXhfcHJlZml4CisgICAgQUNfU1VCU1QoSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVgpCisgIF0pCisKKyAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgSU5UTExJQlM9IiRMSUJJTlRMIgorICBBQ19TVUJTVChJTlRMTElCUykKKworICBkbmwgTWFrZSBhbGwgZG9jdW1lbnRlZCB2YXJpYWJsZXMga25vd24gdG8gYXV0b2NvbmYuCisgIEFDX1NVQlNUKExJQklOVEwpCisgIEFDX1NVQlNUKExUTElCSU5UTCkKKyAgQUNfU1VCU1QoUE9TVUIpCitdKQorCisKK2RubCBDaGVja3MgZm9yIGFsbCBwcmVyZXF1aXNpdGVzIG9mIHRoZSBpbnRsIHN1YmRpcmVjdG9yeSwKK2RubCBleGNlcHQgZm9yIElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYIChhbmQgcG9zc2libHkgTElCVE9PTCksIElOVExPQkpTLAorZG5sICAgICAgICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEwsIEJVSUxEX0lOQ0xVREVEX0xJQklOVEwuCitBQ19ERUZVTihbQU1fSU5UTF9TVUJESVJdLAorWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAorICBBQ19SRVFVSVJFKFtBTV9NS0lOU1RBTExESVJTXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAorICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAorICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAorICBBQ19SRVFVSVJFKFtiaF9DX1NJR05FRF0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKKyAgQUNfUkVRVUlSRShbam1fQUNfVFlQRV9MT05HX0xPTkddKWRubAorICBBQ19SRVFVSVJFKFtndF9UWVBFX0xPTkdET1VCTEVdKWRubAorICBBQ19SRVFVSVJFKFtndF9UWVBFX1dDSEFSX1RdKWRubAorICBBQ19SRVFVSVJFKFtndF9UWVBFX1dJTlRfVF0pZG5sCisgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9JTlRUWVBFU19IXSkKKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX1NURElOVF9IXSkKKyAgQUNfUkVRVUlSRShbZ3RfVFlQRV9JTlRNQVhfVF0pCisgIEFDX1JFUVVJUkUoW2d0X1BSSU5URl9QT1NJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKKyAgQUNfUkVRVUlSRShbam1fR0xJQkMyMV0pZG5sCisgIEFDX1JFUVVJUkUoW2d0X0lOVERJVjBdKWRubAorICBBQ19SRVFVSVJFKFtqbV9BQ19UWVBFX1VJTlRNQVhfVF0pZG5sCisgIEFDX1JFUVVJUkUoW2d0X0hFQURFUl9JTlRUWVBFU19IXSlkbmwKKyAgQUNfUkVRVUlSRShbZ3RfSU5UVFlQRVNfUFJJXSlkbmwKKyAgQUNfUkVRVUlSRShbZ2xfWFNJWkVdKWRubAorCisgIEFDX0NIRUNLX1RZUEUoW3B0cmRpZmZfdF0sICwKKyAgICBbQUNfREVGSU5FKFtwdHJkaWZmX3RdLCBbbG9uZ10sCisgICAgICAgW0RlZmluZSBhcyB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHR3byBwb2ludGVycywgaWYgdGhlIHN5c3RlbSBkb2Vzbid0IGRlZmluZSBpdC5dKQorICAgIF0pCisgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0ZGRlZi5oIFwKK3N0ZGxpYi5oIHN0cmluZy5oIHVuaXN0ZC5oIHN5cy9wYXJhbS5oXSkKKyAgQUNfQ0hFQ0tfRlVOQ1MoW2FzcHJpbnRmIGZ3cHJpbnRmIGdldGN3ZCBnZXRlZ2lkIGdldGV1aWQgZ2V0Z2lkIGdldHVpZCBcCittZW1wY3B5IG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzbnByaW50ZiBzdHBjcHkgc3RyY2FzZWNtcCBzdHJkdXAgXAorc3RydG91bCB0c2VhcmNoIHdjc2xlbiBfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dCBcCitfX2ZzZXRsb2NraW5nXSkKKworICBkbmwgVXNlIHRoZSBfc25wcmludGYgZnVuY3Rpb24gb25seSBpZiBpdCBpcyBkZWNsYXJlZCAoYmVjYXVzZSBvbiBOZXRCU0QgaXQKKyAgZG5sIGlzIGRlZmluZWQgYXMgYSB3ZWFrIGFsaWFzIG9mIHNucHJpbnRmOyB3ZSBwcmVmZXIgdG8gdXNlIHRoZSBsYXR0ZXIpLgorICBndF9DSEVDS19ERUNMKF9zbnByaW50ZiwgWyNpbmNsdWRlIDxzdGRpby5oPl0pCisgIGd0X0NIRUNLX0RFQ0woX3Nud3ByaW50ZiwgWyNpbmNsdWRlIDxzdGRpby5oPl0pCisKKyAgZG5sIFVzZSB0aGUgKl91bmxvY2tlZCBmdW5jdGlvbnMgb25seSBpZiB0aGV5IGFyZSBkZWNsYXJlZC4KKyAgZG5sIChiZWNhdXNlIHNvbWUgb2YgdGhlbSB3ZXJlIGRlZmluZWQgd2l0aG91dCBiZWluZyBkZWNsYXJlZCBpbiBTb2xhcmlzCisgIGRubCAyLjUuMSBidXQgd2VyZSByZW1vdmVkIGluIFNvbGFyaXMgMi42LCB3aGVyZWFzIHdlIHdhbnQgYmluYXJpZXMgYnVpbHQKKyAgZG5sIG9uIFNvbGFyaXMgMi41LjEgdG8gcnVuIG9uIFNvbGFyaXMgMi42KS4KKyAgZG5sIERvbid0IHVzZSBBQ19DSEVDS19ERUNMUyBiZWNhdXNlIGl0IGlzbid0IHN1cHBvcnRlZCBpbiBhdXRvY29uZi0yLjEzLgorICBndF9DSEVDS19ERUNMKGZlb2ZfdW5sb2NrZWQsIFsjaW5jbHVkZSA8c3RkaW8uaD5dKQorICBndF9DSEVDS19ERUNMKGZnZXRzX3VubG9ja2VkLCBbI2luY2x1ZGUgPHN0ZGlvLmg+XSkKKyAgZ3RfQ0hFQ0tfREVDTChnZXRjX3VubG9ja2VkLCBbI2luY2x1ZGUgPHN0ZGlvLmg+XSkKKworICBjYXNlICRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCBpbgorICAgICp5ZXMpIEhBVkVfUE9TSVhfUFJJTlRGPTEgOzsKKyAgICAqKSBIQVZFX1BPU0lYX1BSSU5URj0wIDs7CisgIGVzYWMKKyAgQUNfU1VCU1QoW0hBVkVfUE9TSVhfUFJJTlRGXSkKKyAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfYXNwcmludGYiID0geWVzOyB0aGVuCisgICAgSEFWRV9BU1BSSU5URj0xCisgIGVsc2UKKyAgICBIQVZFX0FTUFJJTlRGPTAKKyAgZmkKKyAgQUNfU1VCU1QoW0hBVkVfQVNQUklOVEZdKQorICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19zbnByaW50ZiIgPSB5ZXM7IHRoZW4KKyAgICBIQVZFX1NOUFJJTlRGPTEKKyAgZWxzZQorICAgIEhBVkVfU05QUklOVEY9MAorICBmaQorICBBQ19TVUJTVChbSEFWRV9TTlBSSU5URl0pCisgIGlmIHRlc3QgIiRhY19jdl9mdW5jX3dwcmludGYiID0geWVzOyB0aGVuCisgICAgSEFWRV9XUFJJTlRGPTEKKyAgZWxzZQorICAgIEhBVkVfV1BSSU5URj0wCisgIGZpCisgIEFDX1NVQlNUKFtIQVZFX1dQUklOVEZdKQorCisgIEFNX0lDT05WCisgIEFNX0xBTkdJTkZPX0NPREVTRVQKKyAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgQU1fTENfTUVTU0FHRVMKKyAgZmkKKworICBkbmwgaW50bC9wbHVyYWwuYyBpcyBnZW5lcmF0ZWQgZnJvbSBpbnRsL3BsdXJhbC55LiBJdCByZXF1aXJlcyBiaXNvbiwKKyAgZG5sIGJlY2F1c2UgcGx1cmFsLnkgdXNlcyBiaXNvbiBzcGVjaWZpYyBmZWF0dXJlcy4gSXQgcmVxdWlyZXMgYXQgbGVhc3QKKyAgZG5sIGJpc29uLTEuMjYgYmVjYXVzZSBlYXJsaWVyIHZlcnNpb25zIGdlbmVyYXRlIGEgcGx1cmFsLmMgdGhhdCBkb2Vzbid0CisgIGRubCBjb21waWxlLgorICBkbmwgYmlzb24gaXMgb25seSBuZWVkZWQgZm9yIHRoZSBtYWludGFpbmVyICh3aG8gdG91Y2hlcyBwbHVyYWwueSkuIEJ1dCBpbgorICBkbmwgb3JkZXIgdG8gYXZvaWQgc2VwYXJhdGUgTWFrZWZpbGVzIG9yIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSwgd2UgcHV0CisgIGRubCB0aGUgcnVsZSBpbiBnZW5lcmFsIE1ha2VmaWxlLiBOb3csIHNvbWUgcGVvcGxlIGNhcmVsZXNzbHkgdG91Y2ggdGhlCisgIGRubCBmaWxlcyBvciBoYXZlIGEgYnJva2VuICJtYWtlIiBwcm9ncmFtLCBoZW5jZSB0aGUgcGx1cmFsLmMgcnVsZSB3aWxsCisgIGRubCBzb21ldGltZXMgZmlyZS4gVG8gYXZvaWQgYW4gZXJyb3IsIGRlZmluZXMgQklTT04gdG8gIjoiIGlmIGl0IGlzIG5vdAorICBkbmwgcHJlc2VudCBvciB0b28gb2xkLgorICBBQ19DSEVDS19QUk9HUyhbSU5UTEJJU09OXSwgW2Jpc29uXSkKKyAgaWYgdGVzdCAteiAiJElOVExCSVNPTiI7IHRoZW4KKyAgICBhY192ZXJjX2ZhaWw9eWVzCisgIGVsc2UKKyAgICBkbmwgRm91bmQgaXQsIG5vdyBjaGVjayB0aGUgdmVyc2lvbi4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3ZlcnNpb24gb2YgYmlzb25dKQorY2hhbmdlcXVvdGUoPDwsPj4pZG5sCisgICAgYWNfcHJvZ192ZXJzaW9uPWAkSU5UTEJJU09OIC0tdmVyc2lvbiAyPiYxIHwgc2VkIC1uICdzL14uKkdOVSBCaXNvbi4qIFwoWzAtOV0qXC5bMC05Ll0qXCkuKiQvXDEvcCdgCisgICAgY2FzZSAkYWNfcHJvZ192ZXJzaW9uIGluCisgICAgICAnJykgYWNfcHJvZ192ZXJzaW9uPSJ2LiA/Lj8/LCBiYWQiOyBhY192ZXJjX2ZhaWw9eWVzOzsKKyAgICAgIDEuMls2LTldKiB8IDEuWzMtOV1bMC05XSogfCBbMi05XS4qKQorY2hhbmdlcXVvdGUoWyxdKWRubAorICAgICAgICAgYWNfcHJvZ192ZXJzaW9uPSIkYWNfcHJvZ192ZXJzaW9uLCBvayI7IGFjX3ZlcmNfZmFpbD1ubzs7CisgICAgICAqKSBhY19wcm9nX3ZlcnNpb249IiRhY19wcm9nX3ZlcnNpb24sIGJhZCI7IGFjX3ZlcmNfZmFpbD15ZXM7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskYWNfcHJvZ192ZXJzaW9uXSkKKyAgZmkKKyAgaWYgdGVzdCAkYWNfdmVyY19mYWlsID0geWVzOyB0aGVuCisgICAgSU5UTEJJU09OPToKKyAgZmkKK10pCisKKworZG5sIGd0X0NIRUNLX0RFQ0woRlVOQywgSU5DTFVERVMpCitkbmwgQ2hlY2sgd2hldGhlciBhIGZ1bmN0aW9uIGlzIGRlY2xhcmVkLgorQUNfREVGVU4oW2d0X0NIRUNLX0RFQ0xdLAorWworICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkMSBpcyBkZWNsYXJlZF0sIGFjX2N2X2hhdmVfZGVjbF8kMSwKKyAgICBbQUNfVFJZX0NPTVBJTEUoWyQyXSwgWworI2lmbmRlZiAkMQorICBjaGFyICpwID0gKGNoYXIgKikgJDE7CisjZW5kaWYKK10sIGFjX2N2X2hhdmVfZGVjbF8kMT15ZXMsIGFjX2N2X2hhdmVfZGVjbF8kMT1ubyldKQorICBpZiB0ZXN0ICRhY19jdl9oYXZlX2RlY2xfJDEgPSB5ZXM7IHRoZW4KKyAgICBndF92YWx1ZT0xCisgIGVsc2UKKyAgICBndF92YWx1ZT0wCisgIGZpCisgIEFDX0RFRklORV9VTlFVT1RFRChbSEFWRV9ERUNMX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgWyRndF92YWx1ZV0sCisgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgJDEnLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuXSkKK10pCisKKworZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVF9WRVJTSU9OKFtnZXR0ZXh0LXZlcnNpb25dKQorQUNfREVGVU4oW0FNX0dOVV9HRVRURVhUX1ZFUlNJT05dLCBbXSkKKyMgZ2xpYmMyMS5tNCBzZXJpYWwgMiAoZmlsZXV0aWxzLTQuMS4zLCBnZXR0ZXh0LTAuMTAuNDApCitkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGVzdCBmb3IgdGhlIEdOVSBDIExpYnJhcnksIHZlcnNpb24gMi4xIG9yIG5ld2VyLgorIyBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW2ptX0dMSUJDMjFdLAorICBbCisgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnkgMi4xIG9yIG5ld2VyLAorICAgICAgYWNfY3ZfZ251X2xpYnJhcnlfMl8xLAorICAgICAgW0FDX0VHUkVQX0NQUChbTHVja3kgR05VIHVzZXJdLAorCVsKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmZGVmIF9fR05VX0xJQlJBUllfXworICNpZiAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpIHx8IChfX0dMSUJDX18gPiAyKQorICBMdWNreSBHTlUgdXNlcgorICNlbmRpZgorI2VuZGlmCisJXSwKKwlhY19jdl9nbnVfbGlicmFyeV8yXzE9eWVzLAorCWFjX2N2X2dudV9saWJyYXJ5XzJfMT1ubykKKyAgICAgIF0KKyAgICApCisgICAgQUNfU1VCU1QoR0xJQkMyMSkKKyAgICBHTElCQzIxPSIkYWNfY3ZfZ251X2xpYnJhcnlfMl8xIgorICBdCispCisjIGljb252Lm00IHNlcmlhbCBBTTQgKGdldHRleHQtMC4xMS4zKQorZG5sIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK0FDX0RFRlVOKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0sCitbCisgIGRubCBQcmVyZXF1aXNpdGVzIG9mIEFDX0xJQl9MSU5LRkxBR1NfQk9EWS4KKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKyAgQUNfUkVRVUlSRShbQUNfTElCX1JQQVRIXSkKKworICBkbmwgU2VhcmNoIGZvciBsaWJpY29udiBhbmQgZGVmaW5lIExJQklDT05WLCBMVExJQklDT05WIGFuZCBJTkNJQ09OVgorICBkbmwgYWNjb3JkaW5nbHkuCisgIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShbaWNvbnZdKQorXSkKKworQUNfREVGVU4oW0FNX0lDT05WX0xJTktdLAorWworICBkbmwgU29tZSBzeXN0ZW1zIGhhdmUgaWNvbnYgaW4gbGliYywgc29tZSBoYXZlIGl0IGluIGxpYmljb252IChPU0YvMSBhbmQKKyAgZG5sIHRob3NlIHdpdGggdGhlIHN0YW5kYWxvbmUgcG9ydGFibGUgR05VIGxpYmljb252IGluc3RhbGxlZCkuCisKKyAgZG5sIFNlYXJjaCBmb3IgbGliaWNvbnYgYW5kIGRlZmluZSBMSUJJQ09OViwgTFRMSUJJQ09OViBhbmQgSU5DSUNPTlYKKyAgZG5sIGFjY29yZGluZ2x5LgorICBBQ19SRVFVSVJFKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0pCisKKyAgZG5sIEFkZCAkSU5DSUNPTlYgdG8gQ1BQRkxBR1MgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyBjaGVja3MsCisgIGRubCBiZWNhdXNlIGlmIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWQgbGliaWNvbnYgYW5kIG5vdCBkaXNhYmxlZCBpdHMgdXNlCisgIGRubCB2aWEgLS13aXRob3V0LWxpYmljb252LXByZWZpeCwgaGUgd2FudHMgdG8gdXNlIGl0LiBUaGUgZmlyc3QKKyAgZG5sIEFDX1RSWV9MSU5LIHdpbGwgdGhlbiBmYWlsLCB0aGUgc2Vjb25kIEFDX1RSWV9MSU5LIHdpbGwgc3VjY2VlZC4KKyAgYW1fc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICBBQ19MSUJfQVBQRU5EVE9WQVIoW0NQUEZMQUdTXSwgWyRJTkNJQ09OVl0pCisKKyAgQUNfQ0FDSEVfQ0hFQ0soZm9yIGljb252LCBhbV9jdl9mdW5jX2ljb252LCBbCisgICAgYW1fY3ZfZnVuY19pY29udj0ibm8sIGNvbnNpZGVyIGluc3RhbGxpbmcgR05VIGxpYmljb252IgorICAgIGFtX2N2X2xpYl9pY29udj1ubworICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aWNvbnYuaD5dLAorICAgICAgW2ljb252X3QgY2QgPSBpY29udl9vcGVuKCIiLCIiKTsKKyAgICAgICBpY29udihjZCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICBpY29udl9jbG9zZShjZCk7XSwKKyAgICAgIGFtX2N2X2Z1bmNfaWNvbnY9eWVzKQorICAgIGlmIHRlc3QgIiRhbV9jdl9mdW5jX2ljb252IiAhPSB5ZXM7IHRoZW4KKyAgICAgIGFtX3NhdmVfTElCUz0iJExJQlMiCisgICAgICBMSUJTPSIkTElCUyAkTElCSUNPTlYiCisgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+XSwKKyAgICAgICAgW2ljb252X3QgY2QgPSBpY29udl9vcGVuKCIiLCIiKTsKKyAgICAgICAgIGljb252KGNkLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgaWNvbnZfY2xvc2UoY2QpO10sCisgICAgICAgIGFtX2N2X2xpYl9pY29udj15ZXMKKyAgICAgICAgYW1fY3ZfZnVuY19pY29udj15ZXMpCisgICAgICBMSUJTPSIkYW1fc2F2ZV9MSUJTIgorICAgIGZpCisgIF0pCisgIGlmIHRlc3QgIiRhbV9jdl9mdW5jX2ljb252IiA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0lDT05WLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpY29udigpIGZ1bmN0aW9uLl0pCisgIGZpCisgIGlmIHRlc3QgIiRhbV9jdl9saWJfaWNvbnYiID0geWVzOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gbGluayB3aXRoIGxpYmljb252XSkKKyAgICBBQ19NU0dfUkVTVUxUKFskTElCSUNPTlZdKQorICBlbHNlCisgICAgZG5sIElmICRMSUJJQ09OViBkaWRuJ3QgbGVhZCB0byBhIHVzYWJsZSBsaWJyYXJ5LCB3ZSBkb24ndCBuZWVkICRJTkNJQ09OVgorICAgIGRubCBlaXRoZXIuCisgICAgQ1BQRkxBR1M9IiRhbV9zYXZlX0NQUEZMQUdTIgorICAgIExJQklDT05WPQorICAgIExUTElCSUNPTlY9CisgIGZpCisgIEFDX1NVQlNUKExJQklDT05WKQorICBBQ19TVUJTVChMVExJQklDT05WKQorXSkKKworQUNfREVGVU4oW0FNX0lDT05WXSwKK1sKKyAgQU1fSUNPTlZfTElOSworICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpY29udiBkZWNsYXJhdGlvbl0pCisgICAgQUNfQ0FDSEVfVkFMKGFtX2N2X3Byb3RvX2ljb252LCBbCisgICAgICBBQ19UUllfQ09NUElMRShbCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aWNvbnYuaD4KK2V4dGVybgorI2lmZGVmIF9fY3BsdXNwbHVzCisiQyIKKyNlbmRpZgorI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitzaXplX3QgaWNvbnYgKGljb252X3QgY2QsIGNoYXIgKiAqaW5idWYsIHNpemVfdCAqaW5ieXRlc2xlZnQsIGNoYXIgKiAqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCk7CisjZWxzZQorc2l6ZV90IGljb252KCk7CisjZW5kaWYKK10sIFtdLCBhbV9jdl9wcm90b19pY29udl9hcmcxPSIiLCBhbV9jdl9wcm90b19pY29udl9hcmcxPSJjb25zdCIpCisgICAgICBhbV9jdl9wcm90b19pY29udj0iZXh0ZXJuIHNpemVfdCBpY29udiAoaWNvbnZfdCBjZCwgJGFtX2N2X3Byb3RvX2ljb252X2FyZzEgY2hhciAqICppbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwgY2hhciAqICpvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KTsiXSkKKyAgICBhbV9jdl9wcm90b19pY29udj1gZWNobyAiWyRdYW1fY3ZfcHJvdG9faWNvbnYiIHwgdHIgLXMgJyAnIHwgc2VkIC1lICdzLyggLygvJ2AKKyAgICBBQ19NU0dfUkVTVUxUKFskXXthY190Oi0KKyAgICAgICAgIH1bJF1hbV9jdl9wcm90b19pY29udikKKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoSUNPTlZfQ09OU1QsICRhbV9jdl9wcm90b19pY29udl9hcmcxLAorICAgICAgW0RlZmluZSBhcyBjb25zdCBpZiB0aGUgZGVjbGFyYXRpb24gb2YgaWNvbnYoKSBuZWVkcyBjb25zdC5dKQorICBmaQorXSkKKyMgaW50ZGl2MC5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjExLjMpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK0FDX0RFRlVOKFtndF9JTlRESVYwXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKworICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIFNJR0ZQRV0sCisgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGUsCisgICAgWworICAgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkCisjaWZkZWYgX19jcGx1c3BsdXMKK3NpZ2ZwZV9oYW5kbGVyIChpbnQgc2lnKQorI2Vsc2UKK3NpZ2ZwZV9oYW5kbGVyIChzaWcpIGludCBzaWc7CisjZW5kaWYKK3sKKyAgLyogRXhpdCB3aXRoIGNvZGUgMCBpZiBTSUdGUEUsIHdpdGggY29kZSAxIGlmIGFueSBvdGhlciBzaWduYWwuICAqLworICBleGl0IChzaWcgIT0gU0lHRlBFKTsKK30KKworaW50IHggPSAxOworaW50IHkgPSAwOworaW50IHo7CitpbnQgbmFuOworCitpbnQgbWFpbiAoKQoreworICBzaWduYWwgKFNJR0ZQRSwgc2lnZnBlX2hhbmRsZXIpOworLyogSVJJWCBhbmQgQUlYICh3aGVuICJ4bGMgLXFjaGVjayIgaXMgdXNlZCkgeWllbGQgc2lnbmFsIFNJR1RSQVAuICAqLworI2lmIChkZWZpbmVkIChfX3NnaSkgfHwgZGVmaW5lZCAoX0FJWCkpICYmIGRlZmluZWQgKFNJR1RSQVApCisgIHNpZ25hbCAoU0lHVFJBUCwgc2lnZnBlX2hhbmRsZXIpOworI2VuZGlmCisvKiBMaW51eC9TUEFSQyB5aWVsZHMgc2lnbmFsIFNJR0lMTC4gICovCisjaWYgZGVmaW5lZCAoX19zcGFyY19fKSAmJiBkZWZpbmVkIChfX2xpbnV4X18pCisgIHNpZ25hbCAoU0lHSUxMLCBzaWdmcGVfaGFuZGxlcik7CisjZW5kaWYKKworICB6ID0geCAvIHk7CisgIG5hbiA9IHkgLyB5OworICBleGl0ICgxKTsKK30KK10sIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPXllcywgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9bm8sCisgICAgICAgIFsKKyAgICAgICAgICAjIEd1ZXNzIGJhc2VkIG9uIHRoZSBDUFUuCisgICAgICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgICAgICAgYWxwaGEqIHwgaVszNDU2N104NiB8IG02OGsgfCBzMzkwKikKKyAgICAgICAgICAgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9Imd1ZXNzaW5nIHllcyI7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9Imd1ZXNzaW5nIG5vIjs7CisgICAgICAgICAgZXNhYworICAgICAgICBdKQorICAgIF0pCisgIGNhc2UgIiRndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZSIgaW4KKyAgICAqeWVzKSB2YWx1ZT0xOzsKKyAgICAqKSB2YWx1ZT0wOzsKKyAgZXNhYworICBBQ19ERUZJTkVfVU5RVU9URUQoSU5URElWMF9SQUlTRVNfU0lHRlBFLCAkdmFsdWUsCisgICAgW0RlZmluZSBpZiBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHNpZ25hbCBTSUdGUEUuXSkKK10pCisjIGludG1heC5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCitkbmwgVGVzdCB3aGV0aGVyIHRoZSBzeXN0ZW0gaGFzIHRoZSAnaW50bWF4X3QnIHR5cGUsIGJ1dCBkb24ndCBhdHRlbXB0IHRvCitkbmwgZmluZCBhIHJlcGxhY2VtZW50IGlmIGl0IGlzIGxhY2tpbmcuCisKK0FDX0RFRlVOKFtndF9UWVBFX0lOVE1BWF9UXSwKK1sKKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX0lOVFRZUEVTX0hdKQorICBBQ19SRVFVSVJFKFtqbV9BQ19IRUFERVJfU1RESU5UX0hdKQorICBBQ19DQUNIRV9DSEVDSyhmb3IgaW50bWF4X3QsIGd0X2N2X2NfaW50bWF4X3QsCisgICAgW0FDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxzdGRkZWYuaD4gCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVgKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVgKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCitdLCBbaW50bWF4X3QgeCA9IC0xO10sIGd0X2N2X2NfaW50bWF4X3Q9eWVzLCBndF9jdl9jX2ludG1heF90PW5vKV0pCisgIGlmIHRlc3QgJGd0X2N2X2NfaW50bWF4X3QgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9JTlRNQVhfVCwgMSwKKyAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdpbnRtYXhfdCcgdHlwZSBpbiA8c3RkaW50Lmg+IG9yIDxpbnR0eXBlcy5oPi5dKQorICBmaQorXSkKKyMgaW50dHlwZXMubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMS40KQorZG5sIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKworIyBEZWZpbmUgSEFWRV9JTlRUWVBFU19IIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMgYW5kIGRvZXNuJ3QgY2xhc2ggd2l0aAorIyA8c3lzL3R5cGVzLmg+LgorCitBQ19ERUZVTihbZ3RfSEVBREVSX0lOVFRZUEVTX0hdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIGludHR5cGVzLmhdLCBndF9jdl9oZWFkZXJfaW50dHlwZXNfaCwKKyAgWworICAgIEFDX1RSWV9DT01QSUxFKAorICAgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPl0sCisgICAgICBbXSwgZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2g9eWVzLCBndF9jdl9oZWFkZXJfaW50dHlwZXNfaD1ubykKKyAgXSkKKyAgaWYgdGVzdCAkZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9JTlRUWVBFU19ILCAxLAorICAgICAgW0RlZmluZSBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPi5dKQorICBmaQorXSkKKyMgaW50dHlwZXNfaC5tNCBzZXJpYWwgNSAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKworIyBEZWZpbmUgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWCBpZiA8aW50dHlwZXMuaD4gZXhpc3RzLAorIyBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPiwgYW5kIGRlY2xhcmVzIHVpbnRtYXhfdC4KKworQUNfREVGVU4oW2ptX0FDX0hFQURFUl9JTlRUWVBFU19IXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBpbnR0eXBlcy5oXSwgam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2gsCisgIFtBQ19UUllfQ09NUElMRSgKKyAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+XSwKKyAgICBbdWludG1heF90IGkgPSAodWludG1heF90KSAtMTtdLAorICAgIGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oPXllcywKKyAgICBqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaD1ubyldKQorICBpZiB0ZXN0ICRqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaCA9IHllczsgdGhlbgorICAgIEFDX0RFRklORV9VTlFVT1RFRChIQVZFX0lOVFRZUEVTX0hfV0lUSF9VSU5UTUFYLCAxLAorICAgICAgW0RlZmluZSBpZiA8aW50dHlwZXMuaD4gZXhpc3RzLCBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPiwKKyAgICAgICBhbmQgZGVjbGFyZXMgdWludG1heF90LiBdKQorICBmaQorXSkKKyMgaW50dHlwZXMtcHJpLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTEuNCkKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorCisjIERlZmluZSBQUklfTUFDUk9TX0JST0tFTiBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkZWZpbmVzIHRoZSBQUkkqCisjIG1hY3JvcyB0byBub24tc3RyaW5nIHZhbHVlcy4gIFRoaXMgaXMgdGhlIGNhc2Ugb24gQUlYIDQuMy4zLgorCitBQ19ERUZVTihbZ3RfSU5UVFlQRVNfUFJJXSwKK1sKKyAgQUNfUkVRVUlSRShbZ3RfSEVBREVSX0lOVFRZUEVTX0hdKQorICBpZiB0ZXN0ICRndF9jdl9oZWFkZXJfaW50dHlwZXNfaCA9IHllczsgdGhlbgorICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBpbnR0eXBlcy5oIFBSSXhOTiBtYWNyb3MgYXJlIGJyb2tlbl0sCisgICAgICBndF9jdl9pbnR0eXBlc19wcmlfYnJva2VuLAorICAgICAgWworICAgICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWZkZWYgUFJJZDMyCitjaGFyICpwID0gUFJJZDMyOworI2VuZGlmCitdLCBbXSwgZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbj1ubywgZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbj15ZXMpCisgICAgICBdKQorICBmaQorICBpZiB0ZXN0ICIkZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoUFJJX01BQ1JPU19CUk9LRU4sIDEsCisgICAgICBbRGVmaW5lIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMgYW5kIGRlZmluZXMgdW51c2FibGUgUFJJKiBtYWNyb3MuXSkKKyAgZmkKK10pCisjIGlzYy1wb3NpeC5tNCBzZXJpYWwgMiAoZ2V0dGV4dC0wLjExLjIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGhpcyBmaWxlIGlzIG5vdCBuZWVkZWQgd2l0aCBhdXRvY29uZi0yLjUzIGFuZCBuZXdlci4gIFJlbW92ZSBpdCBpbiAyMDA1LgorCisjIFRoaXMgdGVzdCByZXBsYWNlcyB0aGUgb25lIGluIGF1dG9jb25mLgorIyBDdXJyZW50bHkgdGhpcyBtYWNybyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhdXRvY29uZiBtYWNybworIyBiZWNhdXNlIGdldHRleHQncyBnZXR0ZXh0Lm00IChkaXN0cmlidXRlZCBpbiB0aGUgYXV0b21ha2UgcGFja2FnZSkKKyMgc3RpbGwgdXNlcyBpdC4gIE90aGVyd2lzZSwgdGhlIHVzZSBpbiBnZXR0ZXh0Lm00IG1ha2VzIGF1dG9oZWFkZXIKKyMgZ2l2ZSB0aGVzZSBkaWFnbm9zdGljczoKKyMgICBjb25maWd1cmUuaW46NTU2OiBBQ19UUllfQ09NUElMRSB3YXMgY2FsbGVkIGJlZm9yZSBBQ19JU0NfUE9TSVgKKyMgICBjb25maWd1cmUuaW46NTU2OiBBQ19UUllfUlVOIHdhcyBjYWxsZWQgYmVmb3JlIEFDX0lTQ19QT1NJWAorCit1bmRlZmluZShbQUNfSVNDX1BPU0lYXSkKKworQUNfREVGVU4oW0FDX0lTQ19QT1NJWF0sCisgIFsKKyAgICBkbmwgVGhpcyB0ZXN0IHJlcGxhY2VzIHRoZSBvYnNvbGVzY2VudCBBQ19JU0NfUE9TSVgga2x1ZGdlLgorICAgIEFDX0NIRUNLX0xJQihjcG9zaXgsIHN0cmVycm9yLCBbTElCUz0iJExJQlMgLWxjcG9zaXgiXSkKKyAgXQorKQorIyBsY21lc3NhZ2UubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMS4zKQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisKKyMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KKworQUNfREVGVU4oW0FNX0xDX01FU1NBR0VTXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKyAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKKyAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKKyAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCisgICAgICBbRGVmaW5lIGlmIHlvdXIgPGxvY2FsZS5oPiBmaWxlIGRlZmluZXMgTENfTUVTU0FHRVMuXSkKKyAgZmkKK10pCisjIGxpYi1sZC5tNCBzZXJpYWwgMyAoZ2V0dGV4dC0wLjEzKQorZG5sIENvcHlyaWdodCAoQykgMTk5Ni0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgU3Vicm91dGluZXMgb2YgbGlidG9vbC5tNCwKK2RubCB3aXRoIHJlcGxhY2VtZW50cyBzL0FDXy9BQ19MSUIvIGFuZCBzL2x0X2N2L2FjbF9jdi8gdG8gYXZvaWQgY29sbGlzaW9uCitkbmwgd2l0aCBsaWJ0b29sLm00LgorCitkbmwgRnJvbSBsaWJ0b29sLTEuNC4gU2V0cyB0aGUgdmFyaWFibGUgd2l0aF9nbnVfbGQgdG8geWVzIG9yIG5vLgorQUNfREVGVU4oW0FDX0xJQl9QUk9HX0xEX0dOVV0sCitbQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNsX2N2X3Byb2dfZ251X2xkLAorWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGFjbF9jdl9wcm9nX2dudV9sZD15ZXMgOzsKKyopCisgIGFjbF9jdl9wcm9nX2dudV9sZD1ubyA7OworZXNhY10pCit3aXRoX2dudV9sZD0kYWNsX2N2X3Byb2dfZ251X2xkCitdKQorCitkbmwgRnJvbSBsaWJ0b29sLTEuNC4gU2V0cyB0aGUgdmFyaWFibGUgTEQuCitBQ19ERUZVTihbQUNfTElCX1BST0dfTERdLAorW0FDX0FSR19XSVRIKGdudS1sZCwKK1sgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAordGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorIyBQcmVwYXJlIFBBVEhfU0VQQVJBVE9SLgorIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1tcXC9dKiB8IFtBLVphLXpdOltcXC9dKildCisgICAgICBbcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJ10KKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwoYWNsX2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBhY2xfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRhY2xfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsgOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZWxzZQorICBhY2xfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpXSkKK0xEPSIkYWNsX2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitBQ19MSUJfUFJPR19MRF9HTlUKK10pCisjIGxpYi1saW5rLm00IHNlcmlhbCA0IChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworZG5sIEFDX0xJQl9MSU5LRkxBR1MobmFtZSBbLCBkZXBlbmRlbmNpZXNdKSBzZWFyY2hlcyBmb3IgbGlibmFtZSBhbmQKK2RubCB0aGUgbGlicmFyaWVzIGNvcnJlc3BvbmRpbmcgdG8gZXhwbGljaXQgYW5kIGltcGxpY2l0IGRlcGVuZGVuY2llcy4KK2RubCBTZXRzIGFuZCBBQ19TVUJTVHMgdGhlIExJQiR7TkFNRX0gYW5kIExUTElCJHtOQU1FfSB2YXJpYWJsZXMgYW5kCitkbmwgYXVnbWVudHMgdGhlIENQUEZMQUdTIHZhcmlhYmxlLgorQUNfREVGVU4oW0FDX0xJQl9MSU5LRkxBR1NdLAorWworICBBQ19SRVFVSVJFKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdKQorICBBQ19SRVFVSVJFKFtBQ19MSUJfUlBBVEhdKQorICBkZWZpbmUoW05hbWVdLFt0cmFuc2xpdChbJDFdLFsuLy1dLCBbX19fXSldKQorICBkZWZpbmUoW05BTUVdLFt0cmFuc2xpdChbJDFdLFthYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fXSldKQorICBBQ19DQUNIRV9DSEVDSyhbaG93IHRvIGxpbmsgd2l0aCBsaWJbXSQxXSwgW2FjX2N2X2xpYltdTmFtZVtdX2xpYnNdLCBbCisgICAgQUNfTElCX0xJTktGTEFHU19CT0RZKFskMV0sIFskMl0pCisgICAgYWNfY3ZfbGliW11OYW1lW11fbGlicz0iJExJQltdTkFNRSIKKyAgICBhY19jdl9saWJbXU5hbWVbXV9sdGxpYnM9IiRMVExJQltdTkFNRSIKKyAgICBhY19jdl9saWJbXU5hbWVbXV9jcHBmbGFncz0iJElOQ1tdTkFNRSIKKyAgXSkKKyAgTElCW11OQU1FPSIkYWNfY3ZfbGliW11OYW1lW11fbGlicyIKKyAgTFRMSUJbXU5BTUU9IiRhY19jdl9saWJbXU5hbWVbXV9sdGxpYnMiCisgIElOQ1tdTkFNRT0iJGFjX2N2X2xpYltdTmFtZVtdX2NwcGZsYWdzIgorICBBQ19MSUJfQVBQRU5EVE9WQVIoW0NQUEZMQUdTXSwgWyRJTkNdTkFNRSkKKyAgQUNfU1VCU1QoW0xJQl1OQU1FKQorICBBQ19TVUJTVChbTFRMSUJdTkFNRSkKKyAgZG5sIEFsc28gc2V0IEhBVkVfTElCW11OQU1FIHNvIHRoYXQgQUNfTElCX0hBVkVfTElOS0ZMQUdTIGNhbiByZXVzZSB0aGUKKyAgZG5sIHJlc3VsdHMgb2YgdGhpcyBzZWFyY2ggd2hlbiB0aGlzIGxpYnJhcnkgYXBwZWFycyBhcyBhIGRlcGVuZGVuY3kuCisgIEhBVkVfTElCW11OQU1FPXllcworICB1bmRlZmluZShbTmFtZV0pCisgIHVuZGVmaW5lKFtOQU1FXSkKK10pCisKK2RubCBBQ19MSUJfSEFWRV9MSU5LRkxBR1MobmFtZSwgZGVwZW5kZW5jaWVzLCBpbmNsdWRlcywgdGVzdGNvZGUpCitkbmwgc2VhcmNoZXMgZm9yIGxpYm5hbWUgYW5kIHRoZSBsaWJyYXJpZXMgY29ycmVzcG9uZGluZyB0byBleHBsaWNpdCBhbmQKK2RubCBpbXBsaWNpdCBkZXBlbmRlbmNpZXMsIHRvZ2V0aGVyIHdpdGggdGhlIHNwZWNpZmllZCBpbmNsdWRlIGZpbGVzIGFuZAorZG5sIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgYW5kIGxpbmsgdGhlIHNwZWNpZmllZCB0ZXN0Y29kZS4gSWYgZm91bmQsIGl0Citkbmwgc2V0cyBhbmQgQUNfU1VCU1RzIEhBVkVfTElCJHtOQU1FfT15ZXMgYW5kIHRoZSBMSUIke05BTUV9IGFuZAorZG5sIExUTElCJHtOQU1FfSB2YXJpYWJsZXMgYW5kIGF1Z21lbnRzIHRoZSBDUFBGTEFHUyB2YXJpYWJsZSwgYW5kCitkbmwgI2RlZmluZXMgSEFWRV9MSUIke05BTUV9IHRvIDEuIE90aGVyd2lzZSwgaXQgc2V0cyBhbmQgQUNfU1VCU1RzCitkbmwgSEFWRV9MSUIke05BTUV9PW5vIGFuZCBMSUIke05BTUV9IGFuZCBMVExJQiR7TkFNRX0gdG8gZW1wdHkuCitBQ19ERUZVTihbQUNfTElCX0hBVkVfTElOS0ZMQUdTXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKyAgQUNfUkVRVUlSRShbQUNfTElCX1JQQVRIXSkKKyAgZGVmaW5lKFtOYW1lXSxbdHJhbnNsaXQoWyQxXSxbLi8tXSwgW19fX10pXSkKKyAgZGVmaW5lKFtOQU1FXSxbdHJhbnNsaXQoWyQxXSxbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX10pXSkKKworICBkbmwgU2VhcmNoIGZvciBsaWJbXU5hbWUgYW5kIGRlZmluZSBMSUJbXU5BTUUsIExUTElCW11OQU1FIGFuZCBJTkNbXU5BTUUKKyAgZG5sIGFjY29yZGluZ2x5LgorICBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoWyQxXSwgWyQyXSkKKworICBkbmwgQWRkICRJTkNbXU5BTUUgdG8gQ1BQRkxBR1MgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyBjaGVja3MsCisgIGRubCBiZWNhdXNlIGlmIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWQgbGliW11OYW1lIGFuZCBub3QgZGlzYWJsZWQgaXRzIHVzZQorICBkbmwgdmlhIC0td2l0aG91dC1saWJbXU5hbWUtcHJlZml4LCBoZSB3YW50cyB0byB1c2UgaXQuCisgIGFjX3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgQUNfTElCX0FQUEVORFRPVkFSKFtDUFBGTEFHU10sIFskSU5DXU5BTUUpCisKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsaWJbXSQxXSwgW2FjX2N2X2xpYltdTmFtZV0sIFsKKyAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRMSUJTICRMSUJbXU5BTUUiCisgICAgQUNfVFJZX0xJTksoWyQzXSwgWyQ0XSwgW2FjX2N2X2xpYltdTmFtZT15ZXNdLCBbYWNfY3ZfbGliW11OYW1lPW5vXSkKKyAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICBdKQorICBpZiB0ZXN0ICIkYWNfY3ZfbGliW11OYW1lIiA9IHllczsgdGhlbgorICAgIEhBVkVfTElCW11OQU1FPXllcworICAgIEFDX0RFRklORShbSEFWRV9MSUJdTkFNRSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJDEgbGlicmFyeS5dKQorICAgIEFDX01TR19DSEVDS0lORyhbaG93IHRvIGxpbmsgd2l0aCBsaWJbXSQxXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskTElCW11OQU1FXSkKKyAgZWxzZQorICAgIEhBVkVfTElCW11OQU1FPW5vCisgICAgZG5sIElmICRMSUJbXU5BTUUgZGlkbid0IGxlYWQgdG8gYSB1c2FibGUgbGlicmFyeSwgd2UgZG9uJ3QgbmVlZAorICAgIGRubCAkSU5DW11OQU1FIGVpdGhlci4KKyAgICBDUFBGTEFHUz0iJGFjX3NhdmVfQ1BQRkxBR1MiCisgICAgTElCW11OQU1FPQorICAgIExUTElCW11OQU1FPQorICBmaQorICBBQ19TVUJTVChbSEFWRV9MSUJdTkFNRSkKKyAgQUNfU1VCU1QoW0xJQl1OQU1FKQorICBBQ19TVUJTVChbTFRMSUJdTkFNRSkKKyAgdW5kZWZpbmUoW05hbWVdKQorICB1bmRlZmluZShbTkFNRV0pCitdKQorCitkbmwgRGV0ZXJtaW5lIHRoZSBwbGF0Zm9ybSBkZXBlbmRlbnQgcGFyYW1ldGVycyBuZWVkZWQgdG8gdXNlIHJwYXRoOgorZG5sIGxpYmV4dCwgc2hsaWJleHQsIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsCitkbmwgaGFyZGNvZGVfZGlyZWN0LCBoYXJkY29kZV9taW51c19MLgorQUNfREVGVU4oW0FDX0xJQl9SUEFUSF0sCitbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKSAgICAgICAgICAgICAgICBkbmwgd2UgdXNlICRDQywgJEdDQywgJExERkxBR1MKKyAgQUNfUkVRVUlSRShbQUNfTElCX1BST0dfTERdKSAgICAgICAgICAgIGRubCB3ZSB1c2UgJExELCAkd2l0aF9nbnVfbGQKKyAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKSAgICAgICAgIGRubCB3ZSB1c2UgJGhvc3QKKyAgQUNfUkVRVUlSRShbQUNfQ09ORklHX0FVWF9ESVJfREVGQVVMVF0pIGRubCB3ZSB1c2UgJGFjX2F1eF9kaXIKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzaGFyZWQgbGlicmFyeSBydW4gcGF0aCBvcmlnaW5dLCBhY2xfY3ZfcnBhdGgsIFsKKyAgICBDQz0iJENDIiBHQ0M9IiRHQ0MiIExERkxBR1M9IiRMREZMQUdTIiBMRD0iJExEIiB3aXRoX2dudV9sZD0iJHdpdGhfZ251X2xkIiBcCisgICAgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gIiRhY19hdXhfZGlyL2NvbmZpZy5ycGF0aCIgIiRob3N0IiA+IGNvbmZ0ZXN0LnNoCisgICAgLiAuL2NvbmZ0ZXN0LnNoCisgICAgcm0gLWYgLi9jb25mdGVzdC5zaAorICAgIGFjbF9jdl9ycGF0aD1kb25lCisgIF0pCisgIHdsPSIkYWNsX2N2X3dsIgorICBsaWJleHQ9IiRhY2xfY3ZfbGliZXh0IgorICBzaGxpYmV4dD0iJGFjbF9jdl9zaGxpYmV4dCIKKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGFjbF9jdl9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIkYWNsX2N2X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiCisgIGhhcmRjb2RlX2RpcmVjdD0iJGFjbF9jdl9oYXJkY29kZV9kaXJlY3QiCisgIGhhcmRjb2RlX21pbnVzX0w9IiRhY2xfY3ZfaGFyZGNvZGVfbWludXNfTCIKKyAgZG5sIERldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIHJwYXRoIGhhbmRsaW5nIGF0IGFsbC4KKyAgQUNfQVJHX0VOQUJMRShycGF0aCwKKyAgICBbICAtLWRpc2FibGUtcnBhdGggICAgICAgICBkbyBub3QgaGFyZGNvZGUgcnVudGltZSBsaWJyYXJ5IHBhdGhzXSwKKyAgICA6LCBlbmFibGVfcnBhdGg9eWVzKQorXSkKKworZG5sIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShuYW1lIFssIGRlcGVuZGVuY2llc10pIHNlYXJjaGVzIGZvciBsaWJuYW1lIGFuZAorZG5sIHRoZSBsaWJyYXJpZXMgY29ycmVzcG9uZGluZyB0byBleHBsaWNpdCBhbmQgaW1wbGljaXQgZGVwZW5kZW5jaWVzLgorZG5sIFNldHMgdGhlIExJQiR7TkFNRX0sIExUTElCJHtOQU1FfSBhbmQgSU5DJHtOQU1FfSB2YXJpYWJsZXMuCitBQ19ERUZVTihbQUNfTElCX0xJTktGTEFHU19CT0RZXSwKK1sKKyAgZGVmaW5lKFtOQU1FXSxbdHJhbnNsaXQoWyQxXSxbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX10pXSkKKyAgZG5sIEJ5IGRlZmF1bHQsIGxvb2sgaW4gJGluY2x1ZGVkaXIgYW5kICRsaWJkaXIuCisgIHVzZV9hZGRpdGlvbmFsPXllcworICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoWworICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKyAgXSkKKyAgQUNfTElCX0FSR19XSVRIKFtsaWIkMS1wcmVmaXhdLAorWyAgLS13aXRoLWxpYiQxLXByZWZpeFs9RElSXSAgc2VhcmNoIGZvciBsaWIkMSBpbiBESVIvaW5jbHVkZSBhbmQgRElSL2xpYgorICAtLXdpdGhvdXQtbGliJDEtcHJlZml4ICAgICBkb24ndCBzZWFyY2ggZm9yIGxpYiQxIGluIGluY2x1ZGVkaXIgYW5kIGxpYmRpcl0sCitbCisgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25hbD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj1cIiRpbmNsdWRlZGlyXCIKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfbGliZGlyPVwiJGxpYmRpclwiCisgICAgICAgIF0pCisgICAgICBlbHNlCisgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJHdpdGh2YWwvaW5jbHVkZSIKKyAgICAgICAgYWRkaXRpb25hbF9saWJkaXI9IiR3aXRodmFsL2xpYiIKKyAgICAgIGZpCisgICAgZmkKK10pCisgIGRubCBTZWFyY2ggdGhlIGxpYnJhcnkgYW5kIGl0cyBkZXBlbmRlbmNpZXMgaW4gJGFkZGl0aW9uYWxfbGliZGlyIGFuZAorICBkbmwgJExERkxBR1MuIFVzaW5nIGJyZWFkdGgtZmlyc3Qtc2VhY2guCisgIExJQltdTkFNRT0KKyAgTFRMSUJbXU5BTUU9CisgIElOQ1tdTkFNRT0KKyAgcnBhdGhkaXJzPQorICBsdHJwYXRoZGlycz0KKyAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPQorICBuYW1lc19uZXh0X3JvdW5kPSckMSAkMicKKyAgd2hpbGUgdGVzdCAtbiAiJG5hbWVzX25leHRfcm91bmQiOyBkbworICAgIG5hbWVzX3RoaXNfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kIgorICAgIG5hbWVzX25leHRfcm91bmQ9CisgICAgZm9yIG5hbWUgaW4gJG5hbWVzX3RoaXNfcm91bmQ7IGRvCisgICAgICBhbHJlYWR5X2hhbmRsZWQ9CisgICAgICBmb3IgbiBpbiAkbmFtZXNfYWxyZWFkeV9oYW5kbGVkOyBkbworICAgICAgICBpZiB0ZXN0ICIkbiIgPSAiJG5hbWUiOyB0aGVuCisgICAgICAgICAgYWxyZWFkeV9oYW5kbGVkPXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IC16ICIkYWxyZWFkeV9oYW5kbGVkIjsgdGhlbgorICAgICAgICBuYW1lc19hbHJlYWR5X2hhbmRsZWQ9IiRuYW1lc19hbHJlYWR5X2hhbmRsZWQgJG5hbWUiCisgICAgICAgIGRubCBTZWUgaWYgaXQgd2FzIGFscmVhZHkgbG9jYXRlZCBieSBhbiBlYXJsaWVyIEFDX0xJQl9MSU5LRkxBR1MKKyAgICAgICAgZG5sIG9yIEFDX0xJQl9IQVZFX0xJTktGTEFHUyBjYWxsLgorICAgICAgICB1cHBlcm5hbWU9YGVjaG8gIiRuYW1lIiB8IHNlZCAtZSAneXxhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLXxBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX3wnYAorICAgICAgICBldmFsIHZhbHVlPVwiXCRIQVZFX0xJQiR1cHBlcm5hbWVcIgorICAgICAgICBpZiB0ZXN0IC1uICIkdmFsdWUiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAiJHZhbHVlIiA9IHllczsgdGhlbgorICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16ICIkdmFsdWUiIHx8IExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9JHZhbHVlIgorICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTFRMSUIkdXBwZXJuYW1lXCIKKyAgICAgICAgICAgIHRlc3QgLXogIiR2YWx1ZSIgfHwgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0kdmFsdWUiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZG5sIEFuIGVhcmxpZXIgY2FsbCB0byBBQ19MSUJfSEFWRV9MSU5LRkxBR1MgaGFzIGRldGVybWluZWQKKyAgICAgICAgICAgIGRubCB0aGF0IHRoaXMgbGlicmFyeSBkb2Vzbid0IGV4aXN0LiBTbyBqdXN0IGRyb3AgaXQuCisgICAgICAgICAgICA6CisgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRubCBTZWFyY2ggdGhlIGxpYnJhcnkgbGliJG5hbWUgaW4gJGFkZGl0aW9uYWxfbGliZGlyIGFuZCAkTERGTEFHUworICAgICAgICAgIGRubCBhbmQgdGhlIGFscmVhZHkgY29uc3RydWN0ZWQgJExJQk5BTUUvJExUTElCTkFNRS4KKyAgICAgICAgICBmb3VuZF9kaXI9CisgICAgICAgICAgZm91bmRfbGE9CisgICAgICAgICAgZm91bmRfc289CisgICAgICAgICAgZm91bmRfYT0KKyAgICAgICAgICBpZiB0ZXN0ICR1c2VfYWRkaXRpb25hbCA9IHllczsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgZm91bmRfc289IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kc2hsaWJleHQiCisgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgICBmb3VuZF9hPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiID0gIlgiOyB0aGVuCisgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTFRMSUJbXU5BTUU7IGRvCisgICAgICAgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgICAgICAgIGNhc2UgIiR4IiBpbgorICAgICAgICAgICAgICAgIC1MKikKKyAgICAgICAgICAgICAgICAgIGRpcj1gZWNobyAiWCR4IiB8IHNlZCAtZSAncy9eWC1MLy8nYAorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkZGlyIgorICAgICAgICAgICAgICAgICAgICBmb3VuZF9zbz0iJGRpci9saWIkbmFtZS4kc2hsaWJleHQiCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRkaXIiCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfYT0iJGRpci9saWIkbmFtZS4kbGliZXh0IgorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgZmkKKyAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2RpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICBkbmwgRm91bmQgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorICAgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9zbyIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgIGRubCBMaW5raW5nIHdpdGggYSBzaGFyZWQgbGlicmFyeS4gV2UgYXR0ZW1wdCB0byBoYXJkY29kZSBpdHMKKyAgICAgICAgICAgICAgZG5sIGRpcmVjdG9yeSBpbnRvIHRoZSBleGVjdXRhYmxlJ3MgcnVucGF0aCwgdW5sZXNzIGl0J3MgdGhlCisgICAgICAgICAgICAgIGRubCBzdGFuZGFyZCAvdXNyL2xpYi4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgPSBubyB8fCB0ZXN0ICJYJGZvdW5kX2RpciIgPSAiWC91c3IvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgIGRubCBObyBoYXJkY29kaW5nIGlzIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRubCBVc2UgYW4gZXhwbGljaXQgb3B0aW9uIHRvIGhhcmRjb2RlIERJUiBpbnRvIHRoZSByZXN1bHRpbmcKKyAgICAgICAgICAgICAgICBkbmwgYmluYXJ5LgorICAgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgRElSIHRvIGx0cnBhdGhkaXJzLgorICAgICAgICAgICAgICAgIGRubCBUaGUgbHRycGF0aGRpcnMgd2lsbCBiZSBhcHBlbmRlZCB0byAkTFRMSUJOQU1FIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgIGZvciB4IGluICRsdHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICBsdHJwYXRoZGlycz0iJGx0cnBhdGhkaXJzICRmb3VuZF9kaXIiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBkbmwgVGhlIGhhcmRjb2RpbmcgaW50byAkTElCTkFNRSBpcyBzeXN0ZW0gZGVwZW5kZW50LgorICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgICBkbmwgVXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgZG5sIHJlc3VsdGluZyBiaW5hcnkuCisgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgJiYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZG5sIFVzZSBhbiBleHBsaWNpdCBvcHRpb24gdG8gaGFyZGNvZGUgRElSIGludG8gdGhlIHJlc3VsdGluZworICAgICAgICAgICAgICAgICAgICBkbmwgYmluYXJ5LgorICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCBESVIgdG8gcnBhdGhkaXJzLgorICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIHJwYXRoZGlycyB3aWxsIGJlIGFwcGVuZGVkIHRvICRMSUJOQU1FIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRmb3VuZF9kaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRubCBSZWx5IG9uICItTCRmb3VuZF9kaXIiLgorICAgICAgICAgICAgICAgICAgICBkbmwgQnV0IGRvbid0IGFkZCBpdCBpZiBpdCdzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBMREZMQUdTCisgICAgICAgICAgICAgICAgICAgIGRubCBvciB0aGUgYWxyZWFkeSBjb25zdHJ1Y3RlZCAkTElCTkFNRQorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMSUJbXU5BTUU7IGRvCisgICAgICAgICAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1MJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIEZJWE1FOiBOb3Qgc3VyZSB3aGV0aGVyIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgIi1MJGZvdW5kX2RpciAtbCRuYW1lIiBvciAiLUwkZm91bmRfZGlyICRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGRubCBXZSBjYW5ub3QgdXNlICRoYXJkY29kZV9ydW5wYXRoX3ZhciBhbmQgTERfUlVOX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZSwgYmVjYXVzZSB0aGlzIGRvZXNuJ3QgZml0IGluIGZsYWdzIHBhc3NlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgY29tcGlsZXIuIFNvIGdpdmUgdXAuIE5vIGhhcmRjb2RpbmcuIFRoaXMgYWZmZWN0cyBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgZG5sIHZlcnkgb2xkIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIEZJWE1FOiBOb3Qgc3VyZSB3aGV0aGVyIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgIi1MJGZvdW5kX2RpciAtbCRuYW1lIiBvciAiLUwkZm91bmRfZGlyICRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1sJG5hbWUiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfYSIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgICAgZG5sIExpbmtpbmcgd2l0aCBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9JGZvdW5kX2EiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkbmwgV2Ugc2hvdWxkbid0IGNvbWUgaGVyZSwgYnV0IGFueXdheSBpdCdzIGdvb2QgdG8gaGF2ZSBhCisgICAgICAgICAgICAgICAgZG5sIGZhbGxiYWNrLgorICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LUwkZm91bmRfZGlyIC1sJG5hbWUiCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG5sIEFzc3VtZSB0aGUgaW5jbHVkZSBmaWxlcyBhcmUgbmVhcmJ5LgorICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPQorICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2RpciIgaW4KKyAgICAgICAgICAgICAgKi9saWIgfCAqL2xpYi8pCisgICAgICAgICAgICAgICAgYmFzZWRpcj1gZWNobyAiWCRmb3VuZF9kaXIiIHwgc2VkIC1lICdzLF5YLCwnIC1lICdzLC9saWIvKiQsLCdgCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkYmFzZWRpci9pbmNsdWRlIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkSU5DTkFNRS4KKyAgICAgICAgICAgICAgZG5sIEJ1dCBkb24ndCBhZGQgaXQKKyAgICAgICAgICAgICAgZG5sICAgMS4gaWYgaXQncyB0aGUgc3RhbmRhcmQgL3Vzci9pbmNsdWRlLAorICAgICAgICAgICAgICBkbmwgICAyLiBpZiBpdCdzIC91c3IvbG9jYWwvaW5jbHVkZSBhbmQgd2UgYXJlIHVzaW5nIEdDQyBvbiBMaW51eCwKKyAgICAgICAgICAgICAgZG5sICAgMy4gaWYgaXQncyBhbHJlYWR5IHByZXNlbnQgaW4gJENQUEZMQUdTIG9yIHRoZSBhbHJlYWR5CisgICAgICAgICAgICAgIGRubCAgICAgIGNvbnN0cnVjdGVkICRJTkNOQU1FLAorICAgICAgICAgICAgICBkbmwgICA0LiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFzIGEgZGlyZWN0b3J5LgorICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgvdXNyL2luY2x1ZGUiOyB0aGVuCisgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiA9ICJYL3Vzci9sb2NhbC9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJENQUEZMQUdTICRJTkNbXU5BTUU7IGRvCisgICAgICAgICAgICAgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkSU5DTkFNRS4KKyAgICAgICAgICAgICAgICAgICAgICBJTkNbXU5BTUU9IiR7SU5DW11OQU1FfSR7SU5DW11OQU1FOisgfS1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkbmwgTG9vayBmb3IgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGZvdW5kX2xhIjsgdGhlbgorICAgICAgICAgICAgICBkbmwgUmVhZCB0aGUgLmxhIGZpbGUuIEl0IGRlZmluZXMgdGhlIHZhcmlhYmxlcworICAgICAgICAgICAgICBkbmwgZGxuYW1lLCBsaWJyYXJ5X25hbWVzLCBvbGRfbGlicmFyeSwgZGVwZW5kZW5jeV9saWJzLCBjdXJyZW50LAorICAgICAgICAgICAgICBkbmwgYWdlLCByZXZpc2lvbiwgaW5zdGFsbGVkLCBkbG9wZW4sIGRscHJlb3BlbiwgbGliZGlyLgorICAgICAgICAgICAgICBzYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2xhIiBpbgorICAgICAgICAgICAgICAgICovKiB8ICpcXCopIC4gIiRmb3VuZF9sYSIgOzsKKyAgICAgICAgICAgICAgICAqKSAuICIuLyRmb3VuZF9sYSIgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBsaWJkaXI9IiRzYXZlX2xpYmRpciIKKyAgICAgICAgICAgICAgZG5sIFdlIHVzZSBvbmx5IGRlcGVuZGVuY3lfbGlicy4KKyAgICAgICAgICAgICAgZm9yIGRlcCBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworICAgICAgICAgICAgICAgIGNhc2UgIiRkZXAiIGluCisgICAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPWBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCAkYWRkaXRpb25hbF9saWJkaXIgdG8gJExJQk5BTUUgYW5kICRMVExJQk5BTUUuCisgICAgICAgICAgICAgICAgICAgIGRubCBCdXQgZG9uJ3QgYWRkIGl0CisgICAgICAgICAgICAgICAgICAgIGRubCAgIDEuIGlmIGl0J3MgdGhlIHN0YW5kYXJkIC91c3IvbGliLAorICAgICAgICAgICAgICAgICAgICBkbmwgICAyLiBpZiBpdCdzIC91c3IvbG9jYWwvbGliIGFuZCB3ZSBhcmUgdXNpbmcgR0NDIG9uIExpbnV4LAorICAgICAgICAgICAgICAgICAgICBkbmwgICAzLiBpZiBpdCdzIGFscmVhZHkgcHJlc2VudCBpbiAkTERGTEFHUyBvciB0aGUgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICBkbmwgICAgICBjb25zdHJ1Y3RlZCAkTElCTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgZG5sICAgNC4gaWYgaXQgZG9lc24ndCBleGlzdCBhcyBhIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgIT0gIlgvdXNyL2xpYiI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgPSAiWC91c3IvbG9jYWwvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExJQltdTkFNRTsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMSUJOQU1FLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCW11OQU1FOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW2V2YWwgeD1cIiR4XCJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmwgUmVhbGx5IGFkZCAkYWRkaXRpb25hbF9saWJkaXIgdG8gJExUTElCTkFNRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1MJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgLVIqKQorICAgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1SLy8nYAorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3JwYXRoIiAhPSBubzsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgRElSIHRvIHJwYXRoZGlycy4KKyAgICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIHJwYXRoZGlycyB3aWxsIGJlIGFwcGVuZGVkIHRvICRMSUJOQU1FIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRkaXIiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgUG90ZW50aWFsbHkgYWRkIERJUiB0byBsdHJwYXRoZGlycy4KKyAgICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIGx0cnBhdGhkaXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gJExUTElCTkFNRSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgbHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAtbCopCisgICAgICAgICAgICAgICAgICAgIGRubCBIYW5kbGUgdGhpcyBpbiB0aGUgbmV4dCByb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtbC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICoubGEpCisgICAgICAgICAgICAgICAgICAgIGRubCBIYW5kbGUgdGhpcyBpbiB0aGUgbmV4dCByb3VuZC4gVGhyb3cgYXdheSB0aGUgLmxhJ3MKKyAgICAgICAgICAgICAgICAgICAgZG5sIGRpcmVjdG9yeTsgaXQgaXMgYWxyZWFkeSBjb250YWluZWQgaW4gYSBwcmVjZWRpbmcgLUwKKyAgICAgICAgICAgICAgICAgICAgZG5sIG9wdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MsXlguKi8sLCcgLWUgJ3MsXmxpYiwsJyAtZSAncyxcLmxhJCwsJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgIGRubCBNb3N0IGxpa2VseSBhbiBpbW1lZGlhdGUgbGlicmFyeSBuYW1lLgorICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRkZXAiCisgICAgICAgICAgICAgICAgICAgIExUTElCW11OQU1FPSIke0xUTElCW11OQU1FfSR7TFRMSUJbXU5BTUU6KyB9JGRlcCIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZG5sIERpZG4ndCBmaW5kIHRoZSBsaWJyYXJ5OyBhc3N1bWUgaXQgaXMgaW4gdGhlIHN5c3RlbSBkaXJlY3RvcmllcworICAgICAgICAgICAgZG5sIGtub3duIHRvIHRoZSBsaW5rZXIgYW5kIHJ1bnRpbWUgbG9hZGVyLiAoQWxsIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgIGRubCBkaXJlY3RvcmllcyBrbm93biB0byB0aGUgbGlua2VyIHNob3VsZCBhbHNvIGJlIGtub3duIHRvIHRoZQorICAgICAgICAgICAgZG5sIHJ1bnRpbWUgbG9hZGVyLCBvdGhlcndpc2UgdGhlIHN5c3RlbSBpcyBzZXZlcmVseSBtaXNjb25maWd1cmVkLikKKyAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LWwkbmFtZSIKKyAgICAgICAgICAgIExUTElCW11OQU1FPSIke0xUTElCW11OQU1FfSR7TFRMSUJbXU5BTUU6KyB9LWwkbmFtZSIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKKyAgaWYgdGVzdCAiWCRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgZG5sIFdlaXJkIHBsYXRmb3JtOiBvbmx5IHRoZSBsYXN0IC1ycGF0aCBvcHRpb24gY291bnRzLCB0aGUgdXNlciBtdXN0CisgICAgICBkbmwgcGFzcyBhbGwgcGF0aCBlbGVtZW50cyBpbiBvbmUgb3B0aW9uLiBXZSBjYW4gYXJyYW5nZSB0aGF0IGZvciBhCisgICAgICBkbmwgc2luZ2xlIGxpYnJhcnksIGJ1dCBub3Qgd2hlbiBtb3JlIHRoYW4gb25lICRMSUJOQU1FcyBhcmUgdXNlZC4KKyAgICAgIGFsbGRpcnM9CisgICAgICBmb3IgZm91bmRfZGlyIGluICRycGF0aGRpcnM7IGRvCisgICAgICAgIGFsbGRpcnM9IiR7YWxsZGlyc30ke2FsbGRpcnM6KyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yfSRmb3VuZF9kaXIiCisgICAgICBkb25lCisgICAgICBkbmwgTm90ZTogaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyB1c2VzICRsaWJkaXIgYW5kICR3bC4KKyAgICAgIGFjbF9zYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgIGxpYmRpcj0iJGFsbGRpcnMiCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmbGFnIgorICAgIGVsc2UKKyAgICAgIGRubCBUaGUgLXJwYXRoIG9wdGlvbnMgYXJlIGN1bXVsYXRpdmUuCisgICAgICBmb3IgZm91bmRfZGlyIGluICRycGF0aGRpcnM7IGRvCisgICAgICAgIGFjbF9zYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgICAgbGliZGlyPSIkZm91bmRfZGlyIgorICAgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICAgIGxpYmRpcj0iJGFjbF9zYXZlX2xpYmRpciIKKyAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZmxhZyIKKyAgICAgIGRvbmUKKyAgICBmaQorICBmaQorICBpZiB0ZXN0ICJYJGx0cnBhdGhkaXJzIiAhPSAiWCI7IHRoZW4KKyAgICBkbmwgV2hlbiB1c2luZyBsaWJ0b29sLCB0aGUgb3B0aW9uIHRoYXQgd29ya3MgZm9yIGJvdGggbGlicmFyaWVzIGFuZAorICAgIGRubCBleGVjdXRhYmxlcyBpcyAtUi4gVGhlIC1SIG9wdGlvbnMgYXJlIGN1bXVsYXRpdmUuCisgICAgZm9yIGZvdW5kX2RpciBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1SJGZvdW5kX2RpciIKKyAgICBkb25lCisgIGZpCitdKQorCitkbmwgQUNfTElCX0FQUEVORFRPVkFSKFZBUiwgQ09OVEVOVFMpIGFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIENPTlRFTlRTIHRvIFZBUiwKK2RubCB1bmxlc3MgYWxyZWFkeSBwcmVzZW50IGluIFZBUi4KK2RubCBXb3JrcyBvbmx5IGZvciBDUFBGTEFHUywgbm90IGZvciBMSUIqIHZhcmlhYmxlcyBiZWNhdXNlIHRoYXQgc29tZXRpbWVzCitkbmwgY29udGFpbnMgdHdvIG9yIHRocmVlIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHRoYXQgYmVsb25nIHRvZ2V0aGVyLgorQUNfREVGVU4oW0FDX0xJQl9BUFBFTkRUT1ZBUl0sCitbCisgIGZvciBlbGVtZW50IGluIFskMl07IGRvCisgICAgaGF2ZWl0PQorICAgIGZvciB4IGluICRbJDFdOyBkbworICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRlbGVtZW50IjsgdGhlbgorICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgWyQxXT0iJHtbJDFdfSR7WyQxXTorIH0kZWxlbWVudCIKKyAgICBmaQorICBkb25lCitdKQorIyBsaWItcHJlZml4Lm00IHNlcmlhbCAzIChnZXR0ZXh0LTAuMTMpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworZG5sIEFDX0xJQl9BUkdfV0lUSCBpcyBzeW5vbnltb3VzIHRvIEFDX0FSR19XSVRIIGluIGF1dG9jb25mLTIuMTMsIGFuZAorZG5sIHNpbWlsYXIgdG8gQUNfQVJHX1dJVEggaW4gYXV0b2NvbmYgMi41Mi4uLjIuNTcgZXhjZXB0IHRoYXQgaXMgZG9lc24ndAorZG5sIHJlcXVpcmUgZXhjZXNzaXZlIGJyYWNrZXRpbmcuCitpZmRlZihbQUNfSEVMUF9TVFJJTkddLAorW0FDX0RFRlVOKFtBQ19MSUJfQVJHX1dJVEhdLCBbQUNfQVJHX1dJVEgoWyQxXSxbWyQyXV0sWyQzXSxbJDRdKV0pXSwKK1tBQ19ERUZVTihbQUNfXVtMSUJfQVJHX1dJVEhdLCBbQUNfQVJHX1dJVEgoWyQxXSxbJDJdLFskM10sWyQ0XSldKV0pCisKK2RubCBBQ19MSUJfUFJFRklYIGFkZHMgdG8gdGhlIENQUEZMQUdTIGFuZCBMREZMQUdTIHRoZSBmbGFncyB0aGF0IGFyZSBuZWVkZWQKK2RubCB0byBhY2Nlc3MgcHJldmlvdXNseSBpbnN0YWxsZWQgbGlicmFyaWVzLiBUaGUgYmFzaWMgYXNzdW1wdGlvbiBpcyB0aGF0CitkbmwgYSB1c2VyIHdpbGwgd2FudCBwYWNrYWdlcyB0byB1c2Ugb3RoZXIgcGFja2FnZXMgaGUgcHJldmlvdXNseSBpbnN0YWxsZWQKK2RubCB3aXRoIHRoZSBzYW1lIC0tcHJlZml4IG9wdGlvbi4KK2RubCBUaGlzIG1hY3JvIGlzIG5vdCBuZWVkZWQgaWYgb25seSBBQ19MSUJfTElOS0ZMQUdTIGlzIHVzZWQgdG8gbG9jYXRlCitkbmwgbGlicmFyaWVzLCBidXQgaXMgb3RoZXJ3aXNlIHZlcnkgY29udmVuaWVudC4KK0FDX0RFRlVOKFtBQ19MSUJfUFJFRklYXSwKK1sKKyAgQUNfQkVGT1JFKFskMF0sIFtBQ19MSUJfTElOS0ZMQUdTXSkKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKyAgZG5sIEJ5IGRlZmF1bHQsIGxvb2sgaW4gJGluY2x1ZGVkaXIgYW5kICRsaWJkaXIuCisgIHVzZV9hZGRpdGlvbmFsPXllcworICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoWworICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKyAgXSkKKyAgQUNfTElCX0FSR19XSVRIKFtsaWItcHJlZml4XSwKK1sgIC0td2l0aC1saWItcHJlZml4Wz1ESVJdIHNlYXJjaCBmb3IgbGlicmFyaWVzIGluIERJUi9pbmNsdWRlIGFuZCBESVIvbGliCisgIC0td2l0aG91dC1saWItcHJlZml4ICAgIGRvbid0IHNlYXJjaCBmb3IgbGlicmFyaWVzIGluIGluY2x1ZGVkaXIgYW5kIGxpYmRpcl0sCitbCisgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25hbD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj1cIiRpbmNsdWRlZGlyXCIKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfbGliZGlyPVwiJGxpYmRpclwiCisgICAgICAgIF0pCisgICAgICBlbHNlCisgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJHdpdGh2YWwvaW5jbHVkZSIKKyAgICAgICAgYWRkaXRpb25hbF9saWJkaXI9IiR3aXRodmFsL2xpYiIKKyAgICAgIGZpCisgICAgZmkKK10pCisgIGlmIHRlc3QgJHVzZV9hZGRpdGlvbmFsID0geWVzOyB0aGVuCisgICAgZG5sIFBvdGVudGlhbGx5IGFkZCAkYWRkaXRpb25hbF9pbmNsdWRlZGlyIHRvICRDUFBGTEFHUy4KKyAgICBkbmwgQnV0IGRvbid0IGFkZCBpdAorICAgIGRubCAgIDEuIGlmIGl0J3MgdGhlIHN0YW5kYXJkIC91c3IvaW5jbHVkZSwKKyAgICBkbmwgICAyLiBpZiBpdCdzIGFscmVhZHkgcHJlc2VudCBpbiAkQ1BQRkxBR1MsCisgICAgZG5sICAgMy4gaWYgaXQncyAvdXNyL2xvY2FsL2luY2x1ZGUgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisgICAgZG5sICAgNC4gaWYgaXQgZG9lc24ndCBleGlzdCBhcyBhIGRpcmVjdG9yeS4KKyAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgvdXNyL2luY2x1ZGUiOyB0aGVuCisgICAgICBoYXZlaXQ9CisgICAgICBmb3IgeCBpbiAkQ1BQRkxBR1M7IGRvCisgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiA9ICJYL3Vzci9sb2NhbC9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9pbmNsdWRlZGlyIjsgdGhlbgorICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkQ1BQRkxBR1MuCisgICAgICAgICAgICBDUFBGTEFHUz0iJHtDUFBGTEFHU30ke0NQUEZMQUdTOisgfS1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICAgIGRubCBQb3RlbnRpYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMREZMQUdTLgorICAgIGRubCBCdXQgZG9uJ3QgYWRkIGl0CisgICAgZG5sICAgMS4gaWYgaXQncyB0aGUgc3RhbmRhcmQgL3Vzci9saWIsCisgICAgZG5sICAgMi4gaWYgaXQncyBhbHJlYWR5IHByZXNlbnQgaW4gJExERkxBR1MsCisgICAgZG5sICAgMy4gaWYgaXQncyAvdXNyL2xvY2FsL2xpYiBhbmQgd2UgYXJlIHVzaW5nIEdDQyBvbiBMaW51eCwKKyAgICBkbmwgICA0LiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFzIGEgZGlyZWN0b3J5LgorICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9saWJkaXIiICE9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICBoYXZlaXQ9CisgICAgICBmb3IgeCBpbiAkTERGTEFHUzsgZG8KKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiA9ICJYL3Vzci9sb2NhbC9saWIiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgIGRubCBSZWFsbHkgYWRkICRhZGRpdGlvbmFsX2xpYmRpciB0byAkTERGTEFHUy4KKyAgICAgICAgICAgIExERkxBR1M9IiR7TERGTEFHU30ke0xERkxBR1M6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK10pCisKK2RubCBBQ19MSUJfUFJFUEFSRV9QUkVGSVggY3JlYXRlcyB2YXJpYWJsZXMgYWNsX2ZpbmFsX3ByZWZpeCwKK2RubCBhY2xfZmluYWxfZXhlY19wcmVmaXgsIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byB3aGljaCAkcHJlZml4IGFuZAorZG5sICRleGVjX3ByZWZpeCB3aWxsIGV4cGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgorQUNfREVGVU4oW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0sCitbCisgIGRubCBVbmZvcnR1bmF0ZWx5LCBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGdldCBvbmx5IGZpbmFsbHkgZGV0ZXJtaW5lZAorICBkbmwgYXQgdGhlIGVuZCBvZiBjb25maWd1cmUuCisgIGlmIHRlc3QgIlgkcHJlZml4IiA9ICJYTk9ORSI7IHRoZW4KKyAgICBhY2xfZmluYWxfcHJlZml4PSIkYWNfZGVmYXVsdF9wcmVmaXgiCisgIGVsc2UKKyAgICBhY2xfZmluYWxfcHJlZml4PSIkcHJlZml4IgorICBmaQorICBpZiB0ZXN0ICJYJGV4ZWNfcHJlZml4IiA9ICJYTk9ORSI7IHRoZW4KKyAgICBhY2xfZmluYWxfZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKyAgZWxzZQorICAgIGFjbF9maW5hbF9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBmaQorICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGV2YWwgYWNsX2ZpbmFsX2V4ZWNfcHJlZml4PVwiJGFjbF9maW5hbF9leGVjX3ByZWZpeFwiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKK10pCisKK2RubCBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW3N0YXRlbWVudF0pIGV2YWx1YXRlcyBzdGF0ZW1lbnQsIHdpdGggdGhlCitkbmwgdmFyaWFibGVzIHByZWZpeCBhbmQgZXhlY19wcmVmaXggYm91bmQgdG8gdGhlIHZhbHVlcyB0aGV5IHdpbGwgaGF2ZQorZG5sIGF0IHRoZSBlbmQgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCitBQ19ERUZVTihbQUNfTElCX1dJVEhfRklOQUxfUFJFRklYXSwKK1sKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgJDEKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorXSkKKyMgbG9uZ2RvdWJsZS5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCitkbmwgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgJ2xvbmcgZG91YmxlJyB0eXBlLgorZG5sIFByZXJlcXVpc2l0ZTogQUNfUFJPR19DQworCitBQ19ERUZVTihbZ3RfVFlQRV9MT05HRE9VQkxFXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsb25nIGRvdWJsZV0sIGd0X2N2X2NfbG9uZ19kb3VibGUsCisgICAgW2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICAgZ3RfY3ZfY19sb25nX2RvdWJsZT15ZXMKKyAgICAgZWxzZQorICAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyAgICAgICAgIC8qIFRoZSBTdGFyZGVudCBWaXN0cmEga25vd3Mgc2l6ZW9mKGxvbmcgZG91YmxlKSwgYnV0IGRvZXMgbm90IHN1cHBvcnQgaXQuICAqLworICAgICAgICAgbG9uZyBkb3VibGUgZm9vID0gMC4wOworICAgICAgICAgLyogT24gVWx0cml4IDQuMyBjYywgbG9uZyBkb3VibGUgaXMgNCBhbmQgZG91YmxlIGlzIDguICAqLworICAgICAgICAgaW50IGFycmF5IFsyKihzaXplb2YobG9uZyBkb3VibGUpID49IHNpemVvZihkb3VibGUpKSAtIDFdOworICAgICAgICAgXSwgLAorICAgICAgICAgZ3RfY3ZfY19sb25nX2RvdWJsZT15ZXMsIGd0X2N2X2NfbG9uZ19kb3VibGU9bm8pCisgICAgIGZpXSkKKyAgaWYgdGVzdCAkZ3RfY3ZfY19sb25nX2RvdWJsZSA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0xPTkdfRE9VQkxFLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnbG9uZyBkb3VibGUnIHR5cGUuXSkKKyAgZmkKK10pCisjIGxvbmdsb25nLm00IHNlcmlhbCA0CitkbmwgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorCisjIERlZmluZSBIQVZFX0xPTkdfTE9ORyBpZiAnbG9uZyBsb25nJyB3b3Jrcy4KKworQUNfREVGVU4oW2ptX0FDX1RZUEVfTE9OR19MT05HXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsb25nIGxvbmddLCBhY19jdl90eXBlX2xvbmdfbG9uZywKKyAgW0FDX1RSWV9MSU5LKFtsb25nIGxvbmcgbGwgPSAxTEw7IGludCBpID0gNjM7XSwKKyAgICBbbG9uZyBsb25nIGxsbWF4ID0gKGxvbmcgbG9uZykgLTE7CisgICAgIHJldHVybiBsbCA8PCBpIHwgbGwgPj4gaSB8IGxsbWF4IC8gbGwgfCBsbG1heCAlIGxsO10sCisgICAgYWNfY3ZfdHlwZV9sb25nX2xvbmc9eWVzLAorICAgIGFjX2N2X3R5cGVfbG9uZ19sb25nPW5vKV0pCisgIGlmIHRlc3QgJGFjX2N2X3R5cGVfbG9uZ19sb25nID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfTE9OR19MT05HLCAxLAorICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2xvbmcgbG9uZycgdHlwZS5dKQorICBmaQorXSkKKyMgbmxzLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCitkbmwKK2RubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCitkbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKK2RubCBmdW5jdGlvbmFsaXR5LgorZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKK2RubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKK2RubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KK2RubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KKworZG5sIEF1dGhvcnM6CitkbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS0yMDAwLgorZG5sICAgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LCAyMDAwLTIwMDMuCisKK0FDX0RFRlVOKFtBTV9OTFNdLAorWworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCisgIEFDX0FSR19FTkFCTEUobmxzLAorICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCisgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCisgIEFDX1NVQlNUKFVTRV9OTFMpCitdKQorCitBQ19ERUZVTihbQU1fTUtJTlNUQUxMRElSU10sCitbCisgIGRubCBJZiB0aGUgQUNfQ09ORklHX0FVWF9ESVIgbWFjcm8gZm9yIGF1dG9jb25mIGlzIHVzZWQgd2UgcG9zc2libHkKKyAgZG5sIGZpbmQgdGhlIG1raW5zdGFsbGRpcnMgc2NyaXB0IGluIGFub3RoZXIgc3ViZGlyIGJ1dCAkKHRvcF9zcmNkaXIpLgorICBkbmwgVHJ5IHRvIGxvY2F0ZSBpdC4KKyAgTUtJTlNUQUxMRElSUz0KKyAgaWYgdGVzdCAtbiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgICAgY2FzZSAiJGFjX2F1eF9kaXIiIGluCisgICAgICAvKikgTUtJTlNUQUxMRElSUz0iJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICAgICopIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9idWlsZGRpcikvJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICBlc2FjCisgIGZpCisgIGlmIHRlc3QgLXogIiRNS0lOU1RBTExESVJTIjsgdGhlbgorICAgIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMiCisgIGZpCisgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCitdKQorIyBwby5tNCBzZXJpYWwgMyAoZ2V0dGV4dC0wLjE0KQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUtMjAwMC4KK2RubCAgIEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPiwgMjAwMC0yMDAzLgorCitkbmwgQ2hlY2tzIGZvciBhbGwgcHJlcmVxdWlzaXRlcyBvZiB0aGUgcG8gc3ViZGlyZWN0b3J5LgorQUNfREVGVU4oW0FNX1BPX1NVQkRJUlNdLAorWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKKyAgQUNfUkVRVUlSRShbQU1fTUtJTlNUQUxMRElSU10pZG5sCisgIEFDX1JFUVVJUkUoW0FNX05MU10pZG5sCisKKyAgZG5sIFBlcmZvcm0gdGhlIGZvbGxvd2luZyB0ZXN0cyBhbHNvIGlmIC0tZGlzYWJsZS1ubHMgaGFzIGJlZW4gZ2l2ZW4sCisgIGRubCBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IgIm1ha2UgZGlzdCIgdG8gd29yay4KKworICBkbmwgU2VhcmNoIGZvciBHTlUgbXNnZm10IGluIHRoZSBQQVRILgorICBkbmwgVGhlIGZpcnN0IHRlc3QgZXhjbHVkZXMgU29sYXJpcyBtc2dmbXQgYW5kIGVhcmx5IEdOVSBtc2dmbXQgdmVyc2lvbnMuCisgIGRubCBUaGUgc2Vjb25kIHRlc3QgZXhjbHVkZXMgRnJlZUJTRCBtc2dmbXQuCisgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisgICAgWyRhY19kaXIvJGFjX3dvcmQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgKGlmICRhY19kaXIvJGFjX3dvcmQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpXSwKKyAgICA6KQorICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKworICBkbmwgU2VhcmNoIGZvciBHTlUgeGdldHRleHQgMC4xMiBvciBuZXdlciBpbiB0aGUgUEFUSC4KKyAgZG5sIFRoZSBmaXJzdCB0ZXN0IGV4Y2x1ZGVzIFNvbGFyaXMgeGdldHRleHQgYW5kIGVhcmx5IEdOVSB4Z2V0dGV4dCB2ZXJzaW9ucy4KKyAgZG5sIFRoZSBzZWNvbmQgdGVzdCBleGNsdWRlcyBGcmVlQlNEIHhnZXR0ZXh0LgorICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKKyAgICBbJGFjX2Rpci8kYWNfd29yZCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgKGlmICRhY19kaXIvJGFjX3dvcmQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC0tbXNnaWQtYnVncy1hZGRyZXNzPSAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKV0sCisgICAgOikKKyAgZG5sIFJlbW92ZSBsZWZ0b3ZlciBmcm9tIEZyZWVCU0QgeGdldHRleHQgY2FsbC4KKyAgcm0gLWYgbWVzc2FnZXMucG8KKworICBkbmwgU2VhcmNoIGZvciBHTlUgbXNnbWVyZ2UgMC4xMSBvciBuZXdlciBpbiB0aGUgUEFUSC4KKyAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dNRVJHRSwgbXNnbWVyZ2UsCisgICAgWyRhY19kaXIvJGFjX3dvcmQgLS11cGRhdGUgLXEgL2Rldi9udWxsIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjFdLCA6KQorCisgIGRubCBUaGlzIGNvdWxkIGdvIGF3YXkgc29tZSBkYXk7IHRoZSBQQVRIX1BST0dfV0lUSF9URVNUIGFscmVhZHkgZG9lcyBpdC4KKyAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIG1zZ2ZtdC4KKyAgaWYgdGVzdCAiJEdNU0dGTVQiICE9ICI6IjsgdGhlbgorICAgIGRubCBJZiBpdCBpcyBubyBHTlUgbXNnZm10IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisgICAgZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KKyAgICBpZiAkR01TR0ZNVCAtLXN0YXRpc3RpY3MgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgIChpZiAkR01TR0ZNVCAtLXN0YXRpc3RpY3MgL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSk7IHRoZW4KKyAgICAgIDogOworICAgIGVsc2UKKyAgICAgIEdNU0dGTVQ9YGVjaG8gIiRHTVNHRk1UIiB8IHNlZCAtZSAncyxeLiovLCwnYAorICAgICAgQUNfTVNHX1JFU1VMVCgKKyAgICAgICAgW2ZvdW5kICRHTVNHRk1UIHByb2dyYW0gaXMgbm90IEdOVSBtc2dmbXQ7IGlnbm9yZSBpdF0pCisgICAgICBHTVNHRk1UPSI6IgorICAgIGZpCisgIGZpCisKKyAgZG5sIFRoaXMgY291bGQgZ28gYXdheSBzb21lIGRheTsgdGhlIFBBVEhfUFJPR19XSVRIX1RFU1QgYWxyZWFkeSBkb2VzIGl0LgorICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCisgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisgICAgZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQorICAgIGRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCisgICAgaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgIChpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC0tbXNnaWQtYnVncy1hZGRyZXNzPSAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKTsgdGhlbgorICAgICAgOiA7CisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVCgKKyAgICAgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW0gaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKKyAgICAgIFhHRVRURVhUPSI6IgorICAgIGZpCisgICAgZG5sIFJlbW92ZSBsZWZ0b3ZlciBmcm9tIEZyZWVCU0QgeGdldHRleHQgY2FsbC4KKyAgICBybSAtZiBtZXNzYWdlcy5wbworICBmaQorCisgIEFDX09VVFBVVF9DT01NQU5EUyhbCisgICAgZm9yIGFjX2ZpbGUgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgICAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIKKyAgICAgIGNhc2UgIiRhY19maWxlIiBpbgorICAgICAgICAqOiopIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAgICAgZXNhYworICAgICAgIyBQTyBkaXJlY3RvcmllcyBoYXZlIGEgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4uaW4uCisgICAgICBjYXNlICIkYWNfZmlsZSIgaW4gKi9NYWtlZmlsZS5pbikKKyAgICAgICAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIuCisgICAgICAgIGFjX2Rpcj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICIkYWNfZGlyInxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgICAgIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4InxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgICAgICAgIyBJbiBhdXRvY29uZi0yLjEzIGl0IGlzIGNhbGxlZCAkYWNfZ2l2ZW5fc3JjZGlyLgorICAgICAgICAjIEluIGF1dG9jb25mLTIuNTAgaXQgaXMgY2FsbGVkICRzcmNkaXIuCisgICAgICAgIHRlc3QgLW4gIiRhY19naXZlbl9zcmNkaXIiIHx8IGFjX2dpdmVuX3NyY2Rpcj0iJHNyY2RpciIKKyAgICAgICAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgICAgICAgICAuKSAgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgIDs7CisgICAgICAgICAgLyopIHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICAgICAgICAgKikgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgICAgICAgZXNhYworICAgICAgICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvUE9URklMRVMuaW4iOyB0aGVuCisgICAgICAgICAgcm0gLWYgIiRhY19kaXIvUE9URklMRVMiCisgICAgICAgICAgdGVzdCAtbiAiJGFzX21lIiAmJiBlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19kaXIvUE9URklMRVMiIHx8IGVjaG8gImNyZWF0aW5nICRhY19kaXIvUE9URklMRVMiCisgICAgICAgICAgY2F0ICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvUE9URklMRVMuaW4iIHwgc2VkIC1lICIvXiMvZCIgLWUgIi9eWyAJXSpcJC9kIiAtZSAicywuKiwgICAgICR0b3Bfc3JjZGlyLyYgXFxcXCwiIHwgc2VkIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiA+ICIkYWNfZGlyL1BPVEZJTEVTIgorICAgICAgICAgIFBPTUFLRUZJTEVERVBTPSJQT1RGSUxFUy5pbiIKKyAgICAgICAgICAjIEFMTF9MSU5HVUFTLCBQT0ZJTEVTLCBVUERBVEVQT0ZJTEVTLCBEVU1NWVBPRklMRVMsIEdNT0ZJTEVTIGRlcGVuZAorICAgICAgICAgICMgb24gJGFjX2RpciBidXQgZG9uJ3QgZGVwZW5kIG9uIHVzZXItc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAjIHBhcmFtZXRlcnMuCisgICAgICAgICAgaWYgdGVzdCAtZiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICAjIFRoZSBMSU5HVUFTIGZpbGUgY29udGFpbnMgdGhlIHNldCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJE9CU09MRVRFX0FMTF9MSU5HVUFTIjsgdGhlbgorICAgICAgICAgICAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogc2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiIHx8IGVjaG8gInNldHRpbmcgQUxMX0xJTkdVQVMgaW4gY29uZmlndXJlLmluIGlzIG9ic29sZXRlIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEFMTF9MSU5HVUFTXz1gc2VkIC1lICIvXiMvZCIgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTImAKKyAgICAgICAgICAgICMgSGlkZSB0aGUgQUxMX0xJTkdVQVMgYXNzaWdtZW50IGZyb20gYXV0b21ha2UuCisgICAgICAgICAgICBldmFsICdBTExfTElOR1VBUycnPSRBTExfTElOR1VBU18nCisgICAgICAgICAgICBQT01BS0VGSUxFREVQUz0iJFBPTUFLRUZJTEVERVBTIExJTkdVQVMiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBUaGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMgd2FzIGdpdmVuIGluIGNvbmZpZ3VyZS5pbi4KKyAgICAgICAgICAgIGV2YWwgJ0FMTF9MSU5HVUFTJyc9JE9CU09MRVRFX0FMTF9MSU5HVUFTJworICAgICAgICAgIGZpCisgICAgICAgICAgIyBDb21wdXRlIFBPRklMRVMKKyAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5wbykKKyAgICAgICAgICAjIENvbXB1dGUgVVBEQVRFUE9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykucG8tdXBkYXRlKQorICAgICAgICAgICMgQ29tcHV0ZSBEVU1NWVBPRklMRVMKKyAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLm5vcCkKKyAgICAgICAgICAjIENvbXB1dGUgR01PRklMRVMKKyAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5nbW8pCisgICAgICAgICAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgICAgICAgICAgIC4pIHNyY2RpcnByZT0gOzsKKyAgICAgICAgICAgICopIHNyY2RpcnByZT0nJChzcmNkaXIpLycgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgUE9GSUxFUz0KKyAgICAgICAgICBVUERBVEVQT0ZJTEVTPQorICAgICAgICAgIERVTU1ZUE9GSUxFUz0KKyAgICAgICAgICBHTU9GSUxFUz0KKyAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICAgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkc3JjZGlycHJlJGxhbmcucG8iCisgICAgICAgICAgICBVUERBVEVQT0ZJTEVTPSIkVVBEQVRFUE9GSUxFUyAkbGFuZy5wby11cGRhdGUiCisgICAgICAgICAgICBEVU1NWVBPRklMRVM9IiREVU1NWVBPRklMRVMgJGxhbmcubm9wIgorICAgICAgICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkc3JjZGlycHJlJGxhbmcuZ21vIgorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIENBVEFMT0dTIGRlcGVuZHMgb24gYm90aCAkYWNfZGlyIGFuZCB0aGUgdXNlcidzIExJTkdVQVMKKyAgICAgICAgICAjIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAgICAgIElOU1RfTElOR1VBUz0KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkQUxMX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICBmb3IgcHJlc2VudGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgICAgICAgICB1c2VpdD1ubworICAgICAgICAgICAgICBpZiB0ZXN0ICIlVU5TRVQlIiAhPSAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJExJTkdVQVMiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkQUxMX0xJTkdVQVMiCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KKyAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcHJlc2VudGxhbmcgY2F0YWxvZyBpZiBkZXNpcmVkbGFuZyBpcworICAgICAgICAgICAgICAgICMgICBhLiBlcXVhbCB0byBwcmVzZW50bGFuZywgb3IKKyAgICAgICAgICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKKyAgICAgICAgICAgICAgICAjICAgICAgcHJlc2VudGxhbmcgY2FuIGJlIHVzZWQgYXMgYSBmYWxsYmFjayBmb3IgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAjICAgICAgd2hpY2ggYXJlIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBkZXNpcmVkbGFuZyBjYXRhbG9nKS4KKyAgICAgICAgICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCisgICAgICAgICAgICAgICAgICAiJHByZXNlbnRsYW5nIiopIHVzZWl0PXllczs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgIGlmIHRlc3QgJHVzZWl0ID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgSU5TVF9MSU5HVUFTPSIkSU5TVF9MSU5HVUFTICRwcmVzZW50bGFuZyIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIENBVEFMT0dTPQorICAgICAgICAgIGlmIHRlc3QgLW4gIiRJTlNUX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICBmb3IgbGFuZyBpbiAkSU5TVF9MSU5HVUFTOyBkbworICAgICAgICAgICAgICBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nLmdtbyIKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIiB8fCBlY2hvICJjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIgorICAgICAgICAgIHNlZCAtZSAiL15QT1RGSUxFUyA9L3IgJGFjX2Rpci9QT1RGSUxFUyIgLWUgIi9eIyBNYWtldmFycy9yICRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9NYWtldmFycyIgLWUgInN8QFBPRklMRVNAfCRQT0ZJTEVTfGciIC1lICJzfEBVUERBVEVQT0ZJTEVTQHwkVVBEQVRFUE9GSUxFU3xnIiAtZSAic3xARFVNTVlQT0ZJTEVTQHwkRFVNTVlQT0ZJTEVTfGciIC1lICJzfEBHTU9GSUxFU0B8JEdNT0ZJTEVTfGciIC1lICJzfEBDQVRBTE9HU0B8JENBVEFMT0dTfGciIC1lICJzfEBQT01BS0VGSUxFREVQU0B8JFBPTUFLRUZJTEVERVBTfGciICIkYWNfZGlyL01ha2VmaWxlLmluIiA+ICIkYWNfZGlyL01ha2VmaWxlIgorICAgICAgICAgIGZvciBmIGluICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIiL1J1bGVzLSo7IGRvCisgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKyAgICAgICAgICAgICAgY2FzZSAiJGYiIGluCisgICAgICAgICAgICAgICAgKi5vcmlnIHwgKi5iYWsgfCAqfikgOzsKKyAgICAgICAgICAgICAgICAqKSBjYXQgIiRmIiA+PiAiJGFjX2Rpci9NYWtlZmlsZSIgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZG9uZV0sCisgICBbIyBDYXB0dXJlIHRoZSB2YWx1ZSBvZiBvYnNvbGV0ZSBBTExfTElOR1VBUyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gY29tcHV0ZQorICAgICMgUE9GSUxFUywgVVBEQVRFUE9GSUxFUywgRFVNTVlQT0ZJTEVTLCBHTU9GSUxFUywgQ0FUQUxPR1MuIEJ1dCBoaWRlIGl0CisgICAgIyBmcm9tIGF1dG9tYWtlLgorICAgIGV2YWwgJ09CU09MRVRFX0FMTF9MSU5HVUFTJyc9IiRBTExfTElOR1VBUyInCisgICAgIyBDYXB0dXJlIHRoZSB2YWx1ZSBvZiBMSU5HVUFTIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBjb21wdXRlIENBVEFMT0dTLgorICAgIExJTkdVQVM9IiR7TElOR1VBUy0lVU5TRVQlfSIKKyAgIF0pCitdKQorCitkbmwgUG9zdHByb2Nlc3NlcyBhIE1ha2VmaWxlIGluIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgUE8gZmlsZXMuCitBQ19ERUZVTihbQU1fUE9TVFBST0NFU1NfUE9fTUFLRUZJTEVdLAorWworICAjIFdoZW4gdGhpcyBjb2RlIGlzIHJ1biwgaW4gY29uZmlnLnN0YXR1cywgdHdvIHZhcmlhYmxlcyBoYXZlIGFscmVhZHkgYmVlbgorICAjIHNldDoKKyAgIyAtIE9CU09MRVRFX0FMTF9MSU5HVUFTIGlzIHRoZSB2YWx1ZSBvZiBMSU5HVUFTIHNldCBpbiBjb25maWd1cmUuaW4sCisgICMgLSBMSU5HVUFTIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTElOR1VBUyBhdCBjb25maWd1cmUKKyAgIyAgIHRpbWUuCisKK2NoYW5nZXF1b3RlKCwpZG5sCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLgorICBhY19kaXI9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAiJGFjX2RpciJ8c2VkICdzJV5cLi8lJSdgIgorICBhY19kb3RzPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCJ8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgICMgSW4gYXV0b2NvbmYtMi4xMyBpdCBpcyBjYWxsZWQgJGFjX2dpdmVuX3NyY2Rpci4KKyAgIyBJbiBhdXRvY29uZi0yLjUwIGl0IGlzIGNhbGxlZCAkc3JjZGlyLgorICB0ZXN0IC1uICIkYWNfZ2l2ZW5fc3JjZGlyIiB8fCBhY19naXZlbl9zcmNkaXI9IiRzcmNkaXIiCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgICAgLikgIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYCA7OworICAgIC8qKSB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAgICopICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICAjIEZpbmQgYSB3YXkgdG8gZWNobyBzdHJpbmdzIHdpdGhvdXQgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaC4KKyAgaWYgdGVzdCAiWGAoZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KKyAgICBndF9lY2hvPSdlY2hvJworICBlbHNlCisgICAgaWYgdGVzdCAiWGAocHJpbnRmICclc1xuJyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KKyAgICAgIGd0X2VjaG89J3ByaW50ZiAlc1xuJworICAgIGVsc2UKKyAgICAgIGVjaG9fZnVuYyAoKSB7CisgICAgICAgIGNhdCA8PEVPVAorJCoKK0VPVAorICAgICAgfQorICAgICAgZ3RfZWNobz0nZWNob19mdW5jJworICAgIGZpCisgIGZpCisKKyAgIyBBIHNlZCBzY3JpcHQgdGhhdCBleHRyYWN0cyB0aGUgdmFsdWUgb2YgVkFSSUFCTEUgZnJvbSBhIE1ha2VmaWxlLgorICBzZWRfeF92YXJpYWJsZT0nCisjIFRlc3QgaWYgdGhlIGhvbGQgc3BhY2UgaXMgZW1wdHkuCit4CitzL1AvUC8KK3gKK3RhCisjIFllcyBpdCB3YXMgZW1wdHkuIExvb2sgaWYgd2UgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFyaWFibGUgZGVmaW5pdGlvbi4KKy9eWwkgXSpWQVJJQUJMRVsJIF0qPS97CisgICMgU2VlbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbi4KKyAgcy9eWwkgXSpWQVJJQUJMRVsJIF0qPS8vCisgIGJhCit9CitiZAorOmEKKyMgSGVyZSB3ZSBhcmUgcHJvY2Vzc2luZyBhIGxpbmUgZnJvbSB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbi4KKyMgUmVtb3ZlIGNvbW1lbnQsIG1vcmUgcHJlY2lzZWx5IHJlcGxhY2UgaXQgd2l0aCBhIHNwYWNlLgorcy8jLiokLyAvCisjIFNlZSBpZiB0aGUgbGluZSBlbmRzIGluIGEgYmFja3NsYXNoLgordGIKKzpiCitzL1xcJC8vCisjIFByaW50IHRoZSBsaW5lLCB3aXRob3V0IHRoZSB0cmFpbGluZyBiYWNrc2xhc2guCitwCit0YworIyBUaGVyZSB3YXMgbm8gdHJhaWxpbmcgYmFja3NsYXNoLiBUaGUgZW5kIG9mIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uIGlzCisjIHJlYWNoZWQuIENsZWFyIHRoZSBob2xkIHNwYWNlLgorcy9eLiokLy8KK3gKK2JkCis6YworIyBBIHRyYWlsaW5nIGJhY2tzbGFzaCBtZWFucyB0aGF0IHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uIGNvbnRpbnVlcyBpbiB0aGUKKyMgbmV4dCBsaW5lLiBQdXQgYSBub25lbXB0eSBzdHJpbmcgaW50byB0aGUgaG9sZCBzcGFjZSB0byBpbmRpY2F0ZSB0aGlzLgorcy9eLiokL1AvCit4Cis6ZAorJworY2hhbmdlcXVvdGUoWyxdKWRubAorCisgICMgU2V0IFBPVEZJTEVTIHRvIHRoZSB2YWx1ZSBvZiB0aGUgTWFrZWZpbGUgdmFyaWFibGUgUE9URklMRVMuCisgIHNlZF94X1BPVEZJTEVTPSJgJGd0X2VjaG8gXCIkc2VkX3hfdmFyaWFibGVcIiB8IHNlZCAtZSAnL14gKiMvZCcgLWUgJ3MvVkFSSUFCTEUvUE9URklMRVMvZydgIgorICBQT1RGSUxFUz1gc2VkIC1uIC1lICIkc2VkX3hfUE9URklMRVMiIDwgIiRhY19maWxlImAKKyAgIyBDb21wdXRlIFBPVEZJTEVTX0RFUFMgYXMKKyAgIyAgICQoZm9yZWFjaCBmaWxlLCAkKFBPVEZJTEVTKSwgJCh0b3Bfc3JjZGlyKS8kKGZpbGUpKQorICBQT1RGSUxFU19ERVBTPQorICBmb3IgZmlsZSBpbiAkUE9URklMRVM7IGRvCisgICAgUE9URklMRVNfREVQUz0iJFBPVEZJTEVTX0RFUFMgIickKHRvcF9zcmNkaXIpLyciJGZpbGUiCisgIGRvbmUKKyAgUE9NQUtFRklMRURFUFM9IiIKKworICBpZiB0ZXN0IC1uICIkT0JTT0xFVEVfQUxMX0xJTkdVQVMiOyB0aGVuCisgICAgdGVzdCAtbiAiJGFzX21lIiAmJiBlY2hvICIkYXNfbWU6IHNldHRpbmcgQUxMX0xJTkdVQVMgaW4gY29uZmlndXJlLmluIGlzIG9ic29sZXRlIiB8fCBlY2hvICJzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIKKyAgZmkKKyAgaWYgdGVzdCAtZiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL0xJTkdVQVMiOyB0aGVuCisgICAgIyBUaGUgTElOR1VBUyBmaWxlIGNvbnRhaW5zIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGxhbmd1YWdlcy4KKyAgICBBTExfTElOR1VBU189YHNlZCAtZSAiL14jL2QiICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyJgCisgICAgUE9NQUtFRklMRURFUFM9IiRQT01BS0VGSUxFREVQUyBMSU5HVUFTIgorICBlbHNlCisgICAgIyBTZXQgQUxMX0xJTkdVQVMgdG8gdGhlIHZhbHVlIG9mIHRoZSBNYWtlZmlsZSB2YXJpYWJsZSBMSU5HVUFTLgorICAgIHNlZF94X0xJTkdVQVM9ImAkZ3RfZWNobyBcIiRzZWRfeF92YXJpYWJsZVwiIHwgc2VkIC1lICcvXiAqIy9kJyAtZSAncy9WQVJJQUJMRS9MSU5HVUFTL2cnYCIKKyAgICBBTExfTElOR1VBU189YHNlZCAtbiAtZSAiJHNlZF94X0xJTkdVQVMiIDwgIiRhY19maWxlImAKKyAgZmkKKyAgIyBIaWRlIHRoZSBBTExfTElOR1VBUyBhc3NpZ21lbnQgZnJvbSBhdXRvbWFrZS4KKyAgZXZhbCAnQUxMX0xJTkdVQVMnJz0kQUxMX0xJTkdVQVNfJworICAjIENvbXB1dGUgUE9GSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5wbykKKyAgIyBDb21wdXRlIFVQREFURVBPRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChsYW5nKS5wby11cGRhdGUpCisgICMgQ29tcHV0ZSBEVU1NWVBPRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChsYW5nKS5ub3ApCisgICMgQ29tcHV0ZSBHTU9GSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5nbW8pCisgICMgQ29tcHV0ZSBQUk9QRVJUSUVTRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJCh0b3Bfc3JjZGlyKS8kKERPTUFJTilfJChsYW5nKS5wcm9wZXJ0aWVzKQorICAjIENvbXB1dGUgQ0xBU1NGSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHRvcF9zcmNkaXIpLyQoRE9NQUlOKV8kKGxhbmcpLmNsYXNzKQorICAjIENvbXB1dGUgUU1GSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5xbSkKKyAgIyBDb21wdXRlIE1TR0ZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGZyb2IgJChsYW5nKSkubXNnKQorICAjIENvbXB1dGUgUkVTT1VSQ0VTRExMRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQoZnJvYiAkKGxhbmcpKS8kKERPTUFJTikucmVzb3VyY2VzLmRsbCkKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgICAuKSBzcmNkaXJwcmU9IDs7CisgICAgKikgc3JjZGlycHJlPSckKHNyY2RpcikvJyA7OworICBlc2FjCisgIFBPRklMRVM9CisgIFVQREFURVBPRklMRVM9CisgIERVTU1ZUE9GSUxFUz0KKyAgR01PRklMRVM9CisgIFBST1BFUlRJRVNGSUxFUz0KKyAgQ0xBU1NGSUxFUz0KKyAgUU1GSUxFUz0KKyAgTVNHRklMRVM9CisgIFJFU09VUkNFU0RMTEZJTEVTPQorICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgUE9GSUxFUz0iJFBPRklMRVMgJHNyY2RpcnByZSRsYW5nLnBvIgorICAgIFVQREFURVBPRklMRVM9IiRVUERBVEVQT0ZJTEVTICRsYW5nLnBvLXVwZGF0ZSIKKyAgICBEVU1NWVBPRklMRVM9IiREVU1NWVBPRklMRVMgJGxhbmcubm9wIgorICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJHNyY2RpcnByZSRsYW5nLmdtbyIKKyAgICBQUk9QRVJUSUVTRklMRVM9IiRQUk9QRVJUSUVTRklMRVMgXCQodG9wX3NyY2RpcikvXCQoRE9NQUlOKV8kbGFuZy5wcm9wZXJ0aWVzIgorICAgIENMQVNTRklMRVM9IiRDTEFTU0ZJTEVTIFwkKHRvcF9zcmNkaXIpL1wkKERPTUFJTilfJGxhbmcuY2xhc3MiCisgICAgUU1GSUxFUz0iJFFNRklMRVMgJHNyY2RpcnByZSRsYW5nLnFtIgorICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL1wuLiokLy8nIC1lICd5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LydgCisgICAgTVNHRklMRVM9IiRNU0dGSUxFUyAkc3JjZGlycHJlJGZyb2JiZWRsYW5nLm1zZyIKKyAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9fLy0vZydgCisgICAgUkVTT1VSQ0VTRExMRklMRVM9IiRSRVNPVVJDRVNETExGSUxFUyAkc3JjZGlycHJlJGZyb2JiZWRsYW5nL1wkKERPTUFJTikucmVzb3VyY2VzLmRsbCIKKyAgZG9uZQorICAjIENBVEFMT0dTIGRlcGVuZHMgb24gYm90aCAkYWNfZGlyIGFuZCB0aGUgdXNlcidzIExJTkdVQVMKKyAgIyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgSU5TVF9MSU5HVUFTPQorICBpZiB0ZXN0IC1uICIkQUxMX0xJTkdVQVMiOyB0aGVuCisgICAgZm9yIHByZXNlbnRsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIHVzZWl0PW5vCisgICAgICBpZiB0ZXN0ICIlVU5TRVQlIiAhPSAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgIGRlc2lyZWRsYW5ndWFnZXM9IiRMSU5HVUFTIgorICAgICAgZWxzZQorICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkQUxMX0xJTkdVQVMiCisgICAgICBmaQorICAgICAgZm9yIGRlc2lyZWRsYW5nIGluICRkZXNpcmVkbGFuZ3VhZ2VzOyBkbworICAgICAgICAjIFVzZSB0aGUgcHJlc2VudGxhbmcgY2F0YWxvZyBpZiBkZXNpcmVkbGFuZyBpcworICAgICAgICAjICAgYS4gZXF1YWwgdG8gcHJlc2VudGxhbmcsIG9yCisgICAgICAgICMgICBiLiBhIHZhcmlhbnQgb2YgcHJlc2VudGxhbmcgKGJlY2F1c2UgaW4gdGhpcyBjYXNlLAorICAgICAgICAjICAgICAgcHJlc2VudGxhbmcgY2FuIGJlIHVzZWQgYXMgYSBmYWxsYmFjayBmb3IgbWVzc2FnZXMKKyAgICAgICAgIyAgICAgIHdoaWNoIGFyZSBub3QgdHJhbnNsYXRlZCBpbiB0aGUgZGVzaXJlZGxhbmcgY2F0YWxvZykuCisgICAgICAgIGNhc2UgIiRkZXNpcmVkbGFuZyIgaW4KKyAgICAgICAgICAiJHByZXNlbnRsYW5nIiopIHVzZWl0PXllczs7CisgICAgICAgIGVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgJHVzZWl0ID0geWVzOyB0aGVuCisgICAgICAgIElOU1RfTElOR1VBUz0iJElOU1RfTElOR1VBUyAkcHJlc2VudGxhbmciCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgQ0FUQUxPR1M9CisgIEpBVkFDQVRBTE9HUz0KKyAgUVRDQVRBTE9HUz0KKyAgVENMQ0FUQUxPR1M9CisgIENTSEFSUENBVEFMT0dTPQorICBpZiB0ZXN0IC1uICIkSU5TVF9MSU5HVUFTIjsgdGhlbgorICAgIGZvciBsYW5nIGluICRJTlNUX0xJTkdVQVM7IGRvCisgICAgICBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nLmdtbyIKKyAgICAgIEpBVkFDQVRBTE9HUz0iJEpBVkFDQVRBTE9HUyBcJChET01BSU4pXyRsYW5nLnByb3BlcnRpZXMiCisgICAgICBRVENBVEFMT0dTPSIkUVRDQVRBTE9HUyAkbGFuZy5xbSIKKyAgICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL1wuLiokLy8nIC1lICd5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LydgCisgICAgICBUQ0xDQVRBTE9HUz0iJFRDTENBVEFMT0dTICRmcm9iYmVkbGFuZy5tc2ciCisgICAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9fLy0vZydgCisgICAgICBDU0hBUlBDQVRBTE9HUz0iJENTSEFSUENBVEFMT0dTICRmcm9iYmVkbGFuZy9cJChET01BSU4pLnJlc291cmNlcy5kbGwiCisgICAgZG9uZQorICBmaQorCisgIHNlZCAtZSAic3xAUE9URklMRVNfREVQU0B8JFBPVEZJTEVTX0RFUFN8ZyIgLWUgInN8QFBPRklMRVNAfCRQT0ZJTEVTfGciIC1lICJzfEBVUERBVEVQT0ZJTEVTQHwkVVBEQVRFUE9GSUxFU3xnIiAtZSAic3xARFVNTVlQT0ZJTEVTQHwkRFVNTVlQT0ZJTEVTfGciIC1lICJzfEBHTU9GSUxFU0B8JEdNT0ZJTEVTfGciIC1lICJzfEBQUk9QRVJUSUVTRklMRVNAfCRQUk9QRVJUSUVTRklMRVN8ZyIgLWUgInN8QENMQVNTRklMRVNAfCRDTEFTU0ZJTEVTfGciIC1lICJzfEBRTUZJTEVTQHwkUU1GSUxFU3xnIiAtZSAic3xATVNHRklMRVNAfCRNU0dGSUxFU3xnIiAtZSAic3xAUkVTT1VSQ0VTRExMRklMRVNAfCRSRVNPVVJDRVNETExGSUxFU3xnIiAtZSAic3xAQ0FUQUxPR1NAfCRDQVRBTE9HU3xnIiAtZSAic3xASkFWQUNBVEFMT0dTQHwkSkFWQUNBVEFMT0dTfGciIC1lICJzfEBRVENBVEFMT0dTQHwkUVRDQVRBTE9HU3xnIiAtZSAic3xAVENMQ0FUQUxPR1NAfCRUQ0xDQVRBTE9HU3xnIiAtZSAic3xAQ1NIQVJQQ0FUQUxPR1NAfCRDU0hBUlBDQVRBTE9HU3xnIiAtZSAncyxeI2Rpc3RkaXI6LGRpc3RkaXI6LCcgPCAiJGFjX2ZpbGUiID4gIiRhY19maWxlLnRtcCIKKyAgaWYgZ3JlcCAtbCAnQFRDTENBVEFMT0dTQCcgIiRhY19maWxlIiA+IC9kZXYvbnVsbDsgdGhlbgorICAgICMgQWRkIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSBmb3JtdWxhdGVkIGFzIGEgc2ltcGxlIHN1ZmZpeCBydWxlLgorICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL1wuLiokLy8nIC1lICd5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LydgCisgICAgICBjYXQgPj4gIiRhY19maWxlLnRtcCIgPDxFT0YKKyRmcm9iYmVkbGFuZy5tc2c6ICRsYW5nLnBvCisJQGVjaG8gIlwkKE1TR0ZNVCkgLWMgLS10Y2wgLWQgXCQoc3JjZGlyKSAtbCAkbGFuZyAkc3JjZGlycHJlJGxhbmcucG8iOyBcCisJXCQoTVNHRk1UKSAtYyAtLXRjbCAtZCAiXCQoc3JjZGlyKSIgLWwgJGxhbmcgJHNyY2RpcnByZSRsYW5nLnBvIHx8IHsgcm0gLWYgIlwkKHNyY2RpcikvJGZyb2JiZWRsYW5nLm1zZyI7IGV4aXQgMTsgfQorRU9GCisgICAgZG9uZQorICBmaQorICBpZiBncmVwIC1sICdAQ1NIQVJQQ0FUQUxPR1NAJyAiJGFjX2ZpbGUiID4gL2Rldi9udWxsOyB0aGVuCisgICAgIyBBZGQgZGVwZW5kZW5jaWVzIHRoYXQgY2Fubm90IGJlIGZvcm11bGF0ZWQgYXMgYSBzaW1wbGUgc3VmZml4IHJ1bGUuCisgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXy8tL2cnYAorICAgICAgY2F0ID4+ICIkYWNfZmlsZS50bXAiIDw8RU9GCiskZnJvYmJlZGxhbmcvXCQoRE9NQUlOKS5yZXNvdXJjZXMuZGxsOiAkbGFuZy5wbworCUBlY2hvICJcJChNU0dGTVQpIC1jIC0tY3NoYXJwIC1kIFwkKHNyY2RpcikgLWwgJGxhbmcgJHNyY2RpcnByZSRsYW5nLnBvIC1yIFwkKERPTUFJTikiOyBcCisJXCQoTVNHRk1UKSAtYyAtLWNzaGFycCAtZCAiXCQoc3JjZGlyKSIgLWwgJGxhbmcgJHNyY2RpcnByZSRsYW5nLnBvIC1yICJcJChET01BSU4pIiB8fCB7IHJtIC1mICJcJChzcmNkaXIpLyRmcm9iYmVkbGFuZy5tc2ciOyBleGl0IDE7IH0KK0VPRgorICAgIGRvbmUKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJFBPTUFLRUZJTEVERVBTIjsgdGhlbgorICAgIGNhdCA+PiAiJGFjX2ZpbGUudG1wIiA8PEVPRgorTWFrZWZpbGU6ICRQT01BS0VGSUxFREVQUworRU9GCisgIGZpCisgIG12ICIkYWNfZmlsZS50bXAiICIkYWNfZmlsZSIKK10pCisjIHByaW50Zi1wb3NpeC5tNCBzZXJpYWwgMiAoZ2V0dGV4dC0wLjEzLjEpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCitkbmwgVGVzdCB3aGV0aGVyIHRoZSBwcmludGYoKSBmdW5jdGlvbiBzdXBwb3J0cyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3Mgd2l0aAorZG5sIHBvc2l0aW9ucy4KKworQUNfREVGVU4oW2d0X1BSSU5URl9QT1NJWF0sCitbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBwcmludGYoKSBzdXBwb3J0cyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3NdLAorICAgIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4LAorICAgIFsKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisvKiBUaGUgc3RyaW5nICIlMiRkICUxJGQiLCB3aXRoIGRvbGxhciBjaGFyYWN0ZXJzIHByb3RlY3RlZCBmcm9tIHRoZSBzaGVsbCdzCisgICBkb2xsYXIgZXhwYW5zaW9uIChwb3NzaWJseSBhbiBhdXRvY29uZiBidWcpLiAgKi8KK3N0YXRpYyBjaGFyIGZvcm1hdFtdID0geyAnJScsICcyJywgJyQnLCAnZCcsICcgJywgJyUnLCAnMScsICckJywgJ2QnLCAnXDAnIH07CitzdGF0aWMgY2hhciBidWZbMTAwXTsKK2ludCBtYWluICgpCit7CisgIHNwcmludGYgKGJ1ZiwgZm9ybWF0LCAzMywgNTUpOworICByZXR1cm4gKHN0cmNtcCAoYnVmLCAiNTUgMzMiKSAhPSAwKTsKK31dLCBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeD15ZXMsIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PW5vLAorICAgICAgWworICAgICAgICBBQ19FR1JFUF9DUFAobm90cG9zaXgsIFsKKyNpZiBkZWZpbmVkIF9fTmV0QlNEX18gfHwgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fTUlOR1czMl9fIHx8IGRlZmluZWQgX19DWUdXSU5fXworICBub3Rwb3NpeAorI2VuZGlmCisgICAgICAgIF0sIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PSJndWVzc2luZyBubyIsCisgICAgICAgICAgIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PSJndWVzc2luZyB5ZXMiKQorICAgICAgXSkKKyAgICBdKQorICBjYXNlICRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCBpbgorICAgICp5ZXMpCisgICAgICBBQ19ERUZJTkUoSEFWRV9QT1NJWF9QUklOVEYsIDEsCisgICAgICAgIFtEZWZpbmUgaWYgeW91ciBwcmludGYoKSBmdW5jdGlvbiBzdXBwb3J0cyBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucy5dKQorICAgICAgOzsKKyAgZXNhYworXSkKKyMgcHJvZ3Rlc3QubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KK2RubAorZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKK2RubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorZG5sIGZ1bmN0aW9uYWxpdHkuCitkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAorZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorZG5sIGdldHRleHQgcGFja2FnZSBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorZG5sIFRoZXkgYXJlICpub3QqIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCitkbmwgQXV0aG9yczoKK2RubCAgIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorCitkbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCitkbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCitBQ19ERUZVTihbQU1fUEFUSF9QUk9HX1dJVEhfVEVTVF0sCitbCisjIFByZXBhcmUgUEFUSF9TRVBBUkFUT1IuCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisjIEZpbmQgb3V0IGhvdyB0byB0ZXN0IGZvciBleGVjdXRhYmxlIGZpbGVzLiBEb24ndCB1c2UgYSB6ZXJvLWJ5dGUgZmlsZSwKKyMgYXMgc3lzdGVtcyBtYXkgdXNlIG1ldGhvZHMgb3RoZXIgdGhhbiBtb2RlIGJpdHMgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFiaWxpdHkuCitjYXQgPmNvbmYkJC5maWxlIDw8X0FTRU9GCisjISAvYmluL3NoCitleGl0IDAKK19BU0VPRgorY2htb2QgK3ggY29uZiQkLmZpbGUKK2lmIHRlc3QgLXggY29uZiQkLmZpbGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAteCIKK2Vsc2UKKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorZmkKK3JtIC1mIGNvbmYkJC5maWxlCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKK0FDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAorW2Nhc2UgIlskXSQxIiBpbgorICBbW1xcL11dKiB8ID86W1tcXC9dXSopCisgICAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICAgIDs7CisgICopCisgICAgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgICBJRlM9IiRhY19zYXZlX0lGUyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgICAgaWYgJGFjX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgICBpZiBbJDNdOyB0aGVuCisgICAgICAgICAgICBhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICAgICAgICAgYnJlYWsgMgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIElGUz0iJGFjX3NhdmVfSUZTIgorZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKK2RubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgoraWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKK10pZG5sCisgICAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCBpZmVsc2UoWyQ0XSwgLCBbLW4gIlskXSQxIl0sIFsiWyRdJDEiICE9ICIkNCJdKTsgdGhlbgorICBBQ19NU0dfUkVTVUxUKFskXSQxKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK0FDX1NVQlNUKCQxKWRubAorXSkKKyMgc2lnbmVkLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTAuNDApCitkbmwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW2JoX0NfU0lHTkVEXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzaWduZWRdLCBiaF9jdl9jX3NpZ25lZCwKKyAgIFtBQ19UUllfQ09NUElMRSgsIFtzaWduZWQgY2hhciB4O10sIGJoX2N2X2Nfc2lnbmVkPXllcywgYmhfY3ZfY19zaWduZWQ9bm8pXSkKKyAgaWYgdGVzdCAkYmhfY3ZfY19zaWduZWQgPSBubzsgdGhlbgorICAgIEFDX0RFRklORShzaWduZWQsICwKKyAgICAgICAgICAgICAgW0RlZmluZSB0byBlbXB0eSBpZiB0aGUgQyBjb21waWxlciBkb2Vzbid0IHN1cHBvcnQgdGhpcyBrZXl3b3JkLl0pCisgIGZpCitdKQorIyBzaXplX21heC5tNCBzZXJpYWwgMgorZG5sIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorCitBQ19ERUZVTihbZ2xfU0laRV9NQVhdLAorWworICBBQ19DSEVDS19IRUFERVJTKHN0ZGludC5oKQorICBkbmwgRmlyc3QgdGVzdCB3aGV0aGVyIHRoZSBzeXN0ZW0gYWxyZWFkeSBoYXMgU0laRV9NQVguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIFNJWkVfTUFYXSkKKyAgcmVzdWx0PQorICBBQ19FR1JFUF9DUFAoW0ZvdW5kIGl0XSwgWworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIFNJWkVfTUFYCitGb3VuZCBpdAorI2VuZGlmCitdLCByZXN1bHQ9eWVzKQorICBpZiB0ZXN0IC16ICIkcmVzdWx0IjsgdGhlbgorICAgIGRubCBEZWZpbmUgaXQgb3Vyc2VsdmVzLiBIZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSB0eXBlICdzaXplX3QnIGlzIG5vdCB3aWRlcgorICAgIGRubCB0aGFuIHRoZSB0eXBlICd1bnNpZ25lZCBsb25nJy4KKyAgICBkbmwgVGhlIF9BQ19DT01QVVRFX0lOVCBtYWNybyB3b3JrcyB1cCB0byBMT05HX01BWCwgc2luY2UgaXQgdXNlcyAnZXhwcicsCisgICAgZG5sIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gd29yayBmcm9tIExPTkdfTUlOIHRvIExPTkdfTUFYLgorICAgIF9BQ19DT01QVVRFX0lOVChbfihzaXplX3QpMCAvIDEwXSwgcmVzX2hpLAorICAgICAgWyNpbmNsdWRlIDxzdGRkZWYuaD5dLCByZXN1bHQ9PykKKyAgICBfQUNfQ09NUFVURV9JTlQoW34oc2l6ZV90KTAgJSAxMF0sIHJlc19sbywKKyAgICAgIFsjaW5jbHVkZSA8c3RkZGVmLmg+XSwgcmVzdWx0PT8pCisgICAgX0FDX0NPTVBVVEVfSU5UKFtzaXplb2YgKHNpemVfdCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpXSwgZml0c19pbl91aW50LAorICAgICAgWyNpbmNsdWRlIDxzdGRkZWYuaD5dLCByZXN1bHQ9PykKKyAgICBpZiB0ZXN0ICIkZml0c19pbl91aW50IiA9IDE7IHRoZW4KKyAgICAgIGRubCBFdmVuIHRob3VnaCBTSVpFX01BWCBmaXRzIGluIGFuIHVuc2lnbmVkIGludCwgaXQgbXVzdCBiZSBvZiB0eXBlCisgICAgICBkbmwgJ3Vuc2lnbmVkIGxvbmcnIGlmIHRoZSB0eXBlICdzaXplX3QnIGlzIHRoZSBzYW1lIGFzICd1bnNpZ25lZCBsb25nJy4KKyAgICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkZGVmLmg+CisgICAgICAgIGV4dGVybiBzaXplX3QgZm9vOworICAgICAgICBleHRlcm4gdW5zaWduZWQgbG9uZyBmb287CisgICAgICAgIF0sIFtdLCBmaXRzX2luX3VpbnQ9MCkKKyAgICBmaQorICAgIGlmIHRlc3QgLXogIiRyZXN1bHQiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZml0c19pbl91aW50IiA9IDE7IHRoZW4KKyAgICAgICAgcmVzdWx0PSIkcmVzX2hpJHJlc19sbyJVCisgICAgICBlbHNlCisgICAgICAgIHJlc3VsdD0iJHJlc19oaSRyZXNfbG8iVUwKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZG5sIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCB3aG8ga25vd3MuLi4KKyAgICAgIHJlc3VsdD0nfihzaXplX3QpMCcKKyAgICBmaQorICBmaQorICBBQ19NU0dfUkVTVUxUKFskcmVzdWx0XSkKKyAgaWYgdGVzdCAiJHJlc3VsdCIgIT0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKFtTSVpFX01BWF0sIFskcmVzdWx0XSwKKyAgICAgIFtEZWZpbmUgYXMgdGhlIG1heGltdW0gdmFsdWUgb2YgdHlwZSAnc2l6ZV90JywgaWYgdGhlIHN5c3RlbSBkb2Vzbid0IGRlZmluZSBpdC5dKQorICBmaQorXSkKKyMgc3RkaW50X2gubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gUGF1bCBFZ2dlcnQuCisKKyMgRGVmaW5lIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYIGlmIDxzdGRpbnQuaD4gZXhpc3RzLAorIyBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPiwgYW5kIGRlY2xhcmVzIHVpbnRtYXhfdC4KKworQUNfREVGVU4oW2ptX0FDX0hFQURFUl9TVERJTlRfSF0sCitbCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3Igc3RkaW50LmhdLCBqbV9hY19jdl9oZWFkZXJfc3RkaW50X2gsCisgIFtBQ19UUllfQ09NUElMRSgKKyAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPl0sCisgICAgW3VpbnRtYXhfdCBpID0gKHVpbnRtYXhfdCkgLTE7XSwKKyAgICBqbV9hY19jdl9oZWFkZXJfc3RkaW50X2g9eWVzLAorICAgIGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaD1ubyldKQorICBpZiB0ZXN0ICRqbV9hY19jdl9oZWFkZXJfc3RkaW50X2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVgsIDEsCisgICAgICBbRGVmaW5lIGlmIDxzdGRpbnQuaD4gZXhpc3RzLCBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPiwKKyAgICAgICBhbmQgZGVjbGFyZXMgdWludG1heF90LiBdKQorICBmaQorXSkKKyMgdWludG1heF90Lm00IHNlcmlhbCA3IChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorCitBQ19QUkVSRVEoMi4xMykKKworIyBEZWZpbmUgdWludG1heF90IHRvICd1bnNpZ25lZCBsb25nJyBvciAndW5zaWduZWQgbG9uZyBsb25nJworIyBpZiBpdCBpcyBub3QgYWxyZWFkeSBkZWZpbmVkIGluIDxzdGRpbnQuaD4gb3IgPGludHR5cGVzLmg+LgorCitBQ19ERUZVTihbam1fQUNfVFlQRV9VSU5UTUFYX1RdLAorWworICBBQ19SRVFVSVJFKFtqbV9BQ19IRUFERVJfSU5UVFlQRVNfSF0pCisgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9TVERJTlRfSF0pCisgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oID0gbm8gJiYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oID0gbm87IHRoZW4KKyAgICBBQ19SRVFVSVJFKFtqbV9BQ19UWVBFX1VOU0lHTkVEX0xPTkdfTE9OR10pCisgICAgdGVzdCAkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmcgPSB5ZXMgXAorICAgICAgJiYgYWNfdHlwZT0ndW5zaWduZWQgbG9uZyBsb25nJyBcCisgICAgICB8fCBhY190eXBlPSd1bnNpZ25lZCBsb25nJworICAgIEFDX0RFRklORV9VTlFVT1RFRCh1aW50bWF4X3QsICRhY190eXBlLAorICAgICAgW0RlZmluZSB0byB1bnNpZ25lZCBsb25nIG9yIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgIGlmIDxzdGRpbnQuaD4gYW5kIDxpbnR0eXBlcy5oPiBkb24ndCBkZWZpbmUuXSkKKyAgZWxzZQorICAgIEFDX0RFRklORShIQVZFX1VJTlRNQVhfVCwgMSwKKyAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICd1aW50bWF4X3QnIHR5cGUgaW4gPHN0ZGludC5oPiBvciA8aW50dHlwZXMuaD4uXSkKKyAgZmkKK10pCisjIHVsb25nbG9uZy5tNCBzZXJpYWwgMworZG5sIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKworIyBEZWZpbmUgSEFWRV9VTlNJR05FRF9MT05HX0xPTkcgaWYgJ3Vuc2lnbmVkIGxvbmcgbG9uZycgd29ya3MuCisKK0FDX0RFRlVOKFtqbV9BQ19UWVBFX1VOU0lHTkVEX0xPTkdfTE9OR10sCitbCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgdW5zaWduZWQgbG9uZyBsb25nXSwgYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmcsCisgIFtBQ19UUllfTElOSyhbdW5zaWduZWQgbG9uZyBsb25nIHVsbCA9IDFVTEw7IGludCBpID0gNjM7XSwKKyAgICBbdW5zaWduZWQgbG9uZyBsb25nIHVsbG1heCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIC0xOworICAgICByZXR1cm4gdWxsIDw8IGkgfCB1bGwgPj4gaSB8IHVsbG1heCAvIHVsbCB8IHVsbG1heCAlIHVsbDtdLAorICAgIGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nPXllcywKKyAgICBhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZz1ubyldKQorICBpZiB0ZXN0ICRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX1VOU0lHTkVEX0xPTkdfTE9ORywgMSwKKyAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICd1bnNpZ25lZCBsb25nIGxvbmcnIHR5cGUuXSkKKyAgZmkKK10pCisjIHdjaGFyX3QubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorZG5sIFRlc3Qgd2hldGhlciA8c3RkZGVmLmg+IGhhcyB0aGUgJ3djaGFyX3QnIHR5cGUuCitkbmwgUHJlcmVxdWlzaXRlOiBBQ19QUk9HX0NDCisKK0FDX0RFRlVOKFtndF9UWVBFX1dDSEFSX1RdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIHdjaGFyX3RdLCBndF9jdl9jX3djaGFyX3QsCisgICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkZGVmLmg+CisgICAgICAgd2NoYXJfdCBmb28gPSAod2NoYXJfdCknXDAnO10sICwKKyAgICAgICBndF9jdl9jX3djaGFyX3Q9eWVzLCBndF9jdl9jX3djaGFyX3Q9bm8pXSkKKyAgaWYgdGVzdCAkZ3RfY3ZfY193Y2hhcl90ID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfV0NIQVJfVCwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3djaGFyX3QnIHR5cGUuXSkKKyAgZmkKK10pCisjIHdpbnRfdC5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorZG5sIFRlc3Qgd2hldGhlciA8d2NoYXIuaD4gaGFzIHRoZSAnd2ludF90JyB0eXBlLgorZG5sIFByZXJlcXVpc2l0ZTogQUNfUFJPR19DQworCitBQ19ERUZVTihbZ3RfVFlQRV9XSU5UX1RdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIHdpbnRfdF0sIGd0X2N2X2Nfd2ludF90LAorICAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+CisgICAgICAgd2ludF90IGZvbyA9ICh3Y2hhcl90KSdcMCc7XSwgLAorICAgICAgIGd0X2N2X2Nfd2ludF90PXllcywgZ3RfY3ZfY193aW50X3Q9bm8pXSkKKyAgaWYgdGVzdCAkZ3RfY3ZfY193aW50X3QgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9XSU5UX1QsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICd3aW50X3QnIHR5cGUuXSkKKyAgZmkKK10pCisjIHhzaXplLm00IHNlcmlhbCAyCitkbmwgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitBQ19ERUZVTihbZ2xfWFNJWkVdLAorWworICBkbmwgUHJlcmVxdWlzaXRlcyBvZiBsaWIveHNpemUuaC4KKyAgQUNfUkVRVUlSRShbZ2xfU0laRV9NQVhdKQorICBBQ19DSEVDS19IRUFERVJTKHN0ZGludC5oKQorXSkKZGlmZiAtLWdpdCBhL3VuaXgvYm9pbGVycGxhdGUubWsgYi91bml4L2JvaWxlcnBsYXRlLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjM3NmUKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2JvaWxlcnBsYXRlLm1rCkBAIC0wLDAgKzEsMzYgQEAKKworYWxsOjoKKwlAc3ViZGlycz0iJChTVUJESVJTKSI7IGZvciBkIGluICQkc3ViZGlyczsgZG8gKGNkICQkZDsgJChNQUtFKSAkQCkgfHwgZXhpdCAxOyBkb25lCisKK2NsZWFuOjoKKwlAc3ViZGlycz0iJChTVUJESVJTKSI7IGZvciBkIGluICQkc3ViZGlyczsgZG8gKGNkICQkZDsgJChNQUtFKSAkQCkgfHwgZXhpdCAxOyBkb25lCisKK2NsZWFuOjoKKwlybSAtZiAkKHByb2dyYW0pICQobGlicmFyeSkgKi5vCisKK1NIRUxMID0gQFNIRUxMQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK0BTRVRfTUFLRUAKK0NDID0gQENDQAorQ0ZMQUdTID0gQENGTEFHU0AgJChESVJfQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitDWFggPSBAQ1hYQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhMRCA9ICQoQ1hYKQorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitERUZTID0gQERFRlNACitBTExfQ1BQRkxBR1MgPSAkKENQUEZMQUdTKSAkKERFRlMpICQoRElSX0NQUEZMQUdTKQorTElCUyA9IEBMSUJTQAorTERGTEFHUyA9IEBMREZMQUdTQAorUkFOTElCID0gQFJBTkxJQkAKK0FSID0gYXIgY3EKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuY3h4IC5jIC5vCisKKy5jLm86CisJJChDQykgJChBTExfQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCisuY3h4Lm86CisJJChDWFgpICQoQUxMX0NQUEZMQUdTKSAkKENYWEZMQUdTKSAtbyAkQCAtYyAkPApkaWZmIC0tZ2l0IGEvdW5peC9ib290c3RyYXAgYi91bml4L2Jvb3RzdHJhcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Mzk3OTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9ib290c3RyYXAKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vc2gKK3JtIC1yZiBhdXRvbTR0ZS5jYWNoZQorYXV0b3JlY29uZiAtaQpkaWZmIC0tZ2l0IGEvdW5peC9jb25maWcuZ3Vlc3MgYi91bml4L2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE2ODhiCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNDU5IEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwNC0wNi0xMScKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgorIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91CisjIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgYnVpbGQgc3lzdGVtIHR5cGUuCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgLXEgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsnCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCisjIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgMTk5NC0wOC0yNCkKK2lmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICitmaQorCitVTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KK1VOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgorVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgorCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24gOzsKKwllc2FjCisJIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCisJIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybSp8aTM4NnxtNjhrfG5zMzJrfHNoMyp8c3BhcmN8dmF4KQorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCWlmIGVjaG8gX19FTEZfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJCQl8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsCisJCXRoZW4KKwkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KKwkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPworCQkgICAgb3M9bmV0YnNkCisJCWVsc2UKKwkJICAgIG9zPW5ldGJzZGVsZgorCQlmaQorCQk7OworCSAgICAqKQorCSAgICAgICAgb3M9bmV0YnNkCisJCTs7CisJZXNhYworCSMgVGhlIE9TIHJlbGVhc2UKKwkjIERlYmlhbiBHTlUvTmV0QlNEIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgdXNlcmxhbmQsIGFuZAorCSMgdGh1cywgbmVlZCBhIGRpc3RpbmN0IHRyaXBsZXQuIEhvd2V2ZXIsIHRoZXkgZG8gbm90IG5lZWQKKwkjIGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhCisJIyBzdWl0YWJsZSB0YWcsIGluIHRoZSBzdHlsZSBvZiBsaW51eC1nbnUuCisJY2FzZSAiJHtVTkFNRV9WRVJTSU9OfSIgaW4KKwkgICAgRGViaWFuKikKKwkJcmVsZWFzZT0nLWdudScKKwkJOzsKKwkgICAgKikKKwkJcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwkJOzsKKwllc2FjCisJIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06CisJIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06CisJIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgorCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgorCWV4aXQgMCA7OworICAgIGFtZDY0Ok9wZW5CU0Q6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhbWlnYTpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFyYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgY2F0czpPcGVuQlNEOio6KikKKwllY2hvIGFybS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaHAzMDA6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBsdW5hODhrOk9wZW5CU0Q6KjoqKQorICAgIAllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hYzY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hY3BwYzpPcGVuQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZXBwYzpPcGVuQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBtYXg6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNnaTpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlYi11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuMzpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHdncmlzYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpPcGVuQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6ZWtrb0JTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycHBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYWxwaGE6T1NGMToqOiopCisJY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgorCSo0LjApCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJCTs7CisJKjUuKikKKwkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCisJCTs7CisJZXNhYworCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCisJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKKwkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCisJIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCisJQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAorCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KKwkgICAgIkVWNCAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjQuNSAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNSAoMjExNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7CisJICAgICJFVjUuNiAoMjExNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKKwkgICAgIkVWNS42ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7CisJICAgICJFVjUuNyAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OworCSAgICAiRVY2ICgyMTI2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKKwkgICAgIkVWNi43ICgyMTI2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OworCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44QUwgKDIxMjY0QikiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOENYICgyMTI2NEQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7CisJICAgICJFVjcgKDIxMzY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OworCSAgICAiRVY3LjkgKDIxMzY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CisJZXNhYworCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlleGl0IDAgOzsKKyAgICBBbHBoYSo6T3BlblZNUzoqOiopCisJZWNobyBhbHBoYS1ocC12bXMKKwlleGl0IDAgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDAgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgMDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCAwIDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCAwIDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDAgOzsKKyAgICAqOk9TNDAwOio6KikKKyAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgMCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBOSUxFKjoqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgMCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgMCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NyAmJiBleGl0IDAgOzsKKwllc2FjIDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiopCisJZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCAwIDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCAwIDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCisgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CisgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgorICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKKyAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQorICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90CisgICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCisgICAgIyBiZSBubyBwcm9ibGVtLgorICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgbTY4azptYWNodGVuOio6KikKKwllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDAgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIFwKKwkgICYmICRkdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCisJICAmJiBleGl0IDAKKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAorCWV4aXQgMCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCAwIDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDAgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgMCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAJZXhpdCAwIDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgMCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgMCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCAwIDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCAwIDs7CisgICAgKjpBSVg6KjpbNDVdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDAgOzsKKyAgICAqOkFJWDoqOiopCisJZWNobyByczYwMDAtaWJtLWFpeAorCWV4aXQgMCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgMCA7OworICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCisJZWNobyBtNjhrLWJ1bGwtc3lzdjMKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgMCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgMCA7OworICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKKwkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OworCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKKwkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KKwkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisgICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCisgICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCisgICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworCQlmaQorCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KKwkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYworCisgICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCisgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisgICAgICAgICAgICAgIGludCBtYWluICgpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQorICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCisgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJfSBicmVhazsKKyAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KKyAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgIGV4aXQgKDApOworICAgICAgICAgICAgICB9CitFT0YKKwkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCisJCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCisJCWZpIDs7CisJZXNhYworCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQorCXRoZW4KKwkgICAgIyBhdm9pZCBkb3VibGUgZXZhbHVhdGlvbiBvZiAkc2V0X2NjX2Zvcl9idWlsZAorCSAgICB0ZXN0IC1uICIkQ0NfRk9SX0JVSUxEIiB8fCBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0pIHwgZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgMCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDAgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgMCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgMCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCAwIDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgMCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBudjEtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKyAgICAgICAgZXhpdCAwIDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDAgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgdXNlcyBnbGliYy4KKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwkjaWYgX19HTElCQ19fID49IDIKKwlMSUJDPWdudQorCSNlbHNlCisJTElCQz0KKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKKwkjIEdOVS9LRnJlZUJTRCBzeXN0ZW1zIGhhdmUgYSAiayIgcHJlZml4IHRvIGluZGljYXRlIHdlIGFyZSB1c2luZworCSMgRnJlZUJTRCdzIGtlcm5lbCwgYnV0IG5vdCB0aGUgY29tcGxldGUgT1MuCisJY2FzZSAke0xJQkN9IGluIGdudSkga2VybmVsX29ubHk9J2snIDs7IGVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi0ke2tlcm5lbF9vbmx5fWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgJHtMSUJDOistJExJQkN9CisJZXhpdCAwIDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDAgOzsKKyAgICBpKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgMCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCAwIDs7CisgICAgeDg2OkludGVyaXgqOlszNF0qKQorCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvXC4uKi8vJworCWV4aXQgMCA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgMCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgMCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDAgOzsKKyAgICBwKjpDWUdXSU4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KKwlleGl0IDAgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDAgOzsKKyAgICAqOkdOVS8qOio6KikKKwkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQorCWV4aXQgMCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgMCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIG0zMnIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBtaXBzOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHMKKwkjdW5kZWYgbWlwc2VsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwc2VsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzCisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCisJOzsKKyAgICBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwczY0CisJI3VuZGVmIG1pcHM2NGVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwczY0ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHM2NAorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiICYmIGV4aXQgMAorCTs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBhbHBoYTpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KKwkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7CisJICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKKwkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7CisJICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKKwkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OworICAgICAgICBlc2FjCisJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDAgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgMCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgaSo4NjpMaW51eDoqOiopCisJIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KKwkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuIGNkIHRvIHRoZSByb290IGRpcmVjdG9yeSB0byBwcmV2ZW50CisJIyBwcm9ibGVtcyB3aXRoIG90aGVyIHByb2dyYW1zIG9yIGRpcmVjdG9yaWVzIGNhbGxlZCBgbGQnIGluIHRoZSBwYXRoLgorCSMgU2V0IExDX0FMTD1DIHRvIGVuc3VyZSBsZCBvdXRwdXRzIG1lc3NhZ2VzIGluIEVuZ2xpc2guCisJbGRfc3VwcG9ydGVkX3RhcmdldHM9YGNkIC87IExDX0FMTD1DIGxkIC0taGVscCAyPiYxIFwKKwkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgdGFyZ2V0czovIWQKKwkJCQkgICAgcy9bIAldWyAJXSovIC9nCisJCQkJICAgIHMvLipzdXBwb3J0ZWQgdGFyZ2V0czogKi8vCisJCQkJICAgIHMvIC4qLy8KKwkJCQkgICAgcCdgCisgICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfdGFyZ2V0cyIgaW4KKwkgIGVsZjMyLWkzODYpCisJCVRFTlRBVElWRT0iJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnUiCisJCTs7CisJICBhLm91dC1pMzg2LWxpbnV4KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiCisJCWV4aXQgMCA7OworCSAgY29mZi1pMzg2KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCisJCWV4aXQgMCA7OworCSAgIiIpCisJCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgorCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKKwkJZXhpdCAwIDs7CisJZXNhYworCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisJI2lmZGVmIF9fRUxGX18KKwkjIGlmZGVmIF9fR0xJQkNfXworCSMgIGlmIF9fR0xJQkNfXyA+PSAyCisJTElCQz1nbnUKKwkjICBlbHNlCisJTElCQz1nbnVsaWJjMQorCSMgIGVuZGlmCisJIyBlbHNlCisJTElCQz1nbnVsaWJjMQorCSMgZW5kaWYKKwkjZWxzZQorCSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeTElCQz1gCisJdGVzdCB4IiR7TElCQ30iICE9IHggJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IiAmJiBleGl0IDAKKwl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIGVjaG8gIiR7VEVOVEFUSVZFfSIgJiYgZXhpdCAwCisJOzsKKyAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQorCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCisJIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAorCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDAgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDAgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDAgOzsKKyAgICBpKjg2OmF0aGVvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCisJZXhpdCAwIDs7CisJaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCAwIDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LjAqOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDAgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDAgOzsKKyAgICBpKjg2Oio6NTpbNzhdKikKKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgMCA7OworICAgIGkqODY6KjozLjI6KikKKwlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCisJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKKwllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAorCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgorCWZpCisJZXhpdCAwIDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisgICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0CisgICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCisJZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCAwIDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgMCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDAgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCAwIDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDAgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCAwIDs7CisgICAgTTY4KjoqOlIzVls1Njc4XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JyAmJiBleGl0IDAgOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisgICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgMCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgMCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCAwIDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgMCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCAwIDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCAwIDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgMCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNYLTU6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkRhcndpbjoqOiopCisJY2FzZSBgdW5hbWUgLXBgIGluCisJICAgICo4NikgVU5BTUVfUFJPQ0VTU09SPWk2ODYgOzsKKwkgICAgcG93ZXJwYykgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpRTlg6Kjo0KikKKwllY2hvIGkzODYtcGMtcW54CisJZXhpdCAwIDs7CisgICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgMCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgMCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgMCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgMCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgMCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCAwIDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDAgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDAgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgMCA7OworICAgIFNFSToqOio6U0VJVVgpCisgICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDAgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKyAgICAgICAgICAiNCIKKyNlbHNlCisJICAiIgorI2VuZGlmCisgICAgICAgICApOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQorICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgaWYgKHZlcnNpb24gPCA0KQorICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGVsc2UKKyAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyMgaWYgIWRlZmluZWQgKHVsdHJpeCkKKyMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgaWYgZGVmaW5lZCAoQlNEKQorIyAgIGlmIEJTRCA9PSA0MworICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKKyMgICBlbHNlCisjICAgIGlmIEJTRCA9PSAxOTkwMDYKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOworIyAgICBlbHNlCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiskQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiAkZHVtbXkgJiYgZXhpdCAwCisKKyMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KKwordGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCAwIDs7CisgICAgYzM0KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGVzYWMKK2ZpCisKK2NhdCA+JjIgPDxFT0YKKyQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKKworVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKK2Rvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQorCisgICAgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9jb25maWcvCisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgorCitleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvdW5peC9jb25maWcuaCBiL3VuaXgvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvY29uZmlnLmgKZGlmZiAtLWdpdCBhL3VuaXgvY29uZmlnLnJwYXRoIGIvdW5peC9jb25maWcucnBhdGgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGRiMTNlNQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvY29uZmlnLnJwYXRoCkBAIC0wLDAgKzEsNTQ4IEBACisjISAvYmluL3NoCisjIE91dHB1dCBhIHN5c3RlbSBkZXBlbmRlbnQgc2V0IG9mIHZhcmlhYmxlcywgZGVzY3JpYmluZyBob3cgdG8gc2V0IHRoZQorIyBydW4gdGltZSBzZWFyY2ggcGF0aCBvZiBzaGFyZWQgbGlicmFyaWVzIGluIGFuIGV4ZWN1dGFibGUuCisjCisjICAgQ29weXJpZ2h0IDE5OTYtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBUYWtlbiBmcm9tIEdOVSBsaWJ0b29sLCAyMDAxCisjICAgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyAgIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyAgIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjICAgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgZmlsZSBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3BlY2lmaWNhdGlvbiwKKyMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IKKyMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQ0MsIEdDQywgTERGTEFHUywgTEQsIHdpdGhfZ251X2xkCisjIHNob3VsZCBiZSBzZXQgYnkgdGhlIGNhbGxlci4KKyMKKyMgVGhlIHNldCBvZiBkZWZpbmVkIHZhcmlhYmxlcyBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgc2NyaXB0LgorCisjIEtub3duIGxpbWl0YXRpb25zOgorIyAtIE9uIElSSVggNi41IHdpdGggQ0M9ImNjIiwgdGhlIHJ1biB0aW1lIHNlYXJjaCBwYXRjaCBtdXN0IG5vdCBiZSBsb25nZXIKKyMgICB0aGFuIDI1NiBieXRlcywgb3RoZXJ3aXNlIHRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBkdW1wIGNvcmUuIFRoZSBvbmx5CisjICAga25vd24gd29ya2Fyb3VuZCBpcyB0byBjaG9vc2Ugc2hvcnRlciBkaXJlY3RvcnkgbmFtZXMgZm9yIHRoZSBidWlsZAorIyAgIGRpcmVjdG9yeSBhbmQvb3IgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNJFZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKK3NocmV4dD0uc28KKworaG9zdD0iJDEiCitob3N0X2NwdT1gZWNobyAiJGhvc3QiIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICIkaG9zdCIgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAiJGhvc3QiIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKworIyBDb2RlIHRha2VuIGZyb20gbGlidG9vbC5tNCdzIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMuCisKK3dsPQoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgd2w9Jy1XbCwnCitlbHNlCisgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIGFpeCopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgOzsKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgd2w9Jy1XbCwnCisgICAgICA7OworICAgIG5ld3NvczYpCisgICAgICA7OworICAgIGxpbnV4KikKKyAgICAgIGNhc2UgJENDIGluCisgICAgICAgIGljY3xlY2MpCisgICAgICAgICAgd2w9Jy1XbCwnCisgICAgICAgICAgOzsKKyAgICAgICAgY2NjKQorICAgICAgICAgIHdsPSctV2wsJworICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBzY28zLjJ2NSopCisgICAgICA7OworICAgIHNvbGFyaXMqKQorICAgICAgd2w9Jy1XbCwnCisgICAgICA7OworICAgIHN1bm9zNCopCisgICAgICB3bD0nLVFvcHRpb24gbGQgJworICAgICAgOzsKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgOzsKKyAgICB1dHM0KikKKyAgICAgIDs7CisgIGVzYWMKK2ZpCisKKyMgQ29kZSB0YWtlbiBmcm9tIGxpYnRvb2wubTQncyBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTLgorCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KK2hhcmRjb2RlX2RpcmVjdD1ubworaGFyZGNvZGVfbWludXNfTD1ubworCitjYXNlICIkaG9zdF9vcyIgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworZXNhYworCitsZF9zaGxpYnM9eWVzCitpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGFtaWdhb3MqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCisgICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAorICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQorICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuIHVzZQorICAgICAgIyB0aGVtLgorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBuZXRic2QqKQorICAgICAgOzsKKyAgICBzb2xhcmlzKiB8IHN5c3Y1KikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgOgorICAgICAgZWxzZQorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIHN1bm9zNCopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICA7OworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgOgorICAgICAgZWxzZQorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICBlc2FjCisgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCisgICAgIyBVbmxpa2UgbGlidG9vbCwgd2UgdXNlIC1ycGF0aCBoZXJlLCBub3QgLS1ycGF0aCwgc2luY2UgdGhlIGRvY3VtZW50ZWQKKyAgICAjIG9wdGlvbiBvZiBHTlUgbGQgaXMgY2FsbGVkIC1ycGF0aCwgbm90IC0tcnBhdGguCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICBmaQorZWxzZQorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBhaXgzKikKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisgICAgICAgICMgYnJva2VuIGNvbGxlY3QyLgorICAgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworICAgIGFpeDQqIHwgYWl4NSopCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBlbHNlCisgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKKyAgICAgICAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgICAgICAgICAgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgICAgICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorICAgICAgICAgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKyAgICAgICAgICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisgICAgICAgICAgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisgICAgICAgICAgdGhlbgorICAgICAgICAgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKyAgICAgICAgICBmaQorICAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgIyBCZWdpbiBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYLgorICAgICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC5jCisgICAgICAke0NDfSAke0xERkxBR1N9IGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QKKyAgICAgIGFpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0IDI+L2Rldi9udWxsIHwgc2VkIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorICAgICAgaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgorICAgICAgICBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCAyPi9kZXYvbnVsbCB8IHNlZCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCisgICAgICAgIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIgorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3QKKyAgICAgICMgRW5kIF9MVF9BQ19TWVNfTElCUEFUSF9BSVguCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKyAgICAgICAgZWxzZQorICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisgICAgICAgIGZpCisgICAgICBmaQorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgYnNkaTQqKQorICAgICAgOzsKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworICAgICAgbGliZXh0PWxpYgorICAgICAgOzsKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgaWYgJENDIC12IDI+JjEgfCBncmVwICdBcHBsZScgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBkZ3V4KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIDs7CisgICAgZnJlZWJzZDEqKQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICAgIGZyZWVic2QyLjIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgOzsKKyAgICBmcmVlYnNkMiopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgOzsKKyAgICBmcmVlYnNkKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIDs7CisgICAgaHB1eDkqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICA7OworICAgIGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisgICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgICBocHBhKjY0KikKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgaWE2NCopCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisgICAgbmV0YnNkKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIDs7CisgICAgbmV3c29zNikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKyAgICBvcGVuYnNkKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZWxzZQorICAgICAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgICAgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworICAgIG9zMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgOzsKKyAgICBvc2YzKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKyAgICBvc2Y0KiB8IG9zZjUqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorICAgICAgICAjIEJvdGggY2MgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisgICAgc2NvMy4ydjUqKQorICAgICAgOzsKKyAgICBzb2xhcmlzKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIDs7CisgICAgc3Vub3M0KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICA7OworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICAgICAgc25pKQorICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisgICAgICAgICAgOzsKKyAgICAgICAgc2llbWVucykKKyAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgICA7OworICAgICAgICBtb3Rvcm9sYSkKKyAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIHN5c3Y0LjMqKQorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisgICAgICAgIGxkX3NobGlicz15ZXMKKyAgICAgIGZpCisgICAgICA7OworICAgIHN5c3Y0LjJ1dzIqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD1ubworICAgICAgOzsKKyAgICBzeXN2NU9wZW5VTklYOCogfCBzeXN2NVVuaXhXYXJlNyogfCAgc3lzdjV1d1s3OF0qIHwgdW5peHdhcmU3KikKKyAgICAgIDs7CisgICAgc3lzdjUqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgICAgIDs7CisgICAgdXRzNCopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICA7OworICAgICopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzCisjIENvZGUgdGFrZW4gZnJvbSBsaWJ0b29sLm00J3MgQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIuCitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworY2FzZSAiJGhvc3Rfb3MiIGluCisgIGFpeDMqKQorICAgIDs7CisgIGFpeDQqIHwgYWl4NSopCisgICAgOzsKKyAgYW1pZ2FvcyopCisgICAgOzsKKyAgYmVvcyopCisgICAgOzsKKyAgYnNkaTQqKQorICAgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICBzaHJleHQ9LmRsbAorICAgIDs7CisgIGRhcndpbiogfCByaGFwc29keSopCisgICAgc2hyZXh0PS5keWxpYgorICAgIDs7CisgIGRndXgqKQorICAgIDs7CisgIGZyZWVic2QxKikKKyAgICA7OworICBmcmVlYnNkKikKKyAgICA7OworICBnbnUqKQorICAgIDs7CisgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgIGlhNjQqKQorICAgICAgICBzaHJleHQ9LnNvCisgICAgICAgIDs7CisgICAgICBocHBhKjY0KikKKyAgICAgICAgc2hyZXh0PS5zbAorICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgc2hyZXh0PS5zbAorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgY2FzZSAkTEQgaW4KKyAgICAgICAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IDs7CisgICAgICAgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIDs7CisgICAgICAgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IDs7CisgICAgICAgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGxpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgICAgOzsKKyAgbGludXgqKQorICAgIDs7CisgIG5ldGJzZCopCisgICAgOzsKKyAgbmV3c29zNikKKyAgICA7OworICBudG8tcW54KQorICAgIDs7CisgIG9wZW5ic2QqKQorICAgIDs7CisgIG9zMiopCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzaHJleHQ9LmRsbAorICAgIDs7CisgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICA7OworICBzY28zLjJ2NSopCisgICAgOzsKKyAgc29sYXJpcyopCisgICAgOzsKKyAgc3Vub3M0KikKKyAgICA7OworICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgICAgOzsKKyAgc3lzdjQqTVAqKQorICAgIDs7CisgIHV0czQqKQorICAgIDs7Citlc2FjCisKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFsiYCRcXF1cKS9cXFwxL2cnCitlc2NhcGVkX3dsPWBlY2hvICJYJHdsIiB8IHNlZCAtZSAncy9eWC8vJyAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCitzaGxpYmV4dD1gZWNobyAiJHNocmV4dCIgfCBzZWQgLWUgJ3MsXlwuLCwnYAorZXNjYXBlZF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPWBlY2hvICJYJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHwgc2VkIC1lICdzL15YLy8nIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKworc2VkIC1lICdzL15cKFthLXpBLVowLTlfXSpcKT0vYWNsX2N2X1wxPS8nIDw8RU9GCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSIkZXNjYXBlZF93bCIKKworIyBTdGF0aWMgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAic28iKS4KK3NobGliZXh0PSIkc2hsaWJleHQiCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGVzY2FwZWRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9IiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSIkaGFyZGNvZGVfZGlyZWN0IgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0iJGhhcmRjb2RlX21pbnVzX0wiCisKK0VPRgpkaWZmIC0tZ2l0IGEvdW5peC9jb25maWcuc3ViIGIvdW5peC9jb25maWcuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzMxMDMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNTQ5IEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA0LTAzLTEyJworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCAwOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC11Y2xpYmMqIHwgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwgXAorICBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcykKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgXAorCXwgYzR4IHwgY2xpcHBlciBcCisJfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAorCXwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCisJfCBpcDJrIHwgaXEyMDAwIFwKKwl8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayB8IG1jb3JlIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCisJfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCisJfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAorCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwl8IG1zcDQzMCBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9wZW5yaXNjIHwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjNdZSB8IHNoWzM0XWViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgXAorCXwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeHNjYWxlIHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKKwl8IHo4aykKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyKQorCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCisJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKKwl8IGF2ci0qIFwKKwl8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIHwgYzU0eC0qIHwgYzU1eC0qIHwgYzZ4LSogXAorCXwgY2xpcHBlci0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWNvcmUtKiBcCisJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCisJfCBtaXBzMTYtKiBcCisJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCisJfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAorCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCisJfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbXNwNDMwLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBudjEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJvbXAtKiB8IHJzNjAwMC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiB8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdHJvbi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHN0b3JteTE2LSogXAorCXwgeHRlbnNhLSogXAorCXwgeW1wLSogXAorCXwgejhrLSopCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKyAgICAJYWJhY3VzKQorCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCisJCTs7CisJYWRvYmU2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCisJCW9zPS1zY291dAorCQk7OworCWFsbGlhbnQgfCBmeDgwKQorCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAorCQk7OworCWFsdG9zIHwgYWx0b3MzMDY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKKwkJOzsKKwlhbTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKKwkJb3M9LWJzZAorCQk7OworCWFtZDY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQk7OworCWFtZDY0LSopCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgajkwKQorCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcjE2YykKKwkJYmFzaWNfbWFjaGluZT1jcjE2Yy11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQorCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWdvMzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tZ28zMgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloODMwMHhyYXkpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0teHJheQorCQk7OworCWg4NTAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCTs7CisjIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KKwlpKjg2djMyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YzMgorCQk7OworCWkqODZ2NCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjQKKwkJOzsKKwlpKjg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaSo4NnNvbDIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlpMzg2bWFjaCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKKwkJb3M9LW1hY2gKKwkJOzsKKwlpMzg2LXZzdGEgfCB2c3RhKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tdnN0YQorCQk7OworCWlyaXMgfCBpcmlzNGQpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1pcml4KikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LWlyaXg0CisJCQk7OworCQllc2FjCisJCTs7CisJaXNpNjggfCBpc2kpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKKwkJb3M9LXN5c3YKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW1peCopCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW12cykKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisJbmNyMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgorCQlvcz0tc3lzdjQKKwkJOzsKKwluZXRic2QzODYpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1uZXRic2QKKwkJOzsKKwluZXR3aW5kZXIpCisJCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCisJCW9zPS1saW51eAorCQk7OworCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzMTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmVjdjcwKQorCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwluZXh0IHwgbSotbmV4dCApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0CisJCWNhc2UgJG9zIGluCisJCSAgICAtbmV4dHN0ZXAqICkKKwkJCTs7CisJCSAgICAtbnMyKikKKwkJICAgICAgb3M9LW5leHRzdGVwMgorCQkJOzsKKwkJICAgICopCisJCSAgICAgIG9zPS1uZXh0c3RlcDMKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwluaDMwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaFs0NV0wMDApCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaW5keTk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1uaW5keQorCQk7OworCW1vbjk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1tb245NjAKKwkJOzsKKwlub25zdG9wdXgpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKKwkJb3M9LW5vbnN0b3B1eAorCQk7OworCW5wMSkKKwkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKKwkJOzsKKwludjEpCisJCWJhc2ljX21hY2hpbmU9bnYxLWNyYXkKKwkJb3M9LXVuaWNvc21wCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9yMzIgfCBvcjMyLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJb3M0MDApCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LW9zNDAwCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bTQpCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtNC0qKQorCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQorCQk7OworCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJOzsKKwlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkJOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCisJCTs7CisJcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KKwkJOzsKKwlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNjQpCisJCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCisJCTs7CisJc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWM1NHggfCBjNTR4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzU1eCB8IGM1NXgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNnggfCBjNngqKQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2gzIHwgc2g0IHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiBcCisJICAgICAgfCAtZWtrb2JzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogfCAtbHlueG9zKiBcCisJICAgICAgfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAorCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKKwkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKKwkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtbGludXgtdWNsaWJjKiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKyAgICAgICAgLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworICAgICAgICAtdHBmKikKKwkJb3M9LXRwZgorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCisJCW9zPS1vc2UKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCW9zPS1taW50CisJCTs7CisJLWFyb3MqKQorCQlvcz0tYXJvcworCQk7OworCS1rYW9zKikKKwkJb3M9LWthb3MKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgYzR4LSogfCB0aWM0eC0qKQorICAgICAgICBvcz0tY29mZgorICAgICAgICA7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCSotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworCSotc2dpKQorCQlvcz0taXJpeAorCQk7OworCSotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqLXJvbTY4aykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLSpidWcpCisJCW9zPS1jb2ZmCisJCTs7CisJKi1hcHBsZSkKKwkJb3M9LW1hY29zCisJCTs7CisJKi1hdGFyaSopCisJCW9zPS1taW50CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqIHwgLW9wZW5lZCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktb3M0MDAqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXRwZiopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS1obXMqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS1tcHcqIHwgLW1hY29zKikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJCQl2ZW5kb3I9YXRhcmkKKwkJCQk7OworCQkJLXZvcyopCisJCQkJdmVuZG9yPXN0cmF0dXMKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS91bml4L2NvbmZpZ3VyZSBiL3VuaXgvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2NDA5OWEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2NvbmZpZ3VyZQpAQCAtMCwwICsxLDEzMDU0IEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworZWxpZiB0ZXN0IC1uICIke0JBU0hfVkVSU0lPTitzZXR9IiAmJiAoc2V0IC1vIHBvc2l4KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2V0IC1vIHBvc2l4CitmaQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc191bnNldD11bnNldAorZWxzZQorICBhc191bnNldD1mYWxzZQorZmkKKworCisjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KKyRhc191bnNldCBFTlYgTUFJTCBNQUlMUEFUSAorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitmb3IgYXNfdmFyIGluIFwKKyAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKKyAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKKyAgTENfVEVMRVBIT05FIExDX1RJTUUKK2RvCisgIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCisgICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgJGFzX3ZhcgorICBmaQorZG9uZQorCisjIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCisKKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KK2FzX21lPWAkYXNfYmFzZW5hbWUgIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJCcgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwvXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwvXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisKKworIyBQQVRIIG5lZWRzIENSLCBhbmQgTElORU5PIG5lZWRzIENSIGFuZCBQQVRILgorIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCisKKworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICB8fCB7CisgICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIHBhdGggYXQgYWxsCisgICMgcmVsYXRpdmUgb3Igbm90LgorICBjYXNlICQwIGluCisgICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKK2RvbmUKKworICAgICAgIDs7CisgIGVzYWMKKyAgIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworICAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyAgaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICAgIGFzX215c2VsZj0kMAorICBmaQorICBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgcGF0aCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZmkKKyAgY2FzZSAkQ09ORklHX1NIRUxMIGluCisgICcnKQorICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSBjYXNlICRhc19kaXIgaW4KKwkgLyopCisJICAgaWYgKCIkYXNfZGlyLyRhc19iYXNlIiAtYyAnCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4JGFzX2xpbmVub18zIiAgPSAieCRhc19saW5lbm9fMiIgJykgMj4vZGV2L251bGw7IHRoZW4KKwkgICAgICRhc191bnNldCBCQVNIX0VOViB8fCB0ZXN0ICIke0JBU0hfRU5WK3NldH0iICE9IHNldCB8fCB7IEJBU0hfRU5WPTsgZXhwb3J0IEJBU0hfRU5WOyB9CisJICAgICAkYXNfdW5zZXQgRU5WIHx8IHRlc3QgIiR7RU5WK3NldH0iICE9IHNldCB8fCB7IEVOVj07IGV4cG9ydCBFTlY7IH0KKwkgICAgIENPTkZJR19TSEVMTD0kYXNfZGlyLyRhc19iYXNlCisJICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisJICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJDAiICR7MSsiJEAifQorCSAgIGZpOzsKKwkgZXNhYworICAgICAgIGRvbmUKK2RvbmUKKzs7CisgIGVzYWMKKworICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCisgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKKyAgIyBsaW5lLW51bWJlciBsaW5lIGJlZm9yZSBlYWNoIGxpbmU7IHRoZSBzZWNvbmQgJ3NlZCcgZG9lcyB0aGUgcmVhbAorICAjIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2ggbGluZS1udW1iZXIgbGluZQorICAjIHdpdGggdGhlIG51bWJlcmVkIGxpbmUsIGFuZCBhcHBlbmRzIHRyYWlsaW5nICctJyBkdXJpbmcKKyAgIyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwgY2FzZSBhdCBsaW5lIGVuZC4KKyAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCisgICMgc2Vjb25kICdzZWQnIHNjcmlwdC4gIEJsYW1lIExlZSBFLiBNY01haG9uIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkICc9JyA8JGFzX215c2VsZiB8CisgICAgc2VkICcKKyAgICAgIE4KKyAgICAgIHMsJCwtLAorICAgICAgOiBsb29wCisgICAgICBzLF5cKFsnJGFzX2NyX2RpZ2l0cyddKlwpXCguKlwpWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX11cKSxcMVwyXDFcMywKKyAgICAgIHQgbG9vcAorICAgICAgcywtJCwsCisgICAgICBzLF5bJyRhc19jcl9kaWdpdHMnXSpcbiwsCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAkYXNfbWUubGluZW5vIHx8CisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpYmxlIHRvIHRoaXMpLgorICAuIC4vJGFzX21lLmxpbmVubworICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCisKK2Nhc2UgYGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDNgLGBlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDNgIGluCisgICpjKiwtbiopIEVDSE9fTj0gRUNIT19DPScKKycgRUNIT19UPScJJyA7OworICAqYyosKiAgKSBFQ0hPX049LW4gRUNIT19DPSBFQ0hPX1Q9IDs7CisgICopICAgICAgIEVDSE9fTj0gRUNIT19DPSdcYycgRUNIT19UPSA7OworZXNhYworCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2VjaG8gPmNvbmYkJC5maWxlCitpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgIyBXZSBjb3VsZCBqdXN0IGNoZWNrIGZvciBESkdQUDsgYnV0IHRoaXMgdGVzdCBhKSB3b3JrcyBiKSBpcyBtb3JlIGdlbmVyaWMKKyAgIyBhbmQgYykgd2lsbCByZW1haW4gdmFsaWQgb25jZSBESkdQUCBzdXBwb3J0cyBzeW1saW5rcyAoREpHUFAgMi4wNCkuCisgIGlmIHRlc3QgLWYgY29uZiQkLmV4ZTsgdGhlbgorICAgICMgRG9uJ3QgdXNlIGxuIGF0IGFsbDsgd2UgZG9uJ3QgaGF2ZSBhbnkgbGlua3MKKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgZWxzZQorICAgIGFzX2xuX3M9J2xuIC1zJworICBmaQorZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbG5fcz1sbgorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9OgorZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCithc19leGVjdXRhYmxlX3A9InRlc3QgLWYiCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4KK2FzX25sPScKKycKK0lGUz0iIAkkYXNfbmwiCisKKyMgQ0RQQVRILgorJGFzX3Vuc2V0IENEUEFUSAorCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCitleGVjIDY+JjEKKworIworIyBJbml0aWFsaXphdGlvbnMuCisjCithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCithY19jb25maWdfbGlib2JqX2Rpcj0uCitjcm9zc19jb21waWxpbmc9bm8KK3N1YmRpcnM9CitNRkxBR1M9CitNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCisjIFRoaXMgdmFyaWFibGUgc2VlbXMgb2Jzb2xldGUuICBJdCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCwgYW5kCisjIG9ubHkgYWNfbWF4X3NlZF9saW5lcyBzaG91bGQgYmUgdXNlZC4KKzogJHthY19tYXhfaGVyZV9saW5lcz0zOH0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9CitQQUNLQUdFX1RBUk5BTUU9CitQQUNLQUdFX1ZFUlNJT049CitQQUNLQUdFX1NUUklORz0KK1BBQ0tBR0VfQlVHUkVQT1JUPQorCithY191bmlxdWVfZmlsZT0idm5jdmlld2VyX3VuaXgvdm5jdmlld2VyLmN4eCIKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIVNURENfSEVBREVSUyAmJiBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RESU5UX0gKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworYWNfc3Vic3RfdmFycz0nU0hFTEwgUEFUSF9TRVBBUkFUT1IgUEFDS0FHRV9OQU1FIFBBQ0tBR0VfVEFSTkFNRSBQQUNLQUdFX1ZFUlNJT04gUEFDS0FHRV9TVFJJTkcgUEFDS0FHRV9CVUdSRVBPUlQgZXhlY19wcmVmaXggcHJlZml4IHByb2dyYW1fdHJhbnNmb3JtX25hbWUgYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyIGJ1aWxkX2FsaWFzIGhvc3RfYWxpYXMgdGFyZ2V0X2FsaWFzIERFRlMgRUNIT19DIEVDSE9fTiBFQ0hPX1QgTElCUyBQQUNLQUdFIFZFUlNJT04gQ0MgQ0ZMQUdTIExERkxBR1MgQ1BQRkxBR1MgYWNfY3RfQ0MgRVhFRVhUIE9CSkVYVCBDWFggQ1hYRkxBR1MgYWNfY3RfQ1hYIFJBTkxJQiBhY19jdF9SQU5MSUIgU0VUX01BS0UgTUlUU0hNX0RFRklORSBDWFhDUFAgWF9DRkxBR1MgWF9QUkVfTElCUyBYX0xJQlMgWF9FWFRSQV9MSUJTIFpMSUJfRElSIFpMSUJfSU5DTFVERSBaTElCX0xJQiBKUEVHX0RJUiBKUEVHX0lOQ0xVREUgSlBFR19MSUIgVk5DQ09ORklHX0RJUiBYVEVTVF9ERUZJTkUgWFRFU1RfTElCIFJFQURESVNQTEFZX0RFRklORSBWU05QUklOVEZfREVGSU5FIFNUUkNBU0VDTVBfREVGSU5FIFNUUk5DQVNFQ01QX0RFRklORSBJTkVUX0xJQiBTT0NLTEVOX1RfREVGSU5FIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgTUtJTlNUQUxMRElSUyBVU0VfTkxTIE1TR0ZNVCBHTVNHRk1UIFhHRVRURVhUIE1TR01FUkdFIGJ1aWxkIGJ1aWxkX2NwdSBidWlsZF92ZW5kb3IgYnVpbGRfb3MgaG9zdCBob3N0X2NwdSBob3N0X3ZlbmRvciBob3N0X29zIEVHUkVQIEFMTE9DQSBHTElCQzIxIEhBVkVfUE9TSVhfUFJJTlRGIEhBVkVfQVNQUklOVEYgSEFWRV9TTlBSSU5URiBIQVZFX1dQUklOVEYgTElCSUNPTlYgTFRMSUJJQ09OViBJTlRMQklTT04gQlVJTERfSU5DTFVERURfTElCSU5UTCBVU0VfSU5DTFVERURfTElCSU5UTCBDQVRPQkpFWFQgREFUQURJUk5BTUUgSU5TVE9CSkVYVCBHRU5DQVQgSU5UTE9CSlMgSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVggSU5UTExJQlMgTElCSU5UTCBMVExJQklOVEwgUE9TVUIgTElCT0JKUyBMVExJQk9CSlMnCithY19zdWJzdF9maWxlcz0nJworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgYWNfb3B0YXJnPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFtePV0qPVwoLipcKSdgCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19vcHRpb24gaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAkYWNfb3B0aW9uIGluCisgICAgICAqPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgCisgICAgZXZhbCAiJGFjX2VudnZhcj0nJGFjX29wdGFyZyciCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgorZm9yIGFjX3ZhciBpbiBleGVjX3ByZWZpeCBwcmVmaXgKK2RvCisgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogfCBOT05FIHwgJycgKSA7OworICAgICopICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBwYXRocy4KK2ZvciBhY192YXIgaW4gYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgXAorCSAgICAgIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19jb25mZGlyPWAoZGlybmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkMCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiQwIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkYWNfY29uZmRpciBvciAuLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZWxzZQorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorZmkKKyhjZCAkc3JjZGlyICYmIHRlc3QgLXIgLi8kYWNfdW5pcXVlX2ZpbGUpIDI+L2Rldi9udWxsIHx8CisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3NyY2Rpcj1gZWNobyAiJHNyY2RpciIgfCBzZWQgJ3MlXChbXlxcL11cKVtcXC9dKiQlXDElJ2AKK2FjX2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19jdl9lbnZfYnVpbGRfYWxpYXNfc2V0PSR7YnVpbGRfYWxpYXMrc2V0fQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPSRidWlsZF9hbGlhcworYWNfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfY3ZfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19jdl9lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfZW52X3RhcmdldF9hbGlhc19zZXQ9JHt0YXJnZXRfYWxpYXMrc2V0fQorYWNfZW52X3RhcmdldF9hbGlhc192YWx1ZT0kdGFyZ2V0X2FsaWFzCithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19lbnZfQ0NfdmFsdWU9JENDCithY19jdl9lbnZfQ0Nfc2V0PSR7Q0Mrc2V0fQorYWNfY3ZfZW52X0NDX3ZhbHVlPSRDQworYWNfZW52X0NGTEFHU19zZXQ9JHtDRkxBR1Mrc2V0fQorYWNfZW52X0NGTEFHU192YWx1ZT0kQ0ZMQUdTCithY19jdl9lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19jdl9lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2N2X2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfY3ZfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19jdl9lbnZfQ1BQRkxBR1Nfc2V0PSR7Q1BQRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NQUEZMQUdTX3ZhbHVlPSRDUFBGTEFHUworYWNfZW52X0NYWF9zZXQ9JHtDWFgrc2V0fQorYWNfZW52X0NYWF92YWx1ZT0kQ1hYCithY19jdl9lbnZfQ1hYX3NldD0ke0NYWCtzZXR9CithY19jdl9lbnZfQ1hYX3ZhbHVlPSRDWFgKK2FjX2Vudl9DWFhGTEFHU19zZXQ9JHtDWFhGTEFHUytzZXR9CithY19lbnZfQ1hYRkxBR1NfdmFsdWU9JENYWEZMQUdTCithY19jdl9lbnZfQ1hYRkxBR1Nfc2V0PSR7Q1hYRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NYWEZMQUdTX3ZhbHVlPSRDWFhGTEFHUworYWNfZW52X0NYWENQUF9zZXQ9JHtDWFhDUFArc2V0fQorYWNfZW52X0NYWENQUF92YWx1ZT0kQ1hYQ1BQCithY19jdl9lbnZfQ1hYQ1BQX3NldD0ke0NYWENQUCtzZXR9CithY19jdl9lbnZfQ1hYQ1BQX3ZhbHVlPSRDWFhDUFAKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworX0FDRU9GCisKKyAgY2F0IDw8X0FDRU9GCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorCQkJICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbUFJFRklYL21hbl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKKworWCBmZWF0dXJlczoKKyAgLS14LWluY2x1ZGVzPURJUiAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCisKK1N5c3RlbSB0eXBlczoKKyAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKyAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCisKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0tZW5hYmxlLXZuY2NvbmZpZyAgICAgIGJ1aWxkIHRoZSB2bmNjb25maWcgdXRpbGl0eSAoYXNzdW1lZCBieSBkZWZhdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIC0tZGlzYWJsZS12bmNjb25maWcgdG8gc2tpcCBidWlsZGluZyB2bmNjb25maWcKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorICAtLWRpc2FibGUtcnBhdGggICAgICAgICBkbyBub3QgaGFyZGNvZGUgcnVudGltZSBsaWJyYXJ5IHBhdGhzCisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbQorICAtLXdpdGgtaW5zdGFsbGVkLXpsaWIgICB1c2UgdGhlIHZlcnNpb24gb2YgemxpYiB3aGljaCBpcyBpbnN0YWxsZWQgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBpbnN0ZWFkIG9mIHRoZSBvbmUgZGlzdHJpYnV0ZWQgd2l0aCBWTkMKKyAgLS13aXRoLWluc3RhbGxlZC1qcGVnICAgdXNlIHRoZSB2ZXJzaW9uIG9mIGpwZWcgd2hpY2ggaXMgaW5zdGFsbGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gaW5zdGVhZCBvZiB0aGUgb25lIGRpc3RyaWJ1dGVkIHdpdGggVk5DCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBkZWZhdWx0PW5vCisgIC0td2l0aC1saWJpY29udi1wcmVmaXhbPURJUl0gIHNlYXJjaCBmb3IgbGliaWNvbnYgaW4gRElSL2luY2x1ZGUgYW5kIERJUi9saWIKKyAgLS13aXRob3V0LWxpYmljb252LXByZWZpeCAgICAgZG9uJ3Qgc2VhcmNoIGZvciBsaWJpY29udiBpbiBpbmNsdWRlZGlyIGFuZCBsaWJkaXIKKyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUKKyAgLS13aXRoLWxpYmludGwtcHJlZml4Wz1ESVJdICBzZWFyY2ggZm9yIGxpYmludGwgaW4gRElSL2luY2x1ZGUgYW5kIERJUi9saWIKKyAgLS13aXRob3V0LWxpYmludGwtcHJlZml4ICAgICBkb24ndCBzZWFyY2ggZm9yIGxpYmludGwgaW4gaW5jbHVkZWRpciBhbmQgbGliZGlyCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCisgICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDWFggICAgICAgICBDKysgY29tcGlsZXIgY29tbWFuZAorICBDWFhGTEFHUyAgICBDKysgY29tcGlsZXIgZmxhZ3MKKyAgQ1hYQ1BQICAgICAgQysrIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgYWNfcG9wZGlyPWBwd2RgCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAkYWNfZGlyIHx8IGNvbnRpbnVlCisgICAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKyAgICBjZCAkYWNfZGlyCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmdudTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlLmdudSAgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmFjIHx8CisJICAgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgorICAgICAgZWNobworICAgICAgJGFjX2NvbmZpZ3VyZSAtLWhlbHAKKyAgICBlbHNlCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgMAoraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcX0FDRU9GCisKK0NvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdCAwCitmaQorZXhlYyA1PmNvbmZpZy5sb2cKK2NhdCA+JjUgPDxfQUNFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitfQUNFT0YKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAoraG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGVjaG8gIlBBVEg6ICRhc19kaXIiCitkb25lCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX3NlcD0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhY19jb25maWd1cmVfYXJnczA9IiRhY19jb25maWd1cmVfYXJnczAgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhY19jb25maWd1cmVfYXJnczE9IiRhY19jb25maWd1cmVfYXJnczEgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MkYWNfc2VwJyRhY19hcmcnIgorICAgICAgIyBHZXQgcmlkIG9mIHRoZSBsZWFkaW5nIHNwYWNlLgorICAgICAgYWNfc2VwPSIgIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKKyRhc191bnNldCBhY19jb25maWd1cmVfYXJnczAgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczArc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MwPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMDsgfQorJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMSB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMStzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczE9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MxOyB9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogQmUgc3VyZSBub3QgdG8gdXNlIHNpbmdsZSBxdW90ZXMgaW4gdGhlcmUsIGFzIHNvbWUgc2hlbGxzLAorIyBzdWNoIGFzIG91ciBEVSA1LjAgZnJpZW5kLCB3aWxsIHRoZW4gYGNsb3NlJyB0aGUgdHJhcC4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICB7CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCit7CisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgYChhY19zcGFjZT0nIiciJyAnIiciJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgICAqYWNfc3BhY2U9XCAqKQorICAgICAgc2VkIC1uIFwKKwkicy8nIiciJy8nIiciJ1xcXFwnIiciJyciJyInL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSciJyInXFwyJyInIicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNlZCAtbiBcCisJInMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9XFwyL3AiCisgICAgICA7OworICAgIGVzYWM7Cit9CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgICAgICBlY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgIGRvbmUgfCBzb3J0CisgICAgZWNobworCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IGZpbGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICBlY2hvCisgICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcworICAgICAgZG8KKwlldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKwllY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIHNlZCAiL14kL2QiIGNvbmZkZWZzLmggfCBzb3J0CisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICBlY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorICB9ID4mNQorICBybSAtZiBjb3JlICouY29yZSAmJgorICBybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisgICAgICcgMAorZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisgIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAorZG9uZQorYWNfc2lnbmFsPTAKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID5jb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKyAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAkY2FjaGVfZmlsZTs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuIC4vJGNhY2hlX2ZpbGU7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwKKwkgICAgICAgc2VkIC1uICdzL15hY19lbnZfXChbYS16QS1aXzAtOV0qXClfc2V0PS4qL1wxL3AnYDsgZG8KKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19vbGRfdmFsPSJcJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGV2YWwgYWNfbmV3X3ZhbD0iXCRhY19lbnZfJHthY192YXJ9X3ZhbHVlIgorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjI7fQorCWFjX2NhY2hlX2NvcnJ1cHRlZD06CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCisgICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK1BBQ0tBR0U9dGlnaHR2bmMKK1ZFUlNJT049MS41LjAKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKK19BQ0VPRgorCisKKworCithY19jdl9wcm9nX2NjX2c9bm8KK2FjX2N2X3Byb2dfY3h4X2c9bm8KKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBDQz0kYWNfY3RfQ0MKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIENDPSRhY19jdF9DQworZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbAorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIENDPSRhY19jdF9DQworZmkKKworZmkKKworCit0ZXN0IC16ICIkQ0MiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KK2VjaG8gIiRhc19tZTokTElORU5POiIgXAorICAgICAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CithY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtdiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtdiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLVYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLVYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIGIub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICRFQ0hPX0MiID4mNgorYWNfbGlua19kZWZhdWx0PWBlY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua19kZWZhdWx0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmtfZGVmYXVsdCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAjIEZpbmQgdGhlIG91dHB1dCwgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBsaWtlbHkuICBUaGlzIHNjaGVtZSBpcworIyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikgb25seSBhcyBhIGxhc3QKKyMgcmVzb3J0LgorCisjIEJlIGNhcmVmdWwgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhcmlhYmxlLCBzaW5jZSBpdCB1c2VkIHRvIGJlIGNhY2hlZC4KKyMgT3RoZXJ3aXNlIGFuIG9sZCBjYWNoZSB2YWx1ZSBvZiBgbm8nIGxlZCB0byBgRVhFRVhUID0gbm8nIGluIGEgTWFrZWZpbGUuCithY19jdl9leGVleHQ9CisjIGIub3V0IGlzIGNyZWF0ZWQgYnkgaTk2MCBjb21waWxlcnMuCitmb3IgYWNfZmlsZSBpbiBhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0CitkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5vIHwgKi5vYmogKQorCTs7CisgICAgY29uZnRlc3QuJGFjX2V4dCApCisJIyBUaGlzIGlzIHRoZSBzb3VyY2UgZmlsZS4KKwk7OworICAgIFthYl0ub3V0ICkKKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorCSMgY2VydGFpbmx5IHJpZ2h0LgorCWJyZWFrOzsKKyAgICAqLiogKQorCWFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSMgRklYTUU6IEkgYmVsaWV2ZSB3ZSBleHBvcnQgYWNfY3ZfZXhlZXh0IGZvciBMaWJ0b29sLAorCSMgYnV0IGl0IHdvdWxkIGJlIGNvb2wgdG8gZmluZCBvdXQgaWYgaXQncyB0cnVlLiAgRG9lcyBhbnlib2R5CisJIyBtYWludGFpbiBMaWJ0b29sPyAtLWFraW0uCisJZXhwb3J0IGFjX2N2X2V4ZWV4dAorCWJyZWFrOzsKKyAgICAqICkKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KK2ZpCisKK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2CisKKyMgQ2hlY2sgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNgorIyBGSVhNRTogVGhlc2UgY3Jvc3MgY29tcGlsZXIgaGFja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIEF1dG9jb25mIDMuMAorIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICBpZiB7IGFjX3RyeT0nLi8kYWNfZmlsZScKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBlbHNlCisJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgZmkKKyAgZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKworcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICRFQ0hPX0MiID4mNgorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1CitlY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjYKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQorIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorIyBgcm0nLgorZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJICBleHBvcnQgYWNfY3ZfZXhlZXh0CisJICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNgorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgZm9yIGFjX2ZpbGUgaW4gYChscyBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iajsgbHMgY29uZnRlc3QuKikgMj4vZGV2L251bGxgOyBkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgKSA7OworICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAorICAgICAgIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9vYmpleHQiID4mNgorT0JKRVhUPSRhY19jdl9vYmpleHQKK2FjX29iamV4dD0kT0JKRVhUCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjYKK0dDQz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworQ0ZMQUdTPSItZyIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfZyIgPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19zdGRjK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZDEgaXMgYWRkZWQgdG8gZ2V0CisgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCisgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkMS4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorIyBEb24ndCB0cnkgZ2NjIC1hbnNpOyB0aGF0IHR1cm5zIG9mZiB1c2VmdWwgZXh0ZW5zaW9ucyBhbmQKKyMgYnJlYWtzIHNvbWUgc3lzdGVtcycgaGVhZGVyIGZpbGVzLgorIyBBSVgJCQktcWxhbmdsdmw9YW5zaQorIyBVbHRyaXggYW5kIE9TRi8xCS1zdGQxCisjIEhQLVVYIDEwLjIwIGFuZCBsYXRlcgktQWUKKyMgSFAtVVggb2xkZXIgdmVyc2lvbnMJLUFhIC1EX0hQVVhfU09VUkNFCisjIFNWUjQJCQktWGMgLURfX0VYVEVOU0lPTlNfXworZm9yIGFjX2FyZyBpbiAiIiAtcWxhbmdsdmw9YW5zaSAtc3RkMSAtQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorZG8KKyAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19zdGRjPSRhY19hcmcKK2JyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdC4kYWNfb2JqZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorCitjYXNlICJ4JGFjX2N2X3Byb2dfY2Nfc3RkYyIgaW4KKyAgeHx4bm8pCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNiA7OworICAqKQorICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY2CisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19zdGRjIiA7OworZXNhYworCisjIFNvbWUgcGVvcGxlIHVzZSBhIEMrKyBjb21waWxlciB0byBjb21waWxlIEMuICBTaW5jZSB3ZSB1c2UgYGV4aXQnLAorIyBpbiBDKysgd2UgbmVlZCB0byBkZWNsYXJlIGl0LiAgSW4gY2FzZSBzb21lb25lIHVzZXMgdGhlIHNhbWUgY29tcGlsZXIKKyMgZm9yIGJvdGggY29tcGlsaW5nIEMgYW5kIEMrKyB3ZSBuZWVkIHRvIGhhdmUgdGhlIEMrKyBjb21waWxlciBkZWNpZGUKKyMgdGhlIGRlY2xhcmF0aW9uIG9mIGV4aXQsIHNpbmNlIGl0J3MgdGhlIG1vc3QgZGVtYW5kaW5nIGVudmlyb25tZW50LgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisgIGNob2tlIG1lCisjZW5kaWYKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBmb3IgYWNfZGVjbGFyYXRpb24gaW4gXAorICAgJycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCkgdGhyb3cgKCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCkgdGhyb3cgKCk7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7JyBcCisgICAndm9pZCBleGl0IChpbnQpOycKK2RvCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19kZWNsYXJhdGlvbgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0KgoraWYgdGVzdCAtbiAiJGFjX2RlY2xhcmF0aW9uIjsgdGhlbgorICBlY2hvICcjaWZkZWYgX19jcGx1c3BsdXMnID4+Y29uZmRlZnMuaAorICBlY2hvICRhY19kZWNsYXJhdGlvbiAgICAgID4+Y29uZmRlZnMuaAorICBlY2hvICcjZW5kaWYnICAgICAgICAgICAgID4+Y29uZmRlZnMuaAorZmkKKworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCithY19leHQ9Y2MKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluICRDQ0MgZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQworICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NYWD0kYWNfY3ZfcHJvZ19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JENYWCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKyAgYWNfY3RfQ1hYPSRDWFgKKyAgZm9yIGFjX3Byb2cgaW4gJENDQyBnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19jdF9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DWFg9JGFjX2N2X3Byb2dfYWNfY3RfQ1hYCitpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkYWNfY3RfQ1hYIiB8fCBhY19jdF9DWFg9ImcrKyIKKworICBDWFg9JGFjX2N0X0NYWAorZmkKKworCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6JExJTkVOTzoiIFwKKyAgICAgImNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1CithY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtdiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtdiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLVYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLVYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2N4eF9jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jeHhfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjYKK0dYWD1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAorYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KK2FjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCitDWFhGTEFHUz0iLWciCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jeHhfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X3Byb2dfY3h4X2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY3h4X2ciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY3h4X2ciID4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCisgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0KKyAgZmkKK2ZpCitmb3IgYWNfZGVjbGFyYXRpb24gaW4gXAorICAgJycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCkgdGhyb3cgKCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCkgdGhyb3cgKCk7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7JyBcCisgICAndm9pZCBleGl0IChpbnQpOycKK2RvCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgLW4gIiRhY19kZWNsYXJhdGlvbiI7IHRoZW4KKyAgZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKKyAgZWNobyAkYWNfZGVjbGFyYXRpb24gICAgICA+PmNvbmZkZWZzLmgKKyAgZWNobyAnI2VuZGlmJyAgICAgICAgICAgICA+PmNvbmZkZWZzLmgKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRSQU5MSUIiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIiICYmIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSI6IgorZmkKK2ZpCithY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCitpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9SQU5MSUIiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIFJBTkxJQj0kYWNfY3RfUkFOTElCCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNgorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5LDouLystLF9fX3BfLCdgCitpZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0K3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJChNQUtFKSInCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5tYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2FjX2V4dD1jYworYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCitjYXNlICJgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIiBpbgorIlN1bk9TIDUiKikKKyAgU09MQVJJUz15ZXMKKyAgVVNFX01JVFNITT15ZXMKKyAgVVNFX1NVTl9PVkw9eWVzCisgIDs7CisiTGludXgiKikKKyAgTElOVVg9eWVzCisgIFVTRV9NSVRTSE09eWVzCisgIDs7CisiSVJJWCA2IiopCisgIFhfTElCUz0iLUwvdXNyL2xpYjMyIgorICBVU0VfTUlUU0hNPXllcworICBVU0VfUkVBRERJU1BMQVk9eWVzCisgIDs7CisiTHlueE9TIDIiKikKKyAgU0pMSl9FWENFUFRJT05TPXllcworICA7OworZXNhYworCitpZiB0ZXN0ICIkVVNFX01JVFNITSIgPSB5ZXM7IHRoZW4KKyAgTUlUU0hNX0RFRklORT0iLURIQVZFX01JVFNITSIKK2ZpCisKKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgorICBpZiB0ZXN0ICIkU09MQVJJUyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9IiRDRkxBR1MgLVduby11bmtub3duLXByYWdtYXMgLVduby1pbXBsaWNpdC1pbnQiCisgIGZpCitmaQoraWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtV2FsbCIKKyAgaWYgdGVzdCAiJFNPTEFSSVMiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtV25vLXVua25vd24tcHJhZ21hcyAtZnBlcm1pc3NpdmUiCisgIGZpCisgIGlmIHRlc3QgIiRTSkxKX0VYQ0VQVElPTlMiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZnNqbGotZXhjZXB0aW9ucyIKKyAgZmkKK2ZpCisKKworYWNfZXh0PWNjCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWENQUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1hYQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENYWENQUCBpbiAiJENYWCAtRSIgIi9saWIvY3BwIgorICAgIGRvCisgICAgICBhY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2N4eF93ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgYnJlYWsKK2ZpCisKKyAgICBkb25lCisgICAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorCitmaQorICBDWFhDUFA9JGFjX2N2X3Byb2dfQ1hYQ1BQCitlbHNlCisgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYQ1BQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFhDUFAiID4mNgorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbi1leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY3h4X3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisgIDoKK2Vsc2UKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQysrIHByZXByb2Nlc3NvciBcIiRDWFhDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWNjCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgWCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBYLi4uICRFQ0hPX0MiID4mNgorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgteCBvciAtLXdpdGhvdXQteCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfeCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF94IgorCitmaTsKKyMgJGhhdmVfeCBpcyBgeWVzJywgYG5vJywgYGRpc2FibGVkJywgb3IgZW1wdHkgd2hlbiB3ZSBkbyBub3QgeWV0IGtub3cuCitpZiB0ZXN0ICJ4JHdpdGhfeCIgPSB4bm87IHRoZW4KKyAgIyBUaGUgdXNlciBleHBsaWNpdGx5IGRpc2FibGVkIFguCisgIGhhdmVfeD1kaXNhYmxlZAorZWxzZQorICBpZiB0ZXN0ICJ4JHhfaW5jbHVkZXMiICE9IHhOT05FICYmIHRlc3QgIngkeF9saWJyYXJpZXMiICE9IHhOT05FOyB0aGVuCisgICAgIyBCb3RoIHZhcmlhYmxlcyBhcmUgYWxyZWFkeSBzZXQuCisgICAgaGF2ZV94PXllcworICBlbHNlCisgICAgaWYgdGVzdCAiJHthY19jdl9oYXZlX3grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgIyBPbmUgb3IgYm90aCBvZiB0aGUgdmFycyBhcmUgbm90IHNldCwgYW5kIHRoZXJlIGlzIG5vIGNhY2hlZCB2YWx1ZS4KK2FjX3hfaW5jbHVkZXM9bm8gYWNfeF9saWJyYXJpZXM9bm8KK3JtIC1mciBjb25mdGVzdC5kaXIKK2lmIG1rZGlyIGNvbmZ0ZXN0LmRpcjsgdGhlbgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBNYWtlIHN1cmUgdG8gbm90IHB1dCAibWFrZSIgaW4gdGhlIEltYWtlZmlsZSBydWxlcywgc2luY2Ugd2UgZ3JlcCBpdCBvdXQuCisgIGNhdCA+SW1ha2VmaWxlIDw8J19BQ0VPRicKK2FjZmluZHg6CisJQGVjaG8gJ2FjX2ltX2luY3Jvb3Q9IiR7SU5DUk9PVH0iOyBhY19pbV91c3JsaWJkaXI9IiR7VVNSTElCRElSfSI7IGFjX2ltX2xpYmRpcj0iJHtMSUJESVJ9IicKK19BQ0VPRgorICBpZiAoeG1rbWYpID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgdGVzdCAtZiBNYWtlZmlsZTsgdGhlbgorICAgICMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorICAgIGV2YWwgYCR7TUFLRS1tYWtlfSBhY2ZpbmR4IDI+L2Rldi9udWxsIHwgZ3JlcCAtdiBtYWtlYAorICAgICMgT3BlbiBXaW5kb3dzIHhta21mIHJlcG9ydGVkbHkgc2V0cyBMSUJESVIgaW5zdGVhZCBvZiBVU1JMSUJESVIuCisgICAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsOyBkbworICAgICAgaWYgdGVzdCAhIC1mICRhY19pbV91c3JsaWJkaXIvbGliWDExLiRhY19leHRlbnNpb24gJiYKKwkgdGVzdCAtZiAkYWNfaW1fbGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uOyB0aGVuCisJYWNfaW1fdXNybGliZGlyPSRhY19pbV9saWJkaXI7IGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICAjIFNjcmVlbiBvdXQgYm9ndXMgdmFsdWVzIGZyb20gdGhlIGltYWtlIGNvbmZpZ3VyYXRpb24uICBUaGV5IGFyZQorICAgICMgYm9ndXMgYm90aCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBkZWZhdWx0IGFueXdheSwgYW5kIGJlY2F1c2UKKyAgICAjIHVzaW5nIHRoZW0gd291bGQgYnJlYWsgZ2NjIG9uIHN5c3RlbXMgd2hlcmUgaXQgbmVlZHMgZml4ZWQgaW5jbHVkZXMuCisgICAgY2FzZSAkYWNfaW1faW5jcm9vdCBpbgorCS91c3IvaW5jbHVkZSkgOzsKKwkqKSB0ZXN0IC1mICIkYWNfaW1faW5jcm9vdC9YMTEvWG9zLmgiICYmIGFjX3hfaW5jbHVkZXM9JGFjX2ltX2luY3Jvb3Q7OworICAgIGVzYWMKKyAgICBjYXNlICRhY19pbV91c3JsaWJkaXIgaW4KKwkvdXNyL2xpYiB8IC9saWIpIDs7CisJKikgdGVzdCAtZCAiJGFjX2ltX3VzcmxpYmRpciIgJiYgYWNfeF9saWJyYXJpZXM9JGFjX2ltX3VzcmxpYmRpciA7OworICAgIGVzYWMKKyAgZmkKKyAgY2QgLi4KKyAgcm0gLWZyIGNvbmZ0ZXN0LmRpcgorZmkKKworIyBTdGFuZGFyZCBzZXQgb2YgY29tbW9uIGRpcmVjdG9yaWVzIGZvciBYIGhlYWRlcnMuCisjIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KK2FjX3hfaGVhZGVyX2RpcnM9JworL3Vzci9YMTEvaW5jbHVkZQorL3Vzci9YMTFSNi9pbmNsdWRlCisvdXNyL1gxMVI1L2luY2x1ZGUKKy91c3IvWDExUjQvaW5jbHVkZQorCisvdXNyL2luY2x1ZGUvWDExCisvdXNyL2luY2x1ZGUvWDExUjYKKy91c3IvaW5jbHVkZS9YMTFSNQorL3Vzci9pbmNsdWRlL1gxMVI0CisKKy91c3IvbG9jYWwvWDExL2luY2x1ZGUKKy91c3IvbG9jYWwvWDExUjYvaW5jbHVkZQorL3Vzci9sb2NhbC9YMTFSNS9pbmNsdWRlCisvdXNyL2xvY2FsL1gxMVI0L2luY2x1ZGUKKworL3Vzci9sb2NhbC9pbmNsdWRlL1gxMQorL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI2CisvdXNyL2xvY2FsL2luY2x1ZGUvWDExUjUKKy91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNAorCisvdXNyL1gzODYvaW5jbHVkZQorL3Vzci94Mzg2L2luY2x1ZGUKKy91c3IvWEZyZWU4Ni9pbmNsdWRlL1gxMQorCisvdXNyL2luY2x1ZGUKKy91c3IvbG9jYWwvaW5jbHVkZQorL3Vzci91bnN1cHBvcnRlZC9pbmNsdWRlCisvdXNyL2F0aGVuYS9pbmNsdWRlCisvdXNyL2xvY2FsL3gxMXI1L2luY2x1ZGUKKy91c3IvbHBwL1hhbXBsZXMvaW5jbHVkZQorCisvdXNyL29wZW53aW4vaW5jbHVkZQorL3Vzci9vcGVud2luL3NoYXJlL2luY2x1ZGUnCisKK2lmIHRlc3QgIiRhY194X2luY2x1ZGVzIiA9IG5vOyB0aGVuCisgICMgR3Vlc3Mgd2hlcmUgdG8gZmluZCBpbmNsdWRlIGZpbGVzLCBieSBsb29raW5nIGZvciBJbnRyaW5zaWMuaC4KKyAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2N4eF93ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgIyBXZSBjYW4gY29tcGlsZSB1c2luZyBYIGhlYWRlcnMgd2l0aCBubyBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5LgorYWNfeF9pbmNsdWRlcz0KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBmb3IgYWNfZGlyIGluICRhY194X2hlYWRlcl9kaXJzOyBkbworICBpZiB0ZXN0IC1yICIkYWNfZGlyL1gxMS9JbnRyaW5zaWMuaCI7IHRoZW4KKyAgICBhY194X2luY2x1ZGVzPSRhY19kaXIKKyAgICBicmVhaworICBmaQorZG9uZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitmaSAjICRhY194X2luY2x1ZGVzID0gbm8KKworaWYgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IG5vOyB0aGVuCisgICMgQ2hlY2sgZm9yIHRoZSBsaWJyYXJpZXMuCisgICMgU2VlIGlmIHdlIGZpbmQgdGhlbSB3aXRob3V0IGFueSBzcGVjaWFsIG9wdGlvbnMuCisgICMgRG9uJ3QgYWRkIHRvICRMSUJTIHBlcm1hbmVudGx5LgorICBhY19zYXZlX0xJQlM9JExJQlMKKyAgTElCUz0iLWxYdCAkTElCUyIKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgoraW50CittYWluICgpCit7CitYdE1hbGxvYyAoMCkKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIExJQlM9JGFjX3NhdmVfTElCUworIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCithY194X2xpYnJhcmllcz0KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworTElCUz0kYWNfc2F2ZV9MSUJTCitmb3IgYWNfZGlyIGluIGBlY2hvICIkYWNfeF9pbmNsdWRlcyAkYWNfeF9oZWFkZXJfZGlycyIgfCBzZWQgcy9pbmNsdWRlL2xpYi9nYAorZG8KKyAgIyBEb24ndCBldmVuIGF0dGVtcHQgdGhlIGhhaXIgb2YgdHJ5aW5nIHRvIGxpbmsgYW4gWCBwcm9ncmFtIQorICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2w7IGRvCisgICAgaWYgdGVzdCAtciAkYWNfZGlyL2xpYlh0LiRhY19leHRlbnNpb247IHRoZW4KKyAgICAgIGFjX3hfbGlicmFyaWVzPSRhY19kaXIKKyAgICAgIGJyZWFrIDIKKyAgICBmaQorICBkb25lCitkb25lCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpICMgJGFjX3hfbGlicmFyaWVzID0gbm8KKworaWYgdGVzdCAiJGFjX3hfaW5jbHVkZXMiID0gbm8gfHwgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IG5vOyB0aGVuCisgICMgRGlkbid0IGZpbmQgWCBhbnl3aGVyZS4gIENhY2hlIHRoZSBrbm93biBhYnNlbmNlIG9mIFguCisgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PW5vIgorZWxzZQorICAjIFJlY29yZCB3aGVyZSB3ZSBmb3VuZCBYIGZvciB0aGUgY2FjaGUuCisgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllcyBcCisJCWFjX3hfaW5jbHVkZXM9JGFjX3hfaW5jbHVkZXMgYWNfeF9saWJyYXJpZXM9JGFjX3hfbGlicmFyaWVzIgorZmkKK2ZpCisKKyAgZmkKKyAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKK2ZpICMgJHdpdGhfeCAhPSBubworCitpZiB0ZXN0ICIkaGF2ZV94IiAhPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfeCIgPiY1CitlY2hvICIke0VDSE9fVH0kaGF2ZV94IiA+JjYKKyAgbm9feD15ZXMKK2Vsc2UKKyAgIyBJZiBlYWNoIG9mIHRoZSB2YWx1ZXMgd2FzIG9uIHRoZSBjb21tYW5kIGxpbmUsIGl0IG92ZXJyaWRlcyBlYWNoIGd1ZXNzLgorICB0ZXN0ICJ4JHhfaW5jbHVkZXMiID0geE5PTkUgJiYgeF9pbmNsdWRlcz0kYWNfeF9pbmNsdWRlcworICB0ZXN0ICJ4JHhfbGlicmFyaWVzIiA9IHhOT05FICYmIHhfbGlicmFyaWVzPSRhY194X2xpYnJhcmllcworICAjIFVwZGF0ZSB0aGUgY2FjaGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgY29tbWFuZCBsaW5lIHZhbHVlcy4KKyAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzIFwKKwkJYWNfeF9pbmNsdWRlcz0keF9pbmNsdWRlcyBhY194X2xpYnJhcmllcz0keF9saWJyYXJpZXMiCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGxpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9bGlicmFyaWVzICR4X2xpYnJhcmllcywgaGVhZGVycyAkeF9pbmNsdWRlcyIgPiY2CitmaQorCitpZiB0ZXN0ICIkbm9feCIgPSB5ZXM7IHRoZW4KKyAgIyBOb3QgYWxsIHByb2dyYW1zIG1heSB1c2UgdGhpcyBzeW1ib2wsIGJ1dCBpdCBkb2VzIG5vdCBodXJ0IHRvIGRlZmluZSBpdC4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgWF9ESVNQTEFZX01JU1NJTkcgMQorX0FDRU9GCisKKyAgWF9DRkxBR1M9IFhfUFJFX0xJQlM9IFhfTElCUz0gWF9FWFRSQV9MSUJTPQorZWxzZQorICBpZiB0ZXN0IC1uICIkeF9pbmNsdWRlcyI7IHRoZW4KKyAgICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1JJHhfaW5jbHVkZXMiCisgIGZpCisKKyAgIyBJdCB3b3VsZCBhbHNvIGJlIG5pY2UgdG8gZG8gdGhpcyBmb3IgYWxsIC1MIG9wdGlvbnMsIG5vdCBqdXN0IHRoaXMgb25lLgorICBpZiB0ZXN0IC1uICIkeF9saWJyYXJpZXMiOyB0aGVuCisgICAgWF9MSUJTPSIkWF9MSUJTIC1MJHhfbGlicmFyaWVzIgorICAgICMgRm9yIFNvbGFyaXM7IHNvbWUgdmVyc2lvbnMgb2YgU3VuIENDIHJlcXVpcmUgYSBzcGFjZSBhZnRlciAtUiBhbmQKKyAgICAjIG90aGVycyByZXF1aXJlIG5vIHNwYWNlLiAgV29yZHMgYXJlIG5vdCBzdWZmaWNpZW50IC4gLiAuIC4KKyAgICBjYXNlIGAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAgaW4KKyAgICAiU3VuT1MgNSIqKQorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UuLi4gJEVDSE9fQyIgPiY2CisgICAgICBhY194c2F2ZV9MSUJTPSRMSUJTOyBMSUJTPSIkTElCUyAtUiR4X2xpYnJhcmllcyIKKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfUl9ub3NwYWNlPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19SX25vc3BhY2U9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgaWYgdGVzdCAkYWNfUl9ub3NwYWNlID0geWVzOyB0aGVuCisJZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCVhfTElCUz0iJFhfTElCUyAtUiR4X2xpYnJhcmllcyIKKyAgICAgIGVsc2UKKwlMSUJTPSIkYWNfeHNhdmVfTElCUyAtUiAkeF9saWJyYXJpZXMiCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19SX3NwYWNlPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19SX3NwYWNlPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwlpZiB0ZXN0ICRhY19SX3NwYWNlID0geWVzOyB0aGVuCisJICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKwkgIFhfTElCUz0iJFhfTElCUyAtUiAkeF9saWJyYXJpZXMiCisJZWxzZQorCSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbmVpdGhlciB3b3JrcyIgPiY1CitlY2hvICIke0VDSE9fVH1uZWl0aGVyIHdvcmtzIiA+JjYKKwlmaQorICAgICAgZmkKKyAgICAgIExJQlM9JGFjX3hzYXZlX0xJQlMKKyAgICBlc2FjCisgIGZpCisKKyAgIyBDaGVjayBmb3Igc3lzdGVtLWRlcGVuZGVudCBsaWJyYXJpZXMgWCBwcm9ncmFtcyBtdXN0IGxpbmsgd2l0aC4KKyAgIyBEbyB0aGlzIGJlZm9yZSBjaGVja2luZyBmb3IgdGhlIHN5c3RlbS1pbmRlcGVuZGVudCBSNiBsaWJyYXJpZXMKKyAgIyAoLWxJQ0UpLCBzaW5jZSB3ZSBtYXkgbmVlZCAtbHNvY2tldCBvciB3aGF0ZXZlciBmb3IgWCBsaW5raW5nLgorCisgIGlmIHRlc3QgIiRJU0MiID0geWVzOyB0aGVuCisgICAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sbnNsX3MgLWxpbmV0IgorICBlbHNlCisgICAgIyBNYXJ0eW4gSm9obnNvbiBzYXlzIHRoaXMgaXMgbmVlZGVkIGZvciBVbHRyaXgsIGlmIHRoZSBYCisgICAgIyBsaWJyYXJpZXMgd2VyZSBidWlsdCB3aXRoIERFQ25ldCBzdXBwb3J0LiAgQW5kIEthcmwgQmVycnkgc2F5cworICAgICMgdGhlIEFscGhhIG5lZWRzIGRuZXRfc3R1YiAoZG5ldCBkb2VzIG5vdCBleGlzdCkuCisgICAgYWNfeHNhdmVfTElCUz0iJExJQlMiOyBMSUJTPSIkTElCUyAkWF9MSUJTIC1sWDExIgorICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIFhPcGVuRGlzcGxheSAoKTsKK2ludAorbWFpbiAoKQoreworWE9wZW5EaXNwbGF5ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZG5ldCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbmV0X250b2EgKCk7CitpbnQKK21haW4gKCkKK3sKK2RuZXRfbnRvYSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZG5ldF9kbmV0X250b2EiID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hID0geWVzOyB0aGVuCisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXQiCitmaQorCisgICAgaWYgdGVzdCAkYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hID0gbm87IHRoZW4KKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1Yi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2Erc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZG5ldF9udG9hICgpOworaW50CittYWluICgpCit7CitkbmV0X250b2EgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2E9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2EiID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2EgPSB5ZXM7IHRoZW4KKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sZG5ldF9zdHViIgorZmkKKworICAgIGZpCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBMSUJTPSIkYWNfeHNhdmVfTElCUyIKKworICAgICMgbXNoQGNpcy51ZmwuZWR1IHNheXMgLWxuc2wgKGFuZCAtbHNvY2tldCkgYXJlIG5lZWRlZCBmb3IgaGlzIDM4Ni9BVCwKKyAgICAjIHRvIGdldCB0aGUgU3lzViB0cmFuc3BvcnQgZnVuY3Rpb25zLgorICAgICMgQ2hhZCBSLiBMYXJzb24gc2F5cyB0aGUgUHlyYW1pcyBNSVMtRVMgcnVubmluZyBEQy9PU3ggKFNWUjQpCisgICAgIyBuZWVkcyAtbG5zbC4KKyAgICAjIFRoZSBuc2wgbGlicmFyeSBwcmV2ZW50cyBwcm9ncmFtcyBmcm9tIG9wZW5pbmcgdGhlIFggZGlzcGxheQorICAgICMgb24gSXJpeCA1LjIsIGFjY29yZGluZyB0byBULkUuIERpY2tleS4KKyAgICAjIFRoZSBmdW5jdGlvbnMgZ2V0aG9zdGJ5bmFtZSwgZ2V0c2VydmJ5bmFtZSwgYW5kIGluZXRfYWRkciBhcmUKKyAgICAjIGluIC1sYnNkIG9uIEx5bnhPUyAzLjAuMS9pMzg2LCBhY2NvcmRpbmcgdG8gTGFycyBIZWNraW5nLgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9mdW5jX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgZ2V0aG9zdGJ5bmFtZSB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldGhvc3RieW5hbWUuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgZ2V0aG9zdGJ5bmFtZSBpbm5vY3VvdXNfZ2V0aG9zdGJ5bmFtZQorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBnZXRob3N0YnluYW1lICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmIGdldGhvc3RieW5hbWUKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX2dldGhvc3RieW5hbWUpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2dldGhvc3RieW5hbWUpCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9IGdldGhvc3RieW5hbWU7CisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgIT0gZ2V0aG9zdGJ5bmFtZTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUiID4mNgorCisgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lID0gbm87IHRoZW4KKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxuc2wgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKK2ludAorbWFpbiAoKQoreworZ2V0aG9zdGJ5bmFtZSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUiID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lID0geWVzOyB0aGVuCisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbG5zbCIKK2ZpCisKKyAgICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCisJZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sYnNkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxic2QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGJzZCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lICgpOworaW50CittYWluICgpCit7CitnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUgPSB5ZXM7IHRoZW4KKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sYnNkIgorZmkKKworICAgICAgZmkKKyAgICBmaQorCisgICAgIyBsaWVkZXJAc2t5bGVyLm1hdmQuaG9uZXl3ZWxsLmNvbSBzYXlzIHdpdGhvdXQgLWxzb2NrZXQsCisgICAgIyBzb2NrZXQvc2V0c29ja29wdCBhbmQgb3RoZXIgcm91dGluZXMgYXJlIHVuZGVmaW5lZCB1bmRlciBTQ08gT0RUCisgICAgIyAyLjAuICBCdXQgLWxzb2NrZXQgaXMgYnJva2VuIG9uIElSSVggNS4yIChhbmQgaXMgbm90IG5lY2Vzc2FyeQorICAgICMgb24gbGF0ZXIgdmVyc2lvbnMpLCBzYXlzIFNpbW9uIExlaW5lbjogaXQgY29udGFpbnMgZ2V0aG9zdGJ5KgorICAgICMgdmFyaWFudHMgdGhhdCBkb24ndCB1c2UgdGhlIG5hbWUgc2VydmVyIChvciBzb21ldGhpbmcpLiAgLWxzb2NrZXQKKyAgICAjIG11c3QgYmUgZ2l2ZW4gYmVmb3JlIC1sbnNsIGlmIGJvdGggYXJlIG5lZWRlZC4gIFdlIGFzc3VtZSB0aGF0CisgICAgIyBpZiBjb25uZWN0IG5lZWRzIC1sbnNsLCBzbyBkb2VzIGdldGhvc3RieW5hbWUuCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjb25uZWN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNvbm5lY3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfY29ubmVjdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSBjb25uZWN0IHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgY29ubmVjdC4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSBjb25uZWN0IGlubm9jdW91c19jb25uZWN0CisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGNvbm5lY3QgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgY29ubmVjdAorCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGNvbm5lY3QgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfY29ubmVjdCkgfHwgZGVmaW5lZCAoX19zdHViX19fY29ubmVjdCkKK2Nob2tlIG1lCisjZWxzZQorY2hhciAoKmYpICgpID0gY29ubmVjdDsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSBjb25uZWN0OworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfZnVuY19jb25uZWN0PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9mdW5jX2Nvbm5lY3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX2Nvbm5lY3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfY29ubmVjdCIgPiY2CisKKyAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2Nvbm5lY3QgPSBubzsgdGhlbgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfY29ubmVjdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHNvY2tldCAkWF9FWFRSQV9MSUJTICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgY29ubmVjdCAoKTsKK2ludAorbWFpbiAoKQoreworY29ubmVjdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9zb2NrZXRfY29ubmVjdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc29ja2V0X2Nvbm5lY3QiID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX3NvY2tldF9jb25uZWN0ID0geWVzOyB0aGVuCisgIFhfRVhUUkFfTElCUz0iLWxzb2NrZXQgJFhfRVhUUkFfTElCUyIKK2ZpCisKKyAgICBmaQorCisgICAgIyBHdWlsbGVybW8gR29tZXogc2F5cyAtbHBvc2l4IGlzIG5lY2Vzc2FyeSBvbiBBL1VYLgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcmVtb3ZlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHJlbW92ZS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19yZW1vdmUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgcmVtb3ZlIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcmVtb3ZlLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lIHJlbW92ZSBpbm5vY3VvdXNfcmVtb3ZlCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHJlbW92ZSAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiByZW1vdmUKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciByZW1vdmUgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfcmVtb3ZlKSB8fCBkZWZpbmVkIChfX3N0dWJfX19yZW1vdmUpCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9IHJlbW92ZTsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSByZW1vdmU7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9mdW5jX3JlbW92ZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfZnVuY19yZW1vdmU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3JlbW92ZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19yZW1vdmUiID4mNgorCisgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19yZW1vdmUgPSBubzsgdGhlbgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3Bvc2l4X3JlbW92ZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHBvc2l4ICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHJlbW92ZSAoKTsKK2ludAorbWFpbiAoKQoreworcmVtb3ZlICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9wb3NpeF9yZW1vdmUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9wb3NpeF9yZW1vdmUiID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSA9IHllczsgdGhlbgorICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxwb3NpeCIKK2ZpCisKKyAgICBmaQorCisgICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNobWF0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNobWF0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9mdW5jX3NobWF0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lIHNobWF0IHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgc2htYXQuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgc2htYXQgaW5ub2N1b3VzX3NobWF0CisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHNobWF0ICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmIHNobWF0CisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2htYXQgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfc2htYXQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobWF0KQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSBzaG1hdDsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSBzaG1hdDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfc2htYXQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2Z1bmNfc2htYXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3NobWF0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX3NobWF0IiA+JjYKKworICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2htYXQgPSBubzsgdGhlbgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2lwY19zaG1hdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGlwYyAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzaG1hdCAoKTsKK2ludAorbWFpbiAoKQoreworc2htYXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfaXBjX3NobWF0PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9saWJfaXBjX3NobWF0PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2lwY19zaG1hdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2lwY19zaG1hdCIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfaXBjX3NobWF0ID0geWVzOyB0aGVuCisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGlwYyIKK2ZpCisKKyAgICBmaQorICBmaQorCisgICMgQ2hlY2sgZm9yIGxpYnJhcmllcyB0aGF0IFgxMVI2IFh0L1hhdyBwcm9ncmFtcyBuZWVkLgorICBhY19zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgdGVzdCAtbiAiJHhfbGlicmFyaWVzIiAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCR4X2xpYnJhcmllcyIKKyAgIyBTTSBuZWVkcyBJQ0UgdG8gKGR5bmFtaWNhbGx5KSBsaW5rIHVuZGVyIFN1bk9TIDQueCAoc28gd2UgaGF2ZSB0bworICAjIGNoZWNrIGZvciBJQ0UgZmlyc3QpLCBidXQgd2UgbXVzdCBsaW5rIGluIHRoZSBvcmRlciAtbFNNIC1sSUNFIG9yCisgICMgd2UgZ2V0IHVuZGVmaW5lZCBzeW1ib2xzLiAgU28gYXNzdW1lIHdlIGhhdmUgU00gaWYgd2UgaGF2ZSBJQ0UuCisgICMgVGhlc2UgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCBiZWZvcmUgLWxYMTEsIHVubGlrZSB0aGUgb3RoZXIKKyAgIyBsaWJyYXJpZXMgd2UgY2hlY2sgZm9yIGJlbG93LCBzbyB1c2UgYSBkaWZmZXJlbnQgdmFyaWFibGUuCisgICMgSm9obiBJbnRlcnJhbnRlLCBLYXJsIEJlcnJ5CisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxJQ0UgJFhfRVhUUkFfTElCUyAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIEljZUNvbm5lY3Rpb25OdW1iZXIgKCk7CitpbnQKK21haW4gKCkKK3sKK0ljZUNvbm5lY3Rpb25OdW1iZXIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlcj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlciA9IHllczsgdGhlbgorICBYX1BSRV9MSUJTPSIkWF9QUkVfTElCUyAtbFNNIC1sSUNFIgorZmkKKworICBMREZMQUdTPSRhY19zYXZlX0xERkxBR1MKKworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5zdGFsbGVkLXpsaWIgb3IgLS13aXRob3V0LWluc3RhbGxlZC16bGliIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbnN0YWxsZWRfemxpYitzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbnN0YWxsZWRfemxpYiIKKworZmk7CisKK2lmIHRlc3QgIiR3aXRoX2luc3RhbGxlZF96bGliIiA9IHllczsgdGhlbgorICBlY2hvICJ1c2luZyBpbnN0YWxsZWQgemxpYiIKKyAgWkxJQl9MSUI9LWx6CitlbHNlCisgIFpMSUJfRElSPXpsaWIKKyAgWkxJQl9JTkNMVURFPSctSSQodG9wX3NyY2RpcikvemxpYicKKyAgWkxJQl9MSUI9JyQodG9wX3NyY2RpcikvemxpYi9saWJ6LmEnCisgIGVjaG8gImNvbmZpZ3VyaW5nIHpsaWIuLi4iCisgIChjZCB6bGliOyAuL2NvbmZpZ3VyZSkKKyAgZWNobyAiLi4uZG9uZSBjb25maWd1cmluZyB6bGliIgorZmkKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5zdGFsbGVkLWpwZWcgb3IgLS13aXRob3V0LWluc3RhbGxlZC1qcGVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbnN0YWxsZWRfanBlZytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbnN0YWxsZWRfanBlZyIKKworZmk7CisKK2lmIHRlc3QgIiR3aXRoX2luc3RhbGxlZF9qcGVnIiA9IHllczsgdGhlbgorICBlY2hvICJ1c2luZyBpbnN0YWxsZWQganBlZyIKKyAgSlBFR19MSUI9LWxqcGVnCitlbHNlCisgIEpQRUdfRElSPWpwZWcvYnVpbGQKKyAgSlBFR19JTkNMVURFPSctSSQodG9wX3NyY2RpcikvanBlZycKKyAgSlBFR19MSUI9JyQodG9wX3NyY2RpcikvanBlZy9idWlsZC9saWJqcGVnLmEnCisgIGVjaG8gImNvbmZpZ3VyaW5nIGpwZWcuLi4iCisgIChta2RpciBqcGVnL2J1aWxkOyBjZCBqcGVnL2J1aWxkOyAuLi9jb25maWd1cmUpCisgIGVjaG8gIi4uLmRvbmUgY29uZmlndXJpbmcganBlZyIKK2ZpCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXZuY2NvbmZpZyBvciAtLWRpc2FibGUtdm5jY29uZmlnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3ZuY2NvbmZpZytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfdm5jY29uZmlnIgorCitmaTsKK2lmIHRlc3QgIiRlbmFibGVfdm5jY29uZmlnIiA9IG5vOyB0aGVuCisgIGVjaG8gInZuY2NvbmZpZyB1dGlsaXR5IHdpbGwgbm90IGJlIGJ1aWx0IgorICBWTkNDT05GSUdfRElSPQorZWxzZQorICBWTkNDT05GSUdfRElSPSd2bmNjb25maWdfdW5peCcKK2ZpCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBYVGVzdEdyYWJDb250cm9sIGluIC1sWHRzdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBYVGVzdEdyYWJDb250cm9sIGluIC1sWHRzdC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbFh0c3QgIiRYX0xJQlMiIC1sWGV4dCAtbFgxMSAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIFhUZXN0R3JhYkNvbnRyb2wgKCk7CitpbnQKK21haW4gKCkKK3sKK1hUZXN0R3JhYkNvbnRyb2wgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX1h0c3RfWFRlc3RHcmFiQ29udHJvbCIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfWHRzdF9YVGVzdEdyYWJDb250cm9sID0geWVzOyB0aGVuCisgIFVTRV9YVEVTVD15ZXMKK2Vsc2UKKyAgVVNFX1hURVNUPQorZmkKKworaWYgdGVzdCAiJFVTRV9YVEVTVCIgPSB5ZXM7IHRoZW4KKyAgWFRFU1RfREVGSU5FPSctREhBVkVfWFRFU1QnCisgIFhURVNUX0xJQj0tbFh0c3QKK2Vsc2UKKyAgZWNobyBXYXJuaW5nOiBObyBYVGVzdCBleHRlbnNpb24sIGJ1aWxkaW5nIHgwdm5jc2VydmVyIHZpZXctb25seQorICBYVEVTVF9ERUZJTkU9CisgIFhURVNUX0xJQj0KK2ZpCisKKworCitpZiB0ZXN0ICIkVVNFX1JFQURESVNQTEFZIiA9IHllczsgdGhlbgorICBSRUFERElTUExBWV9ERUZJTkU9Jy1ESEFWRV9SRUFERElTUExBWScKK2VsaWYgdGVzdCAiJFVTRV9TVU5fT1ZMIiA9IHllczsgdGhlbgorICBSRUFERElTUExBWV9ERUZJTkU9Jy1ESEFWRV9TVU5fT1ZMJworZWxzZQorICBSRUFERElTUExBWV9ERUZJTkU9CitmaQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdnNucHJpbnRmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHZzbnByaW50Zi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY192c25wcmludGYrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgdnNucHJpbnRmIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgdnNucHJpbnRmLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lIHZzbnByaW50ZiBpbm5vY3VvdXNfdnNucHJpbnRmCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHZzbnByaW50ZiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiB2c25wcmludGYKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB2c25wcmludGYgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfdnNucHJpbnRmKSB8fCBkZWZpbmVkIChfX3N0dWJfX192c25wcmludGYpCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9IHZzbnByaW50ZjsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSB2c25wcmludGY7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9mdW5jX3ZzbnByaW50Zj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfZnVuY192c25wcmludGY9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3ZzbnByaW50ZiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY192c25wcmludGYiID4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY192c25wcmludGYgPSB5ZXM7IHRoZW4KKyAgVlNOUFJJTlRGX0RFRklORT0nLURIQVZFX1ZTTlBSSU5URicKK2Vsc2UKKyAgVlNOUFJJTlRGX0RFRklORT0KK2ZpCisKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cmNhc2VjbXAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RyY2FzZWNtcC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHJjYXNlY21wK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lIHN0cmNhc2VjbXAgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBzdHJjYXNlY21wLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lIHN0cmNhc2VjbXAgaW5ub2N1b3VzX3N0cmNhc2VjbXAKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc3RyY2FzZWNtcCAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiBzdHJjYXNlY21wCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc3RyY2FzZWNtcCAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl9zdHJjYXNlY21wKSB8fCBkZWZpbmVkIChfX3N0dWJfX19zdHJjYXNlY21wKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSBzdHJjYXNlY21wOworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmICE9IHN0cmNhc2VjbXA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9mdW5jX3N0cmNhc2VjbXA9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2Z1bmNfc3RyY2FzZWNtcD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfc3RyY2FzZWNtcCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19zdHJjYXNlY21wIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfc3RyY2FzZWNtcCA9IHllczsgdGhlbgorICBTVFJDQVNFQ01QX0RFRklORT0nLURIQVZFX1NUUkNBU0VDTVAnCitlbHNlCisgIFNUUkNBU0VDTVBfREVGSU5FPQorZmkKKworCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RybmNhc2VjbXAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RybmNhc2VjbXAuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RybmNhc2VjbXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgc3RybmNhc2VjbXAgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBzdHJuY2FzZWNtcC4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSBzdHJuY2FzZWNtcCBpbm5vY3VvdXNfc3RybmNhc2VjbXAKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc3RybmNhc2VjbXAgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgc3RybmNhc2VjbXAKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzdHJuY2FzZWNtcCAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl9zdHJuY2FzZWNtcCkgfHwgZGVmaW5lZCAoX19zdHViX19fc3RybmNhc2VjbXApCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9IHN0cm5jYXNlY21wOworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmICE9IHN0cm5jYXNlY21wOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfZnVuY19zdHJuY2FzZWNtcD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfZnVuY19zdHJuY2FzZWNtcD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfc3RybmNhc2VjbXAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfc3RybmNhc2VjbXAiID4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19zdHJuY2FzZWNtcCA9IHllczsgdGhlbgorICBTVFJOQ0FTRUNNUF9ERUZJTkU9Jy1ESEFWRV9TVFJOQ0FTRUNNUCcKK2Vsc2UKKyAgU1RSTkNBU0VDTVBfREVGSU5FPQorZmkKKworCisKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSBnZXRob3N0YnluYW1lIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0aG9zdGJ5bmFtZS4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSBnZXRob3N0YnluYW1lIGlubm9jdW91c19nZXRob3N0YnluYW1lCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGdldGhvc3RieW5hbWUgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgZ2V0aG9zdGJ5bmFtZQorCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGdldGhvc3RieW5hbWUgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfZ2V0aG9zdGJ5bmFtZSkgfHwgZGVmaW5lZCAoX19zdHViX19fZ2V0aG9zdGJ5bmFtZSkKK2Nob2tlIG1lCisjZWxzZQorY2hhciAoKmYpICgpID0gZ2V0aG9zdGJ5bmFtZTsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSBnZXRob3N0YnluYW1lOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUiID4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lID0geWVzOyB0aGVuCisgIElORVRfTElCX1JFUT0KK2Vsc2UKKyAgSU5FVF9MSUJfUkVRPXllcworZmkKKworaWYgdGVzdCAiJElORVRfTElCX1JFUSIgPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sYnNkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxic2QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGJzZCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lICgpOworaW50CittYWluICgpCit7CitnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfYnNkX2dldGhvc3RieW5hbWUiID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lID0geWVzOyB0aGVuCisgIElORVRfTElCPS1sYnNkCitlbHNlCisgIElORVRfTElCPQorZmkKKworZmkKK2FjX2V4dD1jYworYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2tsZW5fdC4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitpbnQKK21haW4gKCkKK3sKK3NvY2tsZW5fdCB4OworYWNjZXB0KDAsIDAsICZ4KTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorU09DS0xFTl9UX0RFRklORT0nLURWTkNfU09DS0xFTl9UPXNvY2tsZW5fdCcKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdXNpbmcgaW50IiA+JjUKK2VjaG8gIiR7RUNIT19UfXVzaW5nIGludCIgPiY2CitTT0NLTEVOX1RfREVGSU5FPSctRFZOQ19TT0NLTEVOX1Q9aW50JworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL3NodG9vbDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIKK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4KKyAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgIGJyZWFrIDMKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKK2RvbmUKKworCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQorZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyAgICAgICAgTUtJTlNUQUxMRElSUz0KKyAgaWYgdGVzdCAtbiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgICAgY2FzZSAiJGFjX2F1eF9kaXIiIGluCisgICAgICAvKikgTUtJTlNUQUxMRElSUz0iJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICAgICopIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9idWlsZGRpcikvJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICBlc2FjCisgIGZpCisgIGlmIHRlc3QgLXogIiRNS0lOU1RBTExESVJTIjsgdGhlbgorICAgIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMiCisgIGZpCisKKworCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQuLi4gJEVDSE9fQyIgPiY2CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpOworICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkVVNFX05MUyIgPiY1CitlY2hvICIke0VDSE9fVH0kVVNFX05MUyIgPiY2CisKKworCisKKworCisjIFByZXBhcmUgUEFUSF9TRVBBUkFUT1IuCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisjIEZpbmQgb3V0IGhvdyB0byB0ZXN0IGZvciBleGVjdXRhYmxlIGZpbGVzLiBEb24ndCB1c2UgYSB6ZXJvLWJ5dGUgZmlsZSwKKyMgYXMgc3lzdGVtcyBtYXkgdXNlIG1ldGhvZHMgb3RoZXIgdGhhbiBtb2RlIGJpdHMgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFiaWxpdHkuCitjYXQgPmNvbmYkJC5maWxlIDw8X0FTRU9GCisjISAvYmluL3NoCitleGl0IDAKK19BU0VPRgorY2htb2QgK3ggY29uZiQkLmZpbGUKK2lmIHRlc3QgLXggY29uZiQkLmZpbGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAteCIKK2Vsc2UKKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorZmkKK3JtIC1mIGNvbmYkJC5maWxlCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTVNHRk1UK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICAgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgICA7OworICAqKQorICAgIGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgICBJRlM9IiRhY19zYXZlX0lGUyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgICAgaWYgJGFjX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgICBpZiAkYWNfZGlyLyRhY193b3JkIC0tc3RhdGlzdGljcyAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tc3RhdGlzdGljcyAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKTsgdGhlbgorICAgICAgICAgICAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgICAgICAgICBicmVhayAyCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgSUZTPSIkYWNfc2F2ZV9JRlMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9IjoiCisgICAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgIiRNU0dGTVQiICE9ICI6IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTVNHRk1UIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRNU0dGTVQiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HTVNHRk1UK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJEdNU0dGTVQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSRhY19jdl9wYXRoX0dNU0dGTVQKKworaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRHTVNHRk1UIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRHTVNHRk1UIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworCisKKyMgUHJlcGFyZSBQQVRIX1NFUEFSQVRPUi4KKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCisKKyMgRmluZCBvdXQgaG93IHRvIHRlc3QgZm9yIGV4ZWN1dGFibGUgZmlsZXMuIERvbid0IHVzZSBhIHplcm8tYnl0ZSBmaWxlLAorIyBhcyBzeXN0ZW1zIG1heSB1c2UgbWV0aG9kcyBvdGhlciB0aGFuIG1vZGUgYml0cyB0byBkZXRlcm1pbmUgZXhlY3V0YWJpbGl0eS4KK2NhdCA+Y29uZiQkLmZpbGUgPDxfQVNFT0YKKyMhIC9iaW4vc2gKK2V4aXQgMAorX0FTRU9GCitjaG1vZCAreCBjb25mJCQuZmlsZQoraWYgdGVzdCAteCBjb25mJCQuZmlsZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC14IgorZWxzZQorICBhY19leGVjdXRhYmxlX3A9InRlc3QgLWYiCitmaQorcm0gLWYgY29uZiQkLmZpbGUKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfWEdFVFRFWFQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICAgIDs7CisgICopCisgICAgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAgIElGUz0iJGFjX3NhdmVfSUZTIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgICBpZiAkYWNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgICAgICAgIGlmICRhY19kaXIvJGFjX3dvcmQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC0tbXNnaWQtYnVncy1hZGRyZXNzPSAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSk7IHRoZW4KKyAgICAgICAgICAgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgICAgICAgICBicmVhayAyCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgSUZTPSIkYWNfc2F2ZV9JRlMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICAgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFhHRVRURVhUIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRYR0VUVEVYVCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICBybSAtZiBtZXNzYWdlcy5wbworCisKKyMgUHJlcGFyZSBQQVRIX1NFUEFSQVRPUi4KKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCisKKyMgRmluZCBvdXQgaG93IHRvIHRlc3QgZm9yIGV4ZWN1dGFibGUgZmlsZXMuIERvbid0IHVzZSBhIHplcm8tYnl0ZSBmaWxlLAorIyBhcyBzeXN0ZW1zIG1heSB1c2UgbWV0aG9kcyBvdGhlciB0aGFuIG1vZGUgYml0cyB0byBkZXRlcm1pbmUgZXhlY3V0YWJpbGl0eS4KK2NhdCA+Y29uZiQkLmZpbGUgPDxfQVNFT0YKKyMhIC9iaW4vc2gKK2V4aXQgMAorX0FTRU9GCitjaG1vZCAreCBjb25mJCQuZmlsZQoraWYgdGVzdCAteCBjb25mJCQuZmlsZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC14IgorZWxzZQorICBhY19leGVjdXRhYmxlX3A9InRlc3QgLWYiCitmaQorcm0gLWYgY29uZiQkLmZpbGUKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dtZXJnZSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnbWVyZ2U7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTVNHTUVSR0Urc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR01FUkdFIiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgICBhY19jdl9wYXRoX01TR01FUkdFPSIkTVNHTUVSR0UiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICAgIDs7CisgICopCisgICAgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAgIElGUz0iJGFjX3NhdmVfSUZTIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgICBpZiAkYWNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgICAgICAgIGlmICRhY19kaXIvJGFjX3dvcmQgLS11cGRhdGUgLXEgL2Rldi9udWxsIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgICAgIGFjX2N2X3BhdGhfTVNHTUVSR0U9IiRhY19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgICAgICAgICBicmVhayAyCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgSUZTPSIkYWNfc2F2ZV9JRlMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR01FUkdFIiAmJiBhY19jdl9wYXRoX01TR01FUkdFPSI6IgorICAgIDs7Citlc2FjCitmaQorTVNHTUVSR0U9IiRhY19jdl9wYXRoX01TR01FUkdFIgoraWYgdGVzdCAiJE1TR01FUkdFIiAhPSAiOiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJE1TR01FUkdFIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRNU0dNRVJHRSIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKworICAgICAgaWYgdGVzdCAiJEdNU0dGTVQiICE9ICI6IjsgdGhlbgorICAgICAgICAgICAgaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAoaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICA6IDsKKyAgICBlbHNlCisgICAgICBHTVNHRk1UPWBlY2hvICIkR01TR0ZNVCIgfCBzZWQgLWUgJ3MsXi4qLywsJ2AKKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kICRHTVNHRk1UIHByb2dyYW0gaXMgbm90IEdOVSBtc2dmbXQ7IGlnbm9yZSBpdCIgPiY1CitlY2hvICIke0VDSE9fVH1mb3VuZCAkR01TR0ZNVCBwcm9ncmFtIGlzIG5vdCBHTlUgbXNnZm10OyBpZ25vcmUgaXQiID4mNgorICAgICAgR01TR0ZNVD0iOiIKKyAgICBmaQorICBmaQorCisgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorICAgICAgICAgICAgaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgIChpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC0tbXNnaWQtYnVncy1hZGRyZXNzPSAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKTsgdGhlbgorICAgICAgOiA7CisgICAgZWxzZQorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogZm91bmQgeGdldHRleHQgcHJvZ3JhbSBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiID4mNQorZWNobyAiJHtFQ0hPX1R9Zm91bmQgeGdldHRleHQgcHJvZ3JhbSBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiID4mNgorICAgICAgWEdFVFRFWFQ9IjoiCisgICAgZmkKKyAgICAgICAgcm0gLWYgbWVzc2FnZXMucG8KKyAgZmkKKworICAgICAgICAgICAgYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlZmF1bHQtMSIKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAteiAiJGFjX2N2X2J1aWxkX2FsaWFzIiAmJgorICBhY19jdl9idWlsZF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2AKK3Rlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AgfHwKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2J1aWxkIiA+JjYKK2J1aWxkPSRhY19jdl9idWlsZAorYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGFjX2N2X2J1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK3Rlc3QgLXogIiRhY19jdl9ob3N0X2FsaWFzIiAmJgorICBhY19jdl9ob3N0X2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcworYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9ob3N0X2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9ob3N0IiA+JjYKK2hvc3Q9JGFjX2N2X2hvc3QKK2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCisKKworICAgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cmVycm9yIGluIC1sY3Bvc2l4IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cmVycm9yIGluIC1sY3Bvc2l4Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfY3Bvc2l4X3N0cmVycm9yK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY3Bvc2l4ICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHN0cmVycm9yICgpOworaW50CittYWluICgpCit7CitzdHJlcnJvciAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9jcG9zaXhfc3RyZXJyb3I9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9jcG9zaXhfc3RyZXJyb3I9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfY3Bvc2l4X3N0cmVycm9yIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfY3Bvc2l4X3N0cmVycm9yIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9jcG9zaXhfc3RyZXJyb3IgPSB5ZXM7IHRoZW4KKyAgTElCUz0iJExJQlMgLWxjcG9zaXgiCitmaQorCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19lZ3JlcCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAoZ3JlcCAtRSAnKGF8YiknKSA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuIGFjX2N2X3Byb2dfZWdyZXA9J2dyZXAgLUUnCisgICAgZWxzZSBhY19jdl9wcm9nX2VncmVwPSdlZ3JlcCcKKyAgICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2VncmVwIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2VncmVwIiA+JjYKKyBFR1JFUD0kYWNfY3ZfcHJvZ19lZ3JlcAorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTTE9XRVIoYykgXAorCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKwkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCisjZW5kaWYKKworI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludAorbWFpbiAoKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIGV4aXQoMik7CisgIGV4aXQgKDApOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorX0FDRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NfY29uc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworLyogRklYTUU6IEluY2x1ZGUgdGhlIGNvbW1lbnRzIHN1Z2dlc3RlZCBieSBQYXVsLiAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOworICBjb25zdCBjaGFyc2V0IHg7CisgIC8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgY29uc3QgKmNvbnN0ICpjY3A7CisgIGNoYXIgKipwOworICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CisgIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCisgICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKKyAgICAgZXhwcmVzc2lvbiAqLworICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7CisgIGNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKyAgLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKyAgKytjY3A7CisgIHAgPSAoY2hhcioqKSBjY3A7CisgIGNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICAgIGNoYXIgKnQ7CisgICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAgICp0KysgPSAwOworICB9CisgIHsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgICAgaW50IHhbXSA9IHsyNSwgMTd9OworICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICAgKytmb287CisgIH0KKyAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgICAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgICAgaXB0ciBwID0gMDsKKyAgICArK3A7CisgIH0KKyAgeyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICAgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgICAgc3RydWN0IHMgKmI7IGItPmogPSA1OworICB9CisgIHsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgICAgY29uc3QgaW50IGZvbyA9IDEwOworICB9CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb25zdCIgPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgY29uc3QKK19BQ0VPRgorCitmaQorCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaWduZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2lnbmVkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtiaF9jdl9jX3NpZ25lZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CitzaWduZWQgY2hhciB4OworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYmhfY3ZfY19zaWduZWQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2JoX2N2X2Nfc2lnbmVkPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRiaF9jdl9jX3NpZ25lZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYmhfY3ZfY19zaWduZWQiID4mNgorICBpZiB0ZXN0ICRiaF9jdl9jX3NpZ25lZCA9IG5vOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIHNpZ25lZAorX0FDRU9GCisKKyAgZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5saW5lLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKK3R5cGVkZWYgaW50IGZvb190Oworc3RhdGljICRhY19rdyBmb29fdCBzdGF0aWNfZm9vICgpIHtyZXR1cm4gMDsgfQorJGFjX2t3IGZvb190IGZvbyAoKSB7cmV0dXJuIDA7IH0KKyNlbmRpZgorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19pbmxpbmUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfaW5saW5lIiA+JjYKKworCitjYXNlICRhY19jdl9jX2lubGluZSBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgICopCisgICAgY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KKyAgICAgIG5vKSBhY192YWw9OzsKKyAgICAgICopIGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7OworICAgIGVzYWMKKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIGlubGluZSAkYWNfdmFsCisjZW5kaWYKK19BQ0VPRgorICAgIDs7Citlc2FjCisKKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCisKKworCisKKworCisKKworCitmb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKKwkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb2ZmX3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfb2ZmX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitpZiAoKG9mZl90ICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAob2ZmX3QpKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfb2ZmX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfb2ZmX3QiID4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IHllczsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworX0FDRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNpemVfdC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaXplX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitpZiAoKHNpemVfdCAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKHNpemVfdCkpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpemVfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaXplX3QiID4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorX0FDRU9GCisKK2ZpCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworbG9uZyBsb25nIGxsID0gMUxMOyBpbnQgaSA9IDYzOworaW50CittYWluICgpCit7Citsb25nIGxvbmcgbGxtYXggPSAobG9uZyBsb25nKSAtMTsKKyAgICAgcmV0dXJuIGxsIDw8IGkgfCBsbCA+PiBpIHwgbGxtYXggLyBsbCB8IGxsbWF4ICUgbGw7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl90eXBlX2xvbmdfbG9uZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfdHlwZV9sb25nX2xvbmc9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmdfbG9uZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNgorICBpZiB0ZXN0ICRhY19jdl90eXBlX2xvbmdfbG9uZyA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0xPTkdfTE9ORyAxCitfQUNFT0YKKworICBmaQorCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGRvdWJsZS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3RfY3ZfY19sb25nX2RvdWJsZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgIGd0X2N2X2NfbG9uZ19kb3VibGU9eWVzCisgICAgIGVsc2UKKyAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworICAgICAgICAgLyogVGhlIFN0YXJkZW50IFZpc3RyYSBrbm93cyBzaXplb2YobG9uZyBkb3VibGUpLCBidXQgZG9lcyBub3Qgc3VwcG9ydCBpdC4gICovCisgICAgICAgICBsb25nIGRvdWJsZSBmb28gPSAwLjA7CisgICAgICAgICAvKiBPbiBVbHRyaXggNC4zIGNjLCBsb25nIGRvdWJsZSBpcyA0IGFuZCBkb3VibGUgaXMgOC4gICovCisgICAgICAgICBpbnQgYXJyYXkgWzIqKHNpemVvZihsb25nIGRvdWJsZSkgPj0gc2l6ZW9mKGRvdWJsZSkpIC0gMV07CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBndF9jdl9jX2xvbmdfZG91YmxlPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitndF9jdl9jX2xvbmdfZG91YmxlPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRndF9jdl9jX2xvbmdfZG91YmxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRndF9jdl9jX2xvbmdfZG91YmxlIiA+JjYKKyAgaWYgdGVzdCAkZ3RfY3ZfY19sb25nX2RvdWJsZSA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0xPTkdfRE9VQkxFIDEKK19BQ0VPRgorCisgIGZpCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igd2NoYXJfdC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3RfY3ZfY193Y2hhcl90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorICAgICAgIHdjaGFyX3QgZm9vID0gKHdjaGFyX3QpJ1wwJzsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBndF9jdl9jX3djaGFyX3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2d0X2N2X2Nfd2NoYXJfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3RfY3ZfY193Y2hhcl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRndF9jdl9jX3djaGFyX3QiID4mNgorICBpZiB0ZXN0ICRndF9jdl9jX3djaGFyX3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9XQ0hBUl9UIDEKK19BQ0VPRgorCisgIGZpCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdpbnRfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3aW50X3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2d0X2N2X2Nfd2ludF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHdjaGFyLmg+CisgICAgICAgd2ludF90IGZvbyA9ICh3Y2hhcl90KSdcMCc7CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZ3RfY3ZfY193aW50X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2d0X2N2X2Nfd2ludF90PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRndF9jdl9jX3dpbnRfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3RfY3ZfY193aW50X3QiID4mNgorICBpZiB0ZXN0ICRndF9jdl9jX3dpbnRfdCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1dJTlRfVCAxCitfQUNFT0YKKworICBmaQorCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnR0eXBlcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGludHR5cGVzLmguLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2ptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKK3VpbnRtYXhfdCBpID0gKHVpbnRtYXhfdCkgLTE7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaCIgPiY2CisgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWCAxCitfQUNFT0YKKworICBmaQorCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdGRpbnQuaCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdGRpbnQuaC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7am1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgoraW50CittYWluICgpCit7Cit1aW50bWF4X3QgaSA9ICh1aW50bWF4X3QpIC0xOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitqbV9hY19jdl9oZWFkZXJfc3RkaW50X2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oIiA+JjYKKyAgaWYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggMQorX0FDRU9GCisKKyAgZmkKKworCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludG1heF90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGludG1heF90Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtndF9jdl9jX2ludG1heF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVgKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVgKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworaW50bWF4X3QgeCA9IC0xOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZ3RfY3ZfY19pbnRtYXhfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZ3RfY3ZfY19pbnRtYXhfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3RfY3ZfY19pbnRtYXhfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3RfY3ZfY19pbnRtYXhfdCIgPiY2CisgIGlmIHRlc3QgJGd0X2N2X2NfaW50bWF4X3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9JTlRNQVhfVCAxCitfQUNFT0YKKworICBmaQorCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBwcmludGYoKSBzdXBwb3J0cyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHByaW50ZigpIHN1cHBvcnRzIFBPU0lYL1hTSSBmb3JtYXQgc3RyaW5ncy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3RfY3ZfZnVuY19wcmludGZfcG9zaXgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKworICAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2lmIGRlZmluZWQgX19OZXRCU0RfXyB8fCBkZWZpbmVkIF9NU0NfVkVSIHx8IGRlZmluZWQgX19NSU5HVzMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fCisgIG5vdHBvc2l4CisjZW5kaWYKKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibm90cG9zaXgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBndF9jdl9mdW5jX3ByaW50Zl9wb3NpeD0iZ3Vlc3Npbmcgbm8iCitlbHNlCisgIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PSJndWVzc2luZyB5ZXMiCitmaQorcm0gLWYgY29uZnRlc3QqCisKKworZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisvKiBUaGUgc3RyaW5nICIlMiRkICUxJGQiLCB3aXRoIGRvbGxhciBjaGFyYWN0ZXJzIHByb3RlY3RlZCBmcm9tIHRoZSBzaGVsbCdzCisgICBkb2xsYXIgZXhwYW5zaW9uIChwb3NzaWJseSBhbiBhdXRvY29uZiBidWcpLiAgKi8KK3N0YXRpYyBjaGFyIGZvcm1hdFtdID0geyAnJScsICcyJywgJyQnLCAnZCcsICcgJywgJyUnLCAnMScsICckJywgJ2QnLCAnXDAnIH07CitzdGF0aWMgY2hhciBidWZbMTAwXTsKK2ludCBtYWluICgpCit7CisgIHNwcmludGYgKGJ1ZiwgZm9ybWF0LCAzMywgNTUpOworICByZXR1cm4gKHN0cmNtcCAoYnVmLCAiNTUgMzMiKSAhPSAwKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3RfY3ZfZnVuY19wcmludGZfcG9zaXgiID4mNgorICBjYXNlICRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCBpbgorICAgICp5ZXMpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfUE9TSVhfUFJJTlRGIDEKK19BQ0VPRgorCisgICAgICA7OworICBlc2FjCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3dvcmtpbmdfYWxsb2NhX2grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQKK21haW4gKCkKK3sKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EgKDIgKiBzaXplb2YgKGludCkpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3Zfd29ya2luZ19hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3Zfd29ya2luZ19hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3dvcmtpbmdfYWxsb2NhX2giID4mNgoraWYgdGVzdCAkYWNfY3Zfd29ya2luZ19hbGxvY2FfaCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK19BQ0VPRgorCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhbGxvY2EuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50CittYWluICgpCit7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhICgxKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgPiY2CisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK19BQ0VPRgorCitlbHNlCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisKK0FMTE9DQT1hbGxvY2EuJGFjX29iamV4dAorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBDX0FMTE9DQSAxCitfQUNFT0YKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9vc19jcmF5K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29zX2NyYXkiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29zX2NyYXkiID4mNgoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorICBmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgICAgYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSAkYWNfZnVuYzsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitfQUNFT0YKKworICAgIGJyZWFrCitmaQorCisgIGRvbmUKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfY19zdGFja19kaXJlY3Rpb24rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2ludAorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorCitpbnQKK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24gKCkgPCAwKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY2CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorX0FDRU9GCisKKworZmkKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3RkbGliLmggdW5pc3RkLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNgorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIHRoZSBBQ19QQUNLQUdFX05BTUUgbGlzdHMuICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICApIHwKKyAgICAgIHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9ICRhY19mdW5jOworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmICE9ICRhY19mdW5jOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2V2YWwgIiRhc19hY192YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKy8qIG1hbGxvYyBtaWdodCBoYXZlIGJlZW4gcmVuYW1lZCBhcyBycGxfbWFsbG9jLiAqLworI3VuZGVmIG1hbGxvYworCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BhZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZiAhU1REQ19IRUFERVJTICYmICFIQVZFX1NURExJQl9ICitjaGFyICptYWxsb2MgKCk7CisjZW5kaWYKKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmICFIQVZFX0dFVFBBR0VTSVpFCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZiAhSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworaW50CittYWluICgpCit7CisgIGNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworICBpbnQgaSwgcGFnZXNpemU7CisgIGludCBmZDsKKworICBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOworCisgIC8qIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4gKi8KKyAgZGF0YSA9IChjaGFyICopIG1hbGxvYyAocGFnZXNpemUpOworICBpZiAoIWRhdGEpCisgICAgZXhpdCAoMSk7CisgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorICAgICooZGF0YSArIGkpID0gcmFuZCAoKTsKKyAgdW1hc2sgKDApOworICBmZCA9IGNyZWF0ICgiY29uZnRlc3QubW1hcCIsIDA2MDApOworICBpZiAoZmQgPCAwKQorICAgIGV4aXQgKDEpOworICBpZiAod3JpdGUgKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisgICAgZXhpdCAoMSk7CisgIGNsb3NlIChmZCk7CisKKyAgLyogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoIGFscmVhZHkgaGFzCisgICAgIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwgYWxzbyBtYWtlIHN1cmUgdGhhdAorICAgICB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4gICovCisgIGZkID0gb3BlbiAoImNvbmZ0ZXN0Lm1tYXAiLCBPX1JEV1IpOworICBpZiAoZmQgPCAwKQorICAgIGV4aXQgKDEpOworICBkYXRhMiA9IChjaGFyICopIG1hbGxvYyAoMiAqIHBhZ2VzaXplKTsKKyAgaWYgKCFkYXRhMikKKyAgICBleGl0ICgxKTsKKyAgZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChsb25nKSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKyAgaWYgKGRhdGEyICE9IG1tYXAgKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKyAgICBleGl0ICgxKTsKKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKyAgICAgIGV4aXQgKDEpOworCisgIC8qIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhIGRvIG5vdAorICAgICBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4gIChUaGlzIGlzIGEgYnVnIG9uCisgICAgIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKSAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKyAgZGF0YTMgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKKyAgaWYgKCFkYXRhMykKKyAgICBleGl0ICgxKTsKKyAgaWYgKHJlYWQgKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorICAgIGV4aXQgKDEpOworICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKyAgICBpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorICAgICAgZXhpdCAoMSk7CisgIGNsb3NlIChmZCk7CisgIGV4aXQgKDApOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitfQUNFT0YKKworZmkKK3JtIC1mIGNvbmZ0ZXN0Lm1tYXAKKworCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5IDIuMSBvciBuZXdlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5IDIuMSBvciBuZXdlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZ251X2xpYnJhcnlfMl8xK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKyAjaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAxKSB8fCAoX19HTElCQ19fID4gMikKKyAgTHVja3kgR05VIHVzZXIKKyAjZW5kaWYKKyNlbmRpZgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJMdWNreSBHTlUgdXNlciIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X2dudV9saWJyYXJ5XzJfMT15ZXMKK2Vsc2UKKyAgYWNfY3ZfZ251X2xpYnJhcnlfMl8xPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKKworCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZ251X2xpYnJhcnlfMl8xIiA+JjYKKworICAgIEdMSUJDMjE9IiRhY19jdl9nbnVfbGlicmFyeV8yXzEiCisKKworCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgaW50ZWdlciBkaXZpc2lvbiBieSB6ZXJvIHJhaXNlcyBTSUdGUEUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgU0lHRlBFLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCisgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorCisgICAgICAgICAgIyBHdWVzcyBiYXNlZCBvbiB0aGUgQ1BVLgorICAgICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgICAgIGFscGhhKiB8IGkzNDU2Nzg2IHwgbTY4ayB8IHMzOTAqKQorICAgICAgICAgICAgICBndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZT0iZ3Vlc3NpbmcgeWVzIjs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICBndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZT0iZ3Vlc3Npbmcgbm8iOzsKKyAgICAgICAgICBlc2FjCisKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX2NwbHVzcGx1cworc2lnZnBlX2hhbmRsZXIgKGludCBzaWcpCisjZWxzZQorc2lnZnBlX2hhbmRsZXIgKHNpZykgaW50IHNpZzsKKyNlbmRpZgoreworICAvKiBFeGl0IHdpdGggY29kZSAwIGlmIFNJR0ZQRSwgd2l0aCBjb2RlIDEgaWYgYW55IG90aGVyIHNpZ25hbC4gICovCisgIGV4aXQgKHNpZyAhPSBTSUdGUEUpOworfQorCitpbnQgeCA9IDE7CitpbnQgeSA9IDA7CitpbnQgejsKK2ludCBuYW47CisKK2ludCBtYWluICgpCit7CisgIHNpZ25hbCAoU0lHRlBFLCBzaWdmcGVfaGFuZGxlcik7CisvKiBJUklYIGFuZCBBSVggKHdoZW4gInhsYyAtcWNoZWNrIiBpcyB1c2VkKSB5aWVsZCBzaWduYWwgU0lHVFJBUC4gICovCisjaWYgKGRlZmluZWQgKF9fc2dpKSB8fCBkZWZpbmVkIChfQUlYKSkgJiYgZGVmaW5lZCAoU0lHVFJBUCkKKyAgc2lnbmFsIChTSUdUUkFQLCBzaWdmcGVfaGFuZGxlcik7CisjZW5kaWYKKy8qIExpbnV4L1NQQVJDIHlpZWxkcyBzaWduYWwgU0lHSUxMLiAgKi8KKyNpZiBkZWZpbmVkIChfX3NwYXJjX18pICYmIGRlZmluZWQgKF9fbGludXhfXykKKyAgc2lnbmFsIChTSUdJTEwsIHNpZ2ZwZV9oYW5kbGVyKTsKKyNlbmRpZgorCisgIHogPSB4IC8geTsKKyAgbmFuID0geSAvIHk7CisgIGV4aXQgKDEpOworfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2d0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlIiA+JjYKKyAgY2FzZSAiJGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlIiBpbgorICAgICp5ZXMpIHZhbHVlPTE7OworICAgICopIHZhbHVlPTA7OworICBlc2FjCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFICR2YWx1ZQorX0FDRU9GCisKKworCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdW5zaWduZWQgbG9uZyBsb25nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVuc2lnbmVkIGxvbmcgbG9uZy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCit1bnNpZ25lZCBsb25nIGxvbmcgdWxsID0gMVVMTDsgaW50IGkgPSA2MzsKK2ludAorbWFpbiAoKQorewordW5zaWduZWQgbG9uZyBsb25nIHVsbG1heCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIC0xOworICAgICByZXR1cm4gdWxsIDw8IGkgfCB1bGwgPj4gaSB8IHVsbG1heCAvIHVsbCB8IHVsbG1heCAlIHVsbDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyIgPiY2CisgIGlmIHRlc3QgJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfVU5TSUdORURfTE9OR19MT05HIDEKK19BQ0VPRgorCisgIGZpCisKKworCisKKyAgaWYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSBubyAmJiB0ZXN0ICRqbV9hY19jdl9oZWFkZXJfc3RkaW50X2ggPSBubzsgdGhlbgorCisgICAgdGVzdCAkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmcgPSB5ZXMgXAorICAgICAgJiYgYWNfdHlwZT0ndW5zaWduZWQgbG9uZyBsb25nJyBcCisgICAgICB8fCBhY190eXBlPSd1bnNpZ25lZCBsb25nJworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHVpbnRtYXhfdCAkYWNfdHlwZQorX0FDRU9GCisKKyAgZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1VJTlRNQVhfVCAxCitfQUNFT0YKKworICBmaQorCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnR0eXBlcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGludHR5cGVzLmguLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2d0X2N2X2hlYWRlcl9pbnR0eXBlc19oK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgoraW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGd0X2N2X2hlYWRlcl9pbnR0eXBlc19oPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitndF9jdl9oZWFkZXJfaW50dHlwZXNfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRndF9jdl9oZWFkZXJfaW50dHlwZXNfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2giID4mNgorICBpZiB0ZXN0ICRndF9jdl9oZWFkZXJfaW50dHlwZXNfaCA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCitfQUNFT0YKKworICBmaQorCisKKworICBpZiB0ZXN0ICRndF9jdl9oZWFkZXJfaW50dHlwZXNfaCA9IHllczsgdGhlbgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBpbnR0eXBlcy5oIFBSSXhOTiBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIGludHR5cGVzLmggUFJJeE5OIG1hY3JvcyBhcmUgYnJva2VuLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtndF9jdl9pbnR0eXBlc19wcmlfYnJva2VuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKKyAgICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpZmRlZiBQUklkMzIKK2NoYXIgKnAgPSBQUklkMzI7CisjZW5kaWYKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGd0X2N2X2ludHR5cGVzX3ByaV9icm9rZW49bm8KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbj15ZXMKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbiIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbiIgPiY2CisgIGZpCisgIGlmIHRlc3QgIiRndF9jdl9pbnR0eXBlc19wcmlfYnJva2VuIiA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBSSV9NQUNST1NfQlJPS0VOIDEKK19BQ0VPRgorCisgIGZpCisKKworCitmb3IgYWNfaGVhZGVyIGluIHN0ZGludC5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY3h4X3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjYKKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisgICAgKAorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBSZXBvcnQgdGhpcyB0byB0aGUgQUNfUEFDS0FHRV9OQU1FIGxpc3RzLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgKSB8CisgICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CisKK2ZpCitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBTSVpFX01BWCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBTSVpFX01BWC4uLiAkRUNIT19DIiA+JjYKKyAgcmVzdWx0PQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIFNJWkVfTUFYCitGb3VuZCBpdAorI2VuZGlmCisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIkZvdW5kIGl0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcmVzdWx0PXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisgIGlmIHRlc3QgLXogIiRyZXN1bHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKH4oc2l6ZV90KTAgLyAxMCkgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKH4oc2l6ZV90KTAgLyAxMCkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2hpPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkgICAgaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJICAgICAgYWNfbG89IGFjX2hpPQorCQkgICAgICBicmVhaworCQkgICAgZmkKKwkJICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCh+KHNpemVfdCkwIC8gMTApIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2hpPS0xIGFjX21pZD0tMQorICB3aGlsZSA6OyBkbworICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgofihzaXplX3QpMCAvIDEwKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgYWNfbG89IGFjX2hpPQorCQkJIGJyZWFrCisJCSAgICAgICBmaQorCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2xvPSBhY19oaT0KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCh+KHNpemVfdCkwIC8gMTApIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oaT0kYWNfbWlkCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorY2FzZSAkYWNfbG8gaW4KKz8qKSByZXNfaGk9JGFjX2xvOzsKKycnKSByZXN1bHQ9PyA7OworZXNhYworZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+Citsb25nIGxvbmd2YWwgKCkgeyByZXR1cm4gfihzaXplX3QpMCAvIDEwOyB9Cit1bnNpZ25lZCBsb25nIHVsb25ndmFsICgpIHsgcmV0dXJuIH4oc2l6ZV90KTAgLyAxMDsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIGV4aXQgKDEpOworICBpZiAoKH4oc2l6ZV90KTAgLyAxMCkgPCAwKQorICAgIHsKKyAgICAgIGxvbmcgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAofihzaXplX3QpMCAvIDEwKSkKKwlleGl0ICgxKTsKKyAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKH4oc2l6ZV90KTAgLyAxMCkpCisJZXhpdCAoMSk7CisgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKKyAgICB9CisgIGV4aXQgKGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgcmVzX2hpPWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorcmVzdWx0PT8KK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitybSAtZiBjb25mdGVzdC52YWwKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCh+KHNpemVfdCkwICUgMTApID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCh+KHNpemVfdCkwICUgMTApIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJICAgIGlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCSAgICAgIGFjX2xvPSBhY19oaT0KKwkJICAgICAgYnJlYWsKKwkJICAgIGZpCisJCSAgICBhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgofihzaXplX3QpMCAlIDEwKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKH4oc2l6ZV90KTAgJSAxMCkgPj0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2xvPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCSAgICAgICBpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJIGFjX2xvPSBhY19oaT0KKwkJCSBicmVhaworCQkgICAgICAgZmkKKwkJICAgICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19sbz0gYWNfaGk9CitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgofihzaXplX3QpMCAlIDEwKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgcmVzX2xvPSRhY19sbzs7CisnJykgcmVzdWx0PT8gOzsKK2VzYWMKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorbG9uZyBsb25ndmFsICgpIHsgcmV0dXJuIH4oc2l6ZV90KTAgJSAxMDsgfQordW5zaWduZWQgbG9uZyB1bG9uZ3ZhbCAoKSB7IHJldHVybiB+KHNpemVfdCkwICUgMTA7IH0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CisKKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKKyAgaWYgKCEgZikKKyAgICBleGl0ICgxKTsKKyAgaWYgKCh+KHNpemVfdCkwICUgMTApIDwgMCkKKyAgICB7CisgICAgICBsb25nIGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKH4oc2l6ZV90KTAgJSAxMCkpCisJZXhpdCAoMSk7CisgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICh+KHNpemVfdCkwICUgMTApKQorCWV4aXQgKDEpOworICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CisgICAgfQorICBleGl0IChmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIHJlc19sbz1gY2F0IGNvbmZ0ZXN0LnZhbGAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK3Jlc3VsdD0/CitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorcm0gLWYgY29uZnRlc3QudmFsCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoc2l6ZW9mIChzaXplX3QpIDw9IHNpemVvZiAodW5zaWduZWQgaW50KSkgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKHNpemVvZiAoc2l6ZV90KSA8PSBzaXplb2YgKHVuc2lnbmVkIGludCkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJICAgIGlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCSAgICAgIGFjX2xvPSBhY19oaT0KKwkJICAgICAgYnJlYWsKKwkJICAgIGZpCisJCSAgICBhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoc2l6ZW9mIChzaXplX3QpIDw9IHNpemVvZiAodW5zaWduZWQgaW50KSkgPCAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKChzaXplb2YgKHNpemVfdCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgYWNfbG89IGFjX2hpPQorCQkJIGJyZWFrCisJCSAgICAgICBmaQorCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2xvPSBhY19oaT0KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKChzaXplb2YgKHNpemVfdCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgZml0c19pbl91aW50PSRhY19sbzs7CisnJykgcmVzdWx0PT8gOzsKK2VzYWMKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorbG9uZyBsb25ndmFsICgpIHsgcmV0dXJuIHNpemVvZiAoc2l6ZV90KSA8PSBzaXplb2YgKHVuc2lnbmVkIGludCk7IH0KK3Vuc2lnbmVkIGxvbmcgdWxvbmd2YWwgKCkgeyByZXR1cm4gc2l6ZW9mIChzaXplX3QpIDw9IHNpemVvZiAodW5zaWduZWQgaW50KTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIGV4aXQgKDEpOworICBpZiAoKHNpemVvZiAoc2l6ZV90KSA8PSBzaXplb2YgKHVuc2lnbmVkIGludCkpIDwgMCkKKyAgICB7CisgICAgICBsb25nIGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKHNpemVvZiAoc2l6ZV90KSA8PSBzaXplb2YgKHVuc2lnbmVkIGludCkpKQorCWV4aXQgKDEpOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoc2l6ZW9mIChzaXplX3QpIDw9IHNpemVvZiAodW5zaWduZWQgaW50KSkpCisJZXhpdCAoMSk7CisgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKKyAgICB9CisgIGV4aXQgKGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZml0c19pbl91aW50PWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorcmVzdWx0PT8KK2ZpCitybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitybSAtZiBjb25mdGVzdC52YWwKKyAgICBpZiB0ZXN0ICIkZml0c19pbl91aW50IiA9IDE7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorICAgICAgICBleHRlcm4gc2l6ZV90IGZvbzsKKyAgICAgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZm9vOworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZml0c19pbl91aW50PTAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBmaQorICAgIGlmIHRlc3QgLXogIiRyZXN1bHQiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZml0c19pbl91aW50IiA9IDE7IHRoZW4KKyAgICAgICAgcmVzdWx0PSIkcmVzX2hpJHJlc19sbyJVCisgICAgICBlbHNlCisgICAgICAgIHJlc3VsdD0iJHJlc19oaSRyZXNfbG8iVUwKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0PSd+KHNpemVfdCkwJworICAgIGZpCisgIGZpCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRyZXN1bHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JHJlc3VsdCIgPiY2CisgIGlmIHRlc3QgIiRyZXN1bHQiICE9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVfTUFYICRyZXN1bHQKK19BQ0VPRgorCisgIGZpCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3RkaW50LmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2hlYWRlcl9jb21waWxlcj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNgorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKyAgICAoCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIHRoZSBBQ19QQUNLQUdFX05BTUUgbGlzdHMuICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICApIHwKKyAgICAgIHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgorICAgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisgICAgICBpZiB0ZXN0ICJYJHByZWZpeCIgPSAiWE5PTkUiOyB0aGVuCisgICAgYWNsX2ZpbmFsX3ByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorICBlbHNlCisgICAgYWNsX2ZpbmFsX3ByZWZpeD0iJHByZWZpeCIKKyAgZmkKKyAgaWYgdGVzdCAiWCRleGVjX3ByZWZpeCIgPSAiWE5PTkUiOyB0aGVuCisgICAgYWNsX2ZpbmFsX2V4ZWNfcHJlZml4PScke3ByZWZpeH0nCisgIGVsc2UKKyAgICBhY2xfZmluYWxfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZmkKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBldmFsIGFjbF9maW5hbF9leGVjX3ByZWZpeD1cIiRhY2xfZmluYWxfZXhlY19wcmVmaXhcIgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKKyAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaTsKKyMgUHJlcGFyZSBQQVRIX1NFUEFSQVRPUi4KKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQy4uLiAkRUNIT19DIiA+JjYKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgR05VIGxkLi4uICRFQ0hPX0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAkRUNIT19DIiA+JjYKK2ZpCitpZiB0ZXN0ICIke2FjbF9jdl9wYXRoX0xEK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgYWNsX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkYWNsX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrIDs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNsX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRhY2xfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJExEIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRMRCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCit0ZXN0IC16ICIkTEQiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNsX2N2X3Byb2dfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGFjbF9jdl9wcm9nX2dudV9sZD15ZXMgOzsKKyopCisgIGFjbF9jdl9wcm9nX2dudV9sZD1ubyA7OworZXNhYworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY2xfY3ZfcHJvZ19nbnVfbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjbF9jdl9wcm9nX2dudV9sZCIgPiY2Cit3aXRoX2dudV9sZD0kYWNsX2N2X3Byb2dfZ251X2xkCisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHJ1biBwYXRoIG9yaWdpbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaGFyZWQgbGlicmFyeSBydW4gcGF0aCBvcmlnaW4uLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjbF9jdl9ycGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCisgICAgQ0M9IiRDQyIgR0NDPSIkR0NDIiBMREZMQUdTPSIkTERGTEFHUyIgTEQ9IiRMRCIgd2l0aF9nbnVfbGQ9IiR3aXRoX2dudV9sZCIgXAorICAgICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICIkYWNfYXV4X2Rpci9jb25maWcucnBhdGgiICIkaG9zdCIgPiBjb25mdGVzdC5zaAorICAgIC4gLi9jb25mdGVzdC5zaAorICAgIHJtIC1mIC4vY29uZnRlc3Quc2gKKyAgICBhY2xfY3ZfcnBhdGg9ZG9uZQorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjbF9jdl9ycGF0aCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNsX2N2X3JwYXRoIiA+JjYKKyAgd2w9IiRhY2xfY3Zfd2wiCisgIGxpYmV4dD0iJGFjbF9jdl9saWJleHQiCisgIHNobGliZXh0PSIkYWNsX2N2X3NobGliZXh0IgorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSIkYWNsX2N2X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiCisgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9IiRhY2xfY3ZfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIKKyAgaGFyZGNvZGVfZGlyZWN0PSIkYWNsX2N2X2hhcmRjb2RlX2RpcmVjdCIKKyAgaGFyZGNvZGVfbWludXNfTD0iJGFjbF9jdl9oYXJkY29kZV9taW51c19MIgorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ycGF0aCBvciAtLWRpc2FibGUtcnBhdGggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3JwYXRoIgorICA6CitlbHNlCisgIGVuYWJsZV9ycGF0aD15ZXMKK2ZpOworCisKKworCisKKworCisgICAgdXNlX2FkZGl0aW9uYWw9eWVzCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKworICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKworICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJpY29udi1wcmVmaXggb3IgLS13aXRob3V0LWxpYmljb252LXByZWZpeCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbGliaWNvbnZfcHJlZml4K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2xpYmljb252X3ByZWZpeCIKKworICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWG5vIjsgdGhlbgorICAgICAgdXNlX2FkZGl0aW9uYWw9bm8KKyAgICBlbHNlCisgICAgICBpZiB0ZXN0ICJYJHdpdGh2YWwiID0gIlgiOyB0aGVuCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKworICAgICAgICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgICAgICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKworICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgIGVsc2UKKyAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkd2l0aHZhbC9pbmNsdWRlIgorICAgICAgICBhZGRpdGlvbmFsX2xpYmRpcj0iJHdpdGh2YWwvbGliIgorICAgICAgZmkKKyAgICBmaQorCitmaTsKKyAgICAgIExJQklDT05WPQorICBMVExJQklDT05WPQorICBJTkNJQ09OVj0KKyAgcnBhdGhkaXJzPQorICBsdHJwYXRoZGlycz0KKyAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPQorICBuYW1lc19uZXh0X3JvdW5kPSdpY29udiAnCisgIHdoaWxlIHRlc3QgLW4gIiRuYW1lc19uZXh0X3JvdW5kIjsgZG8KKyAgICBuYW1lc190aGlzX3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCIKKyAgICBuYW1lc19uZXh0X3JvdW5kPQorICAgIGZvciBuYW1lIGluICRuYW1lc190aGlzX3JvdW5kOyBkbworICAgICAgYWxyZWFkeV9oYW5kbGVkPQorICAgICAgZm9yIG4gaW4gJG5hbWVzX2FscmVhZHlfaGFuZGxlZDsgZG8KKyAgICAgICAgaWYgdGVzdCAiJG4iID0gIiRuYW1lIjsgdGhlbgorICAgICAgICAgIGFscmVhZHlfaGFuZGxlZD15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCAteiAiJGFscmVhZHlfaGFuZGxlZCI7IHRoZW4KKyAgICAgICAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPSIkbmFtZXNfYWxyZWFkeV9oYW5kbGVkICRuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJuYW1lPWBlY2hvICIkbmFtZSIgfCBzZWQgLWUgJ3l8YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy18QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX198J2AKKyAgICAgICAgZXZhbCB2YWx1ZT1cIlwkSEFWRV9MSUIkdXBwZXJuYW1lXCIKKyAgICAgICAgaWYgdGVzdCAtbiAiJHZhbHVlIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIiR2YWx1ZSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgIGV2YWwgdmFsdWU9XCJcJExJQiR1cHBlcm5hbWVcIgorICAgICAgICAgICAgdGVzdCAteiAiJHZhbHVlIiB8fCBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSR2YWx1ZSIKKyAgICAgICAgICAgIGV2YWwgdmFsdWU9XCJcJExUTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16ICIkdmFsdWUiIHx8IExUTElCSUNPTlY9IiR7TFRMSUJJQ09OVn0ke0xUTElCSUNPTlY6KyB9JHZhbHVlIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9kaXI9CisgICAgICAgICAgZm91bmRfbGE9CisgICAgICAgICAgZm91bmRfc289CisgICAgICAgICAgZm91bmRfYT0KKyAgICAgICAgICBpZiB0ZXN0ICR1c2VfYWRkaXRpb25hbCA9IHllczsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgZm91bmRfc289IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kc2hsaWJleHQiCisgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgICBmb3VuZF9hPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiID0gIlgiOyB0aGVuCisgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTFRMSUJJQ09OVjsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICBjYXNlICIkeCIgaW4KKyAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkeCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYmV4dCIgJiYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS4kc2hsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfc289IiRkaXIvbGliJG5hbWUuJHNobGliZXh0IgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgTFRMSUJJQ09OVj0iJHtMVExJQklDT05WfSR7TFRMSUJJQ09OVjorIH0tTCRmb3VuZF9kaXIgLWwkbmFtZSIKKyAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfc28iICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3JwYXRoIiA9IG5vIHx8IHRlc3QgIlgkZm91bmRfZGlyIiA9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBmb3IgeCBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgbHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZm91bmRfZGlyIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgJiYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBycGF0aGRpcnM9IiRycGF0aGRpcnMgJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCSUNPTlY7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfS1MJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSUNPTlY9IiR7TElCSUNPTlZ9JHtMSUJJQ09OVjorIH0kZm91bmRfc28iCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSUNPTlY9IiR7TElCSUNPTlZ9JHtMSUJJQ09OVjorIH0tbCRuYW1lIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2EiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmb3VuZF9hIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0KKyAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9kaXIiIGluCisgICAgICAgICAgICAgICovbGliIHwgKi9saWIvKQorICAgICAgICAgICAgICAgIGJhc2VkaXI9YGVjaG8gIlgkZm91bmRfZGlyIiB8IHNlZCAtZSAncyxeWCwsJyAtZSAncywvbGliLyokLCwnYAorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJGJhc2VkaXIvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiAhPSAiWC91c3IvaW5jbHVkZSI7IHRoZW4KKyAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiID0gIlgvdXNyL2xvY2FsL2luY2x1ZGUiOyB0aGVuCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkQ1BQRkxBR1MgJElOQ0lDT05WOyBkbworCisgIGFjbF9zYXZlX3ByZWZpeD0iJHByZWZpeCIKKyAgcHJlZml4PSIkYWNsX2ZpbmFsX3ByZWZpeCIKKyAgYWNsX3NhdmVfZXhlY19wcmVmaXg9IiRleGVjX3ByZWZpeCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfZmluYWxfZXhlY19wcmVmaXgiCisgIGV2YWwgeD1cIiR4XCIKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0lDT05WPSIke0lOQ0lDT05WfSR7SU5DSUNPTlY6KyB9LUkkYWRkaXRpb25hbF9pbmNsdWRlZGlyIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmb3VuZF9sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisgICAgICAgICAgICAgIGNhc2UgIiRmb3VuZF9sYSIgaW4KKyAgICAgICAgICAgICAgICAqLyogfCAqXFwqKSAuICIkZm91bmRfbGEiIDs7CisgICAgICAgICAgICAgICAgKikgLiAiLi8kZm91bmRfbGEiIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgbGliZGlyPSIkc2F2ZV9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworICAgICAgICAgICAgICAgIGNhc2UgIiRkZXAiIGluCisgICAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPWBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiAhPSAiWC91c3IvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiA9ICJYL3Vzci9sb2NhbC9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCSUNPTlY7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCSUNPTlY7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUTElCSUNPTlY9IiR7TFRMSUJJQ09OVn0ke0xUTElCSUNPTlY6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAtUiopCisgICAgICAgICAgICAgICAgICAgIGRpcj1gZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLVIvLydgCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRlbmFibGVfcnBhdGgiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBycGF0aGRpcnM9IiRycGF0aGRpcnMgJGRpciIKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRsdHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBsdHJwYXRoZGlycz0iJGx0cnBhdGhkaXJzICRkaXIiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgIC1sKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19uZXh0X3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCAiYGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1sLy8nYAorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgKi5sYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MsXlguKi8sLCcgLWUgJ3MsXmxpYiwsJyAtZSAncyxcLmxhJCwsJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSUNPTlY9IiR7TElCSUNPTlZ9JHtMSUJJQ09OVjorIH0kZGVwIgorICAgICAgICAgICAgICAgICAgICBMVExJQklDT05WPSIke0xUTElCSUNPTlZ9JHtMVExJQklDT05WOisgfSRkZXAiCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklDT05WPSIke0xJQklDT05WfSR7TElCSUNPTlY6KyB9LWwkbmFtZSIKKyAgICAgICAgICAgIExUTElCSUNPTlY9IiR7TFRMSUJJQ09OVn0ke0xUTElCSUNPTlY6KyB9LWwkbmFtZSIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKKyAgaWYgdGVzdCAiWCRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsZGlycz0KKyAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgYWxsZGlycz0iJHthbGxkaXJzfSR7YWxsZGlyczorJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3J9JGZvdW5kX2RpciIKKyAgICAgIGRvbmUKKyAgICAgICAgICAgIGFjbF9zYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgIGxpYmRpcj0iJGFsbGRpcnMiCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmbGFnIgorICAgIGVsc2UKKyAgICAgICAgICAgIGZvciBmb3VuZF9kaXIgaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgYWNsX3NhdmVfbGliZGlyPSIkbGliZGlyIgorICAgICAgICBsaWJkaXI9IiRmb3VuZF9kaXIiCisgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgICAgbGliZGlyPSIkYWNsX3NhdmVfbGliZGlyIgorICAgICAgICBMSUJJQ09OVj0iJHtMSUJJQ09OVn0ke0xJQklDT05WOisgfSRmbGFnIgorICAgICAgZG9uZQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIlgkbHRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgZm9yIGZvdW5kX2RpciBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICBMVExJQklDT05WPSIke0xUTElCSUNPTlZ9JHtMVExJQklDT05WOisgfS1SJGZvdW5kX2RpciIKKyAgICBkb25lCisgIGZpCisKKworCisKKworCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHB0cmRpZmZfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwdHJkaWZmX3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfcHRyZGlmZl90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworaWYgKChwdHJkaWZmX3QgKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChwdHJkaWZmX3QpKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3R5cGVfcHRyZGlmZl90PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl90eXBlX3B0cmRpZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9wdHJkaWZmX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfcHRyZGlmZl90IiA+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfcHRyZGlmZl90ID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgcHRyZGlmZl90IGxvbmcKK19BQ0VPRgorCisKK2ZpCisKKworCisKKworCisKKworCisKKworZm9yIGFjX2hlYWRlciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdGRkZWYuaCBcCitzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzeXMvcGFyYW0uaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjYKKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2N4eF93ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluCisgIHllczpubzogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorICAgICgKKyAgICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUmVwb3J0IHRoaXMgdG8gdGhlIEFDX1BBQ0tBR0VfTkFNRSBsaXN0cy4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICkgfAorICAgICAgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2ZvciBhY19mdW5jIGluIGFzcHJpbnRmIGZ3cHJpbnRmIGdldGN3ZCBnZXRlZ2lkIGdldGV1aWQgZ2V0Z2lkIGdldHVpZCBcCittZW1wY3B5IG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzbnByaW50ZiBzdHBjcHkgc3RyY2FzZWNtcCBzdHJkdXAgXAorc3RydG91bCB0c2VhcmNoIHdjc2xlbiBfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dCBcCitfX2ZzZXRsb2NraW5nCitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSAkYWNfZnVuYzsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBfc25wcmludGYgaXMgZGVjbGFyZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIF9zbnByaW50ZiBpcyBkZWNsYXJlZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9kZWNsX19zbnByaW50ZitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyNpZm5kZWYgX3NucHJpbnRmCisgIGNoYXIgKnAgPSAoY2hhciAqKSBfc25wcmludGY7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfaGF2ZV9kZWNsX19zbnByaW50Zj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfaGF2ZV9kZWNsX19zbnByaW50Zj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX19zbnByaW50ZiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGF2ZV9kZWNsX19zbnByaW50ZiIgPiY2CisgIGlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9fc25wcmludGYgPSB5ZXM7IHRoZW4KKyAgICBndF92YWx1ZT0xCisgIGVsc2UKKyAgICBndF92YWx1ZT0wCisgIGZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX19TTlBSSU5URiAkZ3RfdmFsdWUKK19BQ0VPRgorCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBfc253cHJpbnRmIGlzIGRlY2xhcmVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBfc253cHJpbnRmIGlzIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfX3Nud3ByaW50ZitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyNpZm5kZWYgX3Nud3ByaW50ZgorICBjaGFyICpwID0gKGNoYXIgKikgX3Nud3ByaW50ZjsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9oYXZlX2RlY2xfX3Nud3ByaW50Zj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfaGF2ZV9kZWNsX19zbndwcmludGY9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhdmVfZGVjbF9fc253cHJpbnRmIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oYXZlX2RlY2xfX3Nud3ByaW50ZiIgPiY2CisgIGlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9fc253cHJpbnRmID0geWVzOyB0aGVuCisgICAgZ3RfdmFsdWU9MQorICBlbHNlCisgICAgZ3RfdmFsdWU9MAorICBmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9fU05XUFJJTlRGICRndF92YWx1ZQorX0FDRU9GCisKKworCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgZmVvZl91bmxvY2tlZCBpcyBkZWNsYXJlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgZmVvZl91bmxvY2tlZCBpcyBkZWNsYXJlZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9kZWNsX2Zlb2ZfdW5sb2NrZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisjaWZuZGVmIGZlb2ZfdW5sb2NrZWQKKyAgY2hhciAqcCA9IChjaGFyICopIGZlb2ZfdW5sb2NrZWQ7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfaGF2ZV9kZWNsX2Zlb2ZfdW5sb2NrZWQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2hhdmVfZGVjbF9mZW9mX3VubG9ja2VkPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oYXZlX2RlY2xfZmVvZl91bmxvY2tlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGF2ZV9kZWNsX2Zlb2ZfdW5sb2NrZWQiID4mNgorICBpZiB0ZXN0ICRhY19jdl9oYXZlX2RlY2xfZmVvZl91bmxvY2tlZCA9IHllczsgdGhlbgorICAgIGd0X3ZhbHVlPTEKKyAgZWxzZQorICAgIGd0X3ZhbHVlPTAKKyAgZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfRkVPRl9VTkxPQ0tFRCAkZ3RfdmFsdWUKK19BQ0VPRgorCisKKworICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBmZ2V0c191bmxvY2tlZCBpcyBkZWNsYXJlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgZmdldHNfdW5sb2NrZWQgaXMgZGVjbGFyZWQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2hhdmVfZGVjbF9mZ2V0c191bmxvY2tlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CisKKyNpZm5kZWYgZmdldHNfdW5sb2NrZWQKKyAgY2hhciAqcCA9IChjaGFyICopIGZnZXRzX3VubG9ja2VkOworI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2hhdmVfZGVjbF9mZ2V0c191bmxvY2tlZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfaGF2ZV9kZWNsX2ZnZXRzX3VubG9ja2VkPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oYXZlX2RlY2xfZmdldHNfdW5sb2NrZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF9mZ2V0c191bmxvY2tlZCIgPiY2CisgIGlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9mZ2V0c191bmxvY2tlZCA9IHllczsgdGhlbgorICAgIGd0X3ZhbHVlPTEKKyAgZWxzZQorICAgIGd0X3ZhbHVlPTAKKyAgZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfRkdFVFNfVU5MT0NLRUQgJGd0X3ZhbHVlCitfQUNFT0YKKworCisKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgZ2V0Y191bmxvY2tlZCBpcyBkZWNsYXJlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgZ2V0Y191bmxvY2tlZCBpcyBkZWNsYXJlZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9kZWNsX2dldGNfdW5sb2NrZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisjaWZuZGVmIGdldGNfdW5sb2NrZWQKKyAgY2hhciAqcCA9IChjaGFyICopIGdldGNfdW5sb2NrZWQ7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfaGF2ZV9kZWNsX2dldGNfdW5sb2NrZWQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2hhdmVfZGVjbF9nZXRjX3VubG9ja2VkPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oYXZlX2RlY2xfZ2V0Y191bmxvY2tlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGF2ZV9kZWNsX2dldGNfdW5sb2NrZWQiID4mNgorICBpZiB0ZXN0ICRhY19jdl9oYXZlX2RlY2xfZ2V0Y191bmxvY2tlZCA9IHllczsgdGhlbgorICAgIGd0X3ZhbHVlPTEKKyAgZWxzZQorICAgIGd0X3ZhbHVlPTAKKyAgZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfR0VUQ19VTkxPQ0tFRCAkZ3RfdmFsdWUKK19BQ0VPRgorCisKKworICBjYXNlICRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCBpbgorICAgICp5ZXMpIEhBVkVfUE9TSVhfUFJJTlRGPTEgOzsKKyAgICAqKSBIQVZFX1BPU0lYX1BSSU5URj0wIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19hc3ByaW50ZiIgPSB5ZXM7IHRoZW4KKyAgICBIQVZFX0FTUFJJTlRGPTEKKyAgZWxzZQorICAgIEhBVkVfQVNQUklOVEY9MAorICBmaQorCisgIGlmIHRlc3QgIiRhY19jdl9mdW5jX3NucHJpbnRmIiA9IHllczsgdGhlbgorICAgIEhBVkVfU05QUklOVEY9MQorICBlbHNlCisgICAgSEFWRV9TTlBSSU5URj0wCisgIGZpCisKKyAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfd3ByaW50ZiIgPSB5ZXM7IHRoZW4KKyAgICBIQVZFX1dQUklOVEY9MQorICBlbHNlCisgICAgSEFWRV9XUFJJTlRGPTAKKyAgZmkKKworCisKKworCisKKworICAgICAgICAgIGFtX3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKworICBmb3IgZWxlbWVudCBpbiAkSU5DSUNPTlY7IGRvCisgICAgaGF2ZWl0PQorICAgIGZvciB4IGluICRDUFBGTEFHUzsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGVsZW1lbnQiOyB0aGVuCisgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICBDUFBGTEFHUz0iJHtDUFBGTEFHU30ke0NQUEZMQUdTOisgfSRlbGVtZW50IgorICAgIGZpCisgIGRvbmUKKworCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaWNvbnYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaWNvbnYuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FtX2N2X2Z1bmNfaWNvbnYrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworICAgIGFtX2N2X2Z1bmNfaWNvbnY9Im5vLCBjb25zaWRlciBpbnN0YWxsaW5nIEdOVSBsaWJpY29udiIKKyAgICBhbV9jdl9saWJfaWNvbnY9bm8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpY29udi5oPgoraW50CittYWluICgpCit7CitpY29udl90IGNkID0gaWNvbnZfb3BlbigiIiwiIik7CisgICAgICAgaWNvbnYoY2QsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgaWNvbnZfY2xvc2UoY2QpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYW1fY3ZfZnVuY19pY29udj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgaWYgdGVzdCAiJGFtX2N2X2Z1bmNfaWNvbnYiICE9IHllczsgdGhlbgorICAgICAgYW1fc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIExJQlM9IiRMSUJTICRMSUJJQ09OViIKKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+CitpbnQKK21haW4gKCkKK3sKK2ljb252X3QgY2QgPSBpY29udl9vcGVuKCIiLCIiKTsKKyAgICAgICAgIGljb252KGNkLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgaWNvbnZfY2xvc2UoY2QpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYW1fY3ZfbGliX2ljb252PXllcworICAgICAgICBhbV9jdl9mdW5jX2ljb252PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgIExJQlM9IiRhbV9zYXZlX0xJQlMiCisgICAgZmkKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhbV9jdl9mdW5jX2ljb252IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhbV9jdl9mdW5jX2ljb252IiA+JjYKKyAgaWYgdGVzdCAiJGFtX2N2X2Z1bmNfaWNvbnYiID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfSUNPTlYgMQorX0FDRU9GCisKKyAgZmkKKyAgaWYgdGVzdCAiJGFtX2N2X2xpYl9pY29udiIgPSB5ZXM7IHRoZW4KKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIGxpbmsgd2l0aCBsaWJpY29udiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBsaW5rIHdpdGggbGliaWNvbnYuLi4gJEVDSE9fQyIgPiY2CisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJExJQklDT05WIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRMSUJJQ09OViIgPiY2CisgIGVsc2UKKyAgICAgICAgICAgIENQUEZMQUdTPSIkYW1fc2F2ZV9DUFBGTEFHUyIKKyAgICBMSUJJQ09OVj0KKyAgICBMVExJQklDT05WPQorICBmaQorCisKKworICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGljb252IGRlY2xhcmF0aW9uIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGljb252IGRlY2xhcmF0aW9uLi4uICRFQ0hPX0MiID4mNgorICAgIGlmIHRlc3QgIiR7YW1fY3ZfcHJvdG9faWNvbnYrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpY29udi5oPgorZXh0ZXJuCisjaWZkZWYgX19jcGx1c3BsdXMKKyJDIgorI2VuZGlmCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK3NpemVfdCBpY29udiAoaWNvbnZfdCBjZCwgY2hhciAqICppbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwgY2hhciAqICpvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KTsKKyNlbHNlCitzaXplX3QgaWNvbnYoKTsKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYW1fY3ZfcHJvdG9faWNvbnZfYXJnMT0iIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithbV9jdl9wcm90b19pY29udl9hcmcxPSJjb25zdCIKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICBhbV9jdl9wcm90b19pY29udj0iZXh0ZXJuIHNpemVfdCBpY29udiAoaWNvbnZfdCBjZCwgJGFtX2N2X3Byb3RvX2ljb252X2FyZzEgY2hhciAqICppbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwgY2hhciAqICpvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KTsiCitmaQorCisgICAgYW1fY3ZfcHJvdG9faWNvbnY9YGVjaG8gIiRhbV9jdl9wcm90b19pY29udiIgfCB0ciAtcyAnICcgfCBzZWQgLWUgJ3MvKCAvKC8nYAorICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR7YWNfdDotCisgICAgICAgICB9JGFtX2N2X3Byb3RvX2ljb252IiA+JjUKK2VjaG8gIiR7RUNIT19UfSR7YWNfdDotCisgICAgICAgICB9JGFtX2N2X3Byb3RvX2ljb252IiA+JjYKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBJQ09OVl9DT05TVCAkYW1fY3ZfcHJvdG9faWNvbnZfYXJnMQorX0FDRU9GCisKKyAgZmkKKworCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8gYW5kIENPREVTRVQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8gYW5kIENPREVTRVQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FtX2N2X2xhbmdpbmZvX2NvZGVzZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8bGFuZ2luZm8uaD4KK2ludAorbWFpbiAoKQoreworY2hhciogY3MgPSBubF9sYW5naW5mbyhDT0RFU0VUKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FtX2N2X2xhbmdpbmZvX2NvZGVzZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQiID4mNgorICBpZiB0ZXN0ICRhbV9jdl9sYW5naW5mb19jb2Rlc2V0ID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfTEFOR0lORk9fQ09ERVNFVCAxCitfQUNFT0YKKworICBmaQorCisgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FtX2N2X3ZhbF9MQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludAorbWFpbiAoKQoreworcmV0dXJuIExDX01FU1NBR0VTCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgPiY1CitlY2hvICIke0VDSE9fVH0kYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiA+JjYKKyAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorX0FDRU9GCisKKyAgZmkKKworICBmaQorCisgICAgICAgICAgICAgICAgICAgICAgZm9yIGFjX3Byb2cgaW4gYmlzb24KK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0lOVExCSVNPTitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkSU5UTEJJU09OIjsgdGhlbgorICBhY19jdl9wcm9nX0lOVExCSVNPTj0iJElOVExCSVNPTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfSU5UTEJJU09OPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0lOVExCSVNPTj0kYWNfY3ZfcHJvZ19JTlRMQklTT04KK2lmIHRlc3QgLW4gIiRJTlRMQklTT04iOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlRMQklTT04iID4mNQorZWNobyAiJHtFQ0hPX1R9JElOVExCSVNPTiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgdGVzdCAtbiAiJElOVExCSVNPTiIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0IC16ICIkSU5UTEJJU09OIjsgdGhlbgorICAgIGFjX3ZlcmNfZmFpbD15ZXMKKyAgZWxzZQorICAgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdmVyc2lvbiBvZiBiaXNvbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHZlcnNpb24gb2YgYmlzb24uLi4gJEVDSE9fQyIgPiY2CisgICAgYWNfcHJvZ192ZXJzaW9uPWAkSU5UTEJJU09OIC0tdmVyc2lvbiAyPiYxIHwgc2VkIC1uICdzL14uKkdOVSBCaXNvbi4qIFwoWzAtOV0qXC5bMC05Ll0qXCkuKiQvXDEvcCdgCisgICAgY2FzZSAkYWNfcHJvZ192ZXJzaW9uIGluCisgICAgICAnJykgYWNfcHJvZ192ZXJzaW9uPSJ2LiA/Lj8/LCBiYWQiOyBhY192ZXJjX2ZhaWw9eWVzOzsKKyAgICAgIDEuMls2LTldKiB8IDEuWzMtOV1bMC05XSogfCBbMi05XS4qKQorICAgICAgICAgYWNfcHJvZ192ZXJzaW9uPSIkYWNfcHJvZ192ZXJzaW9uLCBvayI7IGFjX3ZlcmNfZmFpbD1ubzs7CisgICAgICAqKSBhY19wcm9nX3ZlcnNpb249IiRhY19wcm9nX3ZlcnNpb24sIGJhZCI7IGFjX3ZlcmNfZmFpbD15ZXM7OworICAgIGVzYWMKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcHJvZ192ZXJzaW9uIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19wcm9nX3ZlcnNpb24iID4mNgorICBmaQorICBpZiB0ZXN0ICRhY192ZXJjX2ZhaWwgPSB5ZXM7IHRoZW4KKyAgICBJTlRMQklTT049OgorICBmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQuLi4gJEVDSE9fQyIgPiY2CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpOworICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkVVNFX05MUyIgPiY1CitlY2hvICIke0VDSE9fVH0kVVNFX05MUyIgPiY2CisKKworCisKKyAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPW5vCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICBMSUJJTlRMPQorICBMVExJQklOVEw9CisgIFBPU1VCPQorCisgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICBndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQ9bm8KKworICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkLi4uICRFQ0hPX0MiID4mNgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAorZWxzZQorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCitmaTsKKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiA+JjYKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKworCisKKworCisKKyAgICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBHTlUgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2d0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CitleHRlcm4gaW50ICpfbmxfZG9tYWluX2JpbmRpbmdzOworaW50CittYWluICgpCit7CitiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9kb21haW5fYmluZGluZ3MKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmMiID4mNgorCisgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisKKworCisgICAgdXNlX2FkZGl0aW9uYWw9eWVzCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKworICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKworICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJpbnRsLXByZWZpeCBvciAtLXdpdGhvdXQtbGliaW50bC1wcmVmaXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2xpYmludGxfcHJlZml4K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2xpYmludGxfcHJlZml4IgorCisgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25hbD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9XCIkaW5jbHVkZWRpclwiCisgICAgICAgICAgZXZhbCBhZGRpdGlvbmFsX2xpYmRpcj1cIiRsaWJkaXJcIgorCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgZWxzZQorICAgICAgICBhZGRpdGlvbmFsX2luY2x1ZGVkaXI9IiR3aXRodmFsL2luY2x1ZGUiCisgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPSIkd2l0aHZhbC9saWIiCisgICAgICBmaQorICAgIGZpCisKK2ZpOworICAgICAgTElCSU5UTD0KKyAgTFRMSUJJTlRMPQorICBJTkNJTlRMPQorICBycGF0aGRpcnM9CisgIGx0cnBhdGhkaXJzPQorICBuYW1lc19hbHJlYWR5X2hhbmRsZWQ9CisgIG5hbWVzX25leHRfcm91bmQ9J2ludGwgJworICB3aGlsZSB0ZXN0IC1uICIkbmFtZXNfbmV4dF9yb3VuZCI7IGRvCisgICAgbmFtZXNfdGhpc19yb3VuZD0iJG5hbWVzX25leHRfcm91bmQiCisgICAgbmFtZXNfbmV4dF9yb3VuZD0KKyAgICBmb3IgbmFtZSBpbiAkbmFtZXNfdGhpc19yb3VuZDsgZG8KKyAgICAgIGFscmVhZHlfaGFuZGxlZD0KKyAgICAgIGZvciBuIGluICRuYW1lc19hbHJlYWR5X2hhbmRsZWQ7IGRvCisgICAgICAgIGlmIHRlc3QgIiRuIiA9ICIkbmFtZSI7IHRoZW4KKyAgICAgICAgICBhbHJlYWR5X2hhbmRsZWQ9eWVzCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgLXogIiRhbHJlYWR5X2hhbmRsZWQiOyB0aGVuCisgICAgICAgIG5hbWVzX2FscmVhZHlfaGFuZGxlZD0iJG5hbWVzX2FscmVhZHlfaGFuZGxlZCAkbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVybmFtZT1gZWNobyAiJG5hbWUiIHwgc2VkIC1lICd5fGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tfEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19ffCdgCisgICAgICAgIGV2YWwgdmFsdWU9XCJcJEhBVkVfTElCJHVwcGVybmFtZVwiCisgICAgICAgIGlmIHRlc3QgLW4gIiR2YWx1ZSI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0ICIkdmFsdWUiID0geWVzOyB0aGVuCisgICAgICAgICAgICBldmFsIHZhbHVlPVwiXCRMSUIkdXBwZXJuYW1lXCIKKyAgICAgICAgICAgIHRlc3QgLXogIiR2YWx1ZSIgfHwgTElCSU5UTD0iJHtMSUJJTlRMfSR7TElCSU5UTDorIH0kdmFsdWUiCisgICAgICAgICAgICBldmFsIHZhbHVlPVwiXCRMVExJQiR1cHBlcm5hbWVcIgorICAgICAgICAgICAgdGVzdCAteiAiJHZhbHVlIiB8fCBMVExJQklOVEw9IiR7TFRMSUJJTlRMfSR7TFRMSUJJTlRMOisgfSR2YWx1ZSIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZGlyPQorICAgICAgICAgIGZvdW5kX2xhPQorICAgICAgICAgIGZvdW5kX3NvPQorICAgICAgICAgIGZvdW5kX2E9CisgICAgICAgICAgaWYgdGVzdCAkdXNlX2FkZGl0aW9uYWwgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYmV4dCIgJiYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgZm91bmRfZGlyPSIkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgIGZvdW5kX3NvPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IgorICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgZm91bmRfYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLiRsaWJleHQiCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiA9ICJYIjsgdGhlbgorICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCSU5UTDsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICBjYXNlICIkeCIgaW4KKyAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkeCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYmV4dCIgJiYgdGVzdCAtZiAiJGRpci9saWIkbmFtZS4kc2hsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Rpcj0iJGRpciIKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfc289IiRkaXIvbGliJG5hbWUuJHNobGliZXh0IgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2xhPSIkZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRsaWJleHQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2E9IiRkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLmxhIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfZGlyIiAhPSAiWCI7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgTFRMSUJJTlRMPSIke0xUTElCSU5UTH0ke0xUTElCSU5UTDorIH0tTCRmb3VuZF9kaXIgLWwkbmFtZSIKKyAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfc28iICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3JwYXRoIiA9IG5vIHx8IHRlc3QgIlgkZm91bmRfZGlyIiA9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBmb3IgeCBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgbHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZm91bmRfZGlyIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgJiYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9JGZvdW5kX3NvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBycGF0aGRpcnM9IiRycGF0aGRpcnMgJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTElCSU5UTDsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1MJGZvdW5kX2RpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9LUwkZm91bmRfZGlyIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfS1sJG5hbWUiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfYSIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9JGZvdW5kX2EiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9LUwkZm91bmRfZGlyIC1sJG5hbWUiCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPQorICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2RpciIgaW4KKyAgICAgICAgICAgICAgKi9saWIgfCAqL2xpYi8pCisgICAgICAgICAgICAgICAgYmFzZWRpcj1gZWNobyAiWCRmb3VuZF9kaXIiIHwgc2VkIC1lICdzLF5YLCwnIC1lICdzLC9saWIvKiQsLCdgCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkYmFzZWRpci9pbmNsdWRlIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiICE9ICJYL3Vzci9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgPSAiWC91c3IvbG9jYWwvaW5jbHVkZSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICBsaW51eCopIGhhdmVpdD15ZXM7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGZvciB4IGluICRDUFBGTEFHUyAkSU5DSU5UTDsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtSSRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9pbmNsdWRlZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNJTlRMPSIke0lOQ0lOVEx9JHtJTkNJTlRMOisgfS1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkZm91bmRfbGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfbGliZGlyPSIkbGliZGlyIgorICAgICAgICAgICAgICBjYXNlICIkZm91bmRfbGEiIGluCisgICAgICAgICAgICAgICAgKi8qIHwgKlxcKikgLiAiJGZvdW5kX2xhIiA7OworICAgICAgICAgICAgICAgICopIC4gIi4vJGZvdW5kX2xhIiA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGxpYmRpcj0iJHNhdmVfbGliZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKyAgICAgICAgICAgICAgICBjYXNlICIkZGVwIiBpbgorICAgICAgICAgICAgICAgICAgLUwqKQorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX2xpYmRpcj1gZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLUwvLydgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgIT0gIlgvdXNyL2xpYiI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgPSAiWC91c3IvbG9jYWwvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExJQklOVEw7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCSU5UTDsgZG8KKworICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGFjbF9zYXZlX2V4ZWNfcHJlZml4PSIkZXhlY19wcmVmaXgiCisgIGV4ZWNfcHJlZml4PSIkYWNsX2ZpbmFsX2V4ZWNfcHJlZml4IgorICBldmFsIHg9XCIkeFwiCisgIGV4ZWNfcHJlZml4PSIkYWNsX3NhdmVfZXhlY19wcmVmaXgiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKKworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRMSUJJTlRMPSIke0xUTElCSU5UTH0ke0xUTElCSU5UTDorIH0tTCRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgIC1SKikKKyAgICAgICAgICAgICAgICAgICAgZGlyPWBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtUi8vJ2AKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgIT0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJwYXRoZGlycz0iJHJwYXRoZGlycyAkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJGx0cnBhdGhkaXJzOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYJGRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGx0cnBhdGhkaXJzPSIkbHRycGF0aGRpcnMgJGRpciIKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgLWwqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX25leHRfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kICJgZWNobyAiWCRkZXAiIHwgc2VkIC1lICdzL15YLWwvLydgCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAqLmxhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19uZXh0X3JvdW5kPSIkbmFtZXNfbmV4dF9yb3VuZCAiYGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncyxeWC4qLywsJyAtZSAncyxebGliLCwnIC1lICdzLFwubGEkLCwnYAorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJJTlRMPSIke0xJQklOVEx9JHtMSUJJTlRMOisgfSRkZXAiCisgICAgICAgICAgICAgICAgICAgIExUTElCSU5UTD0iJHtMVExJQklOVEx9JHtMVExJQklOVEw6KyB9JGRlcCIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCSU5UTD0iJHtMSUJJTlRMfSR7TElCSU5UTDorIH0tbCRuYW1lIgorICAgICAgICAgICAgTFRMSUJJTlRMPSIke0xUTElCSU5UTH0ke0xUTElCSU5UTDorIH0tbCRuYW1lIgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGRvbmUKKyAgZG9uZQorICBpZiB0ZXN0ICJYJHJwYXRoZGlycyIgIT0gIlgiOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxkaXJzPQorICAgICAgZm9yIGZvdW5kX2RpciBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICBhbGxkaXJzPSIke2FsbGRpcnN9JHthbGxkaXJzOiskaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcn0kZm91bmRfZGlyIgorICAgICAgZG9uZQorICAgICAgICAgICAgYWNsX3NhdmVfbGliZGlyPSIkbGliZGlyIgorICAgICAgbGliZGlyPSIkYWxsZGlycyIKKyAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGxpYmRpcj0iJGFjbF9zYXZlX2xpYmRpciIKKyAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9JGZsYWciCisgICAgZWxzZQorICAgICAgICAgICAgZm9yIGZvdW5kX2RpciBpbiAkcnBhdGhkaXJzOyBkbworICAgICAgICBhY2xfc2F2ZV9saWJkaXI9IiRsaWJkaXIiCisgICAgICAgIGxpYmRpcj0iJGZvdW5kX2RpciIKKyAgICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisgICAgICAgIExJQklOVEw9IiR7TElCSU5UTH0ke0xJQklOVEw6KyB9JGZsYWciCisgICAgICBkb25lCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAiWCRsdHJwYXRoZGlycyIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICBmb3IgZm91bmRfZGlyIGluICRsdHJwYXRoZGlyczsgZG8KKyAgICAgIExUTElCSU5UTD0iJHtMVExJQklOVEx9JHtMVExJQklOVEw6KyB9LVIkZm91bmRfZGlyIgorICAgIGRvbmUKKyAgZmkKKworICAgICAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgR05VIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBHTlUgZ2V0dGV4dCBpbiBsaWJpbnRsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZ3Rfc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkSU5DSU5UTCIKKyAgICAgICAgICAgIGd0X3NhdmVfTElCUz0iJExJQlMiCisgICAgICAgICAgICBMSUJTPSIkTElCUyAkTElCSU5UTCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGxpYmludGwuaD4KK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKK2V4dGVybgorI2lmZGVmIF9fY3BsdXNwbHVzCisiQyIKKyNlbmRpZgorY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoKTsKK2ludAorbWFpbiAoKQoreworYmluZHRleHRkb21haW4gKCIiLCAiIik7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpICsgX25sX21zZ19jYXRfY250ciArICpfbmxfZXhwYW5kX2FsaWFzICgwKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJpbnRsPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGw9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCIgIT0geWVzICYmIHRlc3QgLW4gIiRMSUJJQ09OViI7IHRoZW4KKyAgICAgICAgICAgICAgTElCUz0iJExJQlMgJExJQklDT05WIgorICAgICAgICAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CitleHRlcm4KKyNpZmRlZiBfX2NwbHVzcGx1cworIkMiCisjZW5kaWYKK2NvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKCk7CitpbnQKK21haW4gKCkKK3sKK2JpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKSArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2V4cGFuZF9hbGlhcyAoMCkKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIExJQklOVEw9IiRMSUJJTlRMICRMSUJJQ09OViIKKyAgICAgICAgICAgICAgICBMVExJQklOVEw9IiRMVExJQklOVEwgJExUTElCSUNPTlYiCisgICAgICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJpbnRsPXllcworCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIENQUEZMQUdTPSIkZ3Rfc2F2ZV9DUFBGTEFHUyIKKyAgICAgICAgICAgIExJQlM9IiRndF9zYXZlX0xJQlMiCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0MV9saWJpbnRsIiA+JjYKKyAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmMiID0gInllcyIgXAorICAgICAgICAgICB8fCB7IHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGwiID0gInllcyIgXAorICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXJ1bnRpbWUgXAorICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXRvb2xzOyB9OyB0aGVuCisgICAgICAgICAgZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0PXllcworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIExJQklOVEw9CisgICAgICAgICAgTFRMSUJJTlRMPQorICAgICAgICAgIElOQ0lOVEw9CisgICAgICAgIGZpCisKKworICAgICAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgQlVJTERfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIExJQklOVEw9Ilwke3RvcF9idWlsZGRpcn0vaW50bC9saWJpbnRsLmEgJExJQklDT05WIgorICAgICAgICBMVExJQklOVEw9Ilwke3RvcF9idWlsZGRpcn0vaW50bC9saWJpbnRsLmEgJExUTElCSUNPTlYiCisgICAgICAgIExJQlM9YGVjaG8gIiAkTElCUyAiIHwgc2VkIC1lICdzLyAtbGludGwgLyAvJyAtZSAncy9eIC8vJyAtZSAncy8gJC8vJ2AKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAorICAgICAgICAgfHwgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgZmkKKworCisgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIiBcCisgICAgICAgfHwgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgRU5BQkxFX05MUyAxCitfQUNFT0YKKworICAgIGVsc2UKKyAgICAgIFVTRV9OTFM9bm8KKyAgICBmaQorICBmaQorCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIHVzZSBOTFMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIHVzZSBOTFMuLi4gJEVDSE9fQyIgPiY2CisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRVU0VfTkxTIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRVU0VfTkxTIiA+JjYKKyAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hlcmUgdGhlIGdldHRleHQgZnVuY3Rpb24gY29tZXMgZnJvbSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXJlIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGNvbWVzIGZyb20uLi4gJEVDSE9fQyIgPiY2CisgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dDFfbGliaW50bCIgPSAieWVzIjsgdGhlbgorICAgICAgICBndF9zb3VyY2U9ImV4dGVybmFsIGxpYmludGwiCisgICAgICBlbHNlCisgICAgICAgIGd0X3NvdXJjZT0ibGliYyIKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZ3Rfc291cmNlPSJpbmNsdWRlZCBpbnRsIGRpcmVjdG9yeSIKKyAgICBmaQorICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRndF9zb3VyY2UiID4mNQorZWNobyAiJHtFQ0hPX1R9JGd0X3NvdXJjZSIgPiY2CisgIGZpCisKKyAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKworICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHQxX2xpYmludGwiID0gInllcyI7IHRoZW4KKyAgICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBsaW5rIHdpdGggbGliaW50bCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBsaW5rIHdpdGggbGliaW50bC4uLiAkRUNIT19DIiA+JjYKKyAgICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJExJQklOVEwiID4mNQorZWNobyAiJHtFQ0hPX1R9JExJQklOVEwiID4mNgorCisgIGZvciBlbGVtZW50IGluICRJTkNJTlRMOyBkbworICAgIGhhdmVpdD0KKyAgICBmb3IgeCBpbiAkQ1BQRkxBR1M7IGRvCisKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgZXZhbCB4PVwiJHhcIgorICBleGVjX3ByZWZpeD0iJGFjbF9zYXZlX2V4ZWNfcHJlZml4IgorICBwcmVmaXg9IiRhY2xfc2F2ZV9wcmVmaXgiCisKKyAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRlbGVtZW50IjsgdGhlbgorICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgQ1BQRkxBR1M9IiR7Q1BQRkxBR1N9JHtDUFBGTEFHUzorIH0kZWxlbWVudCIKKyAgICBmaQorICBkb25lCisKKyAgICAgIGZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfRENHRVRURVhUIDEKK19BQ0VPRgorCisgICAgZmkKKworICAgICAgICBQT1NVQj1wbworICBmaQorCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQtcnVudGltZSB8fCB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0LXRvb2xzOyB0aGVuCisgICAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKworCisKKworICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9CisgICAgbmxzX2N2X2hlYWRlcl9saWJndD0KKworICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQorCisKKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKworCisgICAgICAgIEdFTkNBVD1nZW5jYXQKKworCisgICAgICAgIGlmIHRlc3QgIiRVU0VfSU5DTFVERURfTElCSU5UTCIgPSB5ZXM7IHRoZW4KKyAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgZmkKKworCisgICAgICAgIElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYPQorCisKKworICAgIElOVExMSUJTPSIkTElCSU5UTCIKKworCisKKworCisKKworQk9JTEVSUExBVEU9Ym9pbGVycGxhdGUubWsKKworaWYgKHNoIC1jICJtYWtlIC0tdmVyc2lvbiIgMj4vZGV2L251bGwgfCBncmVwIEdOVSAyPiYxID4vZGV2L251bGwpOyB0aGVuCisgIGlmIHNoIC1jICJ2bmNta2RlcGVuZCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgQk9JTEVSUExBVEU9IiRCT0lMRVJQTEFURTpkZXBlbmQubWsiCisgIGZpCitmaQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGU6TWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIGludGwvTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW4gcmRyL01ha2VmaWxlOnJkci9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUgbmV0d29yay9NYWtlZmlsZTpuZXR3b3JrL01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSBYcmVnaW9uL01ha2VmaWxlOlhyZWdpb24vTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIHJmYi9NYWtlZmlsZTpyZmIvTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIHR4L01ha2VmaWxlOnR4L01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSB4MHZuY3NlcnZlci9NYWtlZmlsZTp4MHZuY3NlcnZlci9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUgdm5jdmlld2VyX3VuaXgvTWFrZWZpbGU6dm5jdmlld2VyX3VuaXgvTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIHZuY2NvbmZpZ191bml4L01ha2VmaWxlOnZuY2NvbmZpZ191bml4L01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSB2bmNwYXNzd2QvTWFrZWZpbGU6dm5jcGFzc3dkL01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSIKK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCisjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzLgorCitfQUNFT0YKKworIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCit7CisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICAgKmFjX3NwYWNlPVwgKikKKyAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKKyAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgICAgc2VkIC1uIFwKKwkicy8nLydcXFxcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gXAorCSJzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPVxcMi9wIgorICAgICAgOzsKKyAgICBlc2FjOworfSB8CisgIHNlZCAnCisgICAgIHQgY2xlYXIKKyAgICAgOiBjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIC9eYWNfY3ZfZW52LyFzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKyAgICAgOiBlbmQnID4+Y29uZmNhY2hlCitpZiBkaWZmICRjYWNoZV9maWxlIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCIgJiYgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+JGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworcy86KlwkKHNyY2Rpcik6Ki86LzsKK3MvOipcJHtzcmNkaXJ9OiovOi87CitzLzoqQHNyY2RpckA6Ki86LzsKK3MvXlwoW149XSo9WwkgXSpcKToqL1wxLzsKK3MvOiokLy87CitzL15bXj1dKj1bCSBdKiQvLzsKK30nCitmaQorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCisjCisjIElmIHRoZSBmaXJzdCBzZWQgc3Vic3RpdHV0aW9uIGlzIGV4ZWN1dGVkICh3aGljaCBsb29rcyBmb3IgbWFjcm9zIHRoYXQKKyMgdGFrZSBhcmd1bWVudHMpLCB0aGVuIHdlIGJyYW5jaCB0byB0aGUgcXVvdGUgc2VjdGlvbi4gIE90aGVyd2lzZSwKKyMgbG9vayBmb3IgYSBtYWNybyB0aGF0IGRvZXNuJ3QgdGFrZSBhcmd1bWVudHMuCitjYXQgPmNvbmZkZWYyb3B0LnNlZCA8PFxfQUNFT0YKK3QgY2xlYXIKKzogY2xlYXIKK3MsXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgKF1bXgkgKF0qKFteKV0qKVwpWwkgXSpcKC4qXCksLURcMT1cMixnCit0IHF1b3RlCitzLF5bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKlwoW14JIF1bXgkgXSpcKVsJIF0qXCguKlwpLC1EXDE9XDIsZwordCBxdW90ZQorZAorOiBxdW90ZQorcyxbCSBgfiMkXiYqKCl7fVxcfDsnIjw+P10sXFwmLGcKK3MsXFssXFwmLGcKK3MsXF0sXFwmLGcKK3MsXCQsJCQsZworcAorX0FDRU9GCisjIFdlIHVzZSBlY2hvIHRvIGF2b2lkIGFzc3VtaW5nIGEgcGFydGljdWxhciBsaW5lLWJyZWFraW5nIGNoYXJhY3Rlci4KKyMgVGhlIGV4dHJhIGRvdCBpcyB0byBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tIGNvbnN1bWluZyB0cmFpbGluZworIyBsaW5lLWJyZWFrcyBmcm9tIHRoZSBzdWItY29tbWFuZCBvdXRwdXQuICBBIGxpbmUtYnJlYWsgd2l0aGluCisjIHNpbmdsZS1xdW90ZXMgZG9lc24ndCB3b3JrIGJlY2F1c2UsIGlmIHRoaXMgc2NyaXB0IGlzIGNyZWF0ZWQgaW4gYQorIyBwbGF0Zm9ybSB0aGF0IHVzZXMgdHdvIGNoYXJhY3RlcnMgZm9yIGxpbmUtYnJlYWtzIChlLmcuLCBET1MpLCB0cgorIyB3b3VsZCBicmVhay4KK2FjX0xGX2FuZF9ET1Q9YGVjaG87IGVjaG8gLmAKK0RFRlM9YHNlZCAtbiAtZiBjb25mZGVmMm9wdC5zZWQgY29uZmRlZnMuaCB8IHRyICIkYWNfTEZfYW5kX0RPVCIgJyAuJ2AKK3JtIC1mIGNvbmZkZWYyb3B0LnNlZAorCisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19pPWBlY2hvICIkYWNfaSIgfAorCSBzZWQgJ3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLydgCisgICMgMi4gQWRkIHRoZW0uCisgIGFjX2xpYm9ianM9IiRhY19saWJvYmpzICRhY19pXCRVLiRhY19vYmpleHQiCisgIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyAkYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9CitjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OworICBlc2FjCisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaWJsZSB0byB0aGlzKS4KKyAgLiAuLyRhc19tZS5saW5lbm8KKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitlY2hvID5jb25mJCQuZmlsZQoraWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCisgICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgorICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KKyAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsc2UKKyAgICBhc19sbl9zPSdsbiAtcycKKyAgZmkKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCithc19ubD0nCisnCitJRlM9IiAJJGFzX25sIgorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworZXhlYyA2PiYxCisKKyMgT3BlbiB0aGUgbG9nIHJlYWwgc29vbiwgdG8ga2VlcCBcJFswXSBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuICBMb2dnaW5nIC0tdmVyc2lvbiBldGMuIGlzIE9LLgorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCit9ID4mNQorY2F0ID4mNSA8PF9DU0VPRgorCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitfQ1NFT0YKK2VjaG8gIm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYCIgPiY1CitlY2hvID4mNQorX0FDRU9GCisKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2lmIHRlc3QgLW4gIiRhY19jb25maWdfZmlsZXMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19maWxlcz1cIiRhY19jb25maWdfZmlsZXNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19oZWFkZXJzIjsgdGhlbgorICBlY2hvICJjb25maWdfaGVhZGVycz1cIiRhY19jb25maWdfaGVhZGVyc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2xpbmtzIjsgdGhlbgorICBlY2hvICJjb25maWdfbGlua3M9XCIkYWNfY29uZmlnX2xpbmtzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfY29tbWFuZHMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19jb21tYW5kcz1cIiRhY19jb25maWdfY29tbWFuZHNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKK2N1cnJlbnQgY29uZmlndXJhdGlvbi4KKworVXNhZ2U6ICQwIFtPUFRJT05TXSBbRklMRV0uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorYWNfY3NfdmVyc2lvbj0iXFwKK2NvbmZpZy5zdGF0dXMKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OSwKKyAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCisKK0NvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKK3NyY2Rpcj0kc3JjZGlyCitJTlNUQUxMPSIkSU5TVEFMTCIKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJ4JDEiIDogJ3hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIngkMSIgOiAneFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgIC0qKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAorICAgICAjIGFyZ3VtZW50cy4KKyAgICAgYWNfb3B0aW9uPSQxCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzKiB8IC1WICkKKyAgICBlY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgMCA7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIiA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgoraWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCisgIGVjaG8gInJ1bm5pbmcgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIGV4ZWMgJFNIRUxMICQwICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCitmaQorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMKKyMgSU5JVC1DT01NQU5EUyBzZWN0aW9uLgorIworCisjIENhcHR1cmUgdGhlIHZhbHVlIG9mIG9ic29sZXRlIEFMTF9MSU5HVUFTIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBjb21wdXRlCisgICAgIyBQT0ZJTEVTLCBVUERBVEVQT0ZJTEVTLCBEVU1NWVBPRklMRVMsIEdNT0ZJTEVTLCBDQVRBTE9HUy4gQnV0IGhpZGUgaXQKKyAgICAjIGZyb20gYXV0b21ha2UuCisgICAgZXZhbCAnT0JTT0xFVEVfQUxMX0xJTkdVQVMnJz0iJEFMTF9MSU5HVUFTIicKKyAgICAjIENhcHR1cmUgdGhlIHZhbHVlIG9mIExJTkdVQVMgYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGNvbXB1dGUgQ0FUQUxPR1MuCisgICAgTElOR1VBUz0iJHtMSU5HVUFTLSVVTlNFVCV9IgorCisKK19BQ0VPRgorCisKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgIiRhY19jb25maWdfdGFyZ2V0IiBpbgorICAjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KKyAgIk1ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZTpNYWtlZmlsZS5pbjokQk9JTEVSUExBVEUiIDs7CisgICJpbnRsL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpbnRsL01ha2VmaWxlIiA7OworICAicG8vTWFrZWZpbGUuaW4iICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBvL01ha2VmaWxlLmluIiA7OworICAicmRyL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyByZHIvTWFrZWZpbGU6cmRyL01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSIgOzsKKyAgIm5ldHdvcmsvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG5ldHdvcmsvTWFrZWZpbGU6bmV0d29yay9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUiIDs7CisgICJYcmVnaW9uL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBYcmVnaW9uL01ha2VmaWxlOlhyZWdpb24vTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIiA7OworICAicmZiL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyByZmIvTWFrZWZpbGU6cmZiL01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSIgOzsKKyAgInR4L01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0eC9NYWtlZmlsZTp0eC9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUiIDs7CisgICJ4MHZuY3NlcnZlci9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgeDB2bmNzZXJ2ZXIvTWFrZWZpbGU6eDB2bmNzZXJ2ZXIvTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIiA7OworICAidm5jdmlld2VyX3VuaXgvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHZuY3ZpZXdlcl91bml4L01ha2VmaWxlOnZuY3ZpZXdlcl91bml4L01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSIgOzsKKyAgInZuY2NvbmZpZ191bml4L01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB2bmNjb25maWdfdW5peC9NYWtlZmlsZTp2bmNjb25maWdfdW5peC9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUiIDs7CisgICJ2bmNwYXNzd2QvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHZuY3Bhc3N3ZC9NYWtlZmlsZTp2bmNwYXNzd2QvTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIiA7OworICAiZGVmYXVsdC0xIiApIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBkZWZhdWx0LTEiIDs7CisgICopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisjIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCisjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKyMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKKyMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCitpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcworICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcworZmkKKworIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCisjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBwdXQgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAorIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorIyBDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgaG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyRkZWJ1ZyB8fAoreworICB0cmFwICdleGl0X3N0YXR1cz0kPzsgcm0gLXJmICR0bXAgJiYgZXhpdCAkZXhpdF9zdGF0dXMnIDAKKyAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKK30KKworIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAtcSAiLi9jb25mc3RhdFhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZnN0YXQkJC0kUkFORE9NCisgICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkKK30gfHwKK3sKKyAgIGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH0KK30KKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisKKyMKKyMgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjCisKKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCitpZiB0ZXN0IC1uICJcJENPTkZJR19GSUxFUyI7IHRoZW4KKyAgIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyAgc2VkICdzLyxAL0BALzsgcy9ALC9AQC87IHMvLDt0IHRcJC9AO3QgdC87IC9AO3QgdFwkL3MvW1xcXFwmLF0vXFxcXCYvZzsKKyAgIHMvQEAvLEAvOyBzL0BAL0AsLzsgcy9AO3QgdFwkLyw7dCB0LycgPlwkdG1wL3N1YnMuc2VkIDw8XFxDRU9GCitzLEBTSEVMTEAsJFNIRUxMLDt0IHQKK3MsQFBBVEhfU0VQQVJBVE9SQCwkUEFUSF9TRVBBUkFUT1IsO3QgdAorcyxAUEFDS0FHRV9OQU1FQCwkUEFDS0FHRV9OQU1FLDt0IHQKK3MsQFBBQ0tBR0VfVEFSTkFNRUAsJFBBQ0tBR0VfVEFSTkFNRSw7dCB0CitzLEBQQUNLQUdFX1ZFUlNJT05ALCRQQUNLQUdFX1ZFUlNJT04sO3QgdAorcyxAUEFDS0FHRV9TVFJJTkdALCRQQUNLQUdFX1NUUklORyw7dCB0CitzLEBQQUNLQUdFX0JVR1JFUE9SVEAsJFBBQ0tBR0VfQlVHUkVQT1JULDt0IHQKK3MsQGV4ZWNfcHJlZml4QCwkZXhlY19wcmVmaXgsO3QgdAorcyxAcHJlZml4QCwkcHJlZml4LDt0IHQKK3MsQHByb2dyYW1fdHJhbnNmb3JtX25hbWVALCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLDt0IHQKK3MsQGJpbmRpckAsJGJpbmRpciw7dCB0CitzLEBzYmluZGlyQCwkc2JpbmRpciw7dCB0CitzLEBsaWJleGVjZGlyQCwkbGliZXhlY2Rpciw7dCB0CitzLEBkYXRhZGlyQCwkZGF0YWRpciw7dCB0CitzLEBzeXNjb25mZGlyQCwkc3lzY29uZmRpciw7dCB0CitzLEBzaGFyZWRzdGF0ZWRpckAsJHNoYXJlZHN0YXRlZGlyLDt0IHQKK3MsQGxvY2Fsc3RhdGVkaXJALCRsb2NhbHN0YXRlZGlyLDt0IHQKK3MsQGxpYmRpckAsJGxpYmRpciw7dCB0CitzLEBpbmNsdWRlZGlyQCwkaW5jbHVkZWRpciw7dCB0CitzLEBvbGRpbmNsdWRlZGlyQCwkb2xkaW5jbHVkZWRpciw7dCB0CitzLEBpbmZvZGlyQCwkaW5mb2Rpciw7dCB0CitzLEBtYW5kaXJALCRtYW5kaXIsO3QgdAorcyxAYnVpbGRfYWxpYXNALCRidWlsZF9hbGlhcyw7dCB0CitzLEBob3N0X2FsaWFzQCwkaG9zdF9hbGlhcyw7dCB0CitzLEB0YXJnZXRfYWxpYXNALCR0YXJnZXRfYWxpYXMsO3QgdAorcyxAREVGU0AsJERFRlMsO3QgdAorcyxARUNIT19DQCwkRUNIT19DLDt0IHQKK3MsQEVDSE9fTkAsJEVDSE9fTiw7dCB0CitzLEBFQ0hPX1RALCRFQ0hPX1QsO3QgdAorcyxATElCU0AsJExJQlMsO3QgdAorcyxAUEFDS0FHRUAsJFBBQ0tBR0UsO3QgdAorcyxAVkVSU0lPTkAsJFZFUlNJT04sO3QgdAorcyxAQ0NALCRDQyw7dCB0CitzLEBDRkxBR1NALCRDRkxBR1MsO3QgdAorcyxATERGTEFHU0AsJExERkxBR1MsO3QgdAorcyxAQ1BQRkxBR1NALCRDUFBGTEFHUyw7dCB0CitzLEBhY19jdF9DQ0AsJGFjX2N0X0NDLDt0IHQKK3MsQEVYRUVYVEAsJEVYRUVYVCw7dCB0CitzLEBPQkpFWFRALCRPQkpFWFQsO3QgdAorcyxAQ1hYQCwkQ1hYLDt0IHQKK3MsQENYWEZMQUdTQCwkQ1hYRkxBR1MsO3QgdAorcyxAYWNfY3RfQ1hYQCwkYWNfY3RfQ1hYLDt0IHQKK3MsQFJBTkxJQkAsJFJBTkxJQiw7dCB0CitzLEBhY19jdF9SQU5MSUJALCRhY19jdF9SQU5MSUIsO3QgdAorcyxAU0VUX01BS0VALCRTRVRfTUFLRSw7dCB0CitzLEBNSVRTSE1fREVGSU5FQCwkTUlUU0hNX0RFRklORSw7dCB0CitzLEBDWFhDUFBALCRDWFhDUFAsO3QgdAorcyxAWF9DRkxBR1NALCRYX0NGTEFHUyw7dCB0CitzLEBYX1BSRV9MSUJTQCwkWF9QUkVfTElCUyw7dCB0CitzLEBYX0xJQlNALCRYX0xJQlMsO3QgdAorcyxAWF9FWFRSQV9MSUJTQCwkWF9FWFRSQV9MSUJTLDt0IHQKK3MsQFpMSUJfRElSQCwkWkxJQl9ESVIsO3QgdAorcyxAWkxJQl9JTkNMVURFQCwkWkxJQl9JTkNMVURFLDt0IHQKK3MsQFpMSUJfTElCQCwkWkxJQl9MSUIsO3QgdAorcyxASlBFR19ESVJALCRKUEVHX0RJUiw7dCB0CitzLEBKUEVHX0lOQ0xVREVALCRKUEVHX0lOQ0xVREUsO3QgdAorcyxASlBFR19MSUJALCRKUEVHX0xJQiw7dCB0CitzLEBWTkNDT05GSUdfRElSQCwkVk5DQ09ORklHX0RJUiw7dCB0CitzLEBYVEVTVF9ERUZJTkVALCRYVEVTVF9ERUZJTkUsO3QgdAorcyxAWFRFU1RfTElCQCwkWFRFU1RfTElCLDt0IHQKK3MsQFJFQURESVNQTEFZX0RFRklORUAsJFJFQURESVNQTEFZX0RFRklORSw7dCB0CitzLEBWU05QUklOVEZfREVGSU5FQCwkVlNOUFJJTlRGX0RFRklORSw7dCB0CitzLEBTVFJDQVNFQ01QX0RFRklORUAsJFNUUkNBU0VDTVBfREVGSU5FLDt0IHQKK3MsQFNUUk5DQVNFQ01QX0RFRklORUAsJFNUUk5DQVNFQ01QX0RFRklORSw7dCB0CitzLEBJTkVUX0xJQkAsJElORVRfTElCLDt0IHQKK3MsQFNPQ0tMRU5fVF9ERUZJTkVALCRTT0NLTEVOX1RfREVGSU5FLDt0IHQKK3MsQElOU1RBTExfUFJPR1JBTUAsJElOU1RBTExfUFJPR1JBTSw7dCB0CitzLEBJTlNUQUxMX1NDUklQVEAsJElOU1RBTExfU0NSSVBULDt0IHQKK3MsQElOU1RBTExfREFUQUAsJElOU1RBTExfREFUQSw7dCB0CitzLEBNS0lOU1RBTExESVJTQCwkTUtJTlNUQUxMRElSUyw7dCB0CitzLEBVU0VfTkxTQCwkVVNFX05MUyw7dCB0CitzLEBNU0dGTVRALCRNU0dGTVQsO3QgdAorcyxAR01TR0ZNVEAsJEdNU0dGTVQsO3QgdAorcyxAWEdFVFRFWFRALCRYR0VUVEVYVCw7dCB0CitzLEBNU0dNRVJHRUAsJE1TR01FUkdFLDt0IHQKK3MsQGJ1aWxkQCwkYnVpbGQsO3QgdAorcyxAYnVpbGRfY3B1QCwkYnVpbGRfY3B1LDt0IHQKK3MsQGJ1aWxkX3ZlbmRvckAsJGJ1aWxkX3ZlbmRvciw7dCB0CitzLEBidWlsZF9vc0AsJGJ1aWxkX29zLDt0IHQKK3MsQGhvc3RALCRob3N0LDt0IHQKK3MsQGhvc3RfY3B1QCwkaG9zdF9jcHUsO3QgdAorcyxAaG9zdF92ZW5kb3JALCRob3N0X3ZlbmRvciw7dCB0CitzLEBob3N0X29zQCwkaG9zdF9vcyw7dCB0CitzLEBFR1JFUEAsJEVHUkVQLDt0IHQKK3MsQEFMTE9DQUAsJEFMTE9DQSw7dCB0CitzLEBHTElCQzIxQCwkR0xJQkMyMSw7dCB0CitzLEBIQVZFX1BPU0lYX1BSSU5URkAsJEhBVkVfUE9TSVhfUFJJTlRGLDt0IHQKK3MsQEhBVkVfQVNQUklOVEZALCRIQVZFX0FTUFJJTlRGLDt0IHQKK3MsQEhBVkVfU05QUklOVEZALCRIQVZFX1NOUFJJTlRGLDt0IHQKK3MsQEhBVkVfV1BSSU5URkAsJEhBVkVfV1BSSU5URiw7dCB0CitzLEBMSUJJQ09OVkAsJExJQklDT05WLDt0IHQKK3MsQExUTElCSUNPTlZALCRMVExJQklDT05WLDt0IHQKK3MsQElOVExCSVNPTkAsJElOVExCSVNPTiw7dCB0CitzLEBCVUlMRF9JTkNMVURFRF9MSUJJTlRMQCwkQlVJTERfSU5DTFVERURfTElCSU5UTCw7dCB0CitzLEBVU0VfSU5DTFVERURfTElCSU5UTEAsJFVTRV9JTkNMVURFRF9MSUJJTlRMLDt0IHQKK3MsQENBVE9CSkVYVEAsJENBVE9CSkVYVCw7dCB0CitzLEBEQVRBRElSTkFNRUAsJERBVEFESVJOQU1FLDt0IHQKK3MsQElOU1RPQkpFWFRALCRJTlNUT0JKRVhULDt0IHQKK3MsQEdFTkNBVEAsJEdFTkNBVCw7dCB0CitzLEBJTlRMT0JKU0AsJElOVExPQkpTLDt0IHQKK3MsQElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYQCwkSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVgsO3QgdAorcyxASU5UTExJQlNALCRJTlRMTElCUyw7dCB0CitzLEBMSUJJTlRMQCwkTElCSU5UTCw7dCB0CitzLEBMVExJQklOVExALCRMVExJQklOVEwsO3QgdAorcyxAUE9TVUJALCRQT1NVQiw7dCB0CitzLEBMSUJPQkpTQCwkTElCT0JKUyw7dCB0CitzLEBMVExJQk9CSlNALCRMVExJQk9CSlMsO3QgdAorQ0VPRgorCitfQUNFT0YKKworICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyAgIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyAgIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCisgIGFjX21heF9zZWRfbGluZXM9NDgKKyAgYWNfc2VkX2ZyYWc9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCisgIGFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19lbmQ9JGFjX21heF9zZWRfbGluZXMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19tb3JlX2xpbmVzPToKKyAgYWNfc2VkX2NtZHM9CisgIHdoaWxlICRhY19tb3JlX2xpbmVzOyBkbworICAgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZWxzZQorICAgICAgc2VkICIke2FjX2VuZH1xIiAkdG1wL3N1YnMuc2VkID4kdG1wL3N1YnMuZnJhZworICAgIGZpCisgICAgaWYgdGVzdCAhIC1zICR0bXAvc3Vicy5mcmFnOyB0aGVuCisgICAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgZWxzZQorICAgICAgIyBUaGUgcHVycG9zZSBvZiB0aGUgbGFiZWwgYW5kIG9mIHRoZSBicmFuY2hpbmcgY29uZGl0aW9uIGlzIHRvCisgICAgICAjIHNwZWVkIHVwIHRoZSBzZWQgcHJvY2Vzc2luZyAoaWYgdGhlcmUgYXJlIG5vIGBAJyBhdCBhbGwsIHRoZXJlCisgICAgICAjIGlzIG5vIG5lZWQgdG8gYnJvd3NlIGFueSBvZiB0aGUgc3Vic3RpdHV0aW9ucykuCisgICAgICAjIFRoZXNlIGFyZSB0aGUgdHdvIGV4dHJhIHNlZCBjb21tYW5kcyBtZW50aW9uZWQgYWJvdmUuCisgICAgICAoZWNobyAnOnQKKyAgL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYicgJiYgY2F0ICR0bXAvc3Vicy5mcmFnKSA+JHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQKKyAgICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKwlhY19zZWRfY21kcz0ic2VkIC1mICR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkIgorICAgICAgZWxzZQorCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBmaQorICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKKyAgICAgIGFjX2JlZz0kYWNfZW5kCisgICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgIGFjX3NlZF9jbWRzPWNhdAorICBmaQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0ZJTEVTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorCWNhdCA+JHRtcC9zdGRpbgorCWFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqICkgICBhY19maWxlX2luPSRhY19maWxlLmluIDs7CisgIGVzYWMKKworICAjIENvbXB1dGUgQHNyY2RpckAsIEB0b3Bfc3JjZGlyQCwgYW5kIEBJTlNUQUxMQCBmb3Igc3ViZGlyZWN0b3JpZXMuCisgIGFjX2Rpcj1gKGRpcm5hbWUgIiRhY19maWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgIHsgaWYgJGFzX21rZGlyX3A7IHRoZW4KKyAgICBta2RpciAtcCAiJGFjX2RpciIKKyAgZWxzZQorICAgIGFzX2Rpcj0iJGFjX2RpciIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICBhY19idWlsZGRpcj0uCisKK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCitlbHNlCisgIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KK2ZpCisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBpZiB0ZXN0IC16ICIkYWNfdG9wX2J1aWxkZGlyIjsgdGhlbgorICAgICAgIGFjX3RvcF9zcmNkaXI9LgorICAgIGVsc2UKKyAgICAgICBhY190b3Bfc3JjZGlyPWBlY2hvICRhY190b3BfYnVpbGRkaXIgfCBzZWQgJ3MsLyQsLCdgCisgICAgZmkgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIgOzsKK2VzYWMKKworIyBEbyBub3QgdXNlIGBjZCBmb28gJiYgcHdkYCB0byBjb21wdXRlIGFic29sdXRlIHBhdGhzLCBiZWNhdXNlCisjIHRoZSBkaXJlY3RvcmllcyBtYXkgbm90IGV4aXN0LgorY2FzZSBgcHdkYCBpbgorLikgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisqKQorICBjYXNlICIkYWNfZGlyIiBpbgorICAuKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGA7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworICAqKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGAvIiRhY19kaXIiOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisqKQorICBjYXNlICR7YWNfdG9wX2J1aWxkZGlyfS4gaW4KKyAgLikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworICAqKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXIvJHthY190b3BfYnVpbGRkaXJ9Ljs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfc3JjZGlyIGluCisgIC4pIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY19zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfdG9wX3NyY2RpciBpbgorICAuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisgICopIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3RvcF9zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKKworCisgIGNhc2UgJElOU1RBTEwgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRkaXIkSU5TVEFMTCA7OworICBlc2FjCisKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgcm0gLWYgIiRhY19maWxlIgorICBmaQorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgorICAgIGNvbmZpZ3VyZV9pbnB1dD0KKyAgZWxzZQorICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAiCisgIGZpCisgIGNvbmZpZ3VyZV9pbnB1dD0kY29uZmlndXJlX2lucHV0IkdlbmVyYXRlZCBmcm9tIGBlY2hvICRhY19maWxlX2luIHwKKwkJCQkgICAgIHNlZCAncywuKi8sLCdgIGJ5IGNvbmZpZ3VyZS4iCisKKyAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKKyAgIyBzcmMgdHJlZS4KKyAgYWNfZmlsZV9pbnB1dHM9YElGUz06CisgICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKKyAgICAgIFtcXC8kXSopCisJICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCisJIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBlY2hvICIkZiI7OworICAgICAgKikgIyBSZWxhdGl2ZQorCSBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKwkgICAjIEJ1aWxkIHRyZWUKKwkgICBlY2hvICIkZiIKKwkgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgorCSAgICMgU291cmNlIHRyZWUKKwkgICBlY2hvICIkc3JjZGlyLyRmIgorCSBlbHNlCisJICAgIyAvZGV2L251bGwgdHJlZQorCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJIGZpOzsKKyAgICAgIGVzYWMKKyAgICBkb25lYCB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyAgc2VkICIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzLEBjb25maWd1cmVfaW5wdXRALCRjb25maWd1cmVfaW5wdXQsO3QgdAorcyxAc3JjZGlyQCwkYWNfc3JjZGlyLDt0IHQKK3MsQGFic19zcmNkaXJALCRhY19hYnNfc3JjZGlyLDt0IHQKK3MsQHRvcF9zcmNkaXJALCRhY190b3Bfc3JjZGlyLDt0IHQKK3MsQGFic190b3Bfc3JjZGlyQCwkYWNfYWJzX3RvcF9zcmNkaXIsO3QgdAorcyxAYnVpbGRkaXJALCRhY19idWlsZGRpciw7dCB0CitzLEBhYnNfYnVpbGRkaXJALCRhY19hYnNfYnVpbGRkaXIsO3QgdAorcyxAdG9wX2J1aWxkZGlyQCwkYWNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQGFic190b3BfYnVpbGRkaXJALCRhY19hYnNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQElOU1RBTExALCRhY19JTlNUQUxMLDt0IHQKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4kdG1wL291dAorICBybSAtZiAkdG1wL3N0ZGluCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBtdiAkdG1wL291dCAkYWNfZmlsZQorICBlbHNlCisgICAgY2F0ICR0bXAvb3V0CisgICAgcm0gLWYgJHRtcC9vdXQKKyAgZmkKKworZG9uZQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKworIworIyBDT05GSUdfQ09NTUFORFMgc2VjdGlvbi4KKyMKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19DT01NQU5EUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgIGFjX2Rlc3Q9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgCisgIGFjX3NvdXJjZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2Rlc3QiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYWNfZGVzdCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhY19kZXN0IiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgeyBpZiAkYXNfbWtkaXJfcDsgdGhlbgorICAgIG1rZGlyIC1wICIkYWNfZGlyIgorICBlbHNlCisgICAgYXNfZGlyPSIkYWNfZGlyIgorICAgIGFzX2RpcnM9CisgICAgd2hpbGUgdGVzdCAhIC1kICIkYXNfZGlyIjsgZG8KKyAgICAgIGFzX2RpcnM9IiRhc19kaXIgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YChkaXJuYW1lICIkYXNfZGlyIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgIGRvbmUKKyAgICB0ZXN0ICEgLW4gIiRhc19kaXJzIiB8fCBta2RpciAkYXNfZGlycworICBmaSB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorCisgIGFjX2J1aWxkZGlyPS4KKworaWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCisgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC4uLyxnJ2AKK2Vsc2UKKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQorZmkKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCisgICAgICAgYWNfdG9wX3NyY2Rpcj0uCisgICAgZWxzZQorICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKKyAgICBmaSA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIHBhdGguCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OworZXNhYworCisjIERvIG5vdCB1c2UgYGNkIGZvbyAmJiBwd2RgIHRvIGNvbXB1dGUgYWJzb2x1dGUgcGF0aHMsIGJlY2F1c2UKKyMgdGhlIGRpcmVjdG9yaWVzIG1heSBub3QgZXhpc3QuCitjYXNlIGBwd2RgIGluCisuKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyopCisgIGNhc2UgIiRhY19kaXIiIGluCisgIC4pIGFjX2Fic19idWlsZGRpcj1gcHdkYDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisgICopIGFjX2Fic19idWlsZGRpcj1gcHdkYC8iJGFjX2RpciI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyopCisgIGNhc2UgJHthY190b3BfYnVpbGRkaXJ9LiBpbgorICAuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisgICopIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpci8ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY19zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworICAqKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY190b3Bfc3JjZGlyIGluCisgIC4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfdG9wX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworCisKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19kZXN0IGNvbW1hbmRzIiA+JjUKK2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19kZXN0IGNvbW1hbmRzIiA+JjY7fQorICBjYXNlICRhY19kZXN0IGluCisgICAgZGVmYXVsdC0xICkKKyAgICBmb3IgYWNfZmlsZSBpbiAkQ09ORklHX0ZJTEVTOyBkbworICAgICAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIgorICAgICAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICAgICAgICo6KikgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICAgICBlc2FjCisgICAgICAjIFBPIGRpcmVjdG9yaWVzIGhhdmUgYSBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi5pbi4KKyAgICAgIGNhc2UgIiRhY19maWxlIiBpbiAqL01ha2VmaWxlLmluKQorICAgICAgICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2Rpci4KKyAgICAgICAgYWNfZGlyPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gIiRhY19kaXIifHNlZCAncyVeXC4vJSUnYCIKKyAgICAgICAgYWNfZG90cz1gZWNobyAiJGFjX2Rpcl9zdWZmaXgifHNlZCAncyUvW14vXSolLi4vJWcnYAorICAgICAgICAjIEluIGF1dG9jb25mLTIuMTMgaXQgaXMgY2FsbGVkICRhY19naXZlbl9zcmNkaXIuCisgICAgICAgICMgSW4gYXV0b2NvbmYtMi41MCBpdCBpcyBjYWxsZWQgJHNyY2Rpci4KKyAgICAgICAgdGVzdCAtbiAiJGFjX2dpdmVuX3NyY2RpciIgfHwgYWNfZ2l2ZW5fc3JjZGlyPSIkc3JjZGlyIgorICAgICAgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAgICAgICAgIC4pICB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2AgOzsKKyAgICAgICAgICAvKikgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgICAgICAgICAqKSAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAgICAgICBlc2FjCisgICAgICAgIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9QT1RGSUxFUy5pbiI7IHRoZW4KKyAgICAgICAgICBybSAtZiAiJGFjX2Rpci9QT1RGSUxFUyIKKyAgICAgICAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIgfHwgZWNobyAiY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIKKyAgICAgICAgICBjYXQgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9QT1RGSUxFUy5pbiIgfCBzZWQgLWUgIi9eIy9kIiAtZSAiL15bIAldKlwkL2QiIC1lICJzLC4qLCAgICAgJHRvcF9zcmNkaXIvJiBcXFxcLCIgfCBzZWQgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iID4gIiRhY19kaXIvUE9URklMRVMiCisgICAgICAgICAgUE9NQUtFRklMRURFUFM9IlBPVEZJTEVTLmluIgorICAgICAgICAgICMgQUxMX0xJTkdVQVMsIFBPRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUywgR01PRklMRVMgZGVwZW5kCisgICAgICAgICAgIyBvbiAkYWNfZGlyIGJ1dCBkb24ndCBkZXBlbmQgb24gdXNlci1zcGVjaWZpZWQgY29uZmlndXJhdGlvbgorICAgICAgICAgICMgcGFyYW1ldGVycy4KKyAgICAgICAgICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgICMgVGhlIExJTkdVQVMgZmlsZSBjb250YWlucyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkT0JTT0xFVEVfQUxMX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIgfHwgZWNobyAic2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgQUxMX0xJTkdVQVNfPWBzZWQgLWUgIi9eIy9kIiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL0xJTkdVQVMiYAorICAgICAgICAgICAgIyBIaWRlIHRoZSBBTExfTElOR1VBUyBhc3NpZ21lbnQgZnJvbSBhdXRvbWFrZS4KKyAgICAgICAgICAgIGV2YWwgJ0FMTF9MSU5HVUFTJyc9JEFMTF9MSU5HVUFTXycKKyAgICAgICAgICAgIFBPTUFLRUZJTEVERVBTPSIkUE9NQUtFRklMRURFUFMgTElOR1VBUyIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIFRoZSBzZXQgb2YgYXZhaWxhYmxlIGxhbmd1YWdlcyB3YXMgZ2l2ZW4gaW4gY29uZmlndXJlLmluLgorICAgICAgICAgICAgZXZhbCAnQUxMX0xJTkdVQVMnJz0kT0JTT0xFVEVfQUxMX0xJTkdVQVMnCisgICAgICAgICAgZmkKKyAgICAgICAgICAjIENvbXB1dGUgUE9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLnBvKQorICAgICAgICAgICMgQ29tcHV0ZSBVUERBVEVQT0ZJTEVTCisgICAgICAgICAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChsYW5nKS5wby11cGRhdGUpCisgICAgICAgICAgIyBDb21wdXRlIERVTU1ZUE9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykubm9wKQorICAgICAgICAgICMgQ29tcHV0ZSBHTU9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLmdtbykKKyAgICAgICAgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAgICAgICAgICAgLikgc3JjZGlycHJlPSA7OworICAgICAgICAgICAgKikgc3JjZGlycHJlPSckKHNyY2RpcikvJyA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgICBQT0ZJTEVTPQorICAgICAgICAgIFVQREFURVBPRklMRVM9CisgICAgICAgICAgRFVNTVlQT0ZJTEVTPQorICAgICAgICAgIEdNT0ZJTEVTPQorICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgICAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5wbyIKKyAgICAgICAgICAgIFVQREFURVBPRklMRVM9IiRVUERBVEVQT0ZJTEVTICRsYW5nLnBvLXVwZGF0ZSIKKyAgICAgICAgICAgIERVTU1ZUE9GSUxFUz0iJERVTU1ZUE9GSUxFUyAkbGFuZy5ub3AiCisgICAgICAgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5nbW8iCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgQ0FUQUxPR1MgZGVwZW5kcyBvbiBib3RoICRhY19kaXIgYW5kIHRoZSB1c2VyJ3MgTElOR1VBUworICAgICAgICAgICMgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICAgICAgSU5TVF9MSU5HVUFTPQorICAgICAgICAgIGlmIHRlc3QgLW4gIiRBTExfTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgIGZvciBwcmVzZW50bGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICAgICAgICAgIHVzZWl0PW5vCisgICAgICAgICAgICAgIGlmIHRlc3QgIiVVTlNFVCUiICE9ICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkTElOR1VBUyIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlc2lyZWRsYW5ndWFnZXM9IiRBTExfTElOR1VBUyIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZm9yIGRlc2lyZWRsYW5nIGluICRkZXNpcmVkbGFuZ3VhZ2VzOyBkbworICAgICAgICAgICAgICAgICMgVXNlIHRoZSBwcmVzZW50bGFuZyBjYXRhbG9nIGlmIGRlc2lyZWRsYW5nIGlzCisgICAgICAgICAgICAgICAgIyAgIGEuIGVxdWFsIHRvIHByZXNlbnRsYW5nLCBvcgorICAgICAgICAgICAgICAgICMgICBiLiBhIHZhcmlhbnQgb2YgcHJlc2VudGxhbmcgKGJlY2F1c2UgaW4gdGhpcyBjYXNlLAorICAgICAgICAgICAgICAgICMgICAgICBwcmVzZW50bGFuZyBjYW4gYmUgdXNlZCBhcyBhIGZhbGxiYWNrIGZvciBtZXNzYWdlcworICAgICAgICAgICAgICAgICMgICAgICB3aGljaCBhcmUgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGRlc2lyZWRsYW5nIGNhdGFsb2cpLgorICAgICAgICAgICAgICAgIGNhc2UgIiRkZXNpcmVkbGFuZyIgaW4KKyAgICAgICAgICAgICAgICAgICIkcHJlc2VudGxhbmciKikgdXNlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgaWYgdGVzdCAkdXNlaXQgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlNUX0xJTkdVQVM9IiRJTlNUX0xJTkdVQVMgJHByZXNlbnRsYW5nIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgQ0FUQUxPR1M9CisgICAgICAgICAgaWYgdGVzdCAtbiAiJElOU1RfTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgIGZvciBsYW5nIGluICRJTlNUX0xJTkdVQVM7IGRvCisgICAgICAgICAgICAgIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmcuZ21vIgorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdCAtbiAiJGFzX21lIiAmJiBlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19kaXIvTWFrZWZpbGUiIHx8IGVjaG8gImNyZWF0aW5nICRhY19kaXIvTWFrZWZpbGUiCisgICAgICAgICAgc2VkIC1lICIvXlBPVEZJTEVTID0vciAkYWNfZGlyL1BPVEZJTEVTIiAtZSAiL14jIE1ha2V2YXJzL3IgJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL01ha2V2YXJzIiAtZSAic3xAUE9GSUxFU0B8JFBPRklMRVN8ZyIgLWUgInN8QFVQREFURVBPRklMRVNAfCRVUERBVEVQT0ZJTEVTfGciIC1lICJzfEBEVU1NWVBPRklMRVNAfCREVU1NWVBPRklMRVN8ZyIgLWUgInN8QEdNT0ZJTEVTQHwkR01PRklMRVN8ZyIgLWUgInN8QENBVEFMT0dTQHwkQ0FUQUxPR1N8ZyIgLWUgInN8QFBPTUFLRUZJTEVERVBTQHwkUE9NQUtFRklMRURFUFN8ZyIgIiRhY19kaXIvTWFrZWZpbGUuaW4iID4gIiRhY19kaXIvTWFrZWZpbGUiCisgICAgICAgICAgZm9yIGYgaW4gIiRhY19naXZlbl9zcmNkaXIvJGFjX2RpciIvUnVsZXMtKjsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorICAgICAgICAgICAgICBjYXNlICIkZiIgaW4KKyAgICAgICAgICAgICAgICAqLm9yaWcgfCAqLmJhayB8ICp+KSA7OworICAgICAgICAgICAgICAgICopIGNhdCAiJGYiID4+ICIkYWNfZGlyL01ha2VmaWxlIiA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lIDs7CisgIGVzYWMKK2RvbmUKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKworeyAoZXhpdCAwKTsgZXhpdCAwOyB9CitfQUNFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK2ZpCisKZGlmZiAtLWdpdCBhL3VuaXgvY29uZmlndXJlLmluIGIvdW5peC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1OGYyNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTk4IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK0FDX0lOSVQodm5jdmlld2VyX3VuaXgvdm5jdmlld2VyLmN4eCkKKworUEFDS0FHRT10aWdodHZuYworVkVSU0lPTj0xLjUuMAorQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIpCitBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIikKK0FDX1NVQlNUKFBBQ0tBR0UpCitBQ19TVUJTVChWRVJTSU9OKQorCitkbmwgZGlydHkgaGFjayB0byBwcmV2ZW50IHVzZSBvZiAtZyBpbiBDRkxBR1MgYW5kIENYWEZMQUdTCithY19jdl9wcm9nX2NjX2c9bm8KK2FjX2N2X3Byb2dfY3h4X2c9bm8KKworZG5sIENoZWNrcyBmb3IgcHJvZ3JhbXMuCitBQ19QUk9HX0NDCitBQ19QUk9HX0NYWAorQUNfUFJPR19SQU5MSUIKK0FDX1BST0dfTUFLRV9TRVQKK0FDX0xBTkdfQ1BMVVNQTFVTCisKK2Nhc2UgImAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAiIGluCisiU3VuT1MgNSIqKQorICBTT0xBUklTPXllcworICBVU0VfTUlUU0hNPXllcworICBVU0VfU1VOX09WTD15ZXMKKyAgOzsKKyJMaW51eCIqKQorICBMSU5VWD15ZXMKKyAgVVNFX01JVFNITT15ZXMKKyAgOzsKKyJJUklYIDYiKikKKyAgWF9MSUJTPSItTC91c3IvbGliMzIiCisgIFVTRV9NSVRTSE09eWVzCisgIFVTRV9SRUFERElTUExBWT15ZXMKKyAgOzsKKyJMeW54T1MgMiIqKQorICBTSkxKX0VYQ0VQVElPTlM9eWVzCisgIDs7Citlc2FjCisKK2RubCBGSVhNRTogQ2hlY2sgZm9yIE1JVC1TSE0gcHJvcGVybHksIGFkZCBhIGNvcnJlc3BvbmRpbmcgLS13aXRoIG9wdGlvbi4KK2lmIHRlc3QgIiRVU0VfTUlUU0hNIiA9IHllczsgdGhlbgorICBNSVRTSE1fREVGSU5FPSItREhBVkVfTUlUU0hNIgorZmkKK0FDX1NVQlNUKE1JVFNITV9ERUZJTkUpCisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKKyAgaWYgdGVzdCAiJFNPTEFSSVMiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xbm8tdW5rbm93bi1wcmFnbWFzIC1Xbm8taW1wbGljaXQtaW50IgorICBmaQorZmkKK2lmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLVdhbGwiCisgIGlmIHRlc3QgIiRTT0xBUklTIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLVduby11bmtub3duLXByYWdtYXMgLWZwZXJtaXNzaXZlIgorICBmaQorICBpZiB0ZXN0ICIkU0pMSl9FWENFUFRJT05TIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLWZzamxqLWV4Y2VwdGlvbnMiCisgIGZpCitmaQorCitBQ19QQVRIX1hUUkEKKworQUNfQVJHX1dJVEgoaW5zdGFsbGVkLXpsaWIsCitbICAtLXdpdGgtaW5zdGFsbGVkLXpsaWIgICB1c2UgdGhlIHZlcnNpb24gb2YgemxpYiB3aGljaCBpcyBpbnN0YWxsZWQgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBpbnN0ZWFkIG9mIHRoZSBvbmUgZGlzdHJpYnV0ZWQgd2l0aCBWTkNdKQorCitpZiB0ZXN0ICIkd2l0aF9pbnN0YWxsZWRfemxpYiIgPSB5ZXM7IHRoZW4KKyAgZWNobyAidXNpbmcgaW5zdGFsbGVkIHpsaWIiCisgIFpMSUJfTElCPS1segorZWxzZQorICBaTElCX0RJUj16bGliCisgIFpMSUJfSU5DTFVERT0nLUkkKHRvcF9zcmNkaXIpL3psaWInCisgIFpMSUJfTElCPSckKHRvcF9zcmNkaXIpL3psaWIvbGliei5hJworICBlY2hvICJjb25maWd1cmluZyB6bGliLi4uIgorICAoY2QgemxpYjsgLi9jb25maWd1cmUpCisgIGVjaG8gIi4uLmRvbmUgY29uZmlndXJpbmcgemxpYiIKK2ZpCisKK0FDX1NVQlNUKFpMSUJfRElSKQorQUNfU1VCU1QoWkxJQl9JTkNMVURFKQorQUNfU1VCU1QoWkxJQl9MSUIpCisKK0FDX0FSR19XSVRIKGluc3RhbGxlZC1qcGVnLAorWyAgLS13aXRoLWluc3RhbGxlZC1qcGVnICAgdXNlIHRoZSB2ZXJzaW9uIG9mIGpwZWcgd2hpY2ggaXMgaW5zdGFsbGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gaW5zdGVhZCBvZiB0aGUgb25lIGRpc3RyaWJ1dGVkIHdpdGggVk5DXSkKKworaWYgdGVzdCAiJHdpdGhfaW5zdGFsbGVkX2pwZWciID0geWVzOyB0aGVuCisgIGVjaG8gInVzaW5nIGluc3RhbGxlZCBqcGVnIgorICBKUEVHX0xJQj0tbGpwZWcKK2Vsc2UKKyAgSlBFR19ESVI9anBlZy9idWlsZAorICBKUEVHX0lOQ0xVREU9Jy1JJCh0b3Bfc3JjZGlyKS9qcGVnJworICBKUEVHX0xJQj0nJCh0b3Bfc3JjZGlyKS9qcGVnL2J1aWxkL2xpYmpwZWcuYScKKyAgZWNobyAiY29uZmlndXJpbmcganBlZy4uLiIKKyAgKG1rZGlyIGpwZWcvYnVpbGQ7IGNkIGpwZWcvYnVpbGQ7IC4uL2NvbmZpZ3VyZSkKKyAgZWNobyAiLi4uZG9uZSBjb25maWd1cmluZyBqcGVnIgorZmkKKworQUNfU1VCU1QoSlBFR19ESVIpCitBQ19TVUJTVChKUEVHX0lOQ0xVREUpCitBQ19TVUJTVChKUEVHX0xJQikKKworQUNfQVJHX0VOQUJMRSh2bmNjb25maWcsCitbICAtLWVuYWJsZS12bmNjb25maWcgICAgICBidWlsZCB0aGUgdm5jY29uZmlnIHV0aWxpdHkgKGFzc3VtZWQgYnkgZGVmYXVsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSAtLWRpc2FibGUtdm5jY29uZmlnIHRvIHNraXAgYnVpbGRpbmcgdm5jY29uZmlnXSkKK2lmIHRlc3QgIiRlbmFibGVfdm5jY29uZmlnIiA9IG5vOyB0aGVuCisgIGVjaG8gInZuY2NvbmZpZyB1dGlsaXR5IHdpbGwgbm90IGJlIGJ1aWx0IgorICBWTkNDT05GSUdfRElSPQorZWxzZQorICBWTkNDT05GSUdfRElSPSd2bmNjb25maWdfdW5peCcKK2ZpCitBQ19TVUJTVChWTkNDT05GSUdfRElSKQorCitkbmwgQ2hlY2sgZm9yIHRoZSBYVGVzdCBYMTEgZXh0ZW5zaW9uIGxpYnJhcnkuCitBQ19DSEVDS19MSUIoWHRzdCxYVGVzdEdyYWJDb250cm9sLFVTRV9YVEVTVD15ZXMsVVNFX1hURVNUPSwKK1siJFhfTElCUyIgLWxYZXh0IC1sWDExXSkKK2lmIHRlc3QgIiRVU0VfWFRFU1QiID0geWVzOyB0aGVuCisgIFhURVNUX0RFRklORT0nLURIQVZFX1hURVNUJworICBYVEVTVF9MSUI9LWxYdHN0CitlbHNlCisgIGVjaG8gV2FybmluZzogTm8gWFRlc3QgZXh0ZW5zaW9uLCBidWlsZGluZyB4MHZuY3NlcnZlciB2aWV3LW9ubHkKKyAgWFRFU1RfREVGSU5FPQorICBYVEVTVF9MSUI9CitmaQorQUNfU1VCU1QoWFRFU1RfREVGSU5FKQorQUNfU1VCU1QoWFRFU1RfTElCKQorCitkbmwgU3VwcG9ydCBmb3IgUkVBRERJU1BMQVkgKElyaXgpIGFuZCBTVU5fT1ZMIChTb2xhcmlzKSBleHRlbnNpb25zCitkbmwgRklYTUU6IEltcGxlbWVudCBjb3JyZXNwb25kaW5nIC0td2l0aCBvcHRpb25zLgoraWYgdGVzdCAiJFVTRV9SRUFERElTUExBWSIgPSB5ZXM7IHRoZW4KKyAgUkVBRERJU1BMQVlfREVGSU5FPSctREhBVkVfUkVBRERJU1BMQVknCitlbGlmIHRlc3QgIiRVU0VfU1VOX09WTCIgPSB5ZXM7IHRoZW4KKyAgUkVBRERJU1BMQVlfREVGSU5FPSctREhBVkVfU1VOX09WTCcKK2Vsc2UKKyAgUkVBRERJU1BMQVlfREVGSU5FPQorZmkKK0FDX1NVQlNUKFJFQURESVNQTEFZX0RFRklORSkKKworQUNfQ0hFQ0tfRlVOQyh2c25wcmludGYsVlNOUFJJTlRGX0RFRklORT0nLURIQVZFX1ZTTlBSSU5URicsVlNOUFJJTlRGX0RFRklORT0pCitBQ19TVUJTVChWU05QUklOVEZfREVGSU5FKQorCitBQ19DSEVDS19GVU5DKHN0cmNhc2VjbXAsU1RSQ0FTRUNNUF9ERUZJTkU9Jy1ESEFWRV9TVFJDQVNFQ01QJywKKyAgU1RSQ0FTRUNNUF9ERUZJTkU9KQorQUNfU1VCU1QoU1RSQ0FTRUNNUF9ERUZJTkUpCisKK0FDX0NIRUNLX0ZVTkMoc3RybmNhc2VjbXAsU1RSTkNBU0VDTVBfREVGSU5FPSctREhBVkVfU1RSTkNBU0VDTVAnLAorICBTVFJOQ0FTRUNNUF9ERUZJTkU9KQorQUNfU1VCU1QoU1RSTkNBU0VDTVBfREVGSU5FKQorCitkbmwgVW5kZXIgTHlueC9PUyAyLjMsIHdlIGhhdmUgdG8gbGluayB3aXRoIC1sYnNkIHRvIHJlc29sdmUKK2RubCBnZXRob3N0YnluYW1lLCBpbmV0X2FkZHIsIGh0b25zIGV0Yy4gQ2hlY2sgaWYgaXQncyBuZWNlc3NhcnkuCitkbmwgTk9URTogRGlkIG5vdCB3YW50IHRvIHVzZSBBQ19TRUFSQ0hfTElCUyB3aGljaCB3b3VsZCBhZGQKK2RubCAgIC1sYnNkIHRvIExJQlMuIFdlIHNldCBJTkVUX0xJQiBpbnN0ZWFkLgorQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKK0FDX0NIRUNLX0ZVTkMoZ2V0aG9zdGJ5bmFtZSxJTkVUX0xJQl9SRVE9LElORVRfTElCX1JFUT15ZXMpCitpZiB0ZXN0ICIkSU5FVF9MSUJfUkVRIiA9IHllczsgdGhlbgorICBBQ19DSEVDS19MSUIoYnNkLGdldGhvc3RieW5hbWUsSU5FVF9MSUI9LWxic2QsSU5FVF9MSUI9KQorZmkKK0FDX0xBTkdfUkVTVE9SRQorQUNfU1VCU1QoSU5FVF9MSUIpCisKK0FDX01TR19DSEVDS0lORyhmb3Igc29ja2xlbl90KQorQUNfVFJZX0NPTVBJTEUoCitbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSwKK1tzb2NrbGVuX3QgeDsKK2FjY2VwdCgwLCAwLCAmeCk7XSwKK0FDX01TR19SRVNVTFQoeWVzKQorU09DS0xFTl9UX0RFRklORT0nLURWTkNfU09DS0xFTl9UPXNvY2tsZW5fdCcsCitBQ19NU0dfUkVTVUxUKHVzaW5nIGludCkKK1NPQ0tMRU5fVF9ERUZJTkU9Jy1EVk5DX1NPQ0tMRU5fVD1pbnQnKQorQUNfU1VCU1QoU09DS0xFTl9UX0RFRklORSkKKworQU1fR05VX0dFVFRFWFQKKworQk9JTEVSUExBVEU9Ym9pbGVycGxhdGUubWsKKworaWYgKHNoIC1jICJtYWtlIC0tdmVyc2lvbiIgMj4vZGV2L251bGwgfCBncmVwIEdOVSAyPiYxID4vZGV2L251bGwpOyB0aGVuCisgIGlmIHNoIC1jICJ2bmNta2RlcGVuZCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgQk9JTEVSUExBVEU9IiRCT0lMRVJQTEFURTpkZXBlbmQubWsiCisgIGZpCitmaQorCitBQ19PVVRQVVQoTWFrZWZpbGU6TWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFICBpbnRsL01ha2VmaWxlIHBvL01ha2VmaWxlLmluIFwKKyAgICAgICAgIHJkci9NYWtlZmlsZTpyZHIvTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIFwKKyAgICAgICAgIG5ldHdvcmsvTWFrZWZpbGU6bmV0d29yay9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUgXAorICAgICAgICAgWHJlZ2lvbi9NYWtlZmlsZTpYcmVnaW9uL01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSBcCisgICAgICAgICByZmIvTWFrZWZpbGU6cmZiL01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSBcCisgICAgICAgICB0eC9NYWtlZmlsZTp0eC9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUgXAorICAgICAgICAgeDB2bmNzZXJ2ZXIvTWFrZWZpbGU6eDB2bmNzZXJ2ZXIvTWFrZWZpbGUuaW46JEJPSUxFUlBMQVRFIFwKKyAgICAgICAgIHZuY3ZpZXdlcl91bml4L01ha2VmaWxlOnZuY3ZpZXdlcl91bml4L01ha2VmaWxlLmluOiRCT0lMRVJQTEFURSBcCisgICAgICAgICB2bmNjb25maWdfdW5peC9NYWtlZmlsZTp2bmNjb25maWdfdW5peC9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUgXAorICAgICAgICAgdm5jcGFzc3dkL01ha2VmaWxlOnZuY3Bhc3N3ZC9NYWtlZmlsZS5pbjokQk9JTEVSUExBVEUgXAorKQpkaWZmIC0tZ2l0IGEvdW5peC9kZXBlbmQubWsgYi91bml4L2RlcGVuZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ0Y2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9kZXBlbmQubWsKQEAgLTAsMCArMSw3NiBAQAorIworIyBDIC8gQysrIGhlYWRlciBkZXBlbmRlbmN5IHN0dWZmCisjCisjIE5lZWRzIEdOVSBtYWtlIGFuZCB2bmNta2RlcGVuZCwgYSBoYWNrZWQgdmVyc2lvbiBvZiBtYWtlZGVwZW5kCisKKy5TVUZGSVhFUzogLmQKKworQ01BS0VERVBFTkQgPSB2bmNta2RlcGVuZAorQ1hYTUFLRURFUEVORCA9IHZuY21rZGVwZW5kCisKKyMKKyMgVGhlIHJlY29tbWVuZGVkIG1ldGhvZCBvZiBkb2luZyBkZXBlbmRlbmN5IGFuYWx5c2lzIGluIHRoZSBHTlUgbWFrZSBtYW51YWwKKyMgdHVybnMgb3V0IHRvIGJlIHBhaW5mdWxseSBzbG93LiAgVGhpcyBtZXRob2QgaXMgc2ltaWxhciBidXQgaXQncworIyBzdWJzdGFudGlhbGx5IGZhc3RlciBhbmQgcmV0YWlucyB0aGUgZGVzaXJhYmxlIHByb3BlcnR5IHRoYXQgdGhlIHVzZXIgZG9lc24ndAorIyBuZWVkIHRvIG1hbnVhbGx5IGludm9rZSBhICJtYWtlIGRlcGVuZCIgc3RlcC4KKyMKKyMgQXMgd2l0aCB0aGUgbWV0aG9kIGRlc2NyaWJlZCBpbiB0aGUgbWFudWFsLCB3ZSBnZW5lcmF0ZSBhIHNlcGFyYXRlIGRlcGVuZGVuY3kKKyMgKC5kKSBmaWxlIGZvciBlYWNoIHNvdXJjZSBmaWxlLiAgVGhlIC5kIGZpbGUgcmVjb3JkcyB0aGUgaGVhZGVyIGZpbGVzIHRoYXQKKyMgZWFjaCBDIG9yIEMrKyBzb3VyY2UgZmlsZSBpbmNsdWRlcy4gIEFueSBzb3VyY2UgZmlsZSByZWNvcmRlZCBpbiBTUkNTIG9yCisjIENYWFNSQ1Mgd2lsbCBjYXVzZSB1cyB0byB0cnkgYW5kIGluY2x1ZGUgdGhlIGNvcnJlc3BvbmRpbmcgLmQgZmlsZSBhbmQgR05VCisjIG1ha2UgdGhlbiB0cmVhdHMgZWFjaCAuZCBmaWxlIGFzIGEgdGFyZ2V0IHRvIGJlIHJlbWFkZS4KKyMKKyMgVW5saWtlIHRoZSBtYW51YWwncyBtZXRob2QsIHRoZSBydWxlIHdlIHByb3ZpZGUgZm9yIG1ha2luZyB0aGUgLmQgZmlsZSBpcworIyBhY3R1YWxseSBhIGZha2UuICBBbGwgaXQgZG9lcyBpcyByZWNvcmQgaW4gYSB0ZW1wb3JhcnkgZmlsZSB0aGF0IHRoZSAuZCBmaWxlCisjIG5lZWRzIHRvIGJlIHJlbWFkZS4gIEJ1dCBhcyB3ZWxsIGFzIGFsbCB0aGUgLmQgZmlsZXMsIHdlIGFsc28gdHJ5IHRvIGluY2x1ZGUKKyMgYSBmaWxlIGNhbGxlZCAiZGVwZW5kLnBob255Ii4gIFRoaXMgZmlsZSBuZXZlciBleGlzdHMsIGJ1dCBpdCBjYXVzZXMgR05VIG1ha2UKKyMgdG8gdHJ5IGFuZCBtYWtlIHRoZSB0YXJnZXQgImRlcGVuZC5waG9ueSIuICBUaGUgcnVsZSBmb3IgZGVwZW5kLnBob255IHRoZW4KKyMgbG9va3MgYXQgdGhlIHRlbXBvcmFyeSBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIC5kIHJ1bGVzIGFuZCB0aGVuIGludm9rZXMgdGhlCisjICJvbWtkZXBlbmQiIHByb2dyYW0gb24gYWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMgaW4gb25lIGdvLgorIworCisjCisjIFdlIHVzZSBzaW1wbGUgYXNzaWdubWVudCBoZXJlIHRvIHJlbW92ZSBhbnkgb2YgdGhlIGRlcGVuZC50bXAgZmlsZXMKKyMgYXQgdGhlIHRpbWUgbWFrZSBwYXJzZXMgdGhpcyBiaXQuCisjCisKK2R1bW15dmFyaWFibGUgOj0gJChzaGVsbCAkKFJNKSBjZGVwZW5kLnRtcCBjeHhkZXBlbmQudG1wKQorCisjCisjIE5vdyB0aGUgImZha2UiIHJ1bGVzIGZvciBnZW5lcmF0aW5nIC5kIGZpbGVzLgorIworCislLmQ6ICUuYworCUBlY2hvICIkPCIgPj4gY2RlcGVuZC50bXAKKworJS5kOiAlLmN4eAorCUBlY2hvICIkPCIgPj4gY3h4ZGVwZW5kLnRtcAorCisjCisjIFRoZSBkZXBlbmQucGhvbnkgcnVsZSB3aGljaCBhY3R1YWxseSBydW5zIG9ta2RlcGVuZC4KKyMKKworZGVwZW5kLnBob255OgorCUBpZiBbIC1mIGNkZXBlbmQudG1wIF07IHRoZW4gXAorCSAgIGVjaG8gJChDTUFLRURFUEVORCkgJChBTExfQ1BQRkxBR1MpIGBjYXQgY2RlcGVuZC50bXBgOyBcCisJICAgJChDTUFLRURFUEVORCkgJChBTExfQ1BQRkxBR1MpIGBjYXQgY2RlcGVuZC50bXBgOyBcCisJICAgcm0gLWYgY2RlcGVuZC50bXA7IFwKKwkgZmk7IFwKKwkgaWYgWyAtZiBjeHhkZXBlbmQudG1wIF07IHRoZW4gXAorCSAgIGVjaG8gJChDWFhNQUtFREVQRU5EKSAkKEFMTF9DUFBGTEFHUykgYGNhdCBjeHhkZXBlbmQudG1wYDsgXAorCSAgICQoQ1hYTUFLRURFUEVORCkgJChBTExfQ1BQRkxBR1MpIGBjYXQgY3h4ZGVwZW5kLnRtcGA7IFwKKwkgICBybSAtZiBjeHhkZXBlbmQudG1wOyBcCisJIGZpCisKKyMKKyMgTm93IGluY2x1ZGUgdGhlIC5kIGZpbGVzIGFuZCB0aGUgImRlcGVuZC5waG9ueSIgZmlsZSB3aGljaCBuZXZlciBleGlzdHMuCisjIEZvciBzb21lIHJlYXNvbiBHTlUgbWFrZSBldmFsdWF0ZXMgdGhlIHRhcmdldHMgaW4gcmV2ZXJzZSBvcmRlciwgc28gd2UgbmVlZAorIyB0byBpbmNsdWRlIGRlcGVuZC5waG9ueSBmaXJzdC4gIFRoZSAiLSIgdGVsbHMgbWFrZSBub3QgdG8gY29tcGxhaW4gdGhhdCBpdAorIyBjYW4ndCBmaW5kIHRoZSBmaWxlLgorIworCistaW5jbHVkZSBkZXBlbmQucGhvbnkKKworaWZkZWYgU1JDUworLWluY2x1ZGUgJChwYXRzdWJzdCAlLmMsJS5kLCQocGF0c3Vic3QgJS5jeHgsJS5kLCQoU1JDUykpKQorZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaHB1eC5wYXRjaCBiL3VuaXgvaHB1eC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODljNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9ocHV4LnBhdGNoCkBAIC0wLDAgKzEsMjU1IEBACisqKiogeGMub3JpZy9jb25maWcvY2YvWDExLnRtcGwJVHVlIEphbiAxNSAyMjo1NToyNiAyMDAyCistLS0geGMvY29uZmlnL2NmL1gxMS50bXBsCVN1biBTZXAgIDcgMTk6NTI6MDEgMjAwMworKioqKioqKioqKioqKioqCisqKiogMzEyMCwzMTI2ICoqKioKKyAgCSQoUk0pIGluZGV4LnJhdyBmaWxlLm5QUyBmaWxlLlBTIGZpbGUudHh0CisgICNlbmRpZgorICAKKyEgI2lmbmRlZiBNYWtlU2ltcGxlRG9jKGZpbGUsc3JjcykKKyAgI2RlZmluZSBNYWtlU2ltcGxlRG9jKGZpbGUsc3JjcykgTWFrZURlcFNpbXBsZURvYyhmaWxlLHNyY3Msc3JjcykKKyAgI2VuZGlmCisgIAorLS0tIDMxMjAsMzEyNiAtLS0tCisgIAkkKFJNKSBpbmRleC5yYXcgZmlsZS5uUFMgZmlsZS5QUyBmaWxlLnR4dAorICAjZW5kaWYKKyAgCishICNpZm5kZWYgTWFrZVNpbXBsZURvYworICAjZGVmaW5lIE1ha2VTaW1wbGVEb2MoZmlsZSxzcmNzKSBNYWtlRGVwU2ltcGxlRG9jKGZpbGUsc3JjcyxzcmNzKQorICAjZW5kaWYKKyAgCisqKiogeGMub3JpZy9jb25maWcvY2YvaHAuY2YJV2VkIEphbiAxNyAxNjoyMjozMSAyMDAxCistLS0geGMvY29uZmlnL2NmL2hwLmNmCU1vbiBTZXAgIDggMTk6NTQ6NTIgMjAwMworKioqKioqKioqKioqKioqCisqKiogMTMxLDEzNyAqKioqCisgICNlbmRpZgorICAjZGVmaW5lIEhQRmFzdFNjcm9sbGluZwkJWUVTCisgICNpZm5kZWYgQnVpbGRTZXJ2ZXIKKyEgIyBkZWZpbmUgQnVpbGRTZXJ2ZXIJCV9faHA5MDAwczcwMAorICAjZW5kaWYKKyAgI2lmIE9TTWFqb3JWZXJzaW9uIDwgMTAKKyAgI2RlZmluZSBOZWVkQmVya2xpYgkJKEJ1aWxkU2VydmVyfEJ1aWxkRm9udFNlcnZlcikKKy0tLSAxMzEsMTM3IC0tLS0KKyAgI2VuZGlmCisgICNkZWZpbmUgSFBGYXN0U2Nyb2xsaW5nCQlZRVMKKyAgI2lmbmRlZiBCdWlsZFNlcnZlcgorISAjIGRlZmluZSBCdWlsZFNlcnZlcgkJWUVTCisgICNlbmRpZgorICAjaWYgT1NNYWpvclZlcnNpb24gPCAxMAorICAjZGVmaW5lIE5lZWRCZXJrbGliCQkoQnVpbGRTZXJ2ZXJ8QnVpbGRGb250U2VydmVyKQorKioqKioqKioqKioqKioqCisqKiogMTM5LDE0NSAqKioqCisgICNkZWZpbmUgWGF3STE4bkRlZmluZXMJCS1ESEFTX1dDSEFSX0ggLURIQVNfSVNXX0ZVTkNTCisgIAorICAjaWYgT1NNYWpvclZlcnNpb24gPCA2IHx8IChPU01ham9yVmVyc2lvbiA9PSA2ICYmIE9TTWlub3JWZXJzaW9uIDwgMikKKyEgIyBkZWZpbmUgQ29ubmVjdGlvbkZsYWdzCS1EVENQQ09OTgkvKiBubyB1bml4IHNvY2tldHMgKi8KKyAgI2VuZGlmCisgIAorICAjaWYgT1NNYWpvclZlcnNpb24gPiA4CistLS0gMTM5LDE0NSAtLS0tCisgICNkZWZpbmUgWGF3STE4bkRlZmluZXMJCS1ESEFTX1dDSEFSX0ggLURIQVNfSVNXX0ZVTkNTCisgIAorICAjaWYgT1NNYWpvclZlcnNpb24gPCA2IHx8IChPU01ham9yVmVyc2lvbiA9PSA2ICYmIE9TTWlub3JWZXJzaW9uIDwgMikKKyEgLyojIGRlZmluZSBDb25uZWN0aW9uRmxhZ3MJLURUQ1BDT05OKi8JLyogbm8gdW5peCBzb2NrZXRzICovCisgICNlbmRpZgorICAKKyAgI2lmIE9TTWFqb3JWZXJzaW9uID4gOAorKioqIHhjL2NvbmZpZy9jZi9zaXRlLmRlZi5vcmlnICBUdWUgU2VwICA5IDE3OjQyOjU2IDIwMDMKKy0tLSB4Yy9jb25maWcvY2Yvc2l0ZS5kZWYgICAgICAgVHVlIFNlcCAgOSAxNzo0MzowNyAyMDAzCisqKioqKioqKioqKioqKioKKyoqKiA4NCw5MCAqKioqCisgICNpZmRlZiBBZnRlclZlbmRvckNGCisgIAorICAjaWZuZGVmIFByb2plY3RSb290CishICNkZWZpbmUgUHJvamVjdFJvb3QgL3Vzci9YMTFSNgorICAjZW5kaWYKKyAgCisgIC8qCistLS0gODQsOTAgLS0tLQorICAjaWZkZWYgQWZ0ZXJWZW5kb3JDRgorICAKKyAgI2lmbmRlZiBQcm9qZWN0Um9vdAorISAvKiNkZWZpbmUgUHJvamVjdFJvb3QgL3Vzci9YMTFSNiovCisgICNlbmRpZgorICAKKyAgLyoKKyoqKiB4Yy5vcmlnL2NvbmZpZy9pbWFrZS9pbWFrZS5jCUZyaSBEZWMgMTQgMTk6NTM6MTggMjAwMQorLS0tIHhjL2NvbmZpZy9pbWFrZS9pbWFrZS5jCU1vbiBTZXAgIDggMTk6MzU6MzMgMjAwMworKioqKioqKioqKioqKioqCisqKiogMjg4LDI5MyAqKioqCistLS0gMjg4LDI5NCAtLS0tCisgICNkZWZpbmUJVFJVRQkJMQorICAjZGVmaW5lCUZBTFNFCQkwCisgIAorKyAjZGVmaW5lIEZJWFVQX0NQUF9XSElURVNQQUNFCisgICNpZmRlZiBGSVhVUF9DUFBfV0hJVEVTUEFDRQorICBpbnQJSW5SdWxlID0gRkFMU0U7CisgICMgaWZkZWYgSU5MSU5FX1NZTlRBWAorKioqKioqKioqKioqKioqCisqKiogMzg5LDM5NCAqKioqCistLS0gMzkwLDQwMSAtLS0tCisgIAlGSUxFCSp0bXBmZCA9IE5VTEw7CisgIAljaGFyCW1ha2VNYWNyb1sgQlVGU0laIF07CisgIAljaGFyCW1ha2VmaWxlTWFjcm9bIEJVRlNJWiBdOworKyAKKysgI2lmZGVmIEZJWFVQX0NQUF9XSElURVNQQUNFCisrIAlmcHJpbnRmKHN0ZGVyciwiXG5GSVhVUF9DUFBfV0hJVEVTUEFDRSBpcyBkZWZpbmVkISFcblxuIik7CisrICNlbHNlCisrICNlcnJvciAiRklYVVBfQ1BQX1dISVRFU1BBQ0UgaXMgbm90IGRlZmluZWQiCisrICNlbmRpZgorICAKKyAgCXByb2dyYW0gPSBhcmd2WzBdOworICAJaW5pdCgpOworKioqIHhjLm9yaWcvY29uZmlnL2ltYWtlL2ltYWtlbWRlcC5oCUZyaSBEZWMgMTQgMTk6NTM6MTkgMjAwMQorLS0tIHhjL2NvbmZpZy9pbWFrZS9pbWFrZW1kZXAuaAlUdWUgU2VwICA5IDE2OjM4OjE4IDIwMDMKKyoqKioqKioqKioqKioqKgorKioqIDQ4LDU0ICoqKioKKyAgI2lmZGVmIGhwOTAwMHM4MDAKKyAgI2RlZmluZSBpbWFrZV9jY2ZsYWdzICItRFNZU1YiCisgICNlbHNlCishICNkZWZpbmUgaW1ha2VfY2NmbGFncyAiLVdjLC1OZDQwMDAsLU5zMzAwMCAtRFNZU1YiCisgICNlbmRpZgorICAjZW5kaWYKKyAgCistLS0gNDgsNTQgLS0tLQorICAjaWZkZWYgaHA5MDAwczgwMAorICAjZGVmaW5lIGltYWtlX2NjZmxhZ3MgIi1EU1lTViIKKyAgI2Vsc2UKKyEgI2RlZmluZSBpbWFrZV9jY2ZsYWdzICItRFNZU1YiCisgICNlbmRpZgorICAjZW5kaWYKKyAgCisqKioqKioqKioqKioqKioKKyoqKiAyMTEsMjE3ICoqKioKKyAgICogICAgIGFsbCBjb2xvbnMpLiAgT25lIHdheSB0byB0ZWxsIGlmIHlvdSBuZWVkIHRoaXMgaXMgdG8gc2VlIHdoZXRoZXIgb3Igbm90CisgICAqICAgICB5b3VyIE1ha2VmaWxlcyBoYXZlIG5vIHRhYnMgaW4gdGhlbSBhbmQgbG90cyBvZiBAQCBzdHJpbmdzLgorICAgKi8KKyEgI2lmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKFNZU1YpIHx8IGRlZmluZWQoU1ZSNCkgfHwgZGVmaW5lZChoY3gpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoc2NvKSB8fCAoZGVmaW5lZChBTU9FQkEpICYmIGRlZmluZWQoQ1JPU1NfQ09NUElMRSkpIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChfX3NnaSkKKyAgI2RlZmluZSBGSVhVUF9DUFBfV0hJVEVTUEFDRQorICAjZW5kaWYKKyAgI2lmZGVmIFdJTjMyCistLS0gMjExLDIxNyAtLS0tCisgICAqICAgICBhbGwgY29sb25zKS4gIE9uZSB3YXkgdG8gdGVsbCBpZiB5b3UgbmVlZCB0aGlzIGlzIHRvIHNlZSB3aGV0aGVyIG9yIG5vdAorICAgKiAgICAgeW91ciBNYWtlZmlsZXMgaGF2ZSBubyB0YWJzIGluIHRoZW0gYW5kIGxvdHMgb2YgQEAgc3RyaW5ncy4KKyAgICovCishICNpZiBkZWZpbmVkKHN1bikgfHwgZGVmaW5lZChTWVNWKSB8fCBkZWZpbmVkKFNWUjQpIHx8IGRlZmluZWQoaGN4KSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKHNjbykgfHwgKGRlZmluZWQoQU1PRUJBKSAmJiBkZWZpbmVkKENST1NTX0NPTVBJTEUpKSB8fCBkZWZpbmVkKF9fUU5YX18pIHx8IGRlZmluZWQoX19zZ2kpIHx8IGRlZmluZWQoaHB1eCkKKyAgI2RlZmluZSBGSVhVUF9DUFBfV0hJVEVTUEFDRQorICAjZW5kaWYKKyAgI2lmZGVmIFdJTjMyCisqKiogeGMub3JpZy9pbmNsdWRlL1hmdW5jcy5oCUZyaSBEZWMgMTQgMTk6NTM6MjUgMjAwMQorLS0tIHhjL2luY2x1ZGUvWGZ1bmNzLmgJU3VuIFNlcCAgNyAyMDoxMDozNSAyMDAzCisqKioqKioqKioqKioqKioKKyoqKiA0Miw0OCAqKioqCisgICNlbHNlCisgICNpZiBkZWZpbmVkKFNZU1YpCisgICNpbmNsdWRlIDxtZW1vcnkuaD4KKyEgdm9pZCBiY29weSgpOworICAjZGVmaW5lIGJ6ZXJvKGIsbGVuKSBtZW1zZXQoYiwgMCwgbGVuKQorICAjZGVmaW5lIGJjbXAoYjEsYjIsbGVuKSBtZW1jbXAoYjEsIGIyLCBsZW4pCisgICNlbGlmIGRlZmluZWQoX19FTVhfXykKKy0tLSA0Miw0OCAtLS0tCisgICNlbHNlCisgICNpZiBkZWZpbmVkKFNZU1YpCisgICNpbmNsdWRlIDxtZW1vcnkuaD4KKyEgLyp2b2lkIGJjb3B5KCk7Ki8KKyAgI2RlZmluZSBiemVybyhiLGxlbikgbWVtc2V0KGIsIDAsIGxlbikKKyAgI2RlZmluZSBiY21wKGIxLGIyLGxlbikgbWVtY21wKGIxLCBiMiwgbGVuKQorICAjZWxpZiBkZWZpbmVkKF9fRU1YX18pCisqKiogeGMub3JpZy9pbmNsdWRlL2V4dGVuc2lvbnMvc2VjdXJpdHkuaAlGcmkgRGVjIDE0IDE5OjUzOjI5IDIwMDEKKy0tLSB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvc2VjdXJpdHkuaAlGcmkgQXVnICAxIDE3OjQzOjQ0IDIwMDMKKyoqKioqKioqKioqKioqKgorKioqIDExMCwxMTUgKioqKgorLS0tIDExMCwxMTYgLS0tLQorICAKKyAgI2luY2x1ZGUgImlucHV0LmgiICAgIC8qIGZvciBEZXZpY2VJbnRQdHIgKi8KKyAgI2luY2x1ZGUgInByb3BlcnR5LmgiIC8qIGZvciBQcm9wZXJ0eVB0ciAqLworKyAjaW5jbHVkZSAicmVzb3VyY2UuaCIKKyAgCisgIC8qIHJlc291cmNlIHR5cGUgdG8gcGFzcyBpbiBMb29rdXBJREJ5VHlwZSBmb3IgYXV0aG9yaXphdGlvbnMgKi8KKyAgZXh0ZXJuIFJFU1RZUEUgU2VjdXJpdHlBdXRob3JpemF0aW9uUmVzVHlwZTsKKyoqKiB4Yy5vcmlnL2xpYi9mb250L1R5cGUxL2ZvbnRmY24uYwlGcmkgTm92IDIzIDE5OjIxOjMxIDIwMDEKKy0tLSB4Yy9saWIvZm9udC9UeXBlMS9mb250ZmNuLmMJU3VuIFNlcCAgNyAxOToyOToyNyAyMDAzCisqKioqKioqKioqKioqKioKKyoqKiA0Nyw1MiAqKioqCistLS0gNDcsNTMgLS0tLQorICAgKi8KKyAgLyogJFhGcmVlODY6IHhjL2xpYi9mb250L1R5cGUxL2ZvbnRmY24uYyx2IDEuMTEgMjAwMS8xMS8yMyAxOToyMTozMSBkYXdlcyBFeHAgJCAqLworICAgCisrICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgI2lmbmRlZiBGT05UTU9EVUxFCisgICNpbmNsdWRlIDxzdGRpby5oPgorICAjaW5jbHVkZSA8c3RyaW5nLmg+CisqKiogeGMub3JpZy9saWIvZm9udC9UeXBlMS9vYmplY3RzLmgJTW9uIEF1ZyAyNyAyMDo0OTo1MiAyMDAxCistLS0geGMvbGliL2ZvbnQvVHlwZTEvb2JqZWN0cy5oCVN1biBTZXAgIDcgMTk6Mjk6MzcgMjAwMworKioqKioqKioqKioqKioqCisqKiogNTAsNTYgKioqKgorICAjaW5jbHVkZSA8WGRlZnMuaD4KKyAgI2luY2x1ZGUgPFhmdW5jcHJvdG8uaD4KKyAgI2lmbmRlZiBGT05UTU9EVUxFCishICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgI2VuZGlmCisgIC8qU0hBUkVEKi8KKyAgCistLS0gNTAsNTYgLS0tLQorICAjaW5jbHVkZSA8WGRlZnMuaD4KKyAgI2luY2x1ZGUgPFhmdW5jcHJvdG8uaD4KKyAgI2lmbmRlZiBGT05UTU9EVUxFCishIC8qI2luY2x1ZGUgPHN0ZGxpYi5oPiovCisgICNlbmRpZgorICAvKlNIQVJFRCovCisgIAorKioqIHhjLm9yaWcvbGliL3h0cmFucy9YdHJhbnN1dGlsLmMgICAgIFR1ZSBTZXAgIDkgMTc6NDA6MTQgMjAwMworLS0tIHhjL2xpYi94dHJhbnMvWHRyYW5zdXRpbC5jICBUdWUgU2VwICA5IDE3OjQwOjIwIDIwMDMKKyoqKioqKioqKioqKioqKgorKioqIDUwMyw1MTQgKioqKgorICAJICAgIGlmICh1cGRhdGVPd25lciAmJiAhdXBkYXRlZE93bmVyKSB7CisgIAkgIAlQUk1TRygxLCAibWtkaXI6IE93bmVyIG9mICVzIHNob3VsZCBiZSBzZXQgdG8gcm9vdFxuIiwKKyAgCQkgICAgICBwYXRoLCAwLCAwKTsKKy0gCQlzbGVlcCg1KTsKKyAgCSAgICB9CisgIAkgICAgaWYgKHVwZGF0ZU1vZGUgJiYgIXVwZGF0ZWRNb2RlKSB7CisgIAkgIAlQUk1TRygxLCAibWtkaXI6IE1vZGUgb2YgJXMgc2hvdWxkIGJlIHNldCB0byAlMDRvXG4iLAorICAJCSAgICAgIHBhdGgsIG1vZGUsIDApOworLSAJCXNsZWVwKDUpOworICAJICAgIH0KKyAgCSAgICByZXR1cm4gMDsKKyAgCX0KKy0tLSA1MDMsNTEyIC0tLS0KKyoqKiB4Yy5vcmlnL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL1h2bmMveHZuYy5jYyAgICAgMTIgQXVnIDIwMDMgMTE6MDA6MTQgLTAwMDAKKy0tLSB4Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Ydm5jL3h2bmMuY2MgICAgIDkgU2VwIDIwMDMgMTY6MTU6NTMgLTAwMDAKKyoqKioqKioqKioqKioqKgorKioqIDEyMjEsMTIyMyAqKioqCistLS0gMTIyMSwxMjI5IC0tLS0KKyAgICBtaVJlZ2lzdGVyUG9pbnRlckRldmljZShzY3JlZW5JbmZvLnNjcmVlbnNbMF0sIHApOworICAgICh2b2lkKW1pZXFJbml0ICgoRGV2aWNlUHRyKWssIChEZXZpY2VQdHIpcCk7CisgIH0KKysgCisrIGV4dGVybiAiQyIgeworKyAgIHZvaWQgWFRlc3RHZW5lcmF0ZUV2ZW50KCkge30KKysgICB2b2lkIFhUZXN0R2V0UG9pbnRlclBvcygpIHt9CisrICAgdm9pZCBYVGVzdEp1bXBQb2ludGVyKCkge30KKysgfQorKioqIHhjLm9yaWcvY29uZmlnL2NmL3ZuYy5kZWYgICAgICAgIDcgSnVsIDIwMDMgMDk6NTE6MjIKKy0tLSB4Yy9jb25maWcvY2Yvdm5jLmRlZiAgICAgICAgOSBTZXAgMjAwMyAxNTo1NDoyMworKioqKioqKioqKioqKioqCisqKiogOSwxNCAqKioqCistLS0gOSwyMCAtLS0tCisgICNkZWZpbmUgWG5lc3RTZXJ2ZXIgTk8KKyAgI2RlZmluZSBYcHJ0U2VydmVyIE5PCisgIAorKyAjZGVmaW5lIEJ1aWxkWEtCIE5PCisrICNkZWZpbmUgSGFzQ3BsdXNwbHVzIFlFUworKyAjZGVmaW5lIENwbHVzcGx1c0NtZCAvb3B0L2FDQy9iaW4vYUNDCisrICNkZWZpbmUgQ3BsdXNwbHVzT3B0aW9ucyAtQUEgK1c3NDkgK1c3NDAKKysgI2RlZmluZSBQcm9qZWN0Um9vdCAvdXNyCisrIAorICAjaWZkZWYgU3VuQXJjaGl0ZWN0dXJlCisgICNkZWZpbmUgUHJvamVjdFJvb3QgL3Vzci9vcGVud2luCisgICNkZWZpbmUgSGFzR2NjMiBZRVMKKyoqKioqKioqKioqKioqKgorKioqIDI5LDMyICoqKioKKy0tLSAzNCwzOCAtLS0tCisgIAorICAjZGVmaW5lCVNlcnZlclRhcmdldChzZXJ2ZXIsc3ViZGlycyxvYmplY3RzLGxpYnMsc3lzbGlicykJCUBAXAorICBDQ0xJTksgPSAkKENYWEVOVlNFVFVQKSAkKENYWCkgQEBcCisrIENDT1BUSU9OUyA9IC1BQSBAQFwKKyAgU2VydmVyVGFyZ2V0V2l0aEZsYWdzKHNlcnZlcixzdWJkaXJzLG9iamVjdHMsbGlicyxzeXNsaWJzLCQoX05PT1BfKSkKZGlmZiAtLWdpdCBhL3VuaXgvaW5zdGFsbC1zaCBiL3VuaXgvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZDk3ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMzIyIEBACisjIS9iaW4vc2gKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisKK3NjcmlwdHZlcnNpb249MjAwNC0wOS0xMC4yMAorCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0KK2NoZ3JwY21kPQorc3RyaXBjbWQ9CitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPQorZHN0PQorZGlyX2FyZz0KK2RzdGFyZz0KK25vX3RhcmdldF9kaXJlY3Rvcnk9CisKK3VzYWdlPSJVc2FnZTogJDAgW09QVElPTl0uLi4gWy1UXSBTUkNGSUxFIERTVEZJTEUKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiBTUkNGSUxFUy4uLiBESVJFQ1RPUlkKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtdCBESVJFQ1RPUlkgU1JDRklMRVMuLi4KKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtZCBESVJFQ1RPUklFUy4uLgorCitJbiB0aGUgMXN0IGZvcm0sIGNvcHkgU1JDRklMRSB0byBEU1RGSUxFLgorSW4gdGhlIDJuZCBhbmQgM3JkLCBjb3B5IGFsbCBTUkNGSUxFUyB0byBESVJFQ1RPUlkuCitJbiB0aGUgNHRoLCBjcmVhdGUgRElSRUNUT1JJRVMuCisKK09wdGlvbnM6CistYyAgICAgICAgIChpZ25vcmVkKQorLWQgICAgICAgICBjcmVhdGUgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiBpbnN0YWxsaW5nIGZpbGVzLgorLWcgR1JPVVAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKy1tIE1PREUgICAgJGNobW9kcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gTU9ERS4KKy1vIFVTRVIgICAgJGNob3ducHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gVVNFUi4KKy1zICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCistdCBESVJFQ1RPUlkgIGluc3RhbGwgaW50byBESVJFQ1RPUlkuCistVCAgICAgICAgIHJlcG9ydCBhbiBlcnJvciBpZiBEU1RGSUxFIGlzIGEgZGlyZWN0b3J5LgorLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKy0tdmVyc2lvbiAgZGlzcGxheSB2ZXJzaW9uIGluZm8gYW5kIGV4aXQuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlcyBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb21tYW5kczoKKyAgQ0hHUlBQUk9HIENITU9EUFJPRyBDSE9XTlBST0cgQ1BQUk9HIE1LRElSUFJPRyBNVlBST0cgUk1QUk9HIFNUUklQUFJPRworIgorCit3aGlsZSB0ZXN0IC1uICIkMSI7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtYykgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZQorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisgICAgICAgIHNoaWZ0CisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC0taGVscCkgZWNobyAiJHVzYWdlIjsgZXhpdCAwOzsKKworICAgIC1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZworICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtdCkgZHN0YXJnPSQyCisJc2hpZnQKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWUKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC0tdmVyc2lvbikgZWNobyAiJDAgJHNjcmlwdHZlcnNpb24iOyBleGl0IDA7OworCisgICAgKikgICMgV2hlbiAtZCBpcyB1c2VkLCBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgZGlyZWN0b3JpZXMgdG8gY3JlYXRlLgorCSMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCisJdGVzdCAtbiAiJGRpcl9hcmckZHN0YXJnIiAmJiBicmVhaworICAgICAgICAjIE90aGVyd2lzZSwgdGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIGRlc3RpbmF0aW9uLiAgUmVtb3ZlIGl0IGZyb20gJEAuCisJZm9yIGFyZworCWRvCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGRzdGFyZyI7IHRoZW4KKwkgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCisJICAgIHNldCBmbm9yZCAiJEAiICIkZHN0YXJnIgorCSAgICBzaGlmdCAjIGZub3JkCisJICBmaQorCSAgc2hpZnQgIyBhcmcKKwkgIGRzdGFyZz0kYXJnCisJZG9uZQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC16ICIkMSI7IHRoZW4KKyAgaWYgdGVzdCAteiAiJGRpcl9hcmciOyB0aGVuCisgICAgZWNobyAiJDA6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkLiIgPiYyCisgICAgZXhpdCAxCisgIGZpCisgICMgSXQncyBPSyB0byBjYWxsIGBpbnN0YWxsLXNoIC1kJyB3aXRob3V0IGFyZ3VtZW50LgorICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbmFsIGRpcmVjdG9yaWVzLgorICBleGl0IDAKK2ZpCisKK2ZvciBzcmMKK2RvCisgICMgUHJvdGVjdCBuYW1lcyBzdGFydGluZyB3aXRoIGAtJy4KKyAgY2FzZSAkc3JjIGluCisgICAgLSopIHNyYz0uLyRzcmMgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgorICAgIGRzdD0kc3JjCisgICAgc3JjPQorCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIG1rZGlyY21kPToKKyAgICAgIGNobW9kY21kPQorICAgIGVsc2UKKyAgICAgIG1rZGlyY21kPSRta2RpcnByb2cKKyAgICBmaQorICBlbHNlCisgICAgIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGNwcHJvZyAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyAgICAjIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkCisgICAgIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCisgICAgaWYgdGVzdCAhIC1mICIkc3JjIiAmJiB0ZXN0ICEgLWQgIiRzcmMiOyB0aGVuCisgICAgICBlY2hvICIkMDogJHNyYyBkb2VzIG5vdCBleGlzdC4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgLXogIiRkc3RhcmciOyB0aGVuCisgICAgICBlY2hvICIkMDogbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkLiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgZHN0PSRkc3RhcmcKKyAgICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgICAgY2FzZSAkZHN0IGluCisgICAgICAtKikgZHN0PS4vJGRzdCA7OworICAgIGVzYWMKKworICAgICMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IHdvbid0IHdvcmsKKyAgICAjIGlmIGRvdWJsZSBzbGFzaGVzIGFyZW4ndCBpZ25vcmVkLgorICAgIGlmIHRlc3QgLWQgIiRkc3QiOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkbm9fdGFyZ2V0X2RpcmVjdG9yeSI7IHRoZW4KKwllY2hvICIkMDogJGRzdGFyZzogSXMgYSBkaXJlY3RvcnkiID4mMgorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGRzdD0kZHN0L2BiYXNlbmFtZSAiJHNyYyJgCisgICAgZmkKKyAgZmkKKworICAjIFRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZC4KKyAgZHN0ZGlyPWBlY2hvICIkZHN0IiB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KKworICAjIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgorICBpZiB0ZXN0ICEgLWQgIiRkc3RkaXIiOyB0aGVuCisgICAgZGVmYXVsdElGUz0nCisJICcKKyAgICBJRlM9IiR7SUZTLSRkZWZhdWx0SUZTfSIKKworICAgIG9JRlM9JElGUworICAgICMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCisgICAgSUZTPSclJworICAgIHNldCAtIGBlY2hvICIkZHN0ZGlyIiB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorICAgIElGUz0kb0lGUworCisgICAgcGF0aGNvbXA9CisKKyAgICB3aGlsZSB0ZXN0ICQjIC1uZSAwIDsgZG8KKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcCQxCisgICAgICBzaGlmdAorICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgICAgICAgICRta2RpcnByb2cgIiRwYXRoY29tcCIKKwkjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaW4gY2FzZSBzZXZlcmFsCisJIyBpbnN0YWxsLXNoIGFyZSBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGNvbmN1cnJlbnRseS4gIFRoaXMKKwkjIGlzIE9LLgorCXRlc3QgLWQgIiRwYXRoY29tcCIgfHwgZXhpdAorICAgICAgZmkKKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcC8KKyAgICBkb25lCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgJGRvaXQgJG1rZGlyY21kICIkZHN0IiBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICIkZHN0IjsgfQorCisgIGVsc2UKKyAgICBkc3RmaWxlPWBiYXNlbmFtZSAiJGRzdCJgCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKyAgICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQorCisgICAgIyBDb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZS4KKyAgICAkZG9pdCAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKyAgICAgIHx8IHsKKwkgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCisJICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKwkgICAjIHN1cHBvcnQgLWYuCisKKwkgICAjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJICAgIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkgICAjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJICAgIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJICAgIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwkgICB7CisJICAgICBpZiB0ZXN0IC1mICIkZHN0ZGlyLyRkc3RmaWxlIjsgdGhlbgorCSAgICAgICAkZG9pdCAkcm1jbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKwkgICAgICAgfHwgJGRvaXQgJG12Y21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAiJHJtdG1wIiAyPi9kZXYvbnVsbCBcCisJICAgICAgIHx8IHsKKwkJIGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0ZGlyLyRkc3RmaWxlIiA+JjIKKwkJIChleGl0IDEpOyBleGl0CisJICAgICAgIH0KKwkgICAgIGVsc2UKKwkgICAgICAgOgorCSAgICAgZmkKKwkgICB9ICYmCisKKwkgICAjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisJICAgJGRvaXQgJG12Y21kICIkZHN0dG1wIiAiJGRzdGRpci8kZHN0ZmlsZSIKKwkgfQorICAgIH0KKyAgZmkgfHwgeyAoZXhpdCAxKTsgZXhpdDsgfQorZG9uZQorCisjIFRoZSBmaW5hbCBsaXR0bGUgdHJpY2sgdG8gImNvcnJlY3RseSIgcGFzcyB0aGUgZXhpdCBzdGF0dXMgdG8gdGhlIGV4aXQgdHJhcC4KK3sKKyAgKGV4aXQgMCk7IGV4aXQKK30KKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS91bml4L2ludGwvQ2hhbmdlTG9nIGIvdW5peC9pbnRsL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTEyOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL0NoYW5nZUxvZwpAQCAtMCwwICsxLDQgQEAKKzIwMDQtMDEtMjkgIEdOVSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgorCisJKiBWZXJzaW9uIDAuMTQuMSByZWxlYXNlZC4KKwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL01ha2VmaWxlLmluIGIvdW5peC9pbnRsL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDY4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0OTMgQEAKKyMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIG1lc3NhZ2UgY2F0YWxvZyBoYW5kbGluZyBsaWJyYXJ5IG9mIEdOVSBnZXR0ZXh0CisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyBVU0EuCisKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKKworU0hFTEwgPSAvYmluL3NoCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSAuLgorVlBBVEggPSAkKHNyY2RpcikKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitsaWJkaXIgPSBAbGliZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKK2dldHRleHRzcmNkaXIgPSAkKGRhdGFkaXIpL2dldHRleHQvaW50bAorYWxpYXNwYXRoID0gJChsb2NhbGVkaXIpCitzdWJkaXIgPSBpbnRsCisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJChNS0lOU1RBTExESVJTKQorCitsID0gQElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYQAorCitBUiA9IGFyCitDQyA9IEBDQ0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK1JBTkxJQiA9IEBSQU5MSUJACitZQUNDID0gQElOVExCSVNPTkAgLXkgLWQKK1lGTEFHUyA9IC0tbmFtZS1wcmVmaXg9X19nZXR0ZXh0CisKK0RFRlMgPSAtRExPQ0FMRURJUj1cIiQobG9jYWxlZGlyKVwiIC1ETE9DQUxFX0FMSUFTX1BBVEg9XCIkKGFsaWFzcGF0aClcIiBcCistRExJQkRJUj1cIiQobGliZGlyKVwiIC1ESU5fTElCSU5UTCBcCistREVOQUJMRV9SRUxPQ0FUQUJMRT0xIC1ESU5fTElCUkFSWSAtRElOU1RBTExESVI9XCIkKGxpYmRpcilcIiAtRE5PX1hNQUxMT0MgXAorLURzZXRfcmVsb2NhdGlvbl9wcmVmaXg9bGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggXAorLURyZWxvY2F0ZT1saWJpbnRsX3JlbG9jYXRlIFwKKy1EREVQRU5EU19PTl9MSUJJQ09OVj0xIEBERUZTQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDRkxBR1MgPSBAQ0ZMQUdTQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCUyA9IEBMSUJTQAorCitDT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQorCitIRUFERVJTID0gXAorICBnbW8uaCBcCisgIGdldHRleHRQLmggXAorICBoYXNoLXN0cmluZy5oIFwKKyAgbG9hZGluZm8uaCBcCisgIHBsdXJhbC1leHAuaCBcCisgIGV2YWwtcGx1cmFsLmggXAorICBsb2NhbGNoYXJzZXQuaCBcCisgIHJlbG9jYXRhYmxlLmggXAorICB4c2l6ZS5oIFwKKyAgcHJpbnRmLWFyZ3MuaCBwcmludGYtYXJncy5jIFwKKyAgcHJpbnRmLXBhcnNlLmggd3ByaW50Zi1wYXJzZS5oIHByaW50Zi1wYXJzZS5jIFwKKyAgdmFzbnByaW50Zi5oIHZhc253cHJpbnRmLmggdmFzbnByaW50Zi5jIFwKKyAgb3MyY29tcGF0LmggXAorICBsaWJnbnVpbnRsLmguaW4KK1NPVVJDRVMgPSBcCisgIGJpbmR0ZXh0ZG9tLmMgXAorICBkY2dldHRleHQuYyBcCisgIGRnZXR0ZXh0LmMgXAorICBnZXR0ZXh0LmMgXAorICBmaW5kZG9tYWluLmMgXAorICBsb2FkbXNnY2F0LmMgXAorICBsb2NhbGVhbGlhcy5jIFwKKyAgdGV4dGRvbWFpbi5jIFwKKyAgbDEwbmZsaXN0LmMgXAorICBleHBsb2RlbmFtZS5jIFwKKyAgZGNpZ2V0dGV4dC5jIFwKKyAgZGNuZ2V0dGV4dC5jIFwKKyAgZG5nZXR0ZXh0LmMgXAorICBuZ2V0dGV4dC5jIFwKKyAgcGx1cmFsLnkgXAorICBwbHVyYWwtZXhwLmMgXAorICBsb2NhbGNoYXJzZXQuYyBcCisgIHJlbG9jYXRhYmxlLmMgXAorICBsb2NhbGVuYW1lLmMgXAorICBsb2cuYyBcCisgIHByaW50Zi5jIFwKKyAgb3NkZXAuYyBcCisgIG9zMmNvbXBhdC5jIFwKKyAgaW50bC1jb21wYXQuYworT0JKRUNUUyA9IFwKKyAgYmluZHRleHRkb20uJGxvIFwKKyAgZGNnZXR0ZXh0LiRsbyBcCisgIGRnZXR0ZXh0LiRsbyBcCisgIGdldHRleHQuJGxvIFwKKyAgZmluZGRvbWFpbi4kbG8gXAorICBsb2FkbXNnY2F0LiRsbyBcCisgIGxvY2FsZWFsaWFzLiRsbyBcCisgIHRleHRkb21haW4uJGxvIFwKKyAgbDEwbmZsaXN0LiRsbyBcCisgIGV4cGxvZGVuYW1lLiRsbyBcCisgIGRjaWdldHRleHQuJGxvIFwKKyAgZGNuZ2V0dGV4dC4kbG8gXAorICBkbmdldHRleHQuJGxvIFwKKyAgbmdldHRleHQuJGxvIFwKKyAgcGx1cmFsLiRsbyBcCisgIHBsdXJhbC1leHAuJGxvIFwKKyAgbG9jYWxjaGFyc2V0LiRsbyBcCisgIHJlbG9jYXRhYmxlLiRsbyBcCisgIGxvY2FsZW5hbWUuJGxvIFwKKyAgbG9nLiRsbyBcCisgIHByaW50Zi4kbG8gXAorICBvc2RlcC4kbG8gXAorICBpbnRsLWNvbXBhdC4kbG8KK0RJU1RGSUxFUy5jb21tb24gPSBNYWtlZmlsZS5pbiBcCitjb25maWcuY2hhcnNldCBsb2NhbGUuYWxpYXMgcmVmLWFkZC5zaW4gcmVmLWRlbC5zaW4gJChIRUFERVJTKSAkKFNPVVJDRVMpCitESVNURklMRVMuZ2VuZXJhdGVkID0gcGx1cmFsLmMKK0RJU1RGSUxFUy5ub3JtYWwgPSBWRVJTSU9OCitESVNURklMRVMuZ2V0dGV4dCA9IENPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgbGliaW50bC5nbGliYyBcCitsaWJnbnVpbnRsLmhfdm1zIE1ha2VmaWxlLnZtcyBcCitsaWJnbnVpbnRsLmgubXN2Yy1zdGF0aWMgbGliZ251aW50bC5oLm1zdmMtc2hhcmVkIFJFQURNRS53b2UzMiBNYWtlZmlsZS5tc3ZjCitESVNURklMRVMub2Jzb2xldGUgPSB4b3Blbi1tc2cuc2VkIGxpbnV4LW1zZy5zZWQgcG8ydGJsLnNlZC5pbiBjYXQtY29tcGF0LmMgXAorQ09QWUlORy5MSUItMiBnZXR0ZXh0LmggbGliZ2V0dGV4dC5oIHBsdXJhbC1ldmFsLmMgbGliZ251aW50bC5oCisKK2FsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKK2FsbC15ZXM6IGxpYmludGwuJGxhIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCithbGwtbm86IGFsbC1uby1AQlVJTERfSU5DTFVERURfTElCSU5UTEAKK2FsbC1uby15ZXM6IGxpYmdudWludGwuJGxhCithbGwtbm8tbm86CisKK2xpYmludGwuYSBsaWJnbnVpbnRsLmE6ICQoT0JKRUNUUykKKwlybSAtZiAkQAorCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCisJJChSQU5MSUIpICRACisKK2xpYmludGwubGEgbGliZ251aW50bC5sYTogJChPQkpFQ1RTKQorCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgXAorCSAgJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBcCisJICAkKE9CSkVDVFMpIEBMVExJQklDT05WQCAkKExJQlMpIC1sYyBcCisJICAtdmVyc2lvbi1pbmZvICQoTFRWX0NVUlJFTlQpOiQoTFRWX1JFVklTSU9OKTokKExUVl9BR0UpIFwKKwkgIC1ycGF0aCAkKGxpYmRpcikgXAorCSAgLW5vLXVuZGVmaW5lZAorCisjIExpYnRvb2wncyBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmludGwuCisjIEJlZm9yZSBtYWtpbmcgYSBnZXR0ZXh0IHJlbGVhc2UsIHRoZSBnZXR0ZXh0IG1haW50YWluZXIgbXVzdCBjaGFuZ2UgdGhpcworIyBhY2NvcmRpbmcgdG8gdGhlIGxpYnRvb2wgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAiTGlicmFyeSBpbnRlcmZhY2UgdmVyc2lvbnMiLgorIyBNYWludGFpbmVycyBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIGludGwgZGlyZWN0b3J5IG11c3QgKm5vdCoKKyMgY2hhbmdlIHRoZXNlIHZhbHVlcy4KK0xUVl9DVVJSRU5UPTcKK0xUVl9SRVZJU0lPTj0wCitMVFZfQUdFPTQKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAueSAubyAubG8gLnNpbiAuc2VkCisKKy5jLm86CisJJChDT01QSUxFKSAkPAorCisueS5jOgorCSQoWUFDQykgJChZRkxBR1MpIC0tb3V0cHV0ICRAICQ8CisJcm0gLWYgJCouaAorCitiaW5kdGV4dGRvbS5sbzogJChzcmNkaXIpL2JpbmR0ZXh0ZG9tLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2JpbmR0ZXh0ZG9tLmMKK2RjZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY2dldHRleHQuYworZGdldHRleHQubG86ICQoc3JjZGlyKS9kZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kZ2V0dGV4dC5jCitnZXR0ZXh0LmxvOiAkKHNyY2RpcikvZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9nZXR0ZXh0LmMKK2ZpbmRkb21haW4ubG86ICQoc3JjZGlyKS9maW5kZG9tYWluLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2ZpbmRkb21haW4uYworbG9hZG1zZ2NhdC5sbzogJChzcmNkaXIpL2xvYWRtc2djYXQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCitsb2NhbGVhbGlhcy5sbzogJChzcmNkaXIpL2xvY2FsZWFsaWFzLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZWFsaWFzLmMKK3RleHRkb21haW4ubG86ICQoc3JjZGlyKS90ZXh0ZG9tYWluLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3RleHRkb21haW4uYworbDEwbmZsaXN0LmxvOiAkKHNyY2RpcikvbDEwbmZsaXN0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2wxMG5mbGlzdC5jCitleHBsb2RlbmFtZS5sbzogJChzcmNkaXIpL2V4cGxvZGVuYW1lLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2V4cGxvZGVuYW1lLmMKK2RjaWdldHRleHQubG86ICQoc3JjZGlyKS9kY2lnZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjaWdldHRleHQuYworZGNuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjbmdldHRleHQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCitkbmdldHRleHQubG86ICQoc3JjZGlyKS9kbmdldHRleHQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZG5nZXR0ZXh0LmMKK25nZXR0ZXh0LmxvOiAkKHNyY2RpcikvbmdldHRleHQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbmdldHRleHQuYworcGx1cmFsLmxvOiAkKHNyY2RpcikvcGx1cmFsLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC5jCitwbHVyYWwtZXhwLmxvOiAkKHNyY2RpcikvcGx1cmFsLWV4cC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKK2xvY2FsY2hhcnNldC5sbzogJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGNoYXJzZXQuYworcmVsb2NhdGFibGUubG86ICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5jCitsb2NhbGVuYW1lLmxvOiAkKHNyY2RpcikvbG9jYWxlbmFtZS5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKK2xvZy5sbzogJChzcmNkaXIpL2xvZy5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2cuYworcHJpbnRmLmxvOiAkKHNyY2RpcikvcHJpbnRmLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3ByaW50Zi5jCitvc2RlcC5sbzogJChzcmNkaXIpL29zZGVwLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL29zZGVwLmMKK2ludGwtY29tcGF0LmxvOiAkKHNyY2RpcikvaW50bC1jb21wYXQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvaW50bC1jb21wYXQuYworCityZWYtYWRkLnNlZDogJChzcmNkaXIpL3JlZi1hZGQuc2luCisJc2VkIC1lICcvXiMvZCcgLWUgJ3MvQCcnUEFDS0FHRScnQC9AUEFDS0FHRUAvZycgJChzcmNkaXIpL3JlZi1hZGQuc2luID4gdC1yZWYtYWRkLnNlZAorCW12IHQtcmVmLWFkZC5zZWQgcmVmLWFkZC5zZWQKK3JlZi1kZWwuc2VkOiAkKHNyY2RpcikvcmVmLWRlbC5zaW4KKwlzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWRlbC5zaW4gPiB0LXJlZi1kZWwuc2VkCisJbXYgdC1yZWYtZGVsLnNlZCByZWYtZGVsLnNlZAorCitJTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKSAtSS4uCisKK2xpYmdudWludGwuaDogJChzcmNkaXIpL2xpYmdudWludGwuaC5pbgorCXNlZCAtZSAncyxAJydIQVZFX1BPU0lYX1BSSU5URicnQCxASEFWRV9QT1NJWF9QUklOVEZALGcnIFwKKwkgICAgLWUgJ3MsQCcnSEFWRV9BU1BSSU5URicnQCxASEFWRV9BU1BSSU5URkAsZycgXAorCSAgICAtZSAncyxAJydIQVZFX1NOUFJJTlRGJydALEBIQVZFX1NOUFJJTlRGQCxnJyBcCisJICAgIC1lICdzLEAnJ0hBVkVfV1BSSU5URicnQCxASEFWRV9XUFJJTlRGQCxnJyBcCisJICA8ICQoc3JjZGlyKS9saWJnbnVpbnRsLmguaW4gPiBsaWJnbnVpbnRsLmgKKworbGliaW50bC5oOiBsaWJnbnVpbnRsLmgKKwljcCBsaWJnbnVpbnRsLmggbGliaW50bC5oCisKK2NoYXJzZXQuYWxpYXM6ICQoc3JjZGlyKS9jb25maWcuY2hhcnNldAorCSQoU0hFTEwpICQoc3JjZGlyKS9jb25maWcuY2hhcnNldCAnQGhvc3RAJyA+IHQtJEAKKwltdiB0LSRAICRACisKK2NoZWNrOiBhbGwKKworIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCisjIHN5c3RlbSB3aGljaCBoYXMgdGhlIEdOVSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCisjIHNlcGFyYXRlIGxpYnJhcnkuCisjIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQorIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCitpbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCitpbnN0YWxsLWV4ZWM6IGFsbAorCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCisJICAkKElOU1RBTExfREFUQSkgbGliaW50bC5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2xpYmludGwuaDsgXAorCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCisJICAgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwuJGxhOyBcCisJICBpZiB0ZXN0ICJAUkVMT0NBVEFCTEVAIiA9IHllczsgdGhlbiBcCisJICAgIGRlcGVuZGVuY2llcz1gc2VkIC1uIC1lICdzLF5kZXBlbmRlbmN5X2xpYnM9XCguKlwpLFwxLHAnIDwgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhIHwgc2VkIC1lICJzLF4nLCwiIC1lICJzLCdcJCQsLCJgOyBcCisJICAgIGlmIHRlc3QgLW4gIiQkZGVwZW5kZW5jaWVzIjsgdGhlbiBcCisJICAgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiIFwKKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IG5vOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKTsgXAorCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCisJICAgICQoSU5TVEFMTF9EQVRBKSBsaWJnbnVpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCisJICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuc28gJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCisJICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAorCSAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJICB0ZW1wPSQoREVTVERJUikkKGxpYmRpcikvdC1jaGFyc2V0LmFsaWFzOyBcCisJICBkZXN0PSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAorCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAorCSAgICBvcmlnPSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAorCSAgICBzZWQgLWYgcmVmLWFkZC5zZWQgJCRvcmlnID4gJCR0ZW1wOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCisJICAgIHJtIC1mICQkdGVtcDsgXAorCSAgZWxzZSBcCisJICAgIGlmIHRlc3QgQEdMSUJDMjFAID0gbm87IHRoZW4gXAorCSAgICAgIG9yaWc9Y2hhcnNldC5hbGlhczsgXAorCSAgICAgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICAgIHJtIC1mICQkdGVtcDsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobG9jYWxlZGlyKTsgXAorCSAgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhcyBcCisJICAgICYmIG9yaWc9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXMgXAorCSAgICB8fCBvcmlnPSQoc3JjZGlyKS9sb2NhbGUuYWxpYXM7IFwKKwkgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAorCSAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAorCSAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKwkgIHJtIC1mICQkdGVtcDsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQoraW5zdGFsbC1kYXRhOiBhbGwKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCisJICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCisJICAkKElOU1RBTExfREFUQSkgQ2hhbmdlTG9nLmluc3QgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvQ2hhbmdlTG9nOyBcCisJICBkaXN0cz0iQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pIjsgXAorCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSBcCisJCQkgICAgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCisJICBkb25lOyBcCisJICBjaG1vZCBhK3ggJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvY29uZmlnLmNoYXJzZXQ7IFwKKwkgIGRpc3RzPSIkKERJU1RGSUxFUy5nZW5lcmF0ZWQpIjsgXAorCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRkaXIvJCRmaWxlIFwKKwkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwkgIGRpc3RzPSIkKERJU1RGSUxFUy5vYnNvbGV0ZSkiOyBcCisJICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisKK2luc3RhbGxkaXJzOgorCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAorCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKwordW5pbnN0YWxsOgorCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgcm0gLWYgJChERVNURElSKSQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCisJICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAorCSAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwuJGxhOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAorCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorCSAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAorCSAgICB0ZW1wPSQoREVTVERJUikkKGxpYmRpcikvdC1jaGFyc2V0LmFsaWFzOyBcCisJICAgIGRlc3Q9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCisJICAgIHNlZCAtZiByZWYtZGVsLnNlZCAkJGRlc3QgPiAkJHRlbXA7IFwKKwkgICAgaWYgZ3JlcCAnXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAkJCcgJCR0ZW1wID4gL2Rldi9udWxsOyB0aGVuIFwKKwkgICAgICBybSAtZiAkJGRlc3Q7IFwKKwkgICAgZWxzZSBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKwkgICAgZmk7IFwKKwkgICAgcm0gLWYgJCR0ZW1wOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgdGhlbiBcCisJICAgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAorCSAgICBkZXN0PSQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyBcCisJICAgIHNlZCAtZiByZWYtZGVsLnNlZCAkJGRlc3QgPiAkJHRlbXA7IFwKKwkgICAgaWYgZ3JlcCAnXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAkJCcgJCR0ZW1wID4gL2Rldi9udWxsOyB0aGVuIFwKKwkgICAgICBybSAtZiAkJGRlc3Q7IFwKKwkgICAgZWxzZSBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKwkgICAgZmk7IFwKKwkgICAgcm0gLWYgJCR0ZW1wOyBcCisJICBmaTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKKwkgIGZvciBmaWxlIGluIFZFUlNJT04gQ2hhbmdlTG9nIENPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpOyBkbyBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCitpbmZvIGR2aSBwcyBwZGYgaHRtbDoKKworJChPQkpFQ1RTKTogbGliZ251aW50bC5oCitiaW5kdGV4dGRvbS4kbG8gZGNnZXR0ZXh0LiRsbyBkY2lnZXR0ZXh0LiRsbyBkY25nZXR0ZXh0LiRsbyBkZ2V0dGV4dC4kbG8gZG5nZXR0ZXh0LiRsbyBmaW5kZG9tYWluLiRsbyBnZXR0ZXh0LiRsbyBpbnRsLWNvbXBhdC4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIG5nZXR0ZXh0LiRsbyB0ZXh0ZG9tYWluLiRsbzogJChzcmNkaXIpL2dldHRleHRQLmggJChzcmNkaXIpL2dtby5oICQoc3JjZGlyKS9sb2FkaW5mby5oCitkY2lnZXR0ZXh0LiRsbyBsb2FkbXNnY2F0LiRsbzogJChzcmNkaXIpL2hhc2gtc3RyaW5nLmgKK2V4cGxvZGVuYW1lLiRsbyBsMTBuZmxpc3QuJGxvOiAkKHNyY2RpcikvbG9hZGluZm8uaAorZGNpZ2V0dGV4dC4kbG8gbG9hZG1zZ2NhdC4kbG8gcGx1cmFsLiRsbyBwbHVyYWwtZXhwLiRsbzogJChzcmNkaXIpL3BsdXJhbC1leHAuaAorZGNpZ2V0dGV4dC4kbG86ICQoc3JjZGlyKS9ldmFsLXBsdXJhbC5oCitsb2NhbGNoYXJzZXQuJGxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmgKK2xvY2FsZWFsaWFzLiRsbyBsb2NhbGNoYXJzZXQuJGxvIHJlbG9jYXRhYmxlLiRsbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmgKK3ByaW50Zi4kbG86ICQoc3JjZGlyKS9wcmludGYtYXJncy5oICQoc3JjZGlyKS9wcmludGYtYXJncy5jICQoc3JjZGlyKS9wcmludGYtcGFyc2UuaCAkKHNyY2Rpcikvd3ByaW50Zi1wYXJzZS5oICQoc3JjZGlyKS94c2l6ZS5oICQoc3JjZGlyKS9wcmludGYtcGFyc2UuYyAkKHNyY2RpcikvdmFzbnByaW50Zi5oICQoc3JjZGlyKS92YXNud3ByaW50Zi5oICQoc3JjZGlyKS92YXNucHJpbnRmLmMKKwordGFnczogVEFHUworCitUQUdTOiAkKEhFQURFUlMpICQoU09VUkNFUykKKwloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgZXRhZ3MgLW8gJCRoZXJlL1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCisKK2N0YWdzOiBDVEFHUworCitDVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCisJaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIGN0YWdzIC1vICQkaGVyZS9DVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKKworaWQ6IElECisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykKKwloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgbWtpZCAtZiQkaGVyZS9JRCAkKEhFQURFUlMpICQoU09VUkNFUykKKworCittb3N0bHljbGVhbjoKKwlybSAtZiAqLmEgKi5sYSAqLm8gKi5vYmogKi5sbyBjb3JlIGNvcmUuKgorCXJtIC1mIGxpYmdudWludGwuaCBsaWJpbnRsLmggY2hhcnNldC5hbGlhcyByZWYtYWRkLnNlZCByZWYtZGVsLnNlZAorCXJtIC1mIC1yIC5saWJzIF9saWJzCisKK2NsZWFuOiBtb3N0bHljbGVhbgorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgSUQgVEFHUworCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSIgfHwgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAorCSAgcm0gLWYgQ2hhbmdlTG9nLmluc3QgJChESVNURklMRVMubm9ybWFsKTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworCisjIEdOVSBnZXR0ZXh0IG5lZWRzIG5vdCBjb250YWluIHRoZSBmaWxlIGBWRVJTSU9OJyBidXQgY29udGFpbnMgc29tZQorIyBvdGhlciBmaWxlcyB3aGljaCBzaG91bGQgbm90IGJlIGRpc3RyaWJ1dGVkIGluIG90aGVyIHBhY2thZ2VzLgorZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKK2Rpc3QgZGlzdGRpcjogTWFrZWZpbGUKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICA6IDsgXAorCWVsc2UgXAorCSAgaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIjsgdGhlbiBcCisJICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLmdldHRleHQpIjsgXAorCSAgZWxzZSBcCisJICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCisJICBmaTsgXAorCSAgJChNQUtFKSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCkgJCRhZGRpdGlvbmFsOyBcCisJICBmb3IgZmlsZSBpbiBDaGFuZ2VMb2cgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpICQkYWRkaXRpb25hbDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAorCSAgICBjcCAtcCAkJGRpci8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCSAgZG9uZTsgXAorCWZpCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisjIFRoaXMgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsIGJ1dCBkb2Vzbid0IHdvcmsgYW55IG1vcmUgd2l0aCBhdXRvY29uZi0yLjU3LAorIyB3aGVuIEFDX0NPTkZJR19GSUxFUyhbaW50bC9NYWtlZmlsZTpzb21lZGlyL01ha2VmaWxlLmluXSkgaXMgdXNlZC4KKyMJY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS91bml4L2ludGwvVkVSU0lPTiBiL3VuaXgvaW50bC9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Yjg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvVkVSU0lPTgpAQCAtMCwwICsxIEBACitHTlUgZ2V0dGV4dCBsaWJyYXJ5IGZyb20gZ2V0dGV4dC0wLjE0LjEKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9iaW5kdGV4dGRvbS5jIGIvdW5peC9pbnRsL2JpbmR0ZXh0ZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkYzQwMAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9iaW5kdGV4dGRvbS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmluZHRleHRkb21haW4oMykgZnVuY3Rpb24KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorCisjaWZkZWYgX0xJQkMKKy8qIFdlIGhhdmUgdG8gaGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCisjIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+CisjZWxzZQorLyogUHJvdmlkZSBkdW1teSBpbXBsZW1lbnRhdGlvbiBpZiB0aGlzIGlzIG91dHNpZGUgZ2xpYmMuICAqLworIyBkZWZpbmUgX19saWJjX3J3bG9ja19kZWZpbmUoQ0xBU1MsIE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX3dybG9jayhOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja191bmxvY2soTkFNRSkKKyNlbmRpZgorCisvKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50CisgICBuYW1lcyB0aGFuIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gR05VIGxpYmMsIG90aGVyd2lzZSBwcm9ncmFtcworICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCisjaWYgIWRlZmluZWQgX0xJQkMKKyMgZGVmaW5lIF9ubF9kZWZhdWx0X2Rpcm5hbWUgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWUKKyMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKKyNlbmRpZgorCisvKiBTb21lIGNvbXBpbGVycywgbGlrZSBTdW5PUzQgY2MsIGRvbid0IGhhdmUgb2Zmc2V0b2YgaW4gPHN0ZGRlZi5oPi4gICovCisjaWZuZGVmIG9mZnNldG9mCisjIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKKyNpZmRlZiBfTElCQworZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZV9pbnRlcm5hbFtdIGF0dHJpYnV0ZV9oaWRkZW47CisjZWxzZQorIyBkZWZpbmUgSU5UVVNFKG5hbWUpIG5hbWUKKyNlbmRpZgorCisvKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucy4gICovCitleHRlcm4gc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisKKy8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLworX19saWJjX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEJJTkRURVhURE9NQUlOIF9fYmluZHRleHRkb21haW4KKyMgZGVmaW5lIEJJTkRfVEVYVERPTUFJTl9DT0RFU0VUIF9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKKyMgaWZuZGVmIHN0cmR1cAorIyAgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgQklORFRFWFRET01BSU4gbGliaW50bF9iaW5kdGV4dGRvbWFpbgorIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAorI2VuZGlmCisKKy8qIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IG5hbWUgKkRJUk5BTUVQIGFuZCB0aGUgb3V0cHV0IGNvZGVzZXQgKkNPREVTRVRQCisgICB0byBiZSB1c2VkIGZvciB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cuCisgICBJZiAqRElSTkFNRVAgb3IgKkNPREVTRVRQIGlzIE5VTEwsIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBpcyBub3QKKyAgIG1vZGlmaWVkLCBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIGlzIHJldHVybmVkLgorICAgSWYgRElSTkFNRVAgb3IgQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5laXRoZXIKKyAgIG1vZGlmaWVkIG5vciByZXR1cm5lZC4gICovCitzdGF0aWMgdm9pZAorc2V0X2JpbmRpbmdfdmFsdWVzIChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCQkgICAgY29uc3QgY2hhciAqKmRpcm5hbWVwLCBjb25zdCBjaGFyICoqY29kZXNldHApCit7CisgIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOworICBpbnQgbW9kaWZpZWQ7CisKKyAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KKyAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCB8fCBkb21haW5uYW1lWzBdID09ICdcMCcpCisgICAgeworICAgICAgaWYgKGRpcm5hbWVwKQorCSpkaXJuYW1lcCA9IE5VTEw7CisgICAgICBpZiAoY29kZXNldHApCisJKmNvZGVzZXRwID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX19saWJjX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICBtb2RpZmllZCA9IDA7CisKKyAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7CisgICAgICBpZiAoY29tcGFyZSA9PSAwKQorCS8qIFdlIGZvdW5kIGl0ISAgKi8KKwlicmVhazsKKyAgICAgIGlmIChjb21wYXJlIDwgMCkKKwl7CisJICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLworCSAgYmluZGluZyA9IE5VTEw7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChiaW5kaW5nICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGRpcm5hbWVwKQorCXsKKwkgIGNvbnN0IGNoYXIgKmRpcm5hbWUgPSAqZGlybmFtZXA7CisKKwkgIGlmIChkaXJuYW1lID09IE5VTEwpCisJICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KKwkgICAgKmRpcm5hbWVwID0gYmluZGluZy0+ZGlybmFtZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKKwkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKKwkJIG9sZCBiaW5kaW5nLiAgKi8KKwkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5kaXJuYW1lOworCSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIHJlc3VsdCkgIT0gMCkKKwkJeworCQkgIGlmIChzdHJjbXAgKGRpcm5hbWUsIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKSkgPT0gMCkKKwkJICAgIHJlc3VsdCA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKwkJICBlbHNlCisJCSAgICB7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisJCSAgICAgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7CisjZWxzZQorCQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7CisJCSAgICAgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKwkJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKwkJCW1lbWNweSAocmVzdWx0LCBkaXJuYW1lLCBsZW4pOworI2VuZGlmCisJCSAgICB9CisKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQorCQkgICAgeworCQkgICAgICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJCQlmcmVlIChiaW5kaW5nLT5kaXJuYW1lKTsKKworCQkgICAgICBiaW5kaW5nLT5kaXJuYW1lID0gcmVzdWx0OworCQkgICAgICBtb2RpZmllZCA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgICAqZGlybmFtZXAgPSByZXN1bHQ7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChjb2Rlc2V0cCkKKwl7CisJICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOworCisJICBpZiAoY29kZXNldCA9PSBOVUxMKQorCSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCisJICAgICpjb2Rlc2V0cCA9IGJpbmRpbmctPmNvZGVzZXQ7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBUaGUgZG9tYWluIGlzIGFscmVhZHkgYm91bmQuICBJZiB0aGUgbmV3IHZhbHVlIGFuZCB0aGUgb2xkCisJCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCisJCSBvbGQgYmluZGluZy4gICovCisJICAgICAgY2hhciAqcmVzdWx0ID0gYmluZGluZy0+Y29kZXNldDsKKwkgICAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgc3RyY21wIChjb2Rlc2V0LCByZXN1bHQpICE9IDApCisJCXsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKwkJICByZXN1bHQgPSBzdHJkdXAgKGNvZGVzZXQpOworI2Vsc2UKKwkJICBzaXplX3QgbGVuID0gc3RybGVuIChjb2Rlc2V0KSArIDE7CisJCSAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCisJCSAgICBtZW1jcHkgKHJlc3VsdCwgY29kZXNldCwgbGVuKTsKKyNlbmRpZgorCisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKwkJICAgIHsKKwkJICAgICAgaWYgKGJpbmRpbmctPmNvZGVzZXQgIT0gTlVMTCkKKwkJCWZyZWUgKGJpbmRpbmctPmNvZGVzZXQpOworCisJCSAgICAgIGJpbmRpbmctPmNvZGVzZXQgPSByZXN1bHQ7CisJCSAgICAgIGJpbmRpbmctPmNvZGVzZXRfY250cisrOworCQkgICAgICBtb2RpZmllZCA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgICAqY29kZXNldHAgPSByZXN1bHQ7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmICgoZGlybmFtZXAgPT0gTlVMTCB8fCAqZGlybmFtZXAgPT0gTlVMTCkKKwkgICAmJiAoY29kZXNldHAgPT0gTlVMTCB8fCAqY29kZXNldHAgPT0gTlVMTCkpCisgICAgeworICAgICAgLyogU2ltcGx5IHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLworICAgICAgaWYgKGRpcm5hbWVwKQorCSpkaXJuYW1lcCA9IElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKyAgICAgIGlmIChjb2Rlc2V0cCkKKwkqY29kZXNldHAgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IGJpbmRpbmcuICAqLworICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOworICAgICAgc3RydWN0IGJpbmRpbmcgKm5ld19iaW5kaW5nID0KKwkoc3RydWN0IGJpbmRpbmcgKikgbWFsbG9jIChvZmZzZXRvZiAoc3RydWN0IGJpbmRpbmcsIGRvbWFpbm5hbWUpICsgbGVuKTsKKworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKG5ld19iaW5kaW5nID09IE5VTEwsIDApKQorCWdvdG8gZmFpbGVkOworCisgICAgICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lLCBkb21haW5uYW1lLCBsZW4pOworCisgICAgICBpZiAoZGlybmFtZXApCisJeworCSAgY29uc3QgY2hhciAqZGlybmFtZSA9ICpkaXJuYW1lcDsKKworCSAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKKwkgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUuICAqLworCSAgICBkaXJuYW1lID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpKSA9PSAwKQorCQlkaXJuYW1lID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworCSAgICAgIGVsc2UKKwkJeworCQkgIGNoYXIgKnJlc3VsdDsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKwkJICByZXN1bHQgPSBzdHJkdXAgKGRpcm5hbWUpOworCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCisJCSAgICBnb3RvIGZhaWxlZF9kaXJuYW1lOworI2Vsc2UKKwkJICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7CisJCSAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCisJCSAgICBnb3RvIGZhaWxlZF9kaXJuYW1lOworCQkgIG1lbWNweSAocmVzdWx0LCBkaXJuYW1lLCBsZW4pOworI2VuZGlmCisJCSAgZGlybmFtZSA9IHJlc3VsdDsKKwkJfQorCSAgICB9CisJICAqZGlybmFtZXAgPSBkaXJuYW1lOworCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBkaXJuYW1lOworCX0KKyAgICAgIGVsc2UKKwkvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCisJbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisKKyAgICAgIG5ld19iaW5kaW5nLT5jb2Rlc2V0X2NudHIgPSAwOworCisgICAgICBpZiAoY29kZXNldHApCisJeworCSAgY29uc3QgY2hhciAqY29kZXNldCA9ICpjb2Rlc2V0cDsKKworCSAgaWYgKGNvZGVzZXQgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNoYXIgKnJlc3VsdDsKKworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorCSAgICAgIHJlc3VsdCA9IHN0cmR1cCAoY29kZXNldCk7CisJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKKwkJZ290byBmYWlsZWRfY29kZXNldDsKKyNlbHNlCisJICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoY29kZXNldCkgKyAxOworCSAgICAgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQorCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OworCSAgICAgIG1lbWNweSAocmVzdWx0LCBjb2Rlc2V0LCBsZW4pOworI2VuZGlmCisJICAgICAgY29kZXNldCA9IHJlc3VsdDsKKwkgICAgICBuZXdfYmluZGluZy0+Y29kZXNldF9jbnRyKys7CisJICAgIH0KKwkgICpjb2Rlc2V0cCA9IGNvZGVzZXQ7CisJICBuZXdfYmluZGluZy0+Y29kZXNldCA9IChjaGFyICopIGNvZGVzZXQ7CisJfQorICAgICAgZWxzZQorCW5ld19iaW5kaW5nLT5jb2Rlc2V0ID0gTlVMTDsKKworICAgICAgLyogTm93IGVucXVldWUgaXQuICAqLworICAgICAgaWYgKF9ubF9kb21haW5fYmluZGluZ3MgPT0gTlVMTAorCSAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZG9tYWluX2JpbmRpbmdzLT5kb21haW5uYW1lKSA8IDApCisJeworCSAgbmV3X2JpbmRpbmctPm5leHQgPSBfbmxfZG9tYWluX2JpbmRpbmdzOworCSAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IG5ld19iaW5kaW5nOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsKKwkgIHdoaWxlIChiaW5kaW5nLT5uZXh0ICE9IE5VTEwKKwkJICYmIHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+bmV4dC0+ZG9tYWlubmFtZSkgPiAwKQorCSAgICBiaW5kaW5nID0gYmluZGluZy0+bmV4dDsKKworCSAgbmV3X2JpbmRpbmctPm5leHQgPSBiaW5kaW5nLT5uZXh0OworCSAgYmluZGluZy0+bmV4dCA9IG5ld19iaW5kaW5nOworCX0KKworICAgICAgbW9kaWZpZWQgPSAxOworCisgICAgICAvKiBIZXJlIHdlIGRlYWwgd2l0aCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcy4gICovCisgICAgICBpZiAoMCkKKwl7CisJZmFpbGVkX2NvZGVzZXQ6CisJICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgIT0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpKQorCSAgICBmcmVlIChuZXdfYmluZGluZy0+ZGlybmFtZSk7CisJZmFpbGVkX2Rpcm5hbWU6CisJICBmcmVlIChuZXdfYmluZGluZyk7CisJZmFpbGVkOgorCSAgaWYgKGRpcm5hbWVwKQorCSAgICAqZGlybmFtZXAgPSBOVUxMOworCSAgaWYgKGNvZGVzZXRwKQorCSAgICAqY29kZXNldHAgPSBOVUxMOworCX0KKyAgICB9CisKKyAgLyogSWYgd2UgbW9kaWZpZWQgYW55IGJpbmRpbmcsIHdlIGZsdXNoIHRoZSBjYWNoZXMuICAqLworICBpZiAobW9kaWZpZWQpCisgICAgKytfbmxfbXNnX2NhdF9jbnRyOworCisgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Cit9CisKKy8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAorICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLworY2hhciAqCitCSU5EVEVYVERPTUFJTiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSkKK3sKKyAgc2V0X2JpbmRpbmdfdmFsdWVzIChkb21haW5uYW1lLCAmZGlybmFtZSwgTlVMTCk7CisgIHJldHVybiAoY2hhciAqKSBkaXJuYW1lOworfQorCisvKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCisgICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KK2NoYXIgKgorQklORF9URVhURE9NQUlOX0NPREVTRVQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmNvZGVzZXQpCit7CisgIHNldF9iaW5kaW5nX3ZhbHVlcyAoZG9tYWlubmFtZSwgTlVMTCwgJmNvZGVzZXQpOworICByZXR1cm4gKGNoYXIgKikgY29kZXNldDsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhc2VzIGZvciBmdW5jdGlvbiBuYW1lcyBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fYmluZHRleHRkb21haW4sIGJpbmR0ZXh0ZG9tYWluKTsKK3dlYWtfYWxpYXMgKF9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQsIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2NvbmZpZy5jaGFyc2V0IGIvdW5peC9pbnRsL2NvbmZpZy5jaGFyc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzZDQ1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvY29uZmlnLmNoYXJzZXQKQEAgLTAsMCArMSw2MDggQEAKKyMhIC9iaW4vc2gKKyMgT3V0cHV0IGEgc3lzdGVtIGRlcGVuZGVudCB0YWJsZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYWxpYXNlcy4KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjICAgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyAgIFVTQS4KKyMKKyMgVGhlIHRhYmxlIGNvbnNpc3RzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCisjICAgIEFMSUFTICBDQU5PTklDQUwKKyMKKyMgQUxJQVMgaXMgdGhlIChzeXN0ZW0gZGVwZW5kZW50KSByZXN1bHQgb2YgIm5sX2xhbmdpbmZvIChDT0RFU0VUKSIuCisjIEFMSUFTIGlzIGNvbXBhcmVkIGluIGEgY2FzZSBzZW5zaXRpdmUgd2F5LgorIworIyBDQU5PTklDQUwgaXMgdGhlIEdOVSBjYW5vbmljYWwgbmFtZSBmb3IgdGhpcyBjaGFyYWN0ZXIgZW5jb2RpbmcuCisjIEl0IG11c3QgYmUgYW4gZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IGxpYmljb252LiBTdXBwb3J0IGJ5IEdOVSBsaWJjIGlzCisjIGFsc28gZGVzaXJhYmxlLiBDQU5PTklDQUwgaXMgY2FzZSBpbnNlbnNpdGl2ZS4gVXN1YWxseSBhbiB1cHBlciBjYXNlCisjIE1JTUUgY2hhcnNldCBuYW1lIGlzIHByZWZlcnJlZC4KKyMgVGhlIGN1cnJlbnQgbGlzdCBvZiBHTlUgY2Fub25pY2FsIGNoYXJzZXQgbmFtZXMgaXMgYXMgZm9sbG93cy4KKyMKKyMgICAgICAgbmFtZSAgICAgICAgICAgICAgTUlNRT8gICAgICAgICAgICAgdXNlZCBieSB3aGljaCBzeXN0ZW1zCisjICAgQVNDSUksIEFOU0lfWDMuNC0xOTY4ICAgICAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBJU08tODg1OS0xICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTIgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSVNPLTg4NTktMyAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMKKyMgICBJU08tODg1OS00ICAgICAgICAgICAgICBZICAgb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBJU08tODg1OS01ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTYgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBzb2xhcmlzCisjICAgSVNPLTg4NTktNyAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKKyMgICBJU08tODg1OS04ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKKyMgICBJU08tODg1OS05ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcworIyAgIElTTy04ODU5LTEzICAgICAgICAgICAgICAgICBnbGliYworIyAgIElTTy04ODU5LTE0ICAgICAgICAgICAgICAgICBnbGliYworIyAgIElTTy04ODU5LTE1ICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgZnJlZWJzZAorIyAgIEtPSTgtUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgS09JOC1VICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGZyZWVic2QgZGFyd2luCisjICAgS09JOC1UICAgICAgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgQ1A0MzcgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQNzc1ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg1MCAgICAgICAgICAgICAgICAgICAgICAgYWl4IG9zZiBkb3MKKyMgICBDUDg1MiAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NTUgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODU2ICAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDg1NyAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjEgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODYyICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg2NCAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjUgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODY2ICAgICAgICAgICAgICAgICAgICAgICBmcmVlYnNkIGRhcndpbiBkb3MKKyMgICBDUDg2OSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NzQgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcworIyAgIENQOTIyICAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDkzMiAgICAgICAgICAgICAgICAgICAgICAgYWl4IHdvZTMyIGRvcworIyAgIENQOTQzICAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDk0OSAgICAgICAgICAgICAgICAgICAgICAgb3NmIHdvZTMyIGRvcworIyAgIENQOTUwICAgICAgICAgICAgICAgICAgICAgICB3b2UzMiBkb3MKKyMgICBDUDEwNDYgICAgICAgICAgICAgICAgICAgICAgYWl4CisjICAgQ1AxMTI0ICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQMTEyNSAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDExMjkgICAgICAgICAgICAgICAgICAgICAgYWl4CisjICAgQ1AxMjUwICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjUxICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMgZGFyd2luIHdvZTMyCisjICAgQ1AxMjUyICAgICAgICAgICAgICAgICAgICAgIGFpeCB3b2UzMgorIyAgIENQMTI1MyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIENQMTI1NCAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIENQMTI1NSAgICAgICAgICAgICAgICAgICAgICBnbGliYyB3b2UzMgorIyAgIENQMTI1NiAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIENQMTI1NyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIEdCMjMxMiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBFVUMtSlAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEVVQy1LUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgRVVDLVRXICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKKyMgICBCSUc1ICAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBCSUc1LUhLU0NTICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcworIyAgIEdCSyAgICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgd29lMzIgZG9zCisjICAgR0IxODAzMCAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMKKyMgICBTSElGVF9KSVMgICAgICAgICAgICAgICBZICAgaHB1eCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEpPSEFCICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzIHdvZTMyCisjICAgVElTLTYyMCAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzCisjICAgVklTQ0lJICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjCisjICAgVENWTjU3MTItMSAgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgR0VPUkdJQU4tUFMgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgSFAtUk9NQU44ICAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBIUC1BUkFCSUM4ICAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLUdSRUVLOCAgICAgICAgICAgICAgICAgICBocHV4CisjICAgSFAtSEVCUkVXOCAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBIUC1UVVJLSVNIOCAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLUtBTkE4ICAgICAgICAgICAgICAgICAgICBocHV4CisjICAgREVDLUtBTkpJICAgICAgICAgICAgICAgICAgIG9zZgorIyAgIERFQy1IQU5ZVSAgICAgICAgICAgICAgICAgICBvc2YKKyMgICBVVEYtOCAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKKyMKKyMgTm90ZTogTmFtZXMgd2hpY2ggYXJlIG5vdCBtYXJrZWQgYXMgYmVpbmcgYSBNSU1FIG5hbWUgc2hvdWxkIG5vdCBiZSB1c2VkIGluCisjIEludGVybmV0IHByb3RvY29scyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2UgKG1haWwsIG5ld3MsIGV0Yy4pLgorIworIyBOb3RlOiBBU0NJSSBhbmQgQU5TSV9YMy40LTE5NjggYXJlIHN5bm9ueW1vdXMgY2Fub25pY2FsIG5hbWVzLiBBcHBsaWNhdGlvbnMKKyMgbXVzdCB1bmRlcnN0YW5kIGJvdGggbmFtZXMgYW5kIHRyZWF0IHRoZW0gYXMgZXF1aXZhbGVudC4KKyMKKyMgVGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIGZpbGUgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHNwZWNpZmljYXRpb24sCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorCitob3N0PSIkMSIKK29zPWBlY2hvICIkaG9zdCIgfCBzZWQgLWUgJ3MvXlteLV0qLVteLV0qLVwoLipcKSQvXDEvJ2AKK2VjaG8gIiMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFsaWFzZXMsIgorZWNobyAiIyBzdWl0YWJsZSBmb3Igb3BlcmF0aW5nIHN5c3RlbSAnJHtvc30nLiIKK2VjaG8gIiMgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gY29uZmlnLmNoYXJzZXQuIgorIyBMaXN0IG9mIHJlZmVyZW5jZXMsIHVwZGF0ZWQgZHVyaW5nIGluc3RhbGxhdGlvbjoKK2VjaG8gIiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAiCitjYXNlICIkb3MiIGluCisgICAgbGludXgtZ251bGliYzEqKQorCSMgTGludXggbGliYzUgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwllY2hvICJDIEFTQ0lJIgorCWVjaG8gIlBPU0lYIEFTQ0lJIgorCWZvciBsIGluIGFmIGFmX1pBIGNhIGNhX0VTIGRhIGRhX0RLIGRlIGRlX0FUIGRlX0JFIGRlX0NIIGRlX0RFIGRlX0xVIFwKKwkgICAgICAgICBlbiBlbl9BVSBlbl9CVyBlbl9DQSBlbl9ESyBlbl9HQiBlbl9JRSBlbl9OWiBlbl9VUyBlbl9aQSBcCisJICAgICAgICAgZW5fWlcgZXMgZXNfQVIgZXNfQk8gZXNfQ0wgZXNfQ08gZXNfRE8gZXNfRUMgZXNfRVMgZXNfR1QgXAorCSAgICAgICAgIGVzX0hOIGVzX01YIGVzX1BBIGVzX1BFIGVzX1BZIGVzX1NWIGVzX1VTIGVzX1VZIGVzX1ZFIGV0IFwKKwkgICAgICAgICBldF9FRSBldSBldV9FUyBmaSBmaV9GSSBmbyBmb19GTyBmciBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBcCisJICAgICAgICAgZnJfTFUgZ2EgZ2FfSUUgZ2wgZ2xfRVMgaWQgaWRfSUQgaW4gaW5fSUQgaXMgaXNfSVMgaXQgaXRfQ0ggXAorCSAgICAgICAgIGl0X0lUIGtsIGtsX0dMIG5sIG5sX0JFIG5sX05MIG5vIG5vX05PIHB0IHB0X0JSIHB0X1BUIHN2IFwKKwkgICAgICAgICBzdl9GSSBzdl9TRTsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5pc28tODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5pc28tODg1OS0xNSBJU08tODg1OS0xNSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTE1QGV1cm8gSVNPLTg4NTktMTUiCisJICBlY2hvICIkbEBldXJvIElTTy04ODU5LTE1IgorCSAgZWNobyAiJGwuY3AtNDM3IENQNDM3IgorCSAgZWNobyAiJGwuY3AtODUwIENQODUwIgorCSAgZWNobyAiJGwuY3AtMTI1MiBDUDEyNTIiCisJICBlY2hvICIkbC5jcC0xMjUyQGV1cm8gQ1AxMjUyIgorCSAgI2VjaG8gIiRsLmF0YXJpLXN0IEFUQVJJLVNUIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gY3MgY3NfQ1ogaHIgaHJfSFIgaHUgaHVfSFUgcGwgcGxfUEwgcm8gcm9fUk8gc2sgc2tfU0sgc2wgXAorCSAgICAgICAgIHNsX1NJIHNyIHNyX0NTIHNyX1lVOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktMiIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTIgSVNPLTg4NTktMiIKKwkgIGVjaG8gIiRsLmNwLTg1MiBDUDg1MiIKKwkgIGVjaG8gIiRsLmNwLTEyNTAgQ1AxMjUwIgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCWZvciBsIGluIG1rIG1rX01LIHJ1IHJ1X1JVOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktNSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTUgSVNPLTg4NTktNSIKKwkgIGVjaG8gIiRsLmtvaTgtciBLT0k4LVIiCisJICBlY2hvICIkbC5jcC04NjYgQ1A4NjYiCisJICBlY2hvICIkbC5jcC0xMjUxIENQMTI1MSIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBhciBhcl9TQTsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTYiCisJICBlY2hvICIkbC5pc28tODg1OS02IElTTy04ODU5LTYiCisJICBlY2hvICIkbC5jcC04NjQgQ1A4NjQiCisJICAjZWNobyAiJGwuY3AtODY4IENQODY4IiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKKwkgIGVjaG8gIiRsLmNwLTEyNTYgQ1AxMjU2IgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCWZvciBsIGluIGVsIGVsX0dSIGdyIGdyX0dSOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktNyIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTcgSVNPLTg4NTktNyIKKwkgIGVjaG8gIiRsLmNwLTg2OSBDUDg2OSIKKwkgIGVjaG8gIiRsLmNwLTEyNTMgQ1AxMjUzIgorCSAgZWNobyAiJGwuY3AtMTI1M0BldXJvIENQMTI1MyIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gaGUgaGVfSUwgaXcgaXdfSUw7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS04IgorCSAgZWNobyAiJGwuaXNvLTg4NTktOCBJU08tODg1OS04IgorCSAgZWNobyAiJGwuY3AtODYyIENQODYyIgorCSAgZWNobyAiJGwuY3AtMTI1NSBDUDEyNTUiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gdHIgdHJfVFI7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS05IgorCSAgZWNobyAiJGwuaXNvLTg4NTktOSBJU08tODg1OS05IgorCSAgZWNobyAiJGwuY3AtODU3IENQODU3IgorCSAgZWNobyAiJGwuY3AtMTI1NCBDUDEyNTQiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gbHQgbHRfTFQgbHYgbHZfTFY7IGRvCisJICAjZWNobyAiJGwgQkFMVElDIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKKwkgIGVjaG8gIiRsIElTTy04ODU5LTEzIgorCWRvbmUKKwlmb3IgbCBpbiBydV9VQSB1ayB1a19VQTsgZG8KKwkgIGVjaG8gIiRsIEtPSTgtVSIKKwlkb25lCisJZm9yIGwgaW4gemggemhfQ047IGRvCisJICAjZWNobyAiJGwgR0JfMjMxMi04MCIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nLCB3cm9uZyBlbmNvZGluZyBuYW1lCisJICBlY2hvICIkbCBHQjIzMTIiCisJZG9uZQorCWZvciBsIGluIGphIGphX0pQIGphX0pQLkVVQzsgZG8KKwkgIGVjaG8gIiRsIEVVQy1KUCIKKwlkb25lCisJZm9yIGwgaW4ga28ga29fS1I7IGRvCisJICBlY2hvICIkbCBFVUMtS1IiCisJZG9uZQorCWZvciBsIGluIHRoIHRoX1RIOyBkbworCSAgZWNobyAiJGwgVElTLTYyMCIKKwlkb25lCisJZm9yIGwgaW4gZmEgZmFfSVI7IGRvCisJICAjZWNobyAiJGwgSVNJUkktMzM0MiIgIyBhIGJyb2tlbiBlbmNvZGluZworCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCTs7CisgICAgbGludXgqIHwgKi1nbnUqKQorCSMgV2l0aCBnbGliYy0yLjEgb3IgbmV3ZXIsIHdlIGRvbid0IG5lZWQgYW55IGNhbm9uaWNhbGl6YXRpb24sCisJIyBiZWNhdXNlIGdsaWJjIGhhcyBpY29udiBhbmQgYm90aCBnbGliYyBhbmQgbGliaWNvbnYgc3VwcG9ydCBhbGwKKwkjIEdOVSBjYW5vbmljYWwgbmFtZXMgZGlyZWN0bHkuIFRoZXJlZm9yZSwgdGhlIE1ha2VmaWxlIGRvZXMgbm90CisJIyBuZWVkIHRvIGluc3RhbGwgdGhlIGFsaWFzIGZpbGUgYXQgYWxsLgorCSMgVGhlIGZvbGxvd2luZyBhcHBsaWVzIG9ubHkgdG8gZ2xpYmMtMi4wLnggYW5kIG9sZGVyIGxpYmNzLgorCWVjaG8gIklTT182NDYuSVJWOjE5ODMgQVNDSUkiCisJOzsKKyAgICBhaXgqKQorCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgorCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgorCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgorCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgorCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgorCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCisJZWNobyAiSUJNLTg1MCBDUDg1MCIKKwllY2hvICJJQk0tODU2IENQODU2IgorCWVjaG8gIklCTS05MjEgSVNPLTg4NTktMTMiCisJZWNobyAiSUJNLTkyMiBDUDkyMiIKKwllY2hvICJJQk0tOTMyIENQOTMyIgorCWVjaG8gIklCTS05NDMgQ1A5NDMiCisJZWNobyAiSUJNLTEwNDYgQ1AxMDQ2IgorCWVjaG8gIklCTS0xMTI0IENQMTEyNCIKKwllY2hvICJJQk0tMTEyOSBDUDExMjkiCisJZWNobyAiSUJNLTEyNTIgQ1AxMjUyIgorCWVjaG8gIklCTS1ldWNDTiBHQjIzMTIiCisJZWNobyAiSUJNLWV1Y0pQIEVVQy1KUCIKKwllY2hvICJJQk0tZXVjS1IgRVVDLUtSIgorCWVjaG8gIklCTS1ldWNUVyBFVUMtVFciCisJZWNobyAiYmlnNSBCSUc1IgorCWVjaG8gIkdCSyBHQksiCisJZWNobyAiVElTLTYyMCBUSVMtNjIwIgorCWVjaG8gIlVURi04IFVURi04IgorCTs7CisgICAgaHB1eCopCisJZWNobyAiaXNvODg1OTEgSVNPLTg4NTktMSIKKwllY2hvICJpc284ODU5MiBJU08tODg1OS0yIgorCWVjaG8gImlzbzg4NTk1IElTTy04ODU5LTUiCisJZWNobyAiaXNvODg1OTYgSVNPLTg4NTktNiIKKwllY2hvICJpc284ODU5NyBJU08tODg1OS03IgorCWVjaG8gImlzbzg4NTk4IElTTy04ODU5LTgiCisJZWNobyAiaXNvODg1OTkgSVNPLTg4NTktOSIKKwllY2hvICJpc284ODU5MTUgSVNPLTg4NTktMTUiCisJZWNobyAicm9tYW44IEhQLVJPTUFOOCIKKwllY2hvICJhcmFiaWM4IEhQLUFSQUJJQzgiCisJZWNobyAiZ3JlZWs4IEhQLUdSRUVLOCIKKwllY2hvICJoZWJyZXc4IEhQLUhFQlJFVzgiCisJZWNobyAidHVya2lzaDggSFAtVFVSS0lTSDgiCisJZWNobyAia2FuYTggSFAtS0FOQTgiCisJZWNobyAidGlzNjIwIFRJUy02MjAiCisJZWNobyAiYmlnNSBCSUc1IgorCWVjaG8gImV1Y0pQIEVVQy1KUCIKKwllY2hvICJldWNLUiBFVUMtS1IiCisJZWNobyAiZXVjVFcgRVVDLVRXIgorCWVjaG8gImhwMTVDTiBHQjIzMTIiCisJI2VjaG8gImNjZGMgPyIgIyB3aGF0IGlzIHRoaXM/CisJZWNobyAiU0pJUyBTSElGVF9KSVMiCisJZWNobyAidXRmOCBVVEYtOCIKKwk7OworICAgIGlyaXgqKQorCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgorCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgorCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgorCWVjaG8gImV1Y0NOIEdCMjMxMiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiZXVjS1IgRVVDLUtSIgorCWVjaG8gImV1Y1RXIEVVQy1UVyIKKwk7OworICAgIG9zZiopCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisJZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCisJZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCisJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwllY2hvICJjcDg1MCBDUDg1MCIKKwllY2hvICJiaWc1IEJJRzUiCisJZWNobyAiZGVjaGFueXUgREVDLUhBTllVIgorCWVjaG8gImRlY2hhbnppIEdCMjMxMiIKKwllY2hvICJkZWNrYW5qaSBERUMtS0FOSkkiCisJZWNobyAiZGVja29yZWFuIEVVQy1LUiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiZXVjS1IgRVVDLUtSIgorCWVjaG8gImV1Y1RXIEVVQy1UVyIKKwllY2hvICJHQksgR0JLIgorCWVjaG8gIktTQzU2MDEgQ1A5NDkiCisJZWNobyAic2RlY2thbmppIEVVQy1KUCIKKwllY2hvICJTSklTIFNISUZUX0pJUyIKKwllY2hvICJUQUNUSVMgVElTLTYyMCIKKwllY2hvICJVVEYtOCBVVEYtOCIKKwk7OworICAgIHNvbGFyaXMqKQorCWVjaG8gIjY0NiBBU0NJSSIKKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKwllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKKwllY2hvICJJU084ODU5LTMgSVNPLTg4NTktMyIKKwllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKKwllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKKwllY2hvICJJU084ODU5LTYgSVNPLTg4NTktNiIKKwllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKKwllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKwllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgorCWVjaG8gImtvaTgtciBLT0k4LVIiCisJZWNobyAiYW5zaS0xMjUxIENQMTI1MSIKKwllY2hvICJCSUc1IEJJRzUiCisJZWNobyAiQmlnNS1IS1NDUyBCSUc1LUhLU0NTIgorCWVjaG8gImdiMjMxMiBHQjIzMTIiCisJZWNobyAiR0JLIEdCSyIKKwllY2hvICJHQjE4MDMwIEdCMTgwMzAiCisJZWNobyAiY25zMTE2NDMgRVVDLVRXIgorCWVjaG8gIjU2MDEgRVVDLUtSIgorCWVjaG8gImtvX0tSLmpvaGFwOTIgSk9IQUIiCisJZWNobyAiZXVjSlAgRVVDLUpQIgorCWVjaG8gIlBDSyBTSElGVF9KSVMiCisJZWNobyAiVElTNjIwLjI1MzMgVElTLTYyMCIKKwkjZWNobyAic3VuX2V1X2dyZWVrID8iICMgd2hhdCBpcyB0aGlzPworCWVjaG8gIlVURi04IFVURi04IgorCTs7CisgICAgZnJlZWJzZCogfCBvczIqKQorCSMgRnJlZUJTRCA0LjIgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwkjIExpa2V3aXNlIGZvciBPUy8yLiBPUy8yIGhhcyBYRnJlZTg2IGp1c3QgbGlrZSBGcmVlQlNELiBKdXN0CisJIyByZXVzZSBGcmVlQlNEJ3MgbG9jYWxlIGRhdGEgZm9yIE9TLzIuCisJZWNobyAiQyBBU0NJSSIKKwllY2hvICJVUy1BU0NJSSBBU0NJSSIKKwlmb3IgbCBpbiBsYV9MTiBsdF9MTjsgZG8KKwkgIGVjaG8gIiRsLkFTQ0lJIEFTQ0lJIgorCWRvbmUKKwlmb3IgbCBpbiBkYV9ESyBkZV9BVCBkZV9DSCBkZV9ERSBlbl9BVSBlbl9DQSBlbl9HQiBlbl9VUyBlc19FUyBcCisJICAgICAgICAgZmlfRkkgZnJfQkUgZnJfQ0EgZnJfQ0ggZnJfRlIgaXNfSVMgaXRfQ0ggaXRfSVQgbGFfTE4gXAorCSAgICAgICAgIGx0X0xOIG5sX0JFIG5sX05MIG5vX05PIHB0X1BUIHN2X1NFOyBkbworCSAgZWNobyAiJGwuSVNPXzg4NTktMSBJU08tODg1OS0xIgorCSAgZWNobyAiJGwuRElTXzg4NTktMTUgSVNPLTg4NTktMTUiCisJZG9uZQorCWZvciBsIGluIGNzX0NaIGhyX0hSIGh1X0hVIGxhX0xOIGx0X0xOIHBsX1BMIHNsX1NJOyBkbworCSAgZWNobyAiJGwuSVNPXzg4NTktMiBJU08tODg1OS0yIgorCWRvbmUKKwlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KKwkgIGVjaG8gIiRsLklTT184ODU5LTQgSVNPLTg4NTktNCIKKwlkb25lCisJZm9yIGwgaW4gcnVfUlUgcnVfU1U7IGRvCisJICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgorCSAgZWNobyAiJGwuSVNPXzg4NTktNSBJU08tODg1OS01IgorCSAgZWNobyAiJGwuQ1A4NjYgQ1A4NjYiCisJZG9uZQorCWVjaG8gInVrX1VBLktPSTgtVSBLT0k4LVUiCisJZWNobyAiemhfVFcuQklHNSBCSUc1IgorCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKKwllY2hvICJ6aF9DTi5FVUMgR0IyMzEyIgorCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCisJZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCisJZWNobyAiamFfSlAuU2hpZnRfSklTIFNISUZUX0pJUyIKKwllY2hvICJrb19LUi5FVUMgRVVDLUtSIgorCTs7CisgICAgbmV0YnNkKikKKwllY2hvICI2NDYgQVNDSUkiCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwllY2hvICJldWNDTiBHQjIzMTIiCisJZWNobyAiZXVjSlAgRVVDLUpQIgorCWVjaG8gImV1Y0tSIEVVQy1LUiIKKwllY2hvICJldWNUVyBFVUMtVFciCisJZWNobyAiQklHNSBCSUc1IgorCWVjaG8gIlNKSVMgU0hJRlRfSklTIgorCTs7CisgICAgZGFyd2luKikKKwkjIERhcndpbiA2LjggZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwllY2hvICJDIEFTQ0lJIgorCWZvciBsIGluIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGxhX0xOOyBkbworCSAgZWNobyAiJGwuVVMtQVNDSUkgQVNDSUkiCisJZG9uZQorCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKKwkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBubF9CRSBcCisJICAgICAgICAgbmxfTkwgbm9fTk8gcHRfUFQgc3ZfU0U7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS0xIgorCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgorCWRvbmUKKwlmb3IgbCBpbiBsYV9MTjsgZG8KKwkgIGVjaG8gIiRsLklTTzg4NTktMSBJU08tODg1OS0xIgorCSAgZWNobyAiJGwuSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwlkb25lCisJZm9yIGwgaW4gY3NfQ1ogaHJfSFIgaHVfSFUgbGFfTE4gcGxfUEwgc2xfU0k7IGRvCisJICBlY2hvICIkbC5JU084ODU5LTIgSVNPLTg4NTktMiIKKwlkb25lCisJZm9yIGwgaW4gbGFfTE4gbHRfTFQ7IGRvCisJICBlY2hvICIkbC5JU084ODU5LTQgSVNPLTg4NTktNCIKKwlkb25lCisJZm9yIGwgaW4gcnVfUlU7IGRvCisJICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgorCSAgZWNobyAiJGwuSVNPODg1OS01IElTTy04ODU5LTUiCisJICBlY2hvICIkbC5DUDg2NiBDUDg2NiIKKwlkb25lCisJZm9yIGwgaW4gYmdfQkc7IGRvCisJICBlY2hvICIkbC5DUDEyNTEgQ1AxMjUxIgorCWRvbmUKKwllY2hvICJ1a19VQS5LT0k4LVUgS09JOC1VIgorCWVjaG8gInpoX1RXLkJJRzUgQklHNSIKKwllY2hvICJ6aF9UVy5CaWc1IEJJRzUiCisJZWNobyAiemhfQ04uRVVDIEdCMjMxMiIKKwllY2hvICJqYV9KUC5FVUMgRVVDLUpQIgorCWVjaG8gImphX0pQLlNKSVMgU0hJRlRfSklTIgorCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCisJOzsKKyAgICBiZW9zKikKKwkjIEJlT1MgaGFzIGEgc2luZ2xlIGxvY2FsZSwgYW5kIGl0IGhhcyBVVEYtOCBlbmNvZGluZy4KKwllY2hvICIqIFVURi04IgorCTs7CisgICAgbXNkb3NkamdwcCopCisJIyBESkdQUCAyLjAzIGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCisJIyBsb2NhbGNoYXJzZXQuYyBmYWxscyBiYWNrIHRvIHVzaW5nIHRoZSBmdWxsIGxvY2FsZSBuYW1lCisJIyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisJZWNobyAiIyIKKwllY2hvICIjIFRoZSBlbmNvZGluZ3MgZ2l2ZW4gaGVyZSBtYXkgbm90IGFsbCBiZSBjb3JyZWN0LiIKKwllY2hvICIjIElmIHlvdSBmaW5kIHRoYXQgdGhlIGVuY29kaW5nIGdpdmVuIGZvciB5b3VyIGxhbmd1YWdlIGFuZCIKKwllY2hvICIjIGNvdW50cnkgaXMgbm90IHRoZSBvbmUgeW91ciBET1MgbWFjaGluZSBhY3R1YWxseSB1c2VzLCBqdXN0IgorCWVjaG8gIiMgY29ycmVjdCBpdCBpbiB0aGlzIGZpbGUsIGFuZCBzZW5kIGEgbWFpbCB0byIKKwllY2hvICIjIEp1YW4gTWFudWVsIEd1ZXJyZXJvIDxzdDAwMTkwNkBocnoxLmhyei50dS1kYXJtc3RhZHQuZGU+IgorCWVjaG8gIiMgYW5kIEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4iCisJZWNobyAiIyIKKwllY2hvICJDIEFTQ0lJIgorCSMgSVNPLTg4NTktMSBsYW5ndWFnZXMKKwllY2hvICJjYSBDUDg1MCIKKwllY2hvICJjYV9FUyBDUDg1MCIKKwllY2hvICJkYSBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJkYV9ESyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJkZSBDUDg1MCIKKwllY2hvICJkZV9BVCBDUDg1MCIKKwllY2hvICJkZV9DSCBDUDg1MCIKKwllY2hvICJkZV9ERSBDUDg1MCIKKwllY2hvICJlbiBDUDg1MCIKKwllY2hvICJlbl9BVSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJlbl9DQSBDUDg1MCIKKwllY2hvICJlbl9HQiBDUDg1MCIKKwllY2hvICJlbl9OWiBDUDQzNyIKKwllY2hvICJlbl9VUyBDUDQzNyIKKwllY2hvICJlbl9aQSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJlcyBDUDg1MCIKKwllY2hvICJlc19BUiBDUDg1MCIKKwllY2hvICJlc19CTyBDUDg1MCIKKwllY2hvICJlc19DTCBDUDg1MCIKKwllY2hvICJlc19DTyBDUDg1MCIKKwllY2hvICJlc19DUiBDUDg1MCIKKwllY2hvICJlc19DVSBDUDg1MCIKKwllY2hvICJlc19ETyBDUDg1MCIKKwllY2hvICJlc19FQyBDUDg1MCIKKwllY2hvICJlc19FUyBDUDg1MCIKKwllY2hvICJlc19HVCBDUDg1MCIKKwllY2hvICJlc19ITiBDUDg1MCIKKwllY2hvICJlc19NWCBDUDg1MCIKKwllY2hvICJlc19OSSBDUDg1MCIKKwllY2hvICJlc19QQSBDUDg1MCIKKwllY2hvICJlc19QWSBDUDg1MCIKKwllY2hvICJlc19QRSBDUDg1MCIKKwllY2hvICJlc19TViBDUDg1MCIKKwllY2hvICJlc19VWSBDUDg1MCIKKwllY2hvICJlc19WRSBDUDg1MCIKKwllY2hvICJldCBDUDg1MCIKKwllY2hvICJldF9FRSBDUDg1MCIKKwllY2hvICJldSBDUDg1MCIKKwllY2hvICJldV9FUyBDUDg1MCIKKwllY2hvICJmaSBDUDg1MCIKKwllY2hvICJmaV9GSSBDUDg1MCIKKwllY2hvICJmciBDUDg1MCIKKwllY2hvICJmcl9CRSBDUDg1MCIKKwllY2hvICJmcl9DQSBDUDg1MCIKKwllY2hvICJmcl9DSCBDUDg1MCIKKwllY2hvICJmcl9GUiBDUDg1MCIKKwllY2hvICJnYSBDUDg1MCIKKwllY2hvICJnYV9JRSBDUDg1MCIKKwllY2hvICJnZCBDUDg1MCIKKwllY2hvICJnZF9HQiBDUDg1MCIKKwllY2hvICJnbCBDUDg1MCIKKwllY2hvICJnbF9FUyBDUDg1MCIKKwllY2hvICJpZCBDUDg1MCIgICAgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJpZF9JRCBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJpcyBDUDg2MSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJpc19JUyBDUDg2MSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJpdCBDUDg1MCIKKwllY2hvICJpdF9DSCBDUDg1MCIKKwllY2hvICJpdF9JVCBDUDg1MCIKKwllY2hvICJsdCBDUDc3NSIKKwllY2hvICJsdF9MVCBDUDc3NSIKKwllY2hvICJsdiBDUDc3NSIKKwllY2hvICJsdl9MViBDUDc3NSIKKwllY2hvICJuYiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJuYl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJubCBDUDg1MCIKKwllY2hvICJubF9CRSBDUDg1MCIKKwllY2hvICJubF9OTCBDUDg1MCIKKwllY2hvICJubiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJubl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJubyBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJub19OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJwdCBDUDg1MCIKKwllY2hvICJwdF9CUiBDUDg1MCIKKwllY2hvICJwdF9QVCBDUDg1MCIKKwllY2hvICJzdiBDUDg1MCIKKwllY2hvICJzdl9TRSBDUDg1MCIKKwkjIElTTy04ODU5LTIgbGFuZ3VhZ2VzCisJZWNobyAiY3MgQ1A4NTIiCisJZWNobyAiY3NfQ1ogQ1A4NTIiCisJZWNobyAiaHIgQ1A4NTIiCisJZWNobyAiaHJfSFIgQ1A4NTIiCisJZWNobyAiaHUgQ1A4NTIiCisJZWNobyAiaHVfSFUgQ1A4NTIiCisJZWNobyAicGwgQ1A4NTIiCisJZWNobyAicGxfUEwgQ1A4NTIiCisJZWNobyAicm8gQ1A4NTIiCisJZWNobyAicm9fUk8gQ1A4NTIiCisJZWNobyAic2sgQ1A4NTIiCisJZWNobyAic2tfU0sgQ1A4NTIiCisJZWNobyAic2wgQ1A4NTIiCisJZWNobyAic2xfU0kgQ1A4NTIiCisJZWNobyAic3EgQ1A4NTIiCisJZWNobyAic3FfQUwgQ1A4NTIiCisJZWNobyAic3IgQ1A4NTIiICAgICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KKwllY2hvICJzcl9DUyBDUDg1MiIgIyBDUDg1MiBvciBDUDg2NiBvciBDUDg1NSA/PworCWVjaG8gInNyX1lVIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/CisJIyBJU08tODg1OS0zIGxhbmd1YWdlcworCWVjaG8gIm10IENQODUwIgorCWVjaG8gIm10X01UIENQODUwIgorCSMgSVNPLTg4NTktNSBsYW5ndWFnZXMKKwllY2hvICJiZSBDUDg2NiIKKwllY2hvICJiZV9CRSBDUDg2NiIKKwllY2hvICJiZyBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJiZ19CRyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJtayBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJta19NSyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJydSBDUDg2NiIKKwllY2hvICJydV9SVSBDUDg2NiIKKwllY2hvICJ1ayBDUDExMjUiCisJZWNobyAidWtfVUEgQ1AxMTI1IgorCSMgSVNPLTg4NTktNiBsYW5ndWFnZXMKKwllY2hvICJhciBDUDg2NCIKKwllY2hvICJhcl9BRSBDUDg2NCIKKwllY2hvICJhcl9EWiBDUDg2NCIKKwllY2hvICJhcl9FRyBDUDg2NCIKKwllY2hvICJhcl9JUSBDUDg2NCIKKwllY2hvICJhcl9JUiBDUDg2NCIKKwllY2hvICJhcl9KTyBDUDg2NCIKKwllY2hvICJhcl9LVyBDUDg2NCIKKwllY2hvICJhcl9NQSBDUDg2NCIKKwllY2hvICJhcl9PTSBDUDg2NCIKKwllY2hvICJhcl9RQSBDUDg2NCIKKwllY2hvICJhcl9TQSBDUDg2NCIKKwllY2hvICJhcl9TWSBDUDg2NCIKKwkjIElTTy04ODU5LTcgbGFuZ3VhZ2VzCisJZWNobyAiZWwgQ1A4NjkiCisJZWNobyAiZWxfR1IgQ1A4NjkiCisJIyBJU08tODg1OS04IGxhbmd1YWdlcworCWVjaG8gImhlIENQODYyIgorCWVjaG8gImhlX0lMIENQODYyIgorCSMgSVNPLTg4NTktOSBsYW5ndWFnZXMKKwllY2hvICJ0ciBDUDg1NyIKKwllY2hvICJ0cl9UUiBDUDg1NyIKKwkjIEphcGFuZXNlCisJZWNobyAiamEgQ1A5MzIiCisJZWNobyAiamFfSlAgQ1A5MzIiCisJIyBDaGluZXNlCisJZWNobyAiemhfQ04gR0JLIgorCWVjaG8gInpoX1RXIENQOTUwIiAjIG5vdCBDUDkzOCA/PworCSMgS29yZWFuCisJZWNobyAia3IgQ1A5NDkiICAgICMgbm90IENQOTM0ID8/CisJZWNobyAia3JfS1IgQ1A5NDkiICMgbm90IENQOTM0ID8/CisJIyBUaGFpCisJZWNobyAidGggQ1A4NzQiCisJZWNobyAidGhfVEggQ1A4NzQiCisJIyBPdGhlcgorCWVjaG8gImVvIENQODUwIgorCWVjaG8gImVvX0VPIENQODUwIgorCTs7Citlc2FjCmRpZmYgLS1naXQgYS91bml4L2ludGwvZGNnZXR0ZXh0LmMgYi91bml4L2ludGwvZGNnZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwYWNkZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9kY2dldHRleHQuYwpAQCAtMCwwICsxLDU2IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGNnZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRENHRVRURVhUIF9fZGNnZXR0ZXh0CisjIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAorI2Vsc2UKKyMgZGVmaW5lIERDR0VUVEVYVCBsaWJpbnRsX2RjZ2V0dGV4dAorIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKKyAgIGxvY2FsZS4gICovCitjaGFyICoKK0RDR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKK3sKKyAgcmV0dXJuIERDSUdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBOVUxMLCAwLCAwLCBjYXRlZ29yeSk7Cit9CisKKyNpZmRlZiBfTElCQworLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCitJTlRERUYoX19kY2dldHRleHQpCit3ZWFrX2FsaWFzIChfX2RjZ2V0dGV4dCwgZGNnZXR0ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2RjaWdldHRleHQuYyBiL3VuaXgvaW50bC9kY2lnZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyMzhlMgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9kY2lnZXR0ZXh0LmMKQEAgLTAsMCArMSwxMjE5IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGNpZ2V0dGV4dCBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFCTEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYQorY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmbmRlZiBlcnJubworZXh0ZXJuIGludCBlcnJubzsKKyNlbmRpZgorI2lmbmRlZiBfX3NldF9lcnJubworIyBkZWZpbmUgX19zZXRfZXJybm8odmFsKSBlcnJubyA9ICh2YWwpCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaWZkZWYgX0xJQkMKKyAgLyogR3Vlc3Mgd2hldGhlciBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHNpZ25hbCBTSUdGUEUuCisgICAgIFNldCB0byAxIG9ubHkgaWYgeW91IGtub3cgZm9yIHN1cmUuICBJbiBjYXNlIG9mIGRvdWJ0LCBzZXQgdG8gMC4gICovCisjIGlmIGRlZmluZWQgX19hbHBoYV9fIHx8IGRlZmluZWQgX19hcm1fXyB8fCBkZWZpbmVkIF9faTM4Nl9fIFwKKyAgICAgfHwgZGVmaW5lZCBfX202OGtfXyB8fCBkZWZpbmVkIF9fczM5MF9fCisjICBkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFIDEKKyMgZWxzZQorIyAgZGVmaW5lIElOVERJVjBfUkFJU0VTX1NJR0ZQRSAwCisjIGVuZGlmCisjZW5kaWYKKyNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCisjIGluY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhBVkVfU1lTX1BBUkFNX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisjaW5jbHVkZSAiaGFzaC1zdHJpbmcuaCIKKworLyogVGhyZWFkIHNhZmV0eW5lc3MuICAqLworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+CisjZWxzZQorLyogUHJvdmlkZSBkdW1teSBpbXBsZW1lbnRhdGlvbiBpZiB0aGlzIGlzIG91dHNpZGUgZ2xpYmMuICAqLworIyBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLCBOQU1FKQorIyBkZWZpbmUgX19saWJjX2xvY2tfbG9jayhOQU1FKQorIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUywgTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfcmRsb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX3VubG9jayhOQU1FKQorI2VuZGlmCisKKy8qIEFsaWdubWVudCBvZiB0eXBlcy4gICovCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjIGRlZmluZSBhbGlnbm9mKFRZUEUpIF9fYWxpZ25vZl9fIChUWVBFKQorI2Vsc2UKKyMgZGVmaW5lIGFsaWdub2YoVFlQRSkgXAorICAgICgoaW50KSAmKChzdHJ1Y3QgeyBjaGFyIGR1bW15MTsgVFlQRSBkdW1teTI7IH0gKikgMCktPmR1bW15MikKKyNlbmRpZgorCisvKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50CisgICBuYW1lcyB0aGFuIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gR05VIGxpYmMsIG90aGVyd2lzZSBwcm9ncmFtcworICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCisjaWYgIWRlZmluZWQgX0xJQkMKKyMgZGVmaW5lIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluIGxpYmludGxfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbgorIyBkZWZpbmUgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluCisjIGRlZmluZSBfbmxfZGVmYXVsdF9kaXJuYW1lIGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lCisjIGRlZmluZSBfbmxfZG9tYWluX2JpbmRpbmdzIGxpYmludGxfbmxfZG9tYWluX2JpbmRpbmdzCisjZW5kaWYKKworLyogU29tZSBjb21waWxlcnMsIGxpa2UgU3VuT1M0IGNjLCBkb24ndCBoYXZlIG9mZnNldG9mIGluIDxzdGRkZWYuaD4uICAqLworI2lmbmRlZiBvZmZzZXRvZgorIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSxpZGVudCkgKChzaXplX3QpJigoKHR5cGUqKTApLT5pZGVudCkpCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAorICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworIyBkZWZpbmUgZ2V0Y3dkIF9fZ2V0Y3dkCisjIGlmbmRlZiBzdHBjcHkKKyMgIGRlZmluZSBzdHBjcHkgX19zdHBjcHkKKyMgZW5kaWYKKyMgZGVmaW5lIHRmaW5kIF9fdGZpbmQKKyNlbHNlCisjIGlmICFkZWZpbmVkIEhBVkVfR0VUQ1dECitjaGFyICpnZXR3ZCAoKTsKKyMgIGRlZmluZSBnZXRjd2QoYnVmLCBtYXgpIGdldHdkIChidWYpCisjIGVsc2UKKyMgIGlmIFZNUworIyAgIGRlZmluZSBnZXRjd2QoYnVmLCBtYXgpIChnZXRjd2QpIChidWYsIG1heCwgMCkKKyMgIGVsc2UKK2NoYXIgKmdldGN3ZCAoKTsKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmbmRlZiBIQVZFX1NUUENQWQorc3RhdGljIGNoYXIgKnN0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKTsKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfTUVNUENQWQorc3RhdGljIHZvaWQgKm1lbXBjcHkgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pOworIyBlbmRpZgorI2VuZGlmCisKKy8qIEFtb3VudCB0byBpbmNyZWFzZSBidWZmZXIgc2l6ZSBieSBpbiBlYWNoIHRyeS4gICovCisjZGVmaW5lIFBBVEhfSU5DUiAzMgorCisvKiBUaGUgZm9sbG93aW5nIGlzIGZyb20gcGF0aG1heC5oLiAgKi8KKy8qIE5vbi1QT1NJWCBCU0Qgc3lzdGVtcyBtaWdodCBoYXZlIGdjYydzIGxpbWl0cy5oLCB3aGljaCBkb2Vzbid0IGRlZmluZQorICAgUEFUSF9NQVggYnV0IG1pZ2h0IGNhdXNlIHJlZGVmaW5pdGlvbiB3YXJuaW5ncyB3aGVuIHN5cy9wYXJhbS5oIGlzCisgICBsYXRlciBpbmNsdWRlZCAoYXMgb24gTU9SRS9CU0QgNC4zKS4gICovCisjaWYgZGVmaW5lZCBfUE9TSVhfVkVSU0lPTiB8fCAoZGVmaW5lZCBIQVZFX0xJTUlUU19IICYmICFkZWZpbmVkIF9fR05VQ19fKQorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9QT1NJWF9QQVRIX01BWAorIyBkZWZpbmUgX1BPU0lYX1BBVEhfTUFYIDI1NQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBQQVRIX01BWCAmJiBkZWZpbmVkIF9QQ19QQVRIX01BWAorIyBkZWZpbmUgUEFUSF9NQVggKHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkgPCAxID8gMTAyNCA6IHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkpCisjZW5kaWYKKworLyogRG9uJ3QgaW5jbHVkZSBzeXMvcGFyYW0uaCBpZiBpdCBhbHJlYWR5IGhhcyBiZWVuLiAgKi8KKyNpZiBkZWZpbmVkIEhBVkVfU1lTX1BBUkFNX0ggJiYgIWRlZmluZWQgUEFUSF9NQVggJiYgIWRlZmluZWQgTUFYUEFUSExFTgorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgUEFUSF9NQVggJiYgZGVmaW5lZCBNQVhQQVRITEVOCisjIGRlZmluZSBQQVRIX01BWCBNQVhQQVRITEVOCisjZW5kaWYKKworI2lmbmRlZiBQQVRIX01BWAorIyBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCisjZW5kaWYKKworLyogUGF0aG5hbWUgc3VwcG9ydC4KKyAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgSVNfQUJTT0xVVEVfUEFUSChQKSAgdGVzdHMgd2hldGhlciBQIGlzIGFuIGFic29sdXRlIHBhdGguICBJZiBpdCBpcyBub3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpdCBtYXkgYmUgY29uY2F0ZW5hdGVkIHRvIGEgZGlyZWN0b3J5IHBhdGhuYW1lLgorICAgSVNfUEFUSF9XSVRIX0RJUihQKSAgdGVzdHMgd2hldGhlciBQIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCisgKi8KKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKKyMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAorICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKKyAgICAgJiYgKFApWzFdID09ICc6JykKKyMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgKElTU0xBU0ggKChQKVswXSkgfHwgSEFTX0RFVklDRSAoUCkpCisjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIFwKKyAgICAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwgfHwgc3RyY2hyIChQLCAnXFwnKSAhPSBOVUxMIHx8IEhBU19ERVZJQ0UgKFApKQorI2Vsc2UKKyAgLyogVW5peCAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJykKKyMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgSVNTTEFTSCAoKFApWzBdKQorIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwpCisjZW5kaWYKKworLyogVGhpcyBpcyB0aGUgdHlwZSB1c2VkIGZvciB0aGUgc2VhcmNoIHRyZWUgd2hlcmUga25vd24gdHJhbnNsYXRpb25zCisgICBhcmUgc3RvcmVkLiAgKi8KK3N0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90Cit7CisgIC8qIERvbWFpbiBpbiB3aGljaCB0byBzZWFyY2guICAqLworICBjaGFyICpkb21haW5uYW1lOworCisgIC8qIFRoZSBjYXRlZ29yeS4gICovCisgIGludCBjYXRlZ29yeTsKKworICAvKiBTdGF0ZSBvZiB0aGUgY2F0YWxvZyBjb3VudGVyIGF0IHRoZSBwb2ludCB0aGUgc3RyaW5nIHdhcyBmb3VuZC4gICovCisgIGludCBjb3VudGVyOworCisgIC8qIENhdGFsb2cgd2hlcmUgdGhlIHN0cmluZyB3YXMgZm91bmQuICAqLworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47CisKKyAgLyogQW5kIGZpbmFsbHkgdGhlIHRyYW5zbGF0aW9uLiAgKi8KKyAgY29uc3QgY2hhciAqdHJhbnNsYXRpb247CisgIHNpemVfdCB0cmFuc2xhdGlvbl9sZW5ndGg7CisKKyAgLyogUG9pbnRlciB0byB0aGUgc3RyaW5nIGluIHF1ZXN0aW9uLiAgKi8KKyAgY2hhciBtc2dpZFtaRVJPXTsKK307CisKKy8qIFJvb3Qgb2YgdGhlIHNlYXJjaCB0cmVlIHdpdGgga25vd24gdHJhbnNsYXRpb25zLiAgV2UgY2FuIHVzZSB0aGlzCisgICBvbmx5IGlmIHRoZSBzeXN0ZW0gcHJvdmlkZXMgdGhlIGB0c2VhcmNoJyBmdW5jdGlvbiBmYW1pbHkuICAqLworI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8c2VhcmNoLmg+CisKK3N0YXRpYyB2b2lkICpyb290OworCisjIGlmZGVmIF9MSUJDCisjICBkZWZpbmUgdHNlYXJjaCBfX3RzZWFyY2gKKyMgZW5kaWYKKworLyogRnVuY3Rpb24gdG8gY29tcGFyZSB0d28gZW50cmllcyBpbiB0aGUgdGFibGUgb2Yga25vd24gdHJhbnNsYXRpb25zLiAgKi8KK3N0YXRpYyBpbnQKK3RyYW5zY21wIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisgIGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICpzMTsKKyAgY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnMyOworICBpbnQgcmVzdWx0OworCisgIHMxID0gKGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIHAxOworICBzMiA9IChjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKSBwMjsKKworICByZXN1bHQgPSBzdHJjbXAgKHMxLT5tc2dpZCwgczItPm1zZ2lkKTsKKyAgaWYgKHJlc3VsdCA9PSAwKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IHN0cmNtcCAoczEtPmRvbWFpbm5hbWUsIHMyLT5kb21haW5uYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gMCkKKwkvKiBXZSBjb21wYXJlIHRoZSBjYXRlZ29yeSBsYXN0ICh0aG91Z2ggdGhpcyBpcyB0aGUgY2hlYXBlc3QKKwkgICBvcGVyYXRpb24pIHNpbmNlIGl0IGlzIGhvcGVmdWxseSBhbHdheXMgdGhlIHNhbWUgKG5hbWVseQorCSAgIExDX01FU1NBR0VTKS4gICovCisJcmVzdWx0ID0gczEtPmNhdGVnb3J5IC0gczItPmNhdGVnb3J5OworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNpZm5kZWYgSU5UVkFSREVGCisjIGRlZmluZSBJTlRWQVJERUYobmFtZSkKKyNlbmRpZgorI2lmbmRlZiBJTlRVU0UKKyMgZGVmaW5lIElOVFVTRShuYW1lKSBuYW1lCisjZW5kaWYKKworLyogTmFtZSBvZiB0aGUgZGVmYXVsdCBkb21haW4gdXNlZCBmb3IgZ2V0dGV4dCgzKSBwcmlvciBhbnkgY2FsbCB0bworICAgdGV4dGRvbWFpbigzKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzICJtZXNzYWdlcyIuICAqLworY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdIGF0dHJpYnV0ZV9oaWRkZW4gPSAibWVzc2FnZXMiOworCisvKiBWYWx1ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGRvbWFpbiBmb3IgZ2V0dGV4dCgzKS4gICovCitjb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBhdHRyaWJ1dGVfaGlkZGVuCisgICAgID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47CisKKy8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KKyNpZiBkZWZpbmVkIF9fRU1YX18KK2V4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKKyNlbHNlCitjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXSA9IExPQ0FMRURJUjsKK0lOVFZBUkRFRiAoX25sX2RlZmF1bHRfZGlybmFtZSkKKyNlbmRpZgorCisvKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKKyAgIGNhbGxzLiAgKi8KK3N0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworc3RhdGljIGNoYXIgKnBsdXJhbF9sb29rdXAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGludCBuLAorCQkJICAgIGNvbnN0IGNoYXIgKnRyYW5zbGF0aW9uLCBzaXplX3QgdHJhbnNsYXRpb25fbGVuKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKK3N0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LAorCQkJCQkgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlICIuLi9sb2NhbGUvbG9jYWxlaW5mby5oIgorIyBkZWZpbmUgY2F0ZWdvcnlfdG9fbmFtZShjYXRlZ29yeSkJX25sX2NhdGVnb3J5X25hbWVzW2NhdGVnb3J5XQorI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyICpjYXRlZ29yeV90b19uYW1lIChpbnQgY2F0ZWdvcnkpIGludGVybmFsX2Z1bmN0aW9uOworI2VuZGlmCisKKworLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisgICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworI2lmZGVmIEhBVkVfQUxMT0NBCisvKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KKyMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCisjIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCisjZWxzZQorc3RydWN0IGJsb2NrX2xpc3QKK3sKKyAgdm9pZCAqYWRkcmVzczsKKyAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Cit9OworIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAorICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKKyAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKKyAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKKyAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAorICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCisgICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCisgICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKKyAgICAgIGZyZWUgKG9sZC0+YWRkcmVzcyk7CQkJCQkJICAgICAgXAorICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjIHVuZGVmIGFsbG9jYQorIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQorIyBkZWZpbmUgZnJlZWEocCkgZnJlZSAocCkKKyNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLworCisKKyNpZmRlZiBfTElCQworLyogTGlzdCBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciB0cmFuc2xhdGlvbnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgdHJhbnNtZW1fbGlzdAoreworICBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqbmV4dDsKKyAgY2hhciBkYXRhW1pFUk9dOworfSB0cmFuc21lbV9ibG9ja190Oworc3RhdGljIHN0cnVjdCB0cmFuc21lbV9saXN0ICp0cmFuc21lbV9saXN0OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0cmFuc21lbV9ibG9ja190OworI2VuZGlmCisKKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAorI2Vsc2UKKyMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0CisjZW5kaWYKKworLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCisjaWZkZWYgX0xJQkMKK19fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkICgsIF9ubF9zdGF0ZV9sb2NrIGF0dHJpYnV0ZV9oaWRkZW4pCisjZW5kaWYKKworLyogQ2hlY2tpbmcgd2hldGhlciB0aGUgYmluYXJpZXMgcnVucyBTVUlEIG11c3QgYmUgZG9uZSBhbmQgZ2xpYmMgcHJvdmlkZXMKKyAgIGVhc2llciBtZXRob2RzIHRoZXJlZm9yZSB3ZSBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRU5BQkxFX1NFQ1VSRSBfX2xpYmNfZW5hYmxlX3NlY3VyZQorIyBkZWZpbmUgREVURVJNSU5FX1NFQ1VSRQorI2Vsc2UKKyMgaWZuZGVmIEhBVkVfR0VUVUlECisjICBkZWZpbmUgZ2V0dWlkKCkgMAorIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9HRVRHSUQKKyMgIGRlZmluZSBnZXRnaWQoKSAwCisjIGVuZGlmCisjIGlmbmRlZiBIQVZFX0dFVEVVSUQKKyMgIGRlZmluZSBnZXRldWlkKCkgZ2V0dWlkKCkKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfR0VURUdJRAorIyAgZGVmaW5lIGdldGVnaWQoKSBnZXRnaWQoKQorIyBlbmRpZgorc3RhdGljIGludCBlbmFibGVfc2VjdXJlOworIyBkZWZpbmUgRU5BQkxFX1NFQ1VSRSAoZW5hYmxlX3NlY3VyZSA9PSAxKQorIyBkZWZpbmUgREVURVJNSU5FX1NFQ1VSRSBcCisgIGlmIChlbmFibGVfc2VjdXJlID09IDApCQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBpZiAoZ2V0dWlkICgpICE9IGdldGV1aWQgKCkgfHwgZ2V0Z2lkICgpICE9IGdldGVnaWQgKCkpCQkgICAgICBcCisJZW5hYmxlX3NlY3VyZSA9IDE7CQkJCQkJICAgICAgXAorICAgICAgZWxzZQkJCQkJCQkJICAgICAgXAorCWVuYWJsZV9zZWN1cmUgPSAtMTsJCQkJCQkgICAgICBcCisgICAgfQorI2VuZGlmCisKKy8qIEdldCB0aGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUgdGhlIHBsdXJhbCBleHByZXNzaW9uLiAgKi8KKyNpbmNsdWRlICJldmFsLXBsdXJhbC5oIgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIENBVEVHT1JZIGxvY2FsZSBhbmQsIGlmIFBMVVJBTCBpcyBub256ZXJvLCBzZWFyY2ggb3ZlciBzdHJpbmcKKyAgIGRlcGVuZGluZyBvbiB0aGUgcGx1cmFsIGZvcm0gZGV0ZXJtaW5lZCBieSBOLiAgKi8KK2NoYXIgKgorRENJR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCisJICAgIGludCBwbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IG4sIGludCBjYXRlZ29yeSkKK3sKKyNpZm5kZWYgSEFWRV9BTExPQ0EKKyAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOworI2VuZGlmCisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKKyAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7CisgIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKKyAgY29uc3QgY2hhciAqY2F0ZWdvcnl2YWx1ZTsKKyAgY2hhciAqZGlybmFtZSwgKnhkb21haW5uYW1lOworICBjaGFyICpzaW5nbGVfbG9jYWxlOworICBjaGFyICpyZXR2YWw7CisgIHNpemVfdCByZXRsZW47CisgIGludCBzYXZlZF9lcnJubzsKKyNpZiBkZWZpbmVkIEhBVkVfVFNFQVJDSCB8fCBkZWZpbmVkIF9MSUJDCisgIHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICpzZWFyY2g7CisgIHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqZm91bmRwID0gTlVMTDsKKyAgc2l6ZV90IG1zZ2lkX2xlbjsKKyNlbmRpZgorICBzaXplX3QgZG9tYWlubmFtZV9sZW47CisKKyAgLyogSWYgbm8gcmVhbCBNU0dJRCBpcyBnaXZlbiByZXR1cm4gTlVMTC4gICovCisgIGlmIChtc2dpZDEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworI2lmZGVmIF9MSUJDCisgIGlmIChjYXRlZ29yeSA8IDAgfHwgY2F0ZWdvcnkgPj0gX19MQ19MQVNUIHx8IGNhdGVnb3J5ID09IExDX0FMTCkKKyAgICAvKiBCb2d1cy4gICovCisgICAgcmV0dXJuIChwbHVyYWwgPT0gMAorCSAgICA/IChjaGFyICopIG1zZ2lkMQorCSAgICAvKiBVc2UgdGhlIEdlcm1hbmljIHBsdXJhbCBydWxlLiAgKi8KKwkgICAgOiBuID09IDEgPyAoY2hhciAqKSBtc2dpZDEgOiAoY2hhciAqKSBtc2dpZDIpOworI2VuZGlmCisKKyAgX19saWJjX3J3bG9ja19yZGxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICAvKiBJZiBET01BSU5OQU1FIGlzIE5VTEwsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZWZhdWx0IGRvbWFpbi4gIElmCisgICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQorICAgICBkZWZpbml0aW9uIGxlZnQgdGhpcyB1bmRlZmluZWQuICAqLworICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQorICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKworICAvKiBPUy8yIHNwZWNpZmljOiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgbGliaW50bCB2ZXJzaW9ucyAgKi8KKyNpZmRlZiBMQ19NRVNTQUdFU19DT01QQVQKKyAgaWYgKGNhdGVnb3J5ID09IExDX01FU1NBR0VTX0NPTVBBVCkKKyAgICBjYXRlZ29yeSA9IExDX01FU1NBR0VTOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhBVkVfVFNFQVJDSCB8fCBkZWZpbmVkIF9MSUJDCisgIG1zZ2lkX2xlbiA9IHN0cmxlbiAobXNnaWQxKSArIDE7CisKKyAgLyogVHJ5IHRvIGZpbmQgdGhlIHRyYW5zbGF0aW9uIGFtb25nIHRob3NlIHdoaWNoIHdlIGZvdW5kIGF0CisgICAgIHNvbWUgdGltZS4gICovCisgIHNlYXJjaCA9IChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKQorCSAgIGFsbG9jYSAob2Zmc2V0b2YgKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90LCBtc2dpZCkgKyBtc2dpZF9sZW4pOworICBtZW1jcHkgKHNlYXJjaC0+bXNnaWQsIG1zZ2lkMSwgbXNnaWRfbGVuKTsKKyAgc2VhcmNoLT5kb21haW5uYW1lID0gKGNoYXIgKikgZG9tYWlubmFtZTsKKyAgc2VhcmNoLT5jYXRlZ29yeSA9IGNhdGVnb3J5OworCisgIGZvdW5kcCA9IChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKikgdGZpbmQgKHNlYXJjaCwgJnJvb3QsIHRyYW5zY21wKTsKKyAgZnJlZWEgKHNlYXJjaCk7CisgIGlmIChmb3VuZHAgIT0gTlVMTCAmJiAoKmZvdW5kcCktPmNvdW50ZXIgPT0gX25sX21zZ19jYXRfY250cikKKyAgICB7CisgICAgICAvKiBOb3cgZGVhbCB3aXRoIHBsdXJhbC4gICovCisgICAgICBpZiAocGx1cmFsKQorCXJldHZhbCA9IHBsdXJhbF9sb29rdXAgKCgqZm91bmRwKS0+ZG9tYWluLCBuLCAoKmZvdW5kcCktPnRyYW5zbGF0aW9uLAorCQkJCSgqZm91bmRwKS0+dHJhbnNsYXRpb25fbGVuZ3RoKTsKKyAgICAgIGVsc2UKKwlyZXR2YWwgPSAoY2hhciAqKSAoKmZvdW5kcCktPnRyYW5zbGF0aW9uOworCisgICAgICBfX2xpYmNfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisjZW5kaWYKKworICAvKiBQcmVzZXJ2ZSB0aGUgYGVycm5vJyB2YWx1ZS4gICovCisgIHNhdmVkX2Vycm5vID0gZXJybm87CisKKyAgLyogU2VlIHdoZXRoZXIgdGhpcyBpcyBhIFNVSUQgYmluYXJ5IG9yIG5vdC4gICovCisgIERFVEVSTUlORV9TRUNVUkU7CisKKyAgLyogRmlyc3QgZmluZCBtYXRjaGluZyBiaW5kaW5nLiAgKi8KKyAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7CisgICAgICBpZiAoY29tcGFyZSA9PSAwKQorCS8qIFdlIGZvdW5kIGl0ISAgKi8KKwlicmVhazsKKyAgICAgIGlmIChjb21wYXJlIDwgMCkKKwl7CisJICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLworCSAgYmluZGluZyA9IE5VTEw7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChiaW5kaW5nID09IE5VTEwpCisgICAgZGlybmFtZSA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKyAgZWxzZSBpZiAoSVNfQUJTT0xVVEVfUEFUSCAoYmluZGluZy0+ZGlybmFtZSkpCisgICAgZGlybmFtZSA9IGJpbmRpbmctPmRpcm5hbWU7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGEgcmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUgbm93LiAgKi8KKyAgICAgIHNpemVfdCBkaXJuYW1lX2xlbiA9IHN0cmxlbiAoYmluZGluZy0+ZGlybmFtZSkgKyAxOworICAgICAgc2l6ZV90IHBhdGhfbWF4OworICAgICAgY2hhciAqcmV0OworCisgICAgICBwYXRoX21heCA9ICh1bnNpZ25lZCBpbnQpIFBBVEhfTUFYOworICAgICAgcGF0aF9tYXggKz0gMjsJCS8qIFRoZSBnZXRjd2QgZG9jcyBzYXkgdG8gZG8gdGhpcy4gICovCisKKyAgICAgIGZvciAoOzspCisJeworCSAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7CisJICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGRpcm5hbWUpOworCisJICBfX3NldF9lcnJubyAoMCk7CisJICByZXQgPSBnZXRjd2QgKGRpcm5hbWUsIHBhdGhfbWF4KTsKKwkgIGlmIChyZXQgIT0gTlVMTCB8fCBlcnJubyAhPSBFUkFOR0UpCisJICAgIGJyZWFrOworCisJICBwYXRoX21heCArPSBwYXRoX21heCAvIDI7CisJICBwYXRoX21heCArPSBQQVRIX0lOQ1I7CisJfQorCisgICAgICBpZiAocmV0ID09IE5VTEwpCisJLyogV2UgY2Fubm90IGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIERvbid0IHNpZ25hbCBhbgorCSAgIGVycm9yIGJ1dCBzaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZy4gICovCisJZ290byByZXR1cm5fdW50cmFuc2xhdGVkOworCisgICAgICBzdHBjcHkgKHN0cGNweSAoc3RyY2hyIChkaXJuYW1lLCAnXDAnKSwgIi8iKSwgYmluZGluZy0+ZGlybmFtZSk7CisgICAgfQorCisgIC8qIE5vdyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG5hbWUgb2YgQ0FURUdPUlkgYW5kIGl0cyB2YWx1ZS4gICovCisgIGNhdGVnb3J5bmFtZSA9IGNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KTsKKyAgY2F0ZWdvcnl2YWx1ZSA9IGd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKKworICBkb21haW5uYW1lX2xlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSk7CisgIHhkb21haW5uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5bmFtZSkKKwkJCQkgKyBkb21haW5uYW1lX2xlbiArIDUpOworICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKKworICBzdHBjcHkgKG1lbXBjcHkgKHN0cGNweSAoc3RwY3B5ICh4ZG9tYWlubmFtZSwgY2F0ZWdvcnluYW1lKSwgIi8iKSwKKwkJICBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiksCisJICAiLm1vIik7CisKKyAgLyogQ3JlYXRpbmcgd29ya2luZyBhcmVhLiAgKi8KKyAgc2luZ2xlX2xvY2FsZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeXZhbHVlKSArIDEpOworICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHNpbmdsZV9sb2NhbGUpOworCisKKyAgLyogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhpcyBpcyBhIGxvb3AgYmVjYXVzZSB3ZSBwZXJoYXBzCisgICAgIGdvdCBhbiBvcmRlcmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIGNvbnNpZGVyIGZvciB0aGUgdHJhbnNsYXRpb24uICAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCisgICAgICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gPT0gJzonKQorCSsrY2F0ZWdvcnl2YWx1ZTsKKyAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCisJeworCSAgLyogVGhlIHdob2xlIGNvbnRlbnRzIG9mIENBVEVHT1JZVkFMVUUgaGFzIGJlZW4gc2VhcmNoZWQgYnV0CisJICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCisJICAgICBieSBpbXBsaWNpdGx5IGFwcGVuZGluZyBhICJDIiBlbnRyeSwgaS5lLiBubyB0cmFuc2xhdGlvbgorCSAgICAgd2lsbCB0YWtlIHBsYWNlLiAgKi8KKwkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7CisJICBzaW5nbGVfbG9jYWxlWzFdID0gJ1wwJzsKKwl9CisgICAgICBlbHNlCisJeworCSAgY2hhciAqY3AgPSBzaW5nbGVfbG9jYWxlOworCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKKwkgICAgKmNwKysgPSAqY2F0ZWdvcnl2YWx1ZSsrOworCSAgKmNwID0gJ1wwJzsKKworCSAgLyogV2hlbiB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgd2UgbXVzdCBub3QgYWxsb3cgYWNjZXNzaW5nIGZpbGVzCisJICAgICBvdXRzaWRlIHRoZSBkZWRpY2F0ZWQgZGlyZWN0b3JpZXMuICAqLworCSAgaWYgKEVOQUJMRV9TRUNVUkUgJiYgSVNfUEFUSF9XSVRIX0RJUiAoc2luZ2xlX2xvY2FsZSkpCisJICAgIC8qIEluZ29yZSB0aGlzIGVudHJ5LiAgKi8KKwkgICAgY29udGludWU7CisJfQorCisgICAgICAvKiBJZiB0aGUgY3VycmVudCBsb2NhbGUgdmFsdWUgaXMgQyAob3IgUE9TSVgpIHdlIGRvbid0IGxvYWQgYQorCSBkb21haW4uICBSZXR1cm4gdGhlIE1TR0lELiAgKi8KKyAgICAgIGlmIChzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJDIikgPT0gMAorCSAgfHwgc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiUE9TSVgiKSA9PSAwKQorCWJyZWFrOworCisgICAgICAvKiBGaW5kIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgbWF0Y2hpbmcgdGhlCisJIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KKyAgICAgIGRvbWFpbiA9IF9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgc2luZ2xlX2xvY2FsZSwgeGRvbWFpbm5hbWUsIGJpbmRpbmcpOworCisgICAgICBpZiAoZG9tYWluICE9IE5VTEwpCisJeworCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4sIGJpbmRpbmcsIG1zZ2lkMSwgJnJldGxlbik7CisKKwkgIGlmIChyZXR2YWwgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGludCBjbnQ7CisKKwkgICAgICBmb3IgKGNudCA9IDA7IGRvbWFpbi0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCisJCXsKKwkJICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbi0+c3VjY2Vzc29yW2NudF0sIGJpbmRpbmcsCisJCQkJCSBtc2dpZDEsICZyZXRsZW4pOworCisJCSAgaWYgKHJldHZhbCAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBkb21haW4gPSBkb21haW4tPnN1Y2Nlc3NvcltjbnRdOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIGlmIChyZXR2YWwgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIEZvdW5kIHRoZSB0cmFuc2xhdGlvbiBvZiBNU0dJRDEgaW4gZG9tYWluIERPTUFJTjoKKwkJIHN0YXJ0aW5nIGF0IFJFVFZBTCwgUkVUTEVOIGJ5dGVzLiAgKi8KKwkgICAgICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CisjaWYgZGVmaW5lZCBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQworCSAgICAgIGlmIChmb3VuZHAgPT0gTlVMTCkKKwkJeworCQkgIC8qIENyZWF0ZSBhIG5ldyBlbnRyeSBhbmQgYWRkIGl0IHRvIHRoZSBzZWFyY2ggdHJlZS4gICovCisJCSAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKm5ld3A7CisKKwkJICBuZXdwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopCisJCSAgICBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCwgbXNnaWQpCisJCQkgICAgKyBtc2dpZF9sZW4gKyBkb21haW5uYW1lX2xlbiArIDEpOworCQkgIGlmIChuZXdwICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIG5ld3AtPmRvbWFpbm5hbWUgPQorCQkJbWVtcGNweSAobmV3cC0+bXNnaWQsIG1zZ2lkMSwgbXNnaWRfbGVuKTsKKwkJICAgICAgbWVtY3B5IChuZXdwLT5kb21haW5uYW1lLCBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiArIDEpOworCQkgICAgICBuZXdwLT5jYXRlZ29yeSA9IGNhdGVnb3J5OworCQkgICAgICBuZXdwLT5jb3VudGVyID0gX25sX21zZ19jYXRfY250cjsKKwkJICAgICAgbmV3cC0+ZG9tYWluID0gZG9tYWluOworCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbiA9IHJldHZhbDsKKwkJICAgICAgbmV3cC0+dHJhbnNsYXRpb25fbGVuZ3RoID0gcmV0bGVuOworCisJCSAgICAgIC8qIEluc2VydCB0aGUgZW50cnkgaW4gdGhlIHNlYXJjaCB0cmVlLiAgKi8KKwkJICAgICAgZm91bmRwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqKQorCQkJdHNlYXJjaCAobmV3cCwgJnJvb3QsIHRyYW5zY21wKTsKKwkJICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMCisJCQkgIHx8IF9fYnVpbHRpbl9leHBlY3QgKCpmb3VuZHAgIT0gbmV3cCwgMCkpCisJCQkvKiBUaGUgaW5zZXJ0IGZhaWxlZC4gICovCisJCQlmcmVlIChuZXdwKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFdlIGNhbiB1cGRhdGUgdGhlIGV4aXN0aW5nIGVudHJ5LiAgKi8KKwkJICAoKmZvdW5kcCktPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOworCQkgICgqZm91bmRwKS0+ZG9tYWluID0gZG9tYWluOworCQkgICgqZm91bmRwKS0+dHJhbnNsYXRpb24gPSByZXR2YWw7CisJCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47CisJCX0KKyNlbmRpZgorCSAgICAgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7CisKKwkgICAgICAvKiBOb3cgZGVhbCB3aXRoIHBsdXJhbC4gICovCisJICAgICAgaWYgKHBsdXJhbCkKKwkJcmV0dmFsID0gcGx1cmFsX2xvb2t1cCAoZG9tYWluLCBuLCByZXR2YWwsIHJldGxlbik7CisKKwkgICAgICBfX2xpYmNfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOworCSAgICAgIHJldHVybiByZXR2YWw7CisJICAgIH0KKwl9CisgICAgfQorCisgcmV0dXJuX3VudHJhbnNsYXRlZDoKKyAgLyogUmV0dXJuIHRoZSB1bnRyYW5zbGF0ZWQgTVNHSUQuICAqLworICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CisgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7CisjaWZuZGVmIF9MSUJDCisgIGlmICghRU5BQkxFX1NFQ1VSRSkKKyAgICB7CisgICAgICBleHRlcm4gdm9pZCBfbmxfbG9nX3VudHJhbnNsYXRlZCAoY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsCisJCQkJCWNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJCQkJCWNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLAorCQkJCQlpbnQgcGx1cmFsKTsKKyAgICAgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lID0gZ2V0ZW52ICgiR0VUVEVYVF9MT0dfVU5UUkFOU0xBVEVEIik7CisKKyAgICAgIGlmIChsb2dmaWxlbmFtZSAhPSBOVUxMICYmIGxvZ2ZpbGVuYW1lWzBdICE9ICdcMCcpCisJX25sX2xvZ191bnRyYW5zbGF0ZWQgKGxvZ2ZpbGVuYW1lLCBkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgcGx1cmFsKTsKKyAgICB9CisjZW5kaWYKKyAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKyAgcmV0dXJuIChwbHVyYWwgPT0gMAorCSAgPyAoY2hhciAqKSBtc2dpZDEKKwkgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLworCSAgOiBuID09IDEgPyAoY2hhciAqKSBtc2dpZDEgOiAoY2hhciAqKSBtc2dpZDIpOworfQorCisKK2NoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF9maW5kX21zZyAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCisJICAgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcsIGNvbnN0IGNoYXIgKm1zZ2lkLAorCSAgICAgIHNpemVfdCAqbGVuZ3RocCkKK3sKKyAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKKyAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKyAgc2l6ZV90IGFjdDsKKyAgY2hhciAqcmVzdWx0OworICBzaXplX3QgcmVzdWx0bGVuOworCisgIGlmIChkb21haW5fZmlsZS0+ZGVjaWRlZCA9PSAwKQorICAgIF9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcpOworCisgIGlmIChkb21haW5fZmlsZS0+ZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKKworICBuc3RyaW5ncyA9IGRvbWFpbi0+bnN0cmluZ3M7CisKKyAgLyogTG9jYXRlIHRoZSBNU0dJRCBhbmQgaXRzIHRyYW5zbGF0aW9uLiAgKi8KKyAgaWYgKGRvbWFpbi0+aGFzaF90YWIgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBVc2UgdGhlIGhhc2hpbmcgdGFibGUuICAqLworICAgICAgbmxzX3VpbnQzMiBsZW4gPSBzdHJsZW4gKG1zZ2lkKTsKKyAgICAgIG5sc191aW50MzIgaGFzaF92YWwgPSBoYXNoX3N0cmluZyAobXNnaWQpOworICAgICAgbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOworICAgICAgbmxzX3VpbnQzMiBpbmNyID0gMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKKworICAgICAgd2hpbGUgKDEpCisJeworCSAgbmxzX3VpbnQzMiBuc3RyID0KKwkgICAgVyAoZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7CisKKwkgIGlmIChuc3RyID09IDApCisJICAgIC8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLworCSAgICByZXR1cm4gTlVMTDsKKworCSAgbnN0ci0tOworCisJICAvKiBDb21wYXJlIG1zZ2lkIHdpdGggdGhlIG9yaWdpbmFsIHN0cmluZyBhdCBpbmRleCBuc3RyLgorCSAgICAgV2UgY29tcGFyZSB0aGUgbGVuZ3RocyB3aXRoID49LCBub3QgPT0sIGJlY2F1c2UgcGx1cmFsIGVudHJpZXMKKwkgICAgIGFyZSByZXByZXNlbnRlZCBieSBzdHJpbmdzIHdpdGggYW4gZW1iZWRkZWQgTlVMLiAgKi8KKwkgIGlmIChuc3RyIDwgbnN0cmluZ3MKKwkgICAgICA/IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHJdLmxlbmd0aCkgPj0gbGVuCisJCSYmIChzdHJjbXAgKG1zZ2lkLAorCQkJICAgIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorCQkJCQkgICAgICBkb21haW4tPm9yaWdfdGFiW25zdHJdLm9mZnNldCkpCisJCSAgICA9PSAwKQorCSAgICAgIDogZG9tYWluLT5vcmlnX3N5c2RlcF90YWJbbnN0ciAtIG5zdHJpbmdzXS5sZW5ndGggPiBsZW4KKwkJJiYgKHN0cmNtcCAobXNnaWQsCisJCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWJbbnN0ciAtIG5zdHJpbmdzXS5wb2ludGVyKQorCQkgICAgPT0gMCkpCisJICAgIHsKKwkgICAgICBhY3QgPSBuc3RyOworCSAgICAgIGdvdG8gZm91bmQ7CisJICAgIH0KKworCSAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCisJICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7CisJICBlbHNlCisJICAgIGlkeCArPSBpbmNyOworCX0KKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUcnkgdGhlIGRlZmF1bHQgbWV0aG9kOiAgYmluYXJ5IHNlYXJjaCBpbiB0aGUgc29ydGVkIGFycmF5IG9mCisJIG1lc3NhZ2VzLiAgKi8KKyAgICAgIHNpemVfdCB0b3AsIGJvdHRvbTsKKworICAgICAgYm90dG9tID0gMDsKKyAgICAgIHRvcCA9IG5zdHJpbmdzOworICAgICAgd2hpbGUgKGJvdHRvbSA8IHRvcCkKKwl7CisJICBpbnQgY21wX3ZhbDsKKworCSAgYWN0ID0gKGJvdHRvbSArIHRvcCkgLyAyOworCSAgY21wX3ZhbCA9IHN0cmNtcCAobXNnaWQsIChkb21haW4tPmRhdGEKKwkJCQkgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQkJIGRvbWFpbi0+b3JpZ190YWJbYWN0XS5vZmZzZXQpKSk7CisJICBpZiAoY21wX3ZhbCA8IDApCisJICAgIHRvcCA9IGFjdDsKKwkgIGVsc2UgaWYgKGNtcF92YWwgPiAwKQorCSAgICBib3R0b20gPSBhY3QgKyAxOworCSAgZWxzZQorCSAgICBnb3RvIGZvdW5kOworCX0KKyAgICAgIC8qIE5vIHRyYW5zbGF0aW9uIHdhcyBmb3VuZC4gICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyBmb3VuZDoKKyAgLyogVGhlIHRyYW5zbGF0aW9uIHdhcyBmb3VuZCBhdCBpbmRleCBBQ1QuICBJZiB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlCisgICAgIHN0cmluZyB0byB1c2UgYSBkaWZmZXJlbnQgY2hhcmFjdGVyIHNldCwgdGhpcyBpcyB0aGUgdGltZS4gICovCisgIGlmIChhY3QgPCBuc3RyaW5ncykKKyAgICB7CisgICAgICByZXN1bHQgPSAoY2hhciAqKQorCShkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbYWN0XS5vZmZzZXQpKTsKKyAgICAgIHJlc3VsdGxlbiA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYlthY3RdLmxlbmd0aCkgKyAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlc3VsdCA9IChjaGFyICopIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYlthY3QgLSBuc3RyaW5nc10ucG9pbnRlcjsKKyAgICAgIHJlc3VsdGxlbiA9IGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYlthY3QgLSBuc3RyaW5nc10ubGVuZ3RoOworICAgIH0KKworI2lmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVgorICBpZiAoZG9tYWluLT5jb2Rlc2V0X2NudHIKKyAgICAgICE9IChkb21haW5iaW5kaW5nICE9IE5VTEwgPyBkb21haW5iaW5kaW5nLT5jb2Rlc2V0X2NudHIgOiAwKSkKKyAgICB7CisgICAgICAvKiBUaGUgZG9tYWluJ3MgY29kZXNldCBoYXMgY2hhbmdlZCB0aHJvdWdoIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkKKwkgc2luY2UgdGhlIG1lc3NhZ2UgY2F0YWxvZyB3YXMgaW5pdGlhbGl6ZWQgb3IgbGFzdCBhY2Nlc3NlZC4gIFdlCisJIGhhdmUgdG8gcmVpbml0aWFsaXplIHRoZSBjb252ZXJ0ZXIuICAqLworICAgICAgX25sX2ZyZWVfZG9tYWluX2NvbnYgKGRvbWFpbik7CisgICAgICBfbmxfaW5pdF9kb21haW5fY29udiAoZG9tYWluX2ZpbGUsIGRvbWFpbiwgZG9tYWluYmluZGluZyk7CisgICAgfQorCisgIGlmICgKKyMgaWZkZWYgX0xJQkMKKyAgICAgIGRvbWFpbi0+Y29udiAhPSAoX19nY29udl90KSAtMQorIyBlbHNlCisjICBpZiBIQVZFX0lDT05WCisgICAgICBkb21haW4tPmNvbnYgIT0gKGljb252X3QpIC0xCisjICBlbmRpZgorIyBlbmRpZgorICAgICAgKQorICAgIHsKKyAgICAgIC8qIFdlIGFyZSBzdXBwb3NlZCB0byBkbyBhIGNvbnZlcnNpb24uICBGaXJzdCBhbGxvY2F0ZSBhbgorCSBhcHByb3ByaWF0ZSB0YWJsZSB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgdGFibGUKKwkgb2YgdHJhbnNsYXRpb25zIGluIHRoZSBmaWxlLCB3aGVyZSB3ZSBjYW4gcHV0IHRoZSBwb2ludGVycworCSB0byB0aGUgY29udmVydGVkIHN0cmluZ3MgaW4uCisJIFRoZXJlIGlzIGEgc2xpZ2h0IGNvbXBsaWNhdGlvbiB3aXRoIHBsdXJhbCBlbnRyaWVzLiAgVGhleQorCSBhcmUgcmVwcmVzZW50ZWQgYnkgY29uc2VjdXRpdmUgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncy4gIFdlCisJIGhhbmRsZSB0aGlzIGNhc2UgYnkgY29udmVydGluZyBSRVNVTFRMRU4gYnl0ZXMsIGluY2x1ZGluZworCSBOVUxzLiAgKi8KKworICAgICAgaWYgKGRvbWFpbi0+Y29udl90YWIgPT0gTlVMTAorCSAgJiYgKChkb21haW4tPmNvbnZfdGFiID0KKwkJIChjaGFyICoqKSBjYWxsb2MgKG5zdHJpbmdzICsgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzLAorCQkJCSAgIHNpemVvZiAoY2hhciAqKSkpCisJICAgICAgPT0gTlVMTCkpCisJLyogTWFyayB0aGF0IHdlIGRpZG4ndCBzdWNjZWVkIGFsbG9jYXRpbmcgYSB0YWJsZS4gICovCisJZG9tYWluLT5jb252X3RhYiA9IChjaGFyICoqKSAtMTsKKworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRvbWFpbi0+Y29udl90YWIgPT0gKGNoYXIgKiopIC0xLCAwKSkKKwkvKiBOb3RoaW5nIHdlIGNhbiBkbywgbm8gbW9yZSBtZW1vcnkuICAqLworCWdvdG8gY29udmVydGVkOworCisgICAgICBpZiAoZG9tYWluLT5jb252X3RhYlthY3RdID09IE5VTEwpCisJeworCSAgLyogV2UgaGF2ZW4ndCB1c2VkIHRoaXMgc3RyaW5nIHNvIGZhciwgc28gaXQgaXMgbm90CisJICAgICB0cmFuc2xhdGVkIHlldC4gIERvIHRoaXMgbm93LiAgKi8KKwkgIC8qIFdlIHVzZSBhIGJpdCBtb3JlIGVmZmljaWVudCBtZW1vcnkgaGFuZGxpbmcuCisJICAgICBXZSBhbGxvY2F0ZSBhbHdheXMgbGFyZ2VyIGJsb2NrcyB3aGljaCBnZXQgdXNlZCBvdmVyCisJICAgICB0aW1lLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBtYW55IHNtYWxsIGFsbG9jYXRpb25zLiAgICovCisJICBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jaykKKyMgZGVmaW5lIElOSVRJQUxfQkxPQ0tfU0laRQk0MDgwCisJICBzdGF0aWMgdW5zaWduZWQgY2hhciAqZnJlZW1lbTsKKwkgIHN0YXRpYyBzaXplX3QgZnJlZW1lbV9zaXplOworCisJICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmJ1ZjsKKwkgIHVuc2lnbmVkIGNoYXIgKm91dGJ1ZjsKKwkgIGludCBtYWxsb2NfY291bnQ7CisjIGlmbmRlZiBfTElCQworCSAgdHJhbnNtZW1fYmxvY2tfdCAqdHJhbnNtZW1fbGlzdCA9IE5VTEw7CisjIGVuZGlmCisKKwkgIF9fbGliY19sb2NrX2xvY2sgKGxvY2spOworCisJICBpbmJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJlc3VsdDsKKwkgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7CisKKwkgIG1hbGxvY19jb3VudCA9IDA7CisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIHRyYW5zbWVtX2Jsb2NrX3QgKm5ld21lbTsKKyMgaWZkZWYgX0xJQkMKKwkgICAgICBzaXplX3Qgbm9uX3JldmVyc2libGU7CisJICAgICAgaW50IHJlczsKKworCSAgICAgIGlmIChmcmVlbWVtX3NpemUgPCBzaXplb2YgKHNpemVfdCkpCisJCWdvdG8gcmVzaXplX2ZyZWVtZW07CisKKwkgICAgICByZXMgPSBfX2djb252IChkb21haW4tPmNvbnYsCisJCQkgICAgICZpbmJ1ZiwgaW5idWYgKyByZXN1bHRsZW4sCisJCQkgICAgICZvdXRidWYsCisJCQkgICAgIG91dGJ1ZiArIGZyZWVtZW1fc2l6ZSAtIHNpemVvZiAoc2l6ZV90KSwKKwkJCSAgICAgJm5vbl9yZXZlcnNpYmxlKTsKKworCSAgICAgIGlmIChyZXMgPT0gX19HQ09OVl9PSyB8fCByZXMgPT0gX19HQ09OVl9FTVBUWV9JTlBVVCkKKwkJYnJlYWs7CisKKwkgICAgICBpZiAocmVzICE9IF9fR0NPTlZfRlVMTF9PVVRQVVQpCisJCXsKKwkJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworCQkgIGdvdG8gY29udmVydGVkOworCQl9CisKKwkgICAgICBpbmJ1ZiA9IHJlc3VsdDsKKyMgZWxzZQorIyAgaWYgSEFWRV9JQ09OVgorCSAgICAgIGNvbnN0IGNoYXIgKmlucHRyID0gKGNvbnN0IGNoYXIgKikgaW5idWY7CisJICAgICAgc2l6ZV90IGlubGVmdCA9IHJlc3VsdGxlbjsKKwkgICAgICBjaGFyICpvdXRwdHIgPSAoY2hhciAqKSBvdXRidWY7CisJICAgICAgc2l6ZV90IG91dGxlZnQ7CisKKwkgICAgICBpZiAoZnJlZW1lbV9zaXplIDwgc2l6ZW9mIChzaXplX3QpKQorCQlnb3RvIHJlc2l6ZV9mcmVlbWVtOworCisJICAgICAgb3V0bGVmdCA9IGZyZWVtZW1fc2l6ZSAtIHNpemVvZiAoc2l6ZV90KTsKKwkgICAgICBpZiAoaWNvbnYgKGRvbWFpbi0+Y29udiwKKwkJCSAoSUNPTlZfQ09OU1QgY2hhciAqKikgJmlucHRyLCAmaW5sZWZ0LAorCQkJICZvdXRwdHIsICZvdXRsZWZ0KQorCQkgICE9IChzaXplX3QpICgtMSkpCisJCXsKKwkJICBvdXRidWYgPSAodW5zaWduZWQgY2hhciAqKSBvdXRwdHI7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBpZiAoZXJybm8gIT0gRTJCSUcpCisJCXsKKwkJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworCQkgIGdvdG8gY29udmVydGVkOworCQl9CisjICBlbmRpZgorIyBlbmRpZgorCisJICAgIHJlc2l6ZV9mcmVlbWVtOgorCSAgICAgIC8qIFdlIG11c3QgYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9yIHJlc2l6ZSB0aGUgb2xkIG9uZS4gICovCisJICAgICAgaWYgKG1hbGxvY19jb3VudCA+IDApCisJCXsKKwkJICArK21hbGxvY19jb3VudDsKKwkJICBmcmVlbWVtX3NpemUgPSBtYWxsb2NfY291bnQgKiBJTklUSUFMX0JMT0NLX1NJWkU7CisJCSAgbmV3bWVtID0gKHRyYW5zbWVtX2Jsb2NrX3QgKikgcmVhbGxvYyAodHJhbnNtZW1fbGlzdCwKKwkJCQkJCQkgZnJlZW1lbV9zaXplKTsKKyMgaWZkZWYgX0xJQkMKKwkJICBpZiAobmV3bWVtICE9IE5VTEwpCisJCSAgICB0cmFuc21lbV9saXN0ID0gdHJhbnNtZW1fbGlzdC0+bmV4dDsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHN0cnVjdCB0cmFuc21lbV9saXN0ICpvbGQgPSB0cmFuc21lbV9saXN0OworCisJCSAgICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OworCQkgICAgICBmcmVlIChvbGQpOworCQkgICAgfQorIyBlbmRpZgorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgbWFsbG9jX2NvdW50ID0gMTsKKwkJICBmcmVlbWVtX3NpemUgPSBJTklUSUFMX0JMT0NLX1NJWkU7CisJCSAgbmV3bWVtID0gKHRyYW5zbWVtX2Jsb2NrX3QgKikgbWFsbG9jIChmcmVlbWVtX3NpemUpOworCQl9CisJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKG5ld21lbSA9PSBOVUxMLCAwKSkKKwkJeworCQkgIGZyZWVtZW0gPSBOVUxMOworCQkgIGZyZWVtZW1fc2l6ZSA9IDA7CisJCSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKKwkJICBnb3RvIGNvbnZlcnRlZDsKKwkJfQorCisjIGlmZGVmIF9MSUJDCisJICAgICAgLyogQWRkIHRoZSBibG9jayB0byB0aGUgbGlzdCBvZiBibG9ja3Mgd2UgaGF2ZSB0byBmcmVlCisgICAgICAgICAgICAgICAgIGF0IHNvbWUgcG9pbnQuICAqLworCSAgICAgIG5ld21lbS0+bmV4dCA9IHRyYW5zbWVtX2xpc3Q7CisJICAgICAgdHJhbnNtZW1fbGlzdCA9IG5ld21lbTsKKworCSAgICAgIGZyZWVtZW0gPSBuZXdtZW0tPmRhdGE7CisJICAgICAgZnJlZW1lbV9zaXplIC09IG9mZnNldG9mIChzdHJ1Y3QgdHJhbnNtZW1fbGlzdCwgZGF0YSk7CisjIGVsc2UKKwkgICAgICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOworCSAgICAgIGZyZWVtZW0gPSBuZXdtZW07CisjIGVuZGlmCisKKwkgICAgICBvdXRidWYgPSBmcmVlbWVtICsgc2l6ZW9mIChzaXplX3QpOworCSAgICB9CisKKwkgIC8qIFdlIGhhdmUgbm93IGluIG91ciBidWZmZXIgYSBjb252ZXJ0ZWQgc3RyaW5nLiAgUHV0IHRoaXMKKwkgICAgIGludG8gdGhlIHRhYmxlIG9mIGNvbnZlcnNpb25zLiAgKi8KKwkgICooc2l6ZV90ICopIGZyZWVtZW0gPSBvdXRidWYgLSBmcmVlbWVtIC0gc2l6ZW9mIChzaXplX3QpOworCSAgZG9tYWluLT5jb252X3RhYlthY3RdID0gKGNoYXIgKikgZnJlZW1lbTsKKwkgIC8qIFNocmluayBmcmVlbWVtLCBidXQga2VlcCBpdCBhbGlnbmVkLiAgKi8KKwkgIGZyZWVtZW1fc2l6ZSAtPSBvdXRidWYgLSBmcmVlbWVtOworCSAgZnJlZW1lbSA9IG91dGJ1ZjsKKwkgIGZyZWVtZW0gKz0gZnJlZW1lbV9zaXplICYgKGFsaWdub2YgKHNpemVfdCkgLSAxKTsKKwkgIGZyZWVtZW1fc2l6ZSA9IGZyZWVtZW1fc2l6ZSAmIH4gKGFsaWdub2YgKHNpemVfdCkgLSAxKTsKKworCSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKKwl9CisKKyAgICAgIC8qIE5vdyBkb21haW4tPmNvbnZfdGFiW2FjdF0gY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIG9mIGFsbAorCSB0aGUgcGx1cmFsIHZhcmlhbnRzLiAgKi8KKyAgICAgIHJlc3VsdCA9IGRvbWFpbi0+Y29udl90YWJbYWN0XSArIHNpemVvZiAoc2l6ZV90KTsKKyAgICAgIHJlc3VsdGxlbiA9ICooc2l6ZV90ICopIGRvbWFpbi0+Y29udl90YWJbYWN0XTsKKyAgICB9CisKKyBjb252ZXJ0ZWQ6CisgIC8qIFRoZSByZXN1bHQgc3RyaW5nIGlzIGNvbnZlcnRlZC4gICovCisKKyNlbmRpZiAvKiBfTElCQyB8fCBIQVZFX0lDT05WICovCisKKyAgKmxlbmd0aHAgPSByZXN1bHRsZW47CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogTG9vayB1cCBhIHBsdXJhbCB2YXJpYW50LiAgKi8KK3N0YXRpYyBjaGFyICoKK2ludGVybmFsX2Z1bmN0aW9uCitwbHVyYWxfbG9va3VwIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW50IG4sCisJICAgICAgIGNvbnN0IGNoYXIgKnRyYW5zbGF0aW9uLCBzaXplX3QgdHJhbnNsYXRpb25fbGVuKQoreworICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluZGF0YSA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW4tPmRhdGE7CisgIHVuc2lnbmVkIGxvbmcgaW50IGluZGV4OworICBjb25zdCBjaGFyICpwOworCisgIGluZGV4ID0gcGx1cmFsX2V2YWwgKGRvbWFpbmRhdGEtPnBsdXJhbCwgbik7CisgIGlmIChpbmRleCA+PSBkb21haW5kYXRhLT5ucGx1cmFscykKKyAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBJdCBtZWFucyB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYW5kIHRoZQorICAgICAgIGdpdmVuIG1heGltdW0gdmFsdWUgZG8gbm90IG1hdGNoLiAgKi8KKyAgICBpbmRleCA9IDA7CisKKyAgLyogU2tpcCBJTkRFWCBzdHJpbmdzIGF0IFRSQU5TTEFUSU9OLiAgKi8KKyAgcCA9IHRyYW5zbGF0aW9uOworICB3aGlsZSAoaW5kZXgtLSA+IDApCisgICAgeworI2lmZGVmIF9MSUJDCisgICAgICBwID0gX19yYXdtZW1jaHIgKHAsICdcMCcpOworI2Vsc2UKKyAgICAgIHAgPSBzdHJjaHIgKHAsICdcMCcpOworI2VuZGlmCisgICAgICAvKiBBbmQgc2tpcCBvdmVyIHRoZSBOVUwgYnl0ZS4gICovCisgICAgICBwKys7CisKKyAgICAgIGlmIChwID49IHRyYW5zbGF0aW9uICsgdHJhbnNsYXRpb25fbGVuKQorCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbgorCSAgIGV2YWx1YXRlZCB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdmFyaWFudHMKKwkgICBhdmFpbGFibGUgZm9yIE1TR0lEMS4gICovCisJcmV0dXJuIChjaGFyICopIHRyYW5zbGF0aW9uOworICAgIH0KKyAgcmV0dXJuIChjaGFyICopIHA7Cit9CisKKyNpZm5kZWYgX0xJQkMKKy8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbG9jYWxlIENBVEVHT1JZLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2ludGVybmFsX2Z1bmN0aW9uCitjYXRlZ29yeV90b19uYW1lIChpbnQgY2F0ZWdvcnkpCit7CisgIGNvbnN0IGNoYXIgKnJldHZhbDsKKworICBzd2l0Y2ggKGNhdGVnb3J5KQorICB7CisjaWZkZWYgTENfQ09MTEFURQorICBjYXNlIExDX0NPTExBVEU6CisgICAgcmV0dmFsID0gIkxDX0NPTExBVEUiOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgTENfQ1RZUEUKKyAgY2FzZSBMQ19DVFlQRToKKyAgICByZXR2YWwgPSAiTENfQ1RZUEUiOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgTENfTU9ORVRBUlkKKyAgY2FzZSBMQ19NT05FVEFSWToKKyAgICByZXR2YWwgPSAiTENfTU9ORVRBUlkiOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgTENfTlVNRVJJQworICBjYXNlIExDX05VTUVSSUM6CisgICAgcmV0dmFsID0gIkxDX05VTUVSSUMiOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgTENfVElNRQorICBjYXNlIExDX1RJTUU6CisgICAgcmV0dmFsID0gIkxDX1RJTUUiOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgTENfTUVTU0FHRVMKKyAgY2FzZSBMQ19NRVNTQUdFUzoKKyAgICByZXR2YWwgPSAiTENfTUVTU0FHRVMiOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgTENfUkVTUE9OU0UKKyAgY2FzZSBMQ19SRVNQT05TRToKKyAgICByZXR2YWwgPSAiTENfUkVTUE9OU0UiOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgTENfQUxMCisgIGNhc2UgTENfQUxMOgorICAgIC8qIFRoaXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UgYnV0IGlzIHBlcmhhcHMgYmV0dGVyIHRoYW4gYW55IG90aGVyCisgICAgICAgdmFsdWUuICAqLworICAgIHJldHZhbCA9ICJMQ19BTEwiOworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgLyogSWYgeW91IGhhdmUgYSBiZXR0ZXIgaWRlYSBmb3IgYSBkZWZhdWx0IHZhbHVlIGxldCBtZSBrbm93LiAgKi8KKyAgICByZXR2YWwgPSAiTENfWFhYIjsKKyAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworLyogR3Vlc3MgdmFsdWUgb2YgY3VycmVudCBsb2NhbGUgZnJvbSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2ludGVybmFsX2Z1bmN0aW9uCitndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCit7CisgIGNvbnN0IGNoYXIgKmxhbmd1YWdlOworICBjb25zdCBjaGFyICpyZXR2YWw7CisKKyAgLyogVGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgaXMgdGhlIGBMQU5HVUFHRScgZW52aXJvbm1lbnQKKyAgICAgdmFyaWFibGUuICBCdXQgd2UgZG9uJ3QgdXNlIHRoZSB2YWx1ZSBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgIGxvY2FsZSBpcyB0aGUgQyBsb2NhbGUuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCisgIGxhbmd1YWdlID0gZ2V0ZW52ICgiTEFOR1VBR0UiKTsKKyAgaWYgKGxhbmd1YWdlICE9IE5VTEwgJiYgbGFuZ3VhZ2VbMF0gPT0gJ1wwJykKKyAgICBsYW5ndWFnZSA9IE5VTEw7CisKKyAgLyogV2UgaGF2ZSB0byBwcm9jZWVkIHdpdGggdGhlIFBPU0lYIG1ldGhvZHMgb2YgbG9va2luZyB0byBgTENfQUxMJywKKyAgICAgYExDX3h4eCcsIGFuZCBgTEFORycuICBPbiBzb21lIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUKKyAgICAgYHNldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KKyNpZmRlZiBfTElCQworICByZXR2YWwgPSBfX2N1cnJlbnRfbG9jYWxlX25hbWUgKGNhdGVnb3J5KTsKKyNlbHNlCisgIHJldHZhbCA9IF9ubF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7CisjZW5kaWYKKworICAvKiBJZ25vcmUgTEFOR1VBR0UgaWYgdGhlIGxvY2FsZSBpcyBzZXQgdG8gIkMiIGJlY2F1c2UKKyAgICAgMS4gIkMiIGxvY2FsZSB1c3VhbGx5IHVzZXMgdGhlIEFTQ0lJIGVuY29kaW5nLCBhbmQgbW9zdCBpbnRlcm5hdGlvbmFsCisJbWVzc2FnZXMgdXNlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiBUaGVzZSBjaGFyYWN0ZXJzIGdldCBkaXNwbGF5ZWQKKwlhcyBxdWVzdGlvbiBtYXJrcyAoaWYgdXNpbmcgZ2xpYmMncyBpY29udigpKSBvciBhcyBpbnZhbGlkIDgtYml0CisJY2hhcmFjdGVycyAoYmVjYXVzZSBvdGhlciBpY29udigpcyByZWZ1c2UgdG8gY29udmVydCBtb3N0IG5vbi1BU0NJSQorCWNoYXJhY3RlcnMgdG8gQVNDSUkpLiBJbiBhbnkgY2FzZSwgdGhlIG91dHB1dCBpcyB1Z2x5LgorICAgICAyLiBUaGUgcHJlY2lzZSBvdXRwdXQgb2Ygc29tZSBwcm9ncmFtcyBpbiB0aGUgIkMiIGxvY2FsZSBpcyBzcGVjaWZpZWQKKwlieSBQT1NJWCBhbmQgc2hvdWxkIG5vdCBkZXBlbmQgb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIGxpa2UKKwkiTEFOR1VBR0UiLiAgV2UgYWxsb3cgc3VjaCBwcm9ncmFtcyB0byB1c2UgZ2V0dGV4dCgpLiAgKi8KKyAgcmV0dXJuIGxhbmd1YWdlICE9IE5VTEwgJiYgc3RyY21wIChyZXR2YWwsICJDIikgIT0gMCA/IGxhbmd1YWdlIDogcmV0dmFsOworfQorCisvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKworLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKKyAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCisgICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQorICAgdG8gYmUgZGVmaW5lZC4gICovCisjaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQorc3RhdGljIGNoYXIgKgorc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKyAgICAvKiBEbyBub3RoaW5nLiAqLyA7CisgIHJldHVybiBkZXN0IC0gMTsKK30KKyNlbmRpZgorCisjaWYgIV9MSUJDICYmICFIQVZFX01FTVBDUFkKK3N0YXRpYyB2b2lkICoKK21lbXBjcHkgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisgIHJldHVybiAodm9pZCAqKSAoKGNoYXIgKikgbWVtY3B5IChkZXN0LCBzcmMsIG4pICsgbik7Cit9CisjZW5kaWYKKworCisjaWZkZWYgX0xJQkMKKy8qIElmIHdlIHdhbnQgdG8gZnJlZSBhbGwgcmVzb3VyY2VzIHdlIGhhdmUgdG8gZG8gc29tZSB3b3JrIGF0CisgICBwcm9ncmFtJ3MgZW5kLiAgKi8KK2xpYmNfZnJlZXJlc19mbiAoZnJlZV9tZW0pCit7CisgIHZvaWQgKm9sZDsKKworICB3aGlsZSAoX25sX2RvbWFpbl9iaW5kaW5ncyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBiaW5kaW5nICpvbGRwID0gX25sX2RvbWFpbl9iaW5kaW5nczsKKyAgICAgIF9ubF9kb21haW5fYmluZGluZ3MgPSBfbmxfZG9tYWluX2JpbmRpbmdzLT5uZXh0OworICAgICAgaWYgKG9sZHAtPmRpcm5hbWUgIT0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpKQorCS8qIFllcywgdGhpcyBpcyBhIHBvaW50ZXIgY29tcGFyaXNvbi4gICovCisJZnJlZSAob2xkcC0+ZGlybmFtZSk7CisgICAgICBmcmVlIChvbGRwLT5jb2Rlc2V0KTsKKyAgICAgIGZyZWUgKG9sZHApOworICAgIH0KKworICBpZiAoX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gIT0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pCisgICAgLyogWWVzLCBhZ2FpbiBhIHBvaW50ZXIgY29tcGFyaXNvbi4gICovCisgICAgZnJlZSAoKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4pOworCisgIC8qIFJlbW92ZSB0aGUgc2VhcmNoIHRyZWUgd2l0aCB0aGUga25vd24gdHJhbnNsYXRpb25zLiAgKi8KKyAgX190ZGVzdHJveSAocm9vdCwgZnJlZSk7CisgIHJvb3QgPSBOVUxMOworCisgIHdoaWxlICh0cmFuc21lbV9saXN0ICE9IE5VTEwpCisgICAgeworICAgICAgb2xkID0gdHJhbnNtZW1fbGlzdDsKKyAgICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OworICAgICAgZnJlZSAob2xkKTsKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9kY25nZXR0ZXh0LmMgYi91bml4L2ludGwvZGNuZ2V0dGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTNlMDkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZGNuZ2V0dGV4dC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY25nZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKKyMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisgICBsb2NhbGUuICAqLworY2hhciAqCitEQ05HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKwkgICAgaW50IGNhdGVnb3J5KQoreworICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIDEsIG4sIGNhdGVnb3J5KTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fZGNuZ2V0dGV4dCwgZGNuZ2V0dGV4dCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9kZ2V0dGV4dC5jIGIvdW5peC9pbnRsL2RnZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0YjBmNQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9kZ2V0dGV4dC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBER0VUVEVYVCBfX2RnZXR0ZXh0CisjIGRlZmluZSBEQ0dFVFRFWFQgSU5UVVNFKF9fZGNnZXR0ZXh0KQorI2Vsc2UKKyMgZGVmaW5lIERHRVRURVhUIGxpYmludGxfZGdldHRleHQKKyMgZGVmaW5lIERDR0VUVEVYVCBsaWJpbnRsX2RjZ2V0dGV4dAorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLworY2hhciAqCitER0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQpCit7CisgIHJldHVybiBEQ0dFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUyk7Cit9CisKKyNpZmRlZiBfTElCQworLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCit3ZWFrX2FsaWFzIChfX2RnZXR0ZXh0LCBkZ2V0dGV4dCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9kbmdldHRleHQuYyBiL3VuaXgvaW50bC9kbmdldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODE1NjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2RuZ2V0dGV4dC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkbmdldHRleHQoMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRE5HRVRURVhUIF9fZG5nZXR0ZXh0CisjIGRlZmluZSBEQ05HRVRURVhUIF9fZGNuZ2V0dGV4dAorI2Vsc2UKKyMgZGVmaW5lIEROR0VUVEVYVCBsaWJpbnRsX2RuZ2V0dGV4dAorIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBvZiB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlIGFuZCBza2lwIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBwbHVyYWwgZm9ybS4gICovCitjaGFyICoKK0ROR0VUVEVYVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKK3sKKyAgcmV0dXJuIERDTkdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBMQ19NRVNTQUdFUyk7Cit9CisKKyNpZmRlZiBfTElCQworLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCit3ZWFrX2FsaWFzIChfX2RuZ2V0dGV4dCwgZG5nZXR0ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2V2YWwtcGx1cmFsLmggYi91bml4L2ludGwvZXZhbC1wbHVyYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWJkNWFmCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2V2YWwtcGx1cmFsLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIFBsdXJhbCBleHByZXNzaW9uIGV2YWx1YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgU1RBVElDCisjZGVmaW5lIFNUQVRJQyBzdGF0aWMKKyNlbmRpZgorCisvKiBFdmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYW5kIHJldHVybiBhbiBpbmRleCB2YWx1ZS4gICovCitTVEFUSUMKK3Vuc2lnbmVkIGxvbmcgaW50CitpbnRlcm5hbF9mdW5jdGlvbgorcGx1cmFsX2V2YWwgKHN0cnVjdCBleHByZXNzaW9uICpwZXhwLCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICBzd2l0Y2ggKHBleHAtPm5hcmdzKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBzd2l0Y2ggKHBleHAtPm9wZXJhdGlvbikKKwl7CisJY2FzZSB2YXI6CisJICByZXR1cm4gbjsKKwljYXNlIG51bToKKwkgIHJldHVybiBwZXhwLT52YWwubnVtOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgICAvKiBOT1RSRUFDSEVEICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB7CisJLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgbG5vdC4gICovCisJdW5zaWduZWQgbG9uZyBpbnQgYXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKKwlyZXR1cm4gISBhcmc7CisgICAgICB9CisgICAgY2FzZSAyOgorICAgICAgeworCXVuc2lnbmVkIGxvbmcgaW50IGxlZnRhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOworCWlmIChwZXhwLT5vcGVyYXRpb24gPT0gbG9yKQorCSAgcmV0dXJuIGxlZnRhcmcgfHwgcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKKwllbHNlIGlmIChwZXhwLT5vcGVyYXRpb24gPT0gbGFuZCkKKwkgIHJldHVybiBsZWZ0YXJnICYmIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBsb25nIGludCByaWdodGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7CisKKwkgICAgc3dpdGNoIChwZXhwLT5vcGVyYXRpb24pCisJICAgICAgeworCSAgICAgIGNhc2UgbXVsdDoKKwkJcmV0dXJuIGxlZnRhcmcgKiByaWdodGFyZzsKKwkgICAgICBjYXNlIGRpdmlkZToKKyNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCisJCWlmIChyaWdodGFyZyA9PSAwKQorCQkgIHJhaXNlIChTSUdGUEUpOworI2VuZGlmCisJCXJldHVybiBsZWZ0YXJnIC8gcmlnaHRhcmc7CisJICAgICAgY2FzZSBtb2R1bGU6CisjaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQorCQlpZiAocmlnaHRhcmcgPT0gMCkKKwkJICByYWlzZSAoU0lHRlBFKTsKKyNlbmRpZgorCQlyZXR1cm4gbGVmdGFyZyAlIHJpZ2h0YXJnOworCSAgICAgIGNhc2UgcGx1czoKKwkJcmV0dXJuIGxlZnRhcmcgKyByaWdodGFyZzsKKwkgICAgICBjYXNlIG1pbnVzOgorCQlyZXR1cm4gbGVmdGFyZyAtIHJpZ2h0YXJnOworCSAgICAgIGNhc2UgbGVzc190aGFuOgorCQlyZXR1cm4gbGVmdGFyZyA8IHJpZ2h0YXJnOworCSAgICAgIGNhc2UgZ3JlYXRlcl90aGFuOgorCQlyZXR1cm4gbGVmdGFyZyA+IHJpZ2h0YXJnOworCSAgICAgIGNhc2UgbGVzc19vcl9lcXVhbDoKKwkJcmV0dXJuIGxlZnRhcmcgPD0gcmlnaHRhcmc7CisJICAgICAgY2FzZSBncmVhdGVyX29yX2VxdWFsOgorCQlyZXR1cm4gbGVmdGFyZyA+PSByaWdodGFyZzsKKwkgICAgICBjYXNlIGVxdWFsOgorCQlyZXR1cm4gbGVmdGFyZyA9PSByaWdodGFyZzsKKwkgICAgICBjYXNlIG5vdF9lcXVhbDoKKwkJcmV0dXJuIGxlZnRhcmcgIT0gcmlnaHRhcmc7CisJICAgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJICAgICAgfQorCSAgfQorCS8qIE5PVFJFQUNIRUQgKi8KKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDM6CisgICAgICB7CisJLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgcW1vcC4gICovCisJdW5zaWduZWQgbG9uZyBpbnQgYm9vbGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7CisJcmV0dXJuIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1tib29sYXJnID8gMSA6IDJdLCBuKTsKKyAgICAgIH0KKyAgICB9CisgIC8qIE5PVFJFQUNIRUQgKi8KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvZXhwbG9kZW5hbWUuYyBiL3VuaXgvaW50bC9leHBsb2RlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzI1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZXhwbG9kZW5hbWUuYwpAQCAtMCwwICsxLDE4NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgImxvYWRpbmZvLmgiCisKKy8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLworI2lmbmRlZiBOVUxMCisjIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KKyMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQorIyBlbHNlCisjICBkZWZpbmUgTlVMTCAwCisjIGVuZGlmCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCitjaGFyICoKK19ubF9maW5kX2xhbmd1YWdlIChjb25zdCBjaGFyICpuYW1lKQoreworICB3aGlsZSAobmFtZVswXSAhPSAnXDAnICYmIG5hbWVbMF0gIT0gJ18nICYmIG5hbWVbMF0gIT0gJ0AnCisJICYmIG5hbWVbMF0gIT0gJysnICYmIG5hbWVbMF0gIT0gJywnKQorICAgICsrbmFtZTsKKworICByZXR1cm4gKGNoYXIgKikgbmFtZTsKK30KKworCitpbnQKK19ubF9leHBsb2RlX25hbWUgKGNoYXIgKm5hbWUsCisJCSAgY29uc3QgY2hhciAqKmxhbmd1YWdlLCBjb25zdCBjaGFyICoqbW9kaWZpZXIsCisJCSAgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwgY29uc3QgY2hhciAqKmNvZGVzZXQsCisJCSAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwgY29uc3QgY2hhciAqKnNwZWNpYWwsCisJCSAgY29uc3QgY2hhciAqKnNwb25zb3IsIGNvbnN0IGNoYXIgKipyZXZpc2lvbikKK3sKKyAgZW51bSB7IHVuZGVjaWRlZCwgeHBnLCBjZW4gfSBzeW50YXg7CisgIGNoYXIgKmNwOworICBpbnQgbWFzazsKKworICAqbW9kaWZpZXIgPSBOVUxMOworICAqdGVycml0b3J5ID0gTlVMTDsKKyAgKmNvZGVzZXQgPSBOVUxMOworICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gTlVMTDsKKyAgKnNwZWNpYWwgPSBOVUxMOworICAqc3BvbnNvciA9IE5VTEw7CisgICpyZXZpc2lvbiA9IE5VTEw7CisKKyAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0CisgICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCisgICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLworICBtYXNrID0gMDsKKyAgc3ludGF4ID0gdW5kZWNpZGVkOworICAqbGFuZ3VhZ2UgPSBjcCA9IG5hbWU7CisgIGNwID0gX25sX2ZpbmRfbGFuZ3VhZ2UgKCpsYW5ndWFnZSk7CisKKyAgaWYgKCpsYW5ndWFnZSA9PSBjcCkKKyAgICAvKiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2U6IGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQuICBVc2UKKyAgICAgICB0aGlzIGVudHJ5IGFzIGl0IGlzIHdpdGhvdXQgZXhwbG9kaW5nLiAgUGVyaGFwcyBpdCBpcyBhbiBhbGlhcy4gICovCisgICAgY3AgPSBzdHJjaHIgKCpsYW5ndWFnZSwgJ1wwJyk7CisgIGVsc2UgaWYgKGNwWzBdID09ICdfJykKKyAgICB7CisgICAgICAvKiBOZXh0IGlzIHRoZSB0ZXJyaXRvcnkuICAqLworICAgICAgY3BbMF0gPSAnXDAnOworICAgICAgKnRlcnJpdG9yeSA9ICsrY3A7CisKKyAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcuJyAmJiBjcFswXSAhPSAnQCcKKwkgICAgICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQorCSsrY3A7CisKKyAgICAgIG1hc2sgfD0gVEVSUklUT1JZOworCisgICAgICBpZiAoY3BbMF0gPT0gJy4nKQorCXsKKwkgIC8qIE5leHQgaXMgdGhlIGNvZGVzZXQuICAqLworCSAgc3ludGF4ID0geHBnOworCSAgY3BbMF0gPSAnXDAnOworCSAgKmNvZGVzZXQgPSArK2NwOworCisJICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnQCcpCisJICAgICsrY3A7CisKKwkgIG1hc2sgfD0gWFBHX0NPREVTRVQ7CisKKwkgIGlmICgqY29kZXNldCAhPSBjcCAmJiAoKmNvZGVzZXQpWzBdICE9ICdcMCcpCisJICAgIHsKKwkgICAgICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gX25sX25vcm1hbGl6ZV9jb2Rlc2V0ICgqY29kZXNldCwKKwkJCQkJCQkgICBjcCAtICpjb2Rlc2V0KTsKKwkgICAgICBpZiAoc3RyY21wICgqY29kZXNldCwgKm5vcm1hbGl6ZWRfY29kZXNldCkgPT0gMCkKKwkJZnJlZSAoKGNoYXIgKikgKm5vcm1hbGl6ZWRfY29kZXNldCk7CisJICAgICAgZWxzZQorCQltYXNrIHw9IFhQR19OT1JNX0NPREVTRVQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChjcFswXSA9PSAnQCcgfHwgKHN5bnRheCAhPSB4cGcgJiYgY3BbMF0gPT0gJysnKSkKKyAgICB7CisgICAgICAvKiBOZXh0IGlzIHRoZSBtb2RpZmllci4gICovCisgICAgICBzeW50YXggPSBjcFswXSA9PSAnQCcgPyB4cGcgOiBjZW47CisgICAgICBjcFswXSA9ICdcMCc7CisgICAgICAqbW9kaWZpZXIgPSArK2NwOworCisgICAgICB3aGlsZSAoc3ludGF4ID09IGNlbiAmJiBjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcrJworCSAgICAgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKKwkrK2NwOworCisgICAgICBtYXNrIHw9IFhQR19NT0RJRklFUiB8IENFTl9BVURJRU5DRTsKKyAgICB9CisKKyAgaWYgKHN5bnRheCAhPSB4cGcgJiYgKGNwWzBdID09ICcrJyB8fCBjcFswXSA9PSAnLCcgfHwgY3BbMF0gPT0gJ18nKSkKKyAgICB7CisgICAgICBzeW50YXggPSBjZW47CisKKyAgICAgIGlmIChjcFswXSA9PSAnKycpCisJeworIAkgIC8qIE5leHQgaXMgc3BlY2lhbCBhcHBsaWNhdGlvbiAoQ0VOIHN5bnRheCkuICAqLworCSAgY3BbMF0gPSAnXDAnOworCSAgKnNwZWNpYWwgPSArK2NwOworCisJICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQorCSAgICArK2NwOworCisJICBtYXNrIHw9IENFTl9TUEVDSUFMOworCX0KKworICAgICAgaWYgKGNwWzBdID09ICcsJykKKwl7CisgCSAgLyogTmV4dCBpcyBzcG9uc29yIChDRU4gc3ludGF4KS4gICovCisJICBjcFswXSA9ICdcMCc7CisJICAqc3BvbnNvciA9ICsrY3A7CisKKwkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJykKKwkgICAgKytjcDsKKworCSAgbWFzayB8PSBDRU5fU1BPTlNPUjsKKwl9CisKKyAgICAgIGlmIChjcFswXSA9PSAnXycpCisJeworIAkgIC8qIE5leHQgaXMgcmV2aXNpb24gKENFTiBzeW50YXgpLiAgKi8KKwkgIGNwWzBdID0gJ1wwJzsKKwkgICpyZXZpc2lvbiA9ICsrY3A7CisKKwkgIG1hc2sgfD0gQ0VOX1JFVklTSU9OOworCX0KKyAgICB9CisKKyAgLyogRm9yIENFTiBzeW50YXggdmFsdWVzIGl0IG1pZ2h0IGJlIGltcG9ydGFudCB0byBoYXZlIHRoZQorICAgICBzZXBhcmF0b3IgY2hhcmFjdGVyIGluIHRoZSBmaWxlIG5hbWUsIG5vdCBmb3IgWFBHIHN5bnRheC4gICovCisgIGlmIChzeW50YXggPT0geHBnKQorICAgIHsKKyAgICAgIGlmICgqdGVycml0b3J5ICE9IE5VTEwgJiYgKCp0ZXJyaXRvcnkpWzBdID09ICdcMCcpCisJbWFzayAmPSB+VEVSUklUT1JZOworCisgICAgICBpZiAoKmNvZGVzZXQgIT0gTlVMTCAmJiAoKmNvZGVzZXQpWzBdID09ICdcMCcpCisJbWFzayAmPSB+WFBHX0NPREVTRVQ7CisKKyAgICAgIGlmICgqbW9kaWZpZXIgIT0gTlVMTCAmJiAoKm1vZGlmaWVyKVswXSA9PSAnXDAnKQorCW1hc2sgJj0gflhQR19NT0RJRklFUjsKKyAgICB9CisKKyAgcmV0dXJuIG1hc2s7Cit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvZmluZGRvbWFpbi5jIGIvdW5peC9pbnRsL2ZpbmRkb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkyYThjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2ZpbmRkb21haW4uYwpAQCAtMCwwICsxLDE5MiBAQAorLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5vcmc+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworLyogTGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfbmxfbG9hZGVkX2RvbWFpbnM7CisKKworLyogUmV0dXJuIGEgZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBjYXRhbG9nIGRlc2NyaWJlZCBieQorICAgdGhlIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZIHBhcmFtZXRlcnMgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50bHkKKyAgIGVzdGFibGlzaGVkIGJpbmRpbmdzLiAgKi8KK3N0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF9maW5kX2RvbWFpbiAoY29uc3QgY2hhciAqZGlybmFtZSwgY2hhciAqbG9jYWxlLAorCQkgY29uc3QgY2hhciAqZG9tYWlubmFtZSwgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCit7CisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKKyAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CisgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOworICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7CisgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7CisgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKKyAgY29uc3QgY2hhciAqc3BlY2lhbDsKKyAgY29uc3QgY2hhciAqc3BvbnNvcjsKKyAgY29uc3QgY2hhciAqcmV2aXNpb247CisgIGNvbnN0IGNoYXIgKmFsaWFzX3ZhbHVlOworICBpbnQgbWFzazsKKworICAvKiBMT0NBTEUgY2FuIGNvbnNpc3Qgb2YgdXAgdG8gZm91ciByZWNvZ25pemVkIHBhcnRzIGZvciB0aGUgWFBHIHN5bnRheDoKKworCQlsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQorCisgICAgIGFuZCBzaXggcGFydHMgZm9yIHRoZSBDRU4gc3ludGF4OgorCisJbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bK2F1ZGllbmNlXVsrc3BlY2lhbF1bLFtzcG9uc29yXVtfcmV2aXNpb25dXQorCisgICAgIEJlc2lkZSB0aGUgZmlyc3QgcGFydCBhbGwgb2YgdGhlbSBhcmUgYWxsb3dlZCB0byBiZSBtaXNzaW5nLiAgSWYKKyAgICAgdGhlIGZ1bGwgc3BlY2lmaWVkIGxvY2FsZSBpcyBub3QgZm91bmQsIHRoZSBsZXNzIHNwZWNpZmljIG9uZSBhcmUKKyAgICAgbG9va2VkIGZvci4gIFRoZSB2YXJpb3VzIHBhcnRzIHdpbGwgYmUgc3RyaXBwZWQgb2ZmIGFjY29yZGluZyB0bworICAgICB0aGUgZm9sbG93aW5nIG9yZGVyOgorCQkoMSkgcmV2aXNpb24KKwkJKDIpIHNwb25zb3IKKwkJKDMpIHNwZWNpYWwKKwkJKDQpIGNvZGVzZXQKKwkJKDUpIG5vcm1hbGl6ZWQgY29kZXNldAorCQkoNikgdGVycml0b3J5CisJCSg3KSBhdWRpZW5jZS9tb2RpZmllcgorICAgKi8KKworICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgdGVzdGVkIGZvciB0aGlzIGxvY2FsZSBlbnRyeSB0aGVyZSBoYXMgdG8KKyAgICAgYmUgb25lIGRhdGEgc2V0IGluIHRoZSBsaXN0IG9mIGxvYWRlZCBkb21haW5zLiAgKi8KKyAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAorCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCAwLCBsb2NhbGUsIE5VTEwsIE5VTEwsCisJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgZG9tYWlubmFtZSwgMCk7CisgIGlmIChyZXR2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzIGxvY2FsZS4gICovCisgICAgICBpbnQgY250OworCisgICAgICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCisJX25sX2xvYWRfZG9tYWluIChyZXR2YWwsIGRvbWFpbmJpbmRpbmcpOworCisgICAgICBpZiAocmV0dmFsLT5kYXRhICE9IE5VTEwpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQorCXsKKwkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCisJICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSwgZG9tYWluYmluZGluZyk7CisKKwkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCisJICAgIGJyZWFrOworCX0KKyAgICAgIHJldHVybiBjbnQgPj0gMCA/IHJldHZhbCA6IE5VTEw7CisgICAgICAvKiBOT1RSRUFDSEVEICovCisgICAgfQorCisgIC8qIFNlZSB3aGV0aGVyIHRoZSBsb2NhbGUgdmFsdWUgaXMgYW4gYWxpYXMuICBJZiB5ZXMgaXRzIHZhbHVlCisgICAgICpvdmVyd3JpdGVzKiB0aGUgYWxpYXMgbmFtZS4gIE5vIHRlc3QgZm9yIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcworICAgICBkb25lLiAgKi8KKyAgYWxpYXNfdmFsdWUgPSBfbmxfZXhwYW5kX2FsaWFzIChsb2NhbGUpOworICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKKyAgICB7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisgICAgICBsb2NhbGUgPSBzdHJkdXAgKGFsaWFzX3ZhbHVlKTsKKyAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyNlbHNlCisgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChhbGlhc192YWx1ZSkgKyAxOworICAgICAgbG9jYWxlID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgICBtZW1jcHkgKGxvY2FsZSwgYWxpYXNfdmFsdWUsIGxlbik7CisjZW5kaWYKKyAgICB9CisKKyAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0CisgICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCisgICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLworICBtYXNrID0gX25sX2V4cGxvZGVfbmFtZSAobG9jYWxlLCAmbGFuZ3VhZ2UsICZtb2RpZmllciwgJnRlcnJpdG9yeSwKKwkJCSAgICZjb2Rlc2V0LCAmbm9ybWFsaXplZF9jb2Rlc2V0LCAmc3BlY2lhbCwKKwkJCSAgICZzcG9uc29yLCAmcmV2aXNpb24pOworCisgIC8qIENyZWF0ZSBhbGwgcG9zc2libGUgbG9jYWxlIGVudHJpZXMgd2hpY2ggbWlnaHQgYmUgaW50ZXJlc3RlZCBpbgorICAgICBnZW5lcmFsaXphdGlvbi4gICovCisgIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKKwkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgbWFzaywgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwKKwkJCSAgICAgICBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAorCQkJICAgICAgIHNwb25zb3IsIHJldmlzaW9uLCBkb21haW5uYW1lLCAxKTsKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIG91dCBvZiBjb3JlLiAgKi8KKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCisgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwsIGRvbWFpbmJpbmRpbmcpOworICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCisgICAgeworICAgICAgaW50IGNudDsKKyAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKwl7CisJICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQorCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0sIGRvbWFpbmJpbmRpbmcpOworCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBUaGUgcm9vbSBmb3IgYW4gYWxpYXMgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQgbm93LiAgKi8KKyAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCisgICAgZnJlZSAobG9jYWxlKTsKKworICAvKiBUaGUgc3BhY2UgZm9yIG5vcm1hbGl6ZWRfY29kZXNldCBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICBGcmVlIGl0LiAgKi8KKyAgaWYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKQorICAgIGZyZWUgKCh2b2lkICopIG5vcm1hbGl6ZWRfY29kZXNldCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisjaWZkZWYgX0xJQkMKK2xpYmNfZnJlZXJlc19mbiAoZnJlZV9tZW0pCit7CisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJ1bnAgPSBfbmxfbG9hZGVkX2RvbWFpbnM7CisKKyAgd2hpbGUgKHJ1bnAgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpoZXJlID0gcnVucDsKKyAgICAgIGlmIChydW5wLT5kYXRhICE9IE5VTEwpCisJX25sX3VubG9hZF9kb21haW4gKChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBydW5wLT5kYXRhKTsKKyAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OworICAgICAgZnJlZSAoKGNoYXIgKikgaGVyZS0+ZmlsZW5hbWUpOworICAgICAgZnJlZSAoaGVyZSk7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvZ2V0dGV4dC5jIGIvdW5peC9pbnRsL2dldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmM0MmZhCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2dldHRleHQuYwpAQCAtMCwwICsxLDYzIEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIF9fbmVlZF9OVUxMCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBKdXN0IGZvciBOVUxMLiAgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEdFVFRFWFQgX19nZXR0ZXh0CisjIGRlZmluZSBEQ0dFVFRFWFQgSU5UVVNFKF9fZGNnZXR0ZXh0KQorI2Vsc2UKKyMgZGVmaW5lIEdFVFRFWFQgbGliaW50bF9nZXR0ZXh0CisjIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKyAgIHRleHQpLiAgKi8KK2NoYXIgKgorR0VUVEVYVCAoY29uc3QgY2hhciAqbXNnaWQpCit7CisgIHJldHVybiBEQ0dFVFRFWFQgKE5VTEwsIG1zZ2lkLCBMQ19NRVNTQUdFUyk7Cit9CisKKyNpZmRlZiBfTElCQworLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCit3ZWFrX2FsaWFzIChfX2dldHRleHQsIGdldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvZ2V0dGV4dC5oIGIvdW5peC9pbnRsL2dldHRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI2MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2dldHRleHQuaApAQCAtMCwwICsxLDY5IEBACisvKiBDb252ZW5pZW5jZSBoZWFkZXIgZm9yIGNvbmRpdGlvbmFsIHVzZSBvZiBHTlUgPGxpYmludGwuaD4uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfTElCR0VUVEVYVF9ICisjZGVmaW5lIF9MSUJHRVRURVhUX0ggMQorCisvKiBOTFMgY2FuIGJlIGRpc2FibGVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZSAtLWRpc2FibGUtbmxzIG9wdGlvbi4gICovCisjaWYgRU5BQkxFX05MUworCisvKiBHZXQgZGVjbGFyYXRpb25zIG9mIEdOVSBtZXNzYWdlIGNhdGFsb2cgZnVuY3Rpb25zLiAgKi8KKyMgaW5jbHVkZSA8bGliaW50bC5oPgorCisjZWxzZQorCisvKiBTb2xhcmlzIC91c3IvaW5jbHVkZS9sb2NhbGUuaCBpbmNsdWRlcyAvdXNyL2luY2x1ZGUvbGliaW50bC5oLCB3aGljaAorICAgY2hva2VzIGlmIGRjZ2V0dGV4dCBpcyBkZWZpbmVkIGFzIGEgbWFjcm8uICBTbyBpbmNsdWRlIGl0IG5vdywgdG8gbWFrZQorICAgbGF0ZXIgaW5jbHVzaW9ucyBvZiA8bG9jYWxlLmg+IGEgTk9QLiAgV2UgZG9uJ3QgaW5jbHVkZSA8bGliaW50bC5oPgorICAgYXMgd2VsbCBiZWNhdXNlIHBlb3BsZSB1c2luZyAiZ2V0dGV4dC5oIiB3aWxsIG5vdCBpbmNsdWRlIDxsaWJpbnRsLmg+LAorICAgYW5kIGFsc28gaW5jbHVkaW5nIDxsaWJpbnRsLmg+IHdvdWxkIGZhaWwgb24gU3VuT1MgNCwgd2hlcmVhcyA8bG9jYWxlLmg+CisgICBpcyBPSy4gICovCisjaWYgZGVmaW5lZChfX3N1bikKKyMgaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworLyogRGlzYWJsZWQgTkxTLgorICAgVGhlIGNhc3RzIHRvICdjb25zdCBjaGFyIConIHNlcnZlIHRoZSBwdXJwb3NlIG9mIHByb2R1Y2luZyB3YXJuaW5ncworICAgZm9yIGludmFsaWQgdXNlcyBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGVzZSBmdW5jdGlvbnMuCisgICBPbiBwcmUtQU5TSSBzeXN0ZW1zIHdpdGhvdXQgJ2NvbnN0JywgdGhlIGNvbmZpZy5oIGZpbGUgaXMgc3VwcG9zZWQgdG8KKyAgIGNvbnRhaW4gIiNkZWZpbmUgY29uc3QiLiAgKi8KKyMgZGVmaW5lIGdldHRleHQoTXNnaWQpICgoY29uc3QgY2hhciAqKSAoTXNnaWQpKQorIyBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpICgoY29uc3QgY2hhciAqKSAoTXNnaWQpKQorIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKChjb25zdCBjaGFyICopIChNc2dpZCkpCisjIGRlZmluZSBuZ2V0dGV4dChNc2dpZDEsIE1zZ2lkMiwgTikgXAorICAgICgoTikgPT0gMSA/IChjb25zdCBjaGFyICopIChNc2dpZDEpIDogKGNvbnN0IGNoYXIgKikgKE1zZ2lkMikpCisjIGRlZmluZSBkbmdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQxLCBNc2dpZDIsIE4pIFwKKyAgICAoKE4pID09IDEgPyAoY29uc3QgY2hhciAqKSAoTXNnaWQxKSA6IChjb25zdCBjaGFyICopIChNc2dpZDIpKQorIyBkZWZpbmUgZGNuZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZDEsIE1zZ2lkMiwgTiwgQ2F0ZWdvcnkpIFwKKyAgICAoKE4pID09IDEgPyAoY29uc3QgY2hhciAqKSAoTXNnaWQxKSA6IChjb25zdCBjaGFyICopIChNc2dpZDIpKQorIyBkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSAoKGNvbnN0IGNoYXIgKikgKERvbWFpbm5hbWUpKQorIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgKChjb25zdCBjaGFyICopIChEaXJuYW1lKSkKKyMgZGVmaW5lIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KERvbWFpbm5hbWUsIENvZGVzZXQpICgoY29uc3QgY2hhciAqKSAoQ29kZXNldCkpCisKKyNlbmRpZgorCisvKiBBIHBzZXVkbyBmdW5jdGlvbiBjYWxsIHRoYXQgc2VydmVzIGFzIGEgbWFya2VyIGZvciB0aGUgYXV0b21hdGVkCisgICBleHRyYWN0aW9uIG9mIG1lc3NhZ2VzLCBidXQgZG9lcyBub3QgY2FsbCBnZXR0ZXh0KCkuICBUaGUgcnVuLXRpbWUKKyAgIHRyYW5zbGF0aW9uIGlzIGRvbmUgYXQgYSBkaWZmZXJlbnQgcGxhY2UgaW4gdGhlIGNvZGUuCisgICBUaGUgYXJndW1lbnQsIFN0cmluZywgc2hvdWxkIGJlIGEgbGl0ZXJhbCBzdHJpbmcuICBDb25jYXRlbmF0ZWQgc3RyaW5ncworICAgYW5kIG90aGVyIHN0cmluZyBleHByZXNzaW9ucyB3b24ndCB3b3JrLgorICAgVGhlIG1hY3JvJ3MgZXhwYW5zaW9uIGlzIG5vdCBwYXJlbnRoZXNpemVkLCBzbyB0aGF0IGl0IGlzIHN1aXRhYmxlIGFzCisgICBpbml0aWFsaXplciBmb3Igc3RhdGljICdjaGFyW10nIG9yICdjb25zdCBjaGFyW10nIHZhcmlhYmxlcy4gICovCisjZGVmaW5lIGdldHRleHRfbm9vcChTdHJpbmcpIFN0cmluZworCisjZW5kaWYgLyogX0xJQkdFVFRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2dldHRleHRQLmggYi91bml4L2ludGwvZ2V0dGV4dFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY2YzNkCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2dldHRleHRQLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBsaWJpbnRsIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0dFVFRFWFRQX0gKKyNkZWZpbmUgX0dFVFRFWFRQX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgkJLyogR2V0IHNpemVfdC4gICovCisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlICIuLi9pY29udi9nY29udl9pbnQuaCIKKyNlbHNlCisjIGlmIEhBVkVfSUNPTlYKKyMgIGluY2x1ZGUgPGljb252Lmg+CisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImxvYWRpbmZvLmgiCisKKyNpbmNsdWRlICJnbW8uaCIJCS8qIEdldCBubHNfdWludDMyLiAgKi8KKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCisjIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgorIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgorI2VuZGlmCisKKy8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKKyAgIGFsbW9zdCBhbHdheXMgdHJ1ZSBvciBhbG1vc3QgYWx3YXlzIGZhbHNlLiAgKi8KKyNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAorIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQorI2VuZGlmCisKKyNpZm5kZWYgVworIyBkZWZpbmUgVyhmbGFnLCBkYXRhKSAoKGZsYWcpID8gU1dBUCAoZGF0YSkgOiAoZGF0YSkpCisjZW5kaWYKKworCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyMgZGVmaW5lIFNXQVAoaSkgYnN3YXBfMzIgKGkpCisjZWxzZQorc3RhdGljIGlubGluZSBubHNfdWludDMyCitTV0FQIChpKQorICAgICBubHNfdWludDMyIGk7Cit7CisgIHJldHVybiAoaSA8PCAyNCkgfCAoKGkgJiAweGZmMDApIDw8IDgpIHwgKChpID4+IDgpICYgMHhmZjAwKSB8IChpID4+IDI0KTsKK30KKyNlbmRpZgorCisKKy8qIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCitzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjCit7CisgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisgIHNpemVfdCBsZW5ndGg7CisgIC8qIFBvaW50ZXIgdG8gYWRkcmVzc2VkIHN0cmluZy4gICovCisgIGNvbnN0IGNoYXIgKnBvaW50ZXI7Cit9OworCisvKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4gICovCitzdHJ1Y3QgbG9hZGVkX2RvbWFpbgoreworICAvKiBQb2ludGVyIHRvIG1lbW9yeSBjb250YWluaW5nIHRoZSAubW8gZmlsZS4gICovCisgIGNvbnN0IGNoYXIgKmRhdGE7CisgIC8qIDEgaWYgdGhlIG1lbW9yeSBpcyBtbWFwKCllZCwgMCBpZiB0aGUgbWVtb3J5IGlzIG1hbGxvYygpZWQuICAqLworICBpbnQgdXNlX21tYXA7CisgIC8qIFNpemUgb2YgbW1hcCgpZWQgbWVtb3J5LiAgKi8KKyAgc2l6ZV90IG1tYXBfc2l6ZTsKKyAgLyogMSBpZiB0aGUgLm1vIGZpbGUgdXNlcyBhIGRpZmZlcmVudCBlbmRpYW5uZXNzIHRoYW4gdGhpcyBtYWNoaW5lLiAgKi8KKyAgaW50IG11c3Rfc3dhcDsKKyAgLyogUG9pbnRlciB0byBhZGRpdGlvbmFsIG1hbGxvYygpZWQgbWVtb3J5LiAgKi8KKyAgdm9pZCAqbWFsbG9jZWQ7CisKKyAgLyogTnVtYmVyIG9mIHN0YXRpYyBzdHJpbmdzIHBhaXJzLiAgKi8KKyAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKyAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiBvcmlnaW5hbCBzdHJpbmdzIGluIHRoZSBmaWxlLiAgKi8KKyAgY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICpvcmlnX3RhYjsKKyAgLyogUG9pbnRlciB0byBkZXNjcmlwdG9ycyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLworICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKnRyYW5zX3RhYjsKKworICAvKiBOdW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIHBhaXJzLiAgKi8KKyAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zdHJpbmdzOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIG9yaWdpbmFsIHN5c2RlcCBzdHJpbmdzLiAgKi8KKyAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqb3JpZ19zeXNkZXBfdGFiOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3lzZGVwIHN0cmluZ3MuICAqLworICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICp0cmFuc19zeXNkZXBfdGFiOworCisgIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCisgIG5sc191aW50MzIgaGFzaF9zaXplOworICAvKiBQb2ludGVyIHRvIGhhc2ggdGFibGUuICAqLworICBjb25zdCBubHNfdWludDMyICpoYXNoX3RhYjsKKyAgLyogMSBpZiB0aGUgaGFzaCB0YWJsZSB1c2VzIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MgdGhhbiB0aGlzIG1hY2hpbmUuICAqLworICBpbnQgbXVzdF9zd2FwX2hhc2hfdGFiOworCisgIGludCBjb2Rlc2V0X2NudHI7CisjaWZkZWYgX0xJQkMKKyAgX19nY29udl90IGNvbnY7CisjZWxzZQorIyBpZiBIQVZFX0lDT05WCisgIGljb252X3QgY29udjsKKyMgZW5kaWYKKyNlbmRpZgorICBjaGFyICoqY29udl90YWI7CisKKyAgc3RydWN0IGV4cHJlc3Npb24gKnBsdXJhbDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbnBsdXJhbHM7Cit9OworCisvKiBXZSB3YW50IHRvIGFsbG9jYXRlIGEgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdC4gIEJ1dCBJU08gQworICAgZG9lc24ndCBhbGxvdyB6ZXJvIHNpemVkIGFycmF5cy4gICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIFpFUk8gMAorI2Vsc2UKKyMgZGVmaW5lIFpFUk8gMQorI2VuZGlmCisKKy8qIEEgc2V0IG9mIHNldHRpbmdzIGJvdW5kIHRvIGEgbWVzc2FnZSBkb21haW4uICBVc2VkIHRvIHN0b3JlIHNldHRpbmdzCisgICBmcm9tIGJpbmR0ZXh0ZG9tYWluKCkgYW5kIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkuICAqLworc3RydWN0IGJpbmRpbmcKK3sKKyAgc3RydWN0IGJpbmRpbmcgKm5leHQ7CisgIGNoYXIgKmRpcm5hbWU7CisgIGludCBjb2Rlc2V0X2NudHI7CS8qIEluY3JlbWVudGVkIGVhY2ggdGltZSBjb2Rlc2V0IGNoYW5nZXMuICAqLworICBjaGFyICpjb2Rlc2V0OworICBjaGFyIGRvbWFpbm5hbWVbWkVST107Cit9OworCisvKiBBIGNvdW50ZXIgd2hpY2ggaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHNvbWUgcHJldmlvdXMgdHJhbnNsYXRpb25zCisgICBiZWNvbWUgaW52YWxpZC4KKyAgIFRoaXMgdmFyaWFibGUgaXMgcGFydCBvZiB0aGUgZXh0ZXJuYWwgQUJJIG9mIHRoZSBHTlUgbGliaW50bC4gICovCitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisKKyNpZm5kZWYgX0xJQkMKK2NvbnN0IGNoYXIgKl9ubF9sb2NhbGVfbmFtZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpOworI2VuZGlmCisKK3N0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9maW5kX2RvbWFpbiAoY29uc3QgY2hhciAqX19kaXJuYW1lLCBjaGFyICpfX2xvY2FsZSwKKwkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkJIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOwordm9pZCBfbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluLAorCQkgICAgICBzdHJ1Y3QgYmluZGluZyAqX19kb21haW5iaW5kaW5nKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKK3ZvaWQgX25sX3VubG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfZG9tYWluICpfX2RvbWFpbikKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Citjb25zdCBjaGFyICpfbmxfaW5pdF9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW5fZmlsZSwKKwkJCQkgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpfX2RvbWFpbiwKKwkJCQkgIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOwordm9pZCBfbmxfZnJlZV9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworY2hhciAqX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKwkJICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICptc2dpZCwKKwkJICAgIHNpemVfdCAqbGVuZ3RocCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKyNpZmRlZiBfTElCQworZXh0ZXJuIGNoYXIgKl9fZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCk7CitleHRlcm4gY2hhciAqX19kZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKTsKK2V4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorCQkJICBpbnQgX19jYXRlZ29yeSk7CitleHRlcm4gY2hhciAqX19uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7CitleHRlcm4gY2hhciAqX19kbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICB1bnNpZ25lZCBsb25nIGludCBuKTsKK2V4dGVybiBjaGFyICpfX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpOworZXh0ZXJuIGNoYXIgKl9fZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICAgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCisJCQkgICBpbnQgX19jYXRlZ29yeSk7CitleHRlcm4gY2hhciAqX190ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpOworZXh0ZXJuIGNoYXIgKl9fYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpOworZXh0ZXJuIGNoYXIgKl9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkJY29uc3QgY2hhciAqX19jb2Rlc2V0KTsKKyNlbHNlCisvKiBEZWNsYXJlIHRoZSBleHBvcnRlZCBsaWJpbnRsXyogZnVuY3Rpb25zLCBpbiBhIHdheSB0aGF0IGFsbG93cyB1cyB0bworICAgY2FsbCB0aGVtIHVuZGVyIHRoZWlyIHJlYWwgbmFtZS4gICovCisjIHVuZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorIyB1bmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCitleHRlcm4gY2hhciAqbGliaW50bF9kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCQkgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCisJCQkJIGludCBfX2NhdGVnb3J5KTsKKyNlbmRpZgorCisvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKworI2VuZGlmIC8qIGdldHRleHRQLmggICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvZ21vLmggYi91bml4L2ludGwvZ21vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjOWNjMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9nbW8uaApAQCAtMCwwICsxLDE0OSBAQAorLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IGdlbmVyYWwgZmlsZSBsYXlvdXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0dFVFRFWFRfSAorI2RlZmluZSBfR0VUVEVYVF9IIDEKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KKyNkZWZpbmUgX01BR0lDIDB4OTUwNDEyZGUKKyNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQorCisvKiBSZXZpc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSB1c2VkIC5tbyAoYmluYXJ5KSBmaWxlIGZvcm1hdC4gICovCisjZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCisjZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUl9XSVRIX1NZU0RFUF9JIDEKKworLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCisgICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCisgICBhbHRlcm5hdGl2ZSBhcHByb2FjaCBpcyB0byB1c2UgYXV0b2NvbmYncyBBQ19DSEVDS19TSVpFT0YgbWFjcm8sIGJ1dAorICAgYXMgb2YgdmVyc2lvbiBhdXRvY29uZi0yLjEzLCB0aGUgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvIGRvZXNuJ3Qgd29yaworICAgd2hlbiBjcm9zcy1jb21waWxpbmcuICAqLworCisjaWYgX19TVERDX18KKyMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgNDI5NDk2NzI5NVUKKyNlbHNlCisjIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKKyNlbmRpZgorCisvKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgorICAgVGhpcyBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBzeXN0ZW1zIEdOVSBjYXJlcyBhYm91dCBiZWNhdXNlCisgICB0aGF0IGRvZXNuJ3QgaW5jbHVkZSAxNi1iaXQgc3lzdGVtcywgYW5kIG9ubHkgbW9kZXJuIHN5c3RlbXMKKyAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCisKKyNpZm5kZWYgVUlOVF9NQVgKKyMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKKyNlbmRpZgorCisjaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwordHlwZWRlZiB1bnNpZ25lZCBubHNfdWludDMyOworI2Vsc2UKKyMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgbmxzX3VpbnQzMjsKKyMgZWxzZQorIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBubHNfdWludDMyOworIyAgZWxzZQorICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKKyAgICAgbm90IHBvcnRhYmxlIGVub3VnaC4gICovCisgICJDYW5ub3QgZGV0ZXJtaW5lIHVuc2lnbmVkIDMyLWJpdCBkYXRhIHR5cGUuIgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIEhlYWRlciBmb3IgYmluYXJ5IC5tbyBmaWxlIGZvcm1hdC4gICovCitzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKK3sKKyAgLyogVGhlIG1hZ2ljIG51bWJlci4gICovCisgIG5sc191aW50MzIgbWFnaWM7CisgIC8qIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0LiAgKi8KKyAgbmxzX3VpbnQzMiByZXZpc2lvbjsKKworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWFqb3IgcmV2aXNpb24gMCBvciAxLiAgKi8KKworICAvKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgcGFpcnMuICAqLworICBubHNfdWludDMyIG5zdHJpbmdzOworICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN0cmluZ3MuICAqLworICBubHNfdWludDMyIG9yaWdfdGFiX29mZnNldDsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MuICAqLworICBubHNfdWludDMyIHRyYW5zX3RhYl9vZmZzZXQ7CisgIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCisgIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKKyAgLyogT2Zmc2V0IG9mIGZpcnN0IGhhc2ggdGFibGUgZW50cnkuICAqLworICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKKworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWlub3IgcmV2aXNpb24gPj0gMS4gICovCisKKyAgLyogVGhlIG51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KKyAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zZWdtZW50czsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIGRlc2NyaWJpbmcgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCisgIG5sc191aW50MzIgc3lzZGVwX3NlZ21lbnRzX29mZnNldDsKKyAgLyogVGhlIG51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLworICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7CisgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLworICBubHNfdWludDMyIG9yaWdfc3lzZGVwX3RhYl9vZmZzZXQ7CisgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgdHJhbnNfc3lzZGVwX3RhYl9vZmZzZXQ7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzdGF0aWMgc3RyaW5nIGNvbnRhaW5lZCBpbiB0aGUgYmluYXJ5IC5tbyBmaWxlLiAgKi8KK3N0cnVjdCBzdHJpbmdfZGVzYworeworICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgbm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KKyAgbmxzX3VpbnQzMiBsZW5ndGg7CisgIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCisgIG5sc191aW50MzIgb2Zmc2V0OworfTsKKworLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1pbm9yIHJldmlzaW9uID49IDEuICAqLworCisvKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LiAgKi8KK3N0cnVjdCBzeXNkZXBfc2VnbWVudAoreworICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLworICBubHNfdWludDMyIGxlbmd0aDsKKyAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KKyAgbmxzX3VpbnQzMiBvZmZzZXQ7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCitzdHJ1Y3Qgc3lzZGVwX3N0cmluZworeworICAvKiBPZmZzZXQgb2Ygc3RhdGljIHN0cmluZyBzZWdtZW50cyBpbiBmaWxlLiAgKi8KKyAgbmxzX3VpbnQzMiBvZmZzZXQ7CisgIC8qIEFsdGVybmF0aW5nIHNlcXVlbmNlIG9mIHN0YXRpYyBhbmQgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4KKyAgICAgVGhlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXRpYyBzZWdtZW50LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisgIHN0cnVjdCBzZWdtZW50X3BhaXIKKyAgeworICAgIC8qIFNpemUgb2Ygc3RhdGljIHNlZ21lbnQuICAqLworICAgIG5sc191aW50MzIgc2Vnc2l6ZTsKKyAgICAvKiBSZWZlcmVuY2UgdG8gc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudCwgb3IgfjAgYXQgdGhlIGVuZC4gICovCisgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisgIH0gc2VnbWVudHNbMV07Cit9OworCisvKiBNYXJrZXIgZm9yIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnRzW10gYXJyYXkuICBUaGlzIGhhcyB0aGUgdmFsdWUgMHhGRkZGRkZGRiwKKyAgIHJlZ2FyZGxlc3Mgd2hldGhlciAnaW50JyBpcyAxNiBiaXQsIDMyIGJpdCwgb3IgNjQgYml0LiAgKi8KKyNkZWZpbmUgU0VHTUVOVFNfRU5EICgobmxzX3VpbnQzMikgfjApCisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisjZW5kaWYJLyogZ2V0dGV4dC5oICAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2hhc2gtc3RyaW5nLmggYi91bml4L2ludGwvaGFzaC1zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTNlM2IxCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2hhc2gtc3RyaW5nLmgKQEAgLTAsMCArMSw0OCBAQAorLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogV2UgYXNzdW1lIHRvIGhhdmUgYHVuc2lnbmVkIGxvbmcgaW50JyB2YWx1ZSB3aXRoIGF0IGxlYXN0IDMyIGJpdHMuICAqLworI2RlZmluZSBIQVNIV09SREJJVFMgMzIKKworCisvKiBEZWZpbmVzIHRoZSBzbyBjYWxsZWQgYGhhc2hwancnIGZ1bmN0aW9uIGJ5IFAuSi4gV2VpbmJlcmdlcgorICAgW3NlZSBBaG8vU2V0aGkvVWxsbWFuLCBDT01QSUxFUlM6IFByaW5jaXBsZXMsIFRlY2huaXF1ZXMgYW5kIFRvb2xzLAorICAgMTk4NiwgMTk4NyBCZWxsIFRlbGVwaG9uZSBMYWJvcmF0b3JpZXMsIEluYy5dICAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGludAoraGFzaF9zdHJpbmcgKGNvbnN0IGNoYXIgKnN0cl9wYXJhbSkKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKKyAgY29uc3QgY2hhciAqc3RyID0gc3RyX3BhcmFtOworCisgIC8qIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBzdHJpbmcuICAqLworICBodmFsID0gMDsKKyAgd2hpbGUgKCpzdHIgIT0gJ1wwJykKKyAgICB7CisgICAgICBodmFsIDw8PSA0OworICAgICAgaHZhbCArPSAodW5zaWduZWQgY2hhcikgKnN0cisrOworICAgICAgZyA9IGh2YWwgJiAoKHVuc2lnbmVkIGxvbmcgaW50KSAweGYgPDwgKEhBU0hXT1JEQklUUyAtIDQpKTsKKyAgICAgIGlmIChnICE9IDApCisJeworCSAgaHZhbCBePSBnID4+IChIQVNIV09SREJJVFMgLSA4KTsKKwkgIGh2YWwgXj0gZzsKKwl9CisgICAgfQorICByZXR1cm4gaHZhbDsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9pbnRsLWNvbXBhdC5jIGIvdW5peC9pbnRsL2ludGwtY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmOWQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9pbnRsLWNvbXBhdC5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBpbnRsLWNvbXBhdC5jIC0gU3R1YiBmdW5jdGlvbnMgdG8gY2FsbCBnZXR0ZXh0IGZ1bmN0aW9ucyBmcm9tIEdOVSBnZXR0ZXh0CisgICBMaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAyMDAwLTIwMDMgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogVGhpcyBmaWxlIHJlZGlyZWN0cyB0aGUgZ2V0dGV4dCBmdW5jdGlvbnMgKHdpdGhvdXQgcHJlZml4KSB0byB0aG9zZQorICAgZGVmaW5lZCBpbiB0aGUgaW5jbHVkZWQgR05VIGxpYmludGwgbGlicmFyeSAod2l0aCAibGliaW50bF8iIHByZWZpeCkuCisgICBJdCBpcyBjb21waWxlZCBpbnRvIGxpYmludGwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgQU1fR05VX0dFVFRFWFQgdGVzdAorICAgb2YgZ2V0dGV4dCA8PSAwLjExLjIgd29yayB3aXRoIHRoZSBsaWJpbnRsIGxpYnJhcnkgPj0gMC4xMS4zIHdoaWNoCisgICBoYXMgdGhlIHJlZGlyZWN0aW9ucyBwcmltYXJpbHkgaW4gdGhlIDxsaWJpbnRsLmg+IGluY2x1ZGUgZmlsZS4KKyAgIEl0IGlzIGFsc28gY29tcGlsZWQgaW50byBsaWJnbnVpbnRsIHNvIHRoYXQgbGliZ251aW50bC5zbyBjYW4gYmUgdXNlZAorICAgYXMgTERfUFJFTE9BRGFibGUgbGlicmFyeSBvbiBnbGliYyBzeXN0ZW1zLCB0byBwcm92aWRlIHRoZSBleHRyYQorICAgZmVhdHVyZXMgdGhhdCB0aGUgZnVuY3Rpb25zIGluIHRoZSBsaWJjIGRvbid0IGhhdmUgKG5hbWVseSwgbG9nZ2luZykuICAqLworCisKKyN1bmRlZiBnZXR0ZXh0CisjdW5kZWYgZGdldHRleHQKKyN1bmRlZiBkY2dldHRleHQKKyN1bmRlZiBuZ2V0dGV4dAorI3VuZGVmIGRuZ2V0dGV4dAorI3VuZGVmIGRjbmdldHRleHQKKyN1bmRlZiB0ZXh0ZG9tYWluCisjdW5kZWYgYmluZHRleHRkb21haW4KKyN1bmRlZiBiaW5kX3RleHRkb21haW5fY29kZXNldAorCisKKy8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKKyAgIHRoZSBmdW5jdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlCisgICBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW4gYW55IGNhc2UuICAqLworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCisjIGRlZmluZSBETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZWxzZQorIyBkZWZpbmUgRExMX0VYUE9SVEVECisjZW5kaWYKKworCitETExfRVhQT1JURUQKK2NoYXIgKgorZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQpCit7CisgIHJldHVybiBsaWJpbnRsX2dldHRleHQgKG1zZ2lkKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorZGdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkKQoreworICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkY2dldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkLCBpbnQgY2F0ZWdvcnkpCit7CisgIHJldHVybiBsaWJpbnRsX2RjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorbmdldHRleHQgKGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICByZXR1cm4gbGliaW50bF9uZ2V0dGV4dCAobXNnaWQxLCBtc2dpZDIsIG4pOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHJldHVybiBsaWJpbnRsX2RuZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4pOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkY25nZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKwkgICAgaW50IGNhdGVnb3J5KQoreworICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgY2F0ZWdvcnkpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCit0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpkb21haW5uYW1lKQoreworICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChkb21haW5uYW1lKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmRpcm5hbWUpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmNvZGVzZXQpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChkb21haW5uYW1lLCBjb2Rlc2V0KTsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sMTBuZmxpc3QuYyBiL3VuaXgvaW50bC9sMTBuZmxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjk5NWFhCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2wxMG5mbGlzdC5jCkBAIC0wLDAgKzEsNDIxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc3RwY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFCTEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9BUkdaX0gKKyMgaW5jbHVkZSA8YXJnei5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxvYWRpbmZvLmgiCisKKy8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLworI2lmbmRlZiBOVUxMCisjIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KKyMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQorIyBlbHNlCisjICBkZWZpbmUgTlVMTCAwCisjIGVuZGlmCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAorICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworIyBpZm5kZWYgc3RwY3B5CisjICBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIEhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIFBhdGhuYW1lIHN1cHBvcnQuCisgICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgIElTX0FCU09MVVRFX1BBVEgoUCkgIHRlc3RzIHdoZXRoZXIgUCBpcyBhbiBhYnNvbHV0ZSBwYXRoLiAgSWYgaXQgaXMgbm90LAorICAgICAgICAgICAgICAgICAgICAgICAgaXQgbWF5IGJlIGNvbmNhdGVuYXRlZCB0byBhIGRpcmVjdG9yeSBwYXRobmFtZS4KKyAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorICAgICAmJiAoUClbMV0gPT0gJzonKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKKyNlbHNlCisgIC8qIFVuaXggKi8KKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCisjIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIElTU0xBU0ggKChQKVswXSkKKyNlbmRpZgorCisvKiBEZWZpbmUgZnVuY3Rpb24gd2hpY2ggYXJlIHVzdWFsbHkgbm90IGF2YWlsYWJsZS4gICovCisKKyNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9DT1VOVAorLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCitzdGF0aWMgc2l6ZV90Cithcmd6X2NvdW50X18gKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pCit7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7CisgICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKKyAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgcmV0dXJuIGNvdW50OworfQorIyB1bmRlZiBfX2FyZ3pfY291bnQKKyMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQorI2Vsc2UKKyMgaWZkZWYgX0xJQkMKKyMgIGRlZmluZSBfX2FyZ3pfY291bnQoYXJneiwgbGVuKSBJTlRVU0UoX19hcmd6X2NvdW50KSAoYXJneiwgbGVuKQorIyBlbmRpZgorI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfQ09VTlQgKi8KKworI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQorLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncworICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLworc3RhdGljIHZvaWQKK2FyZ3pfc3RyaW5naWZ5X18gKGNoYXIgKmFyZ3osIHNpemVfdCBsZW4sIGludCBzZXApCit7CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7CisgICAgICBhcmd6ICs9IHBhcnRfbGVuOworICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKKyAgICAgIGlmIChsZW4gPiAwKQorCSphcmd6KysgPSBzZXA7CisgICAgfQorfQorIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5CisjIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBhcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKKyNlbHNlCisjIGlmZGVmIF9MSUJDCisjICBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgXAorICBJTlRVU0UoX19hcmd6X3N0cmluZ2lmeSkgKGFyZ3osIGxlbiwgc2VwKQorIyBlbmRpZgorI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCisKKyNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCitzdGF0aWMgY2hhciAqCithcmd6X25leHRfXyAoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLCBjb25zdCBjaGFyICplbnRyeSkKK3sKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKKyAgICAgICAgZW50cnkgPSBzdHJjaHIgKGVudHJ5LCAnXDAnKSArIDE7CisKKyAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7CisgICAgfQorICBlbHNlCisgICAgaWYgKGFyZ3pfbGVuID4gMCkKKyAgICAgIHJldHVybiBhcmd6OworICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworfQorIyB1bmRlZiBfX2FyZ3pfbmV4dAorIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCisjZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9ORVhUICovCisKKworLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3AgKGludCB4KQoreworICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCisgIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKKyAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOworICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7CisgIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7CisKKyAgcmV0dXJuIHg7Cit9CisKKwwKK3N0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgorX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKKwkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwKKwkJICAgIGludCBtYXNrLCBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAorCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAorCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKnNwZWNpYWwsCisJCSAgICBjb25zdCBjaGFyICpzcG9uc29yLCBjb25zdCBjaGFyICpyZXZpc2lvbiwKKwkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpCit7CisgIGNoYXIgKmFic19maWxlbmFtZTsKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmxhc3RwOworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7CisgIGNoYXIgKmNwOworICBzaXplX3QgZGlybGlzdF9jb3VudDsKKyAgc2l6ZV90IGVudHJpZXM7CisgIGludCBjbnQ7CisKKyAgLyogSWYgTEFOR1VBR0UgY29udGFpbnMgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24sIHdlIGlnbm9yZQorICAgICBESVJMSVNULiAgKi8KKyAgaWYgKElTX0FCU09MVVRFX1BBVEggKGxhbmd1YWdlKSkKKyAgICBkaXJsaXN0X2xlbiA9IDA7CisKKyAgLyogQWxsb2NhdGUgcm9vbSBmb3IgdGhlIGZ1bGwgZmlsZSBuYW1lLiAgKi8KKyAgYWJzX2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJsaXN0X2xlbgorCQkJCSAgKyBzdHJsZW4gKGxhbmd1YWdlKQorCQkJCSAgKyAoKG1hc2sgJiBURVJSSVRPUlkpICE9IDAKKwkJCQkgICAgID8gc3RybGVuICh0ZXJyaXRvcnkpICsgMSA6IDApCisJCQkJICArICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCisJCQkJICAgICA/IHN0cmxlbiAoY29kZXNldCkgKyAxIDogMCkKKwkJCQkgICsgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMAorCQkJCSAgICAgPyBzdHJsZW4gKG5vcm1hbGl6ZWRfY29kZXNldCkgKyAxIDogMCkKKwkJCQkgICsgKCgobWFzayAmIFhQR19NT0RJRklFUikgIT0gMAorCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwKQorCQkJCSAgICAgPyBzdHJsZW4gKG1vZGlmaWVyKSArIDEgOiAwKQorCQkJCSAgKyAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMAorCQkJCSAgICAgPyBzdHJsZW4gKHNwZWNpYWwpICsgMSA6IDApCisJCQkJICArICgoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAorCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwKQorCQkJCSAgICAgPyAoMSArICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCisJCQkJCSAgICAgPyBzdHJsZW4gKHNwb25zb3IpIDogMCkKKwkJCQkJKyAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDAKKwkJCQkJICAgPyBzdHJsZW4gKHJldmlzaW9uKSArIDEgOiAwKSkgOiAwKQorCQkJCSAgKyAxICsgc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKKworICBpZiAoYWJzX2ZpbGVuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ29uc3RydWN0IGZpbGUgbmFtZS4gICovCisgIGNwID0gYWJzX2ZpbGVuYW1lOworICBpZiAoZGlybGlzdF9sZW4gPiAwKQorICAgIHsKKyAgICAgIG1lbWNweSAoY3AsIGRpcmxpc3QsIGRpcmxpc3RfbGVuKTsKKyAgICAgIF9fYXJnel9zdHJpbmdpZnkgKGNwLCBkaXJsaXN0X2xlbiwgUEFUSF9TRVBBUkFUT1IpOworICAgICAgY3AgKz0gZGlybGlzdF9sZW47CisgICAgICBjcFstMV0gPSAnLyc7CisgICAgfQorCisgIGNwID0gc3RwY3B5IChjcCwgbGFuZ3VhZ2UpOworCisgIGlmICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICdfJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgdGVycml0b3J5KTsKKyAgICB9CisgIGlmICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwKQorICAgIHsKKyAgICAgICpjcCsrID0gJy4nOworICAgICAgY3AgPSBzdHBjcHkgKGNwLCBjb2Rlc2V0KTsKKyAgICB9CisgIGlmICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApCisgICAgeworICAgICAgKmNwKysgPSAnLic7CisgICAgICBjcCA9IHN0cGNweSAoY3AsIG5vcm1hbGl6ZWRfY29kZXNldCk7CisgICAgfQorICBpZiAoKG1hc2sgJiAoWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBUaGlzIGNvbXBvbmVudCBjYW4gYmUgcGFydCBvZiBib3RoIHN5bnRhY2VzIGJ1dCBoYXMgZGlmZmVyZW50CisJIGxlYWRpbmcgY2hhcmFjdGVycy4gIEZvciBDRU4gd2UgdXNlIGArJywgZWxzZSBgQCcuICAqLworICAgICAgKmNwKysgPSAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCA/ICcrJyA6ICdAJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOworICAgIH0KKyAgaWYgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDApCisgICAgeworICAgICAgKmNwKysgPSAnKyc7CisgICAgICBjcCA9IHN0cGNweSAoY3AsIHNwZWNpYWwpOworICAgIH0KKyAgaWYgKChtYXNrICYgKENFTl9TUE9OU09SIHwgQ0VOX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICcsJzsKKyAgICAgIGlmICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwKQorCWNwID0gc3RwY3B5IChjcCwgc3BvbnNvcik7CisgICAgICBpZiAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCisJeworCSAgKmNwKysgPSAnXyc7CisJICBjcCA9IHN0cGNweSAoY3AsIHJldmlzaW9uKTsKKwl9CisgICAgfQorCisgICpjcCsrID0gJy8nOworICBzdHBjcHkgKGNwLCBmaWxlbmFtZSk7CisKKyAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5CisgICAgIGF2YWlsYWJsZS4gICovCisgIGxhc3RwID0gbDEwbmZpbGVfbGlzdDsKKyAgZm9yIChyZXR2YWwgPSAqbDEwbmZpbGVfbGlzdDsgcmV0dmFsICE9IE5VTEw7IHJldHZhbCA9IHJldHZhbC0+bmV4dCkKKyAgICBpZiAocmV0dmFsLT5maWxlbmFtZSAhPSBOVUxMKQorICAgICAgeworCWludCBjb21wYXJlID0gc3RyY21wIChyZXR2YWwtPmZpbGVuYW1lLCBhYnNfZmlsZW5hbWUpOworCWlmIChjb21wYXJlID09IDApCisJICAvKiBXZSBmb3VuZCBpdCEgICovCisJICBicmVhazsKKwlpZiAoY29tcGFyZSA8IDApCisJICB7CisJICAgIC8qIEl0J3Mgbm90IGluIHRoZSBsaXN0LiAgKi8KKwkgICAgcmV0dmFsID0gTlVMTDsKKwkgICAgYnJlYWs7CisJICB9CisKKwlsYXN0cCA9ICZyZXR2YWwtPm5leHQ7CisgICAgICB9CisKKyAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCisgICAgeworICAgICAgZnJlZSAoYWJzX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgIGRpcmxpc3RfY291bnQgPSAoZGlybGlzdF9sZW4gPiAwID8gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgOiAxKTsKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBsb2FkZWRfbDEwbmZpbGUuICAqLworICByZXR2YWwgPQorICAgIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCisgICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpCisJICAgICsgKCgoZGlybGlzdF9jb3VudCA8PCBwb3AgKG1hc2spKSArIChkaXJsaXN0X2NvdW50ID4gMSA/IDEgOiAwKSkKKwkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikpKTsKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHZhbC0+ZmlsZW5hbWUgPSBhYnNfZmlsZW5hbWU7CisKKyAgLyogV2Ugc2V0IHJldHZhbC0+ZGF0YSB0byBOVUxMIGhlcmU7IGl0IGlzIGZpbGxlZCBpbiBsYXRlci4KKyAgICAgU2V0dGluZyByZXR2YWwtPmRlY2lkZWQgdG8gMSBoZXJlIG1lYW5zIHRoYXQgcmV0dmFsIGRvZXMgbm90CisgICAgIGNvcnJlc3BvbmQgdG8gYSByZWFsIGZpbGUgKGRpcmxpc3RfY291bnQgPiAxKSBvciBpcyBub3Qgd29ydGgKKyAgICAgbG9va2luZyB1cCAoaWYgYW4gdW5ub3JtYWxpemVkIGNvZGVzZXQgd2FzIHNwZWNpZmllZCkuICAqLworICByZXR2YWwtPmRlY2lkZWQgPSAoZGlybGlzdF9jb3VudCA+IDEKKwkJICAgICB8fCAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAorCQkJICYmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpOworICByZXR2YWwtPmRhdGEgPSBOVUxMOworCisgIHJldHZhbC0+bmV4dCA9ICpsYXN0cDsKKyAgKmxhc3RwID0gcmV0dmFsOworCisgIGVudHJpZXMgPSAwOworICAvKiBSZWN1cnNlIHRvIGZpbGwgdGhlIGluaGVyaXRhbmNlIGxpc3Qgb2YgUkVUVkFMLgorICAgICBJZiB0aGUgRElSTElTVCBpcyBhIHJlYWwgbGlzdCAoaS5lLiBESVJMSVNUX0NPVU5UID4gMSksIHRoZSBSRVRWQUwKKyAgICAgZW50cnkgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZTsgcmV0dmFsLT5maWxlbmFtZSBjb250YWlucworICAgICBjb2xvbnMuICBJbiB0aGlzIGNhc2Ugd2UgbG9vcCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIERJUkxJU1QgYW5kCisgICAgIGFjcm9zcyBhbGwgYml0IHBhdHRlcm5zIGRvbWluYXRlZCBieSBNQVNLLgorICAgICBJZiB0aGUgRElSTElTVCBpcyBhIHNpbmdsZSBkaXJlY3Rvcnkgb3IgZW50aXJlbHkgcmVkdW5kYW50IChpLmUuCisgICAgIERJUkxJU1RfQ09VTlQgPT0gMSksIHdlIGxvb3AgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5CisgICAgIE1BU0ssIGV4Y2x1ZGluZyBNQVNLIGl0c2VsZi4KKyAgICAgSW4gZWl0aGVyIGNhc2UsIHdlIGxvb3AgZG93biBmcm9tIE1BU0sgdG8gMC4gIFRoaXMgaGFzIHRoZSBlZmZlY3QKKyAgICAgdGhhdCB0aGUgZXh0cmEgYml0cyBpbiB0aGUgbG9jYWxlIG5hbWUgYXJlIGRyb3BwZWQgaW4gdGhpcyBvcmRlcjoKKyAgICAgZmlyc3QgdGhlIG1vZGlmaWVyLCB0aGVuIHRoZSB0ZXJyaXRvcnksIHRoZW4gdGhlIGNvZGVzZXQsIHRoZW4gdGhlCisgICAgIG5vcm1hbGl6ZWRfY29kZXNldC4gICovCisgIGZvciAoY250ID0gZGlybGlzdF9jb3VudCA+IDEgPyBtYXNrIDogbWFzayAtIDE7IGNudCA+PSAwOyAtLWNudCkKKyAgICBpZiAoKGNudCAmIH5tYXNrKSA9PSAwCisJJiYgKChjbnQgJiBDRU5fU1BFQ0lGSUMpID09IDAgfHwgKGNudCAmIFhQR19TUEVDSUZJQykgPT0gMCkKKwkmJiAoKGNudCAmIFhQR19DT0RFU0VUKSA9PSAwIHx8IChjbnQgJiBYUEdfTk9STV9DT0RFU0VUKSA9PSAwKSkKKyAgICAgIHsKKwlpZiAoZGlybGlzdF9jb3VudCA+IDEpCisJICB7CisJICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgdGhlIERJUkxJU1QuICAqLworCSAgICBjaGFyICpkaXIgPSBOVUxMOworCisJICAgIHdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQorCQkgICAhPSBOVUxMKQorCSAgICAgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KKwkJPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpciwgc3RybGVuIChkaXIpICsgMSwKKwkJCQkgICAgICBjbnQsIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCisJCQkJICAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKKwkJCQkgICAgICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIDEpOworCSAgfQorCWVsc2UKKwkgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KKwkgICAgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLAorCQkJCSAgY250LCBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAorCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKKwkJCQkgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7CisgICAgICB9CisgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXNdID0gTlVMTDsKKworICByZXR1cm4gcmV0dmFsOworfQorDAorLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAorICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KKyAgIG5hbWVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZQorICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCitjb25zdCBjaGFyICoKK19ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwgc2l6ZV90IG5hbWVfbGVuKQoreworICBpbnQgbGVuID0gMDsKKyAgaW50IG9ubHlfZGlnaXQgPSAxOworICBjaGFyICpyZXR2YWw7CisgIGNoYXIgKndwOworICBzaXplX3QgY250OworCisgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQorICAgIGlmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKKyAgICAgIHsKKwkrK2xlbjsKKworCWlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKKwkgIG9ubHlfZGlnaXQgPSAwOworICAgICAgfQorCisgIHJldHZhbCA9IChjaGFyICopIG1hbGxvYyAoKG9ubHlfZGlnaXQgPyAzIDogMCkgKyBsZW4gKyAxKTsKKworICBpZiAocmV0dmFsICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKG9ubHlfZGlnaXQpCisJd3AgPSBzdHBjcHkgKHJldHZhbCwgImlzbyIpOworICAgICAgZWxzZQorCXdwID0gcmV0dmFsOworCisgICAgICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKKwlpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCisJICAqd3ArKyA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pOworCWVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorCSAgKndwKysgPSBjb2Rlc2V0W2NudF07CisKKyAgICAgICp3cCA9ICdcMCc7CisgICAgfQorCisgIHJldHVybiAoY29uc3QgY2hhciAqKSByZXR2YWw7Cit9CisKKworLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisKKy8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCisgICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcworICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKKyAgIHRvIGJlIGRlZmluZWQuICAqLworI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKK3N0YXRpYyBjaGFyICoKK3N0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQoreworICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisgICAgLyogRG8gbm90aGluZy4gKi8gOworICByZXR1cm4gZGVzdCAtIDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9saWJnbnVpbnRsLmguaW4gYi91bml4L2ludGwvbGliZ251aW50bC5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTdlYjkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbGliZ251aW50bC5oLmluCkBAIC0wLDAgKzEsMzgzIEBACisvKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9MSUJJTlRMX0gKKyNkZWZpbmUgX0xJQklOVExfSAkxCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworLyogVGhlIExDX01FU1NBR0VTIGxvY2FsZSBjYXRlZ29yeSBpcyB0aGUgY2F0ZWdvcnkgdXNlZCBieSB0aGUgZnVuY3Rpb25zCisgICBnZXR0ZXh0KCkgYW5kIGRnZXR0ZXh0KCkuICBJdCBpcyBzcGVjaWZpZWQgaW4gUE9TSVgsIGJ1dCBub3QgaW4gQU5TSSBDLgorICAgT24gc3lzdGVtcyB0aGF0IGRvbid0IGRlZmluZSBpdCwgdXNlIGFuIGFyYml0cmFyeSB2YWx1ZSBpbnN0ZWFkLgorICAgT24gU29sYXJpcywgPGxvY2FsZS5oPiBkZWZpbmVzIF9fTE9DQUxFX0ggKG9yIF9MT0NBTEVfSCBpbiBTb2xhcmlzIDIuNSkKKyAgIHRoZW4gaW5jbHVkZXMgPGxpYmludGwuaD4gKGkuZS4gdGhpcyBmaWxlISkgYW5kIHRoZW4gb25seSBkZWZpbmVzCisgICBMQ19NRVNTQUdFUy4gIFRvIGF2b2lkIGEgcmVkZWZpbml0aW9uIHdhcm5pbmcsIGRvbid0IGRlZmluZSBMQ19NRVNTQUdFUworICAgaW4gdGhpcyBjYXNlLiAgKi8KKyNpZiAhZGVmaW5lZCBMQ19NRVNTQUdFUyAmJiAhKGRlZmluZWQgX19MT0NBTEVfSCB8fCAoZGVmaW5lZCBfTE9DQUxFX0ggJiYgZGVmaW5lZCBfX3N1bikpCisjIGRlZmluZSBMQ19NRVNTQUdFUyAxNzI5CisjZW5kaWYKKworLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCisgICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KKyNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQorCisvKiBQcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBwb3J0ZWQgZmlsZSBmb3JtYXRzLiAgUmV0dXJucyB0aGUKKyAgIG1heGltdW0gbWlub3IgcmV2aXNpb24gbnVtYmVyIHN1cHBvcnRlZCBmb3IgYSBnaXZlbiBtYWpvciByZXZpc2lvbi4gICovCisjZGVmaW5lIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKG1ham9yKSBcCisgICgobWFqb3IpID09IDAgPyAxIDogLTEpCisKKy8qIFJlc29sdmUgYSBwbGF0Zm9ybSBzcGVjaWZpYyBjb25mbGljdCBvbiBESkdQUC4gIEdOVSBnZXR0ZXh0IHRha2VzCisgICBwcmVjZWRlbmNlIG92ZXIgX2NvbmlvX2dldHRleHQuICAqLworI2lmZGVmIF9fREpHUFBfXworIyB1bmRlZiBnZXR0ZXh0CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFdlIHJlZGlyZWN0IHRoZSBmdW5jdGlvbnMgdG8gdGhvc2UgcHJlZml4ZWQgd2l0aCAibGliaW50bF8iLiAgVGhpcyBpcworICAgbmVjZXNzYXJ5LCBiZWNhdXNlIHNvbWUgc3lzdGVtcyBkZWZpbmUgZ2V0dGV4dC90ZXh0ZG9tYWluLy4uLiBpbiB0aGUgQworICAgbGlicmFyeSAobmFtZWx5LCBTb2xhcmlzIDIuNCBhbmQgbmV3ZXIsIGFuZCBHTlUgbGliYyAyLjAgYW5kIG5ld2VyKS4KKyAgIElmIHdlIHVzZWQgdGhlIHVucHJlZml4ZWQgbmFtZXMsIHRoZXJlIHdvdWxkIGJlIGNhc2VzIHdoZXJlIHRoZQorICAgZGVmaW5pdGlvbiBpbiB0aGUgQyBsaWJyYXJ5IHdvdWxkIG92ZXJyaWRlIHRoZSBvbmUgaW4gdGhlIGxpYmludGwuc28KKyAgIHNoYXJlZCBsaWJyYXJ5LiAgUmVjYWxsIHRoYXQgb24gRUxGIHN5c3RlbXMsIHRoZSBzeW1ib2xzIGFyZSBsb29rZWQKKyAgIHVwIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgIDEuIGluIHRoZSBleGVjdXRhYmxlLAorICAgICAyLiBpbiB0aGUgc2hhcmVkIGxpYnJhcmllcyBzcGVjaWZpZWQgb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lLCBpbiBvcmRlciwKKyAgICAgMy4gaW4gdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyBzcGVjaWZpZWQgb24gdGhlIGxpbmsKKyAgICAgICAgY29tbWFuZCBsaW5lLAorICAgICA0LiBpbiB0aGUgZGxvcGVuKCllZCBzaGFyZWQgbGlicmFyaWVzLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlCisgICAgICAgIGRsb3BlbigpZWQuCisgICBUaGUgZGVmaW5pdGlvbiBpbiB0aGUgQyBsaWJyYXJ5IHdvdWxkIG92ZXJyaWRlIHRoZSBvbmUgaW4gbGliaW50bC5zbyBpZgorICAgZWl0aGVyCisgICAgICogLWxjIGlzIGdpdmVuIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSBhbmQgLWxpbnRsIGlzbid0LCBvcgorICAgICAqIC1sYyBpcyBnaXZlbiBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUgYmVmb3JlIC1saW50bCwgb3IKKyAgICAgKiBsaWJpbnRsLnNvIGlzIGEgZGVwZW5kZW5jeSBvZiBhIGRsb3BlbigpZWQgc2hhcmVkIGxpYnJhcnkgYnV0IG5vdAorICAgICAgIGxpbmtlZCB0byB0aGUgZXhlY3V0YWJsZSBhdCBsaW5rIHRpbWUuCisgICBTaW5jZSBTb2xhcmlzIGdldHRleHQoKSBiZWhhdmVzIGRpZmZlcmVudGx5IHRoYW4gR05VIGdldHRleHQoKSwgdGhpcworICAgd291bGQgYmUgdW5hY2NlcHRhYmxlLgorCisgICBUaGUgcmVkaXJlY3Rpb24gaGFwcGVucyBieSBkZWZhdWx0IHRocm91Z2ggbWFjcm9zIGluIEMsIHNvIHRoYXQgJmdldHRleHQKKyAgIGlzIGluZGVwZW5kZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBidXQgdGhyb3VnaCBpbmxpbmUgZnVuY3Rpb25zIGluCisgICBDKyssIGluIG9yZGVyIG5vdCB0byBpbnRlcmZlcmUgd2l0aCB0aGUgbmFtZSBtYW5nbGluZyBvZiBjbGFzcyBmaWVsZHMgb3IKKyAgIGNsYXNzIG1ldGhvZHMgY2FsbGVkICdnZXR0ZXh0Jy4gICovCisKKy8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgX0lOVExfUkVESVJFQ1RfSU5MSU5FIG9yIF9JTlRMX1JFRElSRUNUX01BQ1JPUy4KKyAgIElmIGhlIGRvZXNuJ3QsIHdlIGNob29zZSB0aGUgbWV0aG9kLiAgQSB0aGlyZCBwb3NzaWJsZSBtZXRob2QgaXMKKyAgIF9JTlRMX1JFRElSRUNUX0FTTSwgc3VwcG9ydGVkIG9ubHkgYnkgR0NDLiAgKi8KKyNpZiAhKGRlZmluZWQgX0lOVExfUkVESVJFQ1RfSU5MSU5FIHx8IGRlZmluZWQgX0lOVExfUkVESVJFQ1RfTUFDUk9TKQorIyBpZiBfX0dOVUNfXyA+PSAyICYmICFkZWZpbmVkIF9fQVBQTEVfQ0NfXyAmJiAhZGVmaW5lZCBfX01JTkdXMzJfXyAmJiAhKF9fR05VQ19fID09IDIgJiYgZGVmaW5lZCBfQUlYKSAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX0FTTQorIyBlbHNlCisjICBpZmRlZiBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9JTkxJTkUKKyMgIGVsc2UKKyMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisvKiBBdXhpbGlhcnkgbWFjcm9zLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9BU00KKyMgZGVmaW5lIF9JTlRMX0FTTShjbmFtZSkgX19hc21fXyAoX0lOVExfQVNNTkFNRSAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCAjY25hbWUpKQorIyBkZWZpbmUgX0lOVExfQVNNTkFNRShwcmVmaXgsY25hbWVzdHJpbmcpIF9JTlRMX1NUUklOR0lGWSAocHJlZml4KSBjbmFtZXN0cmluZworIyBkZWZpbmUgX0lOVExfU1RSSU5HSUZZKHByZWZpeCkgI3ByZWZpeAorI2Vsc2UKKyMgZGVmaW5lIF9JTlRMX0FTTShjbmFtZSkKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKyAgIHRleHQpLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2dldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpOworc3RhdGljIGlubGluZSBjaGFyICpnZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQoreworICByZXR1cm4gbGliaW50bF9nZXR0ZXh0IChfX21zZ2lkKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBnZXR0ZXh0IGxpYmludGxfZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZ2V0dGV4dCk7CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmRnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpCit7CisgIHJldHVybiBsaWJpbnRsX2RnZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGRnZXR0ZXh0IGxpYmludGxfZGdldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RnZXR0ZXh0KTsKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKKyAgIGxvY2FsZS4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9kY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKKwkJCQlpbnQgX19jYXRlZ29yeSk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmRjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorCQkJICAgICAgIGludCBfX2NhdGVnb3J5KQoreworICByZXR1cm4gbGliaW50bF9kY2dldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZCwgX19jYXRlZ29yeSk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgZGNnZXR0ZXh0IGxpYmludGxfZGNnZXR0ZXh0CisjZW5kaWYKK2V4dGVybiBjaGFyICpkY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKKwkJCWludCBfX2NhdGVnb3J5KQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY2dldHRleHQpOworI2VuZGlmCisKKworLyogU2ltaWxhciB0byBgZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIG51bWJlciBOLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX25nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKK3sKKyAgcmV0dXJuIGxpYmludGxfbmdldHRleHQgKF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBuZ2V0dGV4dCBsaWJpbnRsX25nZXR0ZXh0CisjZW5kaWYKK2V4dGVybiBjaGFyICpuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9uZ2V0dGV4dCk7CisjZW5kaWYKKworLyogU2ltaWxhciB0byBgZGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBudW1iZXIgTi4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9kbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZDEsCisJCQkJY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7CitzdGF0aWMgaW5saW5lIGNoYXIgKmRuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkMSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpfX21zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgX19uKQoreworICByZXR1cm4gbGliaW50bF9kbmdldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZDEsIF9fbXNnaWQyLCBfX24pOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGRuZ2V0dGV4dCBsaWJpbnRsX2RuZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQljb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQl1bnNpZ25lZCBsb25nIGludCBfX24pCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RuZ2V0dGV4dCk7CisjZW5kaWYKKworLyogU2ltaWxhciB0byBgZGNnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgbnVtYmVyIE4uICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpOworc3RhdGljIGlubGluZSBjaGFyICpkY25nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJCXVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpCit7CisgIHJldHVybiBsaWJpbnRsX2RjbmdldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZDEsIF9fbXNnaWQyLCBfX24sIF9fY2F0ZWdvcnkpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGRjbmdldHRleHQgbGliaW50bF9kY25nZXR0ZXh0CisjZW5kaWYKK2V4dGVybiBjaGFyICpkY25nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RjbmdldHRleHQpOworI2VuZGlmCisKKworLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCisgICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF90ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpOworc3RhdGljIGlubGluZSBjaGFyICp0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpCit7CisgIHJldHVybiBsaWJpbnRsX3RleHRkb21haW4gKF9fZG9tYWlubmFtZSk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgdGV4dGRvbWFpbiBsaWJpbnRsX3RleHRkb21haW4KKyNlbmRpZgorZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfdGV4dGRvbWFpbik7CisjZW5kaWYKKworLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCisgICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSAgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKQoreworICByZXR1cm4gbGliaW50bF9iaW5kdGV4dGRvbWFpbiAoX19kb21haW5uYW1lLCBfX2Rpcm5hbWUpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluIGxpYmludGxfYmluZHRleHRkb21haW4KKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfYmluZHRleHRkb21haW4pOworI2VuZGlmCisKKy8qIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiB3aGljaCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUKKyAgIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgcmV0dXJuZWQuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkJICAgICBjb25zdCBjaGFyICpfX2NvZGVzZXQpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChfX2RvbWFpbm5hbWUsIF9fY29kZXNldCk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAorI2VuZGlmCitleHRlcm4gY2hhciAqYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgICAgICBjb25zdCBjaGFyICpfX2NvZGVzZXQpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KTsKKyNlbmRpZgorCisKKy8qIFN1cHBvcnQgZm9yIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zIGluICpwcmludGYoKSwgZm9sbG93aW5nIHRoZQorICAgUE9TSVgvWFNJIHNwZWNpZmljYXRpb24uCisgICBOb3RlOiBUaGVzZSByZXBsYWNlbWVudHMgZm9yIHRoZSAqcHJpbnRmKCkgZnVuY3Rpb25zIGFyZSB2aXNpYmxlIG9ubHkKKyAgIGluIHNvdXJjZSBmaWxlcyB0aGF0ICNpbmNsdWRlIDxsaWJpbnRsLmg+IG9yICNpbmNsdWRlICJnZXR0ZXh0LmgiLgorICAgUGFja2FnZXMgdGhhdCB1c2UgKnByaW50ZigpIGluIHNvdXJjZSBmaWxlcyB0aGF0IGRvbid0IHJlZmVyIHRvIF8oKQorICAgb3IgZ2V0dGV4dCgpIGJ1dCBmb3Igd2hpY2ggdGhlIGZvcm1hdCBzdHJpbmcgY291bGQgYmUgdGhlIHJldHVybiB2YWx1ZQorICAgb2YgXygpIG9yIGdldHRleHQoKSBuZWVkIHRvIGFkZCB0aGlzICNpbmNsdWRlLiAgT2ggd2VsbC4gICovCisKKyNpZiAhQEhBVkVfUE9TSVhfUFJJTlRGQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IHZhX2xpc3QuICAqLworI2lmIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUgorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCisjdW5kZWYgZnByaW50ZgorI2RlZmluZSBmcHJpbnRmIGxpYmludGxfZnByaW50ZgorZXh0ZXJuIGludCBmcHJpbnRmIChGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyN1bmRlZiB2ZnByaW50ZgorI2RlZmluZSB2ZnByaW50ZiBsaWJpbnRsX3ZmcHJpbnRmCitleHRlcm4gaW50IHZmcHJpbnRmIChGSUxFICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyN1bmRlZiBwcmludGYKKyNkZWZpbmUgcHJpbnRmIGxpYmludGxfcHJpbnRmCitleHRlcm4gaW50IHByaW50ZiAoY29uc3QgY2hhciAqLCAuLi4pOworI3VuZGVmIHZwcmludGYKKyNkZWZpbmUgdnByaW50ZiBsaWJpbnRsX3ZwcmludGYKK2V4dGVybiBpbnQgdnByaW50ZiAoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworI3VuZGVmIHNwcmludGYKKyNkZWZpbmUgc3ByaW50ZiBsaWJpbnRsX3NwcmludGYKK2V4dGVybiBpbnQgc3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CisjdW5kZWYgdnNwcmludGYKKyNkZWZpbmUgdnNwcmludGYgbGliaW50bF92c3ByaW50ZgorZXh0ZXJuIGludCB2c3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCisjaWYgQEhBVkVfU05QUklOVEZACisKKyN1bmRlZiBzbnByaW50ZgorI2RlZmluZSBzbnByaW50ZiBsaWJpbnRsX3NucHJpbnRmCitleHRlcm4gaW50IHNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworI3VuZGVmIHZzbnByaW50ZgorI2RlZmluZSB2c25wcmludGYgbGliaW50bF92c25wcmludGYKK2V4dGVybiBpbnQgdnNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworI2VuZGlmCisKKyNpZiBASEFWRV9BU1BSSU5URkAKKworI3VuZGVmIGFzcHJpbnRmCisjZGVmaW5lIGFzcHJpbnRmIGxpYmludGxfYXNwcmludGYKK2V4dGVybiBpbnQgYXNwcmludGYgKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyN1bmRlZiB2YXNwcmludGYKKyNkZWZpbmUgdmFzcHJpbnRmIGxpYmludGxfdmFzcHJpbnRmCitleHRlcm4gaW50IHZhc3ByaW50ZiAoY2hhciAqKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworI2VuZGlmCisKKyNpZiBASEFWRV9XUFJJTlRGQAorCisjdW5kZWYgZndwcmludGYKKyNkZWZpbmUgZndwcmludGYgbGliaW50bF9md3ByaW50ZgorZXh0ZXJuIGludCBmd3ByaW50ZiAoRklMRSAqLCBjb25zdCB3Y2hhcl90ICosIC4uLik7CisjdW5kZWYgdmZ3cHJpbnRmCisjZGVmaW5lIHZmd3ByaW50ZiBsaWJpbnRsX3Zmd3ByaW50ZgorZXh0ZXJuIGludCB2ZndwcmludGYgKEZJTEUgKiwgY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKKworI3VuZGVmIHdwcmludGYKKyNkZWZpbmUgd3ByaW50ZiBsaWJpbnRsX3dwcmludGYKK2V4dGVybiBpbnQgd3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqLCAuLi4pOworI3VuZGVmIHZ3cHJpbnRmCisjZGVmaW5lIHZ3cHJpbnRmIGxpYmludGxfdndwcmludGYKK2V4dGVybiBpbnQgdndwcmludGYgKGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7CisKKyN1bmRlZiBzd3ByaW50ZgorI2RlZmluZSBzd3ByaW50ZiBsaWJpbnRsX3N3cHJpbnRmCitleHRlcm4gaW50IHN3cHJpbnRmICh3Y2hhcl90ICosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOworI3VuZGVmIHZzd3ByaW50ZgorI2RlZmluZSB2c3dwcmludGYgbGliaW50bF92c3dwcmludGYKK2V4dGVybiBpbnQgdnN3cHJpbnRmICh3Y2hhcl90ICosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKKworI2VuZGlmCisKKyNlbmRpZgorCisKKy8qIFN1cHBvcnQgZm9yIHJlbG9jYXRhYmxlIHBhY2thZ2VzLiAgKi8KKworLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisgICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAorICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKyAgIGluc3RlYWQgb2YgIi8iKS4gICovCisjZGVmaW5lIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4CitleHRlcm4gdm9pZAorICAgICAgIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGxpYmludGwuaCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2xvYWRpbmZvLmggYi91bml4L2ludGwvbG9hZGluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU1ZWJkCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2xvYWRpbmZvLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfTE9BRElORk9fSAorI2RlZmluZSBfTE9BRElORk9fSAkxCisKKy8qIERlY2xhcmF0aW9ucyBvZiBsb2NhbGUgZGVwZW5kZW50IGNhdGFsb2cgbG9va3VwIGZ1bmN0aW9ucy4KKyAgIEltcGxlbWVudGVkIGluCisKKyAgICAgbG9jYWxlYWxpYXMuYyAgICBQb3NzaWJseSByZXBsYWNlIGEgbG9jYWxlIG5hbWUgYnkgYW5vdGhlci4KKyAgICAgZXhwbG9kZW5hbWUuYyAgICBTcGxpdCBhIGxvY2FsZSBuYW1lIGludG8gaXRzIHZhcmlvdXMgZmllbGRzLgorICAgICBsMTBuZmxpc3QuYyAgICAgIEdlbmVyYXRlIGEgbGlzdCBvZiBmaWxlbmFtZXMgb2YgcG9zc2libGUgbWVzc2FnZSBjYXRhbG9ncy4KKyAgICAgZmluZGRvbWFpbi5jICAgICBGaW5kIGFuZCBvcGVuIHRoZSByZWxldmFudCBtZXNzYWdlIGNhdGFsb2dzLgorCisgICBUaGUgbWFpbiBmdW5jdGlvbiBfbmxfZmluZF9kb21haW4oKSBpbiBmaW5kZG9tYWluLmMgaXMgZGVjbGFyZWQKKyAgIGluIGdldHRleHRQLmguCisgKi8KKworI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgorIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24KKyNlbmRpZgorCisvKiBUZWxsIHRoZSBjb21waWxlciB3aGVuIGEgY29uZGl0aW9uYWwgb3IgaW50ZWdlciBleHByZXNzaW9uIGlzCisgICBhbG1vc3QgYWx3YXlzIHRydWUgb3IgYWxtb3N0IGFsd2F5cyBmYWxzZS4gICovCisjaWZuZGVmIEhBVkVfQlVJTFRJTl9FWFBFQ1QKKyMgZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoZXhwciwgdmFsKSAoZXhwcikKKyNlbmRpZgorCisvKiBTZXBhcmF0b3IgaW4gUEFUSCBsaWtlIGxpc3RzIG9mIHBhdGhuYW1lcy4gICovCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCisgIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc7JworI2Vsc2UKKyAgLyogVW5peCAqLworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisjZW5kaWYKKworLyogRW5jb2Rpbmcgb2YgbG9jYWxlIG5hbWUgcGFydHMuICAqLworI2RlZmluZSBDRU5fUkVWSVNJT04JCTEKKyNkZWZpbmUgQ0VOX1NQT05TT1IJCTIKKyNkZWZpbmUgQ0VOX1NQRUNJQUwJCTQKKyNkZWZpbmUgWFBHX05PUk1fQ09ERVNFVAk4CisjZGVmaW5lIFhQR19DT0RFU0VUCQkxNgorI2RlZmluZSBURVJSSVRPUlkJCTMyCisjZGVmaW5lIENFTl9BVURJRU5DRQkJNjQKKyNkZWZpbmUgWFBHX01PRElGSUVSCQkxMjgKKworI2RlZmluZSBDRU5fU1BFQ0lGSUMJKENFTl9SRVZJU0lPTnxDRU5fU1BPTlNPUnxDRU5fU1BFQ0lBTHxDRU5fQVVESUVOQ0UpCisjZGVmaW5lIFhQR19TUEVDSUZJQwkoWFBHX0NPREVTRVR8WFBHX05PUk1fQ09ERVNFVHxYUEdfTU9ESUZJRVIpCisKKworc3RydWN0IGxvYWRlZF9sMTBuZmlsZQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgaW50IGRlY2lkZWQ7CisKKyAgY29uc3Qgdm9pZCAqZGF0YTsKKworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpuZXh0OworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpzdWNjZXNzb3JbMV07Cit9OworCisKKy8qIE5vcm1hbGl6ZSBjb2Rlc2V0IG5hbWUuICBUaGVyZSBpcyBubyBzdGFuZGFyZCBmb3IgdGhlIGNvZGVzZXQKKyAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCisgICBuYW1lcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBoYXMgdG8gYmUKKyAgIGZyZWVkIGJ5IHRoZSBjYWxsZXIuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwKKwkJCQkJICBzaXplX3QgbmFtZV9sZW4pOworCisvKiBMb29rdXAgYSBsb2NhbGUgZGVwZW5kZW50IGZpbGUuCisgICAqTDEwTkZJTEVfTElTVCBkZW5vdGVzIGEgcG9vbCBvZiBsb29rdXAgcmVzdWx0cyBvZiBsb2NhbGUgZGVwZW5kZW50CisgICBmaWxlcyBvZiB0aGUgc2FtZSBraW5kLCBzb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlciBvZiAtPmZpbGVuYW1lLgorICAgRElSTElTVCBhbmQgRElSTElTVF9MRU4gYXJlIGFuIGFyZ3ogbGlzdCBvZiBkaXJlY3RvcmllcyBpbiB3aGljaCB0bworICAgbG9vaywgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgZGlyZWN0b3J5IChpLmUuIERJUkxJU1RfTEVOID4gMCkuCisgICBNQVNLLCBMQU5HVUFHRSwgVEVSUklUT1JZLCBDT0RFU0VULCBOT1JNQUxJWkVEX0NPREVTRVQsIE1PRElGSUVSLAorICAgU1BFQ0lBTCwgU1BPTlNPUiwgUkVWSVNJT04gYXJlIHRoZSBwaWVjZXMgb2YgdGhlIGxvY2FsZSBuYW1lLCBhcworICAgcHJvZHVjZWQgYnkgX25sX2V4cGxvZGVfbmFtZSgpLiAgRklMRU5BTUUgaXMgdGhlIGZpbGVuYW1lIHN1ZmZpeC4KKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGxvb2t1cCByZXN1bHQsIGVpdGhlciBmb3VuZCBpbiAqTDEwTkZJTEVfTElTVCwKKyAgIG9yIC0gaWYgRE9fQUxMT0NBVEUgaXMgbm9uemVybyAtIGZyZXNobHkgYWxsb2NhdGVkLCBvciBwb3NzaWJseSBOVUxMLgorICAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub24tTlVMTCwgaXQgaXMgYWRkZWQgdG8gKkwxME5GSUxFX0xJU1QsIGFuZAorICAgaXRzIC0+bmV4dCBmaWVsZCBkZW5vdGVzIHRoZSBjaGFpbmluZyBpbnNpZGUgKkwxME5GSUxFX0xJU1QsIGFuZAorICAgZnVydGhlcm1vcmUgaXRzIC0+c3VjY2Vzc29yW10gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIG90aGVyIGxvb2t1cAorICAgcmVzdWx0cyBmcm9tIHdoaWNoIHRoaXMgbG9va3VwIHJlc3VsdCBpbmhlcml0cy4gICovCitleHRlcm4gc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCitfbmxfbWFrZV9sMTBuZmxpc3QgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAorCQkgICAgY29uc3QgY2hhciAqZGlybGlzdCwgc2l6ZV90IGRpcmxpc3RfbGVuLCBpbnQgbWFzaywKKwkJICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCisJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LCBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCisJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKKwkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSk7CisKKy8qIExvb2t1cCB0aGUgcmVhbCBsb2NhbGUgbmFtZSBmb3IgYSBsb2NhbGUgYWxpYXMgTkFNRSwgb3IgTlVMTCBpZgorICAgTkFNRSBpcyBub3QgYSBsb2NhbGUgYWxpYXMgKGJ1dCBwb3NzaWJseSBhIHJlYWwgbG9jYWxlIG5hbWUpLgorICAgVGhlIHJldHVybiB2YWx1ZSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhbmQgbXVzdCBub3QgYmUgZnJlZWQuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBpdHMgcGllY2VzOiBsYW5ndWFnZSwgbW9kaWZpZXIsCisgICB0ZXJyaXRvcnksIGNvZGVzZXQsIHNwZWNpYWwsIHNwb25zb3IsIHJldmlzaW9uLgorICAgTkFNRSBnZXRzIGRlc3RydWN0aXZlbHkgbW9kaWZpZWQ6IE5VTCBieXRlcyBhcmUgaW5zZXJ0ZWQgaGVyZSBhbmQKKyAgIHRoZXJlLiAgKkxBTkdVQUdFIGdldHMgYXNzaWduZWQgTkFNRS4gIEVhY2ggb2YgKk1PRElGSUVSLCAqVEVSUklUT1JZLAorICAgKkNPREVTRVQsICpTUEVDSUFMLCAqU1BPTlNPUiwgKlJFVklTSU9OIGdldHMgYXNzaWduZWQgZWl0aGVyIGEKKyAgIHBvaW50ZXIgaW50byB0aGUgb2xkIE5BTUUgc3RyaW5nLCBvciBOVUxMLiAgKk5PUk1BTElaRURfQ09ERVNFVAorICAgZ2V0cyBhc3NpZ25lZCB0aGUgZXhwYW5kZWQgKkNPREVTRVQsIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tICpDT0RFU0VUOworICAgdGhpcyBvbmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBoYXMgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBiaXRtYXNrLCB3aGVyZSBlYWNoIGJpdCBjb3JyZXNwb25kcyB0byBvbmUKKyAgIGZpbGxlZC1pbiB2YWx1ZToKKyAgICAgWFBHX01PRElGSUVSLCBDRU5fQVVESUVOQ0UgIGZvciAqTU9ESUZJRVIsCisgICAgIFRFUlJJVE9SWSAgICAgICAgICAgICAgICAgICBmb3IgKlRFUlJJVE9SWSwKKyAgICAgWFBHX0NPREVTRVQgICAgICAgICAgICAgICAgIGZvciAqQ09ERVNFVCwKKyAgICAgWFBHX05PUk1fQ09ERVNFVCAgICAgICAgICAgIGZvciAqTk9STUFMSVpFRF9DT0RFU0VULAorICAgICBDRU5fU1BFQ0lBTCAgICAgICAgICAgICAgICAgZm9yICpTUEVDSUFMLAorICAgICBDRU5fU1BPTlNPUiAgICAgICAgICAgICAgICAgZm9yICpTUE9OU09SLAorICAgICBDRU5fUkVWSVNJT04gICAgICAgICAgICAgICAgZm9yICpSRVZJU0lPTi4KKyAqLworZXh0ZXJuIGludCBfbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCisJCQkgICAgIGNvbnN0IGNoYXIgKiptb2RpZmllciwgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwKKwkJCSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQsCisJCQkgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsCisJCQkgICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsLCBjb25zdCBjaGFyICoqc3BvbnNvciwKKwkJCSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uKTsKKworLyogU3BsaXQgYSBsb2NhbGUgbmFtZSBOQU1FIGludG8gYSBsZWFkaW5nIGxhbmd1YWdlIHBhcnQgYW5kIGFsbCB0aGUKKyAgIHJlc3QuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhbmd1YWdlLAorICAgaS5lLiB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzdC4gICovCitleHRlcm4gY2hhciAqX25sX2ZpbmRfbGFuZ3VhZ2UgKGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYJLyogbG9hZGluZm8uaCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2xvYWRtc2djYXQuYyBiL3VuaXgvaW50bC9sb2FkbXNnY2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljNTFiNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9sb2FkbXNnY2F0LmMKQEAgLTAsMCArMSwxNDIwIEBACisvKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWZkZWYgX19HTlVDX18KKyMgdW5kZWYgIGFsbG9jYQorIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYQorY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsYW5naW5mby5oPgorIyBpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCisjaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAorICAgIHx8IChkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgX1BPU0lYX01BUFBFRF9GSUxFUykKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgdW5kZWYgSEFWRV9NTUFQCisjIGRlZmluZSBIQVZFX01NQVAJMQorI2Vsc2UKKyMgdW5kZWYgSEFWRV9NTUFQCisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQgSEFWRV9JTlRUWVBFU19IIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21vLmgiCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgorI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCisjZW5kaWYKKworLyogUHJvdmlkZSBmYWxsYmFjayB2YWx1ZXMgZm9yIG1hY3JvcyB0aGF0IG91Z2h0IHRvIGJlIGRlZmluZWQgaW4gPGludHR5cGVzLmg+LgorICAgTm90ZSB0aGF0IG91ciBmYWxsYmFjayB2YWx1ZXMgbmVlZCBub3QgYmUgbGl0ZXJhbCBzdHJpbmdzLCBiZWNhdXNlIHdlIGRvbid0CisgICB1c2UgdGhlbSB3aXRoIHByZXByb2Nlc3NvciBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gICovCisjaWYgIWRlZmluZWQgUFJJZDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZDgKKyMgZGVmaW5lIFBSSWQ4ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaTggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaTgKKyMgZGVmaW5lIFBSSWk4ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJbzggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJbzgKKyMgZGVmaW5lIFBSSW84ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdTgKKyMgZGVmaW5lIFBSSXU4ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeDgKKyMgZGVmaW5lIFBSSXg4ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWDgKKyMgZGVmaW5lIFBSSVg4ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWQxNgorIyBkZWZpbmUgUFJJZDE2ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaTE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWkxNgorIyBkZWZpbmUgUFJJaTE2ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJbzE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW8xNgorIyBkZWZpbmUgUFJJbzE2ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXUxNgorIyBkZWZpbmUgUFJJdTE2ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXgxNgorIyBkZWZpbmUgUFJJeDE2ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVgxNgorIyBkZWZpbmUgUFJJWDE2ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWQzMgorIyBkZWZpbmUgUFJJZDMyICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaTMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWkzMgorIyBkZWZpbmUgUFJJaTMyICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJbzMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW8zMgorIyBkZWZpbmUgUFJJbzMyICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXUzMgorIyBkZWZpbmUgUFJJdTMyICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXgzMgorIyBkZWZpbmUgUFJJeDMyICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVgzMgorIyBkZWZpbmUgUFJJWDMyICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWQ2NAorIyBkZWZpbmUgUFJJZDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGQiIDogImxsZCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaTY0CisjIGRlZmluZSBQUklpNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsaSIgOiAibGxpIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW82NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvNjQKKyMgZGVmaW5lIFBSSW82NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxvIiA6ICJsbG8iKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXU2NAorIyBkZWZpbmUgUFJJdTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHUiIDogImxsdSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4NjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeDY0CisjIGRlZmluZSBQUkl4NjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJseCIgOiAibGx4IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYNjQKKyMgZGVmaW5lIFBSSVg2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxYIiA6ICJsbFgiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkTEVBU1Q4CisjIGRlZmluZSBQUklkTEVBU1Q4ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpTEVBU1Q4CisjIGRlZmluZSBQUklpTEVBU1Q4ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvTEVBU1Q4CisjIGRlZmluZSBQUklvTEVBU1Q4ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1TEVBU1Q4CisjIGRlZmluZSBQUkl1TEVBU1Q4ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4TEVBU1Q4CisjIGRlZmluZSBQUkl4TEVBU1Q4ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYTEVBU1Q4CisjIGRlZmluZSBQUklYTEVBU1Q4ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZExFQVNUMTYKKyMgZGVmaW5lIFBSSWRMRUFTVDE2ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUxFQVNUMTYKKyMgZGVmaW5lIFBSSWlMRUFTVDE2ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0xFQVNUMTYKKyMgZGVmaW5lIFBSSW9MRUFTVDE2ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUxFQVNUMTYKKyMgZGVmaW5lIFBSSXVMRUFTVDE2ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeExFQVNUMTYKKyMgZGVmaW5lIFBSSXhMRUFTVDE2ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWExFQVNUMTYKKyMgZGVmaW5lIFBSSVhMRUFTVDE2ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZExFQVNUMzIKKyMgZGVmaW5lIFBSSWRMRUFTVDMyICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUxFQVNUMzIKKyMgZGVmaW5lIFBSSWlMRUFTVDMyICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0xFQVNUMzIKKyMgZGVmaW5lIFBSSW9MRUFTVDMyICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUxFQVNUMzIKKyMgZGVmaW5lIFBSSXVMRUFTVDMyICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeExFQVNUMzIKKyMgZGVmaW5lIFBSSXhMRUFTVDMyICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWExFQVNUMzIKKyMgZGVmaW5lIFBSSVhMRUFTVDMyICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZExFQVNUNjQKKyMgZGVmaW5lIFBSSWRMRUFTVDY0IFBSSWQ2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUxFQVNUNjQKKyMgZGVmaW5lIFBSSWlMRUFTVDY0IFBSSWk2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0xFQVNUNjQKKyMgZGVmaW5lIFBSSW9MRUFTVDY0IFBSSW82NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUxFQVNUNjQKKyMgZGVmaW5lIFBSSXVMRUFTVDY0IFBSSXU2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeExFQVNUNjQKKyMgZGVmaW5lIFBSSXhMRUFTVDY0IFBSSXg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWExFQVNUNjQKKyMgZGVmaW5lIFBSSVhMRUFTVDY0IFBSSVg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRGQVNUOAorIyBkZWZpbmUgUFJJZEZBU1Q4ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlGQVNUOAorIyBkZWZpbmUgUFJJaUZBU1Q4ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9GQVNUOAorIyBkZWZpbmUgUFJJb0ZBU1Q4ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVGQVNUOAorIyBkZWZpbmUgUFJJdUZBU1Q4ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhGQVNUOAorIyBkZWZpbmUgUFJJeEZBU1Q4ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhGQVNUOAorIyBkZWZpbmUgUFJJWEZBU1Q4ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkRkFTVDE2CisjIGRlZmluZSBQUklkRkFTVDE2ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpRkFTVDE2CisjIGRlZmluZSBQUklpRkFTVDE2ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvRkFTVDE2CisjIGRlZmluZSBQUklvRkFTVDE2ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1RkFTVDE2CisjIGRlZmluZSBQUkl1RkFTVDE2ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4RkFTVDE2CisjIGRlZmluZSBQUkl4RkFTVDE2ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYRkFTVDE2CisjIGRlZmluZSBQUklYRkFTVDE2ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkRkFTVDMyCisjIGRlZmluZSBQUklkRkFTVDMyICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpRkFTVDMyCisjIGRlZmluZSBQUklpRkFTVDMyICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvRkFTVDMyCisjIGRlZmluZSBQUklvRkFTVDMyICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1RkFTVDMyCisjIGRlZmluZSBQUkl1RkFTVDMyICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4RkFTVDMyCisjIGRlZmluZSBQUkl4RkFTVDMyICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYRkFTVDMyCisjIGRlZmluZSBQUklYRkFTVDMyICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkRkFTVDY0CisjIGRlZmluZSBQUklkRkFTVDY0IFBSSWQ2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpRkFTVDY0CisjIGRlZmluZSBQUklpRkFTVDY0IFBSSWk2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvRkFTVDY0CisjIGRlZmluZSBQUklvRkFTVDY0IFBSSW82NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1RkFTVDY0CisjIGRlZmluZSBQUkl1RkFTVDY0IFBSSXU2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4RkFTVDY0CisjIGRlZmluZSBQUkl4RkFTVDY0IFBSSXg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYRkFTVDY0CisjIGRlZmluZSBQUklYRkFTVDY0IFBSSVg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkTUFYCisjIGRlZmluZSBQUklkTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiAibGxkIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaU1BWAorIyBkZWZpbmUgUFJJaU1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibGkiIDogImxsaSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9NQVgKKyMgZGVmaW5lIFBSSW9NQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxvIiA6ICJsbG8iKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1TUFYCisjIGRlZmluZSBQUkl1TUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiAibGx1IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeE1BWAorIyBkZWZpbmUgUFJJeE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibHgiIDogImxseCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhNQVgKKyMgZGVmaW5lIFBSSVhNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxYIiA6ICJsbFgiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkUFRSCisjIGRlZmluZSBQUklkUFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxkIiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiZCIgOiBcCisgICAibGxkIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaVBUUgorIyBkZWZpbmUgUFJJaVBUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsaSIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gImkiIDogXAorICAgImxsaSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9QVFIKKyMgZGVmaW5lIFBSSW9QVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibG8iIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJvIiA6IFwKKyAgICJsbG8iKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1UFRSCisjIGRlZmluZSBQUkl1UFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx1IiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAidSIgOiBcCisgICAibGx1IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeFBUUgorIyBkZWZpbmUgUFJJeFBUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJseCIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIngiIDogXAorICAgImxseCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhQVFIKKyMgZGVmaW5lIFBSSVhQVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibFgiIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJYIiA6IFwKKyAgICJsbFgiKQorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworI2lmZGVmIF9MSUJDCisvKiBSZW5hbWUgdGhlIG5vbiBJU08gQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgYmVjYXVzZSBzb21lIElTTyBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0CisgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCisjIGRlZmluZSBvcGVuICAgX19vcGVuCisjIGRlZmluZSBjbG9zZSAgX19jbG9zZQorIyBkZWZpbmUgcmVhZCAgIF9fcmVhZAorIyBkZWZpbmUgbW1hcCAgIF9fbW1hcAorIyBkZWZpbmUgbXVubWFwIF9fbXVubWFwCisjZW5kaWYKKworLyogRm9yIHRob3NlIGxvc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKKyAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCisjaWZkZWYgSEFWRV9BTExPQ0EKKyMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KKyNlbHNlCisjIGRlZmluZSBhbGxvY2EobikgbWFsbG9jIChuKQorIyBkZWZpbmUgZnJlZWEocCkgZnJlZSAocCkKKyNlbmRpZgorCisvKiBGb3Igc3lzdGVtcyB0aGF0IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IEkvTy4KKyAgIE9fQklOQVJZIGlzIHVzdWFsbHkgZGVjbGFyZWQgaW4gPGZjbnRsLmg+LiAqLworI2lmICFkZWZpbmVkIE9fQklOQVJZICYmIGRlZmluZWQgX09fQklOQVJZCisgIC8qIEZvciBNU0MtY29tcGF0aWJsZSBjb21waWxlcnMuICAqLworIyBkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCisjIGRlZmluZSBPX1RFWFQgX09fVEVYVAorI2VuZGlmCisjaWZkZWYgX19CRU9TX18KKyAgLyogQmVPUyA1IGhhcyBPX0JJTkFSWSBhbmQgT19URVhULCBidXQgdGhleSBoYXZlIG5vIGVmZmVjdC4gICovCisjIHVuZGVmIE9fQklOQVJZCisjIHVuZGVmIE9fVEVYVAorI2VuZGlmCisvKiBPbiByZWFzb25hYmxlIHN5c3RlbXMsIGJpbmFyeSBJL08gaXMgdGhlIGRlZmF1bHQuICAqLworI2lmbmRlZiBPX0JJTkFSWQorIyBkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKworLyogV2UgbmVlZCBhIHNpZ24sIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZAorICAgd2l0aCBhbGwgdHJhbnNsYXRpb25zLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgdGhlIHRyYW5zbGF0aW9ucyBhcmUKKyAgIGNhY2hlZCBieSBvbmUgb2YgR0NDJ3MgZmVhdHVyZXMuICAqLworaW50IF9ubF9tc2dfY2F0X2NudHI7CisKKworLyogRXhwYW5kIGEgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudC4gIFJldHVybiBOVUxMIGlmIHVuc3VwcG9ydGVkLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgLyogVGVzdCBmb3IgYW4gSVNPIEMgOTkgc2VjdGlvbiA3LjguMSBmb3JtYXQgc3RyaW5nIGRpcmVjdGl2ZS4KKyAgICAgU3ludGF4OgorICAgICBQIFIgSSB7IGQgfCBpIHwgbyB8IHUgfCB4IHwgWCB9CisgICAgIHsgeyB8IExFQVNUIHwgRkFTVCB9IHsgOCB8IDE2IHwgMzIgfCA2NCB9IHwgTUFYIHwgUFRSIH0gICovCisgIC8qIFdlIGRvbid0IHVzZSBhIHRhYmxlIG9mIDE0IHRpbWVzIDYgJ2NvbnN0IGNoYXIgKicgc3RyaW5ncyBoZXJlLCBiZWNhdXNlCisgICAgIGRhdGEgcmVsb2NhdGlvbnMgY29zdCBzdGFydHVwIHRpbWUuICAqLworICBpZiAobmFtZVswXSA9PSAnUCcgJiYgbmFtZVsxXSA9PSAnUicgJiYgbmFtZVsyXSA9PSAnSScpCisgICAgeworICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnIHx8IG5hbWVbM10gPT0gJ2knIHx8IG5hbWVbM10gPT0gJ28nIHx8IG5hbWVbM10gPT0gJ3UnCisJICB8fCBuYW1lWzNdID09ICd4JyB8fCBuYW1lWzNdID09ICdYJykKKwl7CisJICBpZiAobmFtZVs0XSA9PSAnOCcgJiYgbmFtZVs1XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZDg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaTg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQlyZXR1cm4gUFJJbzg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdTg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeDg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQlyZXR1cm4gUFJJWDg7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICcxJyAmJiBuYW1lWzVdID09ICc2JyAmJiBuYW1lWzZdID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisJCXJldHVybiBQUklkMTY7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaTE2OworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW8xNjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisJCXJldHVybiBQUkl1MTY7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeDE2OworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVgxNjsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJzMnICYmIG5hbWVbNV0gPT0gJzInICYmIG5hbWVbNl0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWQzMjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpMzI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQlyZXR1cm4gUFJJbzMyOworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXUzMjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4MzI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQlyZXR1cm4gUFJJWDMyOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnNicgJiYgbmFtZVs1XSA9PSAnNCcgJiYgbmFtZVs2XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZDY0OworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWk2NDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvNjQ7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdTY0OworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXg2NDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYNjQ7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICdMJyAmJiBuYW1lWzVdID09ICdFJyAmJiBuYW1lWzZdID09ICdBJworCSAgICAgICYmIG5hbWVbN10gPT0gJ1MnICYmIG5hbWVbOF0gPT0gJ1QnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbOV0gPT0gJzgnICYmIG5hbWVbMTBdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZExFQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUxFQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0xFQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUxFQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeExFQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWExFQVNUODsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzldID09ICcxJyAmJiBuYW1lWzEwXSA9PSAnNicgJiYgbmFtZVsxMV0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkTEVBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUxFQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9MRUFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1TEVBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeExFQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhMRUFTVDE2OworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOV0gPT0gJzMnICYmIG5hbWVbMTBdID09ICcyJyAmJiBuYW1lWzExXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRMRUFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpTEVBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0xFQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVMRUFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4TEVBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWExFQVNUMzI7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs5XSA9PSAnNicgJiYgbmFtZVsxMF0gPT0gJzQnICYmIG5hbWVbMTFdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZExFQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlMRUFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvTEVBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUxFQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhMRUFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYTEVBU1Q2NDsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnRicgJiYgbmFtZVs1XSA9PSAnQScgJiYgbmFtZVs2XSA9PSAnUycKKwkgICAgICAmJiBuYW1lWzddID09ICdUJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzhdID09ICc4JyAmJiBuYW1lWzldID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZEZBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpRkFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9GQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUZBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4RkFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhGQVNUODsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzhdID09ICcxJyAmJiBuYW1lWzldID09ICc2JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRGQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlGQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9GQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVGQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhGQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhGQVNUMTY7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs4XSA9PSAnMycgJiYgbmFtZVs5XSA9PSAnMicgJiYgbmFtZVsxMF0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkRkFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpRkFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvRkFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1RkFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4RkFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYRkFTVDMyOworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOF0gPT0gJzYnICYmIG5hbWVbOV0gPT0gJzQnICYmIG5hbWVbMTBdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZEZBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUZBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0ZBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUZBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeEZBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWEZBU1Q2NDsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnTScgJiYgbmFtZVs1XSA9PSAnQScgJiYgbmFtZVs2XSA9PSAnWCcKKwkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisJCXJldHVybiBQUklkTUFYOworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWlNQVg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQlyZXR1cm4gUFJJb01BWDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisJCXJldHVybiBQUkl1TUFYOworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXhNQVg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQlyZXR1cm4gUFJJWE1BWDsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJ1AnICYmIG5hbWVbNV0gPT0gJ1QnICYmIG5hbWVbNl0gPT0gJ1InCisJICAgICAgJiYgbmFtZVs3XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZFBUUjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpUFRSOworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW9QVFI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdVBUUjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4UFRSOworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVhQVFI7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgfQorICAvKiBUZXN0IGZvciBhIGdsaWJjIHNwZWNpZmljIHByaW50ZigpIGZvcm1hdCBkaXJlY3RpdmUgZmxhZy4gICovCisgIGlmIChuYW1lWzBdID09ICdJJyAmJiBuYW1lWzFdID09ICdcMCcpCisgICAgeworI2lmIGRlZmluZWQgX0xJQkMgfHwgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpCisgICAgICAvKiBUaGUgJ0knIGZsYWcsIGluIG51bWVyaWMgZm9ybWF0IGRpcmVjdGl2ZXMsIHJlcGxhY2VzIEFTQ0lJIGRpZ2l0cworCSB3aXRoIHRoZSAnb3V0ZGlnaXRzJyBkZWZpbmVkIGluIHRoZSBMQ19DVFlQRSBsb2NhbGUgZmFjZXQuICBUaGlzIGlzCisJIHVzZWQgZm9yIEZhcnNpIChQZXJzaWFuKSBhbmQgbWF5YmUgQXJhYmljLiAgKi8KKyAgICAgIHJldHVybiAiSSI7CisjZWxzZQorICAgICAgcmV0dXJuICIiOworI2VuZGlmCisgICAgfQorICAvKiBPdGhlciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgYXJlIG5vdCB2YWxpZC4gICovCisgIHJldHVybiBOVUxMOworfQorCisvKiBJbml0aWFsaXplIHRoZSBjb2Rlc2V0IGRlcGVuZGVudCBwYXJ0cyBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLgorICAgUmV0dXJuIHRoZSBoZWFkZXIgZW50cnkuICAqLworY29uc3QgY2hhciAqCitpbnRlcm5hbF9mdW5jdGlvbgorX25sX2luaXRfZG9tYWluX2NvbnYgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorCQkgICAgICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluLAorCQkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKK3sKKyAgLyogRmluZCBvdXQgYWJvdXQgdGhlIGNoYXJhY3RlciBzZXQgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoLgorICAgICBUaGlzIGNhbiBiZSBmb3VuZCAoaW4gdGV4dHVhbCBmb3JtKSBpbiB0aGUgZW50cnkgIiIuICBJZiB0aGlzCisgICAgIGVudHJ5IGRvZXMgbm90IGV4aXN0IG9yIGlmIHRoaXMgZG9lcyBub3QgY29udGFpbiB0aGUgYGNoYXJzZXQ9JworICAgICBpbmZvcm1hdGlvbiwgd2Ugd2lsbCBhc3N1bWUgdGhlIGNoYXJzZXQgbWF0Y2hlcyB0aGUgb25lIHRoZQorICAgICBjdXJyZW50IGxvY2FsZSBhbmQgd2UgZG9uJ3QgaGF2ZSB0byBwZXJmb3JtIGFueSBjb252ZXJzaW9uLiAgKi8KKyAgY2hhciAqbnVsbGVudHJ5OworICBzaXplX3QgbnVsbGVudHJ5bGVuOworCisgIC8qIFByZWluaXRpYWxpemUgZmllbGRzLCB0byBhdm9pZCByZWN1cnNpb24gZHVyaW5nIF9ubF9maW5kX21zZy4gICovCisgIGRvbWFpbi0+Y29kZXNldF9jbnRyID0KKyAgICAoZG9tYWluYmluZGluZyAhPSBOVUxMID8gZG9tYWluYmluZGluZy0+Y29kZXNldF9jbnRyIDogMCk7CisjaWZkZWYgX0xJQkMKKyAgZG9tYWluLT5jb252ID0gKF9fZ2NvbnZfdCkgLTE7CisjZWxzZQorIyBpZiBIQVZFX0lDT05WCisgIGRvbWFpbi0+Y29udiA9IChpY29udl90KSAtMTsKKyMgZW5kaWYKKyNlbmRpZgorICBkb21haW4tPmNvbnZfdGFiID0gTlVMTDsKKworICAvKiBHZXQgdGhlIGhlYWRlciBlbnRyeS4gICovCisgIG51bGxlbnRyeSA9IF9ubF9maW5kX21zZyAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcsICIiLCAmbnVsbGVudHJ5bGVuKTsKKworICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCisgICAgeworI2lmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVgorICAgICAgY29uc3QgY2hhciAqY2hhcnNldHN0cjsKKworICAgICAgY2hhcnNldHN0ciA9IHN0cnN0ciAobnVsbGVudHJ5LCAiY2hhcnNldD0iKTsKKyAgICAgIGlmIChjaGFyc2V0c3RyICE9IE5VTEwpCisJeworCSAgc2l6ZV90IGxlbjsKKwkgIGNoYXIgKmNoYXJzZXQ7CisJICBjb25zdCBjaGFyICpvdXRjaGFyc2V0OworCisJICBjaGFyc2V0c3RyICs9IHN0cmxlbiAoImNoYXJzZXQ9Iik7CisJICBsZW4gPSBzdHJjc3BuIChjaGFyc2V0c3RyLCAiIFx0XG4iKTsKKworCSAgY2hhcnNldCA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMSk7CisjIGlmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9NRU1QQ1BZCisJICAqKChjaGFyICopIG1lbXBjcHkgKGNoYXJzZXQsIGNoYXJzZXRzdHIsIGxlbikpID0gJ1wwJzsKKyMgZWxzZQorCSAgbWVtY3B5IChjaGFyc2V0LCBjaGFyc2V0c3RyLCBsZW4pOworCSAgY2hhcnNldFtsZW5dID0gJ1wwJzsKKyMgZW5kaWYKKworCSAgLyogVGhlIG91dHB1dCBjaGFyc2V0IHNob3VsZCBub3JtYWxseSBiZSBkZXRlcm1pbmVkIGJ5IHRoZQorCSAgICAgbG9jYWxlLiAgQnV0IHNvbWV0aW1lcyB0aGUgbG9jYWxlIGlzIG5vdCB1c2VkIG9yIG5vdCBjb3JyZWN0bHkKKwkgICAgIHNldCB1cCwgc28gd2UgcHJvdmlkZSBhIHBvc3NpYmlsaXR5IGZvciB0aGUgdXNlciB0byBvdmVycmlkZQorCSAgICAgdGhpcy4gIE1vcmVvdmVyLCB0aGUgdmFsdWUgc3BlY2lmaWVkIHRocm91Z2gKKwkgICAgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IG92ZXJyaWRlcyBib3RoLiAgKi8KKwkgIGlmIChkb21haW5iaW5kaW5nICE9IE5VTEwgJiYgZG9tYWluYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQorCSAgICBvdXRjaGFyc2V0ID0gZG9tYWluYmluZGluZy0+Y29kZXNldDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG91dGNoYXJzZXQgPSBnZXRlbnYgKCJPVVRQVVRfQ0hBUlNFVCIpOworCSAgICAgIGlmIChvdXRjaGFyc2V0ID09IE5VTEwgfHwgb3V0Y2hhcnNldFswXSA9PSAnXDAnKQorCQl7CisjIGlmZGVmIF9MSUJDCisJCSAgb3V0Y2hhcnNldCA9IF9OTF9DVVJSRU5UIChMQ19DVFlQRSwgQ09ERVNFVCk7CisjIGVsc2UKKyMgIGlmIEhBVkVfSUNPTlYKKwkJICBleHRlcm4gY29uc3QgY2hhciAqbG9jYWxlX2NoYXJzZXQgKHZvaWQpOworCQkgIG91dGNoYXJzZXQgPSBsb2NhbGVfY2hhcnNldCAoKTsKKyMgIGVuZGlmCisjIGVuZGlmCisJCX0KKwkgICAgfQorCisjIGlmZGVmIF9MSUJDCisJICAvKiBXZSBhbHdheXMgd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0aW9uLiAgKi8KKwkgIG91dGNoYXJzZXQgPSBub3JtX2FkZF9zbGFzaGVzIChvdXRjaGFyc2V0LCAiVFJBTlNMSVQiKTsKKwkgIGNoYXJzZXQgPSBub3JtX2FkZF9zbGFzaGVzIChjaGFyc2V0LCBOVUxMKTsKKwkgIGlmIChfX2djb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQsICZkb21haW4tPmNvbnYsCisJCQkgICAgR0NPTlZfQVZPSURfTk9DT05WKQorCSAgICAgICE9IF9fR0NPTlZfT0spCisJICAgIGRvbWFpbi0+Y29udiA9IChfX2djb252X3QpIC0xOworIyBlbHNlCisjICBpZiBIQVZFX0lDT05WCisJICAvKiBXaGVuIHVzaW5nIEdOVSBsaWJjID49IDIuMiBvciBHTlUgbGliaWNvbnYgPj0gMS41LAorCSAgICAgd2Ugd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0aW9uLiAgKi8KKyMgICBpZiAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpIHx8IF9fR0xJQkNfXyA+IDIgXAorICAgICAgIHx8IF9MSUJJQ09OVl9WRVJTSU9OID49IDB4MDEwNQorCSAgaWYgKHN0cmNociAob3V0Y2hhcnNldCwgJy8nKSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqdG1wOworCisJICAgICAgbGVuID0gc3RybGVuIChvdXRjaGFyc2V0KTsKKwkgICAgICB0bXAgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEwICsgMSk7CisJICAgICAgbWVtY3B5ICh0bXAsIG91dGNoYXJzZXQsIGxlbik7CisJICAgICAgbWVtY3B5ICh0bXAgKyBsZW4sICIvL1RSQU5TTElUIiwgMTAgKyAxKTsKKwkgICAgICBvdXRjaGFyc2V0ID0gdG1wOworCisJICAgICAgZG9tYWluLT5jb252ID0gaWNvbnZfb3BlbiAob3V0Y2hhcnNldCwgY2hhcnNldCk7CisKKwkgICAgICBmcmVlYSAob3V0Y2hhcnNldCk7CisJICAgIH0KKwkgIGVsc2UKKyMgICBlbmRpZgorCSAgICBkb21haW4tPmNvbnYgPSBpY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0KTsKKyMgIGVuZGlmCisjIGVuZGlmCisKKwkgIGZyZWVhIChjaGFyc2V0KTsKKwl9CisjZW5kaWYgLyogX0xJQkMgfHwgSEFWRV9JQ09OViAqLworICAgIH0KKworICByZXR1cm4gbnVsbGVudHJ5OworfQorCisvKiBGcmVlcyB0aGUgY29kZXNldCBkZXBlbmRlbnQgcGFydHMgb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4gICovCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorX25sX2ZyZWVfZG9tYWluX2NvbnYgKHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4pCit7CisgIGlmIChkb21haW4tPmNvbnZfdGFiICE9IE5VTEwgJiYgZG9tYWluLT5jb252X3RhYiAhPSAoY2hhciAqKikgLTEpCisgICAgZnJlZSAoZG9tYWluLT5jb252X3RhYik7CisKKyNpZmRlZiBfTElCQworICBpZiAoZG9tYWluLT5jb252ICE9IChfX2djb252X3QpIC0xKQorICAgIF9fZ2NvbnZfY2xvc2UgKGRvbWFpbi0+Y29udik7CisjZWxzZQorIyBpZiBIQVZFX0lDT05WCisgIGlmIChkb21haW4tPmNvbnYgIT0gKGljb252X3QpIC0xKQorICAgIGljb252X2Nsb3NlIChkb21haW4tPmNvbnYpOworIyBlbmRpZgorI2VuZGlmCit9CisKKy8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKKyAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorCQkgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCit7CisgIGludCBmZDsKKyAgc2l6ZV90IHNpemU7CisjaWZkZWYgX0xJQkMKKyAgc3RydWN0IHN0YXQ2NCBzdDsKKyNlbHNlCisgIHN0cnVjdCBzdGF0IHN0OworI2VuZGlmCisgIHN0cnVjdCBtb19maWxlX2hlYWRlciAqZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTE7CisgIGludCB1c2VfbW1hcCA9IDA7CisgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47CisgIGludCByZXZpc2lvbjsKKyAgY29uc3QgY2hhciAqbnVsbGVudHJ5OworCisgIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gMTsKKyAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOworCisgIC8qIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VsZXNzIHRvIHN0b3JlIGRvbWFpbmJpbmRpbmcgaW4gZG9tYWluX2ZpbGUKKyAgICAgYmVjYXVzZSBkb21haW5iaW5kaW5nIG1pZ2h0IGJlID09IE5VTEwgbm93IGJ1dCAhPSBOVUxMIGxhdGVyIChhZnRlcgorICAgICBhIGNhbGwgdG8gYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpLiAgKi8KKworICAvKiBJZiB0aGUgcmVjb3JkIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGxvY2FsZSB0aGUgRklMRU5BTUUKKyAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KKyAgICAgc3BlY2lmaWNhdGlvbiB0aGUgbG9jYWxlIGZpbGUgbmFtZSBpcyBkaWZmZXJlbnQgZm9yIFhQRyBhbmQgQ0VOCisgICAgIHN5bnRheC4gICovCisgIGlmIChkb21haW5fZmlsZS0+ZmlsZW5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KKyAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOworICBpZiAoZmQgPT0gLTEpCisgICAgcmV0dXJuOworCisgIC8qIFdlIG11c3Qga25vdyBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gICovCisgIGlmICgKKyNpZmRlZiBfTElCQworICAgICAgX19idWlsdGluX2V4cGVjdCAoZnN0YXQ2NCAoZmQsICZzdCkgIT0gMCwgMCkKKyNlbHNlCisgICAgICBfX2J1aWx0aW5fZXhwZWN0IChmc3RhdCAoZmQsICZzdCkgIT0gMCwgMCkKKyNlbmRpZgorICAgICAgfHwgX19idWlsdGluX2V4cGVjdCAoKHNpemUgPSAoc2l6ZV90KSBzdC5zdF9zaXplKSAhPSBzdC5zdF9zaXplLCAwKQorICAgICAgfHwgX19idWlsdGluX2V4cGVjdCAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyKSwgMCkpCisgICAgeworICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLworICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZmRlZiBIQVZFX01NQVAKKyAgLyogTm93IHdlIGFyZSByZWFkeSB0byBsb2FkIHRoZSBmaWxlLiAgSWYgbW1hcCgpIGlzIGF2YWlsYWJsZSB3ZSB0cnkKKyAgICAgdGhpcyBmaXJzdC4gIElmIG5vdCBhdmFpbGFibGUgb3IgaXQgZmFpbGVkIHdlIHRyeSB0byBsb2FkIGl0LiAgKi8KKyAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbW1hcCAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFELAorCQkJCQkgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKworICBpZiAoX19idWlsdGluX2V4cGVjdCAoZGF0YSAhPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xLCAxKSkKKyAgICB7CisgICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCisgICAgICBjbG9zZSAoZmQpOworICAgICAgdXNlX21tYXAgPSAxOworICAgIH0KKyNlbmRpZgorCisgIC8qIElmIHRoZSBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIChpLmUuIG1tYXAnZWQpIHdlIHRyeSB0byBsb2FkCisgICAgIGl0IG1hbnVhbGx5LiAgKi8KKyAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKKyAgICB7CisgICAgICBzaXplX3QgdG9fcmVhZDsKKyAgICAgIGNoYXIgKnJlYWRfcHRyOworCisgICAgICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtYWxsb2MgKHNpemUpOworICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICAgIHRvX3JlYWQgPSBzaXplOworICAgICAgcmVhZF9wdHIgPSAoY2hhciAqKSBkYXRhOworICAgICAgZG8KKwl7CisJICBsb25nIGludCBuYiA9IChsb25nIGludCkgcmVhZCAoZmQsIHJlYWRfcHRyLCB0b19yZWFkKTsKKwkgIGlmIChuYiA8PSAwKQorCSAgICB7CisjaWZkZWYgRUlOVFIKKwkgICAgICBpZiAobmIgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJCWNvbnRpbnVlOworI2VuZGlmCisJICAgICAgY2xvc2UgKGZkKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIHJlYWRfcHRyICs9IG5iOworCSAgdG9fcmVhZCAtPSBuYjsKKwl9CisgICAgICB3aGlsZSAodG9fcmVhZCA+IDApOworCisgICAgICBjbG9zZSAoZmQpOworICAgIH0KKworICAvKiBVc2luZyB0aGUgbWFnaWMgbnVtYmVyIHdlIGNhbiB0ZXN0IHdoZXRoZXIgaXQgcmVhbGx5IGlzIGEgbWVzc2FnZQorICAgICBjYXRhbG9nIGZpbGUuICAqLworICBpZiAoX19idWlsdGluX2V4cGVjdCAoZGF0YS0+bWFnaWMgIT0gX01BR0lDICYmIGRhdGEtPm1hZ2ljICE9IF9NQUdJQ19TV0FQUEVELAorCQkJMCkpCisgICAgeworICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBpcyB3cm9uZzogbm90IGEgbWVzc2FnZSBjYXRhbG9nIGZpbGUuICAqLworI2lmZGVmIEhBVkVfTU1BUAorICAgICAgaWYgKHVzZV9tbWFwKQorCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHNpemUpOworICAgICAgZWxzZQorI2VuZGlmCisJZnJlZSAoZGF0YSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKKyAgaWYgKGRvbWFpbiA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgZG9tYWluX2ZpbGUtPmRhdGEgPSBkb21haW47CisKKyAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKKyAgZG9tYWluLT51c2VfbW1hcCA9IHVzZV9tbWFwOworICBkb21haW4tPm1tYXBfc2l6ZSA9IHNpemU7CisgIGRvbWFpbi0+bXVzdF9zd2FwID0gZGF0YS0+bWFnaWMgIT0gX01BR0lDOworICBkb21haW4tPm1hbGxvY2VkID0gTlVMTDsKKworICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXZhaWxhYmxlIHRhYmxlcy4gICovCisgIHJldmlzaW9uID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKTsKKyAgLyogV2Ugc3VwcG9ydCBvbmx5IHRoZSBtYWpvciByZXZpc2lvbnMgMCBhbmQgMS4gICovCisgIHN3aXRjaCAocmV2aXNpb24gPj4gMTYpCisgICAgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgICBkb21haW4tPm5zdHJpbmdzID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5zdHJpbmdzKTsKKyAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICopCisJKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ190YWJfb2Zmc2V0KSk7CisgICAgICBkb21haW4tPnRyYW5zX3RhYiA9IChjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKKwkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc190YWJfb2Zmc2V0KSk7CisgICAgICBkb21haW4tPmhhc2hfc2l6ZSA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9zaXplKTsKKyAgICAgIGRvbWFpbi0+aGFzaF90YWIgPQorCShkb21haW4tPmhhc2hfc2l6ZSA+IDIKKwkgPyAoY29uc3QgbmxzX3VpbnQzMiAqKQorCSAgICgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpCisJIDogTlVMTCk7CisgICAgICBkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiA9IGRvbWFpbi0+bXVzdF9zd2FwOworCisgICAgICAvKiBOb3cgZGlzcGF0Y2ggb24gdGhlIG1pbm9yIHJldmlzaW9uLiAgKi8KKyAgICAgIHN3aXRjaCAocmV2aXNpb24gJiAweGZmZmYpCisJeworCWNhc2UgMDoKKwkgIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IDA7CisJICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7CisJICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOworCSAgYnJlYWs7CisJY2FzZSAxOgorCWRlZmF1bHQ6CisJICB7CisJICAgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKKworCSAgICBpZiAoZG9tYWluLT5oYXNoX3RhYiA9PSBOVUxMKQorCSAgICAgIC8qIFRoaXMgaXMgaW52YWxpZC4gIFRoZXNlIG1pbm9yIHJldmlzaW9ucyBuZWVkIGEgaGFzaCB0YWJsZS4gICovCisJICAgICAgZ290byBpbnZhbGlkOworCisJICAgIG5fc3lzZGVwX3N0cmluZ3MgPQorCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uX3N5c2RlcF9zdHJpbmdzKTsKKwkgICAgaWYgKG5fc3lzZGVwX3N0cmluZ3MgPiAwKQorCSAgICAgIHsKKwkJbmxzX3VpbnQzMiBuX3N5c2RlcF9zZWdtZW50czsKKwkJY29uc3Qgc3RydWN0IHN5c2RlcF9zZWdtZW50ICpzeXNkZXBfc2VnbWVudHM7CisJCWNvbnN0IGNoYXIgKipzeXNkZXBfc2VnbWVudF92YWx1ZXM7CisJCWNvbnN0IG5sc191aW50MzIgKm9yaWdfc3lzZGVwX3RhYjsKKwkJY29uc3QgbmxzX3VpbnQzMiAqdHJhbnNfc3lzZGVwX3RhYjsKKwkJbmxzX3VpbnQzMiBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOworCQlzaXplX3QgbWVtbmVlZDsKKwkJY2hhciAqbWVtOworCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV9vcmlnX3N5c2RlcF90YWI7CisJCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX3RyYW5zX3N5c2RlcF90YWI7CisJCW5sc191aW50MzIgKmlubWVtX2hhc2hfdGFiOworCQl1bnNpZ25lZCBpbnQgaSwgajsKKworCQkvKiBHZXQgdGhlIHZhbHVlcyBvZiB0aGUgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCisJCW5fc3lzZGVwX3NlZ21lbnRzID0KKwkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bl9zeXNkZXBfc2VnbWVudHMpOworCQlzeXNkZXBfc2VnbWVudHMgPSAoY29uc3Qgc3RydWN0IHN5c2RlcF9zZWdtZW50ICopCisJCSAgKChjaGFyICopIGRhdGEKKwkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+c3lzZGVwX3NlZ21lbnRzX29mZnNldCkpOworCQlzeXNkZXBfc2VnbWVudF92YWx1ZXMgPQorCQkgIGFsbG9jYSAobl9zeXNkZXBfc2VnbWVudHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOworCQlmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc2VnbWVudHM7IGkrKykKKwkJICB7CisJCSAgICBjb25zdCBjaGFyICpuYW1lID0KKwkJICAgICAgKGNoYXIgKikgZGF0YQorCQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc2VnbWVudHNbaV0ub2Zmc2V0KTsKKwkJICAgIG5sc191aW50MzIgbmFtZWxlbiA9CisJCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc2VnbWVudHNbaV0ubGVuZ3RoKTsKKworCQkgICAgaWYgKCEobmFtZWxlbiA+IDAgJiYgbmFtZVtuYW1lbGVuIC0gMV0gPT0gJ1wwJykpCisJCSAgICAgIHsKKwkJCWZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOworCQkJZ290byBpbnZhbGlkOworCQkgICAgICB9CisKKwkJICAgIHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tpXSA9IGdldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAobmFtZSk7CisJCSAgfQorCisJCW9yaWdfc3lzZGVwX3RhYiA9IChjb25zdCBubHNfdWludDMyICopCisJCSAgKChjaGFyICopIGRhdGEKKwkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ19zeXNkZXBfdGFiX29mZnNldCkpOworCQl0cmFuc19zeXNkZXBfdGFiID0gKGNvbnN0IG5sc191aW50MzIgKikKKwkJICAoKGNoYXIgKikgZGF0YQorCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc19zeXNkZXBfdGFiX29mZnNldCkpOworCisJCS8qIENvbXB1dGUgdGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIG1lbW9yeSBuZWVkZWQgZm9yIHRoZQorCQkgICBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgYW5kIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4KKwkJICAgQXQgdGhlIHNhbWUgdGltZSwgYWxzbyBkcm9wIHN0cmluZyBwYWlycyB3aGljaCByZWZlciB0bworCQkgICBhbiB1bmRlZmluZWQgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50LiAgKi8KKwkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncyA9IDA7CisJCW1lbW5lZWQgPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7CisJCWZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zdHJpbmdzOyBpKyspCisJCSAgeworCQkgICAgaW50IHZhbGlkID0gMTsKKwkJICAgIHNpemVfdCBuZWVkc1syXTsKKworCQkgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJICAgICAgeworCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQorCQkJICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKKwkJCSAgKChjaGFyICopIGRhdGEKKwkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJaiA9PSAwCisJCQkJPyBvcmlnX3N5c2RlcF90YWJbaV0KKwkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKKwkJCXNpemVfdCBuZWVkID0gMDsKKwkJCWNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czsKKworCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpICE9IFNFR01FTlRTX0VORCkKKwkJCSAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCisJCQkgICAgeworCQkJICAgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisKKwkJCSAgICAgIG5lZWQgKz0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOworCisJCQkgICAgICBzeXNkZXByZWYgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKKwkJCSAgICAgIGlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQorCQkJCWJyZWFrOworCisJCQkgICAgICBpZiAoc3lzZGVwcmVmID49IG5fc3lzZGVwX3NlZ21lbnRzKQorCQkJCXsKKwkJCQkgIC8qIEludmFsaWQuICAqLworCQkJCSAgZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7CisJCQkJICBnb3RvIGludmFsaWQ7CisJCQkJfQorCisJCQkgICAgICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKKwkJCQl7CisJCQkJICAvKiBUaGlzIHBhcnRpY3VsYXIgc3RyaW5nIHBhaXIgaXMgaW52YWxpZC4gICovCisJCQkJICB2YWxpZCA9IDA7CisJCQkJICBicmVhazsKKwkJCQl9CisKKwkJCSAgICAgIG5lZWQgKz0gc3RybGVuIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSk7CisJCQkgICAgfQorCisJCQluZWVkc1tqXSA9IG5lZWQ7CisJCQlpZiAoIXZhbGlkKQorCQkJICBicmVhazsKKwkJICAgICAgfQorCisJCSAgICBpZiAodmFsaWQpCisJCSAgICAgIHsKKwkJCW5faW5tZW1fc3lzZGVwX3N0cmluZ3MrKzsKKwkJCW1lbW5lZWQgKz0gbmVlZHNbMF0gKyBuZWVkc1sxXTsKKwkJICAgICAgfQorCQkgIH0KKwkJbWVtbmVlZCArPSAyICogbl9pbm1lbV9zeXNkZXBfc3RyaW5ncworCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOworCisJCWlmIChuX2lubWVtX3N5c2RlcF9zdHJpbmdzID4gMCkKKwkJICB7CisJCSAgICB1bnNpZ25lZCBpbnQgazsKKworCQkgICAgLyogQWxsb2NhdGUgYWRkaXRpb25hbCBtZW1vcnkuICAqLworCQkgICAgbWVtID0gKGNoYXIgKikgbWFsbG9jIChtZW1uZWVkKTsKKwkJICAgIGlmIChtZW0gPT0gTlVMTCkKKwkJICAgICAgZ290byBpbnZhbGlkOworCisJCSAgICBkb21haW4tPm1hbGxvY2VkID0gbWVtOworCQkgICAgaW5tZW1fb3JpZ19zeXNkZXBfdGFiID0gKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKikgbWVtOworCQkgICAgbWVtICs9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MKKwkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKKwkJICAgIGlubWVtX3RyYW5zX3N5c2RlcF90YWIgPSAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqKSBtZW07CisJCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncworCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOworCQkgICAgaW5tZW1faGFzaF90YWIgPSAobmxzX3VpbnQzMiAqKSBtZW07CisJCSAgICBtZW0gKz0gZG9tYWluLT5oYXNoX3NpemUgKiBzaXplb2YgKG5sc191aW50MzIpOworCisJCSAgICAvKiBDb21wdXRlIHRoZSBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MuICAqLworCQkgICAgayA9IDA7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQorCQkgICAgICB7CisJCQlpbnQgdmFsaWQgPSAxOworCisJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJICB7CisJCQkgICAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQorCQkJICAgICAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCisJCQkgICAgICAoKGNoYXIgKikgZGF0YQorCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJICAgIGogPT0gMAorCQkJCSAgICA/IG9yaWdfc3lzZGVwX3RhYltpXQorCQkJCSAgICA6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KKwkJCSAgICAgIHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOworCisJCQkgICAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpCisJCQkJIT0gU0VHTUVOVFNfRU5EKQorCQkJICAgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCisJCQkJeworCQkJCSAgbmxzX3VpbnQzMiBzeXNkZXByZWY7CisKKwkJCQkgIHN5c2RlcHJlZiA9CisJCQkJICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOworCQkJCSAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCisJCQkJICAgIGJyZWFrOworCisJCQkJICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKKwkJCQkgICAgeworCQkJCSAgICAgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcworCQkJCQkgaW52YWxpZC4gICovCisJCQkJICAgICAgdmFsaWQgPSAwOworCQkJCSAgICAgIGJyZWFrOworCQkJCSAgICB9CisJCQkJfQorCisJCQkgICAgaWYgKCF2YWxpZCkKKwkJCSAgICAgIGJyZWFrOworCQkJICB9CisKKwkJCWlmICh2YWxpZCkKKwkJCSAgeworCQkJICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisJCQkgICAgICB7CisJCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQorCQkJCSAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCisJCQkJICAoKGNoYXIgKikgZGF0YQorCQkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJCWogPT0gMAorCQkJCQk/IG9yaWdfc3lzZGVwX3RhYltpXQorCQkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKKwkJCQljb25zdCBjaGFyICpzdGF0aWNfc2VnbWVudHMgPQorCQkJCSAgKGNoYXIgKikgZGF0YQorCQkJCSAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3N0cmluZy0+b2Zmc2V0KTsKKwkJCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KKwkJCQkgIHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOworCisJCQkJLyogQ29uY2F0ZW5hdGUgdGhlIHNlZ21lbnRzLCBhbmQgZmlsbAorCQkJCSAgIGlubWVtX29yaWdfc3lzZGVwX3RhYltrXSAoZm9yIGogPT0gMCkgYW5kCisJCQkJICAgaW5tZW1fdHJhbnNfc3lzZGVwX3RhYltrXSAoZm9yIGogPT0gMSkuICAqLworCisJCQkJc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqaW5tZW1fdGFiX2VudHJ5ID0KKwkJCQkgIChqID09IDAKKwkJCQkgICA/IGlubWVtX29yaWdfc3lzZGVwX3RhYgorCQkJCSAgIDogaW5tZW1fdHJhbnNfc3lzZGVwX3RhYikKKwkJCQkgICsgazsKKworCQkJCWlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKQorCQkJCSAgICA9PSBTRUdNRU5UU19FTkQpCisJCQkJICB7CisJCQkJICAgIC8qIE9ubHkgb25lIHN0YXRpYyBzZWdtZW50LiAgKi8KKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQorCQkJCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyID0gc3RhdGljX3NlZ21lbnRzOworCQkJCSAgfQorCQkJCWVsc2UKKwkJCQkgIHsKKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyID0gbWVtOworCisJCQkJICAgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQorCQkJCSAgICAgIHsKKwkJCQkJbmxzX3VpbnQzMiBzZWdzaXplID0KKwkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7CisJCQkJCW5sc191aW50MzIgc3lzZGVwcmVmID0KKwkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKKwkJCQkJc2l6ZV90IG47CisKKwkJCQkJaWYgKHNlZ3NpemUgPiAwKQorCQkJCQkgIHsKKwkJCQkJICAgIG1lbWNweSAobWVtLCBzdGF0aWNfc2VnbWVudHMsIHNlZ3NpemUpOworCQkJCQkgICAgbWVtICs9IHNlZ3NpemU7CisJCQkJCSAgICBzdGF0aWNfc2VnbWVudHMgKz0gc2Vnc2l6ZTsKKwkJCQkJICB9CisKKwkJCQkJaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCisJCQkJCSAgYnJlYWs7CisKKwkJCQkJbiA9IHN0cmxlbiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0pOworCQkJCQltZW1jcHkgKG1lbSwgc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0sIG4pOworCQkJCQltZW0gKz0gbjsKKwkJCQkgICAgICB9CisKKwkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQorCQkJCSAgICAgIG1lbSAtIGlubWVtX3RhYl9lbnRyeS0+cG9pbnRlcjsKKwkJCQkgIH0KKwkJCSAgICAgIH0KKworCQkJICAgIGsrKzsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICBpZiAoayAhPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzKQorCQkgICAgICBhYm9ydCAoKTsKKworCQkgICAgLyogQ29tcHV0ZSB0aGUgYXVnbWVudGVkIGhhc2ggdGFibGUuICAqLworCQkgICAgZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+aGFzaF9zaXplOyBpKyspCisJCSAgICAgIGlubWVtX2hhc2hfdGFiW2ldID0KKwkJCVcgKGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiLCBkb21haW4tPmhhc2hfdGFiW2ldKTsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOyBpKyspCisJCSAgICAgIHsKKwkJCWNvbnN0IGNoYXIgKm1zZ2lkID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiW2ldLnBvaW50ZXI7CisJCQlubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKKwkJCW5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKKwkJCW5sc191aW50MzIgaW5jciA9CisJCQkgIDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7CisKKwkJCWZvciAoOzspCisJCQkgIHsKKwkJCSAgICBpZiAoaW5tZW1faGFzaF90YWJbaWR4XSA9PSAwKQorCQkJICAgICAgeworCQkJCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICBVc2UgaXQuICAqLworCQkJCWlubWVtX2hhc2hfdGFiW2lkeF0gPSAxICsgZG9tYWluLT5uc3RyaW5ncyArIGk7CisJCQkJYnJlYWs7CisJCQkgICAgICB9CisKKwkJCSAgICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKKwkJCSAgICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7CisJCQkgICAgZWxzZQorCQkJICAgICAgaWR4ICs9IGluY3I7CisJCQkgIH0KKwkJICAgICAgfQorCisJCSAgICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOworCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWI7CisJCSAgICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBpbm1lbV90cmFuc19zeXNkZXBfdGFiOworCisJCSAgICBkb21haW4tPmhhc2hfdGFiID0gaW5tZW1faGFzaF90YWI7CisJCSAgICBkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiA9IDA7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKwkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKKwkJICAgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7CisJCSAgfQorCisJCWZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKwkJZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBOVUxMOworCQlkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgcmV2aXNpb24uICAqLworICAgIGludmFsaWQ6CisgICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgLm1vIGZpbGUuICAqLworICAgICAgaWYgKGRvbWFpbi0+bWFsbG9jZWQpCisJZnJlZSAoZG9tYWluLT5tYWxsb2NlZCk7CisjaWZkZWYgSEFWRV9NTUFQCisgICAgICBpZiAodXNlX21tYXApCisJbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc2l6ZSk7CisgICAgICBlbHNlCisjZW5kaWYKKwlmcmVlIChkYXRhKTsKKyAgICAgIGZyZWUgKGRvbWFpbik7CisgICAgICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIE5vdyBpbml0aWFsaXplIHRoZSBjaGFyYWN0ZXIgc2V0IGNvbnZlcnRlciBmcm9tIHRoZSBjaGFyYWN0ZXIgc2V0CisgICAgIHRoZSBmaWxlIGlzIGVuY29kZWQgd2l0aCAoZm91bmQgaW4gdGhlIGhlYWRlciBlbnRyeSkgdG8gdGhlIGRvbWFpbidzCisgICAgIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0IG9yIHRoZSBsb2NhbGUncyBjaGFyYWN0ZXIgc2V0LiAgKi8KKyAgbnVsbGVudHJ5ID0gX25sX2luaXRfZG9tYWluX2NvbnYgKGRvbWFpbl9maWxlLCBkb21haW4sIGRvbWFpbmJpbmRpbmcpOworCisgIC8qIEFsc28gbG9vayBmb3IgYSBwbHVyYWwgc3BlY2lmaWNhdGlvbi4gICovCisgIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKG51bGxlbnRyeSwgJmRvbWFpbi0+cGx1cmFsLCAmZG9tYWluLT5ucGx1cmFscyk7Cit9CisKKworI2lmZGVmIF9MSUJDCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorX25sX3VubG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4pCit7CisgIGlmIChkb21haW4tPnBsdXJhbCAhPSAmX19nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbCkKKyAgICBfX2dldHRleHRfZnJlZV9leHAgKGRvbWFpbi0+cGx1cmFsKTsKKworICBfbmxfZnJlZV9kb21haW5fY29udiAoZG9tYWluKTsKKworICBpZiAoZG9tYWluLT5tYWxsb2NlZCkKKyAgICBmcmVlIChkb21haW4tPm1hbGxvY2VkKTsKKworIyBpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCisgIGlmIChkb21haW4tPnVzZV9tbWFwKQorICAgIG11bm1hcCAoKGNhZGRyX3QpIGRvbWFpbi0+ZGF0YSwgZG9tYWluLT5tbWFwX3NpemUpOworICBlbHNlCisjIGVuZGlmCS8qIF9QT1NJWF9NQVBQRURfRklMRVMgKi8KKyAgICBmcmVlICgodm9pZCAqKSBkb21haW4tPmRhdGEpOworCisgIGZyZWUgKGRvbWFpbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2NhbGNoYXJzZXQuYyBiL3VuaXgvaW50bC9sb2NhbGNoYXJzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODY1ZjEwCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2xvY2FsY2hhcnNldC5jCkBAIC0wLDAgKzEsMzk4IEBACisvKiBEZXRlcm1pbmUgYSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworLyogU3BlY2lmaWNhdGlvbi4gICovCisjaW5jbHVkZSAibG9jYWxjaGFyc2V0LmgiCisKKyNpZiBIQVZFX1NURERFRl9ICisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NURExJQl9ICisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXworIyB1bmRlZiBXSU4zMiAgIC8qIGF2b2lkIHdhcm5pbmcgb24gbWluZ3czMiAqLworIyBkZWZpbmUgV0lOMzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX0VNWF9fCisvKiBBc3N1bWUgRU1YIHByb2dyYW0gcnVucyBvbiBPUy8yLCBldmVuIGlmIGNvbXBpbGVkIHVuZGVyIERPUy4gICovCisjIGRlZmluZSBPUzIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgV0lOMzIKKyMgaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCisjICBpbmNsdWRlIDxsYW5naW5mby5oPgorIyBlbHNlCisjICBpZiBIQVZFX1NFVExPQ0FMRQorIyAgIGluY2x1ZGUgPGxvY2FsZS5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQgV0lOMzIKKyMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZCBPUzIKKyMgZGVmaW5lIElOQ0xfRE9TCisjIGluY2x1ZGUgPG9zMi5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKyMgaW5jbHVkZSAicmVsb2NhdGFibGUuaCIKKyNlbHNlCisjIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKKyNlbmRpZgorCisjaWZuZGVmIERJUkVDVE9SWV9TRVBBUkFUT1IKKyMgZGVmaW5lIERJUkVDVE9SWV9TRVBBUkFUT1IgJy8nCisjZW5kaWYKKworI2lmbmRlZiBJU1NMQVNICisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gRElSRUNUT1JZX1NFUEFSQVRPUikKKyNlbmRpZgorCisjaWYgSEFWRV9ERUNMX0dFVENfVU5MT0NLRUQKKyMgdW5kZWYgZ2V0YworIyBkZWZpbmUgZ2V0YyBnZXRjX3VubG9ja2VkCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBzdGF0aWMgdmFyaWFibGUgaXMgZGVjbGFyZWQgJ3ZvbGF0aWxlJyB0byBhdm9pZCBhCisgICBwb3NzaWJsZSBtdWx0aXRocmVhZCBwcm9ibGVtIGluIHRoZSBmdW5jdGlvbiBnZXRfY2hhcnNldF9hbGlhc2VzLiBJZiB3ZQorICAgYXJlIHJ1bm5pbmcgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudCwgYW5kIGlmIHR3byB0aHJlYWRzIGluaXRpYWxpemUKKyAgICdjaGFyc2V0X2FsaWFzZXMnIHNpbXVsdGFuZW91c2x5LCBib3RoIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSB2YWx1ZSwKKyAgIGFuZCBldmVyeXRoaW5nIHdpbGwgYmUgb2sgaWYgdGhlIHR3byBhc3NpZ25tZW50cyB0byAnY2hhcnNldF9hbGlhc2VzJworICAgYXJlIGF0b21pYy4gQnV0IEkgZG9uJ3Qga25vdyB3aGF0IHdpbGwgaGFwcGVuIGlmIHRoZSB0d28gYXNzaWdubWVudHMgbWl4LiAgKi8KKyNpZiBfX1NURENfXyAhPSAxCisjIGRlZmluZSB2b2xhdGlsZSAvKiBlbXB0eSAqLworI2VuZGlmCisvKiBQb2ludGVyIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCisgICByZWFkLCBlbHNlIE5VTEwuICBJdHMgZm9ybWF0IGlzOgorICAgQUxJQVNfMSAnXDAnIENBTk9OSUNBTF8xICdcMCcgLi4uIEFMSUFTX24gJ1wwJyBDQU5PTklDQUxfbiAnXDAnICdcMCcgICovCitzdGF0aWMgY29uc3QgY2hhciAqIHZvbGF0aWxlIGNoYXJzZXRfYWxpYXNlczsKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29udGVudHMgb2YgdGhlIGNoYXJzZXQuYWxpYXMgZmlsZS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfY2hhcnNldF9hbGlhc2VzICgpCit7CisgIGNvbnN0IGNoYXIgKmNwOworCisgIGNwID0gY2hhcnNldF9hbGlhc2VzOworICBpZiAoY3AgPT0gTlVMTCkKKyAgICB7CisjaWYgIShkZWZpbmVkIFZNUyB8fCBkZWZpbmVkIFdJTjMyKQorICAgICAgRklMRSAqZnA7CisgICAgICBjb25zdCBjaGFyICpkaXIgPSByZWxvY2F0ZSAoTElCRElSKTsKKyAgICAgIGNvbnN0IGNoYXIgKmJhc2UgPSAiY2hhcnNldC5hbGlhcyI7CisgICAgICBjaGFyICpmaWxlX25hbWU7CisKKyAgICAgIC8qIENvbmNhdGVuYXRlIGRpciBhbmQgYmFzZSBpbnRvIGZyZXNobHkgYWxsb2NhdGVkIGZpbGVfbmFtZS4gICovCisgICAgICB7CisJc2l6ZV90IGRpcl9sZW4gPSBzdHJsZW4gKGRpcik7CisJc2l6ZV90IGJhc2VfbGVuID0gc3RybGVuIChiYXNlKTsKKwlpbnQgYWRkX3NsYXNoID0gKGRpcl9sZW4gPiAwICYmICFJU1NMQVNIIChkaXJbZGlyX2xlbiAtIDFdKSk7CisJZmlsZV9uYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJfbGVuICsgYWRkX3NsYXNoICsgYmFzZV9sZW4gKyAxKTsKKwlpZiAoZmlsZV9uYW1lICE9IE5VTEwpCisJICB7CisJICAgIG1lbWNweSAoZmlsZV9uYW1lLCBkaXIsIGRpcl9sZW4pOworCSAgICBpZiAoYWRkX3NsYXNoKQorCSAgICAgIGZpbGVfbmFtZVtkaXJfbGVuXSA9IERJUkVDVE9SWV9TRVBBUkFUT1I7CisJICAgIG1lbWNweSAoZmlsZV9uYW1lICsgZGlyX2xlbiArIGFkZF9zbGFzaCwgYmFzZSwgYmFzZV9sZW4gKyAxKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMIHx8IChmcCA9IGZvcGVuIChmaWxlX25hbWUsICJyIikpID09IE5VTEwpCisJLyogT3V0IG9mIG1lbW9yeSBvciBmaWxlIG5vdCBmb3VuZCwgdHJlYXQgaXQgYXMgZW1wdHkuICAqLworCWNwID0gIiI7CisgICAgICBlbHNlCisJeworCSAgLyogUGFyc2UgdGhlIGZpbGUncyBjb250ZW50cy4gICovCisJICBpbnQgYzsKKwkgIGNoYXIgYnVmMVs1MCsxXTsKKwkgIGNoYXIgYnVmMls1MCsxXTsKKwkgIGNoYXIgKnJlc19wdHIgPSBOVUxMOworCSAgc2l6ZV90IHJlc19zaXplID0gMDsKKwkgIHNpemVfdCBsMSwgbDI7CisKKwkgIGZvciAoOzspCisJICAgIHsKKwkgICAgICBjID0gZ2V0YyAoZnApOworCSAgICAgIGlmIChjID09IEVPRikKKwkJYnJlYWs7CisJICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICcgJyB8fCBjID09ICdcdCcpCisJCWNvbnRpbnVlOworCSAgICAgIGlmIChjID09ICcjJykKKwkJeworCQkgIC8qIFNraXAgY29tbWVudCwgdG8gZW5kIG9mIGxpbmUuICAqLworCQkgIGRvCisJCSAgICBjID0gZ2V0YyAoZnApOworCQkgIHdoaWxlICghKGMgPT0gRU9GIHx8IGMgPT0gJ1xuJykpOworCQkgIGlmIChjID09IEVPRikKKwkJICAgIGJyZWFrOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgdW5nZXRjIChjLCBmcCk7CisJICAgICAgaWYgKGZzY2FuZiAoZnAsICIlNTBzICU1MHMiLCBidWYxLCBidWYyKSA8IDIpCisJCWJyZWFrOworCSAgICAgIGwxID0gc3RybGVuIChidWYxKTsKKwkgICAgICBsMiA9IHN0cmxlbiAoYnVmMik7CisJICAgICAgaWYgKHJlc19zaXplID09IDApCisJCXsKKwkJICByZXNfc2l6ZSA9IGwxICsgMSArIGwyICsgMTsKKwkJICByZXNfcHRyID0gKGNoYXIgKikgbWFsbG9jIChyZXNfc2l6ZSArIDEpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgcmVzX3NpemUgKz0gbDEgKyAxICsgbDIgKyAxOworCQkgIHJlc19wdHIgPSAoY2hhciAqKSByZWFsbG9jIChyZXNfcHRyLCByZXNfc2l6ZSArIDEpOworCQl9CisJICAgICAgaWYgKHJlc19wdHIgPT0gTlVMTCkKKwkJeworCQkgIC8qIE91dCBvZiBtZW1vcnkuICovCisJCSAgcmVzX3NpemUgPSAwOworCQkgIGJyZWFrOworCQl9CisJICAgICAgc3RyY3B5IChyZXNfcHRyICsgcmVzX3NpemUgLSAobDIgKyAxKSAtIChsMSArIDEpLCBidWYxKTsKKwkgICAgICBzdHJjcHkgKHJlc19wdHIgKyByZXNfc2l6ZSAtIChsMiArIDEpLCBidWYyKTsKKwkgICAgfQorCSAgZmNsb3NlIChmcCk7CisJICBpZiAocmVzX3NpemUgPT0gMCkKKwkgICAgY3AgPSAiIjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgICoocmVzX3B0ciArIHJlc19zaXplKSA9ICdcMCc7CisJICAgICAgY3AgPSByZXNfcHRyOworCSAgICB9CisJfQorCisgICAgICBpZiAoZmlsZV9uYW1lICE9IE5VTEwpCisJZnJlZSAoZmlsZV9uYW1lKTsKKworI2Vsc2UKKworIyBpZiBkZWZpbmVkIFZNUworICAgICAgLyogVG8gYXZvaWQgdGhlIHRyb3VibGVzIG9mIGFuIGV4dHJhIGZpbGUgY2hhcnNldC5hbGlhc192bXMgaW4gdGhlCisJIHNvdXJjZXMgb2YgbWFueSBHTlUgcGFja2FnZXMsIHNpbXBseSBpbmxpbmUgdGhlIGFsaWFzZXMgaGVyZS4gICovCisgICAgICAvKiBUaGUgbGlzdCBvZiBlbmNvZGluZ3MgaXMgdGFrZW4gZnJvbSB0aGUgT3BlblZNUyA3LjMtMSBkb2N1bWVudGF0aW9uCisJICJDb21wYXEgQyBSdW4tVGltZSBMaWJyYXJ5IFJlZmVyZW5jZSBNYW51YWwgZm9yIE9wZW5WTVMgc3lzdGVtcyIKKwkgc2VjdGlvbiAxMC43ICJIYW5kbGluZyBEaWZmZXJlbnQgQ2hhcmFjdGVyIFNldHMiLiAgKi8KKyAgICAgIGNwID0gIklTTzg4NTktMSIgIlwwIiAiSVNPLTg4NTktMSIgIlwwIgorCSAgICJJU084ODU5LTIiICJcMCIgIklTTy04ODU5LTIiICJcMCIKKwkgICAiSVNPODg1OS01IiAiXDAiICJJU08tODg1OS01IiAiXDAiCisJICAgIklTTzg4NTktNyIgIlwwIiAiSVNPLTg4NTktNyIgIlwwIgorCSAgICJJU084ODU5LTgiICJcMCIgIklTTy04ODU5LTgiICJcMCIKKwkgICAiSVNPODg1OS05IiAiXDAiICJJU08tODg1OS05IiAiXDAiCisJICAgLyogSmFwYW5lc2UgKi8KKwkgICAiZXVjSlAiICJcMCIgIkVVQy1KUCIgIlwwIgorCSAgICJTSklTIiAiXDAiICJTSElGVF9KSVMiICJcMCIKKwkgICAiREVDS0FOSkkiICJcMCIgIkRFQy1LQU5KSSIgIlwwIgorCSAgICJTREVDS0FOSkkiICJcMCIgIkVVQy1KUCIgIlwwIgorCSAgIC8qIENoaW5lc2UgKi8KKwkgICAiZXVjVFciICJcMCIgIkVVQy1UVyIgIlwwIgorCSAgICJERUNIQU5ZVSIgIlwwIiAiREVDLUhBTllVIiAiXDAiCisJICAgIkRFQ0hBTlpJIiAiXDAiICJHQjIzMTIiICJcMCIKKwkgICAvKiBLb3JlYW4gKi8KKwkgICAiREVDS09SRUFOIiAiXDAiICJFVUMtS1IiICJcMCI7CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBXSU4zMgorICAgICAgLyogVG8gYXZvaWQgdGhlIHRyb3VibGVzIG9mIGluc3RhbGxpbmcgYSBzZXBhcmF0ZSBmaWxlIGluIHRoZSBzYW1lCisJIGRpcmVjdG9yeSBhcyB0aGUgRExMIGFuZCBvZiByZXRyaWV2aW5nIHRoZSBETEwncyBkaXJlY3RvcnkgYXQKKwkgcnVudGltZSwgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KKworICAgICAgY3AgPSAiQ1A5MzYiICJcMCIgIkdCSyIgIlwwIgorCSAgICJDUDEzNjEiICJcMCIgIkpPSEFCIiAiXDAiCisJICAgIkNQMjAxMjciICJcMCIgIkFTQ0lJIiAiXDAiCisJICAgIkNQMjA4NjYiICJcMCIgIktPSTgtUiIgIlwwIgorCSAgICJDUDIxODY2IiAiXDAiICJLT0k4LVJVIiAiXDAiCisJICAgIkNQMjg1OTEiICJcMCIgIklTTy04ODU5LTEiICJcMCIKKwkgICAiQ1AyODU5MiIgIlwwIiAiSVNPLTg4NTktMiIgIlwwIgorCSAgICJDUDI4NTkzIiAiXDAiICJJU08tODg1OS0zIiAiXDAiCisJICAgIkNQMjg1OTQiICJcMCIgIklTTy04ODU5LTQiICJcMCIKKwkgICAiQ1AyODU5NSIgIlwwIiAiSVNPLTg4NTktNSIgIlwwIgorCSAgICJDUDI4NTk2IiAiXDAiICJJU08tODg1OS02IiAiXDAiCisJICAgIkNQMjg1OTciICJcMCIgIklTTy04ODU5LTciICJcMCIKKwkgICAiQ1AyODU5OCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgorCSAgICJDUDI4NTk5IiAiXDAiICJJU08tODg1OS05IiAiXDAiCisJICAgIkNQMjg2MDUiICJcMCIgIklTTy04ODU5LTE1IiAiXDAiOworIyBlbmRpZgorI2VuZGlmCisKKyAgICAgIGNoYXJzZXRfYWxpYXNlcyA9IGNwOworICAgIH0KKworICByZXR1cm4gY3A7Cit9CisKKy8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCBjYW5vbmljYWxpemUgaXQKKyAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgorICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCisgICBJZiB0aGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSByZXN1bHQgaXMgYSBub24tY2Fub25pY2FsCisgICBuYW1lLiAgKi8KKworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZW5kaWYKK2NvbnN0IGNoYXIgKgorbG9jYWxlX2NoYXJzZXQgKCkKK3sKKyAgY29uc3QgY2hhciAqY29kZXNldDsKKyAgY29uc3QgY2hhciAqYWxpYXNlczsKKworI2lmICEoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIE9TMikKKworIyBpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKKworICAvKiBNb3N0IHN5c3RlbXMgc3VwcG9ydCBubF9sYW5naW5mbyAoQ09ERVNFVCkgbm93YWRheXMuICAqLworICBjb2Rlc2V0ID0gbmxfbGFuZ2luZm8gKENPREVTRVQpOworCisjIGVsc2UKKworICAvKiBPbiBvbGQgc3lzdGVtcyB3aGljaCBsYWNrIGl0LCB1c2Ugc2V0bG9jYWxlIG9yIGdldGVudi4gICovCisgIGNvbnN0IGNoYXIgKmxvY2FsZSA9IE5VTEw7CisKKyAgLyogQnV0IG1vc3Qgb2xkIHN5c3RlbXMgZG9uJ3QgaGF2ZSBhIGNvbXBsZXRlIHNldCBvZiBsb2NhbGVzLiAgU29tZQorICAgICAobGlrZSBTdW5PUyA0IG9yIERKR1BQKSBoYXZlIG9ubHkgdGhlIEMgbG9jYWxlLiAgVGhlcmVmb3JlIHdlIGRvbid0CisgICAgIHVzZSBzZXRsb2NhbGUgaGVyZTsgaXQgd291bGQgcmV0dXJuICJDIiB3aGVuIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKKyAgICAgbG9jYWxlIG5hbWUgdGhlIHVzZXIgaGFzIHNldC4gICovCisjICBpZiBIQVZFX1NFVExPQ0FMRSAmJiAwCisgIGxvY2FsZSA9IHNldGxvY2FsZSAoTENfQ1RZUEUsIE5VTEwpOworIyAgZW5kaWYKKyAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOworICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorCXsKKwkgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7CisJICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisJICAgIGxvY2FsZSA9IGdldGVudiAoIkxBTkciKTsKKwl9CisgICAgfQorCisgIC8qIE9uIHNvbWUgb2xkIHN5c3RlbXMsIG9uZSB1c2VkIHRvIHNldCBsb2NhbGUgPSAiaXNvODg1OV8xIi4gT24gb3RoZXJzLAorICAgICB5b3Ugc2V0IGl0IHRvICJsYW5ndWFnZV9DT1VOVFJZLmNoYXJzZXQiLiBJbiBhbnkgY2FzZSwgd2UgcmVzb2x2ZSBpdAorICAgICB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLworICBjb2Rlc2V0ID0gbG9jYWxlOworCisjIGVuZGlmCisKKyNlbGlmIGRlZmluZWQgV0lOMzIKKworICBzdGF0aWMgY2hhciBidWZbMiArIDEwICsgMV07CisKKyAgLyogV29lMzIgaGFzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsb2NhbGUncyBjb2RlcGFnZSBhcyBhIG51bWJlci4gICovCisgIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBHZXRBQ1AgKCkpOworICBjb2Rlc2V0ID0gYnVmOworCisjZWxpZiBkZWZpbmVkIE9TMgorCisgIGNvbnN0IGNoYXIgKmxvY2FsZTsKKyAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOworICBVTE9ORyBjcFszXTsKKyAgVUxPTkcgY3BsZW47CisKKyAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgY29kZXNldCwgYXMgc2V0IGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorICAgICB3aXRoIHN0YW5kYXJkIGxhbmd1YWdlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCisgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisgICAgeworICAgICAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQ1RZUEUiKTsKKyAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKKwlsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7CisgICAgfQorICBpZiAobG9jYWxlICE9IE5VTEwgJiYgbG9jYWxlWzBdICE9ICdcMCcpCisgICAgeworICAgICAgLyogSWYgdGhlIGxvY2FsZSBuYW1lIGNvbnRhaW5zIGFuIGVuY29kaW5nIGFmdGVyIHRoZSBkb3QsIHJldHVybiBpdC4gICovCisgICAgICBjb25zdCBjaGFyICpkb3QgPSBzdHJjaHIgKGxvY2FsZSwgJy4nKTsKKworICAgICAgaWYgKGRvdCAhPSBOVUxMKQorCXsKKwkgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOworCisJICBkb3QrKzsKKwkgIC8qIExvb2sgZm9yIHRoZSBwb3NzaWJsZSBALi4uIHRyYWlsZXIgYW5kIHJlbW92ZSBpdCwgaWYgYW55LiAgKi8KKwkgIG1vZGlmaWVyID0gc3RyY2hyIChkb3QsICdAJyk7CisJICBpZiAobW9kaWZpZXIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGRvdDsKKwkgIGlmIChtb2RpZmllciAtIGRvdCA8IHNpemVvZiAoYnVmKSkKKwkgICAgeworCSAgICAgIG1lbWNweSAoYnVmLCBkb3QsIG1vZGlmaWVyIC0gZG90KTsKKwkgICAgICBidWYgW21vZGlmaWVyIC0gZG90XSA9ICdcMCc7CisJICAgICAgcmV0dXJuIGJ1ZjsKKwkgICAgfQorCX0KKworICAgICAgLyogUmVzb2x2ZSB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLworICAgICAgY29kZXNldCA9IGxvY2FsZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBPUy8yIGhhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbG9jYWxlJ3MgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLworICAgICAgaWYgKERvc1F1ZXJ5Q3AgKHNpemVvZiAoY3ApLCBjcCwgJmNwbGVuKSkKKwljb2Rlc2V0ID0gIiI7CisgICAgICBlbHNlCisJeworCSAgc3ByaW50ZiAoYnVmLCAiQ1AldSIsIGNwWzBdKTsKKwkgIGNvZGVzZXQgPSBidWY7CisJfQorICAgIH0KKworI2VuZGlmCisKKyAgaWYgKGNvZGVzZXQgPT0gTlVMTCkKKyAgICAvKiBUaGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQuICAqLworICAgIGNvZGVzZXQgPSAiIjsKKworICAvKiBSZXNvbHZlIGFsaWFzLiAqLworICBmb3IgKGFsaWFzZXMgPSBnZXRfY2hhcnNldF9hbGlhc2VzICgpOworICAgICAgICphbGlhc2VzICE9ICdcMCc7CisgICAgICAgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSwgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSkKKyAgICBpZiAoc3RyY21wIChjb2Rlc2V0LCBhbGlhc2VzKSA9PSAwCisJfHwgKGFsaWFzZXNbMF0gPT0gJyonICYmIGFsaWFzZXNbMV0gPT0gJ1wwJykpCisgICAgICB7CisJY29kZXNldCA9IGFsaWFzZXMgKyBzdHJsZW4gKGFsaWFzZXMpICsgMTsKKwlicmVhazsKKyAgICAgIH0KKworICAvKiBEb24ndCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLiAgR05VIGxpYmMgYW5kIEdOVSBsaWJpY29udiBpbnRlcnByZXQKKyAgICAgdGhlIGVtcHR5IHN0cmluZyBhcyBkZW5vdGluZyAidGhlIGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZyIsCisgICAgIHRodXMgR05VIGxpYmljb252IHdvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhIHNlY29uZCB0aW1lLiAgKi8KKyAgaWYgKGNvZGVzZXRbMF0gPT0gJ1wwJykKKyAgICBjb2Rlc2V0ID0gIkFTQ0lJIjsKKworICByZXR1cm4gY29kZXNldDsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2NhbGNoYXJzZXQuaCBiL3VuaXgvaW50bC9sb2NhbGNoYXJzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEzN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2xvY2FsY2hhcnNldC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIERldGVybWluZSBhIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQ0hBUlNFVCBMaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfTE9DQUxDSEFSU0VUX0gKKyNkZWZpbmUgX0xPQ0FMQ0hBUlNFVF9ICisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCBjYW5vbmljYWxpemUgaXQKKyAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgorICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCisgICBJZiB0aGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSByZXN1bHQgaXMgYSBub24tY2Fub25pY2FsCisgICBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICogbG9jYWxlX2NoYXJzZXQgKHZvaWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9MT0NBTENIQVJTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2xvY2FsZS5hbGlhcyBiL3VuaXgvaW50bC9sb2NhbGUuYWxpYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YmIyNQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9sb2NhbGUuYWxpYXMKQEAgLTAsMCArMSw3OCBAQAorIyBMb2NhbGUgbmFtZSBhbGlhcyBkYXRhIGJhc2UuCisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyBVU0EuCisKKyMgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgb2YKKyMgdGhlIFggV2luZG93IFN5c3RlbSwgd2hpY2ggbm9ybWFsbHkgY2FuIGJlIGZvdW5kIGluCisjCS91c3IvbGliL1gxMS9sb2NhbGUvbG9jYWxlLmFsaWFzCisjIEEgc2luZ2xlIGxpbmUgY29udGFpbnMgdHdvIGZpZWxkczogYW4gYWxpYXMgYW5kIGEgc3Vic3RpdHV0aW9uIHZhbHVlLgorIyBBbGwgZW50cmllcyBhcmUgY2FzZSBpbmRlcGVuZGVudC4KKworIyBOb3RlOiBUaGlzIGZpbGUgaXMgZmFyIGZyb20gYmVpbmcgY29tcGxldGUuICBJZiB5b3UgaGF2ZSBhIHZhbHVlIGZvcgorIyB5b3VyIG93biBzaXRlIHdoaWNoIHlvdSB0aGluayBtaWdodCBiZSB1c2VmdWwgZm9yIG90aGVycyB0b28sIHNoYXJlCisjIGl0IHdpdGggdGhlIHJlc3Qgb2YgdXMuICBTZW5kIGl0IHVzaW5nIHRoZSBgZ2xpYmNidWcnIHNjcmlwdCB0bworIyBidWdzQGdudS5vcmcuCisKKyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAKKworYm9rbWFsCQluYl9OTy5JU08tODg1OS0xCitib2tt5WwJCW5iX05PLklTTy04ODU5LTEKK2NhdGFsYW4JCWNhX0VTLklTTy04ODU5LTEKK2Nyb2F0aWFuCWhyX0hSLklTTy04ODU5LTIKK2N6ZWNoCQljc19DWi5JU08tODg1OS0yCitkYW5pc2ggICAgICAgICAgZGFfREsuSVNPLTg4NTktMQorZGFuc2sJCWRhX0RLLklTTy04ODU5LTEKK2RldXRzY2gJCWRlX0RFLklTTy04ODU5LTEKK2R1dGNoCQlubF9OTC5JU08tODg1OS0xCitlZXN0aQkJZXRfRUUuSVNPLTg4NTktMQorZXN0b25pYW4JZXRfRUUuSVNPLTg4NTktMQorZmlubmlzaCAgICAgICAgIGZpX0ZJLklTTy04ODU5LTEKK2ZyYW7nYWlzCWZyX0ZSLklTTy04ODU5LTEKK2ZyZW5jaAkJZnJfRlIuSVNPLTg4NTktMQorZ2FsZWdvCQlnbF9FUy5JU08tODg1OS0xCitnYWxpY2lhbglnbF9FUy5JU08tODg1OS0xCitnZXJtYW4JCWRlX0RFLklTTy04ODU5LTEKK2dyZWVrICAgICAgICAgICBlbF9HUi5JU08tODg1OS03CitoZWJyZXcgICAgICAgICAgaGVfSUwuSVNPLTg4NTktOAoraHJ2YXRza2kJaHJfSFIuSVNPLTg4NTktMgoraHVuZ2FyaWFuICAgICAgIGh1X0hVLklTTy04ODU5LTIKK2ljZWxhbmRpYyAgICAgICBpc19JUy5JU08tODg1OS0xCitpdGFsaWFuICAgICAgICAgaXRfSVQuSVNPLTg4NTktMQoramFwYW5lc2UJamFfSlAuZXVjSlAKK2phcGFuZXNlLmV1YwlqYV9KUC5ldWNKUAoramFfSlAJCWphX0pQLmV1Y0pQCitqYV9KUC51amlzCWphX0pQLmV1Y0pQCitqYXBhbmVzZS5zamlzCWphX0pQLlNKSVMKK2tvcmVhbgkJa29fS1IuZXVjS1IKK2tvcmVhbi5ldWMgCWtvX0tSLmV1Y0tSCitrb19LUgkJa29fS1IuZXVjS1IKK2xpdGh1YW5pYW4gICAgICBsdF9MVC5JU08tODg1OS0xMworbm9fTk8JCW5iX05PLklTTy04ODU5LTEKK25vX05PLklTTy04ODU5LTEgbmJfTk8uSVNPLTg4NTktMQorbm9yd2VnaWFuICAgICAgIG5iX05PLklTTy04ODU5LTEKK255bm9yc2sJCW5uX05PLklTTy04ODU5LTEKK3BvbGlzaCAgICAgICAgICBwbF9QTC5JU08tODg1OS0yCitwb3J0dWd1ZXNlICAgICAgcHRfUFQuSVNPLTg4NTktMQorcm9tYW5pYW4gICAgICAgIHJvX1JPLklTTy04ODU5LTIKK3J1c3NpYW4gICAgICAgICBydV9SVS5JU08tODg1OS01CitzbG92YWsgICAgICAgICAgc2tfU0suSVNPLTg4NTktMgorc2xvdmVuZSAgICAgICAgIHNsX1NJLklTTy04ODU5LTIKK3Nsb3ZlbmlhbiAgICAgICBzbF9TSS5JU08tODg1OS0yCitzcGFuaXNoICAgICAgICAgZXNfRVMuSVNPLTg4NTktMQorc3dlZGlzaCAgICAgICAgIHN2X1NFLklTTy04ODU5LTEKK3RoYWkJCXRoX1RILlRJUy02MjAKK3R1cmtpc2ggICAgICAgICB0cl9UUi5JU08tODg1OS05CmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9jYWxlYWxpYXMuYyBiL3VuaXgvaW50bC9sb2NhbGVhbGlhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYWY4ODEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbG9jYWxlYWxpYXMuYwpAQCAtMCwwICsxLDQxNCBAQAorLyogSGFuZGxlIGFsaWFzZXMgZm9yIGxvY2FsZSBuYW1lcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX19fRlNFVExPQ0tJTkcKKyMgaW5jbHVkZSA8c3RkaW9fZXh0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fR05VQ19fCisjIHVuZGVmIGFsbG9jYQorIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYQorY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdldHRleHRQLmgiCisKKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKyMgaW5jbHVkZSAicmVsb2NhdGFibGUuaCIKKyNlbHNlCisjIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworI2lmZGVmIF9MSUJDCisvKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKKyAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKyAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KKyMgZGVmaW5lIHN0cmNhc2VjbXAgX19zdHJjYXNlY21wCisKKyMgaWZuZGVmIG1lbXBjcHkKKyMgIGRlZmluZSBtZW1wY3B5IF9fbWVtcGNweQorIyBlbmRpZgorIyBkZWZpbmUgSEFWRV9NRU1QQ1BZCTEKKyMgZGVmaW5lIEhBVkVfX19GU0VUTE9DS0lORwkxCisKKy8qIFdlIG5lZWQgbG9ja2luZyBoZXJlIHNpbmNlIHdlIGNhbiBiZSBjYWxsZWQgZnJvbSBkaWZmZXJlbnQgcGxhY2VzLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKworX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spOworI2VuZGlmCisKKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisjZW5kaWYKKworLyogU29tZSBvcHRpbWl6YXRpb25zIGZvciBnbGliYy4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEZFT0YoZnApCQlmZW9mX3VubG9ja2VkIChmcCkKKyMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzX3VubG9ja2VkIChidWYsIG4sIGZwKQorI2Vsc2UKKyMgZGVmaW5lIEZFT0YoZnApCQlmZW9mIChmcCkKKyMgZGVmaW5lIEZHRVRTKGJ1ZiwgbiwgZnApCWZnZXRzIChidWYsIG4sIGZwKQorI2VuZGlmCisKKy8qIEZvciB0aG9zZSBsb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisgICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworI2lmZGVmIEhBVkVfQUxMT0NBCisjIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCisjZWxzZQorIyBkZWZpbmUgYWxsb2NhKG4pIG1hbGxvYyAobikKKyMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UIHx8IEhBVkVfREVDTF9GR0VUU19VTkxPQ0tFRAorIyB1bmRlZiBmZ2V0cworIyBkZWZpbmUgZmdldHMoYnVmLCBsZW4sIHMpIGZnZXRzX3VubG9ja2VkIChidWYsIGxlbiwgcykKKyNlbmRpZgorI2lmIGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UIHx8IEhBVkVfREVDTF9GRU9GX1VOTE9DS0VECisjIHVuZGVmIGZlb2YKKyMgZGVmaW5lIGZlb2YocykgZmVvZl91bmxvY2tlZCAocykKKyNlbmRpZgorCisKK3N0cnVjdCBhbGlhc19tYXAKK3sKKyAgY29uc3QgY2hhciAqYWxpYXM7CisgIGNvbnN0IGNoYXIgKnZhbHVlOworfTsKKworCisjaWZuZGVmIF9MSUJDCisjIGRlZmluZSBsaWJjX2ZyZWVyZXNfcHRyKGRlY2wpIGRlY2wKKyNlbmRpZgorCitsaWJjX2ZyZWVyZXNfcHRyIChzdGF0aWMgY2hhciAqc3RyaW5nX3NwYWNlKTsKK3N0YXRpYyBzaXplX3Qgc3RyaW5nX3NwYWNlX2FjdDsKK3N0YXRpYyBzaXplX3Qgc3RyaW5nX3NwYWNlX21heDsKK2xpYmNfZnJlZXJlc19wdHIgKHN0YXRpYyBzdHJ1Y3QgYWxpYXNfbWFwICptYXApOworc3RhdGljIHNpemVfdCBubWFwOworc3RhdGljIHNpemVfdCBtYXhtYXA7CisKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitzdGF0aWMgaW50IGV4dGVuZF9hbGlhc190YWJsZSAodm9pZCk7CitzdGF0aWMgaW50IGFsaWFzX2NvbXBhcmUgKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCisJCQkgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpOworCisKK2NvbnN0IGNoYXIgKgorX25sX2V4cGFuZF9hbGlhcyAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmxvY2FsZV9hbGlhc19wYXRoOworICBzdHJ1Y3QgYWxpYXNfbWFwICpyZXR2YWw7CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIHNpemVfdCBhZGRlZDsKKworI2lmZGVmIF9MSUJDCisgIF9fbGliY19sb2NrX2xvY2sgKGxvY2spOworI2VuZGlmCisKKyAgaWYgKGxvY2FsZV9hbGlhc19wYXRoID09IE5VTEwpCisgICAgbG9jYWxlX2FsaWFzX3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKKworICBkbworICAgIHsKKyAgICAgIHN0cnVjdCBhbGlhc19tYXAgaXRlbTsKKworICAgICAgaXRlbS5hbGlhcyA9IG5hbWU7CisKKyAgICAgIGlmIChubWFwID4gMCkKKwlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAorCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKKwkJCQkJICAgICAgIChpbnQgKCopIChjb25zdCB2b2lkICosCisJCQkJCQkJIGNvbnN0IHZvaWQgKikKKwkJCQkJCSkgYWxpYXNfY29tcGFyZSk7CisgICAgICBlbHNlCisJcmV0dmFsID0gTlVMTDsKKworICAgICAgLyogV2UgcmVhbGx5IGZvdW5kIGFuIGFsaWFzLiAgUmV0dXJuIHRoZSB2YWx1ZS4gICovCisgICAgICBpZiAocmV0dmFsICE9IE5VTEwpCisJeworCSAgcmVzdWx0ID0gcmV0dmFsLT52YWx1ZTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogUGVyaGFwcyB3ZSBjYW4gZmluZCBhbm90aGVyIGFsaWFzIGZpbGUuICAqLworICAgICAgYWRkZWQgPSAwOworICAgICAgd2hpbGUgKGFkZGVkID09IDAgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJykKKwl7CisJICBjb25zdCBjaGFyICpzdGFydDsKKworCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdID09IFBBVEhfU0VQQVJBVE9SKQorCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOworCSAgc3RhcnQgPSBsb2NhbGVfYWxpYXNfcGF0aDsKKworCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcKKwkJICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9IFBBVEhfU0VQQVJBVE9SKQorCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOworCisJICBpZiAoc3RhcnQgPCBsb2NhbGVfYWxpYXNfcGF0aCkKKwkgICAgYWRkZWQgPSByZWFkX2FsaWFzX2ZpbGUgKHN0YXJ0LCBsb2NhbGVfYWxpYXNfcGF0aCAtIHN0YXJ0KTsKKwl9CisgICAgfQorICB3aGlsZSAoYWRkZWQgIT0gMCk7CisKKyNpZmRlZiBfTElCQworICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgc2l6ZV90CitpbnRlcm5hbF9mdW5jdGlvbgorcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKK3sKKyAgRklMRSAqZnA7CisgIGNoYXIgKmZ1bGxfZm5hbWU7CisgIHNpemVfdCBhZGRlZDsKKyAgc3RhdGljIGNvbnN0IGNoYXIgYWxpYXNmaWxlW10gPSAiL2xvY2FsZS5hbGlhcyI7CisKKyAgZnVsbF9mbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZm5hbWVfbGVuICsgc2l6ZW9mIGFsaWFzZmlsZSk7CisjaWZkZWYgSEFWRV9NRU1QQ1BZCisgIG1lbXBjcHkgKG1lbXBjcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pLAorCSAgIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7CisjZWxzZQorICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOworICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7CisjZW5kaWYKKworICBmcCA9IGZvcGVuIChyZWxvY2F0ZSAoZnVsbF9mbmFtZSksICJyIik7CisgIGZyZWVhIChmdWxsX2ZuYW1lKTsKKyAgaWYgKGZwID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyNpZmRlZiBIQVZFX19fRlNFVExPQ0tJTkcKKyAgLyogTm8gdGhyZWFkcyBwcmVzZW50LiAgKi8KKyAgX19mc2V0bG9ja2luZyAoZnAsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKyNlbmRpZgorCisgIGFkZGVkID0gMDsKKyAgd2hpbGUgKCFGRU9GIChmcCkpCisgICAgeworICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCisJIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKKwkgYikgdGhlc2UgZmllbGRzIG11c3QgYmUgdXNhYmxlIGFzIGZpbGUgbmFtZXMgYW5kIHNvIG11c3Qgbm90CisJICAgIGJlIHRoYXQgbG9uZworCSBXZSBhdm9pZCBhIG11bHRpLWtpbG9ieXRlIGJ1ZmZlciBoZXJlIHNpbmNlIHRoaXMgd291bGQgdXNlIHVwCisJIHN0YWNrIHNwYWNlIHdoaWNoIHdlIG1pZ2h0IG5vdCBoYXZlIGlmIHRoZSBwcm9ncmFtIHJhbiBvdXQgb2YKKwkgbWVtb3J5LiAgKi8KKyAgICAgIGNoYXIgYnVmWzQwMF07CisgICAgICBjaGFyICphbGlhczsKKyAgICAgIGNoYXIgKnZhbHVlOworICAgICAgY2hhciAqY3A7CisKKyAgICAgIGlmIChGR0VUUyAoYnVmLCBzaXplb2YgYnVmLCBmcCkgPT0gTlVMTCkKKwkvKiBFT0YgcmVhY2hlZC4gICovCisJYnJlYWs7CisKKyAgICAgIGNwID0gYnVmOworICAgICAgLyogSWdub3JlIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCisJKytjcDsKKworICAgICAgLyogQSBsZWFkaW5nICcjJyBzaWduYWxzIGEgY29tbWVudCBsaW5lLiAgKi8KKyAgICAgIGlmIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcjJykKKwl7CisJICBhbGlhcyA9IGNwKys7CisJICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKKwkgICAgKytjcDsKKwkgIC8qIFRlcm1pbmF0ZSBhbGlhcyBuYW1lLiAgKi8KKwkgIGlmIChjcFswXSAhPSAnXDAnKQorCSAgICAqY3ArKyA9ICdcMCc7CisKKwkgIC8qIE5vdyBsb29rIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2YWx1ZS4gICovCisJICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKKwkgICAgKytjcDsKKworCSAgaWYgKGNwWzBdICE9ICdcMCcpCisJICAgIHsKKwkgICAgICBzaXplX3QgYWxpYXNfbGVuOworCSAgICAgIHNpemVfdCB2YWx1ZV9sZW47CisKKwkgICAgICB2YWx1ZSA9IGNwKys7CisJICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCisJCSsrY3A7CisJICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KKwkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKKwkJeworCQkgIC8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRlc3QKKwkJICAgICBmb3IgdGhlIGVuZCBvZiBsaW5lIHBvc3NpYmxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yCisJCSAgICAgdGhlIHRlcm1pbmF0aW5nICdcbicgd2hpY2ggZG8gbm90IG92ZXJ3cml0ZSBoZXJlLiAgKi8KKwkJICAqY3ArKyA9ICdcMCc7CisJCSAgKmNwID0gJ1xuJzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGNwWzBdICE9ICdcMCcpCisJCSpjcCsrID0gJ1wwJzsKKworCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKKwkJaWYgKF9fYnVpbHRpbl9leHBlY3QgKGV4dGVuZF9hbGlhc190YWJsZSAoKSwgMCkpCisJCSAgcmV0dXJuIGFkZGVkOworCisJICAgICAgYWxpYXNfbGVuID0gc3RybGVuIChhbGlhcykgKyAxOworCSAgICAgIHZhbHVlX2xlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKKworCSAgICAgIGlmIChzdHJpbmdfc3BhY2VfYWN0ICsgYWxpYXNfbGVuICsgdmFsdWVfbGVuID4gc3RyaW5nX3NwYWNlX21heCkKKwkJeworCQkgIC8qIEluY3JlYXNlIHNpemUgb2YgbWVtb3J5IHBvb2wuICAqLworCQkgIHNpemVfdCBuZXdfc2l6ZSA9IChzdHJpbmdfc3BhY2VfbWF4CisJCQkJICAgICArIChhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiAxMDI0CisJCQkJCT8gYWxpYXNfbGVuICsgdmFsdWVfbGVuIDogMTAyNCkpOworCQkgIGNoYXIgKm5ld19wb29sID0gKGNoYXIgKikgcmVhbGxvYyAoc3RyaW5nX3NwYWNlLCBuZXdfc2l6ZSk7CisJCSAgaWYgKG5ld19wb29sID09IE5VTEwpCisJCSAgICByZXR1cm4gYWRkZWQ7CisKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAoc3RyaW5nX3NwYWNlICE9IG5ld19wb29sLCAwKSkKKwkJICAgIHsKKwkJICAgICAgc2l6ZV90IGk7CisKKwkJICAgICAgZm9yIChpID0gMDsgaSA8IG5tYXA7IGkrKykKKwkJCXsKKwkJCSAgbWFwW2ldLmFsaWFzICs9IG5ld19wb29sIC0gc3RyaW5nX3NwYWNlOworCQkJICBtYXBbaV0udmFsdWUgKz0gbmV3X3Bvb2wgLSBzdHJpbmdfc3BhY2U7CisJCQl9CisJCSAgICB9CisKKwkJICBzdHJpbmdfc3BhY2UgPSBuZXdfcG9vbDsKKwkJICBzdHJpbmdfc3BhY2VfbWF4ID0gbmV3X3NpemU7CisJCX0KKworCSAgICAgIG1hcFtubWFwXS5hbGlhcyA9IG1lbWNweSAoJnN0cmluZ19zcGFjZVtzdHJpbmdfc3BhY2VfYWN0XSwKKwkJCQkJYWxpYXMsIGFsaWFzX2xlbik7CisJICAgICAgc3RyaW5nX3NwYWNlX2FjdCArPSBhbGlhc19sZW47CisKKwkgICAgICBtYXBbbm1hcF0udmFsdWUgPSBtZW1jcHkgKCZzdHJpbmdfc3BhY2Vbc3RyaW5nX3NwYWNlX2FjdF0sCisJCQkJCXZhbHVlLCB2YWx1ZV9sZW4pOworCSAgICAgIHN0cmluZ19zcGFjZV9hY3QgKz0gdmFsdWVfbGVuOworCisJICAgICAgKytubWFwOworCSAgICAgICsrYWRkZWQ7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFBvc3NpYmx5IG5vdCB0aGUgd2hvbGUgbGluZSBmaXRzIGludG8gdGhlIGJ1ZmZlci4gIElnbm9yZQorCSB0aGUgcmVzdCBvZiB0aGUgbGluZS4gICovCisgICAgICB3aGlsZSAoc3RyY2hyIChidWYsICdcbicpID09IE5VTEwpCisJaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQorCSAgLyogTWFrZSBzdXJlIHRoZSBpbm5lciBsb29wIHdpbGwgYmUgbGVmdC4gIFRoZSBvdXRlciBsb29wCisJICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KKwkgIGJyZWFrOworICAgIH0KKworICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCisgICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KKyAgZmNsb3NlIChmcCk7CisKKyAgaWYgKGFkZGVkID4gMCkKKyAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAorCSAgIChpbnQgKCopIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIGFsaWFzX2NvbXBhcmUpOworCisgIHJldHVybiBhZGRlZDsKK30KKworCitzdGF0aWMgaW50CitleHRlbmRfYWxpYXNfdGFibGUgKCkKK3sKKyAgc2l6ZV90IG5ld19zaXplOworICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOworCisgIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOworICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgcmVhbGxvYyAobWFwLCAobmV3X3NpemUKKwkJCQkJCSogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSkpOworICBpZiAobmV3X21hcCA9PSBOVUxMKQorICAgIC8qIFNpbXBseSBkb24ndCBleHRlbmQ6IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29yZS4gICovCisgICAgcmV0dXJuIC0xOworCisgIG1hcCA9IG5ld19tYXA7CisgIG1heG1hcCA9IG5ld19zaXplOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CithbGlhc19jb21wYXJlIChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLCBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKQoreworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKKyAgcmV0dXJuIHN0cmNhc2VjbXAgKG1hcDEtPmFsaWFzLCBtYXAyLT5hbGlhcyk7CisjZWxzZQorICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDEtPmFsaWFzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDItPmFsaWFzOworICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKworICBpZiAocDEgPT0gcDIpCisgICAgcmV0dXJuIDA7CisKKyAgZG8KKyAgICB7CisgICAgICAvKiBJIGtub3cgdGhpcyBzZWVtcyB0byBiZSBvZGQgYnV0IHRoZSB0b2xvd2VyKCkgZnVuY3Rpb24gaW4KKwkgc29tZSBzeXN0ZW1zIGxpYmMgY2Fubm90IGhhbmRsZSBub25hbHBoYSBjaGFyYWN0ZXJzLiAgKi8KKyAgICAgIGMxID0gaXN1cHBlciAoKnAxKSA/IHRvbG93ZXIgKCpwMSkgOiAqcDE7CisgICAgICBjMiA9IGlzdXBwZXIgKCpwMikgPyB0b2xvd2VyICgqcDIpIDogKnAyOworICAgICAgaWYgKGMxID09ICdcMCcpCisJYnJlYWs7CisgICAgICArK3AxOworICAgICAgKytwMjsKKyAgICB9CisgIHdoaWxlIChjMSA9PSBjMik7CisKKyAgcmV0dXJuIGMxIC0gYzI7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2NhbGVuYW1lLmMgYi91bml4L2ludGwvbG9jYWxlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjJlNTQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbG9jYWxlbmFtZS5jCkBAIC0wLDAgKzEsMTE0MiBAQAorLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNlbGVjdGVkIGxvY2FsZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5vcmc+LCAxOTk1LiAgKi8KKy8qIFdpbjMyIGNvZGUgd3JpdHRlbiBieSBUb3IgTGlsbHF2aXN0IDx0bWxAaWtpLmZpPi4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisjIHVuZGVmIFdJTjMyICAgLyogYXZvaWQgd2FybmluZyBvbiBtaW5ndzMyICovCisjIGRlZmluZSBXSU4zMgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisvKiBMaXN0IG9mIGxhbmd1YWdlIGNvZGVzLCBzb3J0ZWQgYnkgdmFsdWU6CisgICAweDAxIExBTkdfQVJBQklDCisgICAweDAyIExBTkdfQlVMR0FSSUFOCisgICAweDAzIExBTkdfQ0FUQUxBTgorICAgMHgwNCBMQU5HX0NISU5FU0UKKyAgIDB4MDUgTEFOR19DWkVDSAorICAgMHgwNiBMQU5HX0RBTklTSAorICAgMHgwNyBMQU5HX0dFUk1BTgorICAgMHgwOCBMQU5HX0dSRUVLCisgICAweDA5IExBTkdfRU5HTElTSAorICAgMHgwYSBMQU5HX1NQQU5JU0gKKyAgIDB4MGIgTEFOR19GSU5OSVNICisgICAweDBjIExBTkdfRlJFTkNICisgICAweDBkIExBTkdfSEVCUkVXCisgICAweDBlIExBTkdfSFVOR0FSSUFOCisgICAweDBmIExBTkdfSUNFTEFORElDCisgICAweDEwIExBTkdfSVRBTElBTgorICAgMHgxMSBMQU5HX0pBUEFORVNFCisgICAweDEyIExBTkdfS09SRUFOCisgICAweDEzIExBTkdfRFVUQ0gKKyAgIDB4MTQgTEFOR19OT1JXRUdJQU4KKyAgIDB4MTUgTEFOR19QT0xJU0gKKyAgIDB4MTYgTEFOR19QT1JUVUdVRVNFCisgICAweDE3IExBTkdfUkhBRVRPX1JPTUFOQ0UKKyAgIDB4MTggTEFOR19ST01BTklBTgorICAgMHgxOSBMQU5HX1JVU1NJQU4KKyAgIDB4MWEgTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KKyAgIDB4MWIgTEFOR19TTE9WQUsKKyAgIDB4MWMgTEFOR19BTEJBTklBTgorICAgMHgxZCBMQU5HX1NXRURJU0gKKyAgIDB4MWUgTEFOR19USEFJCisgICAweDFmIExBTkdfVFVSS0lTSAorICAgMHgyMCBMQU5HX1VSRFUKKyAgIDB4MjEgTEFOR19JTkRPTkVTSUFOCisgICAweDIyIExBTkdfVUtSQUlOSUFOCisgICAweDIzIExBTkdfQkVMQVJVU0lBTgorICAgMHgyNCBMQU5HX1NMT1ZFTklBTgorICAgMHgyNSBMQU5HX0VTVE9OSUFOCisgICAweDI2IExBTkdfTEFUVklBTgorICAgMHgyNyBMQU5HX0xJVEhVQU5JQU4KKyAgIDB4MjggTEFOR19UQUpJSworICAgMHgyOSBMQU5HX0ZBUlNJCisgICAweDJhIExBTkdfVklFVE5BTUVTRQorICAgMHgyYiBMQU5HX0FSTUVOSUFOCisgICAweDJjIExBTkdfQVpFUkkKKyAgIDB4MmQgTEFOR19CQVNRVUUKKyAgIDB4MmUgTEFOR19TT1JCSUFOCisgICAweDJmIExBTkdfTUFDRURPTklBTgorICAgMHgzMCBMQU5HX1NVVFUKKyAgIDB4MzEgTEFOR19UU09OR0EKKyAgIDB4MzIgTEFOR19UU1dBTkEKKyAgIDB4MzMgTEFOR19WRU5EQQorICAgMHgzNCBMQU5HX1hIT1NBCisgICAweDM1IExBTkdfWlVMVQorICAgMHgzNiBMQU5HX0FGUklLQUFOUworICAgMHgzNyBMQU5HX0dFT1JHSUFOCisgICAweDM4IExBTkdfRkFFUk9FU0UKKyAgIDB4MzkgTEFOR19ISU5ESQorICAgMHgzYSBMQU5HX01BTFRFU0UKKyAgIDB4M2IgTEFOR19TQUFNSQorICAgMHgzYyBMQU5HX0dBRUxJQworICAgMHgzZCBMQU5HX1lJRERJU0gKKyAgIDB4M2UgTEFOR19NQUxBWQorICAgMHgzZiBMQU5HX0tBWkFLCisgICAweDQwIExBTkdfS1lSR1laCisgICAweDQxIExBTkdfU1dBSElMSQorICAgMHg0MiBMQU5HX1RVUktNRU4KKyAgIDB4NDMgTEFOR19VWkJFSworICAgMHg0NCBMQU5HX1RBVEFSCisgICAweDQ1IExBTkdfQkVOR0FMSQorICAgMHg0NiBMQU5HX1BVTkpBQkkKKyAgIDB4NDcgTEFOR19HVUpBUkFUSQorICAgMHg0OCBMQU5HX09SSVlBCisgICAweDQ5IExBTkdfVEFNSUwKKyAgIDB4NGEgTEFOR19URUxVR1UKKyAgIDB4NGIgTEFOR19LQU5OQURBCisgICAweDRjIExBTkdfTUFMQVlBTEFNCisgICAweDRkIExBTkdfQVNTQU1FU0UKKyAgIDB4NGUgTEFOR19NQVJBVEhJCisgICAweDRmIExBTkdfU0FOU0tSSVQKKyAgIDB4NTAgTEFOR19NT05HT0xJQU4KKyAgIDB4NTEgTEFOR19USUJFVEFOCisgICAweDUyIExBTkdfV0VMU0gKKyAgIDB4NTMgTEFOR19DQU1CT0RJQU4KKyAgIDB4NTQgTEFOR19MQU8KKyAgIDB4NTUgTEFOR19CVVJNRVNFCisgICAweDU2IExBTkdfR0FMSUNJQU4KKyAgIDB4NTcgTEFOR19LT05LQU5JCisgICAweDU4IExBTkdfTUFOSVBVUkkKKyAgIDB4NTkgTEFOR19TSU5ESEkKKyAgIDB4NWEgTEFOR19TWVJJQUMKKyAgIDB4NWIgTEFOR19TSU5IQUxFU0UKKyAgIDB4NWMgTEFOR19DSEVST0tFRQorICAgMHg1ZCBMQU5HX0lOVUtUSVRVVAorICAgMHg1ZSBMQU5HX0FNSEFSSUMKKyAgIDB4NWYgTEFOR19UQU1BWklHSFQKKyAgIDB4NjAgTEFOR19LQVNITUlSSQorICAgMHg2MSBMQU5HX05FUEFMSQorICAgMHg2MiBMQU5HX0ZSSVNJQU4KKyAgIDB4NjMgTEFOR19QQVNIVE8KKyAgIDB4NjQgTEFOR19UQUdBTE9HCisgICAweDY1IExBTkdfRElWRUhJCisgICAweDY2IExBTkdfRURPCisgICAweDY3IExBTkdfRlVMRlVMREUKKyAgIDB4NjggTEFOR19IQVVTQQorICAgMHg2OSBMQU5HX0lCSUJJTworICAgMHg2YSBMQU5HX1lPUlVCQQorICAgMHg3MCBMQU5HX0lHQk8KKyAgIDB4NzEgTEFOR19LQU5VUkkKKyAgIDB4NzIgTEFOR19PUk9NTworICAgMHg3MyBMQU5HX1RJR1JJTllBCisgICAweDc0IExBTkdfR1VBUkFOSQorICAgMHg3NSBMQU5HX0hBV0FJSUFOCisgICAweDc2IExBTkdfTEFUSU4KKyAgIDB4NzcgTEFOR19TT01BTEkKKyAgIDB4NzggTEFOR19ZSQorICAgMHg3OSBMQU5HX1BBUElBTUVOVFUKKyovCisvKiBNaW5ndyBoZWFkZXJzIGRvbid0IGhhdmUgbGF0ZXN0IGxhbmd1YWdlIGFuZCBzdWJsYW5ndWFnZSBjb2Rlcy4gICovCisjIGlmbmRlZiBMQU5HX0FGUklLQUFOUworIyBkZWZpbmUgTEFOR19BRlJJS0FBTlMgMHgzNgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19BTEJBTklBTgorIyBkZWZpbmUgTEFOR19BTEJBTklBTiAweDFjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FNSEFSSUMKKyMgZGVmaW5lIExBTkdfQU1IQVJJQyAweDVlCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FSQUJJQworIyBkZWZpbmUgTEFOR19BUkFCSUMgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19BUk1FTklBTgorIyBkZWZpbmUgTEFOR19BUk1FTklBTiAweDJiCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FTU0FNRVNFCisjIGRlZmluZSBMQU5HX0FTU0FNRVNFIDB4NGQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQVpFUkkKKyMgZGVmaW5lIExBTkdfQVpFUkkgMHgyYworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CQVNRVUUKKyMgZGVmaW5lIExBTkdfQkFTUVVFIDB4MmQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQkVMQVJVU0lBTgorIyBkZWZpbmUgTEFOR19CRUxBUlVTSUFOIDB4MjMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQkVOR0FMSQorIyBkZWZpbmUgTEFOR19CRU5HQUxJIDB4NDUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQlVSTUVTRQorIyBkZWZpbmUgTEFOR19CVVJNRVNFIDB4NTUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQ0FNQk9ESUFOCisjIGRlZmluZSBMQU5HX0NBTUJPRElBTiAweDUzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0NBVEFMQU4KKyMgZGVmaW5lIExBTkdfQ0FUQUxBTiAweDAzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0NIRVJPS0VFCisjIGRlZmluZSBMQU5HX0NIRVJPS0VFIDB4NWMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRElWRUhJCisjIGRlZmluZSBMQU5HX0RJVkVISSAweDY1CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0VETworIyBkZWZpbmUgTEFOR19FRE8gMHg2NgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19FU1RPTklBTgorIyBkZWZpbmUgTEFOR19FU1RPTklBTiAweDI1CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0ZBRVJPRVNFCisjIGRlZmluZSBMQU5HX0ZBRVJPRVNFIDB4MzgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRkFSU0kKKyMgZGVmaW5lIExBTkdfRkFSU0kgMHgyOQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19GUklTSUFOCisjIGRlZmluZSBMQU5HX0ZSSVNJQU4gMHg2MgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19GVUxGVUxERQorIyBkZWZpbmUgTEFOR19GVUxGVUxERSAweDY3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0dBRUxJQworIyBkZWZpbmUgTEFOR19HQUVMSUMgMHgzYworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19HQUxJQ0lBTgorIyBkZWZpbmUgTEFOR19HQUxJQ0lBTiAweDU2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0dFT1JHSUFOCisjIGRlZmluZSBMQU5HX0dFT1JHSUFOIDB4MzcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR1VBUkFOSQorIyBkZWZpbmUgTEFOR19HVUFSQU5JIDB4NzQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR1VKQVJBVEkKKyMgZGVmaW5lIExBTkdfR1VKQVJBVEkgMHg0NworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19IQVVTQQorIyBkZWZpbmUgTEFOR19IQVVTQSAweDY4CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0hBV0FJSUFOCisjIGRlZmluZSBMQU5HX0hBV0FJSUFOIDB4NzUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSEVCUkVXCisjIGRlZmluZSBMQU5HX0hFQlJFVyAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0hJTkRJCisjIGRlZmluZSBMQU5HX0hJTkRJIDB4MzkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSUJJQklPCisjIGRlZmluZSBMQU5HX0lCSUJJTyAweDY5CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0lHQk8KKyMgZGVmaW5lIExBTkdfSUdCTyAweDcwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0lORE9ORVNJQU4KKyMgZGVmaW5lIExBTkdfSU5ET05FU0lBTiAweDIxCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0lOVUtUSVRVVAorIyBkZWZpbmUgTEFOR19JTlVLVElUVVQgMHg1ZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQU5OQURBCisjIGRlZmluZSBMQU5HX0tBTk5BREEgMHg0YgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQU5VUkkKKyMgZGVmaW5lIExBTkdfS0FOVVJJIDB4NzEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfS0FTSE1JUkkKKyMgZGVmaW5lIExBTkdfS0FTSE1JUkkgMHg2MAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQVpBSworIyBkZWZpbmUgTEFOR19LQVpBSyAweDNmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tPTktBTkkKKyMgZGVmaW5lIExBTkdfS09OS0FOSSAweDU3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tZUkdZWgorIyBkZWZpbmUgTEFOR19LWVJHWVogMHg0MAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MQU8KKyMgZGVmaW5lIExBTkdfTEFPIDB4NTQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTEFUSU4KKyMgZGVmaW5lIExBTkdfTEFUSU4gMHg3NgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MQVRWSUFOCisjIGRlZmluZSBMQU5HX0xBVFZJQU4gMHgyNgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MSVRIVUFOSUFOCisjIGRlZmluZSBMQU5HX0xJVEhVQU5JQU4gMHgyNworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQUNFRE9OSUFOCisjIGRlZmluZSBMQU5HX01BQ0VET05JQU4gMHgyZgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQUxBWQorIyBkZWZpbmUgTEFOR19NQUxBWSAweDNlCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTEFZQUxBTQorIyBkZWZpbmUgTEFOR19NQUxBWUFMQU0gMHg0YworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQUxURVNFCisjIGRlZmluZSBMQU5HX01BTFRFU0UgMHgzYQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19NQU5JUFVSSQorIyBkZWZpbmUgTEFOR19NQU5JUFVSSSAweDU4CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BUkFUSEkKKyMgZGVmaW5lIExBTkdfTUFSQVRISSAweDRlCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01PTkdPTElBTgorIyBkZWZpbmUgTEFOR19NT05HT0xJQU4gMHg1MAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ORVBBTEkKKyMgZGVmaW5lIExBTkdfTkVQQUxJIDB4NjEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfT1JJWUEKKyMgZGVmaW5lIExBTkdfT1JJWUEgMHg0OAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19PUk9NTworIyBkZWZpbmUgTEFOR19PUk9NTyAweDcyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1BBUElBTUVOVFUKKyMgZGVmaW5lIExBTkdfUEFQSUFNRU5UVSAweDc5CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1BBU0hUTworIyBkZWZpbmUgTEFOR19QQVNIVE8gMHg2MworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19QVU5KQUJJCisjIGRlZmluZSBMQU5HX1BVTkpBQkkgMHg0NgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19SSEFFVE9fUk9NQU5DRQorIyBkZWZpbmUgTEFOR19SSEFFVE9fUk9NQU5DRSAweDE3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NBQU1JCisjIGRlZmluZSBMQU5HX1NBQU1JIDB4M2IKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0FOU0tSSVQKKyMgZGVmaW5lIExBTkdfU0FOU0tSSVQgMHg0ZgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TRVJCSUFOCisjIGRlZmluZSBMQU5HX1NFUkJJQU4gMHgxYQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TSU5ESEkKKyMgZGVmaW5lIExBTkdfU0lOREhJIDB4NTkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0lOSEFMRVNFCisjIGRlZmluZSBMQU5HX1NJTkhBTEVTRSAweDViCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NMT1ZBSworIyBkZWZpbmUgTEFOR19TTE9WQUsgMHgxYgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TT01BTEkKKyMgZGVmaW5lIExBTkdfU09NQUxJIDB4NzcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU09SQklBTgorIyBkZWZpbmUgTEFOR19TT1JCSUFOIDB4MmUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU1VUVQorIyBkZWZpbmUgTEFOR19TVVRVIDB4MzAKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU1dBSElMSQorIyBkZWZpbmUgTEFOR19TV0FISUxJIDB4NDEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU1lSSUFDCisjIGRlZmluZSBMQU5HX1NZUklBQyAweDVhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RBR0FMT0cKKyMgZGVmaW5lIExBTkdfVEFHQUxPRyAweDY0CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RBSklLCisjIGRlZmluZSBMQU5HX1RBSklLIDB4MjgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFNQVpJR0hUCisjIGRlZmluZSBMQU5HX1RBTUFaSUdIVCAweDVmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RBTUlMCisjIGRlZmluZSBMQU5HX1RBTUlMIDB4NDkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFUQVIKKyMgZGVmaW5lIExBTkdfVEFUQVIgMHg0NAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19URUxVR1UKKyMgZGVmaW5lIExBTkdfVEVMVUdVIDB4NGEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEhBSQorIyBkZWZpbmUgTEFOR19USEFJIDB4MWUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVElCRVRBTgorIyBkZWZpbmUgTEFOR19USUJFVEFOIDB4NTEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVElHUklOWUEKKyMgZGVmaW5lIExBTkdfVElHUklOWUEgMHg3MworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UU09OR0EKKyMgZGVmaW5lIExBTkdfVFNPTkdBIDB4MzEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVFNXQU5BCisjIGRlZmluZSBMQU5HX1RTV0FOQSAweDMyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RVUktNRU4KKyMgZGVmaW5lIExBTkdfVFVSS01FTiAweDQyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1VLUkFJTklBTgorIyBkZWZpbmUgTEFOR19VS1JBSU5JQU4gMHgyMgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19VUkRVCisjIGRlZmluZSBMQU5HX1VSRFUgMHgyMAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19VWkJFSworIyBkZWZpbmUgTEFOR19VWkJFSyAweDQzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1ZFTkRBCisjIGRlZmluZSBMQU5HX1ZFTkRBIDB4MzMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVklFVE5BTUVTRQorIyBkZWZpbmUgTEFOR19WSUVUTkFNRVNFIDB4MmEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfV0VMU0gKKyMgZGVmaW5lIExBTkdfV0VMU0ggMHg1MgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19YSE9TQQorIyBkZWZpbmUgTEFOR19YSE9TQSAweDM0CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1lJCisjIGRlZmluZSBMQU5HX1lJIDB4NzgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWUlERElTSAorIyBkZWZpbmUgTEFOR19ZSURESVNIIDB4M2QKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWU9SVUJBCisjIGRlZmluZSBMQU5HX1lPUlVCQSAweDZhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1pVTFUKKyMgZGVmaW5lIExBTkdfWlVMVSAweDM1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQSAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19JUkFRCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19JUkFRIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0VHWVBUCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19FR1lQVCAweDAzCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19MSUJZQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTElCWUEgMHgwNAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQUxHRVJJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfQUxHRVJJQSAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPIDB4MDYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1RVTklTSUEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1RVTklTSUEgMHgwNworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfT01BTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfT01BTiAweDA4CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19ZRU1FTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfWUVNRU4gMHgwOQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfU1lSSUEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1NZUklBIDB4MGEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0pPUkRBTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfSk9SREFOIDB4MGIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xFQkFOT04KKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0xFQkFOT04gMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfS1VXQUlUCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19LVVdBSVQgMHgwZAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVUFFCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19VQUUgMHgwZQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfQkFIUkFJTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfQkFIUkFJTiAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19RQVRBUgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfUUFUQVIgMHgxMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BWkVSSV9MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19BWkVSSV9MQVRJTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0NZUklMTElDCisjIGRlZmluZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19CRU5HQUxJX0lORElBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNICisjIGRlZmluZSBTVUJMQU5HX0JFTkdBTElfQkFOR0xBREVTSCAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0NISU5FU0VfTUFDQVUKKyMgZGVmaW5lIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVSAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU09VVEhfQUZSSUNBCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfU09VVEhfQUZSSUNBIDB4MDcKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSAweDA4CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOIDB4MDkKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFECisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQgMHgwYgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1pJTUJBQldFCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0UgMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVMgMHgwZAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQSAweDBlCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkcKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9IT05HS09ORyAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9JTkRJQSAweDEwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUEKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQSAweDExCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFIDB4MTIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkcKKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkcgMHgwNQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTU9OQUNPCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NT05BQ08gMHgwNgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUworIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUyAweDA3CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9SRVVOSU9OCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9SRVVOSU9OIDB4MDgKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPTkdPCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DT05HTyAweDA5CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMIDB4MGEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DQU1FUk9PTiAweDBiCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRQorIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfQ09URURJVk9JUkUgMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTUFMSQorIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTUFMSSAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT1JPQ0NPCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NT1JPQ0NPIDB4MGUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0hBSVRJCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9IQUlUSSAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHCisjIGRlZmluZSBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHIDB4MDQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU4KKyMgZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU4gMHgwNQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19LQVNITUlSSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19LQVNITUlSSV9JTkRJQSAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX01BTEFZX01BTEFZU0lBCisjIGRlZmluZSBTVUJMQU5HX01BTEFZX01BTEFZU0lBIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0KKyMgZGVmaW5lIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0gMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19ORVBBTElfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfTkVQQUxJX0lORElBIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19QVU5KQUJJX0lORElBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTgorIyBkZWZpbmUgU1VCTEFOR19QVU5KQUJJX1BBS0lTVEFOIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQQorIyBkZWZpbmUgU1VCTEFOR19ST01BTklBTl9ST01BTklBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfUk9NQU5JQU5fTU9MRE9WQQorIyBkZWZpbmUgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19TRVJCSUFOX0xBVElOIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQworIyBkZWZpbmUgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDIDB4MDMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX1NJTkRISV9JTkRJQSAweDAwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTgorIyBkZWZpbmUgU1VCTEFOR19TSU5ESElfUEFLSVNUQU4gMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSAweDA0CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0EgMHgwNQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BBTkFNQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBTkFNQSAweDA2CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDIDB4MDcKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEEKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEEgMHgwOAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEgMHgwOQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1BFUlUKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QRVJVIDB4MGEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEgMHgwYgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SIDB4MGMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DSElMRQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NISUxFIDB4MGQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWSAweDBlCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSAweDBmCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEgMHgxMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IgMHgxMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVMgMHgxMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQSAweDEzCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08KKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTyAweDE0CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NXRURJU0hfRklOTEFORAorIyBkZWZpbmUgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfQVJBQklDCisjIGRlZmluZSBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUMgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19UQU1BWklHSFRfTEFUSU4KKyMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0xBVElOIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEKKyMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBCisjIGRlZmluZSBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19VUkRVX1BBS0lTVEFOCisjIGRlZmluZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU4gMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19VUkRVX0lORElBCisjIGRlZmluZSBTVUJMQU5HX1VSRFVfSU5ESUEgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19VWkJFS19MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19VWkJFS19MQVRJTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0NZUklMTElDCisjIGRlZmluZSBTVUJMQU5HX1VaQkVLX0NZUklMTElDIDB4MDIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiAnc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgorICAgIkRpcmVjdHMgJ3NldGxvY2FsZSgpJyB0byBxdWVyeSAnY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKKyAgICBzZXR0aW5nIG9mICdsb2NhbCcuIgorICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBOZWl0aGVyIGRvIFNVU1YyIGFuZAorICAgSVNPIEMgOTkuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkIHN5c3RlbXMgKGUuZy4KKyAgIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDIHx8IChkZWZpbmVkIF9fR05VX0xJQlJBUllfXyAmJiBfX0dOVV9MSUJSQVJZX18gPj0gMikKKyMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKKyNlbmRpZgorCisvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgbmFtZSwgYW5kIGNhbm9uaWNhbGl6ZSBpdCBpbnRvIFhQRyBzeW50YXgKKyAgICAgbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0KKyAgIFRoZSBjb2Rlc2V0IHBhcnQgaW4gdGhlIHJlc3VsdCBpcyBub3QgcmVsaWFibGU7IHRoZSBsb2NhbGVfY2hhcnNldCgpCisgICBzaG91bGQgYmUgdXNlZCBmb3IgY29kZXNldCBpbmZvcm1hdGlvbiBpbnN0ZWFkLgorICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuICAqLworCitjb25zdCBjaGFyICoKK19ubF9sb2NhbGVfbmFtZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCit7CisgIGNvbnN0IGNoYXIgKnJldHZhbDsKKworI2lmbmRlZiBXSU4zMgorCisgIC8qIFVzZSB0aGUgUE9TSVggbWV0aG9kcyBvZiBsb29raW5nIHRvICdMQ19BTEwnLCAnTENfeHh4JywgYW5kICdMQU5HJy4KKyAgICAgT24gc29tZSBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlICdzZXRsb2NhbGUnIGZ1bmN0aW9uIGl0c2VsZi4gICovCisjIGlmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAorICByZXR2YWwgPSBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKTsKKyMgZWxzZQorICAvKiBTZXR0aW5nIG9mIExDX0FMTCBvdmVyd3JpdGVzIGFsbCBvdGhlci4gICovCisgIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAocmV0dmFsID09IE5VTEwgfHwgcmV0dmFsWzBdID09ICdcMCcpCisgICAgeworICAgICAgLyogTmV4dCBjb21lcyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjYXRlZ29yeS4gICovCisgICAgICByZXR2YWwgPSBnZXRlbnYgKGNhdGVnb3J5bmFtZSk7CisgICAgICBpZiAocmV0dmFsID09IE5VTEwgfHwgcmV0dmFsWzBdID09ICdcMCcpCisJeworCSAgLyogTGFzdCBwb3NzaWJpbGl0eSBpcyB0aGUgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCisJICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7CisJICBpZiAocmV0dmFsID09IE5VTEwgfHwgcmV0dmFsWzBdID09ICdcMCcpCisJICAgIC8qIFdlIHVzZSBDIGFzIHRoZSBkZWZhdWx0IGRvbWFpbi4gIFBPU0lYIHNheXMgdGhpcyBpcworCSAgICAgICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgKi8KKwkgICAgcmV0dmFsID0gIkMiOworCX0KKyAgICB9CisjIGVuZGlmCisKKyAgcmV0dXJuIHJldHZhbDsKKworI2Vsc2UgLyogV0lOMzIgKi8KKworICAvKiBSZXR1cm4gYW4gWFBHIHN0eWxlIGxvY2FsZSBuYW1lIGxhbmd1YWdlW190ZXJyaXRvcnldW0Btb2RpZmllcl0uCisgICAgIERvbid0IGV2ZW4gYm90aGVyIGRldGVybWluaW5nIHRoZSBjb2Rlc2V0OyBpdCdzIG5vdCB1c2VmdWwgaW4gdGhpcworICAgICBjb250ZXh0LCBiZWNhdXNlIG1lc3NhZ2UgY2F0YWxvZ3MgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHNpbmdsZQorICAgICBjb2Rlc2V0LiAgKi8KKworICBMQ0lEIGxjaWQ7CisgIExBTkdJRCBsYW5naWQ7CisgIGludCBwcmltYXJ5LCBzdWI7CisKKyAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBzeXN0ZW0gc2V0dGluZ3MgdGhyb3VnaCBlbnZpcm9ubWVudAorICAgICB2YXJpYWJsZXMsIGFzIG9uIFBPU0lYIHN5c3RlbXMuICAqLworICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorICAgIHJldHVybiByZXR2YWw7CisgIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorICAgIHJldHVybiByZXR2YWw7CisgIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQorICAgIHJldHVybiByZXR2YWw7CisKKyAgLyogVXNlIG5hdGl2ZSBXaW4zMiBBUEkgbG9jYWxlIElELiAgKi8KKyAgbGNpZCA9IEdldFRocmVhZExvY2FsZSAoKTsKKworICAvKiBTdHJpcCBvZmYgdGhlIHNvcnRpbmcgcnVsZXMsIGtlZXAgb25seSB0aGUgbGFuZ3VhZ2UgcGFydC4gICovCisgIGxhbmdpZCA9IExBTkdJREZST01MQ0lEIChsY2lkKTsKKworICAvKiBTcGxpdCBpbnRvIGxhbmd1YWdlIGFuZCB0ZXJyaXRvcnkgcGFydC4gICovCisgIHByaW1hcnkgPSBQUklNQVJZTEFOR0lEIChsYW5naWQpOworICBzdWIgPSBTVUJMQU5HSUQgKGxhbmdpZCk7CisKKyAgLyogRGlzcGF0Y2ggb24gbGFuZ3VhZ2UuCisgICAgIFNlZSBhbHNvIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9vbmxpbmVkYXQvbGFuZ3VhZ2VzLmh0bWwgLgorICAgICBGb3IgZGV0YWlscyBhYm91dCBsYW5ndWFnZXMsIHNlZSBodHRwOi8vd3d3LmV0aG5vbG9ndWUuY29tLyAuICAqLworICBzd2l0Y2ggKHByaW1hcnkpCisgICAgeworICAgIGNhc2UgTEFOR19BRlJJS0FBTlM6IHJldHVybiAiYWZfWkEiOworICAgIGNhc2UgTEFOR19BTEJBTklBTjogcmV0dXJuICJzcV9BTCI7CisgICAgY2FzZSBMQU5HX0FNSEFSSUM6IHJldHVybiAiYW1fRVQiOworICAgIGNhc2UgTEFOR19BUkFCSUM6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19TQVVESV9BUkFCSUE6IHJldHVybiAiYXJfU0EiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfSVJBUTogcmV0dXJuICJhcl9JUSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19FR1lQVDogcmV0dXJuICJhcl9FRyI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19MSUJZQTogcmV0dXJuICJhcl9MWSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19BTEdFUklBOiByZXR1cm4gImFyX0RaIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX01PUk9DQ086IHJldHVybiAiYXJfTUEiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfVFVOSVNJQTogcmV0dXJuICJhcl9UTiI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19PTUFOOiByZXR1cm4gImFyX09NIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1lFTUVOOiByZXR1cm4gImFyX1lFIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1NZUklBOiByZXR1cm4gImFyX1NZIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0pPUkRBTjogcmV0dXJuICJhcl9KTyI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OOiByZXR1cm4gImFyX0xCIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0tVV0FJVDogcmV0dXJuICJhcl9LVyI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19VQUU6IHJldHVybiAiYXJfQUUiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfQkFIUkFJTjogcmV0dXJuICJhcl9CSCI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19RQVRBUjogcmV0dXJuICJhcl9RQSI7CisJfQorICAgICAgcmV0dXJuICJhciI7CisgICAgY2FzZSBMQU5HX0FSTUVOSUFOOiByZXR1cm4gImh5X0FNIjsKKyAgICBjYXNlIExBTkdfQVNTQU1FU0U6IHJldHVybiAiYXNfSU4iOworICAgIGNhc2UgTEFOR19BWkVSSToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwkvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBBemVyYmFpamFuaSBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKwljYXNlIFNVQkxBTkdfQVpFUklfTEFUSU46IHJldHVybiAiYXpfQVpAbGF0aW4iOworCWNhc2UgU1VCTEFOR19BWkVSSV9DWVJJTExJQzogcmV0dXJuICJhel9BWkBjeXJpbGxpYyI7CisJfQorICAgICAgcmV0dXJuICJheiI7CisgICAgY2FzZSBMQU5HX0JBU1FVRToKKyAgICAgIHJldHVybiAiZXUiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJldV9FUyIgb3IgImV1X0ZSIi4gICovCisgICAgY2FzZSBMQU5HX0JFTEFSVVNJQU46IHJldHVybiAiYmVfQlkiOworICAgIGNhc2UgTEFOR19CRU5HQUxJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19CRU5HQUxJX0lORElBOiByZXR1cm4gImJuX0lOIjsKKwljYXNlIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIOiByZXR1cm4gImJuX0JEIjsKKwl9CisgICAgICByZXR1cm4gImJuIjsKKyAgICBjYXNlIExBTkdfQlVMR0FSSUFOOiByZXR1cm4gImJnX0JHIjsKKyAgICBjYXNlIExBTkdfQlVSTUVTRTogcmV0dXJuICJteV9NTSI7CisgICAgY2FzZSBMQU5HX0NBTUJPRElBTjogcmV0dXJuICJrbV9LSCI7CisgICAgY2FzZSBMQU5HX0NBVEFMQU46IHJldHVybiAiY2FfRVMiOworICAgIGNhc2UgTEFOR19DSEVST0tFRTogcmV0dXJuICJjaHJfVVMiOworICAgIGNhc2UgTEFOR19DSElORVNFOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19DSElORVNFX1RSQURJVElPTkFMOiByZXR1cm4gInpoX1RXIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU1QTElGSUVEOiByZXR1cm4gInpoX0NOIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9IT05HS09ORzogcmV0dXJuICJ6aF9ISyI7CisJY2FzZSBTVUJMQU5HX0NISU5FU0VfU0lOR0FQT1JFOiByZXR1cm4gInpoX1NHIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVTogcmV0dXJuICJ6aF9NTyI7CisJfQorICAgICAgcmV0dXJuICJ6aCI7CisgICAgY2FzZSBMQU5HX0NST0FUSUFOOgkJLyogTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KKwkJCQkgKiBXaGF0IHVzZWQgdG8gYmUgY2FsbGVkIFNlcmJvLUNyb2F0aWFuCisJCQkJICogc2hvdWxkIHJlYWxseSBub3cgYmUgdHdvIHNlcGFyYXRlCisJCQkJICogbGFuZ3VhZ2VzIGJlY2F1c2Ugb2YgcG9saXRpY2FsIHJlYXNvbnMuCisJCQkJICogKFNheXMgdG1sLCB3aG8ga25vd3Mgbm90aGluZyBhYm91dCBTZXJiaWFuCisJCQkJICogb3IgQ3JvYXRpYW4uKQorCQkJCSAqIChJIGNhbiBmZWVsIHRob3NlIGZsYW1lcyBjb21pbmcgYWxyZWFkeS4pCisJCQkJICovCisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAiaHJfSFIiOworCWNhc2UgU1VCTEFOR19TRVJCSUFOX0xBVElOOiByZXR1cm4gInNyX0NTIjsKKwljYXNlIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQzogcmV0dXJuICJzcl9DU0BjeXJpbGxpYyI7CisJfQorICAgICAgcmV0dXJuICJociI7CisgICAgY2FzZSBMQU5HX0NaRUNIOiByZXR1cm4gImNzX0NaIjsKKyAgICBjYXNlIExBTkdfREFOSVNIOiByZXR1cm4gImRhX0RLIjsKKyAgICBjYXNlIExBTkdfRElWRUhJOiByZXR1cm4gImR2X01WIjsKKyAgICBjYXNlIExBTkdfRFVUQ0g6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RVVENIOiByZXR1cm4gIm5sX05MIjsKKwljYXNlIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTjogLyogRkxFTUlTSCwgVkxBQU1TICovIHJldHVybiAibmxfQkUiOworCX0KKyAgICAgIHJldHVybiAibmwiOworICAgIGNhc2UgTEFOR19FRE86IHJldHVybiAiYmluX05HIjsKKyAgICBjYXNlIExBTkdfRU5HTElTSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwkvKiBTVUJMQU5HX0VOR0xJU0hfVVMgPT0gU1VCTEFOR19ERUZBVUxULiBIZWguIEkgdGhvdWdodAorCSAqIEVuZ2xpc2ggd2FzIHRoZSBsYW5ndWFnZSBzcG9rZW4gaW4gRW5nbGFuZC4KKwkgKiBPaCB3ZWxsLgorCSAqLworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1VTOiByZXR1cm4gImVuX1VTIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9VSzogcmV0dXJuICJlbl9HQiI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQVVTOiByZXR1cm4gImVuX0FVIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9DQU46IHJldHVybiAiZW5fQ0EiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX05aOiByZXR1cm4gImVuX05aIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9FSVJFOiByZXR1cm4gImVuX0lFIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0E6IHJldHVybiAiZW5fWkEiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0E6IHJldHVybiAiZW5fSk0iOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0NBUklCQkVBTjogcmV0dXJuICJlbl9HRCI7IC8qIEdyZW5hZGE/ICovCisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFOiByZXR1cm4gImVuX0JaIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRDogcmV0dXJuICJlbl9UVCI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0U6IHJldHVybiAiZW5fWlciOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1BISUxJUFBJTkVTOiByZXR1cm4gImVuX1BIIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9JTkRPTkVTSUE6IHJldHVybiAiZW5fSUQiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HOiByZXR1cm4gImVuX0hLIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9JTkRJQTogcmV0dXJuICJlbl9JTiI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfTUFMQVlTSUE6IHJldHVybiAiZW5fTVkiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1NJTkdBUE9SRTogcmV0dXJuICJlbl9TRyI7CisJfQorICAgICAgcmV0dXJuICJlbiI7CisgICAgY2FzZSBMQU5HX0VTVE9OSUFOOiByZXR1cm4gImV0X0VFIjsKKyAgICBjYXNlIExBTkdfRkFFUk9FU0U6IHJldHVybiAiZm9fRk8iOworICAgIGNhc2UgTEFOR19GQVJTSTogcmV0dXJuICJmYV9JUiI7CisgICAgY2FzZSBMQU5HX0ZJTk5JU0g6IHJldHVybiAiZmlfRkkiOworICAgIGNhc2UgTEFOR19GUkVOQ0g6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSDogcmV0dXJuICJmcl9GUiI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOOiAvKiBXQUxMT09OICovIHJldHVybiAiZnJfQkUiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfQ0FOQURJQU46IHJldHVybiAiZnJfQ0EiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfU1dJU1M6IHJldHVybiAiZnJfQ0giOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRzogcmV0dXJuICJmcl9MVSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9NT05BQ086IHJldHVybiAiZnJfTUMiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUzogcmV0dXJuICJmciI7IC8qIENhcmliYmVhbj8gKi8KKwljYXNlIFNVQkxBTkdfRlJFTkNIX1JFVU5JT046IHJldHVybiAiZnJfUkUiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfQ09OR086IHJldHVybiAiZnJfQ0ciOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfU0VORUdBTDogcmV0dXJuICJmcl9TTiI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU1FUk9PTjogcmV0dXJuICJmcl9DTSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRTogcmV0dXJuICJmcl9DSSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9NQUxJOiByZXR1cm4gImZyX01MIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX01PUk9DQ086IHJldHVybiAiZnJfTUEiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfSEFJVEk6IHJldHVybiAiZnJfSFQiOworCX0KKyAgICAgIHJldHVybiAiZnIiOworICAgIGNhc2UgTEFOR19GUklTSUFOOiByZXR1cm4gImZ5X05MIjsKKyAgICBjYXNlIExBTkdfRlVMRlVMREU6CisgICAgICAvKiBTcG9rZW4gaW4gTmlnZXJpYSwgR3VpbmVhLCBTZW5lZ2FsLCBNYWxpLCBOaWdlciwgQ2FtZXJvb24sIEJlbmluLiAqLworICAgICAgcmV0dXJuICJmZl9ORyI7CisgICAgY2FzZSBMQU5HX0dBRUxJQzoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIDB4MDE6IC8qIFNDT1RUSVNIICovIHJldHVybiAiZ2RfR0IiOworCWNhc2UgMHgwMjogLyogSVJJU0ggKi8gcmV0dXJuICJnYV9JRSI7CisJfQorICAgICAgcmV0dXJuICJDIjsKKyAgICBjYXNlIExBTkdfR0FMSUNJQU46IHJldHVybiAiZ2xfRVMiOworICAgIGNhc2UgTEFOR19HRU9SR0lBTjogcmV0dXJuICJrYV9HRSI7CisgICAgY2FzZSBMQU5HX0dFUk1BTjoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfR0VSTUFOOiByZXR1cm4gImRlX0RFIjsKKwljYXNlIFNVQkxBTkdfR0VSTUFOX1NXSVNTOiByZXR1cm4gImRlX0NIIjsKKwljYXNlIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOOiByZXR1cm4gImRlX0FUIjsKKwljYXNlIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkc6IHJldHVybiAiZGVfTFUiOworCWNhc2UgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTjogcmV0dXJuICJkZV9MSSI7CisJfQorICAgICAgcmV0dXJuICJkZSI7CisgICAgY2FzZSBMQU5HX0dSRUVLOiByZXR1cm4gImVsX0dSIjsKKyAgICBjYXNlIExBTkdfR1VBUkFOSTogcmV0dXJuICJnbl9QWSI7CisgICAgY2FzZSBMQU5HX0dVSkFSQVRJOiByZXR1cm4gImd1X0lOIjsKKyAgICBjYXNlIExBTkdfSEFVU0E6IHJldHVybiAiaGFfTkciOworICAgIGNhc2UgTEFOR19IQVdBSUlBTjoKKyAgICAgIC8qIEZJWE1FOiBEbyB0aGV5IG1lYW4gSGF3YWlpYW4gKCJoYXdfVVMiLCAxMDAwIHNwZWFrZXJzKQorCSBvciBIYXdhaWkgQ3Jlb2xlIEVuZ2xpc2ggKCJjcGVfVVMiLCA2MDAwMDAgc3BlYWtlcnMpPyAgKi8KKyAgICAgIHJldHVybiAiY3BlX1VTIjsKKyAgICBjYXNlIExBTkdfSEVCUkVXOiByZXR1cm4gImhlX0lMIjsKKyAgICBjYXNlIExBTkdfSElOREk6IHJldHVybiAiaGlfSU4iOworICAgIGNhc2UgTEFOR19IVU5HQVJJQU46IHJldHVybiAiaHVfSFUiOworICAgIGNhc2UgTEFOR19JQklCSU86IHJldHVybiAibmljX05HIjsKKyAgICBjYXNlIExBTkdfSUNFTEFORElDOiByZXR1cm4gImlzX0lTIjsKKyAgICBjYXNlIExBTkdfSUdCTzogcmV0dXJuICJpZ19ORyI7CisgICAgY2FzZSBMQU5HX0lORE9ORVNJQU46IHJldHVybiAiaWRfSUQiOworICAgIGNhc2UgTEFOR19JTlVLVElUVVQ6IHJldHVybiAiaXVfQ0EiOworICAgIGNhc2UgTEFOR19JVEFMSUFOOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19JVEFMSUFOOiByZXR1cm4gIml0X0lUIjsKKwljYXNlIFNVQkxBTkdfSVRBTElBTl9TV0lTUzogcmV0dXJuICJpdF9DSCI7CisJfQorICAgICAgcmV0dXJuICJpdCI7CisgICAgY2FzZSBMQU5HX0pBUEFORVNFOiByZXR1cm4gImphX0pQIjsKKyAgICBjYXNlIExBTkdfS0FOTkFEQTogcmV0dXJuICJrbl9JTiI7CisgICAgY2FzZSBMQU5HX0tBTlVSSTogcmV0dXJuICJrcl9ORyI7CisgICAgY2FzZSBMQU5HX0tBU0hNSVJJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gImtzX1BLIjsKKwljYXNlIFNVQkxBTkdfS0FTSE1JUklfSU5ESUE6IHJldHVybiAia3NfSU4iOworCX0KKyAgICAgIHJldHVybiAia3MiOworICAgIGNhc2UgTEFOR19LQVpBSzogcmV0dXJuICJra19LWiI7CisgICAgY2FzZSBMQU5HX0tPTktBTkk6CisgICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworICAgICAgcmV0dXJuICJrb2tfSU4iOworICAgIGNhc2UgTEFOR19LT1JFQU46IHJldHVybiAia29fS1IiOworICAgIGNhc2UgTEFOR19LWVJHWVo6IHJldHVybiAia3lfS0ciOworICAgIGNhc2UgTEFOR19MQU86IHJldHVybiAibG9fTEEiOworICAgIGNhc2UgTEFOR19MQVRJTjogcmV0dXJuICJsYV9WQSI7CisgICAgY2FzZSBMQU5HX0xBVFZJQU46IHJldHVybiAibHZfTFYiOworICAgIGNhc2UgTEFOR19MSVRIVUFOSUFOOiByZXR1cm4gImx0X0xUIjsKKyAgICBjYXNlIExBTkdfTUFDRURPTklBTjogcmV0dXJuICJta19NSyI7CisgICAgY2FzZSBMQU5HX01BTEFZOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19NQUxBWV9NQUxBWVNJQTogcmV0dXJuICJtc19NWSI7CisJY2FzZSBTVUJMQU5HX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNOiByZXR1cm4gIm1zX0JOIjsKKwl9CisgICAgICByZXR1cm4gIm1zIjsKKyAgICBjYXNlIExBTkdfTUFMQVlBTEFNOiByZXR1cm4gIm1sX0lOIjsKKyAgICBjYXNlIExBTkdfTUFMVEVTRTogcmV0dXJuICJtdF9NVCI7CisgICAgY2FzZSBMQU5HX01BTklQVVJJOgorICAgICAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKyAgICAgIHJldHVybiAibW5pX0lOIjsKKyAgICBjYXNlIExBTkdfTUFSQVRISTogcmV0dXJuICJtcl9JTiI7CisgICAgY2FzZSBMQU5HX01PTkdPTElBTjoKKyAgICAgIHJldHVybiAibW4iOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJtbl9DTiIgb3IgIm1uX01OIi4gICovCisgICAgY2FzZSBMQU5HX05FUEFMSToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJuZV9OUCI7CisJY2FzZSBTVUJMQU5HX05FUEFMSV9JTkRJQTogcmV0dXJuICJuZV9JTiI7CisJfQorICAgICAgcmV0dXJuICJuZSI7CisgICAgY2FzZSBMQU5HX05PUldFR0lBTjoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTDogcmV0dXJuICJub19OTyI7CisJY2FzZSBTVUJMQU5HX05PUldFR0lBTl9OWU5PUlNLOiByZXR1cm4gIm5uX05PIjsKKwl9CisgICAgICByZXR1cm4gIm5vIjsKKyAgICBjYXNlIExBTkdfT1JJWUE6IHJldHVybiAib3JfSU4iOworICAgIGNhc2UgTEFOR19PUk9NTzogcmV0dXJuICJvbV9FVCI7CisgICAgY2FzZSBMQU5HX1BBUElBTUVOVFU6IHJldHVybiAicGFwX0FOIjsKKyAgICBjYXNlIExBTkdfUEFTSFRPOgorICAgICAgcmV0dXJuICJwcyI7IC8qIEFtYmlndW91czogY291bGQgYmUgInBzX1BLIiBvciAicHNfQUYiLiAgKi8KKyAgICBjYXNlIExBTkdfUE9MSVNIOiByZXR1cm4gInBsX1BMIjsKKyAgICBjYXNlIExBTkdfUE9SVFVHVUVTRToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfUE9SVFVHVUVTRTogcmV0dXJuICJwdF9QVCI7CisJLyogSG1tLiBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOID09IFNVQkxBTkdfREVGQVVMVC4KKwkgICBTYW1lIHBoZW5vbWVub24gYXMgU1VCTEFOR19FTkdMSVNIX1VTID09IFNVQkxBTkdfREVGQVVMVC4gKi8KKwljYXNlIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU46IHJldHVybiAicHRfQlIiOworCX0KKyAgICAgIHJldHVybiAicHQiOworICAgIGNhc2UgTEFOR19QVU5KQUJJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19QVU5KQUJJX0lORElBOiByZXR1cm4gInBhX0lOIjsgLyogR3VybXVraGkgc2NyaXB0ICovCisJY2FzZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU46IHJldHVybiAicGFfUEsiOyAvKiBBcmFiaWMgc2NyaXB0ICovCisJfQorICAgICAgcmV0dXJuICJwYSI7CisgICAgY2FzZSBMQU5HX1JIQUVUT19ST01BTkNFOiByZXR1cm4gInJtX0NIIjsKKyAgICBjYXNlIExBTkdfUk9NQU5JQU46CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUE6IHJldHVybiAicm9fUk8iOworCWNhc2UgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBOiByZXR1cm4gInJvX01EIjsKKwl9CisgICAgICByZXR1cm4gInJvIjsKKyAgICBjYXNlIExBTkdfUlVTU0lBTjoKKyAgICAgIHJldHVybiAicnUiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJydV9SVSIgb3IgInJ1X1VBIiBvciAicnVfTUQiLiAgKi8KKyAgICBjYXNlIExBTkdfU0FBTUk6IC8qIGFjdHVhbGx5IE5vcnRoZXJuIFNhbWkgKi8gcmV0dXJuICJzZV9OTyI7CisgICAgY2FzZSBMQU5HX1NBTlNLUklUOiByZXR1cm4gInNhX0lOIjsKKyAgICBjYXNlIExBTkdfU0lOREhJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19TSU5ESElfSU5ESUE6IHJldHVybiAic2RfSU4iOworCWNhc2UgU1VCTEFOR19TSU5ESElfUEFLSVNUQU46IHJldHVybiAic2RfUEsiOworCX0KKyAgICAgIHJldHVybiAic2QiOworICAgIGNhc2UgTEFOR19TSU5IQUxFU0U6IHJldHVybiAic2lfTEsiOworICAgIGNhc2UgTEFOR19TTE9WQUs6IHJldHVybiAic2tfU0siOworICAgIGNhc2UgTEFOR19TTE9WRU5JQU46IHJldHVybiAic2xfU0kiOworICAgIGNhc2UgTEFOR19TT01BTEk6IHJldHVybiAic29fU08iOworICAgIGNhc2UgTEFOR19TT1JCSUFOOgorICAgICAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKyAgICAgIHJldHVybiAid2VuX0RFIjsKKyAgICBjYXNlIExBTkdfU1BBTklTSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfU1BBTklTSDogcmV0dXJuICJlc19FUyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTjogcmV0dXJuICJlc19NWCI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTU9ERVJOOgorCSAgcmV0dXJuICJlc19FU0Btb2Rlcm4iOwkvKiBub3Qgc2VlbiBvbiBVbml4ICovCisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBOiByZXR1cm4gImVzX0dUIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBOiByZXR1cm4gImVzX0NSIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QQU5BTUE6IHJldHVybiAiZXNfUEEiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQzogcmV0dXJuICJlc19ETyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBOiByZXR1cm4gImVzX1ZFIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQTogcmV0dXJuICJlc19DTyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEVSVTogcmV0dXJuICJlc19QRSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BOiByZXR1cm4gImVzX0FSIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SOiByZXR1cm4gImVzX0VDIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9DSElMRTogcmV0dXJuICJlc19DTCI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWTogcmV0dXJuICJlc19VWSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVk6IHJldHVybiAiZXNfUFkiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0JPTElWSUE6IHJldHVybiAiZXNfQk8iOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SOiByZXR1cm4gImVzX1NWIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUzogcmV0dXJuICJlc19ITiI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBOiByZXR1cm4gImVzX05JIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTzogcmV0dXJuICJlc19QUiI7CisJfQorICAgICAgcmV0dXJuICJlcyI7CisgICAgY2FzZSBMQU5HX1NVVFU6IHJldHVybiAiYm50X1RaIjsgLyogb3IgInN0X0xTIiBvciAibnNvX1pBIj8gKi8KKyAgICBjYXNlIExBTkdfU1dBSElMSTogcmV0dXJuICJzd19LRSI7CisgICAgY2FzZSBMQU5HX1NXRURJU0g6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAic3ZfU0UiOworCWNhc2UgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQ6IHJldHVybiAic3ZfRkkiOworCX0KKyAgICAgIHJldHVybiAic3YiOworICAgIGNhc2UgTEFOR19TWVJJQUM6IHJldHVybiAic3lyX1RSIjsgLyogQW4gZXh0aW5jdCBsYW5ndWFnZS4gICovCisgICAgY2FzZSBMQU5HX1RBR0FMT0c6IHJldHVybiAidGxfUEgiOworICAgIGNhc2UgTEFOR19UQUpJSzogcmV0dXJuICJ0Z19USiI7CisgICAgY2FzZSBMQU5HX1RBTUFaSUdIVDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwkvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBUYW1hemlnaHQgbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCisJY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUM6IHJldHVybiAiYmVyX01BQGFyYWJpYyI7CisJY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9MQVRJTjogcmV0dXJuICJiZXJfTUFAbGF0aW4iOworCX0KKyAgICAgIHJldHVybiAiYmVyX01BIjsKKyAgICBjYXNlIExBTkdfVEFNSUw6CisgICAgICByZXR1cm4gInRhIjsgLyogQW1iaWd1b3VzOiBjb3VsZCBiZSAidGFfSU4iIG9yICJ0YV9MSyIgb3IgInRhX1NHIi4gICovCisgICAgY2FzZSBMQU5HX1RBVEFSOiByZXR1cm4gInR0X1JVIjsKKyAgICBjYXNlIExBTkdfVEVMVUdVOiByZXR1cm4gInRlX0lOIjsKKyAgICBjYXNlIExBTkdfVEhBSTogcmV0dXJuICJ0aF9USCI7CisgICAgY2FzZSBMQU5HX1RJQkVUQU46IHJldHVybiAiYm9fQ04iOworICAgIGNhc2UgTEFOR19USUdSSU5ZQToKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUE6IHJldHVybiAidGlfRVQiOworCWNhc2UgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBOiByZXR1cm4gInRpX0VSIjsKKwl9CisgICAgICByZXR1cm4gInRpIjsKKyAgICBjYXNlIExBTkdfVFNPTkdBOiByZXR1cm4gInRzX1pBIjsKKyAgICBjYXNlIExBTkdfVFNXQU5BOiByZXR1cm4gInRuX0JXIjsKKyAgICBjYXNlIExBTkdfVFVSS0lTSDogcmV0dXJuICJ0cl9UUiI7CisgICAgY2FzZSBMQU5HX1RVUktNRU46IHJldHVybiAidGtfVE0iOworICAgIGNhc2UgTEFOR19VS1JBSU5JQU46IHJldHVybiAidWtfVUEiOworICAgIGNhc2UgTEFOR19VUkRVOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19VUkRVX1BBS0lTVEFOOiByZXR1cm4gInVyX1BLIjsKKwljYXNlIFNVQkxBTkdfVVJEVV9JTkRJQTogcmV0dXJuICJ1cl9JTiI7CisJfQorICAgICAgcmV0dXJuICJ1ciI7CisgICAgY2FzZSBMQU5HX1VaQkVLOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19VWkJFS19MQVRJTjogcmV0dXJuICJ1el9VWiI7CisJY2FzZSBTVUJMQU5HX1VaQkVLX0NZUklMTElDOiByZXR1cm4gInV6X1VaQGN5cmlsbGljIjsKKwl9CisgICAgICByZXR1cm4gInV6IjsKKyAgICBjYXNlIExBTkdfVkVOREE6IHJldHVybiAidmVfWkEiOworICAgIGNhc2UgTEFOR19WSUVUTkFNRVNFOiByZXR1cm4gInZpX1ZOIjsKKyAgICBjYXNlIExBTkdfV0VMU0g6IHJldHVybiAiY3lfR0IiOworICAgIGNhc2UgTEFOR19YSE9TQTogcmV0dXJuICJ4aF9aQSI7CisgICAgY2FzZSBMQU5HX1lJOiByZXR1cm4gInNpdF9DTiI7CisgICAgY2FzZSBMQU5HX1lJRERJU0g6IHJldHVybiAieWlfSUwiOworICAgIGNhc2UgTEFOR19ZT1JVQkE6IHJldHVybiAieW9fTkciOworICAgIGNhc2UgTEFOR19aVUxVOiByZXR1cm4gInp1X1pBIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIkMiOworICAgIH0KKworI2VuZGlmCit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9nLmMgYi91bml4L2ludGwvbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2MDc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9sb2cuYwpAQCAtMCwwICsxLDk4IEBACisvKiBMb2cgZmlsZSBvdXRwdXQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBQcmludCBhbiBBU0NJSSBzdHJpbmcgd2l0aCBxdW90ZXMgYW5kIGVzY2FwZSBzZXF1ZW5jZXMgd2hlcmUgbmVlZGVkLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9lc2NhcGVkIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgcHV0YyAoJyInLCBzdHJlYW0pOworICBmb3IgKDsgKnN0ciAhPSAnXDAnOyBzdHIrKykKKyAgICBpZiAoKnN0ciA9PSAnXG4nKQorICAgICAgeworCWZwdXRzICgiXFxuXCIiLCBzdHJlYW0pOworCWlmIChzdHJbMV0gPT0gJ1wwJykKKwkgIHJldHVybjsKKwlmcHV0cyAoIlxuXCIiLCBzdHJlYW0pOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlpZiAoKnN0ciA9PSAnIicgfHwgKnN0ciA9PSAnXFwnKQorCSAgcHV0YyAoJ1xcJywgc3RyZWFtKTsKKwlwdXRjICgqc3RyLCBzdHJlYW0pOworICAgICAgfQorICBwdXRjICgnIicsIHN0cmVhbSk7Cit9CisKKy8qIEFkZCB0byB0aGUgbG9nIGZpbGUgYW4gZW50cnkgZGVub3RpbmcgYSBmYWlsZWQgdHJhbnNsYXRpb24uICAqLwordm9pZAorX25sX2xvZ191bnRyYW5zbGF0ZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAorCQkgICAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgaW50IHBsdXJhbCkKK3sKKyAgc3RhdGljIGNoYXIgKmxhc3RfbG9nZmlsZW5hbWUgPSBOVUxMOworICBzdGF0aWMgRklMRSAqbGFzdF9sb2dmaWxlID0gTlVMTDsKKyAgRklMRSAqbG9nZmlsZTsKKworICAvKiBDYW4gd2UgcmV1c2UgdGhlIGxhc3Qgb3BlbmVkIGxvZ2ZpbGU/ICAqLworICBpZiAobGFzdF9sb2dmaWxlbmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAobG9nZmlsZW5hbWUsIGxhc3RfbG9nZmlsZW5hbWUpICE9IDApCisgICAgeworICAgICAgLyogQ2xvc2UgdGhlIGxhc3QgdXNlZCBsb2dmaWxlLiAgKi8KKyAgICAgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lICE9IE5VTEwpCisJeworCSAgaWYgKGxhc3RfbG9nZmlsZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgZmNsb3NlIChsYXN0X2xvZ2ZpbGUpOworCSAgICAgIGxhc3RfbG9nZmlsZSA9IE5VTEw7CisJICAgIH0KKwkgIGZyZWUgKGxhc3RfbG9nZmlsZW5hbWUpOworCSAgbGFzdF9sb2dmaWxlbmFtZSA9IE5VTEw7CisJfQorICAgICAgLyogT3BlbiB0aGUgbG9nZmlsZS4gICovCisgICAgICBsYXN0X2xvZ2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKGxvZ2ZpbGVuYW1lKSArIDEpOworICAgICAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgICBzdHJjcHkgKGxhc3RfbG9nZmlsZW5hbWUsIGxvZ2ZpbGVuYW1lKTsKKyAgICAgIGxhc3RfbG9nZmlsZSA9IGZvcGVuIChsb2dmaWxlbmFtZSwgImEiKTsKKyAgICAgIGlmIChsYXN0X2xvZ2ZpbGUgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgfQorICBsb2dmaWxlID0gbGFzdF9sb2dmaWxlOworCisgIGZwcmludGYgKGxvZ2ZpbGUsICJkb21haW4gIik7CisgIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIGRvbWFpbm5hbWUpOworICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZCAiKTsKKyAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgbXNnaWQxKTsKKyAgaWYgKHBsdXJhbCkKKyAgICB7CisgICAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZF9wbHVyYWwgIik7CisgICAgICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBtc2dpZDIpOworICAgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnc3RyWzBdIFwiXCJcbiIpOworICAgIH0KKyAgZWxzZQorICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ3N0ciBcIlwiXG4iKTsKKyAgcHV0YyAoJ1xuJywgbG9nZmlsZSk7Cit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvbmdldHRleHQuYyBiL3VuaXgvaW50bC9uZ2V0dGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2UwMGMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbmdldHRleHQuYwpAQCAtMCwwICsxLDY1IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiBuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBfX25lZWRfTlVMTAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIE5HRVRURVhUIF9fbmdldHRleHQKKyMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgTkdFVFRFWFQgbGliaW50bF9uZ2V0dGV4dAorIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKyAgIHRleHQpLiAgKi8KK2NoYXIgKgorTkdFVFRFWFQgKGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICByZXR1cm4gRENOR0VUVEVYVCAoTlVMTCwgbXNnaWQxLCBtc2dpZDIsIG4sIExDX01FU1NBR0VTKTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fbmdldHRleHQsIG5nZXR0ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL29zMmNvbXBhdC5jIGIvdW5peC9pbnRsL29zMmNvbXBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGMzM2UKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvb3MyY29tcGF0LmMKQEAgLTAsMCArMSw5OCBAQAorLyogT1MvMiBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2RlZmluZSBPUzJfQVdBUkUKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisvKiBBIHZlcnNpb24gb2YgZ2V0ZW52KCkgdGhhdCB3b3JrcyBmcm9tIERMTHMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIERvc1NjYW5FbnYgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBzek5hbWUsIHVuc2lnbmVkIGNoYXIgKipwcHN6VmFsdWUpOworCitjaGFyICoKK19ubF9nZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOworICBpZiAoRG9zU2NhbkVudiAobmFtZSwgJnZhbHVlKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiB2YWx1ZTsKK30KKworLyogQSBmaXhlZCBzaXplIGJ1ZmZlci4gICovCitjaGFyIGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lW01BWFBBVEhMRU4rMV07CisKK2NoYXIgKl9ubG9zMl9saWJkaXIgPSBOVUxMOworY2hhciAqX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IE5VTEw7CitjaGFyICpfbmxvczJfbG9jYWxlZGlyID0gTlVMTDsKKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZAorbmxvczJfaW5pdGlhbGl6ZSAoKQoreworICBjaGFyICpyb290ID0gZ2V0ZW52ICgiVU5JWFJPT1QiKTsKKyAgY2hhciAqZ251bG9jYWxlZGlyID0gZ2V0ZW52ICgiR05VTE9DQUxFRElSIik7CisKKyAgX25sb3MyX2xpYmRpciA9IGdudWxvY2FsZWRpcjsKKyAgaWYgKCFfbmxvczJfbGliZGlyKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKyAgICAgICAgICBfbmxvczJfbGliZGlyID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTElCRElSKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciArIHNsLCBMSUJESVIsIHN0cmxlbiAoTElCRElSKSArIDEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9saWJkaXIgPSBMSUJESVI7CisgICAgfQorCisgIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBnbnVsb2NhbGVkaXI7CisgIGlmICghX25sb3MyX2xvY2FsZWFsaWFzcGF0aCkKKyAgICB7CisgICAgICBpZiAocm9vdCkKKyAgICAgICAgeworICAgICAgICAgIHNpemVfdCBzbCA9IHN0cmxlbiAocm9vdCk7CisgICAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWFsaWFzcGF0aCwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWFsaWFzcGF0aCArIHNsLCBMT0NBTEVfQUxJQVNfUEFUSCwgc3RybGVuIChMT0NBTEVfQUxJQVNfUEFUSCkgKyAxKTsKKyAgICAgICAgfQorICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKKyAgICB9CisKKyAgX25sb3MyX2xvY2FsZWRpciA9IGdudWxvY2FsZWRpcjsKKyAgaWYgKCFfbmxvczJfbG9jYWxlZGlyKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKyAgICAgICAgICBfbmxvczJfbG9jYWxlZGlyID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTE9DQUxFRElSKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciArIHNsLCBMT0NBTEVESVIsIHN0cmxlbiAoTE9DQUxFRElSKSArIDEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSBMT0NBTEVESVI7CisgICAgfQorCisgIGlmIChzdHJsZW4gKF9ubG9zMl9sb2NhbGVkaXIpIDw9IE1BWFBBVEhMRU4pCisgICAgc3RyY3B5IChsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZSwgX25sb3MyX2xvY2FsZWRpcik7Cit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvb3MyY29tcGF0LmggYi91bml4L2ludGwvb3MyY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NGU4YwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9vczJjb21wYXQuaApAQCAtMCwwICsxLDQ2IEBACisvKiBPUy8yIGNvbXBhdGliaWxpdHkgZGVmaW5lcy4KKyAgIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBmcm9tIGNvbmZpZy5oCisgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFdoZW4gaW5jbHVkZWQgZnJvbSBvczJjb21wYXQuaCB3ZSBuZWVkIGFsbCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbnMgKi8KKyNpZm5kZWYgT1MyX0FXQVJFCisKKyN1bmRlZiBMSUJESVIKKyNkZWZpbmUgTElCRElSCQkJX25sb3MyX2xpYmRpcgorZXh0ZXJuIGNoYXIgKl9ubG9zMl9saWJkaXI7CisKKyN1bmRlZiBMT0NBTEVESVIKKyNkZWZpbmUgTE9DQUxFRElSCQlfbmxvczJfbG9jYWxlZGlyCitleHRlcm4gY2hhciAqX25sb3MyX2xvY2FsZWRpcjsKKworI3VuZGVmIExPQ0FMRV9BTElBU19QQVRICisjZGVmaW5lIExPQ0FMRV9BTElBU19QQVRICV9ubG9zMl9sb2NhbGVhbGlhc3BhdGgKK2V4dGVybiBjaGFyICpfbmxvczJfbG9jYWxlYWxpYXNwYXRoOworCisjZW5kaWYKKworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorI2RlZmluZSBIQVZFX1NUUkNBU0VDTVAgMQorI2RlZmluZSBzdHJjYXNlY21wIHN0cmljbXAKKyNkZWZpbmUgc3RybmNhc2VjbXAgc3RybmljbXAKKworLyogV2UgaGF2ZSBvdXIgb3duIGdldGVudigpIHdoaWNoIHdvcmtzIGV2ZW4gaWYgbGlicmFyeSBpcyBjb21waWxlZCBhcyBETEwgKi8KKyNkZWZpbmUgZ2V0ZW52IF9ubF9nZXRlbnYKKworLyogT2xkZXIgdmVyc2lvbnMgb2YgZ2V0dGV4dCB1c2VkIC0xIGFzIHRoZSB2YWx1ZSBvZiBMQ19NRVNTQUdFUyAqLworI2RlZmluZSBMQ19NRVNTQUdFU19DT01QQVQgKC0xKQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL29zZGVwLmMgYi91bml4L2ludGwvb3NkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzcyNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL29zZGVwLmMKQEAgLTAsMCArMSwyNCBAQAorLyogT1MgZGVwZW5kZW50IHBhcnRzIG9mIGxpYmludGwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZiBkZWZpbmVkIF9fRU1YX18KKyMgaW5jbHVkZSAib3MyY29tcGF0LmMiCisjZWxzZQorLyogQXZvaWQgQUlYIGNvbXBpbGVyIHdhcm5pbmcuICAqLwordHlwZWRlZiBpbnQgZHVtbXk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wbHVyYWwtZXhwLmMgYi91bml4L2ludGwvcGx1cmFsLWV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDRlNjQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcGx1cmFsLWV4cC5jCkBAIC0wLDAgKzEsMTU0IEBACisvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorCisjaWYgKGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX19BUFBMRV9DQ19fKSBcCisgICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisKKy8qIFRoZXNlIHN0cnVjdHMgYXJlIHRoZSBjb25zdGFudCBleHByZXNzaW9uIGZvciB0aGUgZ2VybWFuaWMgcGx1cmFsCisgICBmb3JtIGRldGVybWluYXRpb24uICBJdCByZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICAibiAhPSAxIi4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gcGx2YXIgPQoreworICAubmFyZ3MgPSAwLAorICAub3BlcmF0aW9uID0gdmFyLAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZSA9Cit7CisgIC5uYXJncyA9IDAsCisgIC5vcGVyYXRpb24gPSBudW0sCisgIC52YWwgPQorICB7CisgICAgLm51bSA9IDEKKyAgfQorfTsKK3N0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTCA9Cit7CisgIC5uYXJncyA9IDIsCisgIC5vcGVyYXRpb24gPSBub3RfZXF1YWwsCisgIC52YWwgPQorICB7CisgICAgLmFyZ3MgPQorICAgIHsKKyAgICAgIFswXSA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSAmcGx2YXIsCisgICAgICBbMV0gPSAoc3RydWN0IGV4cHJlc3Npb24gKikgJnBsb25lCisgICAgfQorICB9Cit9OworCisjIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpCisKKyNlbHNlCisKKy8qIEZvciBjb21waWxlcnMgd2l0aG91dCBzdXBwb3J0IGZvciBJU08gQyA5OSBzdHJ1Y3QvdW5pb24gaW5pdGlhbGl6ZXJzOgorICAgSW5pdGlhbGl6YXRpb24gYXQgcnVuLXRpbWUuICAqLworCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gcGx2YXI7CitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gcGxvbmU7CitzdHJ1Y3QgZXhwcmVzc2lvbiBHRVJNQU5JQ19QTFVSQUw7CisKK3N0YXRpYyB2b2lkCitpbml0X2dlcm1hbmljX3BsdXJhbCAoKQoreworICBpZiAocGxvbmUudmFsLm51bSA9PSAwKQorICAgIHsKKyAgICAgIHBsdmFyLm5hcmdzID0gMDsKKyAgICAgIHBsdmFyLm9wZXJhdGlvbiA9IHZhcjsKKworICAgICAgcGxvbmUubmFyZ3MgPSAwOworICAgICAgcGxvbmUub3BlcmF0aW9uID0gbnVtOworICAgICAgcGxvbmUudmFsLm51bSA9IDE7CisKKyAgICAgIEdFUk1BTklDX1BMVVJBTC5uYXJncyA9IDI7CisgICAgICBHRVJNQU5JQ19QTFVSQUwub3BlcmF0aW9uID0gbm90X2VxdWFsOworICAgICAgR0VSTUFOSUNfUExVUkFMLnZhbC5hcmdzWzBdID0gJnBsdmFyOworICAgICAgR0VSTUFOSUNfUExVUkFMLnZhbC5hcmdzWzFdID0gJnBsb25lOworICAgIH0KK30KKworIyBkZWZpbmUgSU5JVF9HRVJNQU5JQ19QTFVSQUwoKSBpbml0X2dlcm1hbmljX3BsdXJhbCAoKQorCisjZW5kaWYKKwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK0VYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKGNvbnN0IGNoYXIgKm51bGxlbnRyeSwgc3RydWN0IGV4cHJlc3Npb24gKipwbHVyYWxwLAorCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKK3sKKyAgaWYgKG51bGxlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnBsdXJhbDsKKyAgICAgIGNvbnN0IGNoYXIgKm5wbHVyYWxzOworCisgICAgICBwbHVyYWwgPSBzdHJzdHIgKG51bGxlbnRyeSwgInBsdXJhbD0iKTsKKyAgICAgIG5wbHVyYWxzID0gc3Ryc3RyIChudWxsZW50cnksICJucGx1cmFscz0iKTsKKyAgICAgIGlmIChwbHVyYWwgPT0gTlVMTCB8fCBucGx1cmFscyA9PSBOVUxMKQorCWdvdG8gbm9fcGx1cmFsOworICAgICAgZWxzZQorCXsKKwkgIGNoYXIgKmVuZHA7CisJICB1bnNpZ25lZCBsb25nIGludCBuOworCSAgc3RydWN0IHBhcnNlX2FyZ3MgYXJnczsKKworCSAgLyogRmlyc3QgZ2V0IHRoZSBudW1iZXIuICAqLworCSAgbnBsdXJhbHMgKz0gOTsKKwkgIHdoaWxlICgqbnBsdXJhbHMgIT0gJ1wwJyAmJiBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKm5wbHVyYWxzKSkKKwkgICAgKytucGx1cmFsczsKKwkgIGlmICghKCpucGx1cmFscyA+PSAnMCcgJiYgKm5wbHVyYWxzIDw9ICc5JykpCisJICAgIGdvdG8gbm9fcGx1cmFsOworI2lmIGRlZmluZWQgSEFWRV9TVFJUT1VMIHx8IGRlZmluZWQgX0xJQkMKKwkgIG4gPSBzdHJ0b3VsIChucGx1cmFscywgJmVuZHAsIDEwKTsKKyNlbHNlCisJICBmb3IgKGVuZHAgPSBucGx1cmFscywgbiA9IDA7ICplbmRwID49ICcwJyAmJiAqZW5kcCA8PSAnOSc7IGVuZHArKykKKwkgICAgbiA9IG4gKiAxMCArICgqZW5kcCAtICcwJyk7CisjZW5kaWYKKwkgIGlmIChucGx1cmFscyA9PSBlbmRwKQorCSAgICBnb3RvIG5vX3BsdXJhbDsKKwkgICpucGx1cmFsc3AgPSBuOworCisJICAvKiBEdWUgdG8gdGhlIHJlc3RyaWN0aW9ucyBiaXNvbiBpbXBvc2VzIG9udG8gdGhlIGludGVyZmFjZSBvZiB0aGUKKwkgICAgIHNjYW5uZXIgZnVuY3Rpb24gd2UgaGF2ZSB0byBwdXQgdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIHJlc3VsdAorCSAgICAgcGFzc2VkIHVwIGZyb20gdGhlIHBhcnNlciBpbnRvIHRoZSBzYW1lIHN0cnVjdHVyZSB3aGljaCBhZGRyZXNzCisJICAgICBpcyBwYXNzZWQgZG93biB0byB0aGUgcGFyc2VyLiAgKi8KKwkgIHBsdXJhbCArPSA3OworCSAgYXJncy5jcCA9IHBsdXJhbDsKKwkgIGlmIChQTFVSQUxfUEFSU0UgKCZhcmdzKSAhPSAwKQorCSAgICBnb3RvIG5vX3BsdXJhbDsKKwkgICpwbHVyYWxwID0gYXJncy5yZXM7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEJ5IGRlZmF1bHQgd2UgYXJlIHVzaW5nIHRoZSBHZXJtYW5pYyBmb3JtOiBzaW5ndWxhciBmb3JtIG9ubHkKKyAgICAgICAgIGZvciBgb25lJywgdGhlIHBsdXJhbCBmb3JtIG90aGVyd2lzZS4gIFllcywgdGhpcyBpcyBhbHNvIHdoYXQKKyAgICAgICAgIEVuZ2xpc2ggaXMgdXNpbmcgc2luY2UgRW5nbGlzaCBpcyBhIEdlcm1hbmljIGxhbmd1YWdlLiAgKi8KKyAgICBub19wbHVyYWw6CisgICAgICBJTklUX0dFUk1BTklDX1BMVVJBTCAoKTsKKyAgICAgICpwbHVyYWxwID0gJkdFUk1BTklDX1BMVVJBTDsKKyAgICAgICpucGx1cmFsc3AgPSAyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wbHVyYWwtZXhwLmggYi91bml4L2ludGwvcGx1cmFsLWV4cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTJjNWIKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcGx1cmFsLWV4cC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiBFeHByZXNzaW9uIHBhcnNpbmcgYW5kIGV2YWx1YXRpb24gZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1BMVVJBTF9FWFBfSAorI2RlZmluZSBfUExVUkFMX0VYUF9ICisKKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisjZW5kaWYKKworI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCisjIGRlZmluZSBhdHRyaWJ1dGVfaGlkZGVuCisjZW5kaWYKKworCisvKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHRoZQorICAgcGx1cmFsIGZvcm0uICAqLworc3RydWN0IGV4cHJlc3Npb24KK3sKKyAgaW50IG5hcmdzOwkJCS8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBlbnVtIG9wZXJhdG9yCisgIHsKKyAgICAvKiBXaXRob3V0IGFyZ3VtZW50czogICovCisgICAgdmFyLAkJCS8qIFRoZSB2YXJpYWJsZSAibiIuICAqLworICAgIG51bSwJCQkvKiBEZWNpbWFsIG51bWJlci4gICovCisgICAgLyogVW5hcnkgb3BlcmF0b3JzOiAgKi8KKyAgICBsbm90LAkJCS8qIExvZ2ljYWwgTk9ULiAgKi8KKyAgICAvKiBCaW5hcnkgb3BlcmF0b3JzOiAgKi8KKyAgICBtdWx0LAkJCS8qIE11bHRpcGxpY2F0aW9uLiAgKi8KKyAgICBkaXZpZGUsCQkJLyogRGl2aXNpb24uICAqLworICAgIG1vZHVsZSwJCQkvKiBNb2R1bG8gb3BlcmF0aW9uLiAgKi8KKyAgICBwbHVzLAkJCS8qIEFkZGl0aW9uLiAgKi8KKyAgICBtaW51cywJCQkvKiBTdWJ0cmFjdGlvbi4gICovCisgICAgbGVzc190aGFuLAkJCS8qIENvbXBhcmlzb24uICAqLworICAgIGdyZWF0ZXJfdGhhbiwJCS8qIENvbXBhcmlzb24uICAqLworICAgIGxlc3Nfb3JfZXF1YWwsCQkvKiBDb21wYXJpc29uLiAgKi8KKyAgICBncmVhdGVyX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCisgICAgZXF1YWwsCQkJLyogQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkuICAqLworICAgIG5vdF9lcXVhbCwJCQkvKiBDb21wYXJpc29uIGZvciBpbmVxdWFsaXR5LiAgKi8KKyAgICBsYW5kLAkJCS8qIExvZ2ljYWwgQU5ELiAgKi8KKyAgICBsb3IsCQkJLyogTG9naWNhbCBPUi4gICovCisgICAgLyogVGVybmFyeSBvcGVyYXRvcnM6ICAqLworICAgIHFtb3AJCQkvKiBRdWVzdGlvbiBtYXJrIG9wZXJhdG9yLiAgKi8KKyAgfSBvcGVyYXRpb247CisgIHVuaW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBudW07CS8qIE51bWJlciB2YWx1ZSBmb3IgYG51bScuICAqLworICAgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwkvKiBVcCB0byB0aHJlZSBhcmd1bWVudHMuICAqLworICB9IHZhbDsKK307CisKKy8qIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIHBhcnNlciBhbmQgZ2V0CisgICB0aGUgcmVzdWx0IGluIGEgdGhyZWFkLXNhZmUgd2F5LiAgKi8KK3N0cnVjdCBwYXJzZV9hcmdzCit7CisgIGNvbnN0IGNoYXIgKmNwOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmVzOworfTsKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGlzIHNvdXJjZSBjb2RlIGlzIHVzZWQKKyAgIDEuIGluIHRoZSBHTlUgQyBMaWJyYXJ5IGxpYnJhcnksCisgICAyLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSwKKyAgIDMuIGluIHRoZSBHTlUgZ2V0dGV4dCB0b29scy4KKyAgIFRoZSBmdW5jdGlvbiBuYW1lcyBpbiBlYWNoIHNpdHVhdGlvbiBtdXN0IGJlIGRpZmZlcmVudCwgdG8gYWxsb3cgZm9yCisgICBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4gJ3N0cnVjdCBleHByZXNzaW9uJy4gIEZ1cnRoZXJtb3JlLAorICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwgdGhlIG5hbWVzIGhhdmUgYSBfXyBwcmVmaXgsCisgICAyLiszLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSBhbmQgaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLCB0aGUgbmFtZXMKKyAgICAgICAgIG11c3QgZm9sbG93IEFOU0kgQyBhbmQgbm90IHN0YXJ0IHdpdGggX18uCisgICBTbyB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHRoZSB0aHJlZSBjYXNlcy4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBfX2dldHRleHRfZnJlZV9leHAKKyMgZGVmaW5lIFBMVVJBTF9QQVJTRSBfX2dldHRleHRwYXJzZQorIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIF9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwKKyMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gX19nZXR0ZXh0X2V4dHJhY3RfcGx1cmFsCisjZWxpZiBkZWZpbmVkIChJTl9MSUJJTlRMKQorIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9mcmVlX2V4cAorIyBkZWZpbmUgUExVUkFMX1BBUlNFIGxpYmludGxfZ2V0dGV4dHBhcnNlCisjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgbGliaW50bF9nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAorIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBsaWJpbnRsX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKKyNlbHNlCisjIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gZnJlZV9wbHVyYWxfZXhwcmVzc2lvbgorIyBkZWZpbmUgUExVUkFMX1BBUlNFIHBhcnNlX3BsdXJhbF9leHByZXNzaW9uCisjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgZ2VybWFuaWNfcGx1cmFsCisjIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGV4dHJhY3RfcGx1cmFsX2V4cHJlc3Npb24KKyNlbmRpZgorCitleHRlcm4gdm9pZCBGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworZXh0ZXJuIGludCBQTFVSQUxfUEFSU0UgKHZvaWQgKmFyZyk7CitleHRlcm4gc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gdm9pZCBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChjb25zdCBjaGFyICpudWxsZW50cnksCisJCQkJICAgICAgIHN0cnVjdCBleHByZXNzaW9uICoqcGx1cmFscCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKyNpZiAhZGVmaW5lZCAoX0xJQkMpICYmICFkZWZpbmVkIChJTl9MSUJJTlRMKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHBsdXJhbF9ldmFsIChzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBuKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX1BMVVJBTF9FWFBfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3BsdXJhbC5jIGIvdW5peC9pbnRsL3BsdXJhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDk0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcGx1cmFsLmMKQEAgLTAsMCArMSwxNDkwIEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIHBsdXJhbC55CisgICBieSBHTlUgYmlzb24gMS4zNS4gICovCisKKyNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworCisjZGVmaW5lIHl5cGFyc2UgX19nZXR0ZXh0cGFyc2UKKyNkZWZpbmUgeXlsZXggX19nZXR0ZXh0bGV4CisjZGVmaW5lIHl5ZXJyb3IgX19nZXR0ZXh0ZXJyb3IKKyNkZWZpbmUgeXlsdmFsIF9fZ2V0dGV4dGx2YWwKKyNkZWZpbmUgeXljaGFyIF9fZ2V0dGV4dGNoYXIKKyNkZWZpbmUgeXlkZWJ1ZyBfX2dldHRleHRkZWJ1ZworI2RlZmluZSB5eW5lcnJzIF9fZ2V0dGV4dG5lcnJzCisjIGRlZmluZQlFUVVPUDIJMjU3CisjIGRlZmluZQlDTVBPUDIJMjU4CisjIGRlZmluZQlBRERPUDIJMjU5CisjIGRlZmluZQlNVUxPUDIJMjYwCisjIGRlZmluZQlOVU1CRVIJMjYxCisKKyNsaW5lIDEgInBsdXJhbC55IgorCisvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRoZSBiaXNvbiBnZW5lcmF0ZWQgcGFyc2VyIHVzZXMgYWxsb2NhLiAgQUlYIDMgZm9yY2VzIHVzIHRvIHB1dCB0aGlzCisgICBkZWNsYXJhdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgVGhlIGRlY2xhcmF0aW9uIGluIGJpc29uJ3MKKyAgIHNrZWxldG9uIGZpbGUgY29tZXMgdG9vIGxhdGUuICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPgorICAgYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlIGFyYml0cmFyeSBzeXN0ZW0gaGVhZGVycy4gICovCisjaWYgZGVmaW5lZCBfQUlYICYmICFkZWZpbmVkIF9fR05VQ19fCisgI3ByYWdtYSBhbGxvY2EKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorCisvKiBUaGUgbWFpbiBmdW5jdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciBpcyBjYWxsZWQgX19nZXR0ZXh0cGFyc2UsCisgICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KKyNpZm5kZWYgX0xJQkMKKyMgZGVmaW5lIF9fZ2V0dGV4dHBhcnNlIFBMVVJBTF9QQVJTRQorI2VuZGlmCisKKyNkZWZpbmUgWVlMRVhfUEFSQU0JJigoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+Y3AKKyNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKKworI2xpbmUgNDkgInBsdXJhbC55IgorI2lmbmRlZiBZWVNUWVBFCit0eXBlZGVmIHVuaW9uIHsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbnVtOworICBlbnVtIG9wZXJhdG9yIG9wOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworfSB5eXN0eXBlOworIyBkZWZpbmUgWVlTVFlQRSB5eXN0eXBlCisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQorI2VuZGlmCisjbGluZSA1NSAicGx1cmFsLnkiCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgaW50IHl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCk7CitzdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOworCisvKiBBbGxvY2F0aW9uIG9mIGV4cHJlc3Npb25zLiAgKi8KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHAgKGludCBuYXJncywgZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOworCisgIC8qIElmIGFueSBvZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIG1hbGxvYydlZCwganVzdCByZXR1cm4gTlVMTC4gICovCisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKKyAgICAgIGdvdG8gZmFpbDsKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KKyAgbmV3cCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsKKyAgaWYgKG5ld3AgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXdwLT5uYXJncyA9IG5hcmdzOworICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7CisgICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorCW5ld3AtPnZhbC5hcmdzW2ldID0gYXJnc1tpXTsKKyAgICAgIHJldHVybiBuZXdwOworICAgIH0KKworIGZhaWw6CisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgRlJFRV9FWFBSRVNTSU9OIChhcmdzW2ldKTsKKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzAgKGVudW0gb3BlcmF0b3Igb3ApCit7CisgIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8xIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCit7CisgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzFdOworCisgIGFyZ3NbMF0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDEsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMiAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmxlZnQsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07CisKKyAgYXJnc1swXSA9IGxlZnQ7CisgIGFyZ3NbMV0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDIsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzMgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpiZXhwLAorCSAgIHN0cnVjdCBleHByZXNzaW9uICp0YnJhbmNoLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZmJyYW5jaCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107CisKKyAgYXJnc1swXSA9IGJleHA7CisgIGFyZ3NbMV0gPSB0YnJhbmNoOworICBhcmdzWzJdID0gZmJyYW5jaDsKKyAgcmV0dXJuIG5ld19leHAgKDMsIG9wLCBhcmdzKTsKK30KKworI2lmbmRlZiBZWURFQlVHCisjIGRlZmluZSBZWURFQlVHIDAKKyNlbmRpZgorCisKKworI2RlZmluZQlZWUZJTkFMCQkyNworI2RlZmluZQlZWUZMQUcJCS0zMjc2OAorI2RlZmluZQlZWU5UQkFTRQkxNgorCisvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICovCisjZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI2MSA/IHl5dHJhbnNsYXRlW3hdIDogMTgpCisKKy8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPQoreworICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNSwgICAgIDIsCisgICAgICAxNCwgICAgMTUsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgIDEzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDYsICAgICA3LCAgICAgOCwKKyAgICAgICA5LCAgICAxMQorfTsKKworI2lmIFlZREVCVUcKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9Cit7CisgICAgICAgMCwgICAgIDAsICAgICAyLCAgICAgOCwgICAgMTIsICAgIDE2LCAgICAyMCwgICAgMjQsICAgIDI4LCAgICAzMiwKKyAgICAgIDM1LCAgICAzNywgICAgMzkKK307CitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9Cit7CisgICAgICAxNywgICAgIDAsICAgIDE3LCAgICAgMywgICAgMTcsICAgIDEyLCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgNCwKKyAgICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA1LCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgNiwgICAgMTcsICAgICAwLAorICAgICAgMTcsICAgICA3LCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgOCwgICAgMTcsICAgICAwLCAgICAxNywgICAgIDksCisgICAgICAxNywgICAgIDAsICAgIDEwLCAgICAxNywgICAgIDAsICAgIDEzLCAgICAgMCwgICAgMTEsICAgICAwLCAgICAxNCwKKyAgICAgIDE3LCAgICAxNSwgICAgIDAKK307CisKKyNlbmRpZgorCisjaWYgWVlERUJVRworLyogWVlSTElORVtZWU5dIC0tIHNvdXJjZSBsaW5lIHdoZXJlIHJ1bGUgbnVtYmVyIFlZTiB3YXMgZGVmaW5lZC4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPQoreworICAgICAgIDAsICAgMTUwLCAgIDE1OCwgICAxNjIsICAgMTY2LCAgIDE3MCwgICAxNzQsICAgMTc4LCAgIDE4MiwgICAxODYsCisgICAgIDE5MCwgICAxOTQsICAgMTk5Cit9OworI2VuZGlmCisKKworI2lmIChZWURFQlVHKSB8fCBkZWZpbmVkIFlZRVJST1JfVkVSQk9TRQorCisvKiBZWVROQU1FW1RPS0VOX05VTV0gLS0gU3RyaW5nIG5hbWUgb2YgdGhlIHRva2VuIFRPS0VOX05VTS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB5eXRuYW1lW10gPQoreworICAiJCIsICJlcnJvciIsICIkdW5kZWZpbmVkLiIsICInPyciLCAiJ3wnIiwgIicmJyIsICJFUVVPUDIiLCAiQ01QT1AyIiwgCisgICJBRERPUDIiLCAiTVVMT1AyIiwgIichJyIsICJOVU1CRVIiLCAiJzonIiwgIiduJyIsICInKCciLCAiJyknIiwgCisgICJzdGFydCIsICJleHAiLCAwCit9OworI2VuZGlmCisKKy8qIFlZUjFbWVlOXSAtLSBTeW1ib2wgbnVtYmVyIG9mIHN5bWJvbCB0aGF0IHJ1bGUgWVlOIGRlcml2ZXMuICovCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyMVtdID0KK3sKKyAgICAgICAwLCAgICAxNiwgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LAorICAgICAgMTcsICAgIDE3LCAgICAxNworfTsKKworLyogWVlSMltZWU5dIC0tIE51bWJlciBvZiBzeW1ib2xzIGNvbXBvc2luZyByaWdodCBoYW5kIHNpZGUgb2YgcnVsZSBZWU4uICovCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0KK3sKKyAgICAgICAwLCAgICAgMSwgICAgIDUsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAyLAorICAgICAgIDEsICAgICAxLCAgICAgMworfTsKKworLyogWVlERUZBQ1RbU10gLS0gZGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlIFMgd2hlbiBZWVRBQkxFCisgICBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuCisgICBlcnJvci4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0KK3sKKyAgICAgICAwLCAgICAgMCwgICAgMTEsICAgIDEwLCAgICAgMCwgICAgIDEsICAgICA5LCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMiwgICAgIDAsICAgICAzLCAgICAgNCwgICAgIDUsCisgICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgMCwgICAgIDIsICAgICAwLCAgICAgMCwgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9Cit7CisgICAgICAyNSwgICAgIDUKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBhY3RbXSA9Cit7CisgICAgICAtOSwgICAgLTksLTMyNzY4LC0zMjc2OCwgICAgLTksICAgIDM0LC0zMjc2OCwgICAgMTEsICAgIC05LCAgICAtOSwKKyAgICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwtMzI3NjgsICAgIDI0LCAgICAzOSwgICAgNDMsICAgIDE2LAorICAgICAgMjYsICAgIC0zLC0zMjc2OCwgICAgLTksICAgIDM0LCAgICAyMSwgICAgNTMsLTMyNzY4Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlwZ290b1tdID0KK3sKKyAgLTMyNzY4LCAgICAtMQorfTsKKworCisjZGVmaW5lCVlZTEFTVAkJNTMKKworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXl0YWJsZVtdID0KK3sKKyAgICAgICA2LCAgICAgMSwgICAgIDIsICAgICA3LCAgICAgMywgICAgIDQsICAgIDE0LCAgICAxNiwgICAgMTcsICAgIDE4LAorICAgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsCisgICAgICAxNCwgICAgMjYsICAgIDI0LCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxMywgICAgMTQsICAgIDIzLCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTEsCisgICAgICAxMiwgICAgMTMsICAgIDE0LCAgICAyNworfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5Y2hlY2tbXSA9Cit7CisgICAgICAgMSwgICAgMTAsICAgIDExLCAgICAgNCwgICAgMTMsICAgIDE0LCAgICAgOSwgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgICAwLCAgICAyMywgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTUsICAgICAzLCAgICAgNCwgICAgIDUsCisgICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDgsICAgICA5LCAgICAxMiwgICAgIDMsICAgICA0LCAgICAgNSwKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA2LAorICAgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDAKK307CisjZGVmaW5lIFlZUFVSRSAxCisKKy8qIC0qLUMtKi0gIE5vdGUgc29tZSBjb21waWxlcnMgY2hva2Ugb24gY29tbWVudHMgb24gYCNsaW5lJyBsaW5lcy4gICovCisjbGluZSAzICIvdXNyL2xvY2FsL3NoYXJlL2Jpc29uL2Jpc29uLnNpbXBsZSIKKworLyogU2tlbGV0b24gb3V0cHV0IHBhcnNlciBmb3IgYmlzb24sCisKKyAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCisgICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KKworLyogVGhpcyBpcyB0aGUgcGFyc2VyIGNvZGUgdGhhdCBpcyB3cml0dGVuIGludG8gZWFjaCBiaXNvbiBwYXJzZXIgd2hlbgorICAgdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KKyAgIEl0IHdhcyB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIGhhaXJ5IHBhcnNlcgorICAgdXNlZCB3aGVuICVzZW1hbnRpY19wYXJzZXIgaXMgc3BlY2lmaWVkLiAgKi8KKworLyogQWxsIHN5bWJvbHMgZGVmaW5lZCBiZWxvdyBzaG91bGQgYmVnaW4gd2l0aCB5eSBvciBZWSwgdG8gYXZvaWQKKyAgIGluZnJpbmdpbmcgb24gdXNlciBuYW1lIHNwYWNlLiAgVGhpcyBzaG91bGQgYmUgZG9uZSBldmVuIGZvciBsb2NhbAorICAgdmFyaWFibGVzLCBhcyB0aGV5IG1pZ2h0IG90aGVyd2lzZSBiZSBleHBhbmRlZCBieSB1c2VyIG1hY3Jvcy4KKyAgIFRoZXJlIGFyZSBzb21lIHVuYXZvaWRhYmxlIGV4Y2VwdGlvbnMgd2l0aGluIGluY2x1ZGUgZmlsZXMgdG8KKyAgIGRlZmluZSBuZWNlc3NhcnkgbGlicmFyeSBzeW1ib2xzOyB0aGV5IGFyZSBub3RlZCAiSU5GUklOR0VTIE9OCisgICBVU0VSIE5BTUUgU1BBQ0UiIGJlbG93LiAgKi8KKworI2lmICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKQorCisvKiBUaGUgcGFyc2VyIGludm9rZXMgYWxsb2NhIG9yIG1hbGxvYzsgZGVmaW5lIHRoZSBuZWNlc3Nhcnkgc3ltYm9scy4gICovCisKKyMgaWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICBkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKKyMgZWxzZQorIyAgaWZuZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgIGlmIGRlZmluZWQgKGFsbG9jYSkgfHwgZGVmaW5lZCAoX0FMTE9DQV9IKQorIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmZGVmIF9fR05VQ19fCisjICAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2J1aWx0aW5fYWxsb2NhCisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgWVlTVEFDS19BTExPQworICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAqLworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRShQdHIpIGRvIHsgLyogZW1wdHkgKi87IH0gd2hpbGUgKDApCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgIGVuZGlmCisjICBkZWZpbmUgWVlTVEFDS19BTExPQyBtYWxsb2MKKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUgZnJlZQorIyBlbmRpZgorI2VuZGlmIC8qICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKSAqLworCisKKyNpZiAoISBkZWZpbmVkICh5eW92ZXJmbG93KSBcCisgICAgICYmICghIGRlZmluZWQgKF9fY3BsdXNwbHVzKSBcCisJIHx8IChZWUxUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisKKy8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwordW5pb24geXlhbGxvYworeworICBzaG9ydCB5eXNzOworICBZWVNUWVBFIHl5dnM7CisjIGlmIFlZTFNQX05FRURFRAorICBZWUxUWVBFIHl5bHM7CisjIGVuZGlmCit9OworCisvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLworIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYIChzaXplb2YgKHVuaW9uIHl5YWxsb2MpIC0gMSkKKworLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCisgICBOIGVsZW1lbnRzLiAgKi8KKyMgaWYgWVlMU1BfTkVFREVECisjICBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCisgICAgICgoTikgKiAoc2l6ZW9mIChzaG9ydCkgKyBzaXplb2YgKFlZU1RZUEUpICsgc2l6ZW9mIChZWUxUWVBFKSkJXAorICAgICAgKyAyICogWVlTVEFDS19HQVBfTUFYKQorIyBlbHNlCisjICBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCisgICAgICgoTikgKiAoc2l6ZW9mIChzaG9ydCkgKyBzaXplb2YgKFlZU1RZUEUpKQkJCQlcCisgICAgICArIFlZU1RBQ0tfR0FQX01BWCkKKyMgZW5kaWYKKworLyogQ29weSBDT1VOVCBvYmplY3RzIGZyb20gRlJPTSB0byBUTy4gIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvCisgICBub3Qgb3ZlcmxhcC4gICovCisjIGlmbmRlZiBZWUNPUFkKKyMgIGlmIDEgPCBfX0dOVUNfXworIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KSBcCisgICAgICBfX2J1aWx0aW5fbWVtY3B5IChUbywgRnJvbSwgKENvdW50KSAqIHNpemVvZiAoKihGcm9tKSkpCisjICBlbHNlCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpCQlcCisgICAgICBkbwkJCQkJXAorCXsJCQkJCVwKKwkgIHJlZ2lzdGVyIFlZU0laRV9UIHl5aTsJCVwKKwkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKKwkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCisJfQkJCQkJXAorICAgICAgd2hpbGUgKDApCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKKyAgIGxvY2FsIHZhcmlhYmxlcyBZWVNJWkUgYW5kIFlZU1RBQ0tTSVpFIGdpdmUgdGhlIG9sZCBhbmQgbmV3IG51bWJlciBvZgorICAgZWxlbWVudHMgaW4gdGhlIHN0YWNrLCBhbmQgWVlQVFIgZ2l2ZXMgdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUKKyAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0CisgICBzdGFjay4gICovCisjIGRlZmluZSBZWVNUQUNLX1JFTE9DQVRFKFN0YWNrKQkJCQkJXAorICAgIGRvCQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlZWVNJWkVfVCB5eW5ld2J5dGVzOwkJCQkJCVwKKwlZWUNPUFkgKCZ5eXB0ci0+U3RhY2ssIFN0YWNrLCB5eXNpemUpOwkJCQlcCisJU3RhY2sgPSAmeXlwdHItPlN0YWNrOwkJCQkJCVwKKwl5eW5ld2J5dGVzID0geXlzdGFja3NpemUgKiBzaXplb2YgKCpTdGFjaykgKyBZWVNUQUNLX0dBUF9NQVg7CVwKKwl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHdoaWxlICgwKQorCisjZW5kaWYKKworCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoX19TSVpFX1RZUEVfXykKKyMgZGVmaW5lIFlZU0laRV9UIF9fU0laRV9UWVBFX18KKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKHNpemVfdCkKKyMgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZW5kaWYKKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCisjIGRlZmluZSBZWVNJWkVfVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCisjZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKKyNkZWZpbmUgWVlFTVBUWQkJLTIKKyNkZWZpbmUgWVlFT0YJCTAKKyNkZWZpbmUgWVlBQ0NFUFQJZ290byB5eWFjY2VwdGxhYgorI2RlZmluZSBZWUFCT1JUIAlnb3RvIHl5YWJvcnRsYWIKKyNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycmxhYjEKKy8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKKyAgIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCisgICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCisjZGVmaW5lIFlZQkFDS1VQKFRva2VuLCBWYWx1ZSkJCQkJCVwKK2RvCQkJCQkJCQlcCisgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCisgICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKKyAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAorICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCisgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCVwKKyAgICB7IAkJCQkJCQkJXAorICAgICAgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTsJCQlcCisgICAgICBZWUVSUk9SOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJXAord2hpbGUgKDApCisKKyNkZWZpbmUgWVlURVJST1IJMQorI2RlZmluZSBZWUVSUkNPREUJMjU2CisKKworLyogWVlMTE9DX0RFRkFVTFQgLS0gQ29tcHV0ZSB0aGUgZGVmYXVsdCBsb2NhdGlvbiAoYmVmb3JlIHRoZSBhY3Rpb25zCisgICBhcmUgcnVuKS4KKworICAgV2hlbiBZWUxMT0NfREVGQVVMVCBpcyBydW4sIENVUlJFTlQgaXMgc2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgIGZpcnN0IHRva2VuLiAgQnkgZGVmYXVsdCwgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIHJhbmdlcywgZXh0ZW5kCisgICBpdHMgcmFuZ2UgdG8gdGhlIGxhc3Qgc3ltYm9sLiAgKi8KKworI2lmbmRlZiBZWUxMT0NfREVGQVVMVAorIyBkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKSAgICAgICAJXAorICAgQ3VycmVudC5sYXN0X2xpbmUgICA9IFJoc1tOXS5sYXN0X2xpbmU7CVwKKyAgIEN1cnJlbnQubGFzdF9jb2x1bW4gPSBSaHNbTl0ubGFzdF9jb2x1bW47CisjZW5kaWYKKworCisvKiBZWUxFWCAtLSBjYWxsaW5nIGB5eWxleCcgd2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzLiAgKi8KKworI2lmIFlZUFVSRQorIyBpZiBZWUxTUF9ORUVERUQKKyMgIGlmZGVmIFlZTEVYX1BBUkFNCisjICAgZGVmaW5lIFlZTEVYCQl5eWxleCAoJnl5bHZhbCwgJnl5bGxvYywgWVlMRVhfUEFSQU0pCisjICBlbHNlCisjICAgZGVmaW5lIFlZTEVYCQl5eWxleCAoJnl5bHZhbCwgJnl5bGxvYykKKyMgIGVuZGlmCisjIGVsc2UgLyogIVlZTFNQX05FRURFRCAqLworIyAgaWZkZWYgWVlMRVhfUEFSQU0KKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsKQorIyAgZW5kaWYKKyMgZW5kaWYgLyogIVlZTFNQX05FRURFRCAqLworI2Vsc2UgLyogIVlZUFVSRSAqLworIyBkZWZpbmUgWVlMRVgJCQl5eWxleCAoKQorI2VuZGlmIC8qICFZWVBVUkUgKi8KKworCisvKiBFbmFibGUgZGVidWdnaW5nIGlmIHJlcXVlc3RlZC4gICovCisjaWYgWVlERUJVRworCisjIGlmbmRlZiBZWUZQUklOVEYKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWUZQUklOVEYgZnByaW50ZgorIyBlbmRpZgorCisjIGRlZmluZSBZWURQUklOVEYoQXJncykJCQlcCitkbyB7CQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCVwKKyAgICBZWUZQUklOVEYgQXJnczsJCQkJXAorfSB3aGlsZSAoMCkKKy8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAorICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCitpbnQgeXlkZWJ1ZzsKKyNlbHNlIC8qICFZWURFQlVHICovCisjIGRlZmluZSBZWURQUklOVEYoQXJncykKKyNlbmRpZiAvKiAhWVlERUJVRyAqLworCisvKiBZWUlOSVRERVBUSCAtLSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcy4gICovCisjaWZuZGVmCVlZSU5JVERFUFRICisjIGRlZmluZSBZWUlOSVRERVBUSCAyMDAKKyNlbmRpZgorCisvKiBZWU1BWERFUFRIIC0tIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvIChlZmZlY3RpdmUgb25seQorICAgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuCisKKyAgIERvIG5vdCBtYWtlIHRoaXMgdmFsdWUgdG9vIGxhcmdlOyB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmCisgICBTSVpFX01BWCA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCisgICBldmFsdWF0ZWQgd2l0aCBpbmZpbml0ZS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLiAgKi8KKworI2lmIFlZTUFYREVQVEggPT0gMAorIyB1bmRlZiBZWU1BWERFUFRICisjZW5kaWYKKworI2lmbmRlZiBZWU1BWERFUFRICisjIGRlZmluZSBZWU1BWERFUFRIIDEwMDAwCisjZW5kaWYKKwwKKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKworIyBpZm5kZWYgeXlzdHJsZW4KKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKQorIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KKyMgIGVsc2UKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFlZU1RSLiAgKi8KK3N0YXRpYyBZWVNJWkVfVAorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKKyMgICBlbHNlCit5eXN0cmxlbiAoeXlzdHIpCisgICAgIGNvbnN0IGNoYXIgKnl5c3RyOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3RyOworCisgIHdoaWxlICgqeXlzKysgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlzIC0geXlzdHIgLSAxOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgeXlzdHBjcHkKKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKSAmJiBkZWZpbmVkIChfR05VX1NPVVJDRSkKKyMgICBkZWZpbmUgeXlzdHBjcHkgc3RwY3B5CisjICBlbHNlCisvKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCisgICBZWURFU1QuICAqLworc3RhdGljIGNoYXIgKgorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQorIyAgIGVsc2UKK3l5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQorICAgICBjaGFyICp5eWRlc3Q7CisgICAgIGNvbnN0IGNoYXIgKnl5c3JjOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzcmM7CisKKyAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5ZCAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisMCisjbGluZSAzMTUgIi91c3IvbG9jYWwvc2hhcmUvYmlzb24vYmlzb24uc2ltcGxlIgorCisKKy8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKKyAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KKyAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCisgICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAorICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgdm9pZCAqWVlQQVJTRV9QQVJBTQorIyAgZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorIyBlbHNlCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQorIyAgZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTCB2b2lkICpZWVBBUlNFX1BBUkFNOworIyBlbmRpZgorI2Vsc2UgLyogIVlZUEFSU0VfUEFSQU0gKi8KKyMgZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCisjIGRlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKKyNlbmRpZiAvKiAhWVlQQVJTRV9QQVJBTSAqLworCisvKiBQcmV2ZW50IHdhcm5pbmcgaWYgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCisjaWZkZWYgX19HTlVDX18KKyMgaWZkZWYgWVlQQVJTRV9QQVJBTQoraW50IHl5cGFyc2UgKHZvaWQgKik7CisjIGVsc2UKK2ludCB5eXBhcnNlICh2b2lkKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBZWV9ERUNMX1ZBUklBQkxFUyAtLSBkZXBlbmRpbmcgd2hldGhlciB3ZSB1c2UgYSBwdXJlIHBhcnNlciwKKyAgIHZhcmlhYmxlcyBhcmUgZ2xvYmFsLCBvciBsb2NhbCB0byBZWVBBUlNFLiAgKi8KKworI2RlZmluZSBZWV9ERUNMX05PTl9MU1BfVkFSSUFCTEVTCQkJXAorLyogVGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwkJCQlcCitpbnQgeXljaGFyOwkJCQkJCVwKKwkJCQkJCQlcCisvKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2thaGVhZCBzeW1ib2wuICovCVwKK1lZU1RZUEUgeXlsdmFsOwkJCQkJCVwKKwkJCQkJCQlcCisvKiBOdW1iZXIgb2YgcGFyc2UgZXJyb3JzIHNvIGZhci4gICovCQkJXAoraW50IHl5bmVycnM7CisKKyNpZiBZWUxTUF9ORUVERUQKKyMgZGVmaW5lIFlZX0RFQ0xfVkFSSUFCTEVTCQkJXAorWVlfREVDTF9OT05fTFNQX1ZBUklBQkxFUwkJCVwKKwkJCQkJCVwKKy8qIExvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8JXAorWVlMVFlQRSB5eWxsb2M7CisjZWxzZQorIyBkZWZpbmUgWVlfREVDTF9WQVJJQUJMRVMJCQlcCitZWV9ERUNMX05PTl9MU1BfVkFSSUFCTEVTCisjZW5kaWYKKworCisvKiBJZiBub25yZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZS4gKi8KKworI2lmICFZWVBVUkUKK1lZX0RFQ0xfVkFSSUFCTEVTCisjZW5kaWYgIC8qICFZWVBVUkUgKi8KKworaW50Cit5eXBhcnNlIChZWVBBUlNFX1BBUkFNX0FSRykKKyAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCit7CisgIC8qIElmIHJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlLiAqLworI2lmIFlZUFVSRQorICBZWV9ERUNMX1ZBUklBQkxFUworI2VuZGlmICAvKiAhWVlQVVJFICovCisKKyAgcmVnaXN0ZXIgaW50IHl5c3RhdGU7CisgIHJlZ2lzdGVyIGludCB5eW47CisgIGludCB5eXJlc3VsdDsKKyAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCisgIGludCB5eWVycnN0YXR1czsKKyAgLyogTG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLworICBpbnQgeXljaGFyMSA9IDA7CisKKyAgLyogVGhyZWUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKKyAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcywKKyAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcywKKyAgICAgYHl5bHMnOiByZWxhdGVkIHRvIGxvY2F0aW9ucy4KKworICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKKyAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCisKKyAgLyogVGhlIHN0YXRlIHN0YWNrLiAqLworICBzaG9ydAl5eXNzYVtZWUlOSVRERVBUSF07CisgIHNob3J0ICp5eXNzID0geXlzc2E7CisgIHJlZ2lzdGVyIHNob3J0ICp5eXNzcDsKKworICAvKiBUaGUgc2VtYW50aWMgdmFsdWUgc3RhY2suICAqLworICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKKyAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOworICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKKworI2lmIFlZTFNQX05FRURFRAorICAvKiBUaGUgbG9jYXRpb24gc3RhY2suICAqLworICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsKKyAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOworICBZWUxUWVBFICp5eWxzcDsKKyNlbmRpZgorCisjaWYgWVlMU1BfTkVFREVECisjIGRlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCisjZWxzZQorIyBkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tKQorI2VuZGlmCisKKyAgWVlTSVpFX1QgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKworCisgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCB0byByZXR1cm4gc2VtYW50aWMgdmFsdWUgYW5kIGxvY2F0aW9uIGZyb20gdGhlCisgICAgIGFjdGlvbiByb3V0aW5lcy4gICovCisgIFlZU1RZUEUgeXl2YWw7CisjaWYgWVlMU1BfTkVFREVECisgIFlZTFRZUEUgeXlsb2M7CisjZW5kaWYKKworICAvKiBXaGVuIHJlZHVjaW5nLCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZAorICAgICBydWxlLiAqLworICBpbnQgeXlsZW47CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpKTsKKworICB5eXN0YXRlID0gMDsKKyAgeXllcnJzdGF0dXMgPSAwOworICB5eW5lcnJzID0gMDsKKyAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCisKKyAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KKyAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCisgICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KKyAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLworCisgIHl5c3NwID0geXlzczsKKyAgeXl2c3AgPSB5eXZzOworI2lmIFlZTFNQX05FRURFRAorICB5eWxzcCA9IHl5bHM7CisjZW5kaWYKKyAgZ290byB5eXNldHN0YXRlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgeXluZXdzdGF0ZToKKyAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKKyAgICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLgorICAgICAqLworICB5eXNzcCsrOworCisgeXlzZXRzdGF0ZToKKyAgKnl5c3NwID0geXlzdGF0ZTsKKworICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KKyAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7CisKKyNpZmRlZiB5eW92ZXJmbG93CisgICAgICB7CisJLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrLiBVc2UgY29waWVzIG9mCisJICAgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50bworCSAgIG1lbW9yeS4gICovCisJWVlTVFlQRSAqeXl2czEgPSB5eXZzOworCXNob3J0ICp5eXNzMSA9IHl5c3M7CisKKwkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKKwkgICBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCisjIGlmIFlZTFNQX05FRURFRAorCVlZTFRZUEUgKnl5bHMxID0geXlsczsKKwkvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCisJICAgYnV0IHRoYXQgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCisJeXlvdmVyZmxvdyAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCisJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAorCQkgICAgJnl5bHMxLCB5eXNpemUgKiBzaXplb2YgKCp5eWxzcCksCisJCSAgICAmeXlzdGFja3NpemUpOworCXl5bHMgPSB5eWxzMTsKKyMgZWxzZQorCXl5b3ZlcmZsb3cgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAorCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCisJCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisjIGVuZGlmCisJeXlzcyA9IHl5c3MxOworCXl5dnMgPSB5eXZzMTsKKyAgICAgIH0KKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKyAgICAgIGdvdG8geXlvdmVyZmxvd2xhYjsKKyMgZWxzZQorICAgICAgLyogRXh0ZW5kIHRoZSBzdGFjayBvdXIgb3duIHdheS4gICovCisgICAgICBpZiAoeXlzdGFja3NpemUgPj0gWVlNQVhERVBUSCkKKwlnb3RvIHl5b3ZlcmZsb3dsYWI7CisgICAgICB5eXN0YWNrc2l6ZSAqPSAyOworICAgICAgaWYgKHl5c3RhY2tzaXplID4gWVlNQVhERVBUSCkKKwl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7CisKKyAgICAgIHsKKwlzaG9ydCAqeXlzczEgPSB5eXNzOworCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KKwkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CisJaWYgKCEgeXlwdHIpCisJICBnb3RvIHl5b3ZlcmZsb3dsYWI7CisJWVlTVEFDS19SRUxPQ0FURSAoeXlzcyk7CisJWVlTVEFDS19SRUxPQ0FURSAoeXl2cyk7CisjIGlmIFlZTFNQX05FRURFRAorCVlZU1RBQ0tfUkVMT0NBVEUgKHl5bHMpOworIyBlbmRpZgorIyB1bmRlZiBZWVNUQUNLX1JFTE9DQVRFCisJaWYgKHl5c3MxICE9IHl5c3NhKQorCSAgWVlTVEFDS19GUkVFICh5eXNzMSk7CisgICAgICB9CisjIGVuZGlmCisjZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLworCisgICAgICB5eXNzcCA9IHl5c3MgKyB5eXNpemUgLSAxOworICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKKyNpZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHNwID0geXlscyArIHl5c2l6ZSAtIDE7CisjZW5kaWYKKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWx1XG4iLAorCQkgICh1bnNpZ25lZCBsb25nIGludCkgeXlzdGFja3NpemUpKTsKKworICAgICAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCisJWVlBQk9SVDsKKyAgICB9CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpKTsKKworICBnb3RvIHl5YmFja3VwOworCisKKy8qLS0tLS0tLS0tLS0uCit8IHl5YmFja3VwLiAgfAorYC0tLS0tLS0tLS0tKi8KK3l5YmFja3VwOgorCisvKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KKy8qIFJlYWQgYSBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworLyogeXlyZXN1bWU6ICovCisKKyAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCisKKyAgeXluID0geXlwYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IFlZRkxBRykKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworCisgIC8qIHl5Y2hhciBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRgorICAgICBvciBhIHZhbGlkIHRva2VuIGluIGV4dGVybmFsIGZvcm0uICAqLworCisgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKKyAgICB7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpKTsKKyAgICAgIHl5Y2hhciA9IFlZTEVYOworICAgIH0KKworICAvKiBDb252ZXJ0IHRva2VuIHRvIGludGVybmFsIGZvcm0gKGluIHl5Y2hhcjEpIGZvciBpbmRleGluZyB0YWJsZXMgd2l0aCAqLworCisgIGlmICh5eWNoYXIgPD0gMCkJCS8qIFRoaXMgbWVhbnMgZW5kIG9mIGlucHV0LiAqLworICAgIHsKKyAgICAgIHl5Y2hhcjEgPSAwOworICAgICAgeXljaGFyID0gWVlFT0Y7CQkvKiBEb24ndCBjYWxsIFlZTEVYIGFueSBtb3JlICovCisKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIk5vdyBhdCBlbmQgb2YgaW5wdXQuXG4iKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOworCisjaWYgWVlERUJVRworICAgICAvKiBXZSBoYXZlIHRvIGtlZXAgdGhpcyBgI2lmIFlZREVCVUcnLCBzaW5jZSB3ZSB1c2UgdmFyaWFibGVzCisJd2hpY2ggYXJlIGRlZmluZWQgb25seSBpZiBgWVlERUJVRycgaXMgc2V0LiAgKi8KKyAgICAgIGlmICh5eWRlYnVnKQorCXsKKwkgIFlZRlBSSU5URiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLAorCQkgICAgIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7CisJICAvKiBHaXZlIHRoZSBpbmRpdmlkdWFsIHBhcnNlciBhIHdheSB0byBwcmludCB0aGUgcHJlY2lzZQorCSAgICAgbWVhbmluZyBvZiBhIHRva2VuLCBmb3IgZnVydGhlciBkZWJ1Z2dpbmcgaW5mby4gICovCisjIGlmZGVmIFlZUFJJTlQKKwkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOworIyBlbmRpZgorCSAgWVlGUFJJTlRGIChzdGRlcnIsICIpXG4iKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgeXluICs9IHl5Y2hhcjE7CisgIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisKKyAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgorICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCisgICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgorICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCisgICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KKyAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLworCisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworICBZWURQUklOVEYgKChzdGRlcnIsICJTaGlmdGluZyB0b2tlbiAlZCAoJXMpLCAiLAorCSAgICAgIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSkpOworCisgIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCisgIGlmICh5eWNoYXIgIT0gWVlFT0YpCisgICAgeXljaGFyID0gWVlFTVBUWTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICAvKiBDb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yCisgICAgIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykKKyAgICB5eWVycnN0YXR1cy0tOworCisgIHl5c3RhdGUgPSB5eW47CisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWRlZmF1bHQgLS0gZG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWRlZmF1bHQ6CisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKyAgZ290byB5eXJlZHVjZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eXJlZHVjZSAtLSBEbyBhIHJlZHVjdGlvbi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eXJlZHVjZToKKyAgLyogeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KKyAgeXlsZW4gPSB5eXIyW3l5bl07CisKKyAgLyogSWYgWVlMRU4gaXMgbm9uemVybywgaW1wbGVtZW50IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb246CisgICAgIGAkJCA9ICQxJy4KKworICAgICBPdGhlcndpc2UsIHRoZSBmb2xsb3dpbmcgbGluZSBzZXRzIFlZVkFMIHRvIHRoZSBzZW1hbnRpYyB2YWx1ZSBvZgorICAgICB0aGUgbG9va2FoZWFkIHRva2VuLiAgVGhpcyBiZWhhdmlvciBpcyB1bmRvY3VtZW50ZWQgYW5kIEJpc29uCisgICAgIHVzZXJzIHNob3VsZCBub3QgcmVseSB1cG9uIGl0LiAgQXNzaWduaW5nIHRvIFlZVkFMCisgICAgIHVuY29uZGl0aW9uYWxseSBtYWtlcyB0aGUgcGFyc2VyIGEgYml0IHNtYWxsZXIsIGFuZCBpdCBhdm9pZHMgYQorICAgICBHQ0Mgd2FybmluZyB0aGF0IFlZVkFMIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuICAqLworICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOworCisjaWYgWVlMU1BfTkVFREVECisgIC8qIFNpbWlsYXJseSBmb3IgdGhlIGRlZmF1bHQgbG9jYXRpb24uICBMZXQgdGhlIHVzZXIgcnVuIGFkZGl0aW9uYWwKKyAgICAgY29tbWFuZHMgaWYgZm9yIGluc3RhbmNlIGxvY2F0aW9ucyBhcmUgcmFuZ2VzLiAgKi8KKyAgeXlsb2MgPSB5eWxzcFsxLXl5bGVuXTsKKyAgWVlMTE9DX0RFRkFVTFQgKHl5bG9jLCAoeXlsc3AgLSB5eWxlbiksIHl5bGVuKTsKKyNlbmRpZgorCisjaWYgWVlERUJVRworICAvKiBXZSBoYXZlIHRvIGtlZXAgdGhpcyBgI2lmIFlZREVCVUcnLCBzaW5jZSB3ZSB1c2UgdmFyaWFibGVzIHdoaWNoCisgICAgIGFyZSBkZWZpbmVkIG9ubHkgaWYgYFlZREVCVUcnIGlzIHNldC4gICovCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIGludCB5eWk7CisKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAorCQkgeXluLCB5eXJsaW5lW3l5bl0pOworCisgICAgICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KKyAgICAgIGZvciAoeXlpID0geXlwcmhzW3l5bl07IHl5cmhzW3l5aV0gPiAwOyB5eWkrKykKKwlZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbeXlpXV0pOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgLT4gJXNcbiIsIHl5dG5hbWVbeXlyMVt5eW5dXSk7CisgICAgfQorI2VuZGlmCisKKyAgc3dpdGNoICh5eW4pIHsKKworY2FzZSAxOgorI2xpbmUgMTUxICJwbHVyYWwueSIKK3sKKwkgICAgaWYgKHl5dnNwWzBdLmV4cCA9PSBOVUxMKQorCSAgICAgIFlZQUJPUlQ7CisJICAgICgoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+cmVzID0geXl2c3BbMF0uZXhwOworCSAgfQorICAgIGJyZWFrOworY2FzZSAyOgorI2xpbmUgMTU5ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8zIChxbW9wLCB5eXZzcFstNF0uZXhwLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSAzOgorI2xpbmUgMTYzICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yIChsb3IsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDQ6CisjbGluZSAxNjcgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKGxhbmQsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDU6CisjbGluZSAxNzEgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKHl5dnNwWy0xXS5vcCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgNjoKKyNsaW5lIDE3NSAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSA3OgorI2xpbmUgMTc5ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yICh5eXZzcFstMV0ub3AsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDg6CisjbGluZSAxODMgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKHl5dnNwWy0xXS5vcCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgOToKKyNsaW5lIDE4NyAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMSAobG5vdCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgMTA6CisjbGluZSAxOTEgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzAgKHZhcik7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDExOgorI2xpbmUgMTk1ICJwbHVyYWwueSIKK3sKKwkgICAgaWYgKCh5eXZhbC5leHAgPSBuZXdfZXhwXzAgKG51bSkpICE9IE5VTEwpCisJICAgICAgeXl2YWwuZXhwLT52YWwubnVtID0geXl2c3BbMF0ubnVtOworCSAgfQorICAgIGJyZWFrOworY2FzZSAxMjoKKyNsaW5lIDIwMCAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IHl5dnNwWy0xXS5leHA7CisJICB9CisgICAgYnJlYWs7Cit9CisKKyNsaW5lIDcwNSAiL3Vzci9sb2NhbC9zaGFyZS9iaXNvbi9iaXNvbi5zaW1wbGUiCisKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworI2lmIFlZTFNQX05FRURFRAorICB5eWxzcCAtPSB5eWxlbjsKKyNlbmRpZgorCisjaWYgWVlERUJVRworICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBzaG9ydCAqeXlzc3AxID0geXlzcyAtIDE7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgInN0YXRlIHN0YWNrIG5vdyIpOworICAgICAgd2hpbGUgKHl5c3NwMSAhPSB5eXNzcCkKKwlZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsICorK3l5c3NwMSk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CisgICAgfQorI2VuZGlmCisKKyAgKisreXl2c3AgPSB5eXZhbDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxvYzsKKyNlbmRpZgorCisgIC8qIE5vdyBgc2hpZnQnIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4gIERldGVybWluZSB3aGF0IHN0YXRlCisgICAgIHRoYXQgZ29lcyB0bywgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvIGFuZCB0aGUgcnVsZQorICAgICBudW1iZXIgcmVkdWNlZCBieS4gICovCisKKyAgeXluID0geXlyMVt5eW5dOworCisgIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKKyAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOworCisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJsYWIgLS0gaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjoKKyAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCisgIGlmICgheXllcnJzdGF0dXMpCisgICAgeworICAgICAgKyt5eW5lcnJzOworCisjaWZkZWYgWVlFUlJPUl9WRVJCT1NFCisgICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisKKyAgICAgIGlmICh5eW4gPiBZWUZMQUcgJiYgeXluIDwgWVlMQVNUKQorCXsKKwkgIFlZU0laRV9UIHl5c2l6ZSA9IDA7CisJICBjaGFyICp5eW1zZzsKKwkgIGludCB5eXgsIHl5Y291bnQ7CisKKwkgIHl5Y291bnQgPSAwOworCSAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgorCSAgICAgWVlDSEVDSy4gICovCisJICBmb3IgKHl5eCA9IHl5biA8IDAgPyAteXluIDogMDsKKwkgICAgICAgeXl4IDwgKGludCkgKHNpemVvZiAoeXl0bmFtZSkgLyBzaXplb2YgKGNoYXIgKikpOyB5eXgrKykKKwkgICAgaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXgpCisJICAgICAgeXlzaXplICs9IHl5c3RybGVuICh5eXRuYW1lW3l5eF0pICsgMTUsIHl5Y291bnQrKzsKKwkgIHl5c2l6ZSArPSB5eXN0cmxlbiAoInBhcnNlIGVycm9yLCB1bmV4cGVjdGVkICIpICsgMTsKKwkgIHl5c2l6ZSArPSB5eXN0cmxlbiAoeXl0bmFtZVtZWVRSQU5TTEFURSAoeXljaGFyKV0pOworCSAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eXNpemUpOworCSAgaWYgKHl5bXNnICE9IDApCisJICAgIHsKKwkgICAgICBjaGFyICp5eXAgPSB5eXN0cGNweSAoeXltc2csICJwYXJzZSBlcnJvciwgdW5leHBlY3RlZCAiKTsKKwkgICAgICB5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW1lZVFJBTlNMQVRFICh5eWNoYXIpXSk7CisKKwkgICAgICBpZiAoeXljb3VudCA8IDUpCisJCXsKKwkJICB5eWNvdW50ID0gMDsKKwkJICBmb3IgKHl5eCA9IHl5biA8IDAgPyAteXluIDogMDsKKwkJICAgICAgIHl5eCA8IChpbnQpIChzaXplb2YgKHl5dG5hbWUpIC8gc2l6ZW9mIChjaGFyICopKTsKKwkJICAgICAgIHl5eCsrKQorCQkgICAgaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXgpCisJCSAgICAgIHsKKwkJCWNvbnN0IGNoYXIgKnl5cSA9ICEgeXljb3VudCA/ICIsIGV4cGVjdGluZyAiIDogIiBvciAiOworCQkJeXlwID0geXlzdHBjcHkgKHl5cCwgeXlxKTsKKwkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5dG5hbWVbeXl4XSk7CisJCQl5eWNvdW50Kys7CisJCSAgICAgIH0KKwkJfQorCSAgICAgIHl5ZXJyb3IgKHl5bXNnKTsKKwkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7CisJfQorICAgICAgZWxzZQorI2VuZGlmIC8qIGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkgKi8KKwl5eWVycm9yICgicGFyc2UgZXJyb3IiKTsKKyAgICB9CisgIGdvdG8geXllcnJsYWIxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiMSAtLSBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJybGFiMToKKyAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCisgICAgeworICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbgorCSBlcnJvciwgZGlzY2FyZCBpdC4gICovCisKKyAgICAgIC8qIHJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dCAqLworICAgICAgaWYgKHl5Y2hhciA9PSBZWUVPRikKKwlZWUFCT1JUOworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwKKwkJICB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pKTsKKyAgICAgIHl5Y2hhciA9IFlZRU1QVFk7CisgICAgfQorCisgIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvcgorICAgICB0b2tlbi4gICovCisKKyAgeXllcnJzdGF0dXMgPSAzOwkJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzICovCisKKyAgZ290byB5eWVycmhhbmRsZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJyZGVmYXVsdCAtLSBjdXJyZW50IHN0YXRlIGRvZXMgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoZSB8Cit8IGVycm9yIHRva2VuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmRlZmF1bHQ6CisjaWYgMAorICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKKyAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLworCisgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4gICovCisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluKQorICAgIGdvdG8geXlkZWZhdWx0OworI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJycG9wIC0tIHBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIHwKK3wgZXJyb3IgdG9rZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycnBvcDoKKyAgaWYgKHl5c3NwID09IHl5c3MpCisgICAgWVlBQk9SVDsKKyAgeXl2c3AtLTsKKyAgeXlzdGF0ZSA9ICotLXl5c3NwOworI2lmIFlZTFNQX05FRURFRAorICB5eWxzcC0tOworI2VuZGlmCisKKyNpZiBZWURFQlVHCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICp5eXNzcDEgPSB5eXNzIC0gMTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOworICAgICAgd2hpbGUgKHl5c3NwMSAhPSB5eXNzcCkKKwlZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsICorK3l5c3NwMSk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CisgICAgfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJyaGFuZGxlLiAgfAorYC0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJyaGFuZGxlOgorICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXllcnJkZWZhdWx0OworCisgIHl5biArPSBZWVRFUlJPUjsKKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKKyAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJwb3A7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJwb3A7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlNoaWZ0aW5nIGVycm9yIHRva2VuLCAiKSk7CisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisjaWYgWVlMU1BfTkVFREVECisgICorK3l5bHNwID0geXlsbG9jOworI2VuZGlmCisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhY2NlcHRsYWIgLS0gWVlBQ0NFUFQgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWNjZXB0bGFiOgorICB5eXJlc3VsdCA9IDA7CisgIGdvdG8geXlyZXR1cm47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5YWJvcnRsYWIgLS0gWVlBQk9SVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWJvcnRsYWI6CisgIHl5cmVzdWx0ID0gMTsKKyAgZ290byB5eXJldHVybjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5b3ZlcmZsb3dhYiAtLSBwYXJzZXIgb3ZlcmZsb3cgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlvdmVyZmxvd2xhYjoKKyAgeXllcnJvciAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIpOworICB5eXJlc3VsdCA9IDI7CisgIC8qIEZhbGwgdGhyb3VnaC4gICovCisKK3l5cmV0dXJuOgorI2lmbmRlZiB5eW92ZXJmbG93CisgIGlmICh5eXNzICE9IHl5c3NhKQorICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7CisjZW5kaWYKKyAgcmV0dXJuIHl5cmVzdWx0OworfQorI2xpbmUgMjA1ICJwbHVyYWwueSIKKworCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQoreworICBpZiAoZXhwID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLworICBzd2l0Y2ggKGV4cC0+bmFyZ3MpCisgICAgeworICAgIGNhc2UgMzoKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1syXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgMjoKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1sxXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgMToKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1swXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgZnJlZSAoZXhwKTsKK30KKworCitzdGF0aWMgaW50Cit5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCit7CisgIGNvbnN0IGNoYXIgKmV4cCA9ICpwZXhwOworICBpbnQgcmVzdWx0OworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChleHBbMF0gPT0gJ1wwJykKKwl7CisJICAqcGV4cCA9IGV4cDsKKwkgIHJldHVybiBZWUVPRjsKKwl9CisKKyAgICAgIGlmIChleHBbMF0gIT0gJyAnICYmIGV4cFswXSAhPSAnXHQnKQorCWJyZWFrOworCisgICAgICArK2V4cDsKKyAgICB9CisKKyAgcmVzdWx0ID0gKmV4cCsrOworICBzd2l0Y2ggKHJlc3VsdCkKKyAgICB7CisgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIGludCBuID0gcmVzdWx0IC0gJzAnOworCXdoaWxlIChleHBbMF0gPj0gJzAnICYmIGV4cFswXSA8PSAnOScpCisJICB7CisJICAgIG4gKj0gMTA7CisJICAgIG4gKz0gZXhwWzBdIC0gJzAnOworCSAgICArK2V4cDsKKwkgIH0KKwlsdmFsLT5udW0gPSBuOworCXJlc3VsdCA9IE5VTUJFUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPSc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gZXF1YWw7CisJICByZXN1bHQgPSBFUVVPUDI7CisJfQorICAgICAgZWxzZQorCXJlc3VsdCA9IFlZRVJSQ09ERTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnISc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gbm90X2VxdWFsOworCSAgcmVzdWx0ID0gRVFVT1AyOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJic6CisgICAgY2FzZSAnfCc6CisgICAgICBpZiAoZXhwWzBdID09IHJlc3VsdCkKKwkrK2V4cDsKKyAgICAgIGVsc2UKKwlyZXN1bHQgPSBZWUVSUkNPREU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7CisJfQorICAgICAgZWxzZQorCWx2YWwtPm9wID0gbGVzc190aGFuOworICAgICAgcmVzdWx0ID0gQ01QT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBncmVhdGVyX29yX2VxdWFsOworCX0KKyAgICAgIGVsc2UKKwlsdmFsLT5vcCA9IGdyZWF0ZXJfdGhhbjsKKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKic6CisgICAgICBsdmFsLT5vcCA9IG11bHQ7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy8nOgorICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyUnOgorICAgICAgbHZhbC0+b3AgPSBtb2R1bGU7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJysnOgorICAgICAgbHZhbC0+b3AgPSBwbHVzOworICAgICAgcmVzdWx0ID0gQURET1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICctJzoKKyAgICAgIGx2YWwtPm9wID0gbWludXM7CisgICAgICByZXN1bHQgPSBBRERPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ24nOgorICAgIGNhc2UgJz8nOgorICAgIGNhc2UgJzonOgorICAgIGNhc2UgJygnOgorICAgIGNhc2UgJyknOgorICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgJzsnOgorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdcMCc6CisgICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KKyAgICAgIC0tZXhwOworICAgICAgcmVzdWx0ID0gWVlFT0Y7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSBZWUVSUkNPREU7CisjaWYgWVlERUJVRyAhPSAwCisgICAgICAtLWV4cDsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorCisgICpwZXhwID0gZXhwOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQKK3l5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgLyogRG8gbm90aGluZy4gIFdlIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUuICAqLworfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3BsdXJhbC55IGIvdW5peC9pbnRsL3BsdXJhbC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzNiZDcKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcGx1cmFsLnkKQEAgLTAsMCArMSwzODEgQEAKKyV7CisvKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRoZSBiaXNvbiBnZW5lcmF0ZWQgcGFyc2VyIHVzZXMgYWxsb2NhLiAgQUlYIDMgZm9yY2VzIHVzIHRvIHB1dCB0aGlzCisgICBkZWNsYXJhdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgVGhlIGRlY2xhcmF0aW9uIGluIGJpc29uJ3MKKyAgIHNrZWxldG9uIGZpbGUgY29tZXMgdG9vIGxhdGUuICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPgorICAgYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlIGFyYml0cmFyeSBzeXN0ZW0gaGVhZGVycy4gICovCisjaWYgZGVmaW5lZCBfQUlYICYmICFkZWZpbmVkIF9fR05VQ19fCisgI3ByYWdtYSBhbGxvY2EKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorCisvKiBUaGUgbWFpbiBmdW5jdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciBpcyBjYWxsZWQgX19nZXR0ZXh0cGFyc2UsCisgICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KKyNpZm5kZWYgX0xJQkMKKyMgZGVmaW5lIF9fZ2V0dGV4dHBhcnNlIFBMVVJBTF9QQVJTRQorI2VuZGlmCisKKyNkZWZpbmUgWVlMRVhfUEFSQU0JJigoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+Y3AKKyNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKKyV9CislcHVyZV9wYXJzZXIKKyVleHBlY3QgNworCisldW5pb24geworICB1bnNpZ25lZCBsb25nIGludCBudW07CisgIGVudW0gb3BlcmF0b3Igb3A7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHA7Cit9CisKKyV7CisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworc3RhdGljIGludCB5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApOworc3RhdGljIHZvaWQgeXllcnJvciAoY29uc3QgY2hhciAqc3RyKTsKKworLyogQWxsb2NhdGlvbiBvZiBleHByZXNzaW9ucy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwIChpbnQgbmFyZ3MsIGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICogY29uc3QgKmFyZ3MpCit7CisgIGludCBpOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmV3cDsKKworICAvKiBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBtYWxsb2MnZWQsIGp1c3QgcmV0dXJuIE5VTEwuICAqLworICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIGlmIChhcmdzW2ldID09IE5VTEwpCisgICAgICBnb3RvIGZhaWw7CisKKyAgLyogQWxsb2NhdGUgYSBuZXcgZXhwcmVzc2lvbi4gICovCisgIG5ld3AgPSAoc3RydWN0IGV4cHJlc3Npb24gKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7CisgIGlmIChuZXdwICE9IE5VTEwpCisgICAgeworICAgICAgbmV3cC0+bmFyZ3MgPSBuYXJnczsKKyAgICAgIG5ld3AtPm9wZXJhdGlvbiA9IG9wOworICAgICAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKwluZXdwLT52YWwuYXJnc1tpXSA9IGFyZ3NbaV07CisgICAgICByZXR1cm4gbmV3cDsKKyAgICB9CisKKyBmYWlsOgorICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIEZSRUVfRVhQUkVTU0lPTiAoYXJnc1tpXSk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8wIChlbnVtIG9wZXJhdG9yIG9wKQoreworICByZXR1cm4gbmV3X2V4cCAoMCwgb3AsIE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMSAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1sxXTsKKworICBhcmdzWzBdID0gcmlnaHQ7CisgIHJldHVybiBuZXdfZXhwICgxLCBvcCwgYXJncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzIgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpsZWZ0LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCit7CisgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzJdOworCisgIGFyZ3NbMF0gPSBsZWZ0OworICBhcmdzWzFdID0gcmlnaHQ7CisgIHJldHVybiBuZXdfZXhwICgyLCBvcCwgYXJncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8zIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqYmV4cCwKKwkgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqdGJyYW5jaCwgc3RydWN0IGV4cHJlc3Npb24gKmZicmFuY2gpCit7CisgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOworCisgIGFyZ3NbMF0gPSBiZXhwOworICBhcmdzWzFdID0gdGJyYW5jaDsKKyAgYXJnc1syXSA9IGZicmFuY2g7CisgIHJldHVybiBuZXdfZXhwICgzLCBvcCwgYXJncyk7Cit9CisKKyV9CisKKy8qIFRoaXMgZGVjbGFyZXMgdGhhdCBhbGwgb3BlcmF0b3JzIGhhdmUgdGhlIHNhbWUgYXNzb2NpYXRpdml0eSBhbmQgdGhlCisgICBwcmVjZWRlbmNlIG9yZGVyIGFzIGluIEMuICBTZWUgW0hhcmJpc29uLCBTdGVlbGU6IEMsIEEgUmVmZXJlbmNlIE1hbnVhbF0uCisgICBUaGVyZSBpcyBubyB1bmFyeSBtaW51cyBhbmQgbm8gYml0d2lzZSBvcGVyYXRvcnMuCisgICBPcGVyYXRvcnMgd2l0aCB0aGUgc2FtZSBzeW50YWN0aWMgYmVoYXZpb3VyIGhhdmUgYmVlbiBtZXJnZWQgaW50byBhIHNpbmdsZQorICAgdG9rZW4sIHRvIHNhdmUgc3BhY2UgaW4gdGhlIGFycmF5IGdlbmVyYXRlZCBieSBiaXNvbi4gICovCislcmlnaHQgJz8nCQkvKiAgID8JCSovCislbGVmdCAnfCcJCS8qICAgfHwJCSovCislbGVmdCAnJicJCS8qICAgJiYJCSovCislbGVmdCBFUVVPUDIJCS8qICAgPT0gIT0JKi8KKyVsZWZ0IENNUE9QMgkJLyogICA8ID4gPD0gPj0JKi8KKyVsZWZ0IEFERE9QMgkJLyogICArIC0JKi8KKyVsZWZ0IE1VTE9QMgkJLyogICAqIC8gJQkqLworJXJpZ2h0ICchJwkJLyogICAhCQkqLworCisldG9rZW4gPG9wPiBFUVVPUDIgQ01QT1AyIEFERE9QMiBNVUxPUDIKKyV0b2tlbiA8bnVtPiBOVU1CRVIKKyV0eXBlIDxleHA+IGV4cAorCislJQorCitzdGFydDoJICBleHAKKwkgIHsKKwkgICAgaWYgKCQxID09IE5VTEwpCisJICAgICAgWVlBQk9SVDsKKwkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSAkMTsKKwkgIH0KKwk7CisKK2V4cDoJICBleHAgJz8nIGV4cCAnOicgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8zIChxbW9wLCAkMSwgJDMsICQ1KTsKKwkgIH0KKwl8IGV4cCAnfCcgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8yIChsb3IsICQxLCAkMyk7CisJICB9CisJfCBleHAgJyYnIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMiAobGFuZCwgJDEsICQzKTsKKwkgIH0KKwl8IGV4cCBFUVVPUDIgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKKwkgIH0KKwl8IGV4cCBDTVBPUDIgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKKwkgIH0KKwl8IGV4cCBBRERPUDIgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKKwkgIH0KKwl8IGV4cCBNVUxPUDIgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKKwkgIH0KKwl8ICchJyBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzEgKGxub3QsICQyKTsKKwkgIH0KKwl8ICduJworCSAgeworCSAgICAkJCA9IG5ld19leHBfMCAodmFyKTsKKwkgIH0KKwl8IE5VTUJFUgorCSAgeworCSAgICBpZiAoKCQkID0gbmV3X2V4cF8wIChudW0pKSAhPSBOVUxMKQorCSAgICAgICQkLT52YWwubnVtID0gJDE7CisJICB9CisJfCAnKCcgZXhwICcpJworCSAgeworCSAgICAkJCA9ICQyOworCSAgfQorCTsKKworJSUKKwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK0ZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKK3sKKyAgaWYgKGV4cCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBIYW5kbGUgdGhlIHJlY3Vyc2l2ZSBjYXNlLiAgKi8KKyAgc3dpdGNoIChleHAtPm5hcmdzKQorICAgIHsKKyAgICBjYXNlIDM6CisgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMl0pOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIDI6CisgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMV0pOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIDE6CisgICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMF0pOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIGZyZWUgKGV4cCk7Cit9CisKKworc3RhdGljIGludAoreXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKQoreworICBjb25zdCBjaGFyICpleHAgPSAqcGV4cDsKKyAgaW50IHJlc3VsdDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoZXhwWzBdID09ICdcMCcpCisJeworCSAgKnBleHAgPSBleHA7CisJICByZXR1cm4gWVlFT0Y7CisJfQorCisgICAgICBpZiAoZXhwWzBdICE9ICcgJyAmJiBleHBbMF0gIT0gJ1x0JykKKwlicmVhazsKKworICAgICAgKytleHA7CisgICAgfQorCisgIHJlc3VsdCA9ICpleHArKzsKKyAgc3dpdGNoIChyZXN1bHQpCisgICAgeworICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICB7CisJdW5zaWduZWQgbG9uZyBpbnQgbiA9IHJlc3VsdCAtICcwJzsKKwl3aGlsZSAoZXhwWzBdID49ICcwJyAmJiBleHBbMF0gPD0gJzknKQorCSAgeworCSAgICBuICo9IDEwOworCSAgICBuICs9IGV4cFswXSAtICcwJzsKKwkgICAgKytleHA7CisJICB9CisJbHZhbC0+bnVtID0gbjsKKwlyZXN1bHQgPSBOVU1CRVI7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJz0nOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGVxdWFsOworCSAgcmVzdWx0ID0gRVFVT1AyOworCX0KKyAgICAgIGVsc2UKKwlyZXN1bHQgPSBZWUVSUkNPREU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyEnOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IG5vdF9lcXVhbDsKKwkgIHJlc3VsdCA9IEVRVU9QMjsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyYnOgorICAgIGNhc2UgJ3wnOgorICAgICAgaWYgKGV4cFswXSA9PSByZXN1bHQpCisJKytleHA7CisgICAgICBlbHNlCisJcmVzdWx0ID0gWVlFUlJDT0RFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc8JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBsZXNzX29yX2VxdWFsOworCX0KKyAgICAgIGVsc2UKKwlsdmFsLT5vcCA9IGxlc3NfdGhhbjsKKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPic6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gZ3JlYXRlcl9vcl9lcXVhbDsKKwl9CisgICAgICBlbHNlCisJbHZhbC0+b3AgPSBncmVhdGVyX3RoYW47CisgICAgICByZXN1bHQgPSBDTVBPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyonOgorICAgICAgbHZhbC0+b3AgPSBtdWx0OworICAgICAgcmVzdWx0ID0gTVVMT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcvJzoKKyAgICAgIGx2YWwtPm9wID0gZGl2aWRlOworICAgICAgcmVzdWx0ID0gTVVMT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICclJzoKKyAgICAgIGx2YWwtPm9wID0gbW9kdWxlOworICAgICAgcmVzdWx0ID0gTVVMT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcrJzoKKyAgICAgIGx2YWwtPm9wID0gcGx1czsKKyAgICAgIHJlc3VsdCA9IEFERE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnLSc6CisgICAgICBsdmFsLT5vcCA9IG1pbnVzOworICAgICAgcmVzdWx0ID0gQURET1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICduJzoKKyAgICBjYXNlICc/JzoKKyAgICBjYXNlICc6JzoKKyAgICBjYXNlICcoJzoKKyAgICBjYXNlICcpJzoKKyAgICAgIC8qIE5vdGhpbmcsIGp1c3QgcmV0dXJuIHRoZSBjaGFyYWN0ZXIuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc7JzoKKyAgICBjYXNlICdcbic6CisgICAgY2FzZSAnXDAnOgorICAgICAgLyogQmUgc2FmZSBhbmQgbGV0IHRoZSB1c2VyIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2Fpbi4gICovCisgICAgICAtLWV4cDsKKyAgICAgIHJlc3VsdCA9IFlZRU9GOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gWVlFUlJDT0RFOworI2lmIFlZREVCVUcgIT0gMAorICAgICAgLS1leHA7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKworICAqcGV4cCA9IGV4cDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkCit5eWVycm9yIChjb25zdCBjaGFyICpzdHIpCit7CisgIC8qIERvIG5vdGhpbmcuICBXZSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlLiAgKi8KK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYtYXJncy5jIGIvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmMzIxOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wcmludGYtYXJncy5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKyNpbmNsdWRlICJwcmludGYtYXJncy5oIgorCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbmRpZgoraW50CitwcmludGZfZmV0Y2hhcmdzICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSkKK3sKKyAgc2l6ZV90IGk7CisgIGFyZ3VtZW50ICphcDsKKworICBmb3IgKGkgPSAwLCBhcCA9ICZhLT5hcmdbMF07IGkgPCBhLT5jb3VudDsgaSsrLCBhcCsrKQorICAgIHN3aXRjaCAoYXAtPnR5cGUpCisgICAgICB7CisgICAgICBjYXNlIFRZUEVfU0NIQVI6CisJYXAtPmEuYV9zY2hhciA9IHZhX2FyZyAoYXJncywgLypzaWduZWQgY2hhciovIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfVUNIQVI6CisJYXAtPmEuYV91Y2hhciA9IHZhX2FyZyAoYXJncywgLyp1bnNpZ25lZCBjaGFyKi8gaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9TSE9SVDoKKwlhcC0+YS5hX3Nob3J0ID0gdmFfYXJnIChhcmdzLCAvKnNob3J0Ki8gaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VU0hPUlQ6CisJYXAtPmEuYV91c2hvcnQgPSB2YV9hcmcgKGFyZ3MsIC8qdW5zaWduZWQgc2hvcnQqLyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0lOVDoKKwlhcC0+YS5hX2ludCA9IHZhX2FyZyAoYXJncywgaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VSU5UOgorCWFwLT5hLmFfdWludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9MT05HSU5UOgorCWFwLT5hLmFfbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1VMT05HSU5UOgorCWFwLT5hLmFfdWxvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgaW50KTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgICAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgorCWFwLT5hLmFfbG9uZ2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKKwlhcC0+YS5hX3Vsb25nbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBsb25nIGludCk7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGNhc2UgVFlQRV9ET1VCTEU6CisJYXAtPmEuYV9kb3VibGUgPSB2YV9hcmcgKGFyZ3MsIGRvdWJsZSk7CisJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6CisJYXAtPmEuYV9sb25nZG91YmxlID0gdmFfYXJnIChhcmdzLCBsb25nIGRvdWJsZSk7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGNhc2UgVFlQRV9DSEFSOgorCWFwLT5hLmFfY2hhciA9IHZhX2FyZyAoYXJncywgaW50KTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX1dJTlRfVAorICAgICAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKKwlhcC0+YS5hX3dpZGVfY2hhciA9IHZhX2FyZyAoYXJncywgd2ludF90KTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSBUWVBFX1NUUklORzoKKwlhcC0+YS5hX3N0cmluZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKyAgICAgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKKwlhcC0+YS5hX3dpZGVfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB3Y2hhcl90ICopOworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKKwlhcC0+YS5hX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHZvaWQgKik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKKwlhcC0+YS5hX2NvdW50X3NjaGFyX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHNpZ25lZCBjaGFyICopOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6CisJYXAtPmEuYV9jb3VudF9zaG9ydF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaG9ydCAqKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjoKKwlhcC0+YS5hX2NvdW50X2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBpbnQgKik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOgorCWFwLT5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGludCAqKTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgICAgY2FzZSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI6CisJYXAtPmEuYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGxvbmcgaW50ICopOworCWJyZWFrOworI2VuZGlmCisgICAgICBkZWZhdWx0OgorCS8qIFVua25vd24gdHlwZS4gICovCisJcmV0dXJuIC0xOworICAgICAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYtYXJncy5oIGIvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExZTY0YwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wcmludGYtYXJncy5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9QUklOVEZfQVJHU19ICisjZGVmaW5lIF9QUklOVEZfQVJHU19ICisKKy8qIEdldCBzaXplX3QuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgd2NoYXJfdC4gICovCisjaWZkZWYgSEFWRV9XQ0hBUl9UCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKy8qIEdldCB3aW50X3QuICAqLworI2lmZGVmIEhBVkVfV0lOVF9UCisjIGluY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYKKworLyogR2V0IHZhX2xpc3QuICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKy8qIEFyZ3VtZW50IHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVFlQRV9OT05FLAorICBUWVBFX1NDSEFSLAorICBUWVBFX1VDSEFSLAorICBUWVBFX1NIT1JULAorICBUWVBFX1VTSE9SVCwKKyAgVFlQRV9JTlQsCisgIFRZUEVfVUlOVCwKKyAgVFlQRV9MT05HSU5ULAorICBUWVBFX1VMT05HSU5ULAorI2lmZGVmIEhBVkVfTE9OR19MT05HCisgIFRZUEVfTE9OR0xPTkdJTlQsCisgIFRZUEVfVUxPTkdMT05HSU5ULAorI2VuZGlmCisgIFRZUEVfRE9VQkxFLAorI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKyAgVFlQRV9MT05HRE9VQkxFLAorI2VuZGlmCisgIFRZUEVfQ0hBUiwKKyNpZmRlZiBIQVZFX1dJTlRfVAorICBUWVBFX1dJREVfQ0hBUiwKKyNlbmRpZgorICBUWVBFX1NUUklORywKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKyAgVFlQRV9XSURFX1NUUklORywKKyNlbmRpZgorICBUWVBFX1BPSU5URVIsCisgIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUiwKKyAgVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSLAorICBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSLAorICBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUgorI2lmZGVmIEhBVkVfTE9OR19MT05HCissIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUgorI2VuZGlmCit9IGFyZ190eXBlOworCisvKiBQb2x5bW9ycGhpYyBhcmd1bWVudCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgYXJnX3R5cGUgdHlwZTsKKyAgdW5pb24KKyAgeworICAgIHNpZ25lZCBjaGFyCQkJYV9zY2hhcjsKKyAgICB1bnNpZ25lZCBjaGFyCQlhX3VjaGFyOworICAgIHNob3J0CQkJYV9zaG9ydDsKKyAgICB1bnNpZ25lZCBzaG9ydAkJYV91c2hvcnQ7CisgICAgaW50CQkJCWFfaW50OworICAgIHVuc2lnbmVkIGludAkJYV91aW50OworICAgIGxvbmcgaW50CQkJYV9sb25naW50OworICAgIHVuc2lnbmVkIGxvbmcgaW50CQlhX3Vsb25naW50OworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgbG9uZyBsb25nIGludAkJYV9sb25nbG9uZ2ludDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50CWFfdWxvbmdsb25naW50OworI2VuZGlmCisgICAgZmxvYXQJCQlhX2Zsb2F0OworICAgIGRvdWJsZQkJCWFfZG91YmxlOworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKyAgICBsb25nIGRvdWJsZQkJCWFfbG9uZ2RvdWJsZTsKKyNlbmRpZgorICAgIGludAkJCQlhX2NoYXI7CisjaWZkZWYgSEFWRV9XSU5UX1QKKyAgICB3aW50X3QJCQlhX3dpZGVfY2hhcjsKKyNlbmRpZgorICAgIGNvbnN0IGNoYXIqCQkJYV9zdHJpbmc7CisjaWZkZWYgSEFWRV9XQ0hBUl9UCisgICAgY29uc3Qgd2NoYXJfdCoJCWFfd2lkZV9zdHJpbmc7CisjZW5kaWYKKyAgICB2b2lkKgkJCWFfcG9pbnRlcjsKKyAgICBzaWduZWQgY2hhciAqCQlhX2NvdW50X3NjaGFyX3BvaW50ZXI7CisgICAgc2hvcnQgKgkJCWFfY291bnRfc2hvcnRfcG9pbnRlcjsKKyAgICBpbnQgKgkJCWFfY291bnRfaW50X3BvaW50ZXI7CisgICAgbG9uZyBpbnQgKgkJCWFfY291bnRfbG9uZ2ludF9wb2ludGVyOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgbG9uZyBsb25nIGludCAqCQlhX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXI7CisjZW5kaWYKKyAgfQorICBhOworfQorYXJndW1lbnQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHNpemVfdCBjb3VudDsKKyAgYXJndW1lbnQgKmFyZzsKK30KK2FyZ3VtZW50czsKKworCisvKiBGZXRjaCB0aGUgYXJndW1lbnRzLCBwdXR0aW5nIHRoZW0gaW50byBhLiAqLworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZWxzZQorZXh0ZXJuCisjZW5kaWYKK2ludCBwcmludGZfZmV0Y2hhcmdzICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSk7CisKKyNlbmRpZiAvKiBfUFJJTlRGX0FSR1NfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3ByaW50Zi1wYXJzZS5jIGIvdW5peC9pbnRsL3ByaW50Zi1wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOWY5MDMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcHJpbnRmLXBhcnNlLmMKQEAgLTAsMCArMSw1MzcgQEAKKy8qIEZvcm1hdHRlZCBvdXRwdXQgdG8gc3RyaW5ncy4KKyAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAwLCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKyNpZiBXSURFX0NIQVJfVkVSU0lPTgorIyBpbmNsdWRlICJ3cHJpbnRmLXBhcnNlLmgiCisjZWxzZQorIyBpbmNsdWRlICJwcmludGYtcGFyc2UuaCIKKyNlbmRpZgorCisvKiBHZXQgc2l6ZV90LCBOVUxMLiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IGludG1heF90LiAgKi8KKyNpZiBIQVZFX1NURElOVF9IX1dJVEhfVUlOVE1BWAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVgKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisvKiBtYWxsb2MoKSwgcmVhbGxvYygpLCBmcmVlKCkuICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuICAqLworI2luY2x1ZGUgInhzaXplLmgiCisKKyNpZiBXSURFX0NIQVJfVkVSU0lPTgorIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHdwcmludGZfcGFyc2UKKyMgZGVmaW5lIENIQVJfVCB3Y2hhcl90CisjIGRlZmluZSBESVJFQ1RJVkUgd2NoYXJfdF9kaXJlY3RpdmUKKyMgZGVmaW5lIERJUkVDVElWRVMgd2NoYXJfdF9kaXJlY3RpdmVzCisjZWxzZQorIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHByaW50Zl9wYXJzZQorIyBkZWZpbmUgQ0hBUl9UIGNoYXIKKyMgZGVmaW5lIERJUkVDVElWRSBjaGFyX2RpcmVjdGl2ZQorIyBkZWZpbmUgRElSRUNUSVZFUyBjaGFyX2RpcmVjdGl2ZXMKKyNlbmRpZgorCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbmRpZgoraW50CitQUklOVEZfUEFSU0UgKGNvbnN0IENIQVJfVCAqZm9ybWF0LCBESVJFQ1RJVkVTICpkLCBhcmd1bWVudHMgKmEpCit7CisgIGNvbnN0IENIQVJfVCAqY3AgPSBmb3JtYXQ7CQkvKiBwb2ludGVyIGludG8gZm9ybWF0ICovCisgIHNpemVfdCBhcmdfcG9zbiA9IDA7CQkvKiBudW1iZXIgb2YgcmVndWxhciBhcmd1bWVudHMgY29uc3VtZWQgKi8KKyAgc2l6ZV90IGRfYWxsb2NhdGVkOwkJCS8qIGFsbG9jYXRlZCBlbGVtZW50cyBvZiBkLT5kaXIgKi8KKyAgc2l6ZV90IGFfYWxsb2NhdGVkOwkJCS8qIGFsbG9jYXRlZCBlbGVtZW50cyBvZiBhLT5hcmcgKi8KKyAgc2l6ZV90IG1heF93aWR0aF9sZW5ndGggPSAwOworICBzaXplX3QgbWF4X3ByZWNpc2lvbl9sZW5ndGggPSAwOworCisgIGQtPmNvdW50ID0gMDsKKyAgZF9hbGxvY2F0ZWQgPSAxOworICBkLT5kaXIgPSBtYWxsb2MgKGRfYWxsb2NhdGVkICogc2l6ZW9mIChESVJFQ1RJVkUpKTsKKyAgaWYgKGQtPmRpciA9PSBOVUxMKQorICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLworICAgIHJldHVybiAtMTsKKworICBhLT5jb3VudCA9IDA7CisgIGFfYWxsb2NhdGVkID0gMDsKKyAgYS0+YXJnID0gTlVMTDsKKworI2RlZmluZSBSRUdJU1RFUl9BUkcoX2luZGV4XyxfdHlwZV8pIFwKKyAgewkJCQkJCQkJCVwKKyAgICBzaXplX3QgbiA9IChfaW5kZXhfKTsJCQkJCQlcCisgICAgaWYgKG4gPj0gYV9hbGxvY2F0ZWQpCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlzaXplX3QgbWVtb3J5X3NpemU7CQkJCQkJXAorCWFyZ3VtZW50ICptZW1vcnk7CQkJCQkJXAorCQkJCQkJCQkJXAorCWFfYWxsb2NhdGVkID0geHRpbWVzIChhX2FsbG9jYXRlZCwgMik7CQkJCVwKKwlpZiAoYV9hbGxvY2F0ZWQgPD0gbikJCQkJCQlcCisJICBhX2FsbG9jYXRlZCA9IHhzdW0gKG4sIDEpOwkJCQkJXAorCW1lbW9yeV9zaXplID0geHRpbWVzIChhX2FsbG9jYXRlZCwgc2l6ZW9mIChhcmd1bWVudCkpOwkJXAorCWlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkJCQkJXAorCSAgLyogT3ZlcmZsb3csIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeS4gICovCQkJXAorCSAgZ290byBlcnJvcjsJCQkJCQkJXAorCW1lbW9yeSA9IChhLT5hcmcJCQkJCQlcCisJCSAgPyByZWFsbG9jIChhLT5hcmcsIG1lbW9yeV9zaXplKQkJCVwKKwkJICA6IG1hbGxvYyAobWVtb3J5X3NpemUpKTsJCQkJXAorCWlmIChtZW1vcnkgPT0gTlVMTCkJCQkJCQlcCisJICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8JCQkJCQlcCisJICBnb3RvIGVycm9yOwkJCQkJCQlcCisJYS0+YXJnID0gbWVtb3J5OwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgd2hpbGUgKGEtPmNvdW50IDw9IG4pCQkJCQkJXAorICAgICAgYS0+YXJnW2EtPmNvdW50KytdLnR5cGUgPSBUWVBFX05PTkU7CQkJCVwKKyAgICBpZiAoYS0+YXJnW25dLnR5cGUgPT0gVFlQRV9OT05FKQkJCQkJXAorICAgICAgYS0+YXJnW25dLnR5cGUgPSAoX3R5cGVfKTsJCQkJCVwKKyAgICBlbHNlIGlmIChhLT5hcmdbbl0udHlwZSAhPSAoX3R5cGVfKSkJCQkJXAorICAgICAgLyogQW1iaWd1b3VzIHR5cGUgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLwkJCVwKKyAgICAgIGdvdG8gZXJyb3I7CQkJCQkJCVwKKyAgfQorCisgIHdoaWxlICgqY3AgIT0gJ1wwJykKKyAgICB7CisgICAgICBDSEFSX1QgYyA9ICpjcCsrOworICAgICAgaWYgKGMgPT0gJyUnKQorCXsKKwkgIHNpemVfdCBhcmdfaW5kZXggPSBBUkdfTk9ORTsKKwkgIERJUkVDVElWRSAqZHAgPSAmZC0+ZGlyW2QtPmNvdW50XTsvKiBwb2ludGVyIHRvIG5leHQgZGlyZWN0aXZlICovCisKKwkgIC8qIEluaXRpYWxpemUgdGhlIG5leHQgZGlyZWN0aXZlLiAgKi8KKwkgIGRwLT5kaXJfc3RhcnQgPSBjcCAtIDE7CisJICBkcC0+ZmxhZ3MgPSAwOworCSAgZHAtPndpZHRoX3N0YXJ0ID0gTlVMTDsKKwkgIGRwLT53aWR0aF9lbmQgPSBOVUxMOworCSAgZHAtPndpZHRoX2FyZ19pbmRleCA9IEFSR19OT05FOworCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IE5VTEw7CisJICBkcC0+cHJlY2lzaW9uX2VuZCA9IE5VTEw7CisJICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IEFSR19OT05FOworCSAgZHAtPmFyZ19pbmRleCA9IEFSR19OT05FOworCisJICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KKwkgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJICAgIHsKKwkgICAgICBjb25zdCBDSEFSX1QgKm5wOworCisJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCTsKKwkgICAgICBpZiAoKm5wID09ICckJykKKwkJeworCQkgIHNpemVfdCBuID0gMDsKKworCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorCQkgICAgbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOworCQkgIGlmIChuID09IDApCisJCSAgICAvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLworCQkgICAgZ290byBlcnJvcjsKKwkJICBpZiAoc2l6ZV9vdmVyZmxvd19wIChuKSkKKwkJICAgIC8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkgbGF0ZXIuICAqLworCQkgICAgZ290byBlcnJvcjsKKwkJICBhcmdfaW5kZXggPSBuIC0gMTsKKwkJICBjcCA9IG5wICsgMTsKKwkJfQorCSAgICB9CisKKwkgIC8qIFJlYWQgdGhlIGZsYWdzLiAgKi8KKwkgIGZvciAoOzspCisJICAgIHsKKwkgICAgICBpZiAoKmNwID09ICdcJycpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19HUk9VUDsKKwkJICBjcCsrOworCQl9CisJICAgICAgZWxzZSBpZiAoKmNwID09ICctJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX0xFRlQ7CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnKycpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19TSE9XU0lHTjsKKwkJICBjcCsrOworCQl9CisJICAgICAgZWxzZSBpZiAoKmNwID09ICcgJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX1NQQUNFOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJyMnKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfQUxUOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJzAnKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfWkVSTzsKKwkJICBjcCsrOworCQl9CisJICAgICAgZWxzZQorCQlicmVhazsKKwkgICAgfQorCisJICAvKiBQYXJzZSB0aGUgZmllbGQgd2lkdGguICAqLworCSAgaWYgKCpjcCA9PSAnKicpCisJICAgIHsKKwkgICAgICBkcC0+d2lkdGhfc3RhcnQgPSBjcDsKKwkgICAgICBjcCsrOworCSAgICAgIGRwLT53aWR0aF9lbmQgPSBjcDsKKwkgICAgICBpZiAobWF4X3dpZHRoX2xlbmd0aCA8IDEpCisJCW1heF93aWR0aF9sZW5ndGggPSAxOworCisJICAgICAgLyogVGVzdCBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCisJICAgICAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKKwkJeworCQkgIGNvbnN0IENIQVJfVCAqbnA7CisKKwkJICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKwkJICAgIDsKKwkJICBpZiAoKm5wID09ICckJykKKwkJICAgIHsKKwkJICAgICAgc2l6ZV90IG4gPSAwOworCisJCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorCQkJbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOworCQkgICAgICBpZiAobiA9PSAwKQorCQkJLyogUG9zaXRpb25hbCBhcmd1bWVudCAwLiAgKi8KKwkJCWdvdG8gZXJyb3I7CisJCSAgICAgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQorCQkJLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeSBsYXRlci4gICovCisJCQlnb3RvIGVycm9yOworCQkgICAgICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gbiAtIDE7CisJCSAgICAgIGNwID0gbnAgKyAxOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggPT0gQVJHX05PTkUpCisJCXsKKwkJICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKKwkJICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJICAgIC8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KKwkJICAgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgICBSRUdJU1RFUl9BUkcgKGRwLT53aWR0aF9hcmdfaW5kZXgsIFRZUEVfSU5UKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorCSAgICB7CisJICAgICAgc2l6ZV90IHdpZHRoX2xlbmd0aDsKKworCSAgICAgIGRwLT53aWR0aF9zdGFydCA9IGNwOworCSAgICAgIGZvciAoOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnOSc7IGNwKyspCisJCTsKKwkgICAgICBkcC0+d2lkdGhfZW5kID0gY3A7CisJICAgICAgd2lkdGhfbGVuZ3RoID0gZHAtPndpZHRoX2VuZCAtIGRwLT53aWR0aF9zdGFydDsKKwkgICAgICBpZiAobWF4X3dpZHRoX2xlbmd0aCA8IHdpZHRoX2xlbmd0aCkKKwkJbWF4X3dpZHRoX2xlbmd0aCA9IHdpZHRoX2xlbmd0aDsKKwkgICAgfQorCisJICAvKiBQYXJzZSB0aGUgcHJlY2lzaW9uLiAgKi8KKwkgIGlmICgqY3AgPT0gJy4nKQorCSAgICB7CisJICAgICAgY3ArKzsKKwkgICAgICBpZiAoKmNwID09ICcqJykKKwkJeworCQkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBjcCAtIDE7CisJCSAgY3ArKzsKKwkJICBkcC0+cHJlY2lzaW9uX2VuZCA9IGNwOworCQkgIGlmIChtYXhfcHJlY2lzaW9uX2xlbmd0aCA8IDIpCisJCSAgICBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDI7CisKKwkJICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KKwkJICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorCQkgICAgeworCQkgICAgICBjb25zdCBDSEFSX1QgKm5wOworCisJCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorCQkJOworCQkgICAgICBpZiAoKm5wID09ICckJykKKwkJCXsKKwkJCSAgc2l6ZV90IG4gPSAwOworCisJCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorCQkJICAgIG4gPSB4c3VtICh4dGltZXMgKG4sIDEwKSwgKm5wIC0gJzAnKTsKKwkJCSAgaWYgKG4gPT0gMCkKKwkJCSAgICAvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLworCQkJICAgIGdvdG8gZXJyb3I7CisJCQkgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQorCQkJICAgIC8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkKKwkJCSAgICAgICBsYXRlci4gICovCisJCQkgICAgZ290byBlcnJvcjsKKwkJCSAgZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPSBuIC0gMTsKKwkJCSAgY3AgPSBucCArIDE7CisJCQl9CisJCSAgICB9CisJCSAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID09IEFSR19OT05FKQorCQkgICAgeworCQkgICAgICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IGFyZ19wb3NuKys7CisJCSAgICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJCS8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KKwkJCWdvdG8gZXJyb3I7CisJCSAgICB9CisJCSAgUkVHSVNURVJfQVJHIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCwgVFlQRV9JTlQpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc2l6ZV90IHByZWNpc2lvbl9sZW5ndGg7CisKKwkJICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gY3AgLSAxOworCQkgIGZvciAoOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnOSc7IGNwKyspCisJCSAgICA7CisJCSAgZHAtPnByZWNpc2lvbl9lbmQgPSBjcDsKKwkJICBwcmVjaXNpb25fbGVuZ3RoID0gZHAtPnByZWNpc2lvbl9lbmQgLSBkcC0+cHJlY2lzaW9uX3N0YXJ0OworCQkgIGlmIChtYXhfcHJlY2lzaW9uX2xlbmd0aCA8IHByZWNpc2lvbl9sZW5ndGgpCisJCSAgICBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IHByZWNpc2lvbl9sZW5ndGg7CisJCX0KKwkgICAgfQorCisJICB7CisJICAgIGFyZ190eXBlIHR5cGU7CisKKwkgICAgLyogUGFyc2UgYXJndW1lbnQgdHlwZS9zaXplIHNwZWNpZmllcnMuICAqLworCSAgICB7CisJICAgICAgaW50IGZsYWdzID0gMDsKKworCSAgICAgIGZvciAoOzspCisJCXsKKwkJICBpZiAoKmNwID09ICdoJykKKwkJICAgIHsKKwkJICAgICAgZmxhZ3MgfD0gKDEgPDwgKGZsYWdzICYgMSkpOworCQkgICAgICBjcCsrOworCQkgICAgfQorCQkgIGVsc2UgaWYgKCpjcCA9PSAnTCcpCisJCSAgICB7CisJCSAgICAgIGZsYWdzIHw9IDQ7CisJCSAgICAgIGNwKys7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoKmNwID09ICdsJykKKwkJICAgIHsKKwkJICAgICAgZmxhZ3MgKz0gODsKKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKyNpZmRlZiBIQVZFX0lOVE1BWF9UCisJCSAgZWxzZSBpZiAoKmNwID09ICdqJykKKwkJICAgIHsKKwkJICAgICAgaWYgKHNpemVvZiAoaW50bWF4X3QpID4gc2l6ZW9mIChsb25nKSkKKwkJCXsKKwkJCSAgLyogaW50bWF4X3QgPSBsb25nIGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gMTY7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKHNpemVvZiAoaW50bWF4X3QpID4gc2l6ZW9mIChpbnQpKQorCQkJeworCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gODsKKwkJCX0KKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKyNlbmRpZgorCQkgIGVsc2UgaWYgKCpjcCA9PSAneicgfHwgKmNwID09ICdaJykKKwkJICAgIHsKKwkJICAgICAgLyogJ3onIGlzIHN0YW5kYXJkaXplZCBpbiBJU08gQyA5OSwgYnV0IGdsaWJjIHVzZXMgJ1onCisJCQkgYmVjYXVzZSB0aGUgd2FybmluZyBmYWNpbGl0eSBpbiBnY2MtMi45NS4yIHVuZGVyc3RhbmRzCisJCQkgb25seSAnWicgKHNlZSBnY2MtMi45NS4yL2djYy9jLWNvbW1vbi5jOjE3ODQpLiAgKi8KKwkJICAgICAgaWYgKHNpemVvZiAoc2l6ZV90KSA+IHNpemVvZiAobG9uZykpCisJCQl7CisJCQkgIC8qIHNpemVfdCA9IGxvbmcgbG9uZyAqLworCQkJICBmbGFncyArPSAxNjsKKwkJCX0KKwkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChzaXplX3QpID4gc2l6ZW9mIChpbnQpKQorCQkJeworCQkJICAvKiBzaXplX3QgPSBsb25nICovCisJCQkgIGZsYWdzICs9IDg7CisJCQl9CisJCSAgICAgIGNwKys7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoKmNwID09ICd0JykKKwkJICAgIHsKKwkJICAgICAgaWYgKHNpemVvZiAocHRyZGlmZl90KSA+IHNpemVvZiAobG9uZykpCisJCQl7CisJCQkgIC8qIHB0cmRpZmZfdCA9IGxvbmcgbG9uZyAqLworCQkJICBmbGFncyArPSAxNjsKKwkJCX0KKwkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChpbnQpKQorCQkJeworCQkJICAvKiBwdHJkaWZmX3QgPSBsb25nICovCisJCQkgIGZsYWdzICs9IDg7CisJCQl9CisJCSAgICAgIGNwKys7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIFJlYWQgdGhlIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KKwkgICAgICBjID0gKmNwKys7CisJICAgICAgc3dpdGNoIChjKQorCQl7CisJCWNhc2UgJ2QnOiBjYXNlICdpJzoKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgIGlmIChmbGFncyA+PSAxNiB8fCAoZmxhZ3MgJiA0KSkKKwkJICAgIHR5cGUgPSBUWVBFX0xPTkdMT05HSU5UOworCQkgIGVsc2UKKyNlbmRpZgorCQkgIGlmIChmbGFncyA+PSA4KQorCQkgICAgdHlwZSA9IFRZUEVfTE9OR0lOVDsKKwkJICBlbHNlIGlmIChmbGFncyAmIDIpCisJCSAgICB0eXBlID0gVFlQRV9TQ0hBUjsKKwkJICBlbHNlIGlmIChmbGFncyAmIDEpCisJCSAgICB0eXBlID0gVFlQRV9TSE9SVDsKKwkJICBlbHNlCisJCSAgICB0eXBlID0gVFlQRV9JTlQ7CisJCSAgYnJlYWs7CisJCWNhc2UgJ28nOiBjYXNlICd1JzogY2FzZSAneCc6IGNhc2UgJ1gnOgorI2lmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQorCQkgICAgdHlwZSA9IFRZUEVfVUxPTkdMT05HSU5UOworCQkgIGVsc2UKKyNlbmRpZgorCQkgIGlmIChmbGFncyA+PSA4KQorCQkgICAgdHlwZSA9IFRZUEVfVUxPTkdJTlQ7CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiAyKQorCQkgICAgdHlwZSA9IFRZUEVfVUNIQVI7CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQorCQkgICAgdHlwZSA9IFRZUEVfVVNIT1JUOworCQkgIGVsc2UKKwkJICAgIHR5cGUgPSBUWVBFX1VJTlQ7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2YnOiBjYXNlICdGJzogY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdnJzogY2FzZSAnRyc6CisJCWNhc2UgJ2EnOiBjYXNlICdBJzoKKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisJCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQorCQkgICAgdHlwZSA9IFRZUEVfTE9OR0RPVUJMRTsKKwkJICBlbHNlCisjZW5kaWYKKwkJICB0eXBlID0gVFlQRV9ET1VCTEU7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkgIGlmIChmbGFncyA+PSA4KQorI2lmZGVmIEhBVkVfV0lOVF9UCisJCSAgICB0eXBlID0gVFlQRV9XSURFX0NIQVI7CisjZWxzZQorCQkgICAgZ290byBlcnJvcjsKKyNlbmRpZgorCQkgIGVsc2UKKwkJICAgIHR5cGUgPSBUWVBFX0NIQVI7CisJCSAgYnJlYWs7CisjaWZkZWYgSEFWRV9XSU5UX1QKKwkJY2FzZSAnQyc6CisJCSAgdHlwZSA9IFRZUEVfV0lERV9DSEFSOworCQkgIGMgPSAnYyc7CisJCSAgYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAncyc6CisJCSAgaWYgKGZsYWdzID49IDgpCisjaWZkZWYgSEFWRV9XQ0hBUl9UCisJCSAgICB0eXBlID0gVFlQRV9XSURFX1NUUklORzsKKyNlbHNlCisJCSAgICBnb3RvIGVycm9yOworI2VuZGlmCisJCSAgZWxzZQorCQkgICAgdHlwZSA9IFRZUEVfU1RSSU5HOworCQkgIGJyZWFrOworI2lmZGVmIEhBVkVfV0NIQVJfVAorCQljYXNlICdTJzoKKwkJICB0eXBlID0gVFlQRV9XSURFX1NUUklORzsKKwkJICBjID0gJ3MnOworCQkgIGJyZWFrOworI2VuZGlmCisJCWNhc2UgJ3AnOgorCQkgIHR5cGUgPSBUWVBFX1BPSU5URVI7CisJCSAgYnJlYWs7CisJCWNhc2UgJ24nOgorI2lmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQorCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjsKKwkJICBlbHNlCisjZW5kaWYKKwkJICBpZiAoZmxhZ3MgPj0gOCkKKwkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjsKKwkJICBlbHNlIGlmIChmbGFncyAmIDIpCisJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKKwkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI7CisJCSAgZWxzZQorCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfSU5UX1BPSU5URVI7CisJCSAgYnJlYWs7CisJCWNhc2UgJyUnOgorCQkgIHR5cGUgPSBUWVBFX05PTkU7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgLyogVW5rbm93biBjb252ZXJzaW9uIGNoYXJhY3Rlci4gICovCisJCSAgZ290byBlcnJvcjsKKwkJfQorCSAgICB9CisKKwkgICAgaWYgKHR5cGUgIT0gVFlQRV9OT05FKQorCSAgICAgIHsKKwkJZHAtPmFyZ19pbmRleCA9IGFyZ19pbmRleDsKKwkJaWYgKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpCisJCSAgeworCQkgICAgZHAtPmFyZ19pbmRleCA9IGFyZ19wb3NuKys7CisJCSAgICBpZiAoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJICAgICAgLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLworCQkgICAgICBnb3RvIGVycm9yOworCQkgIH0KKwkJUkVHSVNURVJfQVJHIChkcC0+YXJnX2luZGV4LCB0eXBlKTsKKwkgICAgICB9CisJICAgIGRwLT5jb252ZXJzaW9uID0gYzsKKwkgICAgZHAtPmRpcl9lbmQgPSBjcDsKKwkgIH0KKworCSAgZC0+Y291bnQrKzsKKwkgIGlmIChkLT5jb3VudCA+PSBkX2FsbG9jYXRlZCkKKwkgICAgeworCSAgICAgIHNpemVfdCBtZW1vcnlfc2l6ZTsKKwkgICAgICBESVJFQ1RJVkUgKm1lbW9yeTsKKworCSAgICAgIGRfYWxsb2NhdGVkID0geHRpbWVzIChkX2FsbG9jYXRlZCwgMik7CisJICAgICAgbWVtb3J5X3NpemUgPSB4dGltZXMgKGRfYWxsb2NhdGVkLCBzaXplb2YgKERJUkVDVElWRSkpOworCSAgICAgIGlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkKKwkJLyogT3ZlcmZsb3csIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeS4gICovCisJCWdvdG8gZXJyb3I7CisJICAgICAgbWVtb3J5ID0gcmVhbGxvYyAoZC0+ZGlyLCBtZW1vcnlfc2l6ZSk7CisJICAgICAgaWYgKG1lbW9yeSA9PSBOVUxMKQorCQkvKiBPdXQgb2YgbWVtb3J5LiAgKi8KKwkJZ290byBlcnJvcjsKKwkgICAgICBkLT5kaXIgPSBtZW1vcnk7CisJICAgIH0KKwl9CisgICAgfQorICBkLT5kaXJbZC0+Y291bnRdLmRpcl9zdGFydCA9IGNwOworCisgIGQtPm1heF93aWR0aF9sZW5ndGggPSBtYXhfd2lkdGhfbGVuZ3RoOworICBkLT5tYXhfcHJlY2lzaW9uX2xlbmd0aCA9IG1heF9wcmVjaXNpb25fbGVuZ3RoOworICByZXR1cm4gMDsKKworZXJyb3I6CisgIGlmIChhLT5hcmcpCisgICAgZnJlZSAoYS0+YXJnKTsKKyAgaWYgKGQtPmRpcikKKyAgICBmcmVlIChkLT5kaXIpOworICByZXR1cm4gLTE7Cit9CisKKyN1bmRlZiBESVJFQ1RJVkVTCisjdW5kZWYgRElSRUNUSVZFCisjdW5kZWYgQ0hBUl9UCisjdW5kZWYgUFJJTlRGX1BBUlNFCmRpZmYgLS1naXQgYS91bml4L2ludGwvcHJpbnRmLXBhcnNlLmggYi91bml4L2ludGwvcHJpbnRmLXBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlYzUwZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wcmludGYtcGFyc2UuaApAQCAtMCwwICsxLDc1IEBACisvKiBQYXJzZSBwcmludGYgZm9ybWF0IHN0cmluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJJTlRGX1BBUlNFX0gKKyNkZWZpbmUgX1BSSU5URl9QQVJTRV9ICisKKyNpbmNsdWRlICJwcmludGYtYXJncy5oIgorCisKKy8qIEZsYWdzICovCisjZGVmaW5lIEZMQUdfR1JPVVAJIDEJLyogJyBmbGFnICovCisjZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19TSE9XU0lHTgkgNAkvKiArIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19TUEFDRQkgOAkvKiBzcGFjZSBmbGFnICovCisjZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLworI2RlZmluZSBGTEFHX1pFUk8JMzIKKworLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCisjZGVmaW5lIEFSR19OT05FCSh+KHNpemVfdCkwKQorCisvKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciogZGlyX3N0YXJ0OworICBjb25zdCBjaGFyKiBkaXJfZW5kOworICBpbnQgZmxhZ3M7CisgIGNvbnN0IGNoYXIqIHdpZHRoX3N0YXJ0OworICBjb25zdCBjaGFyKiB3aWR0aF9lbmQ7CisgIHNpemVfdCB3aWR0aF9hcmdfaW5kZXg7CisgIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9zdGFydDsKKyAgY29uc3QgY2hhciogcHJlY2lzaW9uX2VuZDsKKyAgc2l6ZV90IHByZWNpc2lvbl9hcmdfaW5kZXg7CisgIGNoYXIgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCisgIHNpemVfdCBhcmdfaW5kZXg7Cit9CitjaGFyX2RpcmVjdGl2ZTsKKworLyogQSBwYXJzZWQgZm9ybWF0IHN0cmluZy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBzaXplX3QgY291bnQ7CisgIGNoYXJfZGlyZWN0aXZlICpkaXI7CisgIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoOworICBzaXplX3QgbWF4X3ByZWNpc2lvbl9sZW5ndGg7Cit9CitjaGFyX2RpcmVjdGl2ZXM7CisKKworLyogUGFyc2VzIHRoZSBmb3JtYXQgc3RyaW5nLiAgRmlsbHMgaW4gdGhlIG51bWJlciBOIG9mIGRpcmVjdGl2ZXMsIGFuZCBmaWxscworICAgaW4gZGlyZWN0aXZlc1swXSwgLi4uLCBkaXJlY3RpdmVzW04tMV0sIGFuZCBzZXRzIGRpcmVjdGl2ZXNbTl0uZGlyX3N0YXJ0CisgICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQorICAgYXJndW1lbnRzIGFuZCB0aGUgbmVlZGVkIGNvdW50IG9mIGFyZ3VtZW50cy4gICovCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbHNlCitleHRlcm4KKyNlbmRpZgoraW50IHByaW50Zl9wYXJzZSAoY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyX2RpcmVjdGl2ZXMgKmQsIGFyZ3VtZW50cyAqYSk7CisKKyNlbmRpZiAvKiBfUFJJTlRGX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYuYyBiL3VuaXgvaW50bC9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg2NDZjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3ByaW50Zi5jCkBAIC0wLDAgKzEsMzcxIEBACisvKiBGb3JtYXR0ZWQgb3V0cHV0IHRvIHN0cmluZ3MsIHVzaW5nIFBPU0lYL1hTSSBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiAhSEFWRV9QT1NJWF9QUklOVEYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBXaGVuIGJ1aWxkaW5nIGEgRExMLCB3ZSBtdXN0IGV4cG9ydCBzb21lIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBiZWNhdXNlCisgICB0aGUgZnVuY3Rpb25zIGFyZSBvbmx5IGRlZmluZWQgZm9yIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZQorICAgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGluIGFueSBjYXNlLiAgKi8KKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIEJVSUxESU5HX0RMTAorIyBkZWZpbmUgRExMX0VYUE9SVEVEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2Vsc2UKKyMgZGVmaW5lIERMTF9FWFBPUlRFRAorI2VuZGlmCisKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworCisvKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAicHJpbnRmLWFyZ3MuaCIuICAqLworI2luY2x1ZGUgInByaW50Zi1hcmdzLmMiCisKKy8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJwcmludGYtcGFyc2UuaCIuICAqLworI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgorCisvKiBEZWZpbmUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ2YXNucHJpbnRmLmgiLiAgKi8KKyNkZWZpbmUgdmFzbnByaW50ZiBsaWJpbnRsX3Zhc25wcmludGYKKyNpbmNsdWRlICJ2YXNucHJpbnRmLmMiCisjaWYgMCAvKiBub3QgbmVlZGVkICovCisjZGVmaW5lIGFzbnByaW50ZiBsaWJpbnRsX2FzbnByaW50ZgorI2luY2x1ZGUgImFzbnByaW50Zi5jIgorI2VuZGlmCisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ZmcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKyAgICByZXR1cm4gdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBsZW5ndGg7CisgICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgICAgICBpbnQgcmV0dmFsID0gLTE7CisgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisJeworCSAgaWYgKGZ3cml0ZSAocmVzdWx0LCAxLCBsZW5ndGgsIHN0cmVhbSkgPT0gbGVuZ3RoKQorCSAgICByZXR2YWwgPSBsZW5ndGg7CisJICBmcmVlIChyZXN1bHQpOworCX0KKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9mcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdnByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHJldHVybiBsaWJpbnRsX3ZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92cHJpbnRmIChmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92c3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisgICAgcmV0dXJuIHZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgbGVuZ3RoID0gKHNpemVfdCkgfjAgLyAoNCAqIHNpemVvZiAoY2hhcikpOworICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKKwl7CisJICBmcmVlIChyZXN1bHQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gbGVuZ3RoOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfc3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3ZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZiBIQVZFX1NOUFJJTlRGCisKKyMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgorICAgLyogV2luZG93cy4gICovCisjICBkZWZpbmUgc3lzdGVtX3ZzbnByaW50ZiBfdnNucHJpbnRmCisjIGVsc2UKKyAgIC8qIFVuaXguICAqLworIyAgZGVmaW5lIHN5c3RlbV92c25wcmludGYgdnNucHJpbnRmCisjIGVuZGlmCisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ZzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisgICAgcmV0dXJuIHN5c3RlbV92c25wcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IG1heGxlbmd0aCA9IGxlbmd0aDsKKyAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCisJeworCSAgaWYgKG1heGxlbmd0aCA+IDApCisJICAgIHsKKwkgICAgICBpZiAobGVuZ3RoIDwgbWF4bGVuZ3RoKQorCQlhYm9ydCAoKTsKKwkgICAgICBtZW1jcHkgKHJlc3VsdGJ1ZiwgcmVzdWx0LCBtYXhsZW5ndGggLSAxKTsKKwkgICAgICByZXN1bHRidWZbbWF4bGVuZ3RoIC0gMV0gPSAnXDAnOworCSAgICB9CisJICBmcmVlIChyZXN1bHQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gbGVuZ3RoOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92c25wcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYKKworI2lmIEhBVkVfQVNQUklOVEYKKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdmFzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHNpemVfdCBsZW5ndGg7CisgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgKnJlc3VsdHAgPSByZXN1bHQ7CisgIHJldHVybiBsZW5ndGg7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX2FzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92YXNwcmludGYgKHJlc3VsdHAsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZgorCisjaWYgSEFWRV9GV1BSSU5URgorCisjaW5jbHVkZSA8d2NoYXIuaD4KKworI2RlZmluZSBXSURFX0NIQVJfVkVSU0lPTiAxCisKKy8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ3cHJpbnRmLXBhcnNlLmgiLiAgKi8KKyNpbmNsdWRlICJwcmludGYtcGFyc2UuYyIKKworLyogRGVmaW5lIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAidmFzbnByaW50Zi5oIi4gICovCisjZGVmaW5lIHZhc253cHJpbnRmIGxpYmludGxfdmFzbndwcmludGYKKyNpbmNsdWRlICJ2YXNucHJpbnRmLmMiCisjaWYgMCAvKiBub3QgbmVlZGVkICovCisjZGVmaW5lIGFzbndwcmludGYgbGliaW50bF9hc253cHJpbnRmCisjaW5jbHVkZSAiYXNucHJpbnRmLmMiCisjZW5kaWYKKworIyBpZiBIQVZFX0RFQ0xfX1NOV1BSSU5URgorICAgLyogV2luZG93cy4gICovCisjICBkZWZpbmUgc3lzdGVtX3Zzd3ByaW50ZiBfdnNud3ByaW50ZgorIyBlbHNlCisgICAvKiBVbml4LiAgKi8KKyMgIGRlZmluZSBzeXN0ZW1fdnN3cHJpbnRmIHZzd3ByaW50ZgorIyBlbmRpZgorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92ZndwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIGlmICh3Y3NjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorICAgIHJldHVybiB2ZndwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBsZW5ndGg7CisgICAgICB3Y2hhcl90ICpyZXN1bHQgPSBsaWJpbnRsX3Zhc253cHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaW50IHJldHZhbCA9IC0xOworICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCXsKKwkgIHNpemVfdCBpOworCSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCSAgICBpZiAoZnB1dHdjIChyZXN1bHRbaV0sIHN0cmVhbSkgPT0gV0VPRikKKwkgICAgICBicmVhazsKKwkgIGlmIChpID09IGxlbmd0aCkKKwkgICAgcmV0dmFsID0gbGVuZ3RoOworCSAgZnJlZSAocmVzdWx0KTsKKwl9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfZndwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92ZndwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdndwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICByZXR1cm4gbGliaW50bF92ZndwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcmdzKTsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfd3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92d3ByaW50ZiAoZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdnN3cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAod2NzY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKyAgICByZXR1cm4gc3lzdGVtX3Zzd3ByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgbWF4bGVuZ3RoID0gbGVuZ3RoOworICAgICAgd2NoYXJfdCAqcmVzdWx0ID0gbGliaW50bF92YXNud3ByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCisJeworCSAgaWYgKG1heGxlbmd0aCA+IDApCisJICAgIHsKKwkgICAgICBpZiAobGVuZ3RoIDwgbWF4bGVuZ3RoKQorCQlhYm9ydCAoKTsKKwkgICAgICBtZW1jcHkgKHJlc3VsdGJ1ZiwgcmVzdWx0LCAobWF4bGVuZ3RoIC0gMSkgKiBzaXplb2YgKHdjaGFyX3QpKTsKKwkgICAgICByZXN1bHRidWZbbWF4bGVuZ3RoIC0gMV0gPSAwOworCSAgICB9CisJICBmcmVlIChyZXN1bHQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gbGVuZ3RoOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfc3dwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92c3dwcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvcmVmLWFkZC5zaW4gYi91bml4L2ludGwvcmVmLWFkZC5zaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3Mzc0ZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9yZWYtYWRkLnNpbgpAQCAtMCwwICsxLDMxIEBACisjIEFkZCB0aGlzIHBhY2thZ2UgdG8gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgorIworIyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjICAgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyAgIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCisjCisvXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAvIHsKKyAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLworICB0YQorICA6YQorICBzLyBAUEFDS0FHRUAgLyBAUEFDS0FHRUAgLworICB0YgorICBzLyAkLyBAUEFDS0FHRUAgLworICA6YgorICBzL14vIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6LworfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3JlZi1kZWwuc2luIGIvdW5peC9pbnRsL3JlZi1kZWwuc2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2NmMzcKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcmVmLWRlbC5zaW4KQEAgLTAsMCArMSwyNiBAQAorIyBSZW1vdmUgdGhpcyBwYWNrYWdlIGZyb20gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgorIworIyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjICAgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyAgIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCisjCisvXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAvIHsKKyAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLworICBzLyBAUEFDS0FHRUAgLyAvCisgIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvcmVsb2NhdGFibGUuYyBiL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmN2M3MDgKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcmVsb2NhdGFibGUuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyogUHJvdmlkZSByZWxvY2F0YWJsZSBwYWNrYWdlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworCisvKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIGdldGxpbmUoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2luY2x1ZGUgInJlbG9jYXRhYmxlLmgiCisKKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBOT19YTUFMTE9DCisjIGRlZmluZSB4bWFsbG9jIG1hbGxvYworI2Vsc2UKKyMgaW5jbHVkZSAieGFsbG9jLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWYgREVQRU5EU19PTl9MSUJDSEFSU0VUCisjIGluY2x1ZGUgPGxpYmNoYXJzZXQuaD4KKyNlbmRpZgorI2lmIERFUEVORFNfT05fTElCSUNPTlYgJiYgSEFWRV9JQ09OVgorIyBpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisjaWYgREVQRU5EU19PTl9MSUJJTlRMICYmIEVOQUJMRV9OTFMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2VuZGlmCisKKy8qIEZha2VkIGNoZWFwICdib29sJy4gICovCisjdW5kZWYgYm9vbAorI3VuZGVmIGZhbHNlCisjdW5kZWYgdHJ1ZQorI2RlZmluZSBib29sIGludAorI2RlZmluZSBmYWxzZSAwCisjZGVmaW5lIHRydWUgMQorCisvKiBQYXRobmFtZSBzdXBwb3J0LgorICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICBJU19QQVRIX1dJVEhfRElSKFApICB0ZXN0cyB3aGV0aGVyIFAgY29udGFpbnMgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KKyAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorICAgICAmJiAoUClbMV0gPT0gJzonKQorIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSBcCisgICAgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMIHx8IHN0cmNociAoUCwgJ1xcJykgIT0gTlVMTCB8fCBIQVNfREVWSUNFIChQKSkKKyMgZGVmaW5lIEZJTEVTWVNURU1fUFJFRklYX0xFTihQKSAoSEFTX0RFVklDRSAoUCkgPyAyIDogMCkKKyNlbHNlCisgIC8qIFVuaXggKi8KKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCisjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKKyMgZGVmaW5lIEZJTEVTWVNURU1fUFJFRklYX0xFTihQKSAwCisjZW5kaWYKKworLyogT3JpZ2luYWwgaW5zdGFsbGF0aW9uIHByZWZpeC4gICovCitzdGF0aWMgY2hhciAqb3JpZ19wcmVmaXg7CitzdGF0aWMgc2l6ZV90IG9yaWdfcHJlZml4X2xlbjsKKy8qIEN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeC4gICovCitzdGF0aWMgY2hhciAqY3Vycl9wcmVmaXg7CitzdGF0aWMgc2l6ZV90IGN1cnJfcHJlZml4X2xlbjsKKy8qIFRoZXNlIHByZWZpeGVzIGRvIG5vdCBlbmQgaW4gYSBzbGFzaC4gIEFueXRoaW5nIHRoYXQgd2lsbCBiZSBjb25jYXRlbmF0ZWQKKyAgIHRvIHRoZW0gbXVzdCBzdGFydCB3aXRoIGEgc2xhc2guICAqLworCisvKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGlzIG1vZHVsZS4KKyAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4CisgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgorICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KK3N0YXRpYyB2b2lkCitzZXRfdGhpc19yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXhfYXJnLAorCQkJICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2FyZykKK3sKKyAgaWYgKG9yaWdfcHJlZml4X2FyZyAhPSBOVUxMICYmIGN1cnJfcHJlZml4X2FyZyAhPSBOVUxMCisgICAgICAvKiBPcHRpbWl6YXRpb246IGlmIG9yaWdfcHJlZml4IGFuZCBjdXJyX3ByZWZpeCBhcmUgZXF1YWwsIHRoZQorCSByZWxvY2F0aW9uIGlzIGEgbm9wLiAgKi8KKyAgICAgICYmIHN0cmNtcCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpICE9IDApCisgICAgeworICAgICAgLyogRHVwbGljYXRlIHRoZSBhcmd1bWVudCBzdHJpbmdzLiAgKi8KKyAgICAgIGNoYXIgKm1lbW9yeTsKKworICAgICAgb3JpZ19wcmVmaXhfbGVuID0gc3RybGVuIChvcmlnX3ByZWZpeF9hcmcpOworICAgICAgY3Vycl9wcmVmaXhfbGVuID0gc3RybGVuIChjdXJyX3ByZWZpeF9hcmcpOworICAgICAgbWVtb3J5ID0gKGNoYXIgKikgeG1hbGxvYyAob3JpZ19wcmVmaXhfbGVuICsgMSArIGN1cnJfcHJlZml4X2xlbiArIDEpOworI2lmZGVmIE5PX1hNQUxMT0MKKyAgICAgIGlmIChtZW1vcnkgIT0gTlVMTCkKKyNlbmRpZgorCXsKKwkgIG1lbWNweSAobWVtb3J5LCBvcmlnX3ByZWZpeF9hcmcsIG9yaWdfcHJlZml4X2xlbiArIDEpOworCSAgb3JpZ19wcmVmaXggPSBtZW1vcnk7CisJICBtZW1vcnkgKz0gb3JpZ19wcmVmaXhfbGVuICsgMTsKKwkgIG1lbWNweSAobWVtb3J5LCBjdXJyX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2xlbiArIDEpOworCSAgY3Vycl9wcmVmaXggPSBtZW1vcnk7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgb3JpZ19wcmVmaXggPSBOVUxMOworICBjdXJyX3ByZWZpeCA9IE5VTEw7CisgIC8qIERvbid0IHdvcnJ5IGFib3V0IHdhc3RlZCBtZW1vcnkgaGVyZSAtIHRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBvbmx5CisgICAgIGNhbGxlZCBvbmNlLiAgKi8KK30KKworLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisgICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAorICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKyAgIGluc3RlYWQgb2YgIi8iKS4gICovCit2b2lkCitzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYXJnKQoreworICBzZXRfdGhpc19yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOworCisgIC8qIE5vdyBub3RpZnkgYWxsIGRlcGVuZGVudCBsaWJyYXJpZXMuICAqLworI2lmIERFUEVORFNfT05fTElCQ0hBUlNFVAorICBsaWJjaGFyc2V0X3NldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOworI2VuZGlmCisjaWYgREVQRU5EU19PTl9MSUJJQ09OViAmJiBIQVZFX0lDT05WICYmIF9MSUJJQ09OVl9WRVJTSU9OID49IDB4MDEwOQorICBsaWJpY29udl9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKyNlbmRpZgorI2lmIERFUEVORFNfT05fTElCSU5UTCAmJiBFTkFCTEVfTkxTICYmIGRlZmluZWQgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXgKKyAgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKyNlbmRpZgorfQorCisjaWYgIWRlZmluZWQgSU5fTElCUkFSWSB8fCAoZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSKQorCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKKyAgIENvbXB1dGVzIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXgsIGJhc2VkIG9uIHRoZSBvcmlnaW5hbAorICAgaW5zdGFsbGF0aW9uIHByZWZpeCwgdGhlIG9yaWdpbmFsIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYSBwYXJ0aWN1bGFyCisgICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCisjaWZkZWYgSU5fTElCUkFSWQorI2RlZmluZSBjb21wdXRlX2N1cnJfcHJlZml4IGxvY2FsX2NvbXB1dGVfY3Vycl9wcmVmaXgKK3N0YXRpYworI2VuZGlmCitjb25zdCBjaGFyICoKK2NvbXB1dGVfY3Vycl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCwKKwkJICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIsCisJCSAgICAgY29uc3QgY2hhciAqY3Vycl9wYXRobmFtZSkKK3sKKyAgY29uc3QgY2hhciAqY3Vycl9pbnN0YWxsZGlyOworICBjb25zdCBjaGFyICpyZWxfaW5zdGFsbGRpcjsKKworICBpZiAoY3Vycl9wYXRobmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIERldGVybWluZSB0aGUgcmVsYXRpdmUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgcmVsYXRpdmUgdG8gdGhlIHByZWZpeC4KKyAgICAgVGhpcyBpcyBzaW1wbHkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnX2luc3RhbGxwcmVmaXggYW5kCisgICAgIG9yaWdfaW5zdGFsbGRpci4gICovCisgIGlmIChzdHJuY21wIChvcmlnX2luc3RhbGxwcmVmaXgsIG9yaWdfaW5zdGFsbGRpciwgc3RybGVuIChvcmlnX2luc3RhbGxwcmVmaXgpKQorICAgICAgIT0gMCkKKyAgICAvKiBTaG91bGRuJ3QgaGFwcGVuIC0gbm90aGluZyBzaG91bGQgYmUgaW5zdGFsbGVkIG91dHNpZGUgJChwcmVmaXgpLiAgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgcmVsX2luc3RhbGxkaXIgPSBvcmlnX2luc3RhbGxkaXIgKyBzdHJsZW4gKG9yaWdfaW5zdGFsbHByZWZpeCk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuICAqLworICB7CisgICAgY29uc3QgY2hhciAqcF9iYXNlID0gY3Vycl9wYXRobmFtZSArIEZJTEVTWVNURU1fUFJFRklYX0xFTiAoY3Vycl9wYXRobmFtZSk7CisgICAgY29uc3QgY2hhciAqcCA9IGN1cnJfcGF0aG5hbWUgKyBzdHJsZW4gKGN1cnJfcGF0aG5hbWUpOworICAgIGNoYXIgKnE7CisKKyAgICB3aGlsZSAocCA+IHBfYmFzZSkKKyAgICAgIHsKKwlwLS07CisJaWYgKElTU0xBU0ggKCpwKSkKKwkgIGJyZWFrOworICAgICAgfQorCisgICAgcSA9IChjaGFyICopIHhtYWxsb2MgKHAgLSBjdXJyX3BhdGhuYW1lICsgMSk7CisjaWZkZWYgTk9fWE1BTExPQworICAgIGlmIChxID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIG1lbWNweSAocSwgY3Vycl9wYXRobmFtZSwgcCAtIGN1cnJfcGF0aG5hbWUpOworICAgIHFbcCAtIGN1cnJfcGF0aG5hbWVdID0gJ1wwJzsKKyAgICBjdXJyX2luc3RhbGxkaXIgPSBxOworICB9CisKKyAgLyogQ29tcHV0ZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IGJ5IHJlbW92aW5nIHRoZSB0cmFpbGluZworICAgICByZWxfaW5zdGFsbGRpciBmcm9tIGl0LiAgKi8KKyAgeworICAgIGNvbnN0IGNoYXIgKnJwID0gcmVsX2luc3RhbGxkaXIgKyBzdHJsZW4gKHJlbF9pbnN0YWxsZGlyKTsKKyAgICBjb25zdCBjaGFyICpjcCA9IGN1cnJfaW5zdGFsbGRpciArIHN0cmxlbiAoY3Vycl9pbnN0YWxsZGlyKTsKKyAgICBjb25zdCBjaGFyICpjcF9iYXNlID0KKyAgICAgIGN1cnJfaW5zdGFsbGRpciArIEZJTEVTWVNURU1fUFJFRklYX0xFTiAoY3Vycl9pbnN0YWxsZGlyKTsKKworICAgIHdoaWxlIChycCA+IHJlbF9pbnN0YWxsZGlyICYmIGNwID4gY3BfYmFzZSkKKyAgICAgIHsKKwlib29sIHNhbWUgPSBmYWxzZTsKKwljb25zdCBjaGFyICpycGkgPSBycDsKKwljb25zdCBjaGFyICpjcGkgPSBjcDsKKworCXdoaWxlIChycGkgPiByZWxfaW5zdGFsbGRpciAmJiBjcGkgPiBjcF9iYXNlKQorCSAgeworCSAgICBycGktLTsKKwkgICAgY3BpLS07CisJICAgIGlmIChJU1NMQVNIICgqcnBpKSB8fCBJU1NMQVNIICgqY3BpKSkKKwkgICAgICB7CisJCWlmIChJU1NMQVNIICgqcnBpKSAmJiBJU1NMQVNIICgqY3BpKSkKKwkJICBzYW1lID0gdHJ1ZTsKKwkJYnJlYWs7CisJICAgICAgfQorI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworCSAgICAvKiBXaW4zMiwgT1MvMiwgRE9TIC0gY2FzZSBpbnNpZ25pZmljYW50IGZpbGVzeXN0ZW0gKi8KKwkgICAgaWYgKCgqcnBpID49ICdhJyAmJiAqcnBpIDw9ICd6JyA/ICpycGkgLSAnYScgKyAnQScgOiAqcnBpKQorCQkhPSAoKmNwaSA+PSAnYScgJiYgKmNwaSA8PSAneicgPyAqY3BpIC0gJ2EnICsgJ0EnIDogKmNwaSkpCisJICAgICAgYnJlYWs7CisjZWxzZQorCSAgICBpZiAoKnJwaSAhPSAqY3BpKQorCSAgICAgIGJyZWFrOworI2VuZGlmCisJICB9CisJaWYgKCFzYW1lKQorCSAgYnJlYWs7CisJLyogVGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50IHdhcyB0aGUgc2FtZS4gIG9waSBhbmQgY3BpIG5vdyBwb2ludAorCSAgIHRvIHRoZSBzbGFzaCBiZWZvcmUgaXQuICAqLworCXJwID0gcnBpOworCWNwID0gY3BpOworICAgICAgfQorCisgICAgaWYgKHJwID4gcmVsX2luc3RhbGxkaXIpCisgICAgICAvKiBVbmV4cGVjdGVkOiBUaGUgY3Vycl9pbnN0YWxsZGlyIGRvZXMgbm90IGVuZCB3aXRoIHJlbF9pbnN0YWxsZGlyLiAgKi8KKyAgICAgIHJldHVybiBOVUxMOworCisgICAgeworICAgICAgc2l6ZV90IGN1cnJfcHJlZml4X2xlbiA9IGNwIC0gY3Vycl9pbnN0YWxsZGlyOworICAgICAgY2hhciAqY3Vycl9wcmVmaXg7CisKKyAgICAgIGN1cnJfcHJlZml4ID0gKGNoYXIgKikgeG1hbGxvYyAoY3Vycl9wcmVmaXhfbGVuICsgMSk7CisjaWZkZWYgTk9fWE1BTExPQworICAgICAgaWYgKGN1cnJfcHJlZml4ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICAgIG1lbWNweSAoY3Vycl9wcmVmaXgsIGN1cnJfaW5zdGFsbGRpciwgY3Vycl9wcmVmaXhfbGVuKTsKKyAgICAgIGN1cnJfcHJlZml4W2N1cnJfcHJlZml4X2xlbl0gPSAnXDAnOworCisgICAgICByZXR1cm4gY3Vycl9wcmVmaXg7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiAhSU5fTElCUkFSWSB8fCBQSUMgKi8KKworI2lmIGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUgorCisvKiBGdWxsIHBhdGhuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5LCBvciBOVUxMLiAgKi8KK3N0YXRpYyBjaGFyICpzaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisKKy8qIERldGVybWluZSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hlbiBpdCBpcyBsb2FkZWQuICAqLworCitCT09MIFdJTkFQSQorRGxsTWFpbiAoSElOU1RBTkNFIG1vZHVsZV9oYW5kbGUsIERXT1JEIGV2ZW50LCBMUFZPSUQgcmVzZXJ2ZWQpCit7CisgICh2b2lkKSByZXNlcnZlZDsKKworICBpZiAoZXZlbnQgPT0gRExMX1BST0NFU1NfQVRUQUNIKQorICAgIHsKKyAgICAgIC8qIFRoZSBETEwgaXMgYmVpbmcgbG9hZGVkIGludG8gYW4gYXBwbGljYXRpb24ncyBhZGRyZXNzIHJhbmdlLiAgKi8KKyAgICAgIHN0YXRpYyBjaGFyIGxvY2F0aW9uW01BWF9QQVRIXTsKKworICAgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZSAobW9kdWxlX2hhbmRsZSwgbG9jYXRpb24sIHNpemVvZiAobG9jYXRpb24pKSkKKwkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghSVNfUEFUSF9XSVRIX0RJUiAobG9jYXRpb24pKQorCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCXJldHVybiBGQUxTRTsKKworICAgICAgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSBzdHJkdXAgKGxvY2F0aW9uKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbHNlIC8qIFVuaXggKi8KKworc3RhdGljIHZvaWQKK2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkKK3sKKyNpZiBkZWZpbmVkIF9fbGludXhfXyAmJiBfX0dMSUJDX18gPj0gMgorICAvKiBMaW51eCBoYXMgL3Byb2Mvc2VsZi9tYXBzLiBnbGliYyAyIGhhcyB0aGUgZ2V0bGluZSgpIGZ1bmN0aW9uLiAgKi8KKyAgRklMRSAqZnA7CisKKyAgLyogT3BlbiB0aGUgY3VycmVudCBwcm9jZXNzJyBtYXBzIGZpbGUuICBJdCBkZXNjcmliZXMgb25lIFZNQSBwZXIgbGluZS4gICovCisgIGZwID0gZm9wZW4gKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOworICBpZiAoZnApCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpICZmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOworICAgICAgZm9yICg7OykKKwl7CisJICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisJICBpbnQgYzsKKworCSAgaWYgKGZzY2FuZiAoZnAsICIlbHgtJWx4IiwgJnN0YXJ0LCAmZW5kKSAhPSAyKQorCSAgICBicmVhazsKKwkgIGlmIChhZGRyZXNzID49IHN0YXJ0ICYmIGFkZHJlc3MgPD0gZW5kIC0gMSkKKwkgICAgeworCSAgICAgIC8qIEZvdW5kIGl0LiAgTm93IHNlZSBpZiB0aGlzIGxpbmUgY29udGFpbnMgYSBmaWxlbmFtZS4gICovCisJICAgICAgd2hpbGUgKGMgPSBnZXRjIChmcCksIGMgIT0gRU9GICYmIGMgIT0gJ1xuJyAmJiBjICE9ICcvJykKKwkJY29udGludWU7CisJICAgICAgaWYgKGMgPT0gJy8nKQorCQl7CisJCSAgc2l6ZV90IHNpemU7CisJCSAgaW50IGxlbjsKKworCQkgIHVuZ2V0YyAoYywgZnApOworCQkgIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gTlVMTDsgc2l6ZSA9IDA7CisJCSAgbGVuID0gZ2V0bGluZSAoJnNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lLCAmc2l6ZSwgZnApOworCQkgIGlmIChsZW4gPj0gMCkKKwkJICAgIHsKKwkJICAgICAgLyogU3VjY2VzczogZmlsbGVkIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lLiAgKi8KKwkJICAgICAgaWYgKGxlbiA+IDAgJiYgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCXNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lW2xlbiAtIDFdID0gJ1wwJzsKKwkJICAgIH0KKwkJfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorCSAgICBjb250aW51ZTsKKwl9CisgICAgICBmY2xvc2UgKGZwKTsKKyAgICB9CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFdJTjMyIC8gVW5peCAqLworCisvKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGN1cnJlbnQgc2hhcmVkIGxpYnJhcnkuCisgICBSZXR1cm4gTlVMTCBpZiB1bmtub3duLgorICAgR3VhcmFudGVlZCB0byB3b3JrIG9ubHkgb24gTGludXggYW5kIFdvZTMyLiAgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKQoreworI2lmICEoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pCisgIHN0YXRpYyBib29sIHRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7CisgIGlmICghdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSkKKyAgICB7CisgICAgICBmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpOworICAgICAgdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHRydWU7CisgICAgfQorI2VuZGlmCisgIHJldHVybiBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKK30KKworI2VuZGlmIC8qIFBJQyAqLworCisvKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KKyAgIGRpcmVjdG9yeS4gICovCitjb25zdCBjaGFyICoKK3JlbG9jYXRlIChjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKyNpZiBkZWZpbmVkIFBJQyAmJiBkZWZpbmVkIElOU1RBTExESVIKKyAgc3RhdGljIGludCBpbml0aWFsaXplZDsKKworICAvKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcmlnX3ByZWZpeCBhbmQgY3Vycl9wcmVmaXggbGlrZWx5IGhhdmUgYWxyZWFkeSBiZWVuCisJIHNldCB0aHJvdWdoIHRoZSBtYWluIHByb2dyYW0ncyBzZXRfcHJvZ3JhbV9uYW1lX2FuZF9pbnN0YWxsZGlyCisJIGZ1bmN0aW9uLiAgVGhpcyBpcyBzdWZmaWNpZW50IGluIHRoZSBjYXNlIHRoYXQgdGhlIGxpYnJhcnkgaGFzCisJIGluaXRpYWxseSBiZWVuIGluc3RhbGxlZCBpbiB0aGUgc2FtZSBvcmlnX3ByZWZpeC4gIEJ1dCB3ZSBjYW4gZG8KKwkgYmV0dGVyLCB0byBhbHNvIGNvdmVyIHRoZSBjYXNlcyB0aGF0IDEuIGl0IGhhcyBiZWVuIGluc3RhbGxlZAorCSBpbiBhIGRpZmZlcmVudCBwcmVmaXggYmVmb3JlIGJlaW5nIG1vdmVkIHRvIG9yaWdfcHJlZml4IGFuZCAobGF0ZXIpCisJIHRvIGN1cnJfcHJlZml4LCAyLiB1bmxpa2UgdGhlIHByb2dyYW0sIGl0IGhhcyBub3QgbW92ZWQgYXdheSBmcm9tCisJIG9yaWdfcHJlZml4LiAgKi8KKyAgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCA9IElOU1RBTExQUkVGSVg7CisgICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIgPSBJTlNUQUxMRElSOworICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYmV0dGVyOworCisgICAgICBjdXJyX3ByZWZpeF9iZXR0ZXIgPQorCWNvbXB1dGVfY3Vycl9wcmVmaXggKG9yaWdfaW5zdGFsbHByZWZpeCwgb3JpZ19pbnN0YWxsZGlyLAorCQkJICAgICBnZXRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkpOworICAgICAgaWYgKGN1cnJfcHJlZml4X2JldHRlciA9PSBOVUxMKQorCWN1cnJfcHJlZml4X2JldHRlciA9IGN1cnJfcHJlZml4OworCisgICAgICBzZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfaW5zdGFsbHByZWZpeCwgY3Vycl9wcmVmaXhfYmV0dGVyKTsKKworICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KKyNlbmRpZgorCisgIC8qIE5vdGU6IEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcGVyZm9ybSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24gaGVyZSwKKyAgICAgZXZlbiBmb3IgRE9TLWxpa2UgZmlsZXN5c3RlbXMsIGJlY2F1c2UgdGhlIHBhdGhuYW1lIGFyZ3VtZW50IHdhcworICAgICB0eXBpY2FsbHkgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIE1ha2VmaWxlIHZhcmlhYmxlIGFzIG9yaWdfcHJlZml4IGNhbWUKKyAgICAgZnJvbS4gICovCisgIGlmIChvcmlnX3ByZWZpeCAhPSBOVUxMICYmIGN1cnJfcHJlZml4ICE9IE5VTEwKKyAgICAgICYmIHN0cm5jbXAgKHBhdGhuYW1lLCBvcmlnX3ByZWZpeCwgb3JpZ19wcmVmaXhfbGVuKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dID09ICdcMCcpCisJLyogcGF0aG5hbWUgZXF1YWxzIG9yaWdfcHJlZml4LiAgKi8KKwlyZXR1cm4gY3Vycl9wcmVmaXg7CisgICAgICBpZiAoSVNTTEFTSCAocGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXSkpCisJeworCSAgLyogcGF0aG5hbWUgc3RhcnRzIHdpdGggb3JpZ19wcmVmaXguICAqLworCSAgY29uc3QgY2hhciAqcGF0aG5hbWVfdGFpbCA9ICZwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dOworCSAgY2hhciAqcmVzdWx0ID0KKwkgICAgKGNoYXIgKikgeG1hbGxvYyAoY3Vycl9wcmVmaXhfbGVuICsgc3RybGVuIChwYXRobmFtZV90YWlsKSArIDEpOworCisjaWZkZWYgTk9fWE1BTExPQworCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQorI2VuZGlmCisJICAgIHsKKwkgICAgICBtZW1jcHkgKHJlc3VsdCwgY3Vycl9wcmVmaXgsIGN1cnJfcHJlZml4X2xlbik7CisJICAgICAgc3RyY3B5IChyZXN1bHQgKyBjdXJyX3ByZWZpeF9sZW4sIHBhdGhuYW1lX3RhaWwpOworCSAgICAgIHJldHVybiByZXN1bHQ7CisJICAgIH0KKwl9CisgICAgfQorICAvKiBOb3RoaW5nIHRvIHJlbG9jYXRlLiAgKi8KKyAgcmV0dXJuIHBhdGhuYW1lOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5oIGIvdW5peC9pbnRsL3JlbG9jYXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjNWI3MQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1JFTE9DQVRBQkxFX0gKKyNkZWZpbmUgX1JFTE9DQVRBQkxFX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFRoaXMgY2FuIGJlIGVuYWJsZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlIC0tZW5hYmxlLXJlbG9jYXRhYmxlIG9wdGlvbi4gICovCisjaWYgRU5BQkxFX1JFTE9DQVRBQkxFCisKKy8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKKyAgIHRoaXMgaXMgYSBwcml2YXRlIC5oIGZpbGUsIHdlIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAgaW4gYW55IGNhc2UuICAqLworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCisjIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZWxzZQorIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVECisjZW5kaWYKKworLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCisgICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAorICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKyAgIGluc3RlYWQgb2YgIi8iKS4gICovCitleHRlcm4gUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVEIHZvaWQKKyAgICAgICBzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAorCQkJICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXgpOworCisvKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KKyAgIGRpcmVjdG9yeS4gICovCitleHRlcm4gY29uc3QgY2hhciAqIHJlbG9jYXRlIChjb25zdCBjaGFyICpwYXRobmFtZSk7CisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50OiByZWxvY2F0ZSgpIGxlYWtzIG1lbW9yeSwgYmVjYXVzZSBpdCBoYXMgdG8gY29uc3RydWN0CisgICBhIGZyZXNoIHBhdGhuYW1lLiAgSWYgdGhpcyBpcyBhIHByb2JsZW0gYmVjYXVzZSB5b3VyIHByb2dyYW0gY2FsbHMKKyAgIHJlbG9jYXRlKCkgZnJlcXVlbnRseSwgdGhpbmsgYWJvdXQgY2FjaGluZyB0aGUgcmVzdWx0LiAgKi8KKworLyogQ29udmVuaWVuY2UgZnVuY3Rpb246CisgICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKKyAgIGluc3RhbGxhdGlvbiBwcmVmaXgsIHRoZSBvcmlnaW5hbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgcGFydGljdWxhcgorICAgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBhdGhuYW1lIG9mIHRoaXMgZmlsZS4gIFJldHVybnMgTlVMTCB1cG9uIGZhaWx1cmUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCisJCQkJCSBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIsCisJCQkJCSBjb25zdCBjaGFyICpjdXJyX3BhdGhuYW1lKTsKKworI2Vsc2UKKworLyogQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBoYXJkd2lyZWQgcGF0aG5hbWVzLiAgKi8KKyNkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKKworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9SRUxPQ0FUQUJMRV9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvdGV4dGRvbWFpbi5jIGIvdW5peC9pbnRsL3RleHRkb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQ1YTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3RleHRkb21haW4uYwpAQCAtMCwwICsxLDE0MSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworI2lmZGVmIF9MSUJDCisvKiBXZSBoYXZlIHRvIGhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLworIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgorI2Vsc2UKKy8qIFByb3ZpZGUgZHVtbXkgaW1wbGVtZW50YXRpb24gaWYgdGhpcyBpcyBvdXRzaWRlIGdsaWJjLiAgKi8KKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lKENMQVNTLCBOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja193cmxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCisjZW5kaWYKKworLyogVGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhbG9uZSBsaWJpbnRsLmEgbXVzdCBoYXZlIGRpZmZlcmVudAorICAgbmFtZXMgdGhhbiB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIEdOVSBsaWJjLCBvdGhlcndpc2UgcHJvZ3JhbXMKKyAgIHVzaW5nIGxpYmludGwuYSBjYW5ub3QgYmUgbGlua2VkIHN0YXRpY2FsbHkuICAqLworI2lmICFkZWZpbmVkIF9MSUJDCisjIGRlZmluZSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4KKyMgZGVmaW5lIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGxpYmludGxfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCitleHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdIGF0dHJpYnV0ZV9oaWRkZW47CisKKy8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW47CisKKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBURVhURE9NQUlOIF9fdGV4dGRvbWFpbgorIyBpZm5kZWYgc3RyZHVwCisjICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBURVhURE9NQUlOIGxpYmludGxfdGV4dGRvbWFpbgorI2VuZGlmCisKKy8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLworX19saWJjX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKworLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCisgICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCitjaGFyICoKK1RFWFRET01BSU4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCit7CisgIGNoYXIgKm5ld19kb21haW47CisgIGNoYXIgKm9sZF9kb21haW47CisKKyAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIF9fbGliY19yd2xvY2tfd3Jsb2NrIChfbmxfc3RhdGVfbG9jayk7CisKKyAgb2xkX2RvbWFpbiA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIC8qIElmIGRvbWFpbiBuYW1lIGlzIHRoZSBudWxsIHN0cmluZyBzZXQgdG8gZGVmYXVsdCBkb21haW4gIm1lc3NhZ2VzIi4gICovCisgIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcKKyAgICAgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pID09IDApCisgICAgeworICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKKyAgICAgIG5ld19kb21haW4gPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoZG9tYWlubmFtZSwgb2xkX2RvbWFpbikgPT0gMCkKKyAgICAvKiBUaGlzIGNhbiBoYXBwZW4gYW5kIHBlb3BsZSB3aWxsIHVzZSBpdCB0byBzaWduYWwgdGhhdCBzb21lCisgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hhbmdlZC4gICovCisgICAgbmV3X2RvbWFpbiA9IG9sZF9kb21haW47CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgZm9sbG93aW5nIG1hbGxvYyBmYWlscyBgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4nCisJIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQorCSBhcmUgb3V0IG9mIGNvcmUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorICAgICAgbmV3X2RvbWFpbiA9IHN0cmR1cCAoZG9tYWlubmFtZSk7CisjZWxzZQorICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOworICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKyAgICAgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCisJbWVtY3B5IChuZXdfZG9tYWluLCBkb21haW5uYW1lLCBsZW4pOworI2VuZGlmCisKKyAgICAgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCisJX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBuZXdfZG9tYWluOworICAgIH0KKworICAvKiBXZSB1c2UgdGhpcyBwb3NzaWJpbGl0eSB0byBzaWduYWwgYSBjaGFuZ2Ugb2YgdGhlIGxvYWRlZCBjYXRhbG9ncworICAgICBzaW5jZSB0aGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBjYXNlIGFuZCB0aGVyZSBpcyBubyBvdGhlciBlYXN5IHdlCisgICAgIHRvIGRvIGl0LiAgRG8gaXQgb25seSB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KKyAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKKyAgICB7CisgICAgICArK19ubF9tc2dfY2F0X2NudHI7CisKKyAgICAgIGlmIChvbGRfZG9tYWluICE9IG5ld19kb21haW4gJiYgb2xkX2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKKwlmcmVlIChvbGRfZG9tYWluKTsKKyAgICB9CisKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICByZXR1cm4gbmV3X2RvbWFpbjsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fdGV4dGRvbWFpbiwgdGV4dGRvbWFpbik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC92YXNucHJpbnRmLmMgYi91bml4L2ludGwvdmFzbnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjIyODIKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvdmFzbnByaW50Zi5jCkBAIC0wLDAgKzEsODg3IEBACisvKiB2c3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGVsbCBnbGliYydzIDxzdGRpby5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBzbnByaW50ZigpLgorICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCisgICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpZm5kZWYgSU5fTElCSU5UTAorIyBpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgorCisvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKyNpZiBXSURFX0NIQVJfVkVSU0lPTgorIyBpbmNsdWRlICJ2YXNud3ByaW50Zi5oIgorI2Vsc2UKKyMgaW5jbHVkZSAidmFzbnByaW50Zi5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgkvKiBzbnByaW50ZigpLCBzcHJpbnRmKCkgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4JLyogYWJvcnQoKSwgbWFsbG9jKCksIHJlYWxsb2MoKSwgZnJlZSgpICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CS8qIG1lbWNweSgpLCBzdHJsZW4oKSAqLworI2luY2x1ZGUgPGVycm5vLmg+CS8qIGVycm5vICovCisjaW5jbHVkZSA8bGltaXRzLmg+CS8qIENIQVJfQklUICovCisjaW5jbHVkZSA8ZmxvYXQuaD4JLyogREJMX01BWF9FWFAsIExEQkxfTUFYX0VYUCAqLworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKKyNlbHNlCisjIGluY2x1ZGUgInByaW50Zi1wYXJzZS5oIgorI2VuZGlmCisKKy8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCisjaW5jbHVkZSAieHNpemUuaCIKKworI2lmZGVmIEhBVkVfV0NIQVJfVAorIyBpZmRlZiBIQVZFX1dDU0xFTgorIyAgZGVmaW5lIGxvY2FsX3djc2xlbiB3Y3NsZW4KKyMgZWxzZQorICAgLyogU29sYXJpcyAyLjUuMSBoYXMgd2NzbGVuKCkgaW4gYSBzZXBhcmF0ZSBsaWJyYXJ5IGxpYncuc28uIFRvIGF2b2lkCisgICAgICBhIGRlcGVuZGVuY3kgdG93YXJkcyB0aGlzIGxpYnJhcnksIGhlcmUgaXMgYSBsb2NhbCBzdWJzdGl0dXRlLgorICAgICAgRGVmaW5lIHRoaXMgc3Vic3RpdHV0ZSBvbmx5IG9uY2UsIGV2ZW4gaWYgdGhpcyBmaWxlIGlzIGluY2x1ZGVkCisgICAgICB0d2ljZSBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0LiAgKi8KKyMgIGlmbmRlZiBsb2NhbF93Y3NsZW5fZGVmaW5lZAorIyAgIGRlZmluZSBsb2NhbF93Y3NsZW5fZGVmaW5lZCAxCitzdGF0aWMgc2l6ZV90Citsb2NhbF93Y3NsZW4gKGNvbnN0IHdjaGFyX3QgKnMpCit7CisgIGNvbnN0IHdjaGFyX3QgKnB0cjsKKworICBmb3IgKHB0ciA9IHM7ICpwdHIgIT0gKHdjaGFyX3QpIDA7IHB0cisrKQorICAgIDsKKyAgcmV0dXJuIHB0ciAtIHM7Cit9CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBXSURFX0NIQVJfVkVSU0lPTgorIyBkZWZpbmUgVkFTTlBSSU5URiB2YXNud3ByaW50ZgorIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKKyMgZGVmaW5lIERJUkVDVElWRSB3Y2hhcl90X2RpcmVjdGl2ZQorIyBkZWZpbmUgRElSRUNUSVZFUyB3Y2hhcl90X2RpcmVjdGl2ZXMKKyMgZGVmaW5lIFBSSU5URl9QQVJTRSB3cHJpbnRmX3BhcnNlCisjIGRlZmluZSBVU0VfU05QUklOVEYgMQorIyBpZiBIQVZFX0RFQ0xfX1NOV1BSSU5URgorICAgLyogT24gV2luZG93cywgdGhlIGZ1bmN0aW9uIHN3cHJpbnRmKCkgaGFzIGEgZGlmZmVyZW50IHNpZ25hdHVyZSB0aGFuCisgICAgICBvbiBVbml4OyB3ZSB1c2UgdGhlIF9zbndwcmludGYoKSBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KKyMgIGRlZmluZSBTTlBSSU5URiBfc253cHJpbnRmCisjIGVsc2UKKyAgIC8qIFVuaXguICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIHN3cHJpbnRmCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgVkFTTlBSSU5URiB2YXNucHJpbnRmCisjIGRlZmluZSBDSEFSX1QgY2hhcgorIyBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCisjIGRlZmluZSBESVJFQ1RJVkVTIGNoYXJfZGlyZWN0aXZlcworIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHByaW50Zl9wYXJzZQorIyBkZWZpbmUgVVNFX1NOUFJJTlRGIChIQVZFX0RFQ0xfX1NOUFJJTlRGIHx8IEhBVkVfU05QUklOVEYpCisjIGlmIEhBVkVfREVDTF9fU05QUklOVEYKKyAgIC8qIFdpbmRvd3MuICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIF9zbnByaW50ZgorIyBlbHNlCisgICAvKiBVbml4LiAgKi8KKyMgIGRlZmluZSBTTlBSSU5URiBzbnByaW50ZgorIyBlbmRpZgorI2VuZGlmCisKK0NIQVJfVCAqCitWQVNOUFJJTlRGIChDSEFSX1QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBDSEFSX1QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBESVJFQ1RJVkVTIGQ7CisgIGFyZ3VtZW50cyBhOworCisgIGlmIChQUklOVEZfUEFSU0UgKGZvcm1hdCwgJmQsICZhKSA8IDApCisgICAgeworICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyNkZWZpbmUgQ0xFQU5VUCgpIFwKKyAgZnJlZSAoZC5kaXIpOwkJCQkJCQkJXAorICBpZiAoYS5hcmcpCQkJCQkJCQlcCisgICAgZnJlZSAoYS5hcmcpOworCisgIGlmIChwcmludGZfZmV0Y2hhcmdzIChhcmdzLCAmYSkgPCAwKQorICAgIHsKKyAgICAgIENMRUFOVVAgKCk7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICB7CisgICAgc2l6ZV90IGJ1Zl9uZWVkZWRsZW5ndGg7CisgICAgQ0hBUl9UICpidWY7CisgICAgQ0hBUl9UICpidWZfbWFsbG9jZWQ7CisgICAgY29uc3QgQ0hBUl9UICpjcDsKKyAgICBzaXplX3QgaTsKKyAgICBESVJFQ1RJVkUgKmRwOworICAgIC8qIE91dHB1dCBzdHJpbmcgYWNjdW11bGF0b3IuICAqLworICAgIENIQVJfVCAqcmVzdWx0OworICAgIHNpemVfdCBhbGxvY2F0ZWQ7CisgICAgc2l6ZV90IGxlbmd0aDsKKworICAgIC8qIEFsbG9jYXRlIGEgc21hbGwgYnVmZmVyIHRoYXQgd2lsbCBob2xkIGEgZGlyZWN0aXZlIHBhc3NlZCB0bworICAgICAgIHNwcmludGYgb3Igc25wcmludGYuICAqLworICAgIGJ1Zl9uZWVkZWRsZW5ndGggPQorICAgICAgeHN1bTQgKDcsIGQubWF4X3dpZHRoX2xlbmd0aCwgZC5tYXhfcHJlY2lzaW9uX2xlbmd0aCwgNik7CisjaWYgSEFWRV9BTExPQ0EKKyAgICBpZiAoYnVmX25lZWRlZGxlbmd0aCA8IDQwMDAgLyBzaXplb2YgKENIQVJfVCkpCisgICAgICB7CisJYnVmID0gKENIQVJfVCAqKSBhbGxvY2EgKGJ1Zl9uZWVkZWRsZW5ndGggKiBzaXplb2YgKENIQVJfVCkpOworCWJ1Zl9tYWxsb2NlZCA9IE5VTEw7CisgICAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICB7CisJc2l6ZV90IGJ1Zl9tZW1zaXplID0geHRpbWVzIChidWZfbmVlZGVkbGVuZ3RoLCBzaXplb2YgKENIQVJfVCkpOworCWlmIChzaXplX292ZXJmbG93X3AgKGJ1Zl9tZW1zaXplKSkKKwkgIGdvdG8gb3V0X29mX21lbW9yeV8xOworCWJ1ZiA9IChDSEFSX1QgKikgbWFsbG9jIChidWZfbWVtc2l6ZSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCSAgZ290byBvdXRfb2ZfbWVtb3J5XzE7CisJYnVmX21hbGxvY2VkID0gYnVmOworICAgICAgfQorCisgICAgaWYgKHJlc3VsdGJ1ZiAhPSBOVUxMKQorICAgICAgeworCXJlc3VsdCA9IHJlc3VsdGJ1ZjsKKwlhbGxvY2F0ZWQgPSAqbGVuZ3RocDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJcmVzdWx0ID0gTlVMTDsKKwlhbGxvY2F0ZWQgPSAwOworICAgICAgfQorICAgIGxlbmd0aCA9IDA7CisgICAgLyogSW52YXJpYW50czoKKyAgICAgICByZXN1bHQgaXMgZWl0aGVyID09IHJlc3VsdGJ1ZiBvciA9PSBOVUxMIG9yIG1hbGxvYy1hbGxvY2F0ZWQuCisgICAgICAgSWYgbGVuZ3RoID4gMCwgdGhlbiByZXN1bHQgIT0gTlVMTC4gICovCisKKyAgICAvKiBFbnN1cmVzIHRoYXQgYWxsb2NhdGVkID49IG5lZWRlZC4gIEFib3J0cyB0aHJvdWdoIGEganVtcCB0bworICAgICAgIG91dF9vZl9tZW1vcnkgaWYgbmVlZGVkIGlzIFNJWkVfTUFYIG9yIG90aGVyd2lzZSB0b28gYmlnLiAgKi8KKyNkZWZpbmUgRU5TVVJFX0FMTE9DQVRJT04obmVlZGVkKSBcCisgICAgaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJCSAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgXAorCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQkgICAgIFwKKwlDSEFSX1QgKm1lbW9yeTsJCQkJCQkJICAgICBcCisJCQkJCQkJCQkgICAgIFwKKwlhbGxvY2F0ZWQgPSAoYWxsb2NhdGVkID4gMCA/IHh0aW1lcyAoYWxsb2NhdGVkLCAyKSA6IDEyKTsJICAgICBcCisJaWYgKChuZWVkZWQpID4gYWxsb2NhdGVkKQkJCQkJICAgICBcCisJICBhbGxvY2F0ZWQgPSAobmVlZGVkKTsJCQkJCQkgICAgIFwKKwltZW1vcnlfc2l6ZSA9IHh0aW1lcyAoYWxsb2NhdGVkLCBzaXplb2YgKENIQVJfVCkpOwkJICAgICBcCisJaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQkJCQkgICAgIFwKKwkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQkgICAgIFwKKwlpZiAocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkJCQkgICAgIFwKKwkgIG1lbW9yeSA9IChDSEFSX1QgKikgbWFsbG9jIChtZW1vcnlfc2l6ZSk7CQkJICAgICBcCisJZWxzZQkJCQkJCQkJICAgICBcCisJICBtZW1vcnkgPSAoQ0hBUl9UICopIHJlYWxsb2MgKHJlc3VsdCwgbWVtb3J5X3NpemUpOwkJICAgICBcCisJaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCSAgICAgXAorCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCSAgICAgXAorCWlmIChyZXN1bHQgPT0gcmVzdWx0YnVmICYmIGxlbmd0aCA+IDApCQkJCSAgICAgXAorCSAgbWVtY3B5IChtZW1vcnksIHJlc3VsdCwgbGVuZ3RoICogc2l6ZW9mIChDSEFSX1QpKTsJCSAgICAgXAorCXJlc3VsdCA9IG1lbW9yeTsJCQkJCQkgICAgIFwKKyAgICAgIH0KKworICAgIGZvciAoY3AgPSBmb3JtYXQsIGkgPSAwLCBkcCA9ICZkLmRpclswXTsgOyBjcCA9IGRwLT5kaXJfZW5kLCBpKyssIGRwKyspCisgICAgICB7CisJaWYgKGNwICE9IGRwLT5kaXJfc3RhcnQpCisJICB7CisJICAgIHNpemVfdCBuID0gZHAtPmRpcl9zdGFydCAtIGNwOworCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgbik7CisKKwkgICAgRU5TVVJFX0FMTE9DQVRJT04gKGF1Z21lbnRlZF9sZW5ndGgpOworCSAgICBtZW1jcHkgKHJlc3VsdCArIGxlbmd0aCwgY3AsIG4gKiBzaXplb2YgKENIQVJfVCkpOworCSAgICBsZW5ndGggPSBhdWdtZW50ZWRfbGVuZ3RoOworCSAgfQorCWlmIChpID09IGQuY291bnQpCisJICBicmVhazsKKworCS8qIEV4ZWN1dGUgYSBzaW5nbGUgZGlyZWN0aXZlLiAgKi8KKwlpZiAoZHAtPmNvbnZlcnNpb24gPT0gJyUnKQorCSAgeworCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aDsKKworCSAgICBpZiAoIShkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKSkKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgMSk7CisJICAgIEVOU1VSRV9BTExPQ0FUSU9OIChhdWdtZW50ZWRfbGVuZ3RoKTsKKwkgICAgcmVzdWx0W2xlbmd0aF0gPSAnJSc7CisJICAgIGxlbmd0aCA9IGF1Z21lbnRlZF9sZW5ndGg7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAoIShkcC0+YXJnX2luZGV4ICE9IEFSR19OT05FKSkKKwkgICAgICBhYm9ydCAoKTsKKworCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ24nKQorCSAgICAgIHsKKwkJc3dpdGNoIChhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlKQorCQkgIHsKKwkJICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfc2NoYXJfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSOgorCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9zaG9ydF9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOgorCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9pbnRfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2xvbmdpbnRfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXIgPSBsZW5ndGg7CisJCSAgICBicmVhazsKKyNlbmRpZgorCQkgIGRlZmF1bHQ6CisJCSAgICBhYm9ydCAoKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlhcmdfdHlwZSB0eXBlID0gYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZTsKKwkJQ0hBUl9UICpwOworCQl1bnNpZ25lZCBpbnQgcHJlZml4X2NvdW50OworCQlpbnQgcHJlZml4ZXNbMl07CisjaWYgIVVTRV9TTlBSSU5URgorCQlzaXplX3QgdG1wX2xlbmd0aDsKKwkJQ0hBUl9UIHRtcGJ1Zls3MDBdOworCQlDSEFSX1QgKnRtcDsKKworCQkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIGZvciBjYWxsaW5nCisJCSAgIHNwcmludGYuICAqLworCQl7CisJCSAgc2l6ZV90IHdpZHRoOworCQkgIHNpemVfdCBwcmVjaXNpb247CisKKwkJICB3aWR0aCA9IDA7CisJCSAgaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQorCQkgICAgeworCQkgICAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKwkJCXsKKwkJCSAgaW50IGFyZzsKKworCQkJICBpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKKwkJCSAgICBhYm9ydCAoKTsKKwkJCSAgYXJnID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKKwkJCSAgd2lkdGggPSAoYXJnIDwgMCA/ICh1bnNpZ25lZCBpbnQpICgtYXJnKSA6IGFyZyk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgY29uc3QgQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7CisKKwkJCSAgZG8KKwkJCSAgICB3aWR0aCA9IHhzdW0gKHh0aW1lcyAod2lkdGgsIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKKwkJCSAgd2hpbGUgKGRpZ2l0cCAhPSBkcC0+d2lkdGhfZW5kKTsKKwkJCX0KKwkJICAgIH0KKworCQkgIHByZWNpc2lvbiA9IDY7CisJCSAgaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCisJCSAgICB7CisJCSAgICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKwkJCXsKKwkJCSAgaW50IGFyZzsKKworCQkJICBpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCisJCQkgICAgYWJvcnQgKCk7CisJCQkgIGFyZyA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OworCQkJICBwcmVjaXNpb24gPSAoYXJnIDwgMCA/IDAgOiBhcmcpOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGNvbnN0IENIQVJfVCAqZGlnaXRwID0gZHAtPnByZWNpc2lvbl9zdGFydCArIDE7CisKKwkJCSAgcHJlY2lzaW9uID0gMDsKKwkJCSAgZG8KKwkJCSAgICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOworCQkJICB3aGlsZSAoZGlnaXRwICE9IGRwLT5wcmVjaXNpb25fZW5kKTsKKwkJCX0KKwkJICAgIH0KKworCQkgIHN3aXRjaCAoZHAtPmNvbnZlcnNpb24pCisJCSAgICB7CisKKwkJICAgIGNhc2UgJ2QnOiBjYXNlICdpJzogY2FzZSAndSc6CisjIGlmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBlbHNlCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnbyc6CisjIGlmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzMzMzM0IC8qIGJpbmFyeSAtPiBvY3RhbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzMzMzM0IC8qIGJpbmFyeSAtPiBvY3RhbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KKwkJICAgICAgZWxzZQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAneCc6IGNhc2UgJ1gnOgorIyBpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybSAqLworCQkgICAgICBlbHNlCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0gKi8KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2YnOiBjYXNlICdGJzoKKyMgaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKExEQkxfTUFYX0VYUAorCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLworCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxMDsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoREJMX01BWF9FWFAKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTA7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLworCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgcHJlY2lzaW9uKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgorCQkgICAgY2FzZSAnYSc6IGNhc2UgJ0EnOgorCQkgICAgICB0bXBfbGVuZ3RoID0KKwkJCTEyOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50LCBleHBvbmVudCBldGMuICovCisJCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCBwcmVjaXNpb24pOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnYyc6CisjIGlmIGRlZmluZWQgSEFWRV9XSU5UX1QgJiYgIVdJREVfQ0hBUl9WRVJTSU9OCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfV0lERV9DSEFSKQorCQkJdG1wX2xlbmd0aCA9IE1CX0NVUl9NQVg7CisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJCXRtcF9sZW5ndGggPSAxOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAncyc6CisjIGlmZGVmIEhBVkVfV0NIQVJfVAorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX1dJREVfU1RSSU5HKQorCQkJeworCQkJICB0bXBfbGVuZ3RoID0KKwkJCSAgICBsb2NhbF93Y3NsZW4gKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX3N0cmluZyk7CisKKyMgIGlmICFXSURFX0NIQVJfVkVSU0lPTgorCQkJICB0bXBfbGVuZ3RoID0geHRpbWVzICh0bXBfbGVuZ3RoLCBNQl9DVVJfTUFYKTsKKyMgIGVuZGlmCisJCQl9CisJCSAgICAgIGVsc2UKKyMgZW5kaWYKKwkJCXRtcF9sZW5ndGggPSBzdHJsZW4gKGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zdHJpbmcpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAncCc6CisJCSAgICAgIHRtcF9sZW5ndGggPQorCQkJKHVuc2lnbmVkIGludCkgKHNpemVvZiAodm9pZCAqKSAqIENIQVJfQklUCisJCQkJCSogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KKwkJCQkgICAgICAgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIDB4ICovCisJCSAgICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIH0KKworCQkgIGlmICh0bXBfbGVuZ3RoIDwgd2lkdGgpCisJCSAgICB0bXBfbGVuZ3RoID0gd2lkdGg7CisKKwkJICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7IC8qIGFjY291bnQgZm9yIHRyYWlsaW5nIE5VTCAqLworCQl9CisKKwkJaWYgKHRtcF9sZW5ndGggPD0gc2l6ZW9mICh0bXBidWYpIC8gc2l6ZW9mIChDSEFSX1QpKQorCQkgIHRtcCA9IHRtcGJ1ZjsKKwkJZWxzZQorCQkgIHsKKwkJICAgIHNpemVfdCB0bXBfbWVtc2l6ZSA9IHh0aW1lcyAodG1wX2xlbmd0aCwgc2l6ZW9mIChDSEFSX1QpKTsKKworCQkgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAodG1wX21lbXNpemUpKQorCQkgICAgICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KKwkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworCQkgICAgdG1wID0gKENIQVJfVCAqKSBtYWxsb2MgKHRtcF9tZW1zaXplKTsKKwkJICAgIGlmICh0bXAgPT0gTlVMTCkKKwkJICAgICAgLyogT3V0IG9mIG1lbW9yeS4gICovCisJCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKwkJICB9CisjZW5kaWYKKworCQkvKiBDb25zdHJ1Y3QgdGhlIGZvcm1hdCBzdHJpbmcgZm9yIGNhbGxpbmcgc25wcmludGYgb3IKKwkJICAgc3ByaW50Zi4gICovCisJCXAgPSBidWY7CisJCSpwKysgPSAnJSc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX0dST1VQKQorCQkgICpwKysgPSAnXCcnOworCQlpZiAoZHAtPmZsYWdzICYgRkxBR19MRUZUKQorCQkgICpwKysgPSAnLSc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX1NIT1dTSUdOKQorCQkgICpwKysgPSAnKyc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX1NQQUNFKQorCQkgICpwKysgPSAnICc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX0FMVCkKKwkJICAqcCsrID0gJyMnOworCQlpZiAoZHAtPmZsYWdzICYgRkxBR19aRVJPKQorCQkgICpwKysgPSAnMCc7CisJCWlmIChkcC0+d2lkdGhfc3RhcnQgIT0gZHAtPndpZHRoX2VuZCkKKwkJICB7CisJCSAgICBzaXplX3QgbiA9IGRwLT53aWR0aF9lbmQgLSBkcC0+d2lkdGhfc3RhcnQ7CisJCSAgICBtZW1jcHkgKHAsIGRwLT53aWR0aF9zdGFydCwgbiAqIHNpemVvZiAoQ0hBUl9UKSk7CisJCSAgICBwICs9IG47CisJCSAgfQorCQlpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKKwkJICB7CisJCSAgICBzaXplX3QgbiA9IGRwLT5wcmVjaXNpb25fZW5kIC0gZHAtPnByZWNpc2lvbl9zdGFydDsKKwkJICAgIG1lbWNweSAocCwgZHAtPnByZWNpc2lvbl9zdGFydCwgbiAqIHNpemVvZiAoQ0hBUl9UKSk7CisJCSAgICBwICs9IG47CisJCSAgfQorCisJCXN3aXRjaCAodHlwZSkKKwkJICB7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6CisJCSAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKKwkJICAgICpwKysgPSAnbCc7CisJCSAgICAvKkZBTExUSFJPVUdIKi8KKyNlbmRpZgorCQkgIGNhc2UgVFlQRV9MT05HSU5UOgorCQkgIGNhc2UgVFlQRV9VTE9OR0lOVDoKKyNpZmRlZiBIQVZFX1dJTlRfVAorCQkgIGNhc2UgVFlQRV9XSURFX0NIQVI6CisjZW5kaWYKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKwkJICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6CisjZW5kaWYKKwkJICAgICpwKysgPSAnbCc7CisJCSAgICBicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisJCSAgY2FzZSBUWVBFX0xPTkdET1VCTEU6CisJCSAgICAqcCsrID0gJ0wnOworCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJICBkZWZhdWx0OgorCQkgICAgYnJlYWs7CisJCSAgfQorCQkqcCA9IGRwLT5jb252ZXJzaW9uOworI2lmIFVTRV9TTlBSSU5URgorCQlwWzFdID0gJyUnOworCQlwWzJdID0gJ24nOworCQlwWzNdID0gJ1wwJzsKKyNlbHNlCisJCXBbMV0gPSAnXDAnOworI2VuZGlmCisKKwkJLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgZm9yIGNhbGxpbmcgc25wcmludGYgb3Igc3ByaW50Zi4gICovCisJCXByZWZpeF9jb3VudCA9IDA7CisJCWlmIChkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQorCQkgIHsKKwkJICAgIGlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7CisJCSAgfQorCQlpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCisJCSAgeworCQkgICAgaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OworCQkgIH0KKworI2lmIFVTRV9TTlBSSU5URgorCQkvKiBQcmVwYXJlIGNoZWNraW5nIHdoZXRoZXIgc25wcmludGYgcmV0dXJucyB0aGUgY291bnQKKwkJICAgdmlhICVuLiAgKi8KKwkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgMSkpOworCQlyZXN1bHRbbGVuZ3RoXSA9ICdcMCc7CisjZW5kaWYKKworCQlmb3IgKDs7KQorCQkgIHsKKwkJICAgIHNpemVfdCBtYXhsZW47CisJCSAgICBpbnQgY291bnQ7CisJCSAgICBpbnQgcmV0Y291bnQ7CisKKwkJICAgIG1heGxlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKKwkJICAgIGNvdW50ID0gLTE7CisJCSAgICByZXRjb3VudCA9IDA7CisKKyNpZiBVU0VfU05QUklOVEYKKyMgZGVmaW5lIFNOUFJJTlRGX0JVRihhcmcpIFwKKwkJICAgIHN3aXRjaCAocHJlZml4X2NvdW50KQkJCQkgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMDoJCQkJCQkgICAgXAorCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKKwkJCQkJICAgICBhcmcsICZjb3VudCk7CQkgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCisJCQlyZXRjb3VudCA9IFNOUFJJTlRGIChyZXN1bHQgKyBsZW5ndGgsIG1heGxlbiwgYnVmLCAgXAorCQkJCQkgICAgIHByZWZpeGVzWzBdLCBhcmcsICZjb3VudCk7CSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDI6CQkJCQkJICAgIFwKKwkJCXJldGNvdW50ID0gU05QUklOVEYgKHJlc3VsdCArIGxlbmd0aCwgbWF4bGVuLCBidWYsICBcCisJCQkJCSAgICAgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLCBhcmcsIFwKKwkJCQkJICAgICAmY291bnQpOwkJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCisJCQlhYm9ydCAoKTsJCQkJCSAgICBcCisJCSAgICAgIH0KKyNlbHNlCisjIGRlZmluZSBTTlBSSU5URl9CVUYoYXJnKSBcCisJCSAgICBzd2l0Y2ggKHByZWZpeF9jb3VudCkJCQkJICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDA6CQkJCQkJICAgIFwKKwkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIGFyZyk7CQkgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCisJCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBwcmVmaXhlc1swXSwgYXJnKTsJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgXAorCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLFwKKwkJCQkJIGFyZyk7CQkJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCisJCQlhYm9ydCAoKTsJCQkJCSAgICBcCisJCSAgICAgIH0KKyNlbmRpZgorCisJCSAgICBzd2l0Y2ggKHR5cGUpCisJCSAgICAgIHsKKwkJICAgICAgY2FzZSBUWVBFX1NDSEFSOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3NjaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VDSEFSOgorCQkJeworCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VjaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1NIT1JUOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Nob3J0OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VTSE9SVDoKKwkJCXsKKwkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91c2hvcnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfSU5UOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9VSU5UOgorCQkJeworCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VpbnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKKwkJCXsKKwkJCSAgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdpbnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfVUxPTkdJTlQ6CisJCQl7CisJCQkgIHVuc2lnbmVkIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91bG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICAgICAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgorCQkJeworCQkJICBsb25nIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nbG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6CisJCQl7CisJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Vsb25nbG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJICAgICAgY2FzZSBUWVBFX0RPVUJMRToKKwkJCXsKKwkJCSAgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9kb3VibGU7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKwkJICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6CisJCQl7CisJCQkgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfQ0hBUjoKKwkJCXsKKwkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBIQVZFX1dJTlRfVAorCQkgICAgICBjYXNlIFRZUEVfV0lERV9DSEFSOgorCQkJeworCQkJICB3aW50X3QgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfY2hhcjsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJICAgICAgY2FzZSBUWVBFX1NUUklORzoKKwkJCXsKKwkJCSAgY29uc3QgY2hhciAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3N0cmluZzsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9XQ0hBUl9UCisJCSAgICAgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKKwkJCXsKKwkJCSAgY29uc3Qgd2NoYXJfdCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfc3RyaW5nOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKKwkJCXsKKwkJCSAgdm9pZCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3BvaW50ZXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBkZWZhdWx0OgorCQkJYWJvcnQgKCk7CisJCSAgICAgIH0KKworI2lmIFVTRV9TTlBSSU5URgorCQkgICAgLyogUG9ydGFiaWxpdHk6IE5vdCBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHNucHJpbnRmKCkKKwkJICAgICAgIGFyZSBJU08gQyA5OSBjb21wbGlhbnQuICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZgorCQkgICAgICAgYnl0ZXMgdGhhdCBzbnByaW50ZigpIGhhcyBwcm9kdWNlZCBvciB3b3VsZCBoYXZlCisJCSAgICAgICBwcm9kdWNlZC4gICovCisJCSAgICBpZiAoY291bnQgPj0gMCkKKwkJICAgICAgeworCQkJLyogVmVyaWZ5IHRoYXQgc25wcmludGYoKSBoYXMgTlVMLXRlcm1pbmF0ZWQgaXRzCisJCQkgICByZXN1bHQuICAqLworCQkJaWYgKGNvdW50IDwgbWF4bGVuICYmIHJlc3VsdFtsZW5ndGggKyBjb3VudF0gIT0gJ1wwJykKKwkJCSAgYWJvcnQgKCk7CisJCQkvKiBQb3J0YWJpbGl0eSBoYWNrLiAgKi8KKwkJCWlmIChyZXRjb3VudCA+IGNvdW50KQorCQkJICBjb3VudCA9IHJldGNvdW50OworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCS8qIHNucHJpbnRmKCkgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAnJW4nCisJCQkgICBkaXJlY3RpdmUuICAqLworCQkJaWYgKHBbMV0gIT0gJ1wwJykKKwkJCSAgeworCQkJICAgIC8qIERvbid0IHVzZSB0aGUgJyVuJyBkaXJlY3RpdmU7IGluc3RlYWQsIGxvb2sKKwkJCSAgICAgICBhdCB0aGUgc25wcmludGYoKSByZXR1cm4gdmFsdWUuICAqLworCQkJICAgIHBbMV0gPSAnXDAnOworCQkJICAgIGNvbnRpbnVlOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICAvKiBMb29rIGF0IHRoZSBzbnByaW50ZigpIHJldHVybiB2YWx1ZS4gICovCisJCQkgICAgaWYgKHJldGNvdW50IDwgMCkKKwkJCSAgICAgIHsKKwkJCQkvKiBIUC1VWCAxMC4yMCBzbnByaW50ZigpIGlzIGRvdWJseSBkZWZpY2llbnQ6CisJCQkJICAgSXQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAnJW4nIGRpcmVjdGl2ZSwKKwkJCQkgICAqYW5kKiBpdCByZXR1cm5zIC0xIChyYXRoZXIgdGhhbiB0aGUgbGVuZ3RoCisJCQkJICAgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmVxdWlyZWQpIHdoZW4gdGhlCisJCQkJICAgYnVmZmVyIGlzIHRvbyBzbWFsbC4gICovCisJCQkJc2l6ZV90IGJpZ2dlcl9uZWVkID0KKwkJCQkgIHhzdW0gKHh0aW1lcyAoYWxsb2NhdGVkLCAyKSwgMTIpOworCQkJCUVOU1VSRV9BTExPQ0FUSU9OIChiaWdnZXJfbmVlZCk7CisJCQkJY29udGludWU7CisJCQkgICAgICB9CisJCQkgICAgZWxzZQorCQkJICAgICAgY291bnQgPSByZXRjb3VudDsKKwkJCSAgfQorCQkgICAgICB9CisjZW5kaWYKKworCQkgICAgLyogQXR0ZW1wdCB0byBoYW5kbGUgZmFpbHVyZS4gICovCisJCSAgICBpZiAoY291bnQgPCAwKQorCQkgICAgICB7CisJCQlpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKKwkJCSAgZnJlZSAocmVzdWx0KTsKKwkJCWlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKKwkJCSAgZnJlZSAoYnVmX21hbGxvY2VkKTsKKwkJCUNMRUFOVVAgKCk7CisJCQllcnJubyA9IEVJTlZBTDsKKwkJCXJldHVybiBOVUxMOworCQkgICAgICB9CisKKyNpZiAhVVNFX1NOUFJJTlRGCisJCSAgICBpZiAoY291bnQgPj0gdG1wX2xlbmd0aCkKKwkJICAgICAgLyogdG1wX2xlbmd0aCB3YXMgaW5jb3JyZWN0bHkgY2FsY3VsYXRlZCAtIGZpeCB0aGUKKwkJCSBjb2RlIGFib3ZlISAgKi8KKwkJICAgICAgYWJvcnQgKCk7CisjZW5kaWYKKworCQkgICAgLyogTWFrZSByb29tIGZvciB0aGUgcmVzdWx0LiAgKi8KKwkJICAgIGlmIChjb3VudCA+PSBtYXhsZW4pCisJCSAgICAgIHsKKwkJCS8qIE5lZWQgYXQgbGVhc3QgY291bnQgYnl0ZXMuICBCdXQgYWxsb2NhdGUKKwkJCSAgIHByb3BvcnRpb25hbGx5LCB0byBhdm9pZCBsb29waW5nIGV0ZXJuYWxseSBpZgorCQkJICAgc25wcmludGYoKSByZXBvcnRzIGEgdG9vIHNtYWxsIGNvdW50LiAgKi8KKwkJCXNpemVfdCBuID0KKwkJCSAgeG1heCAoeHN1bSAobGVuZ3RoLCBjb3VudCksIHh0aW1lcyAoYWxsb2NhdGVkLCAyKSk7CisKKwkJCUVOU1VSRV9BTExPQ0FUSU9OIChuKTsKKyNpZiBVU0VfU05QUklOVEYKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCSAgICAgIH0KKworI2lmIFVTRV9TTlBSSU5URgorCQkgICAgLyogVGhlIHNucHJpbnRmKCkgcmVzdWx0IGRpZCBmaXQuICAqLworI2Vsc2UKKwkJICAgIC8qIEFwcGVuZCB0aGUgc3ByaW50ZigpIHJlc3VsdC4gICovCisJCSAgICBtZW1jcHkgKHJlc3VsdCArIGxlbmd0aCwgdG1wLCBjb3VudCAqIHNpemVvZiAoQ0hBUl9UKSk7CisJCSAgICBpZiAodG1wICE9IHRtcGJ1ZikKKwkJICAgICAgZnJlZSAodG1wKTsKKyNlbmRpZgorCisJCSAgICBsZW5ndGggKz0gY291bnQ7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgLyogQWRkIHRoZSBmaW5hbCBOVUwuICAqLworICAgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIDEpKTsKKyAgICByZXN1bHRbbGVuZ3RoXSA9ICdcMCc7CisKKyAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZiAmJiBsZW5ndGggKyAxIDwgYWxsb2NhdGVkKQorICAgICAgeworCS8qIFNocmluayB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpZiBwb3NzaWJsZS4gICovCisJQ0hBUl9UICptZW1vcnk7CisKKwltZW1vcnkgPSAoQ0hBUl9UICopIHJlYWxsb2MgKHJlc3VsdCwgKGxlbmd0aCArIDEpICogc2l6ZW9mIChDSEFSX1QpKTsKKwlpZiAobWVtb3J5ICE9IE5VTEwpCisJICByZXN1bHQgPSBtZW1vcnk7CisgICAgICB9CisKKyAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCisgICAgICBmcmVlIChidWZfbWFsbG9jZWQpOworICAgIENMRUFOVVAgKCk7CisgICAgKmxlbmd0aHAgPSBsZW5ndGg7CisgICAgcmV0dXJuIHJlc3VsdDsKKworICBvdXRfb2ZfbWVtb3J5OgorICAgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQorICAgICAgZnJlZSAocmVzdWx0KTsKKyAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCisgICAgICBmcmVlIChidWZfbWFsbG9jZWQpOworICBvdXRfb2ZfbWVtb3J5XzE6CisgICAgQ0xFQU5VUCAoKTsKKyAgICBlcnJubyA9IEVOT01FTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCisjdW5kZWYgU05QUklOVEYKKyN1bmRlZiBVU0VfU05QUklOVEYKKyN1bmRlZiBQUklOVEZfUEFSU0UKKyN1bmRlZiBESVJFQ1RJVkVTCisjdW5kZWYgRElSRUNUSVZFCisjdW5kZWYgQ0hBUl9UCisjdW5kZWYgVkFTTlBSSU5URgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3Zhc25wcmludGYuaCBiL3VuaXgvaW50bC92YXNucHJpbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmMWJjMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC92YXNucHJpbnRmLmgKQEAgLTAsMCArMSw2MSBAQAorLyogdnNwcmludGYgd2l0aCBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1ZBU05QUklOVEZfSAorI2RlZmluZSBfVkFTTlBSSU5URl9ICisKKy8qIEdldCB2YV9saXN0LiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogR2V0IHNpemVfdC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZm5kZWYgX19hdHRyaWJ1dGVfXworLyogVGhpcyBmZWF0dXJlIGlzIGF2YWlsYWJsZSBpbiBnY2MgdmVyc2lvbnMgMi41IGFuZCBsYXRlci4gICovCisjIGlmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDUpIHx8IF9fU1RSSUNUX0FOU0lfXworIyAgZGVmaW5lIF9fYXR0cmlidXRlX18oU3BlYykgLyogZW1wdHkgKi8KKyMgZW5kaWYKKy8qIFRoZSBfXy1wcm90ZWN0ZWQgdmFyaWFudHMgb2YgYGZvcm1hdCcgYW5kIGBwcmludGYnIGF0dHJpYnV0ZXMKKyAgIGFyZSBhY2NlcHRlZCBieSBnY2MgdmVyc2lvbnMgMi42LjQgKGVmZmVjdGl2ZWx5IDIuNykgYW5kIGxhdGVyLiAgKi8KKyMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykKKyMgIGRlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAorIyAgZGVmaW5lIF9fcHJpbnRmX18gcHJpbnRmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgorICAgWW91IGNhbiBwYXNzIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpbiBSRVNVTFRCVUYgYW5kIGl0cworICAgc2l6ZSBpbiAqTEVOR1RIUDsgb3RoZXJ3aXNlIHlvdSBwYXNzIFJFU1VMVEJVRiA9IE5VTEwuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyAodGhpcyBtYXkgYmUgPSBSRVNVTFRCVUYKKyAgIGlmIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gd2FzIG5lY2Vzc2FyeSkgYW5kIHNldCAqTEVOR1RIUCB0byB0aGUKKyAgIG51bWJlciBvZiByZXN1bHRpbmcgYnl0ZXMsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgVXBvbiBlcnJvciwgc2V0CisgICBlcnJubyBhbmQgcmV0dXJuIE5VTEwuICAqLworZXh0ZXJuIGNoYXIgKiBhc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyAgICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiBjaGFyICogdmFzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorICAgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1ZBU05QUklOVEZfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3Zhc253cHJpbnRmLmggYi91bml4L2ludGwvdmFzbndwcmludGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2NlZjRjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3Zhc253cHJpbnRmLmgKQEAgLTAsMCArMSw0NiBAQAorLyogdnN3cHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9WQVNOV1BSSU5URl9ICisjZGVmaW5lIF9WQVNOV1BSSU5URl9ICisKKy8qIEdldCB2YV9saXN0LiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogR2V0IHdjaGFyX3QsIHNpemVfdC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBhIHN0cmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4KKyAgIFlvdSBjYW4gcGFzcyBhIHByZWFsbG9jYXRlZCBidWZmZXIgZm9yIHRoZSByZXN1bHQgaW4gUkVTVUxUQlVGIGFuZCBpdHMKKyAgIHNpemUgaW4gKkxFTkdUSFA7IG90aGVyd2lzZSB5b3UgcGFzcyBSRVNVTFRCVUYgPSBOVUxMLgorICAgSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJpbmcgKHRoaXMgbWF5IGJlID0gUkVTVUxUQlVGCisgICBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHdhcyBuZWNlc3NhcnkpIGFuZCBzZXQgKkxFTkdUSFAgdG8gdGhlCisgICBudW1iZXIgb2YgcmVzdWx0aW5nIGJ5dGVzLCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gIFVwb24gZXJyb3IsIHNldAorICAgZXJybm8gYW5kIHJldHVybiBOVUxMLiAgKi8KK2V4dGVybiB3Y2hhcl90ICogYXNud3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiB3Y2hhcl90ICogdmFzbndwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVkFTTldQUklOVEZfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3dwcmludGYtcGFyc2UuaCBiL3VuaXgvaW50bC93cHJpbnRmLXBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhMmNmYwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC93cHJpbnRmLXBhcnNlLmgKQEAgLTAsMCArMSw3NSBAQAorLyogUGFyc2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1dQUklOVEZfUEFSU0VfSAorI2RlZmluZSBfV1BSSU5URl9QQVJTRV9ICisKKyNpbmNsdWRlICJwcmludGYtYXJncy5oIgorCisKKy8qIEZsYWdzICovCisjZGVmaW5lIEZMQUdfR1JPVVAJIDEJLyogJyBmbGFnICovCisjZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19TSE9XU0lHTgkgNAkvKiArIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19TUEFDRQkgOAkvKiBzcGFjZSBmbGFnICovCisjZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLworI2RlZmluZSBGTEFHX1pFUk8JMzIKKworLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCisjZGVmaW5lIEFSR19OT05FCSh+KHNpemVfdCkwKQorCisvKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3Qgd2NoYXJfdCogZGlyX3N0YXJ0OworICBjb25zdCB3Y2hhcl90KiBkaXJfZW5kOworICBpbnQgZmxhZ3M7CisgIGNvbnN0IHdjaGFyX3QqIHdpZHRoX3N0YXJ0OworICBjb25zdCB3Y2hhcl90KiB3aWR0aF9lbmQ7CisgIHNpemVfdCB3aWR0aF9hcmdfaW5kZXg7CisgIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9zdGFydDsKKyAgY29uc3Qgd2NoYXJfdCogcHJlY2lzaW9uX2VuZDsKKyAgc2l6ZV90IHByZWNpc2lvbl9hcmdfaW5kZXg7CisgIHdjaGFyX3QgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCisgIHNpemVfdCBhcmdfaW5kZXg7Cit9Cit3Y2hhcl90X2RpcmVjdGl2ZTsKKworLyogQSBwYXJzZWQgZm9ybWF0IHN0cmluZy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBzaXplX3QgY291bnQ7CisgIHdjaGFyX3RfZGlyZWN0aXZlICpkaXI7CisgIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoOworICBzaXplX3QgbWF4X3ByZWNpc2lvbl9sZW5ndGg7Cit9Cit3Y2hhcl90X2RpcmVjdGl2ZXM7CisKKworLyogUGFyc2VzIHRoZSBmb3JtYXQgc3RyaW5nLiAgRmlsbHMgaW4gdGhlIG51bWJlciBOIG9mIGRpcmVjdGl2ZXMsIGFuZCBmaWxscworICAgaW4gZGlyZWN0aXZlc1swXSwgLi4uLCBkaXJlY3RpdmVzW04tMV0sIGFuZCBzZXRzIGRpcmVjdGl2ZXNbTl0uZGlyX3N0YXJ0CisgICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQorICAgYXJndW1lbnRzIGFuZCB0aGUgbmVlZGVkIGNvdW50IG9mIGFyZ3VtZW50cy4gICovCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbHNlCitleHRlcm4KKyNlbmRpZgoraW50IHdwcmludGZfcGFyc2UgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgd2NoYXJfdF9kaXJlY3RpdmVzICpkLCBhcmd1bWVudHMgKmEpOworCisjZW5kaWYgLyogX1dQUklOVEZfUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3hzaXplLmggYi91bml4L2ludGwveHNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJlMjRiCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3hzaXplLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIHhzaXplLmggLS0gQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9YU0laRV9ICisjZGVmaW5lIF9YU0laRV9ICisKKy8qIEdldCBzaXplX3QuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgU0laRV9NQVguICAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworLyogVGhlIHNpemUgb2YgbWVtb3J5IG9iamVjdHMgaXMgb2Z0ZW4gY29tcHV0ZWQgdGhyb3VnaCBleHByZXNzaW9ucyBvZgorICAgdHlwZSBzaXplX3QuIEV4YW1wbGU6CisgICAgICB2b2lkKiBwID0gbWFsbG9jIChoZWFkZXJfc2l6ZSArIG4gKiBlbGVtZW50X3NpemUpLgorICAgVGhlc2UgY29tcHV0YXRpb25zIGNhbiBsZWFkIHRvIG92ZXJmbG93LiAgV2hlbiB0aGlzIGhhcHBlbnMsIG1hbGxvYygpCisgICByZXR1cm5zIGEgcGllY2Ugb2YgbWVtb3J5IHRoYXQgaXMgd2F5IHRvbyBzbWFsbCwgYW5kIHRoZSBwcm9ncmFtIHRoZW4KKyAgIGNyYXNoZXMgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIHRoZSBtZW1vcnkuCisgICBUbyBhdm9pZCB0aGlzLCB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MgaW4gdGhpcyBmaWxlIGNoZWNrIGZvciBvdmVyZmxvdy4KKyAgIFRoZSBjb252ZW50aW9uIGlzIHRoYXQgU0laRV9NQVggcmVwcmVzZW50cyBvdmVyZmxvdy4KKyAgIG1hbGxvYyAoU0laRV9NQVgpIGlzIG5vdCBndWFyYW50ZWVkIHRvIGZhaWwgLS0gdGhpbmsgb2YgYSBtYWxsb2MKKyAgIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBtbWFwIC0tLCBpdCdzIHJlY29tbWVuZGVkIHRvIHVzZSBzaXplX292ZXJmbG93X3AoKQorICAgb3Igc2l6ZV9pbl9ib3VuZHNfcCgpIGJlZm9yZSBpbnZva2luZyBtYWxsb2MoKS4KKyAgIFRoZSBleGFtcGxlIHRodXMgYmVjb21lczoKKyAgICAgIHNpemVfdCBzaXplID0geHN1bSAoaGVhZGVyX3NpemUsIHh0aW1lcyAobiwgZWxlbWVudF9zaXplKSk7CisgICAgICB2b2lkICpwID0gKHNpemVfaW5fYm91bmRzX3AgKHNpemUpID8gbWFsbG9jIChzaXplKSA6IE5VTEwpOworKi8KKworLyogQ29udmVydCBhbiBhcmJpdHJhcnkgdmFsdWUgPj0gMCB0byB0eXBlIHNpemVfdC4gICovCisjZGVmaW5lIHhjYXN0X3NpemVfdChOKSBcCisgICgoTikgPD0gU0laRV9NQVggPyAoc2l6ZV90KSAoTikgOiBTSVpFX01BWCkKKworLyogU3VtIG9mIHR3byBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCitzdGF0aWMgaW5saW5lIHNpemVfdAorI2lmIF9fR05VQ19fID49IDMKK19fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZW5kaWYKK3hzdW0gKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyKQoreworICBzaXplX3Qgc3VtID0gc2l6ZTEgKyBzaXplMjsKKyAgcmV0dXJuIChzdW0gPj0gc2l6ZTEgPyBzdW0gOiBTSVpFX01BWCk7Cit9CisKKy8qIFN1bSBvZiB0aHJlZSBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCitzdGF0aWMgaW5saW5lIHNpemVfdAorI2lmIF9fR05VQ19fID49IDMKK19fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZW5kaWYKK3hzdW0zIChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMiwgc2l6ZV90IHNpemUzKQoreworICByZXR1cm4geHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpOworfQorCisvKiBTdW0gb2YgZm91ciBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCitzdGF0aWMgaW5saW5lIHNpemVfdAorI2lmIF9fR05VQ19fID49IDMKK19fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZW5kaWYKK3hzdW00IChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMiwgc2l6ZV90IHNpemUzLCBzaXplX3Qgc2l6ZTQpCit7CisgIHJldHVybiB4c3VtICh4c3VtICh4c3VtIChzaXplMSwgc2l6ZTIpLCBzaXplMyksIHNpemU0KTsKK30KKworLyogTWF4aW11bSBvZiB0d28gc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLworc3RhdGljIGlubGluZSBzaXplX3QKKyNpZiBfX0dOVUNfXyA+PSAzCitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCit4bWF4IChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMikKK3sKKyAgLyogTm8gZXhwbGljaXQgY2hlY2sgaXMgbmVlZGVkIGhlcmUsIGJlY2F1c2UgZm9yIGFueSBuOgorICAgICBtYXggKFNJWkVfTUFYLCBuKSA9PSBTSVpFX01BWCBhbmQgbWF4IChuLCBTSVpFX01BWCkgPT0gU0laRV9NQVguICAqLworICByZXR1cm4gKHNpemUxID49IHNpemUyID8gc2l6ZTEgOiBzaXplMik7Cit9CisKKy8qIE11bHRpcGxpY2F0aW9uIG9mIGEgY291bnQgd2l0aCBhbiBlbGVtZW50IHNpemUsIHdpdGggb3ZlcmZsb3cgY2hlY2suCisgICBUaGUgY291bnQgbXVzdCBiZSA+PSAwIGFuZCB0aGUgZWxlbWVudCBzaXplIG11c3QgYmUgPiAwLgorICAgVGhpcyBpcyBhIG1hY3JvLCBub3QgYW4gaW5saW5lIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IHdvcmtzIGNvcnJlY3RseSBldmVuCisgICB3aGVuIE4gaXMgb2YgYSB3aWRlciB0dXBlIGFuZCBOID4gU0laRV9NQVguICAqLworI2RlZmluZSB4dGltZXMoTiwgRUxTSVpFKSBcCisgICgoTikgPD0gU0laRV9NQVggLyAoRUxTSVpFKSA/IChzaXplX3QpIChOKSAqIChFTFNJWkUpIDogU0laRV9NQVgpCisKKy8qIENoZWNrIGZvciBvdmVyZmxvdy4gICovCisjZGVmaW5lIHNpemVfb3ZlcmZsb3dfcChTSVpFKSBcCisgICgoU0laRSkgPT0gU0laRV9NQVgpCisvKiBDaGVjayBhZ2FpbnN0IG92ZXJmbG93LiAgKi8KKyNkZWZpbmUgc2l6ZV9pbl9ib3VuZHNfcChTSVpFKSBcCisgICgoU0laRSkgIT0gU0laRV9NQVgpCisKKyNlbmRpZiAvKiBfWFNJWkVfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9ta2luc3RhbGxkaXJzIGIvdW5peC9ta2luc3RhbGxkaXJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyZDVmMjEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L21raW5zdGFsbGRpcnMKQEAgLTAsMCArMSwxMTEgQEAKKyMhIC9iaW4vc2gKKyMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5CisjIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgorIyBDcmVhdGVkOiAxOTkzLTA1LTE2CisjIFB1YmxpYyBkb21haW4KKworZXJyc3RhdHVzPTAKK2Rpcm1vZGU9IiIKKwordXNhZ2U9IlwKK1VzYWdlOiBta2luc3RhbGxkaXJzIFstaF0gWy0taGVscF0gWy1tIG1vZGVdIGRpciAuLi4iCisKKyMgcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1oIHwgLS1oZWxwIHwgLS1oKikgICAgICAgICAjIC1oIGZvciBoZWxwCisgICAgICBlY2hvICIkdXNhZ2UiIDE+JjIKKyAgICAgIGV4aXQgMAorICAgICAgOzsKKyAgICAtbSkgICAgICAgICAgICAgICAgICAgICAgICAgIyAtbSBQRVJNIGFyZworICAgICAgc2hpZnQKKyAgICAgIHRlc3QgJCMgLWVxIDAgJiYgeyBlY2hvICIkdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgICAgZGlybW9kZT0kMQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgLS0pICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgc2hpZnQKKyAgICAgIGJyZWFrCisgICAgICA7OworICAgIC0qKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHVua25vd24gb3B0aW9uCisgICAgICBlY2hvICIkdXNhZ2UiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaXJzdCBub24tb3B0IGFyZworICAgICAgYnJlYWsKKyAgICAgIDs7CisgIGVzYWMKK2RvbmUKKworZm9yIGZpbGUKK2RvCisgIGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgorICAgIHNoaWZ0CisgIGVsc2UKKyAgICBicmVhaworICBmaQorZG9uZQorCitjYXNlICQjIGluCisgIDApIGV4aXQgMCA7OworZXNhYworCitjYXNlICRkaXJtb2RlIGluCisgICcnKQorICAgIGlmIG1rZGlyIC1wIC0tIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyIC1wIC0tICQqIgorICAgICAgZXhlYyBta2RpciAtcCAtLSAiJEAiCisgICAgZmkKKyAgICA7OworICAqKQorICAgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS0gLiAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgZWNobyAibWtkaXIgLW0gJGRpcm1vZGUgLXAgLS0gJCoiCisgICAgICBleGVjIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS0gIiRAIgorICAgIGZpCisgICAgOzsKK2VzYWMKKworZm9yIGZpbGUKK2RvCisgIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8IHNlZCAtbmUgJ3MvXjpcLy8jLztzL146Ly87cy9cLy8gL2c7cy9eIy9cLy87cCdgCisgIHNoaWZ0CisKKyAgcGF0aGNvbXA9CisgIGZvciBkCisgIGRvCisgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgorICAgIGNhc2UgJHBhdGhjb21wIGluCisgICAgICAtKikgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIKKworICAgICAgbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisgICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyAgCWVycnN0YXR1cz0kbGFzdGVycgorICAgICAgZWxzZQorICAJaWYgdGVzdCAhIC16ICIkZGlybW9kZSI7IHRoZW4KKwkgIGVjaG8gImNobW9kICRkaXJtb2RlICRwYXRoY29tcCIKKyAgICAJICBsYXN0ZXJyPSIiCisgIAkgIGNobW9kICIkZGlybW9kZSIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisgIAkgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCisgIAkgICAgZXJyc3RhdHVzPSRsYXN0ZXJyCisgIAkgIGZpCisgIAlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCisgIGRvbmUKK2RvbmUKKworZXhpdCAkZXJyc3RhdHVzCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgRW5kOgorIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvdW5peC9wby9MSU5HVUFTIGIvdW5peC9wby9MSU5HVUFTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjhiODYKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3BvL0xJTkdVQVMKQEAgLTAsMCArMSBAQAorc3YgZGUKZGlmZiAtLWdpdCBhL3VuaXgvcG8vTWFrZWZpbGUuaW4uaW4gYi91bml4L3BvL01ha2VmaWxlLmluLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZWZjNWUKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3BvL01ha2VmaWxlLmluLmluCkBAIC0wLDAgKzEsMzY2IEBACisjIE1ha2VmaWxlIGZvciBQTyBkaXJlY3RvcnkgaW4gYW55IHBhY2thZ2UgdXNpbmcgR05VIGdldHRleHQuCisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+CisjCisjIFRoaXMgZmlsZSBjYW4gYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorIyBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiBHTlUgZ2V0dGV4dCBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgaXMgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIE9yaWdpbjogZ2V0dGV4dC0wLjE0CisKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKKworU0hFTEwgPSAvYmluL3NoCitAU0VUX01BS0VACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCitnZXR0ZXh0c3JjZGlyID0gJChkYXRhZGlyKS9nZXR0ZXh0L3BvCisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJChNS0lOU1RBTExESVJTKQorCitHTVNHRk1UID0gQEdNU0dGTVRACitNU0dGTVQgPSBATVNHRk1UQAorWEdFVFRFWFQgPSBAWEdFVFRFWFRACitNU0dNRVJHRSA9IG1zZ21lcmdlCitNU0dNRVJHRV9VUERBVEUgPSBATVNHTUVSR0VAIC0tdXBkYXRlCitNU0dJTklUID0gbXNnaW5pdAorTVNHQ09OViA9IG1zZ2NvbnYKK01TR0ZJTFRFUiA9IG1zZ2ZpbHRlcgorCitQT0ZJTEVTID0gQFBPRklMRVNACitHTU9GSUxFUyA9IEBHTU9GSUxFU0AKK1VQREFURVBPRklMRVMgPSBAVVBEQVRFUE9GSUxFU0AKK0RVTU1ZUE9GSUxFUyA9IEBEVU1NWVBPRklMRVNACitESVNURklMRVMuY29tbW9uID0gTWFrZWZpbGUuaW4uaW4gcmVtb3ZlLXBvdGNkYXRlLnNpbiBcCiskKERJU1RGSUxFUy5jb21tb24uZXh0cmExKSAkKERJU1RGSUxFUy5jb21tb24uZXh0cmEyKSAkKERJU1RGSUxFUy5jb21tb24uZXh0cmEzKQorRElTVEZJTEVTID0gJChESVNURklMRVMuY29tbW9uKSBNYWtldmFycyBQT1RGSUxFUy5pbiAkKERPTUFJTikucG90IHN0YW1wLXBvIFwKKyQoUE9GSUxFUykgJChHTU9GSUxFUykgXAorJChESVNURklMRVMuZXh0cmExKSAkKERJU1RGSUxFUy5leHRyYTIpICQoRElTVEZJTEVTLmV4dHJhMykKKworUE9URklMRVMgPSBcCisKK0NBVEFMT0dTID0gQENBVEFMT0dTQAorCisjIE1ha2V2YXJzIGdldHMgaW5zZXJ0ZWQgaGVyZS4gKERvbid0IHJlbW92ZSB0aGlzIGxpbmUhKQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5wbyAuZ21vIC5tbyAuc2VkIC5zaW4gLm5vcCAucG8tY3JlYXRlIC5wby11cGRhdGUKKworLnBvLm1vOgorCUBlY2hvICIkKE1TR0ZNVCkgLWMgLW8gJEAgJDwiOyBcCisJJChNU0dGTVQpIC1jIC1vIHQtJEAgJDwgJiYgbXYgdC0kQCAkQAorCisucG8uZ21vOgorCUBsYW5nPWBlY2hvICQqIHwgc2VkIC1lICdzLC4qLywsJ2A7IFwKKwl0ZXN0ICIkKHNyY2RpcikiID0gLiAmJiBjZGNtZD0iIiB8fCBjZGNtZD0iY2QgJChzcmNkaXIpICYmICI7IFwKKwllY2hvICIkJHtjZGNtZH1ybSAtZiAkJHtsYW5nfS5nbW8gJiYgJChHTVNHRk1UKSAtYyAtLXN0YXRpc3RpY3MgLW8gJCR7bGFuZ30uZ21vICQke2xhbmd9LnBvIjsgXAorCWNkICQoc3JjZGlyKSAmJiBybSAtZiAkJHtsYW5nfS5nbW8gJiYgJChHTVNHRk1UKSAtYyAtLXN0YXRpc3RpY3MgLW8gdC0kJHtsYW5nfS5nbW8gJCR7bGFuZ30ucG8gJiYgbXYgdC0kJHtsYW5nfS5nbW8gJCR7bGFuZ30uZ21vCisKKy5zaW4uc2VkOgorCXNlZCAtZSAnL14jL2QnICQ8ID4gdC0kQAorCW12IHQtJEAgJEAKKworCithbGw6IGFsbC1AVVNFX05MU0AKKworYWxsLXllczogc3RhbXAtcG8KK2FsbC1ubzoKKworIyBzdGFtcC1wbyBpcyBhIHRpbWVzdGFtcCBkZW5vdGluZyB0aGUgbGFzdCB0aW1lIGF0IHdoaWNoIHRoZSBDQVRBTE9HUyBoYXZlCisjIGJlZW4gbG9vc2VseSB1cGRhdGVkLiBJdHMgcHVycG9zZSBpcyB0aGF0IHdoZW4gYSBkZXZlbG9wZXIgb3IgdHJhbnNsYXRvcgorIyBjaGVja3Mgb3V0IHRoZSBwYWNrYWdlIHZpYSBDVlMsIGFuZCB0aGUgJChET01BSU4pLnBvdCBmaWxlIGlzIG5vdCBpbiBDVlMsCisjICJtYWtlIiB3aWxsIHVwZGF0ZSB0aGUgJChET01BSU4pLnBvdCBhbmQgdGhlICQoQ0FUQUxPR1MpLCBidXQgc3Vic2VxdWVudAorIyBpbnZvY2F0aW9ucyBvZiAibWFrZSIgd2lsbCBkbyBub3RoaW5nLiBUaGlzIHRpbWVzdGFtcCB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5CisjIGlmIHVwZGF0aW5nIHRoZSAkKENBVEFMT0dTKSB3b3VsZCBhbHdheXMgdG91Y2ggdGhlbTsgaG93ZXZlciwgdGhlIHJ1bGUgZm9yCisjICQoUE9GSUxFUykgaGFzIGJlZW4gZGVzaWduZWQgdG8gbm90IHRvdWNoIGZpbGVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZQorIyBjaGFuZ2VkLgorc3RhbXAtcG86ICQoc3JjZGlyKS8kKERPTUFJTikucG90CisJdGVzdCAteiAiJChHTU9GSUxFUykiIHx8ICQoTUFLRSkgJChHTU9GSUxFUykKKwlAZWNobyAidG91Y2ggc3RhbXAtcG8iCisJQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtcG9UCisJQG12IHN0YW1wLXBvVCBzdGFtcC1wbworCisjIE5vdGU6IFRhcmdldCAnYWxsJyBtdXN0IG5vdCBkZXBlbmQgb24gdGFyZ2V0ICckKERPTUFJTikucG90LXVwZGF0ZScsCisjIG90aGVyd2lzZSBwYWNrYWdlcyBsaWtlIEdDQyBjYW4gbm90IGJlIGJ1aWx0IGlmIG9ubHkgcGFydHMgb2YgdGhlIHNvdXJjZQorIyBoYXZlIGJlZW4gZG93bmxvYWRlZC4KKworIyBUaGlzIHRhcmdldCByZWJ1aWxkcyAkKERPTUFJTikucG90OyBpdCBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLgorIyBOb3RlIHRoYXQgJChET01BSU4pLnBvdCBpcyBub3QgdG91Y2hlZCBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZC4KKyQoRE9NQUlOKS5wb3QtdXBkYXRlOiAkKFBPVEZJTEVTKSAkKHNyY2RpcikvUE9URklMRVMuaW4gcmVtb3ZlLXBvdGNkYXRlLnNlZAorCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChET01BSU4pIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAorCSAgLS1hZGQtY29tbWVudHM9VFJBTlNMQVRPUlM6ICQoWEdFVFRFWFRfT1BUSU9OUykgXAorCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbiBcCisJICAtLWNvcHlyaWdodC1ob2xkZXI9JyQoQ09QWVJJR0hUX0hPTERFUiknIFwKKwkgIC0tbXNnaWQtYnVncy1hZGRyZXNzPSckKE1TR0lEX0JVR1NfQUREUkVTUyknCisJdGVzdCAhIC1mICQoRE9NQUlOKS5wbyB8fCB7IFwKKwkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQoRE9NQUlOKS5wb3Q7IHRoZW4gXAorCSAgICBzZWQgLWYgcmVtb3ZlLXBvdGNkYXRlLnNlZCA8ICQoc3JjZGlyKS8kKERPTUFJTikucG90ID4gJChET01BSU4pLjFwbyAmJiBcCisJICAgIHNlZCAtZiByZW1vdmUtcG90Y2RhdGUuc2VkIDwgJChET01BSU4pLnBvID4gJChET01BSU4pLjJwbyAmJiBcCisJICAgIGlmIGNtcCAkKERPTUFJTikuMXBvICQoRE9NQUlOKS4ycG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICAgICBybSAtZiAkKERPTUFJTikuMXBvICQoRE9NQUlOKS4ycG8gJChET01BSU4pLnBvOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHJtIC1mICQoRE9NQUlOKS4xcG8gJChET01BSU4pLjJwbyAkKHNyY2RpcikvJChET01BSU4pLnBvdCAmJiBcCisJICAgICAgbXYgJChET01BSU4pLnBvICQoc3JjZGlyKS8kKERPTUFJTikucG90OyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgbXYgJChET01BSU4pLnBvICQoc3JjZGlyKS8kKERPTUFJTikucG90OyBcCisJICBmaTsgXAorCX0KKworIyBUaGlzIHJ1bGUgaGFzIG5vIGRlcGVuZGVuY2llczogd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgJChET01BSU4pLnBvdCBhdAorIyBldmVyeSAibWFrZSIgaW52b2NhdGlvbiwgb25seSBjcmVhdGUgaXQgd2hlbiBpdCBpcyBtaXNzaW5nLgorIyBPbmx5ICJtYWtlICQoRE9NQUlOKS5wb3QtdXBkYXRlIiBvciAibWFrZSBkaXN0IiB3aWxsIGZvcmNlIGFuIHVwZGF0ZS4KKyQoc3JjZGlyKS8kKERPTUFJTikucG90OgorCSQoTUFLRSkgJChET01BSU4pLnBvdC11cGRhdGUKKworIyBUaGlzIHRhcmdldCByZWJ1aWxkcyBhIFBPIGZpbGUgaWYgJChET01BSU4pLnBvdCBoYXMgY2hhbmdlZC4KKyMgTm90ZSB0aGF0IGEgUE8gZmlsZSBpcyBub3QgdG91Y2hlZCBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZC4KKyQoUE9GSUxFUyk6ICQoc3JjZGlyKS8kKERPTUFJTikucG90CisJQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MsLiovLCwnIC1lICdzL1wucG8kJC8vJ2A7IFwKKwlpZiB0ZXN0IC1mICIkKHNyY2RpcikvJCR7bGFuZ30ucG8iOyB0aGVuIFwKKwkgIHRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAorCSAgZWNobyAiJCR7Y2RjbWR9JChNU0dNRVJHRV9VUERBVEUpICQke2xhbmd9LnBvICQoRE9NQUlOKS5wb3QiOyBcCisJICBjZCAkKHNyY2RpcikgJiYgJChNU0dNRVJHRV9VUERBVEUpICQke2xhbmd9LnBvICQoRE9NQUlOKS5wb3Q7IFwKKwllbHNlIFwKKwkgICQoTUFLRSkgJCR7bGFuZ30ucG8tY3JlYXRlOyBcCisJZmkKKworCitpbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCitpbnN0YWxsLWV4ZWM6CitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCisJICBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUy5jb21tb24pIE1ha2V2YXJzLnRlbXBsYXRlOyBkbyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlIFwKKwkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwkgIGZvciBmaWxlIGluIE1ha2V2YXJzOyBkbyBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQoraW5zdGFsbC1kYXRhLW5vOiBhbGwKK2luc3RhbGwtZGF0YS15ZXM6IGFsbAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGF0YWRpcikKKwlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgLWUgJ3MvXC5nbW8kJC8vJ2A7IFwKKwkgIGRpcj0kKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkJGRpcjsgXAorCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiByZWFsY2F0PSQkY2F0OyBlbHNlIHJlYWxjYXQ9JChzcmNkaXIpLyQkY2F0OyBmaTsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkcmVhbGNhdCAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vOyBcCisJICBlY2hvICJpbnN0YWxsaW5nICQkcmVhbGNhdCBhcyAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vIjsgXAorCSAgZm9yIGxjIGluICcnICQoRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMpOyBkbyBcCisJICAgIGlmIHRlc3QgLW4gIiQkbGMiOyB0aGVuIFwKKwkgICAgICBpZiAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcgJiYgTENfQUxMPUMgbHMgLWwgLWQgJCRsYyAyPi9kZXYvbnVsbCkgfCBncmVwICcgLT4gJyA+L2Rldi9udWxsOyB0aGVuIFwKKwkgICAgICAgIGxpbms9YGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgfCBzZWQgLWUgJ3MvXi4qIC0+IC8vJ2A7IFwKKwkgICAgICAgIG12ICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKKwkgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgIChjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZCAmJiBcCisJICAgICAgICAgZm9yIGZpbGUgaW4gKjsgZG8gXAorCSAgICAgICAgICAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gXAorCSAgICAgICAgICAgICBsbiAtcyAuLi8kJGxpbmsvJCRmaWxlICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJCRmaWxlOyBcCisJICAgICAgICAgICBmaTsgXAorCSAgICAgICAgIGRvbmUpOyBcCisJICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZDsgXAorCSAgICAgIGVsc2UgXAorCSAgICAgICAgaWYgdGVzdCAtZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyB0aGVuIFwKKwkgICAgICAgICAgOjsgXAorCSAgICAgICAgZWxzZSBcCisJICAgICAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgICAgbWtkaXIgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAorCSAgICAgICAgZmk7IFwKKwkgICAgICBmaTsgXAorCSAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vOyBcCisJICAgICAgbG4gLXMgLi4vTENfTUVTU0FHRVMvJChET01BSU4pLm1vICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgICBsbiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKERPTUFJTikubW8gJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8gMj4vZGV2L251bGwgfHwgXAorCSAgICAgIGNwIC1wICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoRE9NQUlOKS5tbyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQoRE9NQUlOKS5tbzsgXAorCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJCRyZWFsY2F0IGxpbmsgYXMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8iOyBcCisJICAgIGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1leGVjIGluc3RhbGxkaXJzLWRhdGEKK2luc3RhbGxkaXJzLWV4ZWM6CitpbnN0YWxsZGlycy1kYXRhOiBpbnN0YWxsZGlycy1kYXRhLUBVU0VfTkxTQAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK2luc3RhbGxkaXJzLWRhdGEtbm86CitpbnN0YWxsZGlycy1kYXRhLXllczoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRhdGFkaXIpCisJQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCisJICBkaXI9JChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJCRkaXI7IFwKKwkgIGZvciBsYyBpbiAnJyAkKEVYVFJBX0xPQ0FMRV9DQVRFR09SSUVTKTsgZG8gXAorCSAgICBpZiB0ZXN0IC1uICIkJGxjIjsgdGhlbiBcCisJICAgICAgaWYgKGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgMj4vZGV2L251bGwpIHwgZ3JlcCAnIC0+ICcgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgICAgICBsaW5rPWBjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZyAmJiBMQ19BTEw9QyBscyAtbCAtZCAkJGxjIHwgc2VkIC1lICdzL14uKiAtPiAvLydgOyBcCisJICAgICAgICBtdiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkOyBcCisJICAgICAgICBta2RpciAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCisJICAgICAgICAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQgJiYgXAorCSAgICAgICAgIGZvciBmaWxlIGluICo7IGRvIFwKKwkgICAgICAgICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIFwKKwkgICAgICAgICAgICAgbG4gLXMgLi4vJCRsaW5rLyQkZmlsZSAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQkZmlsZTsgXAorCSAgICAgICAgICAgZmk7IFwKKwkgICAgICAgICBkb25lKTsgXAorCSAgICAgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKKwkgICAgICBlbHNlIFwKKwkgICAgICAgIGlmIHRlc3QgLWQgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgdGhlbiBcCisJICAgICAgICAgIDo7IFwKKwkgICAgICAgIGVsc2UgXAorCSAgICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCisJICAgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgIGZpOyBcCisJICAgICAgZmk7IFwKKwkgICAgZmk7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKwordW5pbnN0YWxsOiB1bmluc3RhbGwtZXhlYyB1bmluc3RhbGwtZGF0YQordW5pbnN0YWxsLWV4ZWM6Cit1bmluc3RhbGwtZGF0YTogdW5pbnN0YWxsLWRhdGEtQFVTRV9OTFNACisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAorCSAgZm9yIGZpbGUgaW4gJChESVNURklMRVMuY29tbW9uKSBNYWtldmFycy50ZW1wbGF0ZTsgZG8gXAorCSAgICBybSAtZiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK3VuaW5zdGFsbC1kYXRhLW5vOgordW5pbnN0YWxsLWRhdGEteWVzOgorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCisJICBmb3IgbGMgaW4gTENfTUVTU0FHRVMgJChFWFRSQV9MT0NBTEVfQ0FURUdPUklFUyk7IGRvIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW87IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKK2NoZWNrOiBhbGwKKworaW5mbyBkdmkgcHMgcGRmIGh0bWwgdGFncyBUQUdTIGN0YWdzIENUQUdTIElEOgorCittb3N0bHljbGVhbjoKKwlybSAtZiByZW1vdmUtcG90Y2RhdGUuc2VkCisJcm0gLWYgc3RhbXAtcG9UCisJcm0gLWYgY29yZSBjb3JlLiogJChET01BSU4pLnBvICQoRE9NQUlOKS4xcG8gJChET01BSU4pLjJwbyAqLm5ldy5wbworCXJtIC1mciAqLm8KKworY2xlYW46IG1vc3RseWNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vCisKK21haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCXJtIC1mIHN0YW1wLXBvICQoR01PRklMRVMpCisKK2Rpc3RkaXIgPSAkKHRvcF9idWlsZGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQorZGlzdCBkaXN0ZGlyOgorCSQoTUFLRSkgdXBkYXRlLXBvCisJQCQoTUFLRSkgZGlzdDIKKyMgVGhpcyBpcyBhIHNlcGFyYXRlIHRhcmdldCBiZWNhdXNlICd1cGRhdGUtcG8nIG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlLgorZGlzdDI6ICQoRElTVEZJTEVTKQorCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAorCSAgZGlzdHM9IiQkZGlzdHMgTWFrZXZhcnMudGVtcGxhdGUiOyBcCisJZmk7IFwKKwlpZiB0ZXN0IC1mICQoc3JjZGlyKS9DaGFuZ2VMb2c7IHRoZW4gXAorCSAgZGlzdHM9IiQkZGlzdHMgQ2hhbmdlTG9nIjsgXAorCWZpOyBcCisJZm9yIGkgaW4gMCAxIDIgMyA0IDUgNiA3IDggOTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvQ2hhbmdlTG9nLiQkaTsgdGhlbiBcCisJICAgIGRpc3RzPSIkJGRpc3RzIENoYW5nZUxvZy4kJGkiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0IC1mICQoc3JjZGlyKS9MSU5HVUFTOyB0aGVuIGRpc3RzPSIkJGRpc3RzIExJTkdVQVMiOyBmaTsgXAorCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXAgJCRmaWxlICQoZGlzdGRpcik7IFwKKwkgIGVsc2UgXAorCSAgICBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKKwkgIGZpOyBcCisJZG9uZQorCit1cGRhdGUtcG86IE1ha2VmaWxlCisJJChNQUtFKSAkKERPTUFJTikucG90LXVwZGF0ZQorCXRlc3QgLXogIiQoVVBEQVRFUE9GSUxFUykiIHx8ICQoTUFLRSkgJChVUERBVEVQT0ZJTEVTKQorCSQoTUFLRSkgdXBkYXRlLWdtbworCisjIEdlbmVyYWwgcnVsZSBmb3IgY3JlYXRpbmcgUE8gZmlsZXMuCisKKy5ub3AucG8tY3JlYXRlOgorCUBsYW5nPWBlY2hvICRAIHwgc2VkIC1lICdzL1wucG8tY3JlYXRlJCQvLydgOyBcCisJZWNobyAiRmlsZSAkJGxhbmcucG8gZG9lcyBub3QgZXhpc3QuIElmIHlvdSBhcmUgYSB0cmFuc2xhdG9yLCB5b3UgY2FuIGNyZWF0ZSBpdCB0aHJvdWdoICdtc2dpbml0Jy4iIDE+JjI7IFwKKwlleGl0IDEKKworIyBHZW5lcmFsIHJ1bGUgZm9yIHVwZGF0aW5nIFBPIGZpbGVzLgorCisubm9wLnBvLXVwZGF0ZToKKwlAbGFuZz1gZWNobyAkQCB8IHNlZCAtZSAncy9cLnBvLXVwZGF0ZSQkLy8nYDsgXAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgZmk7IFwKKwl0bXBkaXI9YHB3ZGA7IFwKKwllY2hvICIkJGxhbmc6IjsgXAorCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAorCWVjaG8gIiQke2NkY21kfSQoTVNHTUVSR0UpICQkbGFuZy5wbyAkKERPTUFJTikucG90IC1vICQkbGFuZy5uZXcucG8iOyBcCisJY2QgJChzcmNkaXIpOyBcCisJaWYgJChNU0dNRVJHRSkgJCRsYW5nLnBvICQoRE9NQUlOKS5wb3QgLW8gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgdGhlbiBcCisJICBpZiBjbXAgJCRsYW5nLnBvICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAorCSAgZWxzZSBcCisJICAgIGlmIG12IC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gJCRsYW5nLnBvOyB0aGVuIFwKKwkgICAgICA6OyBcCisJICAgIGVsc2UgXAorCSAgICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGxhbmcucG8gZmFpbGVkOiBjYW5ub3QgbW92ZSAkJHRtcGRpci8kJGxhbmcubmV3LnBvIHRvICQkbGFuZy5wbyIgMT4mMjsgXAorCSAgICAgIGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwllbHNlIFwKKwkgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGxhbmcucG8gZmFpbGVkISIgMT4mMjsgXAorCSAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAorCWZpCisKKyQoRFVNTVlQT0ZJTEVTKToKKwordXBkYXRlLWdtbzogTWFrZWZpbGUgJChHTU9GSUxFUykKKwlAOgorCitNYWtlZmlsZTogTWFrZWZpbGUuaW4uaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgQFBPTUFLRUZJTEVERVBTQAorCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRALmluIENPTkZJR19IRUFERVJTPSBcCisJICAgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCitmb3JjZToKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvdW5peC9wby9NYWtldmFycyBiL3VuaXgvcG8vTWFrZXZhcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1OGE3NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvcG8vTWFrZXZhcnMKQEAgLTAsMCArMSw0MSBAQAorIyBNYWtlZmlsZSB2YXJpYWJsZXMgZm9yIFBPIGRpcmVjdG9yeSBpbiBhbnkgcGFja2FnZSB1c2luZyBHTlUgZ2V0dGV4dC4KKworIyBVc3VhbGx5IHRoZSBtZXNzYWdlIGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgcGFja2FnZSBuYW1lLgorRE9NQUlOID0gJChQQUNLQUdFKQorCisjIFRoZXNlIHR3byB2YXJpYWJsZXMgZGVwZW5kIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGRpcmVjdG9yeS4KK3N1YmRpciA9IHBvCit0b3BfYnVpbGRkaXIgPSAuLgorCisjIFRoZXNlIG9wdGlvbnMgZ2V0IHBhc3NlZCB0byB4Z2V0dGV4dC4KK1hHRVRURVhUX09QVElPTlMgPSAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gLS1uby1sb2NhdGlvbgorCisjIFRoaXMgaXMgdGhlIGNvcHlyaWdodCBob2xkZXIgdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGhlYWRlciBvZiB0aGUKKyMgJChET01BSU4pLnBvdCBmaWxlLiAgU2V0IHRoaXMgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHN1cnJvdW5kaW5nCisjIHBhY2thZ2UuICAoTm90ZSB0aGF0IHRoZSBtc2dzdHIgc3RyaW5ncywgZXh0cmFjdGVkIGZyb20gdGhlIHBhY2thZ2UncworIyBzb3VyY2VzLCBiZWxvbmcgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHBhY2thZ2UuKSAgVHJhbnNsYXRvcnMgYXJlCisjIGV4cGVjdGVkIHRvIHRyYW5zZmVyIHRoZSBjb3B5cmlnaHQgZm9yIHRoZWlyIHRyYW5zbGF0aW9ucyB0byB0aGlzIHBlcnNvbgorIyBvciBlbnRpdHksIG9yIHRvIGRpc2NsYWltIHRoZWlyIGNvcHlyaWdodC4gIFRoZSBlbXB0eSBzdHJpbmcgc3RhbmRzIGZvcgorIyB0aGUgcHVibGljIGRvbWFpbjsgaW4gdGhpcyBjYXNlIHRoZSB0cmFuc2xhdG9ycyBhcmUgZXhwZWN0ZWQgdG8gZGlzY2xhaW0KKyMgdGhlaXIgY29weXJpZ2h0LgorQ09QWVJJR0hUX0hPTERFUiA9IFJlYWxWTkMgTHRkLCBDb25zdGFudGluIEthcGxpbnNreSwgUGV0ZXIgQXN0cmFuZCwgQ2VuZGlvIEFCCisKKyMgVGhpcyBpcyB0aGUgZW1haWwgYWRkcmVzcyBvciBVUkwgdG8gd2hpY2ggdGhlIHRyYW5zbGF0b3JzIHNoYWxsIHJlcG9ydAorIyBidWdzIGluIHRoZSB1bnRyYW5zbGF0ZWQgc3RyaW5nczoKKyMgLSBTdHJpbmdzIHdoaWNoIGFyZSBub3QgZW50aXJlIHNlbnRlbmNlcywgc2VlIHRoZSBtYWludGFpbmVyIGd1aWRlbGluZXMKKyMgICBpbiB0aGUgR05VIGdldHRleHQgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAnUHJlcGFyaW5nIFN0cmluZ3MnLgorIyAtIFN0cmluZ3Mgd2hpY2ggdXNlIHVuY2xlYXIgdGVybXMgb3IgcmVxdWlyZSBhZGRpdGlvbmFsIGNvbnRleHQgdG8gYmUKKyMgICB1bmRlcnN0b29kLgorIyAtIFN0cmluZ3Mgd2hpY2ggbWFrZSBpbnZhbGlkIGFzc3VtcHRpb25zIGFib3V0IG5vdGF0aW9uIG9mIGRhdGUsIHRpbWUgb3IKKyMgICBtb25leS4KKyMgLSBQbHVyYWxpc2F0aW9uIHByb2JsZW1zLgorIyAtIEluY29ycmVjdCBFbmdsaXNoIHNwZWxsaW5nLgorIyAtIEluY29ycmVjdCBmb3JtYXR0aW5nLgorIyBJdCBjYW4gYmUgeW91ciBlbWFpbCBhZGRyZXNzLCBvciBhIG1haWxpbmcgbGlzdCBhZGRyZXNzIHdoZXJlIHRyYW5zbGF0b3JzCisjIGNhbiB3cml0ZSB0byB3aXRob3V0IGJlaW5nIHN1YnNjcmliZWQsIG9yIHRoZSBVUkwgb2YgYSB3ZWIgcGFnZSB0aHJvdWdoCisjIHdoaWNoIHRoZSB0cmFuc2xhdG9ycyBjYW4gY29udGFjdCB5b3UuCitNU0dJRF9CVUdTX0FERFJFU1MgPSBkZXZ0ZWFtQHRpZ2h0dm5jLmNvbQorCisjIFRoaXMgaXMgdGhlIGxpc3Qgb2YgbG9jYWxlIGNhdGVnb3JpZXMsIGJleW9uZCBMQ19NRVNTQUdFUywgZm9yIHdoaWNoIHRoZQorIyBtZXNzYWdlIGNhdGFsb2dzIHNoYWxsIGJlIHVzZWQuICBJdCBpcyB1c3VhbGx5IGVtcHR5LgorRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMgPQpkaWZmIC0tZ2l0IGEvdW5peC9wby9QT1RGSUxFUy5pbiBiL3VuaXgvcG8vUE9URklMRVMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3ZjhkNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvcG8vUE9URklMRVMuaW4KQEAgLTAsMCArMSwxMiBAQAorIyB2bmN2aWV3ZXJfdW5peAordm5jdmlld2VyX3VuaXgvQWJvdXREaWFsb2cuaAordm5jdmlld2VyX3VuaXgvQ0Nvbm4uY3h4Cit2bmN2aWV3ZXJfdW5peC9DQ29ubi5oCit2bmN2aWV3ZXJfdW5peC9EZXNrdG9wV2luZG93LmN4eAordm5jdmlld2VyX3VuaXgvRGVza3RvcFdpbmRvdy5oCit2bmN2aWV3ZXJfdW5peC9JbmZvRGlhbG9nLmgKK3ZuY3ZpZXdlcl91bml4L09wdGlvbnNEaWFsb2cuaAordm5jdmlld2VyX3VuaXgvcGFyYW1ldGVycy5oCit2bmN2aWV3ZXJfdW5peC9QYXNzd2REaWFsb2cuaAordm5jdmlld2VyX3VuaXgvU2VydmVyRGlhbG9nLmgKK3ZuY3ZpZXdlcl91bml4L3ZuY3ZpZXdlci5jeHgKZGlmZiAtLWdpdCBhL3VuaXgvcG8vUnVsZXMtcXVvdCBiL3VuaXgvcG8vUnVsZXMtcXVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJhOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9wby9SdWxlcy1xdW90CkBAIC0wLDAgKzEsNDcgQEAKKyMgU3BlY2lhbCBNYWtlZmlsZSBydWxlcyBmb3IgRW5nbGlzaCBtZXNzYWdlIGNhdGFsb2dzIHdpdGggcXVvdGF0aW9uIG1hcmtzLgorCitESVNURklMRVMuY29tbW9uLmV4dHJhMSA9IHF1b3Quc2VkIGJvbGRxdW90LnNlZCBlbkBxdW90LmhlYWRlciBlbkBib2xkcXVvdC5oZWFkZXIgaW5zZXJ0LWhlYWRlci5zaW4gUnVsZXMtcXVvdAorCisuU1VGRklYRVM6IC5pbnNlcnQtaGVhZGVyIC5wby11cGRhdGUtZW4KKworZW5AcXVvdC5wby1jcmVhdGU6CisJJChNQUtFKSBlbkBxdW90LnBvLXVwZGF0ZQorZW5AYm9sZHF1b3QucG8tY3JlYXRlOgorCSQoTUFLRSkgZW5AYm9sZHF1b3QucG8tdXBkYXRlCisKK2VuQHF1b3QucG8tdXBkYXRlOiBlbkBxdW90LnBvLXVwZGF0ZS1lbgorZW5AYm9sZHF1b3QucG8tdXBkYXRlOiBlbkBib2xkcXVvdC5wby11cGRhdGUtZW4KKworLmluc2VydC1oZWFkZXIucG8tdXBkYXRlLWVuOgorCUBsYW5nPWBlY2hvICRAIHwgc2VkIC1lICdzL1wucG8tdXBkYXRlLWVuJCQvLydgOyBcCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBHRVRURVhUTElCRElSPWBjZCAkKHRvcF9zcmNkaXIpL3NyYyAmJiBwd2RgOyBleHBvcnQgR0VUVEVYVExJQkRJUjsgZmk7IFwKKwl0bXBkaXI9YHB3ZGA7IFwKKwllY2hvICIkJGxhbmc6IjsgXAorCWxsPWBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy9ALiovLydgOyBcCisJTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IFwKKwljZCAkKHNyY2Rpcik7IFwKKwlpZiAkKE1TR0lOSVQpIC1pICQoRE9NQUlOKS5wb3QgLS1uby10cmFuc2xhdG9yIC1sICQkbGwgLW8gLSAyPi9kZXYvbnVsbCB8IHNlZCAtZiAkJHRtcGRpci8kJGxhbmcuaW5zZXJ0LWhlYWRlciB8ICQoTVNHQ09OVikgLXQgVVRGLTggfCAkKE1TR0ZJTFRFUikgc2VkIC1mIGBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy8uKkAvLydgLnNlZCAyPi9kZXYvbnVsbCA+ICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IHRoZW4gXAorCSAgaWYgY21wICQkbGFuZy5wbyAkJHRtcGRpci8kJGxhbmcubmV3LnBvID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICAgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwkgIGVsc2UgXAorCSAgICBpZiBtdiAtZiAkJHRtcGRpci8kJGxhbmcubmV3LnBvICQkbGFuZy5wbzsgdGhlbiBcCisJICAgICAgOjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBlY2hvICJjcmVhdGlvbiBvZiAkJGxhbmcucG8gZmFpbGVkOiBjYW5ub3QgbW92ZSAkJHRtcGRpci8kJGxhbmcubmV3LnBvIHRvICQkbGFuZy5wbyIgMT4mMjsgXAorCSAgICAgIGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwllbHNlIFwKKwkgIGVjaG8gImNyZWF0aW9uIG9mICQkbGFuZy5wbyBmYWlsZWQhIiAxPiYyOyBcCisJICBybSAtZiAkJHRtcGRpci8kJGxhbmcubmV3LnBvOyBcCisJZmkKKworZW5AcXVvdC5pbnNlcnQtaGVhZGVyOiBpbnNlcnQtaGVhZGVyLnNpbgorCXNlZCAtZSAnL14jL2QnIC1lICdzL0hFQURFUi9lbkBxdW90LmhlYWRlci9nJyAkKHNyY2RpcikvaW5zZXJ0LWhlYWRlci5zaW4gPiBlbkBxdW90Lmluc2VydC1oZWFkZXIKKworZW5AYm9sZHF1b3QuaW5zZXJ0LWhlYWRlcjogaW5zZXJ0LWhlYWRlci5zaW4KKwlzZWQgLWUgJy9eIy9kJyAtZSAncy9IRUFERVIvZW5AYm9sZHF1b3QuaGVhZGVyL2cnICQoc3JjZGlyKS9pbnNlcnQtaGVhZGVyLnNpbiA+IGVuQGJvbGRxdW90Lmluc2VydC1oZWFkZXIKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXF1b3QKK21vc3RseWNsZWFuLXF1b3Q6CisJcm0gLWYgKi5pbnNlcnQtaGVhZGVyCmRpZmYgLS1naXQgYS91bml4L3BvL2JvbGRxdW90LnNlZCBiL3VuaXgvcG8vYm9sZHF1b3Quc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTM3YWEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3BvL2JvbGRxdW90LnNlZApAQCAtMCwwICsxLDEwIEBACitzLyJcKFteIl0qXCkiL+KAnFwx4oCdL2cKK3MvYFwoW15gJ10qXCknL+KAmFwx4oCZL2cKK3MvICdcKFteYCddKlwpJyAvIOKAmFwx4oCZIC9nCitzLyAnXChbXmAnXSpcKSckLyDigJhcMeKAmS9nCitzL14nXChbXmAnXSpcKScgL+KAmFwx4oCZIC9nCitzL+KAnOKAnS8iIi9nCitzL+KAnC/igJwbWzFtL2cKK3Mv4oCdLxtbMG3igJ0vZworcy/igJgv4oCYG1sxbS9nCitzL+KAmS8bWzBt4oCZL2cKZGlmZiAtLWdpdCBhL3VuaXgvcG8vZGUucG8gYi91bml4L3BvL2RlLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTc0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3BvL2RlLnBvCkBAIC0wLDAgKzEsMTkxIEBACisjIEdlcm1hbiB0cmFuc2xhdGlvbnMgZm9yIHRpZ2h0dm5jIHBhY2thZ2UKKyMgRGV1dHNjaGUg3GJlcnNldHp1bmcgZvxyIGRhcyBUaWdodHZuYyBQYWtldAorIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVhbFZOQyBMdGQsIENvbnN0YW50aW4gS2FwbGluc2t5LCBQZXRlciBBc3RyYW5kLCBDZW5kaW8gQUIKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEtsYXVzIEZyYW5rZW4sIFN0cnVrdHVyUHVua3QKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIHRpZ2h0dm5jIHBhY2thZ2UuCisjIEtsYXVzIEZyYW5rZW4gPEtsYXVzLkZyYW5rZW5AU3RydWt0dXJQdW5rdC5kZT4sIDIwMDUuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiB0aWdodHZuYyAxLjUuMFxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBkZXZ0ZWFtQHRpZ2h0dm5jLmNvbVxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA1LTAzLTAxIDIwOjM3KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA1LTAzLTAxIDIwOjQxKzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEtsYXVzIEZyYW5rZW4gPEtsYXVzLkZyYW5rZW5AU3RydWt0dXJQdW5rdC5kZT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBHZXJtYW5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuICE9IDEpO1xuIgorCittc2dpZCAiQWJvdXQgVk5DIFZpZXdlciIKK21zZ3N0ciAi3GJlciBWTkMtVmlld2VyIgorCittc2dpZCAiVk5DIGF1dGhlbnRpY2F0aW9uIgorbXNnc3RyICJWTkMgQXV0aGVudGlmaXppZXJ1bmciCisKK21zZ2lkICJFeGl0IHZpZXdlciIKK21zZ3N0ciAiVmlld2VyIGJlZW5kZW4iCisKK21zZ2lkICJGdWxsIHNjcmVlbiIKK21zZ3N0ciAiVm9sbGJpbGQiCisKK21zZ2lkICJDdHJsIgorbXNnc3RyICJTdHJnIgorCittc2dpZCAiQWx0IgorbXNnc3RyICJBbHQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VuZCAlcyIKK21zZ3N0ciAiU2VuZGUgJXMiCisKK21zZ2lkICJTZW5kIEN0cmwtQWx0LURlbCIKK21zZ3N0ciAiU2VuZGUgU3RyZy1BbHQtRGVsIgorCittc2dpZCAiUmVmcmVzaCBzY3JlZW4iCittc2dzdHIgIkJpbGRzY2hpcm0gYXVmZnJpc2NoZW4iCisKK21zZ2lkICJOZXcgY29ubmVjdGlvbi4uLiIKK21zZ3N0ciAiTmV1ZSBWZXJiaW5kdW5nLi4uIgorCittc2dpZCAiT3B0aW9ucy4uLiIKK21zZ3N0ciAiT3B0aW9uZW4uLi4iCisKK21zZ2lkICJDb25uZWN0aW9uIGluZm8uLi4iCittc2dzdHIgIlZlcmJpbmR1bmdzaW5mb3JtYXRpb25lbi4uLiIKKworbXNnaWQgIkFib3V0IFZOQ3ZpZXdlci4uLiIKK21zZ3N0ciAi3GJlciBWTkMtVmlld2VyIgorCittc2dpZCAiRGlzbWlzcyBtZW51IgorbXNnc3RyICJNZW78IHZlcmxhc3NlbiIKKworbXNnaWQgIlZOQyBNZW51IgorbXNnc3RyICJWTkMtTWVu/CIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRGVza3RvcCBuYW1lOiAlLjgwc1xuIgorIkhvc3Q6ICUuODBzIHBvcnQ6ICVkXG4iCisiU2l6ZTogJWQgeCAlZFxuIgorIlBpeGVsIGZvcm1hdDogJXNcbiIKKyIoc2VydmVyIGRlZmF1bHQgJXMpXG4iCisiUmVxdWVzdGVkIGVuY29kaW5nOiAlc1xuIgorIkxhc3QgdXNlZCBlbmNvZGluZzogJXNcbiIKKyJMaW5lIHNwZWVkIGVzdGltYXRlOiAlZCBrYml0L3NcbiIKKyJQcm90b2NvbCB2ZXJzaW9uOiAlZC4lZFxuIgorIlNlY3VyaXR5IG1ldGhvZDogJXNcbiIKK21zZ3N0ciAiIgorIkRlc2t0b3BuYW1lOiAlLjgwc1xuIgorIkhvc3Q6ICUuODBzIHBvcnQ6ICVkXG4iCisiR3L232U6ICVkIHggJWRcbiIKKyJQaXhlbGZvcm1hdDogJXNcbiIKKyIoU2VydmVyIFN0YW5kYXJkICVzKVxuIgorImdld/xuc2NodGUgS29kaWVydW5nOiAlc1xuIgorImxldHp0ZSBiZW51dHp0ZSBLb2RpZXJ1bmc6ICVzXG4iCisiTGVpdHVuZ3NnZXNjaHdpbmRpZ2tlaXQgKGdlc2No5HR6dCk6ICVkIGtiaXQvc1xuIgorIlByb3Rva29sbHZlcnNpb246ICVkLiVkXG4iCisiU2ljaGVyaGVpdHNtZXRob2RlOiAlc1xuIgorCittc2dpZCAiVk5DIGNvbm5lY3Rpb24gaW5mbyIKK21zZ3N0ciAiVk5DIFZlcmJpbmR1bmdzaW5mb3JtYXRpb24iCisKK21zZ2lkICJWTkMgVmlld2VyOiBDb25uZWN0aW9uIE9wdGlvbnMiCittc2dzdHIgIlZOQy1WaWV3ZXI6IFZlcmJpbmR1bmdzb3B0aW9uZW4iCisKK21zZ2lkICJFbmNvZGluZyBhbmQgQ29sb3IgTGV2ZWw6IgorbXNnc3RyICJLb2RpZXJ1bmcgdW5kIEZhcmJ0aWVmZToiCisKK21zZ2lkICJJbnB1dHM6IgorbXNnc3RyICJFaW5nYWJlbjoiCisKK21zZ2lkICJNaXNjOiIKK21zZ3N0ciAiRGl2ZXJzZXM6IgorCittc2dpZCAiQXV0byBzZWxlY3QiCittc2dzdHIgImF1dG9tYXRpc2NoZSBBdXN3YWhsIgorCittc2dpZCAiRnVsbCAoYWxsIGF2YWlsYWJsZSBjb2xvcnMpIgorbXNnc3RyICJWb2xsIChhbGxlIHZlcmb8Z2JhcmVuIEZhcmJlbikiCisKK21zZ2lkICJNZWRpdW0gKDI1NiBjb2xvcnMpIgorbXNnc3RyICJNaXR0ZWwgKDI1NiBGYXJiZW4pIgorCittc2dpZCAiTG93ICg2NCBjb2xvcnMpIgorbXNnc3RyICJHZXJpbmcgKDY0IEZhcmJlbikiCisKK21zZ2lkICJWZXJ5IGxvdyAoOCBjb2xvcnMpIgorbXNnc3RyICJTZWhyIGdlcmluZyAoOCBGYXJiZW4pIgorCittc2dpZCAiQ3VzdG9tIGNvbXByZXNzaW9uIGxldmVsOiIKK21zZ3N0ciAiaW5kaXZpZHVlbGxlciBLb21wcmVzc2lvbnNsZXZlbDoiCisKK21zZ2lkICJsZXZlbCAoMT1mYXN0LCA5PWJlc3QpIgorbXNnc3RyICJMZXZlbCAoMT1zY2huZWxsLCA5PWJlc3RlcikiCisKK21zZ2lkICJBbGxvdyBKUEVHIGNvbXByZXNzaW9uOiIKK21zZ3N0ciAiRXJsYXViZSBKUEVHLUtvbXByZXNzaW9uOiIKKworbXNnaWQgInF1YWxpdHkgKDE9cG9vciwgOT1iZXN0KSIKK21zZ3N0ciAiUXVhbGl05HQgKDA9c2NobGVjaHRlLCA5PWJlc3RlKSIKKworbXNnaWQgIlZpZXcgb25seSAoaWdub3JlIG1vdXNlICYga2V5Ym9hcmQpIgorbXNnc3RyICJudXIgQW5zaWNodCAoaWdub3JpZXJlIE1hdXMgdW5kIFRhc3RhdHVyKSIKKworbXNnaWQgIkFjY2VwdCBjbGlwYm9hcmQgZnJvbSBzZXJ2ZXIiCittc2dzdHIgIkFremVwdGllcmUgWndpc2NoZW5hYmxhZ2Ugdm9tIFNlcnZlciIKKworbXNnaWQgIlNlbmQgY2xpcGJvYXJkIHRvIHNlcnZlciIKK21zZ3N0ciAiU2VuZGUgWndpc2NoZW5hYmxhZ2UgenVtIFNlcnZlciIKKworbXNnaWQgIlNlbmQgcHJpbWFyeSBzZWxlY3Rpb24gJiBjdXQgYnVmZmVyIGFzIGNsaXBib2FyZCIKK21zZ3N0ciAiU2VuZGUgcHJpbWFyeSBzZWxlY3Rpb24gJiBjdXQgYnVmZmVyIGFscyBad2lzY2hlbmFibGFnZSIKKworbXNnaWQgIlNoYXJlZCAoZG9uJ3QgZGlzY29ubmVjdCBvdGhlciB2aWV3ZXJzKSIKK21zZ3N0ciAiR2VtZWluc2FtZXIgWnVncmlmZiAoYW5kZXJlIFZOQy1WaWV3ZXIgbmljaHQgdHJlbm5lbikiCisKK21zZ2lkICJGdWxsLXNjcmVlbiBtb2RlIgorbXNnc3RyICJWb2xsYmlsZC1Nb2R1cyIKKworbXNnaWQgIlJlbmRlciBjdXJzb3IgbG9jYWxseSIKK21zZ3N0ciAiWmVpZ2UgQ3Vyc29yIGxva2FsIgorCittc2dpZCAiU2hvdyBkb3Qgd2hlbiBubyBjdXJzb3IiCittc2dzdHIgIlplaWdlIFB1bmt0IHdlbm4ga2VpbiBDdXJzb3IiCisKK21zZ2lkICJPSyIKK21zZ3N0ciAiT2siCisKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIkFiYnJ1Y2giCisKK21zZ2lkICJVc2VybmFtZToiCittc2dzdHIgIkJlbnV0emVybmFtZToiCisKK21zZ2lkICJQYXNzd29yZDoiCittc2dzdHIgIlBhc3N3b3J0OiIKKworbXNnaWQgIlZOQyBWaWV3ZXI6IENvbm5lY3Rpb24gRGV0YWlscyIKK21zZ3N0ciAiVk5DLVZpZXdlcjogVmVyYmluZHVuZ3NkZXRhaWxzIgorCittc2dpZCAiVk5DIHNlcnZlcjoiCittc2dzdHIgIlZOQy1TZXJ2ZXI6IgorCittc2dpZCAiQWJvdXQuLi4iCittc2dzdHIgItxiZXIuLi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlRpZ2h0Vk5DIHZpZXdlciBmb3IgWCB2ZXJzaW9uIDQuMCAtIGJ1aWx0ICVzXG4iCisiQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgUmVhbFZOQyBMdGQuXG4iCisiQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgQ29uc3RhbnRpbiBLYXBsaW5za3lcbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBQZXRlciBBc3RyYW5kLCBDZW5kaW8gQUJcbiIKKyJTZWUgaHR0cDovL3d3dy50aWdodHZuYy5jb20gZm9yIGluZm9ybWF0aW9uIG9uIFRpZ2h0Vk5DLiIKK21zZ3N0ciAiIgorIlRpZ2h0Vk5DLVZpZXdlciBm/HIgWCB2ZXJzaW9uIDQuMCAtIGdlYmF1dCAlc1xuIgorIkNvcHlyaWdodCAoQykgMjAwMi0yMDA0IFJlYWxWTkMgTHRkLlxuIgorIkNvcHlyaWdodCAoQykgMjAwMC0yMDA0IENvbnN0YW50aW4gS2FwbGluc2t5LlxuIgorIkNvcHlyaWdodCAoQykgMjAwNC0yMDA1IFBldGVyIEFzdHJhbmQsIENlbmRpbyBBQlxuIgorIkNvcHlyaWdodCAoQykgMjAwNSBLbGF1cyBGcmFua2VuLCBTdHJ1a3R1clB1bmt0XG4iCisiU2llaGUgaHR0cDovL3d3dy50aWdodHZuYy5jb20gZvxyIEluZm9ybWF0aW9uZW4g/GJlciBUaWdodFZOQy4iCmRpZmYgLS1naXQgYS91bml4L3BvL2VuQGJvbGRxdW90LmhlYWRlciBiL3VuaXgvcG8vZW5AYm9sZHF1b3QuaGVhZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGI2YTAKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3BvL2VuQGJvbGRxdW90LmhlYWRlcgpAQCAtMCwwICsxLDI1IEBACisjIEFsbCB0aGlzIGNhdGFsb2cgInRyYW5zbGF0ZXMiIGFyZSBxdW90YXRpb24gY2hhcmFjdGVycy4KKyMgVGhlIG1zZ2lkcyBtdXN0IGJlIEFTQ0lJIGFuZCB0aGVyZWZvcmUgY2Fubm90IGNvbnRhaW4gcmVhbCBxdW90YXRpb24KKyMgY2hhcmFjdGVycywgb25seSBzdWJzdGl0dXRlcyBsaWtlIGdyYXZlIGFjY2VudCAoMHg2MCksIGFwb3N0cm9waGUgKDB4MjcpCisjIGFuZCBkb3VibGUgcXVvdGUgKDB4MjIpLiBUaGVzZSBzdWJzdGl0dXRlcyBsb29rIHN0cmFuZ2U7IHNlZQorIyBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3F1b3Rlcy5odG1sCisjCisjIFRoaXMgY2F0YWxvZyB0cmFuc2xhdGVzIGdyYXZlIGFjY2VudCAoMHg2MCkgYW5kIGFwb3N0cm9waGUgKDB4MjcpIHRvCisjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkuCisjIEl0IGFsc28gdHJhbnNsYXRlcyBwYWlycyBvZiBhcG9zdHJvcGhlICgweDI3KSB0bworIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpCisjIGFuZCBwYWlycyBvZiBxdW90YXRpb24gbWFyayAoMHgyMikgdG8KKyMgbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxQykgYW5kIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyayAoVSsyMDFEKS4KKyMKKyMgV2hlbiBvdXRwdXQgdG8gYW4gVVRGLTggdGVybWluYWwsIHRoZSBxdW90YXRpb24gY2hhcmFjdGVycyBhcHBlYXIgcGVyZmVjdGx5LgorIyBXaGVuIG91dHB1dCB0byBhbiBJU08tODg1OS0xIHRlcm1pbmFsLCB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMgKGJ5IGljb252IGluIGdsaWJjIDIuMiBvciBuZXdlcikgb3IgdG8KKyMgZ3JhdmUvYWN1dGUgYWNjZW50IChieSBsaWJpY29udiksIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KKyMgV2hlbiBvdXRwdXQgdG8gYW4gQVNDSUkgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcywgYW5kIHRoZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byAweDIyLgorIworIyBUaGlzIGNhdGFsb2cgZnVydGhlcm1vcmUgZGlzcGxheXMgdGhlIHRleHQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIG1hcmtzIGluCisjIGJvbGQgZmFjZSwgYXNzdW1pbmcgdGhlIFZUMTAwL1hUZXJtIGVzY2FwZSBzZXF1ZW5jZXMuCisjCmRpZmYgLS1naXQgYS91bml4L3BvL2VuQHF1b3QuaGVhZGVyIGIvdW5peC9wby9lbkBxdW90LmhlYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY0N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9wby9lbkBxdW90LmhlYWRlcgpAQCAtMCwwICsxLDIyIEBACisjIEFsbCB0aGlzIGNhdGFsb2cgInRyYW5zbGF0ZXMiIGFyZSBxdW90YXRpb24gY2hhcmFjdGVycy4KKyMgVGhlIG1zZ2lkcyBtdXN0IGJlIEFTQ0lJIGFuZCB0aGVyZWZvcmUgY2Fubm90IGNvbnRhaW4gcmVhbCBxdW90YXRpb24KKyMgY2hhcmFjdGVycywgb25seSBzdWJzdGl0dXRlcyBsaWtlIGdyYXZlIGFjY2VudCAoMHg2MCksIGFwb3N0cm9waGUgKDB4MjcpCisjIGFuZCBkb3VibGUgcXVvdGUgKDB4MjIpLiBUaGVzZSBzdWJzdGl0dXRlcyBsb29rIHN0cmFuZ2U7IHNlZQorIyBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3F1b3Rlcy5odG1sCisjCisjIFRoaXMgY2F0YWxvZyB0cmFuc2xhdGVzIGdyYXZlIGFjY2VudCAoMHg2MCkgYW5kIGFwb3N0cm9waGUgKDB4MjcpIHRvCisjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkuCisjIEl0IGFsc28gdHJhbnNsYXRlcyBwYWlycyBvZiBhcG9zdHJvcGhlICgweDI3KSB0bworIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpCisjIGFuZCBwYWlycyBvZiBxdW90YXRpb24gbWFyayAoMHgyMikgdG8KKyMgbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxQykgYW5kIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyayAoVSsyMDFEKS4KKyMKKyMgV2hlbiBvdXRwdXQgdG8gYW4gVVRGLTggdGVybWluYWwsIHRoZSBxdW90YXRpb24gY2hhcmFjdGVycyBhcHBlYXIgcGVyZmVjdGx5LgorIyBXaGVuIG91dHB1dCB0byBhbiBJU08tODg1OS0xIHRlcm1pbmFsLCB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMgKGJ5IGljb252IGluIGdsaWJjIDIuMiBvciBuZXdlcikgb3IgdG8KKyMgZ3JhdmUvYWN1dGUgYWNjZW50IChieSBsaWJpY29udiksIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KKyMgV2hlbiBvdXRwdXQgdG8gYW4gQVNDSUkgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcywgYW5kIHRoZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byAweDIyLgorIwpkaWZmIC0tZ2l0IGEvdW5peC9wby9pbnNlcnQtaGVhZGVyLnNpbiBiL3VuaXgvcG8vaW5zZXJ0LWhlYWRlci5zaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2ZGUwMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvcG8vaW5zZXJ0LWhlYWRlci5zaW4KQEAgLTAsMCArMSwyMyBAQAorIyBTZWQgc2NyaXB0IHRoYXQgaW5zZXJ0cyB0aGUgZmlsZSBjYWxsZWQgSEVBREVSIGJlZm9yZSB0aGUgaGVhZGVyIGVudHJ5LgorIworIyBBdCBlYWNoIG9jY3VycmVuY2Ugb2YgYSBsaW5lIHN0YXJ0aW5nIHdpdGggIm1zZ2lkICIsIHdlIGV4ZWN1dGUgdGhlIGZvbGxvd2luZworIyBjb21tYW5kcy4gQXQgdGhlIGZpcnN0IG9jY3VycmVuY2UsIGluc2VydCB0aGUgZmlsZS4gQXQgdGhlIGZvbGxvd2luZworIyBvY2N1cnJlbmNlcywgZG8gbm90aGluZy4gVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGUgZm9sbG93aW5nCisjIG9jY3VycmVuY2VzIGlzIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIGhvbGQgc3BhY2UuCisvXm1zZ2lkIC97Cit4CisjIFRlc3QgaWYgdGhlIGhvbGQgc3BhY2UgaXMgZW1wdHkuCitzL20vbS8KK3RhCisjIFllcyBpdCB3YXMgZW1wdHkuIEZpcnN0IG9jY3VycmVuY2UuIFJlYWQgdGhlIGZpbGUuCityIEhFQURFUgorIyBPdXRwdXQgdGhlIGZpbGUncyBjb250ZW50cyBieSByZWFkaW5nIHRoZSBuZXh0IGxpbmUuIEJ1dCBkb24ndCBsb3NlIHRoZQorIyBjdXJyZW50IGxpbmUgd2hpbGUgZG9pbmcgdGhpcy4KK2cKK04KK2JiCis6YQorIyBUaGUgaG9sZCBzcGFjZSB3YXMgbm9uZW1wdHkuIEZvbGxvd2luZyBvY2N1cnJlbmNlcy4gRG8gbm90aGluZy4KK3gKKzpiCit9CmRpZmYgLS1naXQgYS91bml4L3BvL3F1b3Quc2VkIGIvdW5peC9wby9xdW90LnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTIyYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9wby9xdW90LnNlZApAQCAtMCwwICsxLDYgQEAKK3MvIlwoW14iXSpcKSIv4oCcXDHigJ0vZworcy9gXChbXmAnXSpcKScv4oCYXDHigJkvZworcy8gJ1woW15gJ10qXCknIC8g4oCYXDHigJkgL2cKK3MvICdcKFteYCddKlwpJyQvIOKAmFwx4oCZL2cKK3MvXidcKFteYCddKlwpJyAv4oCYXDHigJkgL2cKK3Mv4oCc4oCdLyIiL2cKZGlmZiAtLWdpdCBhL3VuaXgvcG8vcmVtb3ZlLXBvdGNkYXRlLnNpbiBiL3VuaXgvcG8vcmVtb3ZlLXBvdGNkYXRlLnNpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDM2YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9wby9yZW1vdmUtcG90Y2RhdGUuc2luCkBAIC0wLDAgKzEsMTkgQEAKKyMgU2VkIHNjcmlwdCB0aGF0IHJlbW92ZSB0aGUgUE9ULUNyZWF0aW9uLURhdGUgbGluZSBpbiB0aGUgaGVhZGVyIGVudHJ5CisjIGZyb20gYSBQT1QgZmlsZS4KKyMKKyMgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGUgZm9sbG93aW5nIG9jY3VycmVuY2VzIG9mIHRoZQorIyBwYXR0ZXJuIGlzIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIGhvbGQgc3BhY2UuCisvXiJQT1QtQ3JlYXRpb24tRGF0ZTogLioiJC97Cit4CisjIFRlc3QgaWYgdGhlIGhvbGQgc3BhY2UgaXMgZW1wdHkuCitzL1AvUC8KK3RhCisjIFllcyBpdCB3YXMgZW1wdHkuIEZpcnN0IG9jY3VycmVuY2UuIFJlbW92ZSB0aGUgbGluZS4KK2cKK2QKK2JiCis6YQorIyBUaGUgaG9sZCBzcGFjZSB3YXMgbm9uZW1wdHkuIEZvbGxvd2luZyBvY2N1cnJlbmNlcy4gRG8gbm90aGluZy4KK3gKKzpiCit9CmRpZmYgLS1naXQgYS91bml4L3BvL3J1LnBvIGIvdW5peC9wby9ydS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhiZjgwCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9wby9ydS5wbwpAQCAtMCwwICsxLDE4OCBAQAorIyBSdXNzaWFuIHRyYW5zbGF0aW9uIGZvciB0aWdodHZuYyBwYWNrYWdlCisjIJDj4eGqqKkgr6XgpaKupCCvoKql4qAgdGlnaHR2bmMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IFJlYWxWTkMgTHRkLCBDb25zdGFudGluIEthcGxpbnNreSwgUGV0ZXIgQXN0cmFuZCwgQ2VuZGlvIEFCCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSB0aWdodHZuYyBwYWNrYWdlLgorIyBDb25zdGFudGluIEthcGxpbnNreSA8Y29uc3RAdGlnaHR2bmMuY29tPiwgMjAwNi4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IHRpZ2h0dm5jIDEuNS4wXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGRldnRlYW1AdGlnaHR2bmMuY29tXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDUtMDMtMDEgMjA6MzcrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDYtMDQtMTMgMjA6MTMrMDcwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQ29uc3RhbnRpbiBLYXBsaW5za3kgPGNvbnN0QHRpZ2h0dm5jLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBSdXNzaWFuXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9S09JOC1SXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCittc2dpZCAiQWJvdXQgVk5DIFZpZXdlciIKK21zZ3N0ciAijiBWTkMgVmlld2VyIgorCittc2dpZCAiVk5DIGF1dGhlbnRpY2F0aW9uIgorbXNnc3RyICKA4+KlreKo5KiqoOao7yBWTkMiCisKK21zZ2lkICJFeGl0IHZpZXdlciIKK21zZ3N0ciAiguvlrqQiCisKK21zZ2lkICJGdWxsIHNjcmVlbiIKK21zZ3N0ciAij66rra7tquCgra3rqSDgpaaorCIKKworbXNnaWQgIkN0cmwiCittc2dzdHIgIkN0cmwiCisKK21zZ2lkICJBbHQiCittc2dzdHIgIkFsdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJTZW5kICVzIgorbXNnc3RyICKPruGroOLsICVzIgorCittc2dpZCAiU2VuZCBDdHJsLUFsdC1EZWwiCittc2dzdHIgIo+u4aug4uwgQ3RybC1BbHQtRGVsIgorCittc2dpZCAiUmVmcmVzaCBzY3JlZW4iCittc2dzdHIgIo6hra6iqOLsIO2q4KCtIgorCittc2dpZCAiTmV3IGNvbm5lY3Rpb24uLi4iCittc2dzdHIgIo2uoq6lIOGupaSoraWtqKUuLi4iCisKK21zZ2lkICJPcHRpb25zLi4uIgorbXNnc3RyICKPoOCgrKXi4OsuLi4iCisKK21zZ2lkICJDb25uZWN0aW9uIGluZm8uLi4iCittc2dzdHIgIoit5K7grKDmqO8griDhrqWkqK2lraioLi4uIgorCittc2dpZCAiQWJvdXQgVk5Ddmlld2VyLi4uIgorbXNnc3RyICKOIFZOQyBWaWV3ZXIuLi4iCisKK21zZ2lkICJEaXNtaXNzIG1lbnUiCittc2dzdHIgIoegquDr4uwgrKWt7iIKKworbXNnaWQgIlZOQyBNZW51IgorbXNnc3RyICKMpa3uIFZOQyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRGVza3RvcCBuYW1lOiAlLjgwc1xuIgorIkhvc3Q6ICUuODBzIHBvcnQ6ICVkXG4iCisiU2l6ZTogJWQgeCAlZFxuIgorIlBpeGVsIGZvcm1hdDogJXNcbiIKKyIoc2VydmVyIGRlZmF1bHQgJXMpXG4iCisiUmVxdWVzdGVkIGVuY29kaW5nOiAlc1xuIgorIkxhc3QgdXNlZCBlbmNvZGluZzogJXNcbiIKKyJMaW5lIHNwZWVkIGVzdGltYXRlOiAlZCBrYml0L3NcbiIKKyJQcm90b2NvbCB2ZXJzaW9uOiAlZC4lZFxuIgorIlNlY3VyaXR5IG1ldGhvZDogJXNcbiIKK21zZ3N0ciAiIgorIois7yDhpaCt4aA6ICUuODBzXG4iCisijKDoqK2gOiAlLjgwcyCvruDiOiAlZFxuIgorIpCgp6yl4DogJWQgeCAlZFxuIgorIpSu4Kyg4iDmoqXioDogJXNcbiIKKyIop62g56WtqKUg4aXgoqXgoCAlcylcbiIKKyKHoK/gruilra2g7yDh5aWsoCCqrqSo4K6ioK2o7zogJXNcbiIKKyKPruGrpaSt7+8g4eWlrKAgqq6kqOCuoqCtqO86ICVzXG4iCisikaqu4K7h4uwgq6itqKgg4aLvp6g6ICVkIKqhqOIv4VxuIgorIoKl4OGo7yCv4K7irqquq6A6ICVkLiVkXG4iCisikeWlrKAgoaWnrq+g4a2u4eKoOiAlc1xuIgorCittc2dpZCAiVk5DIGNvbm5lY3Rpb24gaW5mbyIKK21zZ3N0ciAiiK3kruCsoOao7yCuIOGupaSoraWtqKggVk5DIgorCittc2dpZCAiVk5DIFZpZXdlcjogQ29ubmVjdGlvbiBPcHRpb25zIgorbXNnc3RyICJWTkMgVmlld2VyOiCvoOCgrKXi4Osg4a6lpKitpa2o7yIKKworbXNnaWQgIkVuY29kaW5nIGFuZCBDb2xvciBMZXZlbDoiCittc2dzdHIgIoqupKjgrqKgrailIKgg5qKl4q6irqkg4KWmqKw6IgorCittc2dpZCAiSW5wdXRzOiIKK21zZ3N0ciAigqKupDoiCisKK21zZ2lkICJNaXNjOiIKK21zZ3N0ciAikKCnra6lOiIKKworbXNnaWQgIkF1dG8gc2VsZWN0IgorbXNnc3RyICKAouKurKDiqOel4aqoqSCi66Gu4CIKKworbXNnaWQgIkZ1bGwgKGFsbCBhdmFpbGFibGUgY29sb3JzKSIKK21zZ3N0ciAijK2uo67moqXireupIOClpqisICii4aUgpK7h4uOvreulIOaipeKgKSIKKworbXNnaWQgIk1lZGl1bSAoMjU2IGNvbG9ycykiCittc2dzdHIgIpHgpaStpaUgqqDnpeHioq4g5qKl4qAgKDI1NiDmoqXirqIpIgorCittc2dpZCAiTG93ICg2NCBjb2xvcnMpIgorbXNnc3RyICKNqKeqrqUgqqDnpeHioq4g5qKl4qAgKDY0IOaipeKgKSIKKworbXNnaWQgIlZlcnkgbG93ICg4IGNvbG9ycykiCittc2dzdHIgIoyorais46wg5qKl4qAgKDgg5qKl4q6iKSIKKworbXNnaWQgIkN1c3RvbSBjb21wcmVzc2lvbiBsZXZlbDoiCittc2dzdHIgIo2l4eKgraSg4OKt66kg4+CuoqWt7CDhpqDiqO86IgorCittc2dpZCAibGV2ZWwgKDE9ZmFzdCwgOT1iZXN0KSIKK21zZ3N0ciAi4+CuoqWt7CAoMT2h6+Hi4K4sIDk9rKCq4S7hpqDiqKUpIgorCittc2dpZCAiQWxsb3cgSlBFRyBjb21wcmVzc2lvbjoiCittc2dzdHIgIpCgp+Cl6Kji7CDhpqDiqKUgSlBFRzoiCisKK21zZ2lkICJxdWFsaXR5ICgxPXBvb3IsIDk9YmVzdCkiCittc2dzdHIgIqqg56Xh4qKuICgxPa2op6qupSwgOT2toKir4+fopaUpIgorCittc2dpZCAiVmlldyBvbmx5IChpZ25vcmUgbW91c2UgJiBrZXlib2FyZCkiCittc2dzdHIgIpKuq+yqriCv4K7hrK7i4CAoqKOtruCo4K6ioOLsIKzr6OwgqCCqq6CiqKDi4+DjKSIKKworbXNnaWQgIkFjY2VwdCBjbGlwYm9hcmQgZnJvbSBzZXJ2ZXIiCittc2dzdHIgIo/gqK2orKDi7CCh4+Sl4CCuoaylraAg4SDhpeCipeCgIgorCittc2dpZCAiU2VuZCBjbGlwYm9hcmQgdG8gc2VydmVyIgorbXNnc3RyICKPruHrq6Di7CCh4+Sl4CCuoaylraAgraAg4aXgoqXgIgorCittc2dpZCAiU2VuZCBwcmltYXJ5IHNlbGVjdGlvbiAmIGN1dCBidWZmZXIgYXMgY2xpcGJvYXJkIgorbXNnc3RyICKPruHrq6Di7CBcInByaW1hcnkgc2VsZWN0aW9uXCIgqCBcImN1dCBidWZmZXJcIiCqoKogoePkpeAgrqGspa2gIgorCittc2dpZCAiU2hhcmVkIChkb24ndCBkaXNjb25uZWN0IG90aGVyIHZpZXdlcnMpIgorbXNnc3RyICKQoKekpavvpazrqSDgpaaorCAoraUgruKqq+7noOLsIKTg46Oo5SCqq6ilreKuoikiCisKK21zZ2lkICJGdWxsLXNjcmVlbiBtb2RlIgorbXNnc3RyICKPrqutru2q4KCtreupIOClpqisIgorCittc2dpZCAiUmVuZGVyIGN1cnNvciBsb2NhbGx5IgorbXNnc3RyICKQqOGuoqDi7CCq4+DhruAgq66qoKvsra4iCisKK21zZ2lkICJTaG93IGRvdCB3aGVuIG5vIGN1cnNvciIKK21zZ3N0ciAij66qoKfroqDi7CDirueq4yCv4KggruLh4+Lh4qKoqCCq4+DhruCgIgorCittc2dpZCAiT0siCittc2dzdHIgIk9LIgorCittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICKO4qylraAiCisKK21zZ2lkICJVc2VybmFtZToiCittc2dzdHIgIois7yCvrqvsp66ioOKlq+86IgorCittc2dpZCAiUGFzc3dvcmQ6IgorbXNnc3RyICKPoOCuq+w6IgorCittc2dpZCAiVk5DIFZpZXdlcjogQ29ubmVjdGlvbiBEZXRhaWxzIgorbXNnc3RyICJWTkMgVmlld2VyOiCkpeKgq6gg4a6lpKitpa2o7yIKKworbXNnaWQgIlZOQyBzZXJ2ZXI6IgorbXNnc3RyICKRpeCipeAgVk5DOiIKKworbXNnaWQgIkFib3V0Li4uIgorbXNnc3RyICKOIK/grqPgoKyspS4uLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGlnaHRWTkMgdmlld2VyIGZvciBYIHZlcnNpb24gNC4wIC0gYnVpbHQgJXNcbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBSZWFsVk5DIEx0ZC5cbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBDb25zdGFudGluIEthcGxpbnNreVxuIgorIkNvcHlyaWdodCAoQykgMjAwNC0yMDA1IFBldGVyIEFzdHJhbmQsIENlbmRpbyBBQlxuIgorIlNlZSBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbSBmb3IgaW5mb3JtYXRpb24gb24gVGlnaHRWTkMuIgorbXNnc3RyICIiCisiVGlnaHRWTkMgdmlld2VyIKSr7yBYLCCipeDhqO8gNC4wIC0gouClrO8g4aGu4KqoICVzXG4iCisiQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgUmVhbFZOQyBMdGQuXG4iCisiQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgiq6t4eKgreKorSCKoK+rqK3hqqipXG4iCisiQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUGV0ZXIgQXN0cmFuZCwgQ2VuZGlvIEFCXG4iCisiiOmo4qUgqK3kruCsoOao7iCuIFRpZ2h0Vk5DIK2gIOGgqeKlIGh0dHA6Ly93d3cudGlnaHR2bmMuY29tIgpkaWZmIC0tZ2l0IGEvdW5peC9wby9zdi5wbyBiL3VuaXgvcG8vc3YucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ODg0NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvcG8vc3YucG8KQEAgLTAsMCArMSwxODkgQEAKKyMgU3dlZGlzaCB0cmFuc2xhdGlvbnMgZm9yIHRpZ2h0dm5jIHBhY2thZ2UKKyMgU3ZlbnNrYSD2dmVyc+R0dG5pbmdhciBm9nIgcGFrZXQgdGlnaHR2bmMuCisjIENvcHlyaWdodCAoQykgMjAwNSBSZWFsVk5DIEx0ZCwgQ29uc3RhbnRpbiBLYXBsaW5za3ksIFBldGVyIEFzdHJhbmQsIENlbmRpbyBBQgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgdGlnaHR2bmMgcGFja2FnZS4KKyMgUGV0ZXIgQXN0cmFuZCA8YXN0cmFuZEBjZW5kaW8uc2U+LCAyMDA1LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogdGlnaHR2bmMgMS41LjBcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogZGV2dGVhbUB0aWdodHZuYy5jb21cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwNS0wMy0wMSAyMDozNyswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNS0wMy0wMSAyMDozOSswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBQZXRlciBBc3RyYW5kIDxhc3RyYW5kQGNlbmRpby5zZT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBTd2VkaXNoXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMVxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworbXNnaWQgIkFib3V0IFZOQyBWaWV3ZXIiCittc2dzdHIgIk9tIFZOQy12aXNhcmVuIgorCittc2dpZCAiVk5DIGF1dGhlbnRpY2F0aW9uIgorbXNnc3RyICJWTkMtYXV0ZW50aXNlcmluZyIKKworbXNnaWQgIkV4aXQgdmlld2VyIgorbXNnc3RyICJBdnNsdXRhIHZpc2FyZW4iCisKK21zZ2lkICJGdWxsIHNjcmVlbiIKK21zZ3N0ciAiRnVsbHNr5HJtIgorCittc2dpZCAiQ3RybCIKK21zZ3N0ciAiQ3RybCIKKworbXNnaWQgIkFsdCIKK21zZ3N0ciAiQWx0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlNlbmQgJXMiCittc2dzdHIgIlNraWNrYSAlcyIKKworbXNnaWQgIlNlbmQgQ3RybC1BbHQtRGVsIgorbXNnc3RyICJTa2lja2EgQ3RybC1BbHQtRGVsIgorCittc2dpZCAiUmVmcmVzaCBzY3JlZW4iCittc2dzdHIgIlVwcGRhdGVyYSBza+RybSIKKworbXNnaWQgIk5ldyBjb25uZWN0aW9uLi4uIgorbXNnc3RyICJOeSBhbnNsdXRuaW5nLi4uIgorCittc2dpZCAiT3B0aW9ucy4uLiIKK21zZ3N0ciAiSW5zdORsbG5pbmdhci4uLiIKKworbXNnaWQgIkNvbm5lY3Rpb24gaW5mby4uLiIKK21zZ3N0ciAiSW5mb3JtYXRpb24gb20gYW5zbHV0bmluZ2VuLi4uIgorCittc2dpZCAiQWJvdXQgVk5Ddmlld2VyLi4uIgorbXNnc3RyICJPbSBWTkMtdmlzYXJlbi4uLiIKKworbXNnaWQgIkRpc21pc3MgbWVudSIKK21zZ3N0ciAiU3TkbmcgbWVueSIKKworbXNnaWQgIlZOQyBNZW51IgorbXNnc3RyICJWTkMtbWVueSIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRGVza3RvcCBuYW1lOiAlLjgwc1xuIgorIkhvc3Q6ICUuODBzIHBvcnQ6ICVkXG4iCisiU2l6ZTogJWQgeCAlZFxuIgorIlBpeGVsIGZvcm1hdDogJXNcbiIKKyIoc2VydmVyIGRlZmF1bHQgJXMpXG4iCisiUmVxdWVzdGVkIGVuY29kaW5nOiAlc1xuIgorIkxhc3QgdXNlZCBlbmNvZGluZzogJXNcbiIKKyJMaW5lIHNwZWVkIGVzdGltYXRlOiAlZCBrYml0L3NcbiIKKyJQcm90b2NvbCB2ZXJzaW9uOiAlZC4lZFxuIgorIlNlY3VyaXR5IG1ldGhvZDogJXNcbiIKK21zZ3N0ciAiIgorIlNrcml2Ym9yZHNuYW1uOiAlLjgwc1xuIgorIlbkcmQ6ICUuODBzIHBvcnQ6ICVkXG4iCisiU3RvcmxlazogJWQgeCAlZFxuIgorIlBpeGVsZm9ybWF0OiAlc1xuIgorIihzZXJ2ZXJzdGFuZGFyZCAlcylcbiIKKyJCZWfkcmQga29kbmluZzogJXNcbiIKKyJTZW5hc3QgYW525G5kIGtvZG5pbmc6ICVzXG4iCisiVXBwc2thdHRhZCBoYXN0aWdoZXQgcOUgZvZyYmluZGVsc2VuOiAlZCBrYml0L3NcbiIKKyJQcm90b2tvbGx2ZXJzaW9uOiAlZC4lZFxuIgorIlPka2VyaGV0c21ldG9kOiAlc1xuIgorCittc2dpZCAiVk5DIGNvbm5lY3Rpb24gaW5mbyIKK21zZ3N0ciAiVk5DIGFuc2x1dG5pbmdzaW5mb3JtYXRpb24iCisKK21zZ2lkICJWTkMgVmlld2VyOiBDb25uZWN0aW9uIE9wdGlvbnMiCittc2dzdHIgIlZOQy12aXNhcmU6IEFuc2x1dG5pbmdzYWx0ZXJuYXRpdiIKKworbXNnaWQgIkVuY29kaW5nIGFuZCBDb2xvciBMZXZlbDoiCittc2dzdHIgIktvZG5pbmcgb2NoIGbkcmduaXblOiIKKworbXNnaWQgIklucHV0czoiCittc2dzdHIgIklubWF0bmluZzoiCisKK21zZ2lkICJNaXNjOiIKK21zZ3N0ciAiRGl2ZXJzZToiCisKK21zZ2lkICJBdXRvIHNlbGVjdCIKK21zZ3N0ciAiQXV0b21hdGlza3QgdmFsIgorCittc2dpZCAiRnVsbCAoYWxsIGF2YWlsYWJsZSBjb2xvcnMpIgorbXNnc3RyICJGdWxsIChhbGxhIHRpbGxn5G5nbGlnYSBm5HJnZXIpIgorCittc2dpZCAiTWVkaXVtICgyNTYgY29sb3JzKSIKK21zZ3N0ciAiTWVkaXVtICgyNTYgZuRyZ2VyKSIKKworbXNnaWQgIkxvdyAoNjQgY29sb3JzKSIKK21zZ3N0ciAiTOVnICg2NCBm5HJnZXIpIgorCittc2dpZCAiVmVyeSBsb3cgKDggY29sb3JzKSIKK21zZ3N0ciAiTXlja2V0IGzlZyAoOCBm5HJnZXIpIgorCittc2dpZCAiQ3VzdG9tIGNvbXByZXNzaW9uIGxldmVsOiIKK21zZ3N0ciAiQW5wYXNzYWQga29tcHJlc3Npb25zbml25ToiCisKK21zZ2lkICJsZXZlbCAoMT1mYXN0LCA5PWJlc3QpIgorbXNnc3RyICJuaXblICgxPXNuYWJiLCA5PWLkc3QpIgorCittc2dpZCAiQWxsb3cgSlBFRyBjb21wcmVzc2lvbjoiCittc2dzdHIgIlRpbGzldCBKUEVHLWtvbXByZXNzaW9uOiIKKworbXNnaWQgInF1YWxpdHkgKDE9cG9vciwgOT1iZXN0KSIKK21zZ3N0ciAia3ZhbGl0ZXQgKDA9ZOVsaWcsIDk9YuRzdCkiCisKK21zZ2lkICJWaWV3IG9ubHkgKGlnbm9yZSBtb3VzZSAmIGtleWJvYXJkKSIKK21zZ3N0ciAiRW5kYXN0IHZpc25pbmcgKGlnbm9yZXJhIG11cyBvY2ggdGFuZ2VudGJvcmQpIgorCittc2dpZCAiQWNjZXB0IGNsaXBib2FyZCBmcm9tIHNlcnZlciIKK21zZ3N0ciAiQWNjZXB0ZXJhIHVya2xpcHAgZnLlbiBzZXJ2ZXIiCisKK21zZ2lkICJTZW5kIGNsaXBib2FyZCB0byBzZXJ2ZXIiCittc2dzdHIgIlNraWNrYSB1cmtsaXBwIHRpbGwgc2VydmVyIgorCittc2dpZCAiU2VuZCBwcmltYXJ5IHNlbGVjdGlvbiAmIGN1dCBidWZmZXIgYXMgY2xpcGJvYXJkIgorbXNnc3RyICJTa2lja2EgUFJJTUFSWSBvY2ggQ1VUX0JVRkZFUiBzb20gdXJrbGlwcCIKKworbXNnaWQgIlNoYXJlZCAoZG9uJ3QgZGlzY29ubmVjdCBvdGhlciB2aWV3ZXJzKSIKK21zZ3N0ciAiRGVsYWQgKGtvcHBsYSBlaiBmcuVuIGFuZHJhIHZpc2FyZSkiCisKK21zZ2lkICJGdWxsLXNjcmVlbiBtb2RlIgorbXNnc3RyICJGdWxsc2vkcm1zbORnZSIKKworbXNnaWQgIlJlbmRlciBjdXJzb3IgbG9jYWxseSIKK21zZ3N0ciAiSGFudGVyYSBtdXNwZWthcmVuIGxva2FsdCIKKworbXNnaWQgIlNob3cgZG90IHdoZW4gbm8gY3Vyc29yIgorbXNnc3RyICJWaXNhIHB1bmt0IG7kciBtdXNwZWthcmUgc2FrbmFzIgorCittc2dpZCAiT0siCittc2dzdHIgIk9rIgorCittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICJBdmJyeXQiCisKK21zZ2lkICJVc2VybmFtZToiCittc2dzdHIgIkFuduRuZGFybmFtbjoiCisKK21zZ2lkICJQYXNzd29yZDoiCittc2dzdHIgIkz2c2Vub3JkOiIKKworbXNnaWQgIlZOQyBWaWV3ZXI6IENvbm5lY3Rpb24gRGV0YWlscyIKK21zZ3N0ciAiVk5DLXZpc2FyZTogQW5zbHV0bmluZ3NkZXRhbGplciIKKworbXNnaWQgIlZOQyBzZXJ2ZXI6IgorbXNnc3RyICJWTkMtc2VydmVyOiIKKworbXNnaWQgIkFib3V0Li4uIgorbXNnc3RyICJPbS4uLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGlnaHRWTkMgdmlld2VyIGZvciBYIHZlcnNpb24gNC4wIC0gYnVpbHQgJXNcbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBSZWFsVk5DIEx0ZC5cbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBDb25zdGFudGluIEthcGxpbnNreVxuIgorIkNvcHlyaWdodCAoQykgMjAwNC0yMDA1IFBldGVyIEFzdHJhbmQsIENlbmRpbyBBQlxuIgorIlNlZSBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbSBmb3IgaW5mb3JtYXRpb24gb24gVGlnaHRWTkMuIgorbXNnc3RyICIiCisiVGlnaHRWTkMtdmlzYXJlIGb2ciBYIHZlcnNpb24gNC4wIC0gYnlnZ2QgJXNcbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBSZWFsVk5DIEx0ZC5cbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBDb25zdGFudGluIEthcGxpbnNreS5cbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBQZXRlciBBc3RyYW5kLCBDZW5kaW8gQUJcbiIKKyJTZSBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbSBm9nIgaW5mb3JtYXRpb24gb20gVGlnaHRWTkMuIgpkaWZmIC0tZ2l0IGEvdW5peC9wby90aWdodHZuYy5wb3QgYi91bml4L3BvL3RpZ2h0dm5jLnBvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDRjMjJlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9wby90aWdodHZuYy5wb3QKQEAgLTAsMCArMSwxNzMgQEAKKyMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KKyMgQ29weXJpZ2h0IChDKSBZRUFSIFJlYWxWTkMgTHRkLCBDb25zdGFudGluIEthcGxpbnNreSwgUGV0ZXIgQXN0cmFuZCwgQ2VuZGlvIEFCCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBQQUNLQUdFIHBhY2thZ2UuCisjIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCisjCisjLCBmdXp6eQorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGRldnRlYW1AdGlnaHR2bmMuY29tXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDUtMDMtMDEgMjA6MzcrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgorIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgorIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkFib3V0IFZOQyBWaWV3ZXIiCittc2dzdHIgIiIKKworbXNnaWQgIlZOQyBhdXRoZW50aWNhdGlvbiIKK21zZ3N0ciAiIgorCittc2dpZCAiRXhpdCB2aWV3ZXIiCittc2dzdHIgIiIKKworbXNnaWQgIkZ1bGwgc2NyZWVuIgorbXNnc3RyICIiCisKK21zZ2lkICJDdHJsIgorbXNnc3RyICIiCisKK21zZ2lkICJBbHQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJTZW5kICVzIgorbXNnc3RyICIiCisKK21zZ2lkICJTZW5kIEN0cmwtQWx0LURlbCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVmcmVzaCBzY3JlZW4iCittc2dzdHIgIiIKKworbXNnaWQgIk5ldyBjb25uZWN0aW9uLi4uIgorbXNnc3RyICIiCisKK21zZ2lkICJPcHRpb25zLi4uIgorbXNnc3RyICIiCisKK21zZ2lkICJDb25uZWN0aW9uIGluZm8uLi4iCittc2dzdHIgIiIKKworbXNnaWQgIkFib3V0IFZOQ3ZpZXdlci4uLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRGlzbWlzcyBtZW51IgorbXNnc3RyICIiCisKK21zZ2lkICJWTkMgTWVudSIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJEZXNrdG9wIG5hbWU6ICUuODBzXG4iCisiSG9zdDogJS44MHMgcG9ydDogJWRcbiIKKyJTaXplOiAlZCB4ICVkXG4iCisiUGl4ZWwgZm9ybWF0OiAlc1xuIgorIihzZXJ2ZXIgZGVmYXVsdCAlcylcbiIKKyJSZXF1ZXN0ZWQgZW5jb2Rpbmc6ICVzXG4iCisiTGFzdCB1c2VkIGVuY29kaW5nOiAlc1xuIgorIkxpbmUgc3BlZWQgZXN0aW1hdGU6ICVkIGtiaXQvc1xuIgorIlByb3RvY29sIHZlcnNpb246ICVkLiVkXG4iCisiU2VjdXJpdHkgbWV0aG9kOiAlc1xuIgorbXNnc3RyICIiCisKK21zZ2lkICJWTkMgY29ubmVjdGlvbiBpbmZvIgorbXNnc3RyICIiCisKK21zZ2lkICJWTkMgVmlld2VyOiBDb25uZWN0aW9uIE9wdGlvbnMiCittc2dzdHIgIiIKKworbXNnaWQgIkVuY29kaW5nIGFuZCBDb2xvciBMZXZlbDoiCittc2dzdHIgIiIKKworbXNnaWQgIklucHV0czoiCittc2dzdHIgIiIKKworbXNnaWQgIk1pc2M6IgorbXNnc3RyICIiCisKK21zZ2lkICJBdXRvIHNlbGVjdCIKK21zZ3N0ciAiIgorCittc2dpZCAiRnVsbCAoYWxsIGF2YWlsYWJsZSBjb2xvcnMpIgorbXNnc3RyICIiCisKK21zZ2lkICJNZWRpdW0gKDI1NiBjb2xvcnMpIgorbXNnc3RyICIiCisKK21zZ2lkICJMb3cgKDY0IGNvbG9ycykiCittc2dzdHIgIiIKKworbXNnaWQgIlZlcnkgbG93ICg4IGNvbG9ycykiCittc2dzdHIgIiIKKworbXNnaWQgIkN1c3RvbSBjb21wcmVzc2lvbiBsZXZlbDoiCittc2dzdHIgIiIKKworbXNnaWQgImxldmVsICgxPWZhc3QsIDk9YmVzdCkiCittc2dzdHIgIiIKKworbXNnaWQgIkFsbG93IEpQRUcgY29tcHJlc3Npb246IgorbXNnc3RyICIiCisKK21zZ2lkICJxdWFsaXR5ICgxPXBvb3IsIDk9YmVzdCkiCittc2dzdHIgIiIKKworbXNnaWQgIlZpZXcgb25seSAoaWdub3JlIG1vdXNlICYga2V5Ym9hcmQpIgorbXNnc3RyICIiCisKK21zZ2lkICJBY2NlcHQgY2xpcGJvYXJkIGZyb20gc2VydmVyIgorbXNnc3RyICIiCisKK21zZ2lkICJTZW5kIGNsaXBib2FyZCB0byBzZXJ2ZXIiCittc2dzdHIgIiIKKworbXNnaWQgIlNlbmQgcHJpbWFyeSBzZWxlY3Rpb24gJiBjdXQgYnVmZmVyIGFzIGNsaXBib2FyZCIKK21zZ3N0ciAiIgorCittc2dpZCAiU2hhcmVkIChkb24ndCBkaXNjb25uZWN0IG90aGVyIHZpZXdlcnMpIgorbXNnc3RyICIiCisKK21zZ2lkICJGdWxsLXNjcmVlbiBtb2RlIgorbXNnc3RyICIiCisKK21zZ2lkICJSZW5kZXIgY3Vyc29yIGxvY2FsbHkiCittc2dzdHIgIiIKKworbXNnaWQgIlNob3cgZG90IHdoZW4gbm8gY3Vyc29yIgorbXNnc3RyICIiCisKK21zZ2lkICJPSyIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICIiCisKK21zZ2lkICJVc2VybmFtZToiCittc2dzdHIgIiIKKworbXNnaWQgIlBhc3N3b3JkOiIKK21zZ3N0ciAiIgorCittc2dpZCAiVk5DIFZpZXdlcjogQ29ubmVjdGlvbiBEZXRhaWxzIgorbXNnc3RyICIiCisKK21zZ2lkICJWTkMgc2VydmVyOiIKK21zZ3N0ciAiIgorCittc2dpZCAiQWJvdXQuLi4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGlnaHRWTkMgdmlld2VyIGZvciBYIHZlcnNpb24gNC4wIC0gYnVpbHQgJXNcbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBSZWFsVk5DIEx0ZC5cbiIKKyJDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBDb25zdGFudGluIEthcGxpbnNreVxuIgorIkNvcHlyaWdodCAoQykgMjAwNC0yMDA1IFBldGVyIEFzdHJhbmQsIENlbmRpbyBBQlxuIgorIlNlZSBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbSBmb3IgaW5mb3JtYXRpb24gb24gVGlnaHRWTkMuIgorbXNnc3RyICIiCmRpZmYgLS1naXQgYS91bml4L3R4L01ha2VmaWxlLmluIGIvdW5peC90eC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWMzMGIxCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE3IEBACisKK1NSQ1MgPSBUWFdpbmRvdy5jeHggVFhTY3JvbGxiYXIuY3h4IFRYVmlld3BvcnQuY3h4IFRYSW1hZ2UuY3h4IFRYTWVudS5jeHgKKworT0JKUyA9ICQoU1JDUzouY3h4PS5vKQorCitESVJfQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikgQFhfQ0ZMQUdTQCAjIFhfQ0ZMQUdTIGFyZSByZWFsbHkgQ1BQRkxBR1MKKworbGlicmFyeSA9IGxpYnR4LmEKKworYWxsOjogJChsaWJyYXJ5KQorCiskKGxpYnJhcnkpOiAkKE9CSlMpCisJcm0gLWYgJChsaWJyYXJ5KQorCSQoQVIpICQobGlicmFyeSkgJChPQkpTKQorCSQoUkFOTElCKSAkKGxpYnJhcnkpCisKKyMgZm9sbG93ZWQgYnkgYm9pbGVycGxhdGUubWsKZGlmZiAtLWdpdCBhL3VuaXgvdHgvVFhCdXR0b24uaCBiL3VuaXgvdHgvVFhCdXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQ3Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWEJ1dHRvbi5oCkBAIC0wLDAgKzEsMTI0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gVFhCdXR0b24uaAorLy8KKy8vIEEgVFhCdXR0b24gaXMgYSBjbGlja2FibGUgYnV0dG9uIHdpdGggc29tZSB0ZXh0IGluIGl0LiAgVGhlIGJ1dHRvbiBtdXN0IGJlCisvLyBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHRleHQgLSBpZiBub3QgdGhlbiBpdCB3aWxsIGJlIHJlc2l6ZWQKKy8vIGFwcHJvcHJpYXRlbHkuCisvLworCisjaWZuZGVmIF9fVFhCVVRUT05fSF9fCisjZGVmaW5lIF9fVFhCVVRUT05fSF9fCisKKyNpbmNsdWRlICJUWFdpbmRvdy5oIgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKKy8vIFRYQnV0dG9uQ2FsbGJhY2sncyBidXR0b25BY3RpdmF0ZSgpIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGJ1dHRvbiBpcworLy8gYWN0aXZhdGVkLgorY2xhc3MgVFhCdXR0b247CitjbGFzcyBUWEJ1dHRvbkNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIGJ1dHRvbkFjdGl2YXRlKFRYQnV0dG9uKiBidXR0b24pPTA7Cit9OworCisKK2NsYXNzIFRYQnV0dG9uIDogcHVibGljIFRYV2luZG93LCBwdWJsaWMgVFhFdmVudEhhbmRsZXIgeworcHVibGljOgorCisgIFRYQnV0dG9uKERpc3BsYXkqIGRweV8sIGNvbnN0IGNoYXIqIHRleHRfLCBUWEJ1dHRvbkNhbGxiYWNrKiBjYl89MCwKKyAgICAgICAgICAgVFhXaW5kb3cqIHBhcmVudF89MCwgaW50IHc9MSwgaW50IGg9MSkKKyAgICA6IFRYV2luZG93KGRweV8sIHcsIGgsIHBhcmVudF8pLCBjYihjYl8pLCBkb3duKGZhbHNlKSwKKyAgICAgIGRpc2FibGVkXyhmYWxzZSkKKyAgeworICAgIHNldEV2ZW50SGFuZGxlcih0aGlzKTsKKyAgICBzZXRUZXh0KHRleHRfKTsKKyAgICBnYyA9IFhDcmVhdGVHQyhkcHksIHdpbigpLCAwLCAwKTsKKyAgICBYU2V0Rm9udChkcHksIGdjLCBkZWZhdWx0Rm9udCk7CisgICAgYWRkRXZlbnRNYXNrKEV4cG9zdXJlTWFzayB8IEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrKTsKKyAgfQorCisgIHZpcnR1YWwgflRYQnV0dG9uKCkgeworICAgIFhGcmVlR0MoZHB5LCBnYyk7CisgIH0KKworICAvLyBzZXRUZXh0KCkgY2hhbmdlcyB0aGUgdGV4dCBpbiB0aGUgYnV0dG9uLgorICB2b2lkIHNldFRleHQoY29uc3QgY2hhciogdGV4dF8pIHsKKyAgICB0ZXh0LmJ1ZiA9IHJmYjo6c3RyRHVwKHRleHRfKTsKKyAgICBpbnQgdGV4dFdpZHRoID0gWFRleHRXaWR0aChkZWZhdWx0RlMsIHRleHQuYnVmLCBzdHJsZW4odGV4dC5idWYpKTsKKyAgICBpbnQgdGV4dEhlaWdodCA9IChkZWZhdWx0RlMtPmFzY2VudCArIGRlZmF1bHRGUy0+ZGVzY2VudCk7CisgICAgaW50IG5ld1dpZHRoID0gX19yZmJtYXgod2lkdGgoKSwgdGV4dFdpZHRoICsgeFBhZCoyICsgYmV2ZWwqMik7CisgICAgaW50IG5ld0hlaWdodCA9IF9fcmZibWF4KGhlaWdodCgpLCB0ZXh0SGVpZ2h0ICsgeVBhZCoyICsgYmV2ZWwqMik7CisgICAgaWYgKHdpZHRoKCkgPCBuZXdXaWR0aCB8fCBoZWlnaHQoKSA8IG5ld0hlaWdodCkgeworICAgICAgcmVzaXplKG5ld1dpZHRoLCBuZXdIZWlnaHQpOworICAgIH0KKyAgfQorCisgIC8vIGRpc2FibGVkKCkgc2V0cyBvciBxdWVyaWVzIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgY2hlY2tib3guICBBIGRpc2FibGVkCisgIC8vIGNoZWNrYm94IGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UuCisgIHZvaWQgZGlzYWJsZWQoYm9vbCBiKSB7IGRpc2FibGVkXyA9IGI7IHBhaW50KCk7IH0KKyAgYm9vbCBkaXNhYmxlZCgpIHsgcmV0dXJuIGRpc2FibGVkXzsgfQorCitwcml2YXRlOgorCisgIHZvaWQgcGFpbnQoKSB7CisgICAgaW50IHR3ID0gWFRleHRXaWR0aChkZWZhdWx0RlMsIHRleHQuYnVmLCBzdHJsZW4odGV4dC5idWYpKTsKKyAgICBpbnQgc3RhcnR4ID0gKHdpZHRoKCkgLSB0dykgLyAyOworICAgIGludCBzdGFydHkgPSAoaGVpZ2h0KCkgKyBkZWZhdWx0RlMtPmFzY2VudCAtIGRlZmF1bHRGUy0+ZGVzY2VudCkgLyAyOworICAgIGlmIChkb3duIHx8IGRpc2FibGVkXykgeworICAgICAgZHJhd0JldmVsKGdjLCAwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSwgYmV2ZWwsIGRlZmF1bHRCZywgZGFya0JnLGxpZ2h0QmcpOworICAgICAgc3RhcnR4Kys7IHN0YXJ0eSsrOworICAgIH0gZWxzZSB7CisgICAgICBkcmF3QmV2ZWwoZ2MsIDAsIDAsIHdpZHRoKCksIGhlaWdodCgpLCBiZXZlbCwgZGVmYXVsdEJnLCBsaWdodEJnLGRhcmtCZyk7CisgICAgfQorCisgICAgWFNldEZvcmVncm91bmQoZHB5LCBnYywgZGlzYWJsZWRfID8gZGlzYWJsZWRGZyA6IGRlZmF1bHRGZyk7CisgICAgWERyYXdTdHJpbmcoZHB5LCB3aW4oKSwgZ2MsIHN0YXJ0eCwgc3RhcnR5LCB0ZXh0LmJ1Ziwgc3RybGVuKHRleHQuYnVmKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnQoVFhXaW5kb3cqIHcsIFhFdmVudCogZXYpIHsKKyAgICBzd2l0Y2ggKGV2LT50eXBlKSB7CisgICAgY2FzZSBFeHBvc2U6CisgICAgICBwYWludCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0b25QcmVzczoKKyAgICAgIGlmICghZGlzYWJsZWRfKSB7CisgICAgICAgIGRvd24gPSB0cnVlOworICAgICAgICBwYWludCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0b25SZWxlYXNlOgorICAgICAgaWYgKCFkb3duKSBicmVhazsKKyAgICAgIGRvd24gPSBmYWxzZTsKKyAgICAgIHBhaW50KCk7CisgICAgICBpZiAoZXYtPnhidXR0b24ueCA+PSAwICYmIGV2LT54YnV0dG9uLnggPCB3aWR0aCgpICYmCisgICAgICAgICAgZXYtPnhidXR0b24ueSA+PSAwICYmIGV2LT54YnV0dG9uLnkgPCBoZWlnaHQoKSkgeworICAgICAgICBpZiAoY2IpIGNiLT5idXR0b25BY3RpdmF0ZSh0aGlzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIEdDIGdjOworICByZmI6OkNoYXJBcnJheSB0ZXh0OworICBUWEJ1dHRvbkNhbGxiYWNrKiBjYjsKKyAgYm9vbCBkb3duOworICBib29sIGRpc2FibGVkXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWENoZWNrYm94LmggYi91bml4L3R4L1RYQ2hlY2tib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgwYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWENoZWNrYm94LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWENoZWNrYm94LmgKKy8vCisvLyBBIFRYQ2hlY2tib3ggaGFzIGEgYm94IHdoaWNoIG1heSBiZSAiY2hlY2tlZCIgd2l0aCBzb21lIHRleHQgbmV4dCB0byBpdC4KKy8vIFRoZSBjaGVja2JveCB3aW5kb3cgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHRleHQgLSBpZiBub3QgdGhlbiBpdAorLy8gd2lsbCBiZSByZXNpemVkIGFwcHJvcHJpYXRlbHkuCisvLworLy8gVGhlcmUgYXJlIHR3byBzdHlsZXMgb2YgY2hlY2tib3g6IHRoZSBub3JtYWwgc3R5bGUgd2hpY2ggdXNlcyBhIHRpY2sgaW4gYQorLy8gc3F1YXJlIGJveCwgYW5kIHRoZSByYWRpbyBzdHlsZSB3aGljaCB1c2VzIGEgZG90IGluc2lkZSBhIGNpcmNsZS4gIFRoZQorLy8gZGVmYXVsdCBiZWhhdmlvdXIgd2hlbiBjbGlja2luZyBvbiB0aGUgY2hlY2tib3ggaXMgdG8gdG9nZ2xlIGl0IG9uIG9yIG9mZiwKKy8vIGJ1dCB0aGlzIGJlaGF2aW91ciBjYW4gYmUgY2hhbmdlZCBieSB0aGUgY2FsbGJhY2sgb2JqZWN0LiAgSW4gcGFydGljdWxhciB0bworLy8gZ2V0IHJhZGlvYnV0dG9uIGJlaGF2aW91ciwgdGhlIGNhbGxiYWNrIG11c3QgZW5zdXJlIHRoYXQgb25seSBvbmUgb2YgYSBzZXQKKy8vIG9mIHJhZGlvYnV0dG9ucyBpcyBzZWxlY3RlZC4KKy8vCisKKyNpZm5kZWYgX19UWENIRUNLQk9YX0hfXworI2RlZmluZSBfX1RYQ0hFQ0tCT1hfSF9fCisKKyNpbmNsdWRlICJUWFdpbmRvdy5oIgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKKy8vIFRYQ2hlY2tib3hDYWxsYmFjaydzIGNoZWNrYm94U2VsZWN0KCkgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiBhCisvLyBjaGVja2JveCBjaGFuZ2VzLgorY2xhc3MgVFhDaGVja2JveDsKK2NsYXNzIFRYQ2hlY2tib3hDYWxsYmFjayB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBjaGVja2JveFNlbGVjdChUWENoZWNrYm94KiBjaGVja2JveCk9MDsKK307CisKKworY2xhc3MgVFhDaGVja2JveCA6IHB1YmxpYyBUWFdpbmRvdywgcHVibGljIFRYRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgVFhDaGVja2JveChEaXNwbGF5KiBkcHlfLCBjb25zdCBjaGFyKiB0ZXh0XywgVFhDaGVja2JveENhbGxiYWNrKiBjYl8sCisgICAgICAgICAgICAgYm9vbCByYWRpb189ZmFsc2UsIFRYV2luZG93KiBwYXJlbnRfPTAsIGludCB3PTEsIGludCBoPTEpCisgICAgOiBUWFdpbmRvdyhkcHlfLCB3LCBoLCBwYXJlbnRfKSwgY2IoY2JfKSwgdGV4dCgwKSwKKyAgICAgIGJveFNpemUocmFkaW9fID8gMTIgOiAxMyksIGJveFBhZCg0KSwKKyAgICAgIGNoZWNrZWRfKGZhbHNlKSwgZGlzYWJsZWRfKGZhbHNlKSwgcmFkaW8ocmFkaW9fKQorICB7CisgICAgc2V0RXZlbnRIYW5kbGVyKHRoaXMpOworICAgIHNldFRleHQodGV4dF8pOworICAgIGdjID0gWENyZWF0ZUdDKGRweSwgd2luKCksIDAsIDApOworICAgIFhTZXRGb250KGRweSwgZ2MsIGRlZmF1bHRGb250KTsKKyAgICBhZGRFdmVudE1hc2soRXhwb3N1cmVNYXNrfCBCdXR0b25QcmVzc01hc2sgfCBCdXR0b25SZWxlYXNlTWFzayk7CisgIH0KKworICB2aXJ0dWFsIH5UWENoZWNrYm94KCkgeworICAgIFhGcmVlR0MoZHB5LCBnYyk7CisgICAgaWYgKHRleHQpIGZyZWUodGV4dCk7CisgIH0KKworICAvLyBzZXRUZXh0KCkgY2hhbmdlcyB0aGUgdGV4dCBpbiB0aGUgY2hlY2tib3guCisgIHZvaWQgc2V0VGV4dChjb25zdCBjaGFyKiB0ZXh0XykgeworICAgIGlmICh0ZXh0KSBmcmVlKHRleHQpOworICAgIHRleHQgPSBzdHJkdXAoKGNoYXIqKXRleHRfKTsKKyAgICBpbnQgdGV4dFdpZHRoID0gWFRleHRXaWR0aChkZWZhdWx0RlMsIHRleHQsIHN0cmxlbih0ZXh0KSk7CisgICAgaW50IHRleHRIZWlnaHQgPSAoZGVmYXVsdEZTLT5hc2NlbnQgKyBkZWZhdWx0RlMtPmRlc2NlbnQpOworICAgIGludCBuZXdXaWR0aCA9IF9fcmZibWF4KHdpZHRoKCksIHRleHRXaWR0aCArIHhQYWQqMiArIGJveFBhZCoyICsgYm94U2l6ZSk7CisgICAgaW50IG5ld0hlaWdodCA9IF9fcmZibWF4KGhlaWdodCgpLCB0ZXh0SGVpZ2h0ICsgeVBhZCoyKTsKKyAgICBpZiAod2lkdGgoKSA8IG5ld1dpZHRoIHx8IGhlaWdodCgpIDwgbmV3SGVpZ2h0KSB7CisgICAgICByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCk7CisgICAgfQorICB9CisKKyAgLy8gY2hlY2tlZCgpIHNldHMgb3IgcXVlcmllcyB0aGUgc3RhdGUgb2YgdGhlIGNoZWNrYm94CisgIHZvaWQgY2hlY2tlZChib29sIGIpIHsgY2hlY2tlZF8gPSBiOyBwYWludCgpOyB9CisgIGJvb2wgY2hlY2tlZCgpIHsgcmV0dXJuIGNoZWNrZWRfOyB9CisKKyAgLy8gZGlzYWJsZWQoKSBzZXRzIG9yIHF1ZXJpZXMgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBjaGVja2JveC4gIEEgZGlzYWJsZWQKKyAgLy8gY2hlY2tib3ggY2Fubm90IGJlIGNoYW5nZWQgdmlhIHRoZSB1c2VyIGludGVyZmFjZS4KKyAgdm9pZCBkaXNhYmxlZChib29sIGIpIHsgZGlzYWJsZWRfID0gYjsgcGFpbnQoKTsgfQorICBib29sIGRpc2FibGVkKCkgeyByZXR1cm4gZGlzYWJsZWRfOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgcGFpbnQoKSB7CisgICAgaWYgKGRpc2FibGVkXykKKyAgICAgIGRyYXdCZXZlbChnYywgeFBhZCArIGJveFBhZCwgKGhlaWdodCgpIC0gYm94U2l6ZSkgLyAyLCBib3hTaXplLCBib3hTaXplLAorICAgICAgICAgICAgICAgIGJldmVsLCBkaXNhYmxlZEJnLCBkYXJrQmcsIGxpZ2h0QmcsIHJhZGlvKTsKKyAgICBlbHNlCisgICAgICBkcmF3QmV2ZWwoZ2MsIHhQYWQgKyBib3hQYWQsIChoZWlnaHQoKSAtIGJveFNpemUpIC8gMiwgYm94U2l6ZSwgYm94U2l6ZSwKKyAgICAgICAgICAgICAgICBiZXZlbCwgZW5hYmxlZEJnLCBkYXJrQmcsIGxpZ2h0QmcsIHJhZGlvKTsKKyAgICBYU2V0QmFja2dyb3VuZChkcHksIGdjLCBkaXNhYmxlZF8gPyBkaXNhYmxlZEJnIDogZW5hYmxlZEJnKTsKKyAgICBYU2V0Rm9yZWdyb3VuZChkcHksIGdjLCBkaXNhYmxlZF8gPyBkaXNhYmxlZEZnIDogZGVmYXVsdEZnKTsKKyAgICBpZiAoY2hlY2tlZF8pIHsKKyAgICAgIFBpeG1hcCBpY29uID0gcmFkaW8gPyBkb3QgOiB0aWNrOworICAgICAgaW50IGljb25TaXplID0gcmFkaW8gPyBkb3RTaXplIDogdGlja1NpemU7CisgICAgICBYQ29weVBsYW5lKGRweSwgaWNvbiwgd2luKCksIGdjLCAwLCAwLCBpY29uU2l6ZSwgaWNvblNpemUsCisgICAgICAgICAgICAgICAgIHhQYWQgKyBib3hQYWQgKyAoYm94U2l6ZSAtIGljb25TaXplKSAvIDIsCisgICAgICAgICAgICAgICAgIChoZWlnaHQoKSAtIGljb25TaXplKSAvIDIsIDEpOworICAgIH0KKyAgICBYRHJhd1N0cmluZyhkcHksIHdpbigpLCBnYywgeFBhZCArIGJveFNpemUgKyBib3hQYWQqMiwKKyAgICAgICAgICAgICAgICAoaGVpZ2h0KCkgKyBkZWZhdWx0RlMtPmFzY2VudCAtIGRlZmF1bHRGUy0+ZGVzY2VudCkgLyAyLAorICAgICAgICAgICAgICAgIHRleHQsIHN0cmxlbih0ZXh0KSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnQoVFhXaW5kb3cqIHcsIFhFdmVudCogZXYpIHsKKyAgICBzd2l0Y2ggKGV2LT50eXBlKSB7CisgICAgY2FzZSBFeHBvc2U6CisgICAgICBwYWludCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0b25QcmVzczoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQnV0dG9uUmVsZWFzZToKKyAgICAgIGlmIChldi0+eGJ1dHRvbi54ID49IDAgJiYgZXYtPnhidXR0b24ueCA8IHdpZHRoKCkgJiYKKyAgICAgICAgICBldi0+eGJ1dHRvbi55ID49IDAgJiYgZXYtPnhidXR0b24ueSA8IGhlaWdodCgpKSB7CisgICAgICAgIGlmICghZGlzYWJsZWRfKSB7CisgICAgICAgICAgY2hlY2tlZF8gPSAhY2hlY2tlZF87CisgICAgICAgICAgaWYgKGNiKSBjYi0+Y2hlY2tib3hTZWxlY3QodGhpcyk7CisgICAgICAgICAgcGFpbnQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgVFhDaGVja2JveENhbGxiYWNrKiBjYjsKKyAgR0MgZ2M7CisgIGNoYXIqIHRleHQ7CisgIGludCBib3hTaXplOworICBpbnQgYm94UGFkOworICBib29sIGNoZWNrZWRfOworICBib29sIGRpc2FibGVkXzsKKyAgYm9vbCByYWRpbzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWERpYWxvZy5oIGIvdW5peC90eC9UWERpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDYwMWMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3R4L1RYRGlhbG9nLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWERpYWxvZy5oCisvLworLy8gQSBUWERpYWxvZyBpcyBhIHBvcC11cCBkaWFsb2cgd2luZG93LiAgVGhlIGRpYWxvZyBjYW4gYmUgbWFkZSB2aXNpYmxlIGJ5CisvLyBjYWxsaW5nIGl0cyBzaG93KCkgbWV0aG9kLiAgRGlhbG9ncyBjYW4gYmUgbW9kYWwgb3Igbm9uLW1vZGFsLiAgRm9yIGEgbW9kYWwKKy8vIGRpYWxvZyBib3gsIHRoZSBzaG93KCkgbWV0aG9kIG9ubHkgcmV0dXJucyB3aGVuIHRoZSBkaWFsb2cgYm94IGhhcyBiZWVuCisvLyBkaXNtaXNzZWQuICBGb3IgYSBub24tbW9kYWwgZGlhbG9nIGJveCwgdGhlIHNob3coKSBtZXRob2QgcmV0dXJucworLy8gaW1tZWRpYXRlbHkuCisvLworCisjaWZuZGVmIF9fVFhESUFMT0dfSF9fCisjZGVmaW5lIF9fVFhESUFMT0dfSF9fCisKKyNpbmNsdWRlICJUWFdpbmRvdy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8vIFhYWCBMeW54L09TIDIuMzogcHJvdG9zIGZvciBiemVybygpLCBzZWxlY3QoKQorI2lmZGVmIEx5bngKKyNpbmNsdWRlIDxzeXMvcHJvdG8uaD4KKyNlbmRpZgorCitjbGFzcyBUWERpYWxvZyA6IHB1YmxpYyBUWFdpbmRvdywgcHVibGljIFRYRGVsZXRlV2luZG93Q2FsbGJhY2sgeworcHVibGljOgorICBUWERpYWxvZyhEaXNwbGF5KiBkcHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgYm9vbCBtb2RhbF89ZmFsc2UpCisgICAgOiBUWFdpbmRvdyhkcHksIHdpZHRoLCBoZWlnaHQpLCBkb25lKGZhbHNlKSwgb2soZmFsc2UpLCBtb2RhbChtb2RhbF8pCisgIHsKKyAgICB0b3BsZXZlbChuYW1lLCB0aGlzKTsKKyAgICByZXNpemUod2lkdGgsIGhlaWdodCk7CisgIH0KKworICB2aXJ0dWFsIH5UWERpYWxvZygpIHt9CisKKyAgLy8gc2hvdygpIG1ha2VzIHRoZSBkaWFsb2cgdmlzaWJsZS4gIEZvciBhIG1vZGFsIGRpYWxvZyBib3gsIHRoaXMgcHJvY2Vzc2VzIFgKKyAgLy8gZXZlbnRzIHVudGlsIHRoZSBkb25lIGZsYWcgaGFzIGJlZW4gc2V0LCBhZnRlciB3aGljaCBpdCByZXR1cm5zIHRoZSB2YWx1ZQorICAvLyBvZiB0aGUgb2sgZmxhZy4gIEZvciBhIG5vbi1tb2RhbCBkaWFsb2cgYm94IGl0IGFsd2F5cyByZXR1cm5zIHRydWUKKyAgLy8gaW1tZWRpYXRlbHkuCisgIGJvb2wgc2hvdygpIHsKKyAgICBvayA9IGZhbHNlOworICAgIGRvbmUgPSBmYWxzZTsKKyAgICBpbml0RGlhbG9nKCk7CisgICAgcmFpc2UoKTsKKyAgICBtYXAoKTsKKyAgICBpZiAobW9kYWwpIHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIFRYV2luZG93OjpoYW5kbGVYRXZlbnRzKGRweSk7CisgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgcmV0dXJuIG9rOworICAgICAgICB9CisgICAgICAgIGZkX3NldCByZmRzOworICAgICAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICAgICAgRkRfU0VUKENvbm5lY3Rpb25OdW1iZXIoZHB5KSwgJnJmZHMpOworICAgICAgICBpbnQgbiA9IHNlbGVjdChGRF9TRVRTSVpFLCAmcmZkcywgMCwgMCwgMCk7CisgICAgICAgIGlmIChuIDwgMCkgdGhyb3cgcmRyOjpTeXN0ZW1FeGNlcHRpb24oInNlbGVjdCIsZXJybm8pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIGluaXREaWFsb2coKSBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIGRlcml2ZWQgY2xhc3MuICBUeXBpY2FsbHkgaXQgaXMgdXNlZAorICAvLyB0byBtYWtlIHN1cmUgdGhhdCBjaGVja2JveGVzIGhhdmUgdGhlIHJpZ2h0IHN0YXRlLCBldGMuCisgIHZpcnR1YWwgdm9pZCBpbml0RGlhbG9nKCkge30KKworICAvLyByZXNpemUoKSBpcyBvdmVyaWRkZW4gaGVyZSB0byByZS1jZW50ZXIgdGhlIGRpYWxvZworICB2b2lkIHJlc2l6ZShpbnQgdywgaW50IGgpIHsKKyAgICBUWFdpbmRvdzo6cmVzaXplKHcsaCk7CisgICAgaW50IGRweVdpZHRoID0gV2lkdGhPZlNjcmVlbihEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5KGRweSkpOworICAgIGludCBkcHlIZWlnaHQgPSBIZWlnaHRPZlNjcmVlbihEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5KGRweSkpOworICAgIHNldFVTUG9zaXRpb24oKGRweVdpZHRoIC0gd2lkdGgoKSAtIDEwKSAvIDIsIChkcHlIZWlnaHQgLSBoZWlnaHQoKSAtIDMwKSAvIDIpOworICB9ICAgIAorCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBkZWxldGVXaW5kb3coVFhXaW5kb3cqIHcpIHsKKyAgICBvayA9IGZhbHNlOworICAgIGRvbmUgPSB0cnVlOworICAgIHVubWFwKCk7CisgIH0KKworICBib29sIGRvbmU7CisgIGJvb2wgb2s7CisgIGJvb2wgbW9kYWw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdHgvVFhFbnRyeS5oIGIvdW5peC90eC9UWEVudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4NWE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdHgvVFhFbnRyeS5oCkBAIC0wLDAgKzEsMTkxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gVFhFbnRyeS5oCisvLworLy8gQSBUWEVudHJ5IGFsbG93cyB5b3UgdG8gZW50ZXIgYSBzaW5nbGUgbGluZSBvZiB0ZXh0IGluIGEgd2luZG93LiAgVGhlIGVudHJ5CisvLyBtdXN0IGJlIHRhbGwgZW5vdWdoIHRvIGNvbnRhaW4gYSBsaW5lIG9mIHRleHQgLSBpZiBub3QgdGhlbiBpdCB3aWxsIGJlCisvLyByZXNpemVkIGFwcHJvcHJpYXRlbHkuICBJZiB0aGUgcGFzc3dkIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3RvciBpcyB0cnVlLAorLy8gdGhlbiB0aGUgdGV4dCBpbiB0aGUgZW50cnkgd2lsbCBiZSByZXBsYWNlZCBieSBhc3Rlcmlza3Mgb24gdGhlIHNjcmVlbi4KKy8vCisKKyNpZm5kZWYgX19UWEVOVFJZX0hfXworI2RlZmluZSBfX1RYRU5UUllfSF9fCisKKyNpbmNsdWRlICJUWFdpbmRvdy5oIgorI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KKworI2lmbmRlZiBYS19JU09fTGVmdF9UYWIKKyNkZWZpbmUJWEtfSVNPX0xlZnRfVGFiCQkJCQkweEZFMjAKKyNlbmRpZgorI2lmbmRlZiBYS19LUF9EZWxldGUKKyNkZWZpbmUgWEtfS1BfRGVsZXRlCQkJCQkweEZGOUYKKyNlbmRpZgorCisvLyBUWEVudHJ5Q2FsbGJhY2sncyBlbnRyeUNhbGxiYWNrKCkgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIG9uZSBvZiB0aHJlZSBzcGVjaWFsCisvLyBrZXkgcHJlc3NlcyBoYXZlIGhhcHBlbmVkOiBFbnRlci9SZXR1cm4sIGZvcndhcmQgdGFiLCBvciBiYWNrd2FyZCB0YWIuCitjbGFzcyBUWEVudHJ5OworY2xhc3MgVFhFbnRyeUNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgZW51bSBEZXRhaWwgeyBFTlRFUiwgTkVYVF9GT0NVUywgUFJFVl9GT0NVUyB9OworICB2aXJ0dWFsIHZvaWQgZW50cnlDYWxsYmFjayhUWEVudHJ5KiBlbnRyeSwgRGV0YWlsIGRldGFpbCwgVGltZSB0aW1lKT0wOworfTsKKworCitjbGFzcyBUWEVudHJ5IDogcHVibGljIFRYV2luZG93LCBwdWJsaWMgVFhFdmVudEhhbmRsZXIgeworcHVibGljOgorCisgIFRYRW50cnkoRGlzcGxheSogZHB5XywgVFhFbnRyeUNhbGxiYWNrKiBjYl89MCwKKyAgICAgICAgICBUWFdpbmRvdyogcGFyZW50Xz0wLCBib29sIHBhc3N3ZF89ZmFsc2UsIGludCB3PTEsIGludCBoPTEpCisgICAgOiBUWFdpbmRvdyhkcHlfLCB3LCBoLCBwYXJlbnRfKSwgY2IoY2JfKSwKKyAgICAgIHBhc3N3ZChwYXNzd2RfKSwgZGlzYWJsZWRfKGZhbHNlKSwgZ290Rm9jdXMoZmFsc2UpCisgIHsKKyAgICBzZXRFdmVudEhhbmRsZXIodGhpcyk7CisgICAgZ2MgPSBYQ3JlYXRlR0MoZHB5LCB3aW4oKSwgMCwgMCk7CisgICAgYWRkRXZlbnRNYXNrKEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8IEZvY3VzQ2hhbmdlTWFzaworICAgICAgICAgICAgICAgICB8IEJ1dHRvblByZXNzTWFzayk7CisgICAgdGV4dFswXSA9IDA7CisgICAgaW50IHRleHRIZWlnaHQgPSAoZGVmYXVsdEZTLT5hc2NlbnQgKyBkZWZhdWx0RlMtPmRlc2NlbnQpOworICAgIGludCBuZXdIZWlnaHQgPSBfX3JmYm1heChoZWlnaHQoKSwgdGV4dEhlaWdodCArIHlQYWQqMiArIGJldmVsKjIpOworICAgIGlmIChoZWlnaHQoKSA8IG5ld0hlaWdodCkgeworICAgICAgcmVzaXplKHdpZHRoKCksIG5ld0hlaWdodCk7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB+VFhFbnRyeSgpIHsKKyAgICBYRnJlZUdDKGRweSwgZ2MpOworICAgIC8vIG92ZXJ3cml0ZSBtZW1vcnkgdXNlZCB0byBzdG9yZSBwYXNzd29yZCAtIG5vdCBjcml0aWNhbCwgYnV0IGNhbiBhdm9pZAorICAgIC8vIGFjY2lkZW50YWwgZXhwb3N1cmUgb2YgYSBwYXNzd29yZCBpbiB1bmluaXRpYWxpc2VkIG1lbW9yeS4KKyAgICBpZiAocGFzc3dkKQorICAgICAgbWVtc2V0KHRleHQsIDAsIG1heExlbik7CisgIH0KKworICAvLyBnZXRUZXh0KCkgZ2V0cyB0aGUgdGV4dCBpbiB0aGUgZW50cnkuCisgIGNvbnN0IGNoYXIqIGdldFRleHQoKSB7IHJldHVybiB0ZXh0OyB9CisKKyAgLy8gc2V0VGV4dCgpIHNldHMgdGhlIHRleHQgaW4gdGhlIGVudHJ5LgorICB2b2lkIHNldFRleHQoY29uc3QgY2hhciogdGV4dF8pIHsKKyAgICBzdHJuY3B5KHRleHQsIHRleHRfLCBtYXhMZW4tMSk7CisgICAgdGV4dFttYXhMZW4tMV0gPSAwOworICAgIHBhaW50KCk7CisgIH0KKworICAvLyBkaXNhYmxlZCgpIHNldHMgb3IgcXVlcmllcyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGVudHJ5LiAgQSBkaXNhYmxlZAorICAvLyBlbnRyeSBjYW5ub3QgaGF2ZSB0ZXh0IGVudGVyZWQgaW50byBpdC4KKyAgdm9pZCBkaXNhYmxlZChib29sIGIpIHsgZGlzYWJsZWRfID0gYjsgcGFpbnQoKTsgfQorICBib29sIGRpc2FibGVkKCkgeyByZXR1cm4gZGlzYWJsZWRfOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgcGFpbnQoKSB7CisgICAgaWYgKGRpc2FibGVkXykKKyAgICAgIGRyYXdCZXZlbChnYywgMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCksIGJldmVsLCBkaXNhYmxlZEJnLGRhcmtCZyxsaWdodEJnKTsKKyAgICBlbHNlCisgICAgICBkcmF3QmV2ZWwoZ2MsIDAsIDAsIHdpZHRoKCksIGhlaWdodCgpLCBiZXZlbCwgZW5hYmxlZEJnLCBkYXJrQmcsbGlnaHRCZyk7CisgICAgY2hhciogc3RyID0gdGV4dDsKKyAgICBjaGFyIHN0YXJzW21heExlbl07CisgICAgaWYgKHBhc3N3ZCkgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClzdHJsZW4odGV4dCk7IGkrKykgc3RhcnNbaV0gPSAnKic7CisgICAgICBzdGFyc1tpXSA9IDA7CisgICAgICBzdHIgPSBzdGFyczsKKyAgICB9CisgICAgaW50IHR3ID0gWFRleHRXaWR0aChkZWZhdWx0RlMsIHN0ciwgc3RybGVuKHN0cikpOworICAgIGludCBzdGFydHggPSBiZXZlbCArIHhQYWQ7CisgICAgaWYgKHN0YXJ0eCArIHR3ID4gd2lkdGgoKSAtIDIqYmV2ZWwpIHsKKyAgICAgIHN0YXJ0eCA9IHdpZHRoKCkgLSAyKmJldmVsIC0gdHc7CisgICAgfQorICAgIFhEcmF3U3RyaW5nKGRweSwgd2luKCksIGRlZmF1bHRHQywgc3RhcnR4LAorICAgICAgICAgICAgICAgIChoZWlnaHQoKSArIGRlZmF1bHRGUy0+YXNjZW50IC0gZGVmYXVsdEZTLT5kZXNjZW50KSAvIDIsCisgICAgICAgICAgICAgICAgc3RyLCBzdHJsZW4oc3RyKSk7CisgICAgaWYgKCFkaXNhYmxlZF8gJiYgZ290Rm9jdXMpCisgICAgICBYRHJhd0xpbmUoZHB5LCB3aW4oKSwgZGVmYXVsdEdDLCBzdGFydHgrdHcsCisgICAgICAgICAgICAgICAgKGhlaWdodCgpIC0gZGVmYXVsdEZTLT5hc2NlbnQgLSBkZWZhdWx0RlMtPmRlc2NlbnQpIC8gMiwKKyAgICAgICAgICAgICAgICBzdGFydHgrdHcsCisgICAgICAgICAgICAgICAgKGhlaWdodCgpICsgZGVmYXVsdEZTLT5hc2NlbnQgKyBkZWZhdWx0RlMtPmRlc2NlbnQpIC8gMik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnQoVFhXaW5kb3cqIHcsIFhFdmVudCogZXYpIHsKKyAgICBzd2l0Y2ggKGV2LT50eXBlKSB7CisgICAgY2FzZSBFeHBvc2U6CisgICAgICBwYWludCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZvY3VzSW46CisgICAgICBnb3RGb2N1cyA9IHRydWU7CisgICAgICBwYWludCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZvY3VzT3V0OgorICAgICAgZ290Rm9jdXMgPSBmYWxzZTsKKyAgICAgIHBhaW50KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQnV0dG9uUHJlc3M6CisgICAgICBpZiAoIWRpc2FibGVkXykKKyAgICAgICAgWFNldElucHV0Rm9jdXMoZHB5LCB3aW4oKSwgUmV2ZXJ0VG9QYXJlbnQsIGV2LT54YnV0dG9uLnRpbWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEtleVByZXNzOgorICAgICAgeworICAgICAgICBpZiAoZGlzYWJsZWRfIHx8ICFnb3RGb2N1cykgYnJlYWs7CisgICAgICAgIEtleVN5bSBrZXlzeW07CisgICAgICAgIFhDb21wb3NlU3RhdHVzIGNvbXBvc2U7CisgICAgICAgIGNoYXIgYnVmWzEwXTsKKyAgICAgICAgaW50IGNvdW50ID0gWExvb2t1cFN0cmluZygmZXYtPnhrZXksIGJ1ZiwgMTAsICZrZXlzeW0sICZjb21wb3NlKTsKKyAgICAgICAgaWYgKGNvdW50ID49IDEgJiYgYnVmWzBdID49ICcgJyAmJiBidWZbMF0gPD0gJ34nKSB7CisgICAgICAgICAgaWYgKHN0cmxlbih0ZXh0KSArIGNvdW50ID49IG1heExlbikgeworICAgICAgICAgICAgWEJlbGwoZHB5LCAwKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RybmNhdCh0ZXh0LCBidWYsIGNvdW50KTsKKyAgICAgICAgICAgIHBhaW50KCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA9PSBYS19CYWNrU3BhY2UgfHwga2V5c3ltID09IFhLX0RlbGV0ZSB8fAorICAgICAgICAgICAgICAgICAgIGtleXN5bSA9PSBYS19LUF9EZWxldGUpIHsKKyAgICAgICAgICBpZiAoc3RybGVuKHRleHQpID4gMCkgeworICAgICAgICAgICAgdGV4dFtzdHJsZW4odGV4dCktMV0gPSAwOworICAgICAgICAgICAgcGFpbnQoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfS1BfRW50ZXIgfHwKKyAgICAgICAgICAgICAgICAgICBrZXlzeW0gPT0gWEtfTGluZWZlZWQpIHsKKyAgICAgICAgICBpZiAoY2IpIGNiLT5lbnRyeUNhbGxiYWNrKHRoaXMsIFRYRW50cnlDYWxsYmFjazo6RU5URVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi0+eGtleS50aW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICgoa2V5c3ltID09IFhLX1RhYiB8fCBrZXlzeW0gPT0gWEtfS1BfVGFiKQorICAgICAgICAgICAgICAgICAgICYmICEoZXYtPnhrZXkuc3RhdGUgJiBTaGlmdE1hc2spKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNiKSBjYi0+ZW50cnlDYWxsYmFjayh0aGlzLCBUWEVudHJ5Q2FsbGJhY2s6Ok5FWFRfRk9DVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi0+eGtleS50aW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKGtleXN5bSA9PSBYS19UYWIgfHwga2V5c3ltID09IFhLX0tQX1RhYikKKyAgICAgICAgICAgICAgICAgICAgJiYgKGV2LT54a2V5LnN0YXRlICYgU2hpZnRNYXNrKSkKKyAgICAgICAgICAgICAgICAgICB8fCBrZXlzeW0gPT0gWEtfSVNPX0xlZnRfVGFiKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNiKSBjYi0+ZW50cnlDYWxsYmFjayh0aGlzLCBUWEVudHJ5Q2FsbGJhY2s6OlBSRVZfRk9DVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi0+eGtleS50aW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBHQyBnYzsKKyAgZW51bSB7IG1heExlbiA9IDI1NiB9OworICBjaGFyIHRleHRbbWF4TGVuXTsKKyAgVFhFbnRyeUNhbGxiYWNrKiBjYjsKKyAgYm9vbCBwYXNzd2Q7CisgIGJvb2wgZGlzYWJsZWRfOworICBib29sIGdvdEZvY3VzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3R4L1RYSW1hZ2UuY3h4IGIvdW5peC90eC9UWEltYWdlLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmE2ODI4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWEltYWdlLmN4eApAQCAtMCwwICsxLDM1MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFRYSW1hZ2UuY3h4CisvLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxyZmIvVHJhbnNJbWFnZUdldHRlci5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisjaW5jbHVkZSAiVFhXaW5kb3cuaCIKKyNpbmNsdWRlICJUWEltYWdlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK3N0YXRpYyByZmI6OkxvZ1dyaXRlciB2bG9nKCJUWEltYWdlIik7CisKK1RYSW1hZ2U6OlRYSW1hZ2UoRGlzcGxheSogZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaXN1YWwqIHZpc18sIGludCBkZXB0aF8pCisgIDogeGltKDApLCBkcHkoZCksIHZpcyh2aXNfKSwgZGVwdGgoZGVwdGhfKSwgdGlnKDApLCBjdWJlKDApCit7CisjaWZkZWYgSEFWRV9NSVRTSE0KKyAgc2htaW5mbyA9IDA7CisjZW5kaWYKKyAgd2lkdGhfID0gd2lkdGg7CisgIGhlaWdodF8gPSBoZWlnaHQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgY29sb3VyTWFwW2ldLnIgPSBjb2xvdXJNYXBbaV0uZyA9IGNvbG91ck1hcFtpXS5iID0gMDsKKworICBpZiAoIXZpcykKKyAgICB2aXMgPSBEZWZhdWx0VmlzdWFsKGRweSxEZWZhdWx0U2NyZWVuKGRweSkpOworICBpZiAoIWRlcHRoKQorICAgIGRlcHRoID0gRGVmYXVsdERlcHRoKGRweSxEZWZhdWx0U2NyZWVuKGRweSkpOworCisgIGNyZWF0ZVhJbWFnZSgpOworICBnZXROYXRpdmVQaXhlbEZvcm1hdCh2aXMsIGRlcHRoKTsKKyAgY29sb3VybWFwID0gdGhpczsKKyAgZm9ybWF0LmJwcCA9IDA7ICAvLyBqdXN0IG1ha2UgaXQgZGlmZmVyZW50IHRvIGFueSB2YWxpZCBmb3JtYXQsIHNvIHRoYXQuLi4KKyAgc2V0UEYobmF0aXZlUEYpOyAvLyAuLi5zZXRQRigpIGFsd2F5cyB3b3JrcworfQorCitUWEltYWdlOjp+VFhJbWFnZSgpCit7CisgIGlmIChkYXRhICE9IChyZHI6OlU4Kil4aW0tPmRhdGEpIGRlbGV0ZSBbXSBkYXRhOworICBkZXN0cm95WEltYWdlKCk7CisgIGRlbGV0ZSB0aWc7CisgIGRlbGV0ZSBjdWJlOworfQorCit2b2lkIFRYSW1hZ2U6OnJlc2l6ZShpbnQgdywgaW50IGgpCit7CisgIGlmICh3ID09IHdpZHRoKCkgJiYgaCA9PSBoZWlnaHQoKSkgcmV0dXJuOworCisgIGludCBvbGRTdHJpZGVCeXRlcyA9IGdldFN0cmlkZSgpICogKGZvcm1hdC5icHAvOCk7CisgIGludCByb3dzVG9Db3B5ID0gX19yZmJtaW4oaCwgaGVpZ2h0KCkpOworICBpbnQgYnl0ZXNQZXJSb3cgPSBfX3JmYm1pbih3LCB3aWR0aCgpKSAqIChmb3JtYXQuYnBwLzgpOworICByZHI6OlU4KiBvbGREYXRhID0gMDsKKyAgYm9vbCBhbGxvY0RhdGEgPSBmYWxzZTsKKworICBpZiAoZGF0YSAhPSAocmRyOjpVOCopeGltLT5kYXRhKSB7CisgICAgb2xkRGF0YSA9IChyZHI6OlU4KilkYXRhOworICAgIGFsbG9jRGF0YSA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgb2xkRGF0YSA9IG5ldyByZHI6OlU4W3hpbS0+Ynl0ZXNfcGVyX2xpbmUgKiBoZWlnaHQoKV07CisgICAgbWVtY3B5KG9sZERhdGEsIHhpbS0+ZGF0YSwgeGltLT5ieXRlc19wZXJfbGluZSAqIGhlaWdodCgpKTsKKyAgfQorCisgIGRlc3Ryb3lYSW1hZ2UoKTsKKyAgd2lkdGhfID0gdzsKKyAgaGVpZ2h0XyA9IGg7CisgIGNyZWF0ZVhJbWFnZSgpOworCisgIGlmIChhbGxvY0RhdGEpCisgICAgZGF0YSA9IG5ldyByZHI6OlU4W3dpZHRoKCkgKiBoZWlnaHQoKSAqIChmb3JtYXQuYnBwLzgpXTsKKyAgZWxzZQorICAgIGRhdGEgPSAocmRyOjpVOCopeGltLT5kYXRhOworCisgIGludCBuZXdTdHJpZGVCeXRlcyA9IGdldFN0cmlkZSgpICogKGZvcm1hdC5icHAvOCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93c1RvQ29weTsgaSsrKQorICAgIG1lbWNweSgocmRyOjpVOCopZGF0YSArIG5ld1N0cmlkZUJ5dGVzICogaSwgb2xkRGF0YSArIG9sZFN0cmlkZUJ5dGVzICogaSwKKyAgICAgICAgICAgYnl0ZXNQZXJSb3cpOworICBkZWxldGUgW10gb2xkRGF0YTsKK30KKwordm9pZCBUWEltYWdlOjpzZXRQRihjb25zdCBQaXhlbEZvcm1hdCYgbmV3UEYpCit7CisgIGlmIChuZXdQRi5lcXVhbChmb3JtYXQpKSByZXR1cm47CisgIGZvcm1hdCA9IG5ld1BGOworCisgIGlmIChkYXRhICE9IChyZHI6OlU4Kil4aW0tPmRhdGEpIGRlbGV0ZSBbXSBkYXRhOworICBkZWxldGUgdGlnOworICB0aWcgPSAwOworCisgIGlmIChmb3JtYXQuZXF1YWwobmF0aXZlUEYpICYmIGZvcm1hdC50cnVlQ29sb3VyKSB7CisgICAgZGF0YSA9IChyZHI6OlU4Kil4aW0tPmRhdGE7CisgIH0gZWxzZSB7CisgICAgZGF0YSA9IG5ldyByZHI6OlU4W3dpZHRoKCkgKiBoZWlnaHQoKSAqIChmb3JtYXQuYnBwLzgpXTsKKyAgICB0aWcgPSBuZXcgVHJhbnNJbWFnZUdldHRlcigpOworICAgIHRpZy0+aW5pdCh0aGlzLCBuYXRpdmVQRiwgMCwgY3ViZSk7CisgIH0KK30KKworaW50IFRYSW1hZ2U6OmdldFN0cmlkZSgpIGNvbnN0Cit7CisgIGlmIChkYXRhID09IChyZHI6OlU4Kil4aW0tPmRhdGEpCisgICAgcmV0dXJuIHhpbS0+Ynl0ZXNfcGVyX2xpbmUgLyAoeGltLT5iaXRzX3Blcl9waXhlbCAvIDgpOworICBlbHNlCisgICAgcmV0dXJuIHdpZHRoKCk7Cit9CisKK3ZvaWQgVFhJbWFnZTo6cHV0KFdpbmRvdyB3aW4sIEdDIGdjLCBjb25zdCByZmI6OlJlY3QmIHIpCit7CisgIGlmIChyLmlzX2VtcHR5KCkpIHJldHVybjsKKyAgaW50IHggPSByLnRsLng7CisgIGludCB5ID0gci50bC55OworICBpbnQgdyA9IHIud2lkdGgoKTsKKyAgaW50IGggPSByLmhlaWdodCgpOworICBpZiAoZGF0YSAhPSAocmRyOjpVOCopeGltLT5kYXRhKSB7CisgICAgcmRyOjpVOCogeGltRGF0YVN0YXJ0ID0gKChyZHI6OlU4Kil4aW0tPmRhdGEgKyB5ICogeGltLT5ieXRlc19wZXJfbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHggKiAoeGltLT5iaXRzX3Blcl9waXhlbCAvIDgpKTsKKyAgICB0aWctPmdldEltYWdlKHhpbURhdGFTdGFydCwgciwKKyAgICAgICAgICAgICAgICAgIHhpbS0+Ynl0ZXNfcGVyX2xpbmUgLyAoeGltLT5iaXRzX3Blcl9waXhlbCAvIDgpKTsKKyAgfQorI2lmZGVmIEhBVkVfTUlUU0hNCisgIGlmICh1c2luZ1NobSgpKSB7CisgICAgWFNobVB1dEltYWdlKGRweSwgd2luLCBnYywgeGltLCB4LCB5LCB4LCB5LCB3LCBoLCBGYWxzZSk7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKyAgWFB1dEltYWdlKGRweSwgd2luLCBnYywgeGltLCB4LCB5LCB4LCB5LCB3LCBoKTsKK30KKwordm9pZCBUWEltYWdlOjpzZXRDb2xvdXJNYXBFbnRyaWVzKGludCBmaXJzdENvbG91ciwgaW50IG5Db2xvdXJzLCByZHI6OlUxNiogcmdicykKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29sb3VyczsgaSsrKSB7CisgICAgY29sb3VyTWFwW2ZpcnN0Q29sb3VyK2ldLnIgPSByZ2JzW2kqM107CisgICAgY29sb3VyTWFwW2ZpcnN0Q29sb3VyK2ldLmcgPSByZ2JzW2kqMysxXTsKKyAgICBjb2xvdXJNYXBbZmlyc3RDb2xvdXIraV0uYiA9IHJnYnNbaSozKzJdOworICB9Cit9CisKK3ZvaWQgVFhJbWFnZTo6dXBkYXRlQ29sb3VyTWFwKCkKK3sKKyAgdGlnLT5zZXRDb2xvdXJNYXBFbnRyaWVzKDAsIDAsIDApOworfQorCit2b2lkIFRYSW1hZ2U6Omxvb2t1cChpbnQgaW5kZXgsIGludCogciwgaW50KiBnLCBpbnQqIGIpCit7CisgICpyID0gY29sb3VyTWFwW2luZGV4XS5yOworICAqZyA9IGNvbG91ck1hcFtpbmRleF0uZzsKKyAgKmIgPSBjb2xvdXJNYXBbaW5kZXhdLmI7Cit9CisKKyNpZmRlZiBIQVZFX01JVFNITQorc3RhdGljIGJvb2wgY2F1Z2h0RXJyb3IgPSBmYWxzZTsKKworc3RhdGljIGludCBYU2htQXR0YWNoRXJyb3JIYW5kbGVyKERpc3BsYXkgKmRweSwgWEVycm9yRXZlbnQgKmVycm9yKQoreworICBjYXVnaHRFcnJvciA9IHRydWU7CisgIHJldHVybiAwOworfQorCitjbGFzcyBUWEltYWdlQ2xlYW51cCB7CitwdWJsaWM6CisgIHN0ZDo6bGlzdDxUWEltYWdlKj4gaW1hZ2VzOworICB+VFhJbWFnZUNsZWFudXAoKSB7CisgICAgd2hpbGUgKCFpbWFnZXMuZW1wdHkoKSkKKyAgICAgIGRlbGV0ZSBpbWFnZXMuZnJvbnQoKTsKKyAgfQorfTsKKworc3RhdGljIFRYSW1hZ2VDbGVhbnVwIGltYWdlQ2xlYW51cDsKKyNlbmRpZgorCit2b2lkIFRYSW1hZ2U6OmNyZWF0ZVhJbWFnZSgpCit7CisjaWZkZWYgSEFWRV9NSVRTSE0KKyAgaW50IG1ham9yLCBtaW5vcjsKKyAgQm9vbCBwaXhtYXBzOworCisgIGlmIChYU2htUXVlcnlWZXJzaW9uKGRweSwgJm1ham9yLCAmbWlub3IsICZwaXhtYXBzKSkgeworICAgIHNobWluZm8gPSBuZXcgWFNobVNlZ21lbnRJbmZvOworCisgICAgeGltID0gWFNobUNyZWF0ZUltYWdlKGRweSwgdmlzLCBkZXB0aCwgWlBpeG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgc2htaW5mbywgd2lkdGgoKSwgaGVpZ2h0KCkpOworCisgICAgaWYgKHhpbSkgeworICAgICAgc2htaW5mby0+c2htaWQgPSBzaG1nZXQoSVBDX1BSSVZBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW0tPmJ5dGVzX3Blcl9saW5lICogeGltLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENfQ1JFQVR8MDc3Nyk7CisKKyAgICAgIGlmIChzaG1pbmZvLT5zaG1pZCAhPSAtMSkgeworICAgICAgICBzaG1pbmZvLT5zaG1hZGRyID0geGltLT5kYXRhID0gKGNoYXIqKXNobWF0KHNobWluZm8tPnNobWlkLCAwLCAwKTsKKworICAgICAgICBpZiAoc2htaW5mby0+c2htYWRkciAhPSAoY2hhciAqKS0xKSB7CisKKyAgICAgICAgICBzaG1pbmZvLT5yZWFkT25seSA9IEZhbHNlOworCisgICAgICAgICAgWEVycm9ySGFuZGxlciBvbGRIZGxyID0gWFNldEVycm9ySGFuZGxlcihYU2htQXR0YWNoRXJyb3JIYW5kbGVyKTsKKyAgICAgICAgICBYU2htQXR0YWNoKGRweSwgc2htaW5mbyk7CisgICAgICAgICAgWFN5bmMoZHB5LCBGYWxzZSk7CisgICAgICAgICAgWFNldEVycm9ySGFuZGxlcihvbGRIZGxyKTsKKworICAgICAgICAgIGlmICghY2F1Z2h0RXJyb3IpIHsKKyAgICAgICAgICAgIHZsb2cuZGVidWcoIlVzaW5nIHNoYXJlZCBtZW1vcnkgWEltYWdlIik7CisgICAgICAgICAgICBpbWFnZUNsZWFudXAuaW1hZ2VzLnB1c2hfYmFjayh0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzaG1kdChzaG1pbmZvLT5zaG1hZGRyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2bG9nLmVycm9yKCJzaG1hdCBmYWlsZWQiKTsKKyAgICAgICAgICBwZXJyb3IoInNobWF0Iik7CisgICAgICAgIH0KKworICAgICAgICBzaG1jdGwoc2htaW5mby0+c2htaWQsIElQQ19STUlELCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZsb2cuZXJyb3IoInNobWdldCBmYWlsZWQiKTsKKyAgICAgICAgcGVycm9yKCJzaG1nZXQiKTsKKyAgICAgIH0KKworICAgICAgWERlc3Ryb3lJbWFnZSh4aW0pOworICAgICAgeGltID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgdmxvZy5lcnJvcigiWFNobUNyZWF0ZUltYWdlIGZhaWxlZCIpOworICAgIH0KKworICAgIGRlbGV0ZSBzaG1pbmZvOworICAgIHNobWluZm8gPSAwOworICB9CisjZW5kaWYKKworICB4aW0gPSBYQ3JlYXRlSW1hZ2UoZHB5LCB2aXMsIGRlcHRoLCBaUGl4bWFwLAorICAgICAgICAgICAgICAgICAgICAgMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCksIEJpdG1hcFBhZChkcHkpLCAwKTsKKworICB4aW0tPmRhdGEgPSAoY2hhciopbWFsbG9jKHhpbS0+Ynl0ZXNfcGVyX2xpbmUgKiB4aW0tPmhlaWdodCk7CisgIGlmICgheGltLT5kYXRhKSB7CisgICAgdmxvZy5lcnJvcigibWFsbG9jIGZhaWxlZCIpOworICAgIGV4aXQoMSk7CisgIH0KK30KKwordm9pZCBUWEltYWdlOjpkZXN0cm95WEltYWdlKCkKK3sKKyNpZmRlZiBIQVZFX01JVFNITQorICBpZiAoc2htaW5mbykgeworICAgIHZsb2cuZGVidWcoIkZyZWVpbmcgc2hhcmVkIG1lbW9yeSBYSW1hZ2UiKTsKKyAgICBzaG1kdChzaG1pbmZvLT5zaG1hZGRyKTsKKyAgICBzaG1jdGwoc2htaW5mby0+c2htaWQsIElQQ19STUlELCAwKTsKKyAgICBkZWxldGUgc2htaW5mbzsKKyAgICBzaG1pbmZvID0gMDsKKyAgICBpbWFnZUNsZWFudXAuaW1hZ2VzLnJlbW92ZSh0aGlzKTsKKyAgfQorI2VuZGlmCisgIC8vIFhEZXN0cm95SW1hZ2UoKSB3aWxsIGZyZWUoeGltLT5kYXRhKSBpZiBhcHByb3ByaWF0ZQorICBpZiAoeGltKSBYRGVzdHJveUltYWdlKHhpbSk7CisgIHhpbSA9IDA7Cit9CisKKworc3RhdGljIGJvb2wgc3VwcG9ydGVkQlBQKGludCBicHApIHsKKyAgcmV0dXJuIChicHAgPT0gOCB8fCBicHAgPT0gMTYgfHwgYnBwID09IDMyKTsKK30KKworc3RhdGljIGludCBkZXB0aDJicHAoRGlzcGxheSogZHB5LCBpbnQgZGVwdGgpCit7CisgIGludCBuZm9ybWF0czsKKyAgWFBpeG1hcEZvcm1hdFZhbHVlcyogZm9ybWF0ID0gWExpc3RQaXhtYXBGb3JtYXRzKGRweSwgJm5mb3JtYXRzKTsKKworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG5mb3JtYXRzOyBpKyspCisgICAgaWYgKGZvcm1hdFtpXS5kZXB0aCA9PSBkZXB0aCkgYnJlYWs7CisKKyAgaWYgKGkgPT0gbmZvcm1hdHMgfHwgIXN1cHBvcnRlZEJQUChmb3JtYXRbaV0uYml0c19wZXJfcGl4ZWwpKQorICAgIHRocm93IHJmYjo6RXhjZXB0aW9uKCJFcnJvcjogY291bGRuJ3QgZmluZCBzdWl0YWJsZSBwaXhtYXAgZm9ybWF0Iik7CisKKyAgaW50IGJwcCA9IGZvcm1hdFtpXS5iaXRzX3Blcl9waXhlbDsKKyAgWEZyZWUoZm9ybWF0KTsKKyAgcmV0dXJuIGJwcDsKK30KKwordm9pZCBUWEltYWdlOjpnZXROYXRpdmVQaXhlbEZvcm1hdChWaXN1YWwqIHZpcywgaW50IGRlcHRoKQoreworICBjdWJlID0gMDsKKyAgbmF0aXZlUEYuZGVwdGggPSBkZXB0aDsKKyAgbmF0aXZlUEYuYnBwID0gZGVwdGgyYnBwKGRweSwgZGVwdGgpOworICBuYXRpdmVQRi5iaWdFbmRpYW4gPSAoSW1hZ2VCeXRlT3JkZXIoZHB5KSA9PSBNU0JGaXJzdCk7CisgIG5hdGl2ZVBGLnRydWVDb2xvdXIgPSAodmlzLT5jX2NsYXNzID09IFRydWVDb2xvcik7CisKKyAgdmxvZy5pbmZvKCJVc2luZyBkZWZhdWx0IGNvbG9ybWFwIGFuZCB2aXN1YWwsICVzZGVwdGggJWQuIiwKKyAgICAgICAgICAgICh2aXMtPmNfY2xhc3MgPT0gVHJ1ZUNvbG9yKSA/ICJUcnVlQ29sb3IsICIgOgorICAgICAgICAgICAgKCh2aXMtPmNfY2xhc3MgPT0gUHNldWRvQ29sb3IpID8gIlBzZXVkb0NvbG9yLCAiIDogIiIpLAorICAgICAgICAgICAgZGVwdGgpOworCisgIGlmIChuYXRpdmVQRi50cnVlQ29sb3VyKSB7CisKKyAgICBuYXRpdmVQRi5yZWRTaGlmdCAgID0gZmZzKHZpcy0+cmVkX21hc2spICAgLSAxOworICAgIG5hdGl2ZVBGLmdyZWVuU2hpZnQgPSBmZnModmlzLT5ncmVlbl9tYXNrKSAtIDE7CisgICAgbmF0aXZlUEYuYmx1ZVNoaWZ0ICA9IGZmcyh2aXMtPmJsdWVfbWFzaykgIC0gMTsKKyAgICBuYXRpdmVQRi5yZWRNYXggICA9IHZpcy0+cmVkX21hc2sgICA+PiBuYXRpdmVQRi5yZWRTaGlmdDsKKyAgICBuYXRpdmVQRi5ncmVlbk1heCA9IHZpcy0+Z3JlZW5fbWFzayA+PiBuYXRpdmVQRi5ncmVlblNoaWZ0OworICAgIG5hdGl2ZVBGLmJsdWVNYXggID0gdmlzLT5ibHVlX21hc2sgID4+IG5hdGl2ZVBGLmJsdWVTaGlmdDsKKworICB9IGVsc2UgeworCisgICAgWENvbG9yIHhjWzI1Nl07CisgICAgY3ViZSA9IG5ldyByZmI6OkNvbG91ckN1YmUoNiw2LDYpOworICAgIGludCByOworICAgIGZvciAociA9IDA7IHIgPCBjdWJlLT5uUmVkOyByKyspIHsKKyAgICAgIGZvciAoaW50IGcgPSAwOyBnIDwgY3ViZS0+bkdyZWVuOyBnKyspIHsKKyAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjdWJlLT5uQmx1ZTsgYisrKSB7CisgICAgICAgICAgaW50IGkgPSAociAqIGN1YmUtPm5HcmVlbiArIGcpICogY3ViZS0+bkJsdWUgKyBiOworICAgICAgICAgIHhjW2ldLnJlZCA9ICAgciAqIDY1NTM1IC8gKGN1YmUtPm5SZWQtMSk7CisgICAgICAgICAgeGNbaV0uZ3JlZW4gPSBnICogNjU1MzUgLyAoY3ViZS0+bkdyZWVuLTEpOworICAgICAgICAgIHhjW2ldLmJsdWUgPSAgYiAqIDY1NTM1IC8gKGN1YmUtPm5CbHVlLTEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgVFhXaW5kb3c6OmdldENvbG91cnMoZHB5LCB4YywgY3ViZS0+c2l6ZSgpKTsKKworICAgIGZvciAociA9IDA7IHIgPCBjdWJlLT5uUmVkOyByKyspIHsKKyAgICAgIGZvciAoaW50IGcgPSAwOyBnIDwgY3ViZS0+bkdyZWVuOyBnKyspIHsKKyAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjdWJlLT5uQmx1ZTsgYisrKSB7CisgICAgICAgICAgaW50IGkgPSAociAqIGN1YmUtPm5HcmVlbiArIGcpICogY3ViZS0+bkJsdWUgKyBiOworICAgICAgICAgIGN1YmUtPnNldChyLCBnLCBiLCB4Y1tpXS5waXhlbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3VuaXgvdHgvVFhJbWFnZS5oIGIvdW5peC90eC9UWEltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1YmQyMgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdHgvVFhJbWFnZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWEltYWdlLmgKKy8vCisvLyBBIFRYSW1hZ2UgcmVwcmVzZW50cyBhIHJlY3Rhbmd1bGFyIG9mZi1zY3JlZW4gaW1hZ2UgaW4gYW55IFJGQiBwaXhlbCBmb3JtYXQuCisvLyBCeSBkZWZhdWx0IGl0IHdpbGwgdXNlIHRoZSAibmF0aXZlIiBwaXhlbCBmb3JtYXQgZm9yIHRoZSBzY3JlZW4sIHdoaWNoIHdpbGwKKy8vIGJlIGFuIDgtYml0IGNvbG91cm1hcCB1bmxlc3MgdGhlIFggZGlzcGxheSBpcyBUcnVlQ29sb3IuICBUaGUgcGl4ZWwgZm9ybWF0CisvLyBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlIHNldFBGKCkgbWV0aG9kLiAgVGhlIHBpeGVsIGRhdGEgaXMgYWNjZXNzaWJsZSB2aWEgdGhlCisvLyBkYXRhIG1lbWJlciBpbmhlcml0ZWQgZnJvbSBGdWxsRnJhbWVQaXhlbEJ1ZmZlciwgb3IgY2FuIGJlIHNldCB2aWEgdGhlCisvLyBmaWxsUmVjdCgpLCBpbWFnZVJlY3QoKSwgY29weVJlY3QoKSBhbmQgbWFza1JlY3QoKSBtZXRob2RzLCBhbHNvIGluaGVyaXRlZAorLy8gZnJvbSBQaXhlbEJ1ZmZlci4gIEEgcmVjdGFuZ2xlIG9mIHRoZSBpbWFnZSBjYW4gYmUgZHJhd24gaW50byBhbiBYIFdpbmRvdworLy8gdmlhIHRoZSBwdXQoKSBtZXRob2QuICBJZiB1c2luZyBhIGNvbG91cm1hcCwgdGhlIHNldENvbG91ck1hcEVudHJpZXMoKSBhbmQKKy8vIHVwZGF0ZUNvbG91ck1hcCgpIG1ldGhvZHMgbXVzdCBiZSBjYWxsZWQgdG8gc2V0IHVwIHRoZSBjb2xvdXJtYXAgYXMKKy8vIGFwcHJvcHJpYXRlLgorCisKKyNpZm5kZWYgX19UWElNQUdFX0hfXworI2RlZmluZSBfX1RYSU1BR0VfSF9fCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPHJmYi9QaXhlbEJ1ZmZlci5oPgorI2luY2x1ZGUgPHJmYi9Db2xvdXJNYXAuaD4KKyNpbmNsdWRlIDxyZmIvQ29sb3VyQ3ViZS5oPgorI2lmZGVmIEhBVkVfTUlUU0hNCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWFNobS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSByZmIgeyBjbGFzcyBUcmFuc0ltYWdlR2V0dGVyOyB9CisKK2NsYXNzIFRYSW1hZ2UgOiBwdWJsaWMgcmZiOjpGdWxsRnJhbWVQaXhlbEJ1ZmZlciwgcHVibGljIHJmYjo6Q29sb3VyTWFwIHsKK3B1YmxpYzoKKyAgVFhJbWFnZShEaXNwbGF5KiBkcHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlzdWFsKiB2aXM9MCwgaW50IGRlcHRoPTApOworICB+VFhJbWFnZSgpOworCisgIC8vIHJlc2l6ZSgpIHJlc2l6ZXMgdGhlIGltYWdlLCBwcmVzZXJ2aW5nIHRoZSBpbWFnZSBkYXRhIHdoZXJlIHBvc3NpYmxlLgorICB2b2lkIHJlc2l6ZShpbnQgdywgaW50IGgpOworCisgIC8vIHB1dCBjYXVzZXMgdGhlIGdpdmVuIHJlY3RhbmdsZSB0byBiZSBkcmF3biBvbnRvIHRoZSBnaXZlbiB3aW5kb3cuCisgIHZvaWQgcHV0KFdpbmRvdyB3aW4sIEdDIGdjLCBjb25zdCByZmI6OlJlY3QmIHIpOworCisgIC8vIHNldENvbG91ck1hcEVudHJpZXMoKSBjaGFuZ2VzIHNvbWUgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG91cm1hcC4KKyAgLy8gSG93ZXZlciB0aGVzZSBzZXR0aW5ncyB3b24ndCB0YWtlIGVmZmVjdCB1bnRpbCB1cGRhdGVDb2xvdXJNYXAoKSBpcworICAvLyBjYWxsZWQuICBUaGlzIGlzIGJlY2F1c2UgcmVjYWxjdWxhdGluZyB0aGUgaW50ZXJuYWwgdHJhbnNsYXRpb24gdGFibGUgY2FuCisgIC8vIGJlIGV4cGVuc2l2ZS4KKyAgdm9pZCBzZXRDb2xvdXJNYXBFbnRyaWVzKGludCBmaXJzdENvbG91ciwgaW50IG5Db2xvdXJzLCByZHI6OlUxNiogcmdicyk7CisgIHZvaWQgdXBkYXRlQ29sb3VyTWFwKCk7CisKKyNpZmRlZiBIQVZFX01JVFNITQorICBib29sIHVzaW5nU2htKCkgeyByZXR1cm4gc2htaW5mbzsgfQorI2Vsc2UKKyAgYm9vbCB1c2luZ1NobSgpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCisgIC8vIFBpeGVsQnVmZmVyIG1ldGhvZHMKKyAgLy8gd2lkdGgoKSwgaGVpZ2h0KCksIGdldFBGKCkgZXRjIGFyZSBpbmhlcml0ZWQgZnJvbSBQaXhlbEJ1ZmZlcgorICB2aXJ0dWFsIHZvaWQgc2V0UEYoY29uc3QgcmZiOjpQaXhlbEZvcm1hdCYgcGYpOworICB2aXJ0dWFsIGludCBnZXRTdHJpZGUoKSBjb25zdDsKKworcHJpdmF0ZToKKworICAvLyBDb2xvdXJNYXAgbWV0aG9kCisgIHZpcnR1YWwgdm9pZCBsb29rdXAoaW50IGluZGV4LCBpbnQqIHIsIGludCogZywgaW50KiBiKTsKKworICB2b2lkIGNyZWF0ZVhJbWFnZSgpOworICB2b2lkIGRlc3Ryb3lYSW1hZ2UoKTsKKyAgdm9pZCBnZXROYXRpdmVQaXhlbEZvcm1hdChWaXN1YWwqIHZpcywgaW50IGRlcHRoKTsKKworICBYSW1hZ2UqIHhpbTsKKyAgRGlzcGxheSogZHB5OworICBWaXN1YWwqIHZpczsKKyAgaW50IGRlcHRoOworI2lmZGVmIEhBVkVfTUlUU0hNCisgIFhTaG1TZWdtZW50SW5mbyogc2htaW5mbzsKKyNlbmRpZgorICByZmI6OlRyYW5zSW1hZ2VHZXR0ZXIqIHRpZzsKKyAgcmZiOjpDb2xvdXIgY29sb3VyTWFwWzI1Nl07CisgIHJmYjo6UGl4ZWxGb3JtYXQgbmF0aXZlUEY7CisgIHJmYjo6Q29sb3VyQ3ViZSogY3ViZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWExhYmVsLmggYi91bml4L3R4L1RYTGFiZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDUyMDBkCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWExhYmVsLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWExhYmVsLmgKKy8vCisvLyBBbiBUWExhYmVsIGFsbG93cyB5b3UgdG8gcHV0IHVwIG11bHRpbGluZSB0ZXh0IGluIGEgd2luZG93IHdpdGggdmFyaW91cworLy8gYWxpZ25tZW50cy4gIFRoZSBsYWJlbCBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgdGV4dCAtIGlmIG5vdCB0aGVuCisvLyBpdCB3aWxsIGJlIHJlc2l6ZWQgYXBwcm9wcmlhdGVseS4KKy8vCisKKyNpZm5kZWYgX19UWExBQkVMX0hfXworI2RlZmluZSBfX1RYTEFCRUxfSF9fCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJUWFdpbmRvdy5oIgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKK2NsYXNzIFRYTGFiZWwgOiBwdWJsaWMgVFhXaW5kb3csIHB1YmxpYyBUWEV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIGVudW0gSEFsaWduIHsgbGVmdCwgY2VudHJlLCByaWdodCB9OworICBlbnVtIFZBbGlnbiB7IHRvcCwgbWlkZGxlLCBib3R0b20gfTsKKworICBUWExhYmVsKERpc3BsYXkqIGRweV8sIGNvbnN0IGNoYXIqIHRleHRfLCBUWFdpbmRvdyogcGFyZW50Xz0wLAorICAgICAgICAgIGludCB3PTEsIGludCBoPTEsIEhBbGlnbiBoYT1jZW50cmUsIFZBbGlnbiB2YT1taWRkbGUpCisgICAgOiBUWFdpbmRvdyhkcHlfLCB3LCBoLCBwYXJlbnRfKSwgbGluZVNwYWNpbmcoMiksIGxpbmVzKDApLAorICAgICAgaGFsaWduKGhhKSwgdmFsaWduKHZhKQorICB7CisgICAgc2V0RXZlbnRIYW5kbGVyKHRoaXMpOworICAgIHNldFRleHQodGV4dF8pOworICAgIGFkZEV2ZW50TWFzayhFeHBvc3VyZU1hc2spOworICB9CisKKyAgLy8gc2V0VGV4dCgpIGNoYW5nZXMgdGhlIHRleHQgaW4gdGhlIGxhYmVsLgorICB2b2lkIHNldFRleHQoY29uc3QgY2hhciogdGV4dF8pIHsKKyAgICB0ZXh0LmJ1ZiA9IHJmYjo6c3RyRHVwKHRleHRfKTsKKyAgICBsaW5lcyA9IDA7CisgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgaW50IHRleHRXaWR0aCA9IDA7CisgICAgaW50IGkgPSAtMTsKKyAgICBkbyB7CisgICAgICBpKys7CisgICAgICBpZiAodGV4dC5idWZbaV0gPT0gJ1xuJyB8fCB0ZXh0LmJ1ZltpXSA9PSAwKSB7CisgICAgICAgIGludCB0dyA9IFhUZXh0V2lkdGgoZGVmYXVsdEZTLCAmdGV4dC5idWZbbGluZVN0YXJ0XSwgaS1saW5lU3RhcnQpOworICAgICAgICBpZiAodHcgPiB0ZXh0V2lkdGgpIHRleHRXaWR0aCA9IHR3OworICAgICAgICBsaW5lU3RhcnQgPSBpKzE7CisgICAgICAgIGxpbmVzKys7CisgICAgICB9CisgICAgfSB3aGlsZSAodGV4dC5idWZbaV0gIT0gMCk7CisgICAgaW50IHRleHRIZWlnaHQgPSAoKGRlZmF1bHRGUy0+YXNjZW50ICsgZGVmYXVsdEZTLT5kZXNjZW50ICsgbGluZVNwYWNpbmcpCisgICAgICAgICAgICAgICAgICAgICAgKiBsaW5lcyk7CisgICAgaW50IG5ld1dpZHRoID0gX19yZmJtYXgod2lkdGgoKSwgdGV4dFdpZHRoICsgeFBhZCoyKTsKKyAgICBpbnQgbmV3SGVpZ2h0ID0gX19yZmJtYXgoaGVpZ2h0KCksIHRleHRIZWlnaHQgKyB5UGFkKjIpOworICAgIGlmICh3aWR0aCgpIDwgbmV3V2lkdGggfHwgaGVpZ2h0KCkgPCBuZXdIZWlnaHQpIHsKKyAgICAgIHJlc2l6ZShuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKyAgICB9CisgICAgaW52YWxpZGF0ZSgpOworICB9CisKK3ByaXZhdGU6CisgIGludCB4T2Zmc2V0KGludCB0ZXh0V2lkdGgpIHsKKyAgICBzd2l0Y2ggKGhhbGlnbikgeworICAgIGNhc2UgbGVmdDogIHJldHVybiB4UGFkOworICAgIGNhc2UgcmlnaHQ6IHJldHVybiB3aWR0aCgpIC0geFBhZCAtIHRleHRXaWR0aDsKKyAgICBkZWZhdWx0OiAgICByZXR1cm4gKHdpZHRoKCkgLSB0ZXh0V2lkdGgpIC8gMjsKKyAgICB9CisgIH0KKworICBpbnQgeU9mZnNldChpbnQgbGluZU51bSkgeworICAgIGludCB0ZXh0SGVpZ2h0ID0gKChkZWZhdWx0RlMtPmFzY2VudCArIGRlZmF1bHRGUy0+ZGVzY2VudCArIGxpbmVTcGFjaW5nKQorICAgICAgICAgICAgICAgICAgICAgICogbGluZXMpOworICAgIGludCBsaW5lT2Zmc2V0ID0gKChkZWZhdWx0RlMtPmFzY2VudCArIGRlZmF1bHRGUy0+ZGVzY2VudCArIGxpbmVTcGFjaW5nKQorICAgICAgICAgICAgICAgICAgICAgICogbGluZU51bSArIGRlZmF1bHRGUy0+YXNjZW50KTsKKyAgICBzd2l0Y2ggKHZhbGlnbikgeworICAgIGNhc2UgdG9wOiAgICByZXR1cm4geVBhZCArIGxpbmVPZmZzZXQ7CisgICAgY2FzZSBib3R0b206IHJldHVybiBoZWlnaHQoKSAtIHlQYWQgLSB0ZXh0SGVpZ2h0ICsgbGluZU9mZnNldDsKKyAgICBkZWZhdWx0OiAgICAgcmV0dXJuIChoZWlnaHQoKSAtIHRleHRIZWlnaHQpIC8gMiArIGxpbmVPZmZzZXQ7CisgICAgfQorICB9CisKKyAgdm9pZCBwYWludCgpIHsKKyAgICBpbnQgbGluZU51bSA9IDA7CisgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgaW50IGkgPSAtMTsKKyAgICBkbyB7CisgICAgICBpKys7CisgICAgICBpZiAodGV4dC5idWZbaV0gPT0gJ1xuJyB8fCB0ZXh0LmJ1ZltpXSA9PSAwKSB7CisgICAgICAgIGludCB0dyA9IFhUZXh0V2lkdGgoZGVmYXVsdEZTLCAmdGV4dC5idWZbbGluZVN0YXJ0XSwgaS1saW5lU3RhcnQpOworICAgICAgICBYRHJhd1N0cmluZyhkcHksIHdpbigpLCBkZWZhdWx0R0MsIHhPZmZzZXQodHcpLCB5T2Zmc2V0KGxpbmVOdW0pLAorICAgICAgICAgICAgICAgICAgICAmdGV4dC5idWZbbGluZVN0YXJ0XSwgaS1saW5lU3RhcnQpOworICAgICAgICBsaW5lU3RhcnQgPSBpKzE7CisgICAgICAgIGxpbmVOdW0rKzsKKyAgICAgIH0KKyAgICB9IHdoaWxlICh0ZXh0LmJ1ZltpXSAhPSAwKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVFdmVudChUWFdpbmRvdyogdywgWEV2ZW50KiBldikgeworICAgIHN3aXRjaCAoZXYtPnR5cGUpIHsKKyAgICBjYXNlIEV4cG9zZToKKyAgICAgIHBhaW50KCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpbnQgbGluZVNwYWNpbmc7CisgIHJmYjo6Q2hhckFycmF5IHRleHQ7CisgIGludCBsaW5lczsKKyAgSEFsaWduIGhhbGlnbjsKKyAgVkFsaWduIHZhbGlnbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWE1lbnUuY3h4IGIvdW5peC90eC9UWE1lbnUuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzEyZjUKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3R4L1RYTWVudS5jeHgKQEAgLTAsMCArMSwxODYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWE1lbnUuY3h4CisvLworCisjaW5jbHVkZSAiVFhNZW51LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KKworVFhNZW51OjpUWE1lbnUoRGlzcGxheSogZHB5XywgVFhNZW51Q2FsbGJhY2sqIGNiXywgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgVFhXaW5kb3cqIHBhcmVudF8pCisgIDogVFhXaW5kb3coZHB5XywgdywgaCwgcGFyZW50XyksIGNiKGNiXyksIG5FbnRyaWVzKDApLAorICAgIGhpZ2hsaWdodCgtMSkKK3sKKyAgc2V0RXZlbnRIYW5kbGVyKHRoaXMpOworICBnYyA9IFhDcmVhdGVHQyhkcHksIHdpbigpLCAwLCAwKTsKKyAgYWRkRXZlbnRNYXNrKEV4cG9zdXJlTWFzayB8IEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrIHwKKyAgICAgICAgICAgICAgIFBvaW50ZXJNb3Rpb25NYXNrIHwgRW50ZXJXaW5kb3dNYXNrIHwgTGVhdmVXaW5kb3dNYXNrKTsKK30KKworVFhNZW51Ojp+VFhNZW51KCkKK3sKKyAgWEZyZWVHQyhkcHksIGdjKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRW50cmllczsgaSsrKQorICAgIGRlbGV0ZSBbXSB0ZXh0W2ldOworfQorCitpbmxpbmUgaW50IFRYTWVudTo6ZW50cnlIZWlnaHQoaW50IGkpCit7CisgIGlmICh0ZXh0W2ldKQorICAgIHJldHVybiBkZWZhdWx0RlMtPmFzY2VudCArIGRlZmF1bHRGUy0+ZGVzY2VudCArIGJldmVsKjIgKyB5UGFkKjI7CisgIGVsc2UKKyAgICByZXR1cm4geVBhZCoyICsgMTsKK30KKwordm9pZCBUWE1lbnU6OmFkZEVudHJ5KGNvbnN0IGNoYXIqIHRleHRfLCBsb25nIGlkXykKK3sKKyAgYXNzZXJ0KG5FbnRyaWVzIDwgbWF4RW50cmllcyk7CisgIHRleHRbbkVudHJpZXNdID0gcmZiOjpzdHJEdXAodGV4dF8pOworICBjaGVja2VkW25FbnRyaWVzXSA9IGZhbHNlOworICBpZFtuRW50cmllcysrXSA9IGlkXzsKKyAgaW50IHR3ID0gMDsKKyAgaWYgKHRleHRfKQorICAgIHR3ID0gWFRleHRXaWR0aChkZWZhdWx0RlMsIHRleHRfLCBzdHJsZW4odGV4dF8pKTsKKyAgaW50IG5ld1dpZHRoID0gd2lkdGgoKTsKKyAgaWYgKHR3ICsgYmV2ZWwqMiArIHhQYWQqNSArIHRpY2tTaXplID4gd2lkdGgoKSkKKyAgICBuZXdXaWR0aCA9IHR3ICsgYmV2ZWwqMiArIHhQYWQqNSArIHRpY2tTaXplOworICBpbnQgbmV3SGVpZ2h0ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRW50cmllczsgaSsrKQorICAgIG5ld0hlaWdodCArPSBlbnRyeUhlaWdodChpKTsKKyAgcmVzaXplKG5ld1dpZHRoLCBuZXdIZWlnaHQpOworfQorCit2b2lkIFRYTWVudTo6Y2hlY2sobG9uZyBpZF8sIGJvb2wgY2hlY2tlZF8pCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkVudHJpZXM7IGkrKykgeworICAgIGlmIChpZFtpXSA9PSBpZF8pIHsKKyAgICAgIGNoZWNrZWRbaV0gPSBjaGVja2VkXzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIFRYTWVudTo6cGFpbnQoKQoreworICBpbnQgeSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkVudHJpZXM7IGkrKykgeworICAgIGlmICh0ZXh0W2ldKSB7CisgICAgICBpZiAoaSA9PSBoaWdobGlnaHQpCisgICAgICAgIGRyYXdCZXZlbChnYywgMCwgeSwgd2lkdGgoKSwgZW50cnlIZWlnaHQoaSksIGJldmVsLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdEJnLCBkYXJrQmcsIGxpZ2h0QmcpOworICAgICAgZWxzZQorICAgICAgICBYQ2xlYXJBcmVhKGRweSwgd2luKCksIDAsIHksIHdpZHRoKCksIGVudHJ5SGVpZ2h0KGkpLCBmYWxzZSk7CisgICAgICBpZiAoY2hlY2tlZFtpXSkKKyAgICAgICAgWENvcHlQbGFuZShkcHksIHRpY2ssIHdpbigpLCBkZWZhdWx0R0MsIDAsIDAsIHRpY2tTaXplLCB0aWNrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBiZXZlbCArIHhQYWQsCisgICAgICAgICAgICAgICAgICAgeSArIGJldmVsICsgeVBhZCArIGRlZmF1bHRGUy0+YXNjZW50IC0gdGlja1NpemUsIDEpOworCisgICAgICBYRHJhd0ltYWdlU3RyaW5nKGRweSwgd2luKCksIGRlZmF1bHRHQywgYmV2ZWwgKyB4UGFkKjIgKyB0aWNrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgeSArIGJldmVsICsgeVBhZCArIGRlZmF1bHRGUy0+YXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICB0ZXh0W2ldLCBzdHJsZW4odGV4dFtpXSkpOworICAgIH0gZWxzZSB7CisgICAgICBYRHJhd0xpbmUoZHB5LCB3aW4oKSwgZGVmYXVsdEdDLCBiZXZlbCArIHhQYWQsIHkgKyBlbnRyeUhlaWdodChpKSAvIDIsCisgICAgICAgICAgICAgICAgd2lkdGgoKSAtIGJldmVsIC0geFBhZCwgeSArIGVudHJ5SGVpZ2h0KGkpIC8gMik7CisgICAgfQorICAgIHkgKz0gZW50cnlIZWlnaHQoaSk7CisgIH0KK30KKwordm9pZCBUWE1lbnU6OmhhbmRsZUV2ZW50KFRYV2luZG93KiB3LCBYRXZlbnQqIGV2KQoreworICBzd2l0Y2ggKGV2LT50eXBlKSB7CisgIGNhc2UgRXhwb3NlOgorICAgIHBhaW50KCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBCdXR0b25SZWxlYXNlOgorICAgIHsKKyAgICAgIGludCB5ID0gZXYtPnhtb3Rpb24ueTsKKyAgICAgIGludCBlbnRyeVkgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRW50cmllczsgaSsrKSB7CisgICAgICAgIGlmICh5ID49IGVudHJ5WSAmJiB5IDw9IGVudHJ5WSArIGVudHJ5SGVpZ2h0KGkpKSB7CisgICAgICAgICAgaWYgKGNiICYmIHRleHRbaV0pCisgICAgICAgICAgICBjYi0+bWVudVNlbGVjdChpZFtpXSwgdGhpcyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZW50cnlZICs9IGVudHJ5SGVpZ2h0KGkpOworICAgICAgfQorICAgICAgaGlnaGxpZ2h0ID0gLTE7CisgICAgICBwYWludCgpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGNhc2UgQnV0dG9uUHJlc3M6CisgIGNhc2UgTW90aW9uTm90aWZ5OgorICAgIHsKKyAgICAgIGludCB5ID0gZXYtPnhtb3Rpb24ueTsKKyAgICAgIGludCBlbnRyeVkgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRW50cmllczsgaSsrKSB7CisgICAgICAgIGlmICh5ID49IGVudHJ5WSAmJiB5IDw9IGVudHJ5WSArIGVudHJ5SGVpZ2h0KGkpKSB7CisgICAgICAgICAgaWYgKGhpZ2hsaWdodCAhPSBpKSB7CisgICAgICAgICAgICBoaWdobGlnaHQgPSBpOworICAgICAgICAgICAgcGFpbnQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZW50cnlZICs9IGVudHJ5SGVpZ2h0KGkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIGNhc2UgS2V5UHJlc3M6CisgICAgeworICAgICAgS2V5U3ltIGtzOworICAgICAgY2hhciBzdHJbMjU2XTsKKyAgICAgIFhMb29rdXBTdHJpbmcoJmV2LT54a2V5LCBzdHIsIDI1NiwgJmtzLCBOVUxMKTsKKyAgICAgIGlmIChrcyA9PSBYS19Fc2NhcGUpIHsKKyAgICAgICAgaGlnaGxpZ2h0ID0gLTE7CisgICAgICAgIHVubWFwKCk7CisgICAgICB9IGVsc2UgaWYgKGtzID09IFhLX0Rvd24gfHwga3MgPT0gWEtfVXApIHsKKyAgICAgICAgaWYgKG5FbnRyaWVzIDwgMSkgYnJlYWs7CisgICAgICAgIGlmIChoaWdobGlnaHQgPCAwKQorICAgICAgICAgIGhpZ2hsaWdodCA9IChrcyA9PSBYS19Eb3duID8gbkVudHJpZXMtMSA6IDApOworICAgICAgICBpbnQgc3RhcnQgPSBoaWdobGlnaHQ7CisgICAgICAgIGludCBpbmMgPSAoa3MgPT0gWEtfRG93biA/IDEgOiBuRW50cmllcy0xKTsKKyAgICAgICAgZG8geworICAgICAgICAgIGhpZ2hsaWdodCA9IChoaWdobGlnaHQgKyBpbmMpICUgbkVudHJpZXM7CisgICAgICAgIH0gd2hpbGUgKGhpZ2hsaWdodCAhPSBzdGFydCAmJiAhdGV4dFtoaWdobGlnaHRdKTsKKyAgICAgICAgcGFpbnQoKTsKKyAgICAgIH0gZWxzZSBpZiAoa3MgPT0gWEtfc3BhY2UgfHwga3MgPT0gWEtfS1BfU3BhY2UgfHwKKyAgICAgICAgICAgICAgICAga3MgPT0gWEtfUmV0dXJuIHx8IGtzID09IFhLX0tQX0VudGVyKSB7CisgICAgICAgIGlmIChjYiAmJiBoaWdobGlnaHQgPj0gMCAmJiB0ZXh0W2hpZ2hsaWdodF0pCisgICAgICAgICAgY2ItPm1lbnVTZWxlY3QoaWRbaGlnaGxpZ2h0XSwgdGhpcyk7CisgICAgICAgIGhpZ2hsaWdodCA9IC0xOworICAgICAgICBwYWludCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIGNhc2UgRW50ZXJOb3RpZnk6CisgIGNhc2UgTGVhdmVOb3RpZnk6CisgICAgaGlnaGxpZ2h0ID0gLTE7CisgICAgcGFpbnQoKTsKKyAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWE1lbnUuaCBiL3VuaXgvdHgvVFhNZW51LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNDVlZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdHgvVFhNZW51LmgKQEAgLTAsMCArMSw2NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFRYTWVudS5oCisvLworLy8gQSBUWE1lbnUgY29uc2lzdHMgb2YgbXVsdGlwbGUgZW50cmllcyB3aGljaCBjYW4gYmUgYWRkZWQgb25lIGF0IGEgdGltZS4KKy8vIEVhY2ggZW50cnkgY29uc2lzdHMgb2Ygc29tZSB0ZXh0LCBhbmQgaGFzIGFuIGFzc29jaWF0ZWQgaW50ZWdlciBpZGVudGlmaWVyLgorLy8gQSBjYWxsYmFjayBpcyBtYWRlIHdoZW4gYSBtZW51IGVudHJ5IGlzIHNlbGVjdGVkLgorLy8KKworI2lmbmRlZiBfX1RYTUVOVV9IX18KKyNkZWZpbmUgX19UWE1FTlVfSF9fCisKKyNpbmNsdWRlICJUWFdpbmRvdy5oIgorCisvLyBUWE1lbnVDYWxsYmFjaydzIG1lbnVTZWxlY3QoKSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIG1lbnUgZW50cnkKKy8vIGlzIHNlbGVjdGVkLiAgVGhlIGlkIGFyZ3VtZW50IGlkZW50aWZpZXMgdGhlIG1lbnUgZW50cnkuCitjbGFzcyBUWE1lbnU7CitjbGFzcyBUWE1lbnVDYWxsYmFjayB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBtZW51U2VsZWN0KGxvbmcgaWQsIFRYTWVudSogbWVudSk9MDsKK307CisKK2NsYXNzIFRYTWVudSA6IHB1YmxpYyBUWFdpbmRvdywgcHVibGljIFRYRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgVFhNZW51KERpc3BsYXkqIGRweV8sIFRYTWVudUNhbGxiYWNrKiBjYj0wLCBpbnQgd2lkdGg9MSwgaW50IGhlaWdodD0xLAorICAgICAgICAgVFhXaW5kb3cqIHBhcmVudF89MCk7CisgIHZpcnR1YWwgflRYTWVudSgpOworCisgIC8vIGFkZEVudHJ5KCkgYWRkcyBhbiBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBtZW51IHdpdGggdGhlIGdpdmVuIHRleHQgYW5kCisgIC8vIGlkZW50aWZpZXIuCisgIHZvaWQgYWRkRW50cnkoY29uc3QgY2hhciogdGV4dCwgbG9uZyBpZCk7CisKKyAgLy8gY2hlY2soKSBzZXRzIHdoZXRoZXIgdGhlIGdpdmVuIG1lbnUgZW50cnkgc2hvdWxkIGhhdmUgYSB0aWNrIG5leHQgdG8gaXQuCisgIHZvaWQgY2hlY2sobG9uZyBpZCwgYm9vbCBjaGVja2VkKTsKKworcHJpdmF0ZToKKyAgaW50IGVudHJ5SGVpZ2h0KGludCBpKTsKKyAgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KFRYV2luZG93KiB3LCBYRXZlbnQqIGV2KTsKKyAgdm9pZCBwYWludCgpOworCisgIEdDIGdjOworICBUWE1lbnVDYWxsYmFjayogY2I7CisgIGVudW0geyBtYXhFbnRyaWVzID0gNjQgfTsKKyAgY2hhciogdGV4dFttYXhFbnRyaWVzXTsKKyAgbG9uZyBpZFttYXhFbnRyaWVzXTsKKyAgYm9vbCBjaGVja2VkW21heEVudHJpZXNdOworICBpbnQgbkVudHJpZXM7CisgIGludCBoaWdobGlnaHQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdHgvVFhNc2dCb3guaCBiL3VuaXgvdHgvVFhNc2dCb3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjg0ZTZhCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWE1zZ0JveC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gVFhNc2dCb3guaAorLy8KKy8vIEEgVFhNc2dCb3ggaXMgYSBzcGVjaWFsaXNlZCBwb3AtdXAgZGlhbG9nIHdpbmRvdywgZGVzaWduZWQgdG8gcHJlc2VudAorLy8gdGhlIHVzZXIgd2l0aCBhIHNtYWxsIGFtb3VudCBvZiB0ZXh0dWFsIGluZm9ybWF0aW9uLCBhbmQgcG90ZW50aWFsbHkgdG8KKy8vIG9idGFpbiB0aGVpciByZXNwb25zZS4KKy8vIFRYTXNnQm94ZXMgYXJlIGFsd2F5cyBtb2RhbCwgYW5kIG1heSBoYXZlIGFuIE9rIGJ1dHRvbiwgT2srQ2FuY2VsIGJ1dHRvbnMsCisvLyBvciBZZXMrTm8gYnV0dG9ucy4KKy8vIFRoZSBNc2dCb3ggaGVscGVyIGZ1bmN0aW9uIGNyZWF0ZXMgYSBUWE1zZ0JveCBvbiB0aGUgZmx5LCBydW5zIGl0LCBhbmQKKy8vIHJldHVybnMgdGhlIHJlc3VsdC4KKy8vCisKKyNpZm5kZWYgX19UWE1TR0JPWF9IX18KKyNkZWZpbmUgX19UWE1TR0JPWF9IX18KKworI2luY2x1ZGUgIlRYRGlhbG9nLmgiCisjaW5jbHVkZSAiVFhMYWJlbC5oIgorI2luY2x1ZGUgIlRYQnV0dG9uLmgiCisKK2VudW0gVFhNc2dCb3hGbGFncyB7CisgIE1CX09LID0gMCwKKyAgTUJfT0tDQU5DRUwgPSAxLAorICBNQl9ZRVNOTyA9IDQsCisgIE1CX0lDT05FUlJPUiA9IDB4MTAsCisgIE1CX0lDT05RVUVTVElPTiA9IDB4MjAsCisgIE1CX0lDT05XQVJOSU5HID0gMHgzMCwKKyAgTUJfSUNPTklORk9STUFUSU9OID0gMHg0MCwKKyAgTUJfREVGQlVUVE9OMSA9IDAsCisgIE1CX0RFRkJVVFRPTjIgPSAweDEwMAorfTsKKworY2xhc3MgVFhNc2dCb3ggOiBwdWJsaWMgVFhEaWFsb2csIHB1YmxpYyBUWEJ1dHRvbkNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgVFhNc2dCb3goRGlzcGxheSogZHB5LCBjb25zdCBjaGFyKiB0ZXh0LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIqIHRpdGxlPTApCisgICAgOiBUWERpYWxvZyhkcHksIDEsIDEsICJNZXNzYWdlIiwgdHJ1ZSksCisgICAgICB0ZXh0TGFiZWwoZHB5LCAiIiwgdGhpcyksCisgICAgb2tCdXR0b24oZHB5LCAiT0siLCB0aGlzLCB0aGlzLCA2MCksCisgICAgY2FuY2VsQnV0dG9uKGRweSwgIkNhbmNlbCIsIHRoaXMsIHRoaXMsIDYwKQorICB7CisgICAgdGV4dExhYmVsLnhQYWQgPSA4OworICAgIHRleHRMYWJlbC5tb3ZlKDAsIHlQYWQqNCk7CisgICAgdGV4dExhYmVsLnNldFRleHQodGV4dCk7CisgICAgcmVzaXplKHRleHRMYWJlbC53aWR0aCgpLAorICAgICAgICAgICB0ZXh0TGFiZWwuaGVpZ2h0KCkgKyBva0J1dHRvbi5oZWlnaHQoKSArIHlQYWQqMTIpOworCisgICAgc3dpdGNoIChmbGFncyAmIDB4MzApIHsKKyAgICBjYXNlIE1CX0lDT05FUlJPUjoKKyAgICAgIHRvcGxldmVsKCJFcnJvciIsIHRoaXMpOyBicmVhazsKKyAgICBjYXNlIE1CX0lDT05RVUVTVElPTjoKKyAgICAgIHRvcGxldmVsKCJRdWVzdGlvbiIsIHRoaXMpOyBicmVhazsKKyAgICBjYXNlIE1CX0lDT05XQVJOSU5HOgorICAgICAgdG9wbGV2ZWwoIldhcm5pbmciLCB0aGlzKTsgYnJlYWs7CisgICAgY2FzZSBNQl9JQ09OSU5GT1JNQVRJT046CisgICAgICB0b3BsZXZlbCgiSW5mb3JtYXRpb24iLCB0aGlzKTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICh0aXRsZSkKKwl0b3BsZXZlbCh0aXRsZSwgdGhpcyk7CisgICAgICBicmVhazsKKyAgICB9OworCisgICAgc3dpdGNoIChmbGFncyAmIDB4NykgeworICAgIGRlZmF1bHQ6CisgICAgICBva0J1dHRvbi5tb3ZlKCh3aWR0aCgpIC0gb2tCdXR0b24ud2lkdGgoKSkgLyAyLAorCQkgICAgaGVpZ2h0KCkgLSB5UGFkKjQgLSBva0J1dHRvbi5oZWlnaHQoKSk7CisgICAgICBjYW5jZWxCdXR0b24udW5tYXAoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUJfT0tDQU5DRUw6CisgICAgY2FzZSBNQl9ZRVNOTzoKKyAgICAgIAorICAgICAgb2tCdXR0b24ubW92ZSgoKHdpZHRoKCkvMikgLSBva0J1dHRvbi53aWR0aCgpKSAvIDIsCisJCSAgICBoZWlnaHQoKSAtIHlQYWQqNCAtIG9rQnV0dG9uLmhlaWdodCgpKTsKKyAgICAgIGNhbmNlbEJ1dHRvbi5tb3ZlKCgod2lkdGgoKSozLzIpIC0gY2FuY2VsQnV0dG9uLndpZHRoKCkpIC8gMiwKKwkJCWhlaWdodCgpIC0geVBhZCo0IC0gY2FuY2VsQnV0dG9uLmhlaWdodCgpKTsKKyAgICAgIGlmICgoZmxhZ3MgJiAweDcpID09IE1CX1lFU05PKSB7CisJb2tCdXR0b24uc2V0VGV4dCgiWWVzIik7CisJY2FuY2VsQnV0dG9uLnNldFRleHQoIk5vIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9OworCisgICAgc2V0Qm9yZGVyV2lkdGgoMSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgYnV0dG9uQWN0aXZhdGUoVFhCdXR0b24qIGIpIHsKKyAgICBvayA9IChiID09ICZva0J1dHRvbik7CisgICAgZG9uZSA9IHRydWU7IAorICAgIHVubWFwKCk7CisgIH0KKworICBUWExhYmVsIHRleHRMYWJlbDsKKyAgVFhCdXR0b24gb2tCdXR0b247CisgIFRYQnV0dG9uIGNhbmNlbEJ1dHRvbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWFNjcm9sbGJhci5jeHggYi91bml4L3R4L1RYU2Nyb2xsYmFyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UxMjRjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWFNjcm9sbGJhci5jeHgKQEAgLTAsMCArMSwxMTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWFNjcm9sbGJhci5jeHgKKy8vCisKKyNpbmNsdWRlICJUWFNjcm9sbGJhci5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK1RYU2Nyb2xsYmFyOjpUWFNjcm9sbGJhcihEaXNwbGF5KiBkcHlfLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgdmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUWFNjcm9sbGJhckNhbGxiYWNrKiBjYl8sIFRYV2luZG93KiBwYXJlbnRfKQorICA6IFRYV2luZG93KGRweV8sIHdpZHRoLCBoZWlnaHQsIHBhcmVudF8pLCBjYihjYl8pLCB2ZXJ0aWNhbCh2ZXJ0KSwKKyAgICBjbGlja2VkSW5UaHVtYihmYWxzZSkKK3sKKyAgc2V0RXZlbnRIYW5kbGVyKHRoaXMpOworICBnYyA9IFhDcmVhdGVHQyhkcHksIHdpbigpLCAwLCAwKTsKKyAgYWRkRXZlbnRNYXNrKEV4cG9zdXJlTWFzayB8IEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrIHwKKyAgICAgICAgICAgICAgIEJ1dHRvbk1vdGlvbk1hc2spOworICBzZXRCZyhzY3JvbGxiYXJCZyk7CisgIGxpbWl0WzBdID0gbGVuWzBdID0gbGltaXRbMV0gPSBsZW5bMV0gPSAxOworICBzdGFydFswXSA9IHN0YXJ0WzFdID0gMDsKK30KKworVFhTY3JvbGxiYXI6On5UWFNjcm9sbGJhcigpCit7CisgIFhGcmVlR0MoZHB5LCBnYyk7Cit9CisKK3ZvaWQgVFhTY3JvbGxiYXI6OnNldChpbnQgbGltaXRfLCBpbnQgc3RhcnRfLCBpbnQgbGVuXywgYm9vbCB2ZXJ0KQoreworICBhc3NlcnQobGltaXRfID4gMCAmJiBsZW5fID49IDAgJiYgbGVuXyA8PSBsaW1pdF8pOworCisgIGlmIChzdGFydF8gPCAwKSBzdGFydF8gPSAwOworICBpZiAoc3RhcnRfID4gbGltaXRfIC0gbGVuXykgc3RhcnRfID0gbGltaXRfIC0gbGVuXzsKKworICBpZiAobGltaXRbdmVydF0gIT0gbGltaXRfIHx8IHN0YXJ0W3ZlcnRdICE9IHN0YXJ0XyB8fCBsZW5bdmVydF0gIT0gbGVuXykgeworICAgIGxpbWl0W3ZlcnRdID0gbGltaXRfOworICAgIHN0YXJ0W3ZlcnRdID0gc3RhcnRfOworICAgIGxlblt2ZXJ0XSA9IGxlbl87CisgICAgcGFpbnQoKTsKKyAgfQorfQorCit2b2lkIFRYU2Nyb2xsYmFyOjpwYWludCgpCit7CisgIGludCB4ID0gc2NhbGVUb0Jhclgoc3RhcnRbMF0pOworICBpbnQgeSA9IHNjYWxlVG9CYXJZKHN0YXJ0WzFdKTsKKyAgaW50IHcgPSBzY2FsZVRvQmFyWChsZW5bMF0pOworICBpbnQgaCA9IHNjYWxlVG9CYXJZKGxlblsxXSk7CisgIGlmICh5ID4gMCkgWENsZWFyQXJlYShkcHksIHdpbigpLCAwLCAwLCAwLCB5LCBmYWxzZSk7CisgIGlmICh4ID4gMCkgWENsZWFyQXJlYShkcHksIHdpbigpLCAwLCB5LCB4LCB5K2gsIGZhbHNlKTsKKyAgWENsZWFyQXJlYShkcHksIHdpbigpLCB4K3csIHksIDAsIHkraCwgZmFsc2UpOworICBYQ2xlYXJBcmVhKGRweSwgd2luKCksIDAsIHkraCwgMCwgMCwgZmFsc2UpOworICBkcmF3QmV2ZWwoZ2MsIHgsIHksIHcsIGgsIGJldmVsLCBkZWZhdWx0QmcsIGxpZ2h0QmcsIGRhcmtCZyk7Cit9CisKK3ZvaWQgVFhTY3JvbGxiYXI6OmhhbmRsZUV2ZW50KFRYV2luZG93KiB3LCBYRXZlbnQqIGV2KQoreworICBzd2l0Y2ggKGV2LT50eXBlKSB7CisgIGNhc2UgRXhwb3NlOgorICAgIHBhaW50KCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBCdXR0b25QcmVzczoKKyAgICB7CisgICAgICB4RG93biA9IGV2LT54YnV0dG9uLng7CisgICAgICB5RG93biA9IGV2LT54YnV0dG9uLnk7CisgICAgICB4U3RhcnQgPSBzdGFydFswXTsKKyAgICAgIHlTdGFydCA9IHN0YXJ0WzFdOworICAgICAgYm9vbCBjbGlja2VkSW5UaHVtYlggPSBmYWxzZTsKKyAgICAgIGlmICh4RG93biA8IHNjYWxlVG9CYXJYKHN0YXJ0WzBdKSkgeworICAgICAgICBzZXQobGltaXRbMF0sIHN0YXJ0WzBdIC0gbGVuWzBdLCBsZW5bMF0sIGZhbHNlKTsKKyAgICAgIH0gZWxzZSBpZiAoeERvd24gPj0gc2NhbGVUb0Jhclgoc3RhcnRbMF0rbGVuWzBdKSkgeworICAgICAgICBzZXQobGltaXRbMF0sIHN0YXJ0WzBdICsgbGVuWzBdLCBsZW5bMF0sIGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNsaWNrZWRJblRodW1iWCA9IHRydWU7CisgICAgICB9CisgICAgICBib29sIGNsaWNrZWRJblRodW1iWSA9IGZhbHNlOworICAgICAgaWYgKHlEb3duIDwgc2NhbGVUb0Jhclkoc3RhcnRbMV0pKSB7CisgICAgICAgIHNldChsaW1pdFsxXSwgc3RhcnRbMV0gLSBsZW5bMV0sIGxlblsxXSwgdHJ1ZSk7CisgICAgICB9IGVsc2UgaWYgKHlEb3duID49IHNjYWxlVG9CYXJZKHN0YXJ0WzFdK2xlblsxXSkpIHsKKyAgICAgICAgc2V0KGxpbWl0WzFdLCBzdGFydFsxXSArIGxlblsxXSwgbGVuWzFdLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNsaWNrZWRJblRodW1iWSA9IHRydWU7CisgICAgICB9CisgICAgICBjbGlja2VkSW5UaHVtYiA9IGNsaWNrZWRJblRodW1iWCAmJiBjbGlja2VkSW5UaHVtYlk7CisgICAgICBpZiAoY2IpIGNiLT5zY3JvbGxiYXJQb3Moc3RhcnRbMF0sIHN0YXJ0WzFdLCB0aGlzKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBCdXR0b25SZWxlYXNlOgorICBjYXNlIE1vdGlvbk5vdGlmeToKKyAgICB3aGlsZSAoWENoZWNrVHlwZWRXaW5kb3dFdmVudChkcHksIHdpbigpLCBNb3Rpb25Ob3RpZnksIGV2KSk7CisgICAgaWYgKGNsaWNrZWRJblRodW1iKSB7CisgICAgICBpbnQgZHggPSBldi0+eG1vdGlvbi54IC0geERvd247CisgICAgICBpbnQgZHkgPSBldi0+eG1vdGlvbi55IC0geURvd247CisgICAgICBzZXQobGltaXRbMF0sIHhTdGFydCArIGJhclRvU2NhbGVYKGR4KSwgbGVuWzBdLCBmYWxzZSk7CisgICAgICBzZXQobGltaXRbMV0sIHlTdGFydCArIGJhclRvU2NhbGVZKGR5KSwgbGVuWzFdLCB0cnVlKTsKKyAgICAgIGlmIChjYikgY2ItPnNjcm9sbGJhclBvcyhzdGFydFswXSwgc3RhcnRbMV0sIHRoaXMpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWFNjcm9sbGJhci5oIGIvdW5peC90eC9UWFNjcm9sbGJhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmVjM2QKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3R4L1RYU2Nyb2xsYmFyLmgKQEAgLTAsMCArMSw4MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFRYU2Nyb2xsYmFyLmgKKy8vCisvLyBBIFRYU2Nyb2xsYmFyIHJlcHJlc2VudHMgYSByYW5nZSBvZiB2YWx1ZXMgc3RhcnRpbmcgYXQgc3RhcnQsIG9mIGxlbmd0aCBsZW4sCisvLyBiZXR3ZWVuIHplcm8gYW5kIGxpbWl0LiAgVGhlIHZlcnRpY2FsIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3RvciBzYXlzCisvLyB3aGV0aGVyIHRoZSBzY3JvbGxiYXIgaXMgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbC4KKy8vCisvLyBJbiBmYWN0IGl0IGNhbiByZXByZXNlbnQgYSByYW5nZSBpbiBlYWNoIGRpbWVuc2lvbiBidXQgdXN1YWxseSBvbmUgb2YgdGhlCisvLyBkaW1lbnNpb25zIGlzIGZpeGVkLCBhY2NvcmRpbmcgdG8gdGhlIHZlcnRpY2FsIGZsYWcgKGZvciBhIHZlcnRpY2FsCisvLyBzY3JvbGxiYXIsIHRoZSBob3Jpem9udGFsIGRpbWVuc2lvbiBpcyBmaXhlZCwgYW5kIHZpY2UtdmVyc2EpLgorLy8KKy8vIFRoZSBUWFNjcm9sbGJhckNhbGxiYWNrIGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KKy8vIHRoZSB1c2VyIGhhcyBhdHRlbXB0ZWQgdG8gbW92ZSB0aGUgc2Nyb2xsYmFyLiAgVGhlIHggYW5kIHkgYXJndW1lbnRzIHRvIHRoZQorLy8gc2Nyb2xsYmFyUG9zKCkgbWV0aG9kIGdpdmUgdGhlIHN0YXJ0IHZhbHVlcyBpbiB0aGUgcmVzcGVjdGl2ZSBkaW1lbnNpb25zLgorLy8gVGhleSBhcmUgZ3VhcmFudGVlZCB0byBiZSBiZXR3ZWVuIDAgYW5kIGxpbWl0LWxlbi4KKy8vCisKKyNpZm5kZWYgX19UWFNDUk9MTEJBUl9IX18KKyNkZWZpbmUgX19UWFNDUk9MTEJBUl9IX18KKworI2luY2x1ZGUgIlRYV2luZG93LmgiCisKK2NsYXNzIFRYU2Nyb2xsYmFyQ2FsbGJhY2s7CisKK2NsYXNzIFRYU2Nyb2xsYmFyIDogcHVibGljIFRYV2luZG93LCBwdWJsaWMgVFhFdmVudEhhbmRsZXIgeworcHVibGljOgorICBUWFNjcm9sbGJhcihEaXNwbGF5KiBkcHlfLCBpbnQgd2lkdGg9MSwgaW50IGhlaWdodD0xLCBib29sIHZlcnRpY2FsPWZhbHNlLAorICAgICAgICAgICAgICBUWFNjcm9sbGJhckNhbGxiYWNrKiBjYj0wLCBUWFdpbmRvdyogcGFyZW50Xz0wKTsKKyAgdmlydHVhbCB+VFhTY3JvbGxiYXIoKTsKKworICAvLyBzZXQoKSBzZXRzIHRoZSBsaW1pdCwgc3RhcnQgYW5kIGxlbmd0aCBvZiB0aGUgcmFuZ2UgcmVwcmVzZW50ZWQgYnkgdGhlCisgIC8vIHNjcm9sbGJhci4gIFRoZSB2YWx1ZXMgb2YgbGltaXQgYW5kIGxlbiBwYXNzZWQgaW4gbXVzdCBiZSB2YWxpZAorICAvLyAoaS5lLiBsaW1pdCA+IDAgYW5kIDAgPD0gbGVuIDw9IGxpbWl0KS4gIFZhbHVlcyBvZiBzdGFydCBhcmUgY2xpcHBlZCB0bworICAvLyB0aGUgcmFuZ2UgMCB0byBsaW1pdC1sZW4uCisgIHZvaWQgc2V0KGludCBsaW1pdCwgaW50IHN0YXJ0LCBpbnQgbGVuKSB7IHNldChsaW1pdCwgc3RhcnQsIGxlbiwgdmVydGljYWwpOyB9CisKKyAgLy8gc2V0KCkgd2l0aCBhbiBleHRyYSBhcmd1bWVudCB2ZXJ0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHJhbmdlIGluIGJvdGgKKyAgLy8gZGltZW5zaW9ucyBzaW11bHRhbmVvdXNseS4KKyAgdm9pZCBzZXQoaW50IGxpbWl0LCBpbnQgc3RhcnQsIGludCBsZW4sIGJvb2wgdmVydCk7CisKKyAgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KFRYV2luZG93KiB3LCBYRXZlbnQqIGV2KTsKKworcHJpdmF0ZToKKyAgaW50IHNjYWxlVG9CYXJYKGludCB4KSB7IHJldHVybiAoeCAqIHdpZHRoKCkgKyBsaW1pdFswXS8yKSAvIGxpbWl0WzBdOyB9CisgIGludCBzY2FsZVRvQmFyWShpbnQgeSkgeyByZXR1cm4gKHkgKiBoZWlnaHQoKSArIGxpbWl0WzFdLzIpIC8gbGltaXRbMV07IH0KKyAgaW50IGJhclRvU2NhbGVYKGludCB4KSB7IHJldHVybiAoeCAqIGxpbWl0WzBdICsgd2lkdGgoKS8yKSAvIHdpZHRoKCk7IH0KKyAgaW50IGJhclRvU2NhbGVZKGludCB5KSB7IHJldHVybiAoeSAqIGxpbWl0WzFdICsgaGVpZ2h0KCkvMikgLyBoZWlnaHQoKTsgfQorICB2b2lkIHBhaW50KCk7CisKKyAgR0MgZ2M7CisgIFRYU2Nyb2xsYmFyQ2FsbGJhY2sqIGNiOworICBpbnQgbGltaXRbMl07CisgIGludCBzdGFydFsyXTsKKyAgaW50IGxlblsyXTsKKyAgaW50IHhEb3duLCB5RG93bjsKKyAgaW50IHhTdGFydCwgeVN0YXJ0OworICBib29sIHZlcnRpY2FsOworICBib29sIGNsaWNrZWRJblRodW1iOworfTsKKworY2xhc3MgVFhTY3JvbGxiYXJDYWxsYmFjayB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBzY3JvbGxiYXJQb3MoaW50IHgsIGludCB5LCBUWFNjcm9sbGJhciogc2IpPTA7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3R4L1RYVmlld3BvcnQuY3h4IGIvdW5peC90eC9UWFZpZXdwb3J0LmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU1MTczCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWFZpZXdwb3J0LmN4eApAQCAtMCwwICsxLDE1NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFRYVmlld3BvcnQuY3h4CisvLworCisjaW5jbHVkZSAiVFhWaWV3cG9ydC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK1RYVmlld3BvcnQ6OlRYVmlld3BvcnQoRGlzcGxheSogZHB5XywgaW50IHcsIGludCBoLCBUWFdpbmRvdyogcGFyZW50XykKKyAgOiBUWFdpbmRvdyhkcHlfLCB3LCBoLCBwYXJlbnRfKSwgY2hpbGQoMCksIGhTY3JvbGxiYXIoMCksCisgICAgdlNjcm9sbGJhcigwKSwgc2Nyb2xsYmFyU2l6ZSgxNSksIHhPZmYoMCksIHlPZmYoMCksIGJ1bXBTY3JvbGxUaW1lcih0aGlzKSwKKyAgICBidW1wU2Nyb2xsKGZhbHNlKSwgbmVlZFNjcm9sbGJhcnMoZmFsc2UpLCBidW1wU2Nyb2xsWCgwKSwgYnVtcFNjcm9sbFkoMCkKK3sKKyAgY2xpcHBlciA9IG5ldyBUWFdpbmRvdyhkcHksIHdpZHRoKCktc2Nyb2xsYmFyU2l6ZSwgaGVpZ2h0KCktc2Nyb2xsYmFyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgY2xpcHBlci0+c2V0QmcoYmxhY2spOworICBoU2Nyb2xsYmFyID0gbmV3IFRYU2Nyb2xsYmFyKGRweSwgd2lkdGgoKS1zY3JvbGxiYXJTaXplLCBzY3JvbGxiYXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0aGlzLCB0aGlzKTsKKyAgdlNjcm9sbGJhciA9IG5ldyBUWFNjcm9sbGJhcihkcHksIHNjcm9sbGJhclNpemUsIGhlaWdodCgpLXNjcm9sbGJhclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdGhpcywgdGhpcyk7Cit9CisKK1RYVmlld3BvcnQ6On5UWFZpZXdwb3J0KCkKK3sKKyAgZGVsZXRlIGNsaXBwZXI7CisgIGRlbGV0ZSBoU2Nyb2xsYmFyOworICBkZWxldGUgdlNjcm9sbGJhcjsKK30KKwordm9pZCBUWFZpZXdwb3J0OjpzZXRDaGlsZChUWFdpbmRvdyogY2hpbGRfKQoreworICBjaGlsZCA9IGNoaWxkXzsKKyAgWFJlcGFyZW50V2luZG93KGRweSwgY2hpbGQtPndpbigpLCBjbGlwcGVyLT53aW4oKSwgMCwgMCk7CisgIHhPZmYgPSB5T2ZmID0gMDsKKyAgY2hpbGQtPm1hcCgpOworICByZXNpemVOb3RpZnkoKTsKK30KKworYm9vbCBUWFZpZXdwb3J0OjpzZXRPZmZzZXQoaW50IHgsIGludCB5KQoreworICBpZiAoY2xpcHBlci0+d2lkdGgoKSA+PSBjaGlsZC0+d2lkdGgoKSkgeworICAgIHggPSAoY2xpcHBlci0+d2lkdGgoKSAtIGNoaWxkLT53aWR0aCgpKSAvIDI7CisgIH0gZWxzZSB7CisgICAgaWYgKHggPiAwKSB4ID0gMDsKKyAgICBpZiAoeCArIGNoaWxkLT53aWR0aCgpIDwgY2xpcHBlci0+d2lkdGgoKSkKKyAgICAgIHggPSBjbGlwcGVyLT53aWR0aCgpIC0gY2hpbGQtPndpZHRoKCk7CisgIH0KKworICBpZiAoY2xpcHBlci0+aGVpZ2h0KCkgPj0gY2hpbGQtPmhlaWdodCgpKSB7CisgICAgeSA9IChjbGlwcGVyLT5oZWlnaHQoKSAtIGNoaWxkLT5oZWlnaHQoKSkgLyAyOworICB9IGVsc2UgeworICAgIGlmICh5ID4gMCkgeSA9IDA7CisgICAgaWYgKHkgKyBjaGlsZC0+aGVpZ2h0KCkgPCBjbGlwcGVyLT5oZWlnaHQoKSkKKyAgICAgIHkgPSBjbGlwcGVyLT5oZWlnaHQoKSAtIGNoaWxkLT5oZWlnaHQoKTsKKyAgfQorCisgIGlmICh4ICE9IHhPZmYgfHwgeSAhPSB5T2ZmKSB7CisgICAgeE9mZiA9IHg7CisgICAgeU9mZiA9IHk7CisgICAgY2hpbGQtPm1vdmUoeE9mZiwgeU9mZik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVFhWaWV3cG9ydDo6c2V0QnVtcFNjcm9sbChib29sIGIpCit7CisgIGJ1bXBTY3JvbGwgPSBiOworICByZXNpemVOb3RpZnkoKTsKK30KKworLy8gTm90ZTogYnVtcFNjcm9sbEV2ZW50KCkgb25seSB3b3JrcyBpZiB0aGUgdmlld3BvcnQgaXMgcG9zaXRpb25lZCBhdCAwLDAgYW5kCisvLyBpcyB0aGUgc2FtZSB3aWR0aCBhbmQgaGVpZ2h0IGFzIHRoZSBzY3JlZW4uCitib29sIFRYVmlld3BvcnQ6OmJ1bXBTY3JvbGxFdmVudChYTW90aW9uRXZlbnQqIGV2KQoreworICBpZiAoIWJ1bXBTY3JvbGwpIHJldHVybiBmYWxzZTsKKyAgaW50IGJ1bXBTY3JvbGxQaXhlbHMgPSAyMDsKKyAgYnVtcFNjcm9sbFggPSBidW1wU2Nyb2xsWSA9IDA7CisKKyAgaWYgKGV2LT54X3Jvb3QgPT0gd2lkdGgoKS0xKSAgYnVtcFNjcm9sbFggPSAtYnVtcFNjcm9sbFBpeGVsczsKKyAgZWxzZSBpZiAoZXYtPnhfcm9vdCA9PSAwKSAgICAgYnVtcFNjcm9sbFggPSBidW1wU2Nyb2xsUGl4ZWxzOworICBpZiAoZXYtPnlfcm9vdCA9PSBoZWlnaHQoKS0xKSBidW1wU2Nyb2xsWSA9IC1idW1wU2Nyb2xsUGl4ZWxzOworICBlbHNlIGlmIChldi0+eV9yb290ID09IDApICAgICBidW1wU2Nyb2xsWSA9IGJ1bXBTY3JvbGxQaXhlbHM7CisKKyAgaWYgKGJ1bXBTY3JvbGxYIHx8IGJ1bXBTY3JvbGxZKSB7CisgICAgaWYgKGJ1bXBTY3JvbGxUaW1lci5pc1N0YXJ0ZWQoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKHNldE9mZnNldCh4T2ZmICsgYnVtcFNjcm9sbFgsIHlPZmYgKyBidW1wU2Nyb2xsWSkpIHsKKyAgICAgIGJ1bXBTY3JvbGxUaW1lci5zdGFydCgyNSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBidW1wU2Nyb2xsVGltZXIuc3RvcCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVFhWaWV3cG9ydDo6aGFuZGxlVGltZW91dChyZmI6OlRpbWVyKiB0aW1lcikgeworICByZXR1cm4gc2V0T2Zmc2V0KHhPZmYgKyBidW1wU2Nyb2xsWCwgeU9mZiArIGJ1bXBTY3JvbGxZKTsKK30KKwordm9pZCBUWFZpZXdwb3J0OjpyZXNpemVOb3RpZnkoKQoreworICBuZWVkU2Nyb2xsYmFycyA9ICghYnVtcFNjcm9sbCAmJgorICAgICAgICAgICAgICAgICAgICAod2lkdGgoKSA8IGNoaWxkLT53aWR0aCgpIHx8IGhlaWdodCgpIDwgY2hpbGQtPmhlaWdodCgpKSAmJgorICAgICAgICAgICAgICAgICAgICAod2lkdGgoKSA+IHNjcm9sbGJhclNpemUgJiYgaGVpZ2h0KCkgPiBzY3JvbGxiYXJTaXplKSk7CisgIGlmIChuZWVkU2Nyb2xsYmFycykgeworICAgIGNsaXBwZXItPnJlc2l6ZSh3aWR0aCgpLXNjcm9sbGJhclNpemUsIGhlaWdodCgpLXNjcm9sbGJhclNpemUpOworICAgIGhTY3JvbGxiYXItPm1hcCgpOworICAgIHZTY3JvbGxiYXItPm1hcCgpOworICB9IGVsc2UgeworICAgIGNsaXBwZXItPnJlc2l6ZSh3aWR0aCgpLCBoZWlnaHQoKSk7CisgICAgaFNjcm9sbGJhci0+dW5tYXAoKTsKKyAgICB2U2Nyb2xsYmFyLT51bm1hcCgpOworICB9CisKKyAgc2V0T2Zmc2V0KHhPZmYsIHlPZmYpOworCisgIGlmIChuZWVkU2Nyb2xsYmFycykgeworICAgIGhTY3JvbGxiYXItPm1vdmUoMCwgaGVpZ2h0KCktc2Nyb2xsYmFyU2l6ZSk7CisgICAgaFNjcm9sbGJhci0+cmVzaXplKHdpZHRoKCktc2Nyb2xsYmFyU2l6ZSwgc2Nyb2xsYmFyU2l6ZSk7CisgICAgaFNjcm9sbGJhci0+c2V0KGNoaWxkLT53aWR0aCgpLCAteE9mZiwgd2lkdGgoKS1zY3JvbGxiYXJTaXplKTsKKyAgICB2U2Nyb2xsYmFyLT5tb3ZlKHdpZHRoKCktc2Nyb2xsYmFyU2l6ZSwgMCk7CisgICAgdlNjcm9sbGJhci0+cmVzaXplKHNjcm9sbGJhclNpemUsIGhlaWdodCgpLXNjcm9sbGJhclNpemUpOworICAgIHZTY3JvbGxiYXItPnNldChjaGlsZC0+aGVpZ2h0KCksIC15T2ZmLCBoZWlnaHQoKS1zY3JvbGxiYXJTaXplKTsKKyAgfQorfQorCit2b2lkIFRYVmlld3BvcnQ6OnNjcm9sbGJhclBvcyhpbnQgeCwgaW50IHksIFRYU2Nyb2xsYmFyKiBzYikKK3sKKyAgaWYgKHNiID09IGhTY3JvbGxiYXIpIHsKKyAgICB4ID0gLXg7CisgICAgeSA9IHlPZmY7CisgIH0gZWxzZSB7CisgICAgeCA9IHhPZmY7CisgICAgeSA9IC15OworICB9CisgIHNldE9mZnNldCh4LCB5KTsKK30KZGlmZiAtLWdpdCBhL3VuaXgvdHgvVFhWaWV3cG9ydC5oIGIvdW5peC90eC9UWFZpZXdwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5ODU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdHgvVFhWaWV3cG9ydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWFZpZXdwb3J0LmgKKy8vCisvLyBBIFRYVmlld3BvcnQgYWxsb3dzIGEgbGFyZ2Ugd2luZG93IHRvIGJlIHZpZXdlZCBieSBhZGRpbmcgc2Nyb2xsYmFycyB0byB0aGUKKy8vIHJpZ2h0IGFuZCBib3R0b20gaWYgbmVjZXNzYXJ5LiAgSXQgYWxzbyBoYXMgYSBidW1wLXNjcm9sbCBtb2RlIHdoZXJlIHRoZXJlCisvLyBhcmUgbm8gc2Nyb2xsYmFycywgYW5kIHNjcm9sbGluZyBpcyBhY2hpZXZlZCBieSBidW1waW5nIHVwIGFnYWluc3QgdGhlIGVkZ2UKKy8vIG9mIHRoZSBzY3JlZW4gaW5zdGVhZC4gIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2hlbiB0aGUgdmlld3BvcnQgZmlsbHMKKy8vIHRoZSBlbnRpcmUgc2NyZWVuLiAgSWYgdGhlIGNoaWxkIHdpbmRvdyBpcyBzbWFsbGVyIHRoYW4gdGhlIHZpZXdwb3J0LCBpdCBpcworLy8gYWx3YXlzIHBvc2l0aW9uZWQgY2VudHJhbGx5IGluIHRoZSB2aWV3cG9ydC4KKworI2lmbmRlZiBfX1RYVklFV1BPUlRfSF9fCisjZGVmaW5lIF9fVFhWSUVXUE9SVF9IX18KKworI2luY2x1ZGUgPHJmYi9UaW1lci5oPgorI2luY2x1ZGUgIlRYV2luZG93LmgiCisjaW5jbHVkZSAiVFhTY3JvbGxiYXIuaCIKKworY2xhc3MgVFhWaWV3cG9ydCA6IHB1YmxpYyBUWFdpbmRvdywgcHVibGljIFRYU2Nyb2xsYmFyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgcHVibGljIHJmYjo6VGltZXI6OkNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgVFhWaWV3cG9ydChEaXNwbGF5KiBkcHlfLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFRYV2luZG93KiBwYXJlbnRfPTApOworICB2aXJ0dWFsIH5UWFZpZXdwb3J0KCk7CisKKyAgLy8gc2V0Q2hpbGQoKSBzZXRzIHRoZSBjaGlsZCB3aW5kb3cgd2hpY2ggaXMgdG8gYmUgdmlld2VkIGluIHRoZSB2aWV3cG9ydC4KKyAgdm9pZCBzZXRDaGlsZChUWFdpbmRvdyogY2hpbGRfKTsKKworICAvLyBzZXRPZmZzZXQoKSBzZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hpbGQgaW4gdGhlIHZpZXdwb3J0LiAgTm90ZSB0aGF0IHRoZQorICAvLyBvZmZzZXRzIGFyZSBuZWdhdGl2ZS4gIEZvciBleGFtcGxlIHdoZW4gdGhlIG9mZnNldCBpcyAoLTEwMCwtMzApLCBwb3NpdGlvbgorICAvLyAoMTAwLDMwKSBpbiB0aGUgY2hpbGQgd2luZG93IGlzIGF0IHRoZSB0b3AtbGVmdCBvZiB0aGUgdmlld3BvcnQuICBUaGUKKyAgLy8gb2Zmc2V0cyBnaXZlbiBhcmUgY2xpcHBlZCB0byBrZWVwIHRoZSBjaGlsZCB3aW5kb3cgZmlsbGluZyB0aGUgdmlld3BvcnQKKyAgLy8gKGV4Y2VwdCB3aGVyZSB0aGUgY2hpbGQgd2luZG93IGlzIHNtYWxsZXIgdGhhbiB0aGUgdmlld3BvcnQsIGluIHdoaWNoIGNhc2UKKyAgLy8gaXQgaXMgYWx3YXlzIHBvc2l0aW9uZWQgY2VudHJhbGx5IGluIHRoZSB2aWV3cG9ydCkuICBJdCByZXR1cm5zIHRydWUgaWYKKyAgLy8gdGhlIGNoaWxkIHdhcyByZXBvc2l0aW9uZWQuCisgIGJvb2wgc2V0T2Zmc2V0KGludCB4LCBpbnQgeSk7CisKKyAgLy8gc2V0QnVtcFNjcm9sbCgpIHB1dHMgdGhlIHZpZXdwb3J0IGluIGJ1bXAtc2Nyb2xsIG1vZGUuCisgIHZvaWQgc2V0QnVtcFNjcm9sbChib29sIGIpOworCisgIC8vIGJ1bXBTY3JvbGxFdmVudCgpIGNhbiBiZSBjYWxsZWQgd2l0aCBhIE1vdGlvbk5vdGlmeSBldmVudCB3aGljaCBtYXkKKyAgLy8gcG90ZW50aWFsbHkgYmUgYWdhaW5zdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuLiAgSXQgcmV0dXJucyB0cnVlIGlmIHRoZQorICAvLyBldmVudCB3YXMgdXNlZCBmb3IgYnVtcC1zY3JvbGxpbmcsIGZhbHNlIGlmIGl0IHNob3VsZCBiZSBwcm9jZXNzZWQKKyAgLy8gbm9ybWFsbHkuCisgIGJvb2wgYnVtcFNjcm9sbEV2ZW50KFhNb3Rpb25FdmVudCogZXYpOworCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgcmVzaXplTm90aWZ5KCk7CisgIHZpcnR1YWwgdm9pZCBzY3JvbGxiYXJQb3MoaW50IHgsIGludCB5LCBUWFNjcm9sbGJhciogc2IpOworICB2aXJ0dWFsIGJvb2wgaGFuZGxlVGltZW91dChyZmI6OlRpbWVyKiB0aW1lcik7CisgIFRYV2luZG93KiBjbGlwcGVyOworICBUWFdpbmRvdyogY2hpbGQ7CisgIFRYU2Nyb2xsYmFyKiBoU2Nyb2xsYmFyOworICBUWFNjcm9sbGJhciogdlNjcm9sbGJhcjsKKyAgY29uc3QgaW50IHNjcm9sbGJhclNpemU7CisgIGludCB4T2ZmLCB5T2ZmOworICByZmI6OlRpbWVyIGJ1bXBTY3JvbGxUaW1lcjsKKyAgYm9vbCBidW1wU2Nyb2xsOworICBib29sIG5lZWRTY3JvbGxiYXJzOworICBpbnQgYnVtcFNjcm9sbFgsIGJ1bXBTY3JvbGxZOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC90eC9UWFdpbmRvdy5jeHggYi91bml4L3R4L1RYV2luZG93LmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDIxMWJlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWFdpbmRvdy5jeHgKQEAgLTAsMCArMSw0ODYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBUWFdpbmRvdy5jeHgKKy8vCisKKyNpbmNsdWRlIDxYMTEvWGF0b20uaD4KKyNpbmNsdWRlICJUWFdpbmRvdy5oIgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxyZmIvdXRpbC5oPgorCitzdGQ6Omxpc3Q8VFhXaW5kb3cqPiB3aW5kb3dzOworCitBdG9tIHdtUHJvdG9jb2xzLCB3bURlbGV0ZVdpbmRvdywgd21UYWtlRm9jdXM7CitBdG9tIHhhVElNRVNUQU1QLCB4YVRBUkdFVFMsIHhhU0VMRUNUSU9OX1RJTUUsIHhhU0VMRUNUSU9OX1NUUklORzsKK0F0b20geGFDTElQQk9BUkQ7Cit1bnNpZ25lZCBsb25nIFRYV2luZG93OjpibGFjaywgVFhXaW5kb3c6OndoaXRlOwordW5zaWduZWQgbG9uZyBUWFdpbmRvdzo6ZGVmYXVsdEZnLCBUWFdpbmRvdzo6ZGVmYXVsdEJnOwordW5zaWduZWQgbG9uZyBUWFdpbmRvdzo6bGlnaHRCZywgVFhXaW5kb3c6OmRhcmtCZzsKK3Vuc2lnbmVkIGxvbmcgVFhXaW5kb3c6OmRpc2FibGVkRmcsIFRYV2luZG93OjpkaXNhYmxlZEJnOwordW5zaWduZWQgbG9uZyBUWFdpbmRvdzo6ZW5hYmxlZEJnOwordW5zaWduZWQgbG9uZyBUWFdpbmRvdzo6c2Nyb2xsYmFyQmc7CitDb2xvcm1hcCBUWFdpbmRvdzo6Y21hcCA9IDA7CitHQyBUWFdpbmRvdzo6ZGVmYXVsdEdDID0gMDsKK0ZvbnQgVFhXaW5kb3c6OmRlZmF1bHRGb250ID0gMDsKK1hGb250U3RydWN0KiBUWFdpbmRvdzo6ZGVmYXVsdEZTID0gMDsKK1RpbWUgVFhXaW5kb3c6OmN1dEJ1ZmZlclRpbWUgPSAwOworUGl4bWFwIFRYV2luZG93Ojpkb3QgPSAwLCBUWFdpbmRvdzo6dGljayA9IDA7Citjb25zdCBpbnQgVFhXaW5kb3c6OmRvdFNpemUgPSA0LCBUWFdpbmRvdzo6dGlja1NpemUgPSA4OworY2hhciogVFhXaW5kb3c6OmRlZmF1bHRXaW5kb3dDbGFzczsKKwordm9pZCBUWFdpbmRvdzo6aW5pdChEaXNwbGF5KiBkcHksIGNvbnN0IGNoYXIqIGRlZmF1bHRXaW5kb3dDbGFzc18pCit7CisgIGNtYXAgPSBEZWZhdWx0Q29sb3JtYXAoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSk7CisgIHdtUHJvdG9jb2xzID0gWEludGVybkF0b20oZHB5LCAiV01fUFJPVE9DT0xTIiwgRmFsc2UpOworICB3bURlbGV0ZVdpbmRvdyA9IFhJbnRlcm5BdG9tKGRweSwgIldNX0RFTEVURV9XSU5ET1ciLCBGYWxzZSk7CisgIHdtVGFrZUZvY3VzID0gWEludGVybkF0b20oZHB5LCAiV01fVEFLRV9GT0NVUyIsIEZhbHNlKTsKKyAgeGFUSU1FU1RBTVAgPSBYSW50ZXJuQXRvbShkcHksICJUSU1FU1RBTVAiLCBGYWxzZSk7CisgIHhhVEFSR0VUUyA9IFhJbnRlcm5BdG9tKGRweSwgIlRBUkdFVFMiLCBGYWxzZSk7CisgIHhhU0VMRUNUSU9OX1RJTUUgPSBYSW50ZXJuQXRvbShkcHksICJTRUxFQ1RJT05fVElNRSIsIEZhbHNlKTsKKyAgeGFTRUxFQ1RJT05fU1RSSU5HID0gWEludGVybkF0b20oZHB5LCAiU0VMRUNUSU9OX1NUUklORyIsIEZhbHNlKTsKKyAgeGFDTElQQk9BUkQgPSBYSW50ZXJuQXRvbShkcHksICJDTElQQk9BUkQiLCBGYWxzZSk7CisgIFhDb2xvciBjb2xzWzZdOworICBjb2xzWzBdLnJlZCA9IGNvbHNbMF0uZ3JlZW4gPSBjb2xzWzBdLmJsdWUgPSAweDAwMDA7CisgIGNvbHNbMV0ucmVkID0gY29sc1sxXS5ncmVlbiA9IGNvbHNbMV0uYmx1ZSA9IDB4YmJiYjsKKyAgY29sc1syXS5yZWQgPSBjb2xzWzJdLmdyZWVuID0gY29sc1syXS5ibHVlID0gMHhlZWVlOworICBjb2xzWzNdLnJlZCA9IGNvbHNbM10uZ3JlZW4gPSBjb2xzWzNdLmJsdWUgPSAweDU1NTU7CisgIGNvbHNbNF0ucmVkID0gY29sc1s0XS5ncmVlbiA9IGNvbHNbNF0uYmx1ZSA9IDB4ODg4ODsKKyAgY29sc1s1XS5yZWQgPSBjb2xzWzVdLmdyZWVuID0gY29sc1s1XS5ibHVlID0gMHhmZmZmOworICBnZXRDb2xvdXJzKGRweSwgY29scywgNik7CisgIGJsYWNrID0gZGVmYXVsdEZnID0gY29sc1swXS5waXhlbDsKKyAgZGVmYXVsdEJnID0gZGlzYWJsZWRCZyA9IGNvbHNbMV0ucGl4ZWw7CisgIGxpZ2h0QmcgPSBjb2xzWzJdLnBpeGVsOworICBkYXJrQmcgPSBkaXNhYmxlZEZnID0gY29sc1szXS5waXhlbDsKKyAgc2Nyb2xsYmFyQmcgPSBjb2xzWzRdLnBpeGVsOworICB3aGl0ZSA9IGVuYWJsZWRCZyA9IGNvbHNbNV0ucGl4ZWw7CisgIGRlZmF1bHRHQyA9IFhDcmVhdGVHQyhkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIDAsIDApOworICBkZWZhdWx0RlMKKyAgICA9IFhMb2FkUXVlcnlGb250KGRweSwgIi0qLWhlbHZldGljYS1tZWRpdW0tci0qLSotMTItKi0qLSotKi0qLSotKiIpOworICBpZiAoIWRlZmF1bHRGUykgeworICAgIGRlZmF1bHRGUyA9IFhMb2FkUXVlcnlGb250KGRweSwgImZpeGVkIik7CisgICAgaWYgKCFkZWZhdWx0RlMpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCJGYWlsZWQgdG8gbG9hZCBhbnkgZm9udFxuIik7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorICBkZWZhdWx0Rm9udCA9IGRlZmF1bHRGUy0+ZmlkOworICBYU2V0Rm9yZWdyb3VuZChkcHksIGRlZmF1bHRHQywgZGVmYXVsdEZnKTsKKyAgWFNldEJhY2tncm91bmQoZHB5LCBkZWZhdWx0R0MsIGRlZmF1bHRCZyk7CisgIFhTZXRGb250KGRweSwgZGVmYXVsdEdDLCBkZWZhdWx0Rm9udCk7CisgIFhTZWxlY3RJbnB1dChkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIFByb3BlcnR5Q2hhbmdlTWFzayk7CisKKyAgc3RhdGljIGNoYXIgZG90Qml0c1tdID0geyAweDA2LCAweDBmLCAweDBmLCAweDA2fTsKKyAgZG90ID0gWENyZWF0ZUJpdG1hcEZyb21EYXRhKGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgZG90Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdFNpemUsIGRvdFNpemUpOworICBzdGF0aWMgY2hhciB0aWNrQml0c1tdID0geyAweDgwLCAweGMwLCAweGUyLCAweDc2LCAweDNlLCAweDFjLCAweDA4LCAweDAwfTsKKyAgdGljayA9IFhDcmVhdGVCaXRtYXBGcm9tRGF0YShkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIHRpY2tCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tTaXplLCB0aWNrU2l6ZSk7CisgIGRlZmF1bHRXaW5kb3dDbGFzcyA9IHJmYjo6c3RyRHVwKGRlZmF1bHRXaW5kb3dDbGFzc18pOworfQorCit2b2lkIFRYV2luZG93OjpoYW5kbGVYRXZlbnRzKERpc3BsYXkqIGRweSkKK3sKKyAgd2hpbGUgKFhQZW5kaW5nKGRweSkpIHsKKyAgICBYRXZlbnQgZXY7CisgICAgWE5leHRFdmVudChkcHksICZldik7CisgICAgaWYgKGV2LnR5cGUgPT0gTWFwcGluZ05vdGlmeSkgeworICAgICAgWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoJmV2LnhtYXBwaW5nKTsKKyAgICB9IGVsc2UgaWYgKGV2LnR5cGUgPT0gUHJvcGVydHlOb3RpZnkgJiYKKyAgICAgICAgICAgICAgIGV2Lnhwcm9wZXJ0eS53aW5kb3cgPT0gRGVmYXVsdFJvb3RXaW5kb3coZHB5KSAmJgorICAgICAgICAgICAgICAgZXYueHByb3BlcnR5LmF0b20gPT0gWEFfQ1VUX0JVRkZFUjApIHsKKyAgICAgIGN1dEJ1ZmZlclRpbWUgPSBldi54cHJvcGVydHkudGltZTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpsaXN0PFRYV2luZG93Kj46Oml0ZXJhdG9yIGk7CisgICAgICBmb3IgKGkgPSB3aW5kb3dzLmJlZ2luKCk7IGkgIT0gd2luZG93cy5lbmQoKTsgaSsrKSB7CisgICAgICAgIGlmICgoKmkpLT53aW4oKSA9PSBldi54YW55LndpbmRvdykKKyAgICAgICAgICAoKmkpLT5oYW5kbGVYRXZlbnQoJmV2KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBUWFdpbmRvdzo6Z2V0Q29sb3VycyhEaXNwbGF5KiBkcHksIFhDb2xvciogY29scywgaW50IG5Db2xzKQoreworICBib29sKiBnb3QgPSBuZXcgYm9vbFtuQ29sc107CisgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbkNvbHM7IGkrKykgeworICAgIGlmIChYQWxsb2NDb2xvcihkcHksIGNtYXAsICZjb2xzW2ldKSkgeworICAgICAgZ290W2ldID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgZ290W2ldID0gZmFsc2U7CisgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmICghZmFpbGVkKSB7CisgICAgZGVsZXRlIFtdIGdvdDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBBbGxvY0NvbG9yIGhhcyBmYWlsZWQuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbG9ybWFwIGlzIGZ1bGwuICBTbyB0aGUKKyAgLy8gb25seSB0aGluZyB3ZSBjYW4gZG8gaXMgdXNlIHRoZSAic2hhcmVkIiBwaXhlbHMgaW4gdGhlIGNvbG9ybWFwLiAgVGhlCisgIC8vIGNvZGUgYmVsb3cgaXMgZGVzaWduZWQgdG8gd29yayBldmVuIHdoZW4gdGhlIGNvbG9ybWFwIGlzbid0IGZ1bGwgc28gaXMKKyAgLy8gbW9yZSBjb21wbGV4IHRoYW4gaXQgbmVlZHMgdG8gYmUgaW4gdGhpcyBjYXNlLiAgSG93ZXZlciBpdCB3b3VsZCBiZQorICAvLyB1c2VmdWwgb25lIGRheSB0byBiZSBhYmxlIHRvIHJlc3RyaWN0IHRoZSBudW1iZXIgb2YgY29sb3VycyBhbGxvY2F0ZWQgYnkKKyAgLy8gYW4gYXBwbGljYXRpb24gc28gSSdtIGxlYXZpbmcgaXQgaW4gaGVyZS4KKworICAvLyBGb3IgZWFjaCBwaXhlbCBpbiB0aGUgY29sb3JtYXAsIHRyeSB0byBhbGxvY2F0ZSBleGFjdGx5IGl0cyBSR0IgdmFsdWVzLgorICAvLyBJZiB0aGlzIHJldHVybnMgYSBkaWZmZXJlbnQgcGl4ZWwgdGhlbiBpdCBtdXN0IGJlIGEgcHJpdmF0ZSBvcgorICAvLyB1bmFsbG9jYXRlZCBwaXhlbCwgc28gd2UgY2FuJ3QgdXNlIGl0LiAgSWYgaXQgcmV0dXJucyB1cyB0aGUgc2FtZSBwaXhlbAorICAvLyBhZ2FpbiwgaXQncyBhbG1vc3QgY2VydGFpbmx5IGEgc2hhcmVkIGNvbG91ciwgc28gd2UgY2FuIHVzZSBpdCAoYWN0dWFsbHkKKyAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBpdCB3YXMgYW4gdW5hbGxvY2F0ZWQgcGl4ZWwgd2hpY2ggd2UndmUgbm93CisgIC8vIGFsbG9jYXRlZCAtIGJ5IGdvaW5nIHRocm91Z2ggdGhlIHBpeGVscyBpbiByZXZlcnNlIG9yZGVyIHdlIG1ha2UgdGhpcworICAvLyB1bmxpa2VseSBleGNlcHQgZm9yIHRoZSBsb3dlc3QgdW5hbGxvY2F0ZWQgcGl4ZWwgLSB0aGlzIHdvcmtzIGJlY2F1c2Ugb2YKKyAgLy8gdGhlIHdheSB0aGUgWCBzZXJ2ZXIgYWxsb2NhdGVzIG5ldyBwaXhlbHMpLgorCisgIGludCBjbWFwU2l6ZSA9IERpc3BsYXlDZWxscyhkcHksRGVmYXVsdFNjcmVlbihkcHkpKTsKKworICBYQ29sb3IqIGNtID0gbmV3IFhDb2xvcltjbWFwU2l6ZV07CisgIGJvb2wqIHNoYXJlZCA9IG5ldyBib29sW2NtYXBTaXplXTsKKyAgYm9vbCogdXNlZEFzTmVhcmVzdCA9IG5ldyBib29sW2NtYXBTaXplXTsKKworICBmb3IgKGkgPSAwOyBpIDwgY21hcFNpemU7IGkrKykgeworICAgIGNtW2ldLnBpeGVsID0gaTsKKyAgICBzaGFyZWRbaV0gPSB1c2VkQXNOZWFyZXN0W2ldID0gZmFsc2U7CisgIH0KKworICBYUXVlcnlDb2xvcnMoZHB5LCBjbWFwLCBjbSwgY21hcFNpemUpOworCisgIGZvciAoaSA9IGNtYXBTaXplLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKFhBbGxvY0NvbG9yKGRweSwgY21hcCwgJmNtW2ldKSkgeworICAgICAgaWYgKGNtW2ldLnBpeGVsID09ICh1bnNpZ25lZCBsb25nKWkpIHsKKyAgICAgICAgc2hhcmVkW2ldID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFhGcmVlQ29sb3JzKGRweSwgY21hcCwgJmNtW2ldLnBpeGVsLCAxLCAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGludCBqID0gMDsgaiA8IG5Db2xzOyBqKyspIHsKKyAgICB1bnNpZ25lZCBsb25nIG1pbkRpc3RhbmNlID0gVUxPTkdfTUFYOworICAgIHVuc2lnbmVkIGxvbmcgbmVhcmVzdFBpeGVsID0gMDsKKyAgICBpZiAoIWdvdFtqXSkgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNtYXBTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHNoYXJlZFtpXSkgeworICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcmQgPSAoY21baV0ucmVkIC0gY29sc1tqXS5yZWQpLzI7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyBnZCA9IChjbVtpXS5ncmVlbiAtIGNvbHNbal0uZ3JlZW4pLzI7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyBiZCA9IChjbVtpXS5ibHVlIC0gY29sc1tqXS5ibHVlKS8yOworICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGlzdGFuY2UgPSAocmQqcmQgKyBnZCpnZCArIGJkKmJkKTsKKworICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7CisgICAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgbmVhcmVzdFBpeGVsID0gaTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29sc1tqXS5waXhlbCA9IG5lYXJlc3RQaXhlbDsKKyAgICAgIHVzZWRBc05lYXJlc3RbbmVhcmVzdFBpeGVsXSA9IHRydWU7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGNtYXBTaXplOyBpKyspIHsKKyAgICBpZiAoc2hhcmVkW2ldICYmICF1c2VkQXNOZWFyZXN0W2ldKSB7CisgICAgICB1bnNpZ25lZCBsb25nIHAgPSBpOworICAgICAgWEZyZWVDb2xvcnMoZHB5LCBjbWFwLCAmcCwgMSwgMCk7CisgICAgfQorICB9Cit9CisKK1dpbmRvdyBUWFdpbmRvdzo6d2luZG93V2l0aE5hbWUoRGlzcGxheSogZHB5LCBXaW5kb3cgdG9wLCBjb25zdCBjaGFyKiBuYW1lKQoreworICBjaGFyKiB3aW5kb3dOYW1lOworICBpZiAoWEZldGNoTmFtZShkcHksIHRvcCwgJndpbmRvd05hbWUpKSB7CisgICAgaWYgKHN0cmNtcCh3aW5kb3dOYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICBYRnJlZSh3aW5kb3dOYW1lKTsKKyAgICAgIHJldHVybiB0b3A7CisgICAgfQorICAgIFhGcmVlKHdpbmRvd05hbWUpOworICB9CisKKyAgV2luZG93KiBjaGlsZHJlbjsKKyAgV2luZG93IGR1bW15OworICB1bnNpZ25lZCBpbnQgbmNoaWxkcmVuOworICBpZiAoIVhRdWVyeVRyZWUoZHB5LCB0b3AsICZkdW1teSwgJmR1bW15LCAmY2hpbGRyZW4sJm5jaGlsZHJlbikgfHwgIWNoaWxkcmVuKQorICAgIHJldHVybiAwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCluY2hpbGRyZW47IGkrKykgeworICAgIFdpbmRvdyB3ID0gd2luZG93V2l0aE5hbWUoZHB5LCBjaGlsZHJlbltpXSwgbmFtZSk7CisgICAgaWYgKHcpIHsKKyAgICAgIFhGcmVlKChjaGFyKiljaGlsZHJlbik7CisgICAgICByZXR1cm4gdzsKKyAgICB9CisgIH0KKyAgWEZyZWUoKGNoYXIqKWNoaWxkcmVuKTsKKyAgcmV0dXJuIDA7Cit9CisKKworVFhXaW5kb3c6OlRYV2luZG93KERpc3BsYXkqIGRweV8sIGludCB3LCBpbnQgaCwgVFhXaW5kb3cqIHBhcmVudF8sCisgICAgICAgICAgICAgICAgICAgaW50IGJvcmRlcldpZHRoKQorICA6IGRweShkcHlfKSwgeFBhZCgzKSwgeVBhZCgzKSwgYmV2ZWwoMiksIHBhcmVudChwYXJlbnRfKSwgd2lkdGhfKHcpLAorICAgIGhlaWdodF8oaCksIGV2ZW50SGFuZGxlcigwKSwgZHdjKDApLCBldmVudE1hc2soMCksIHRvcGxldmVsXyhmYWxzZSkKK3sKKyAgc2l6ZUhpbnRzLmZsYWdzID0gMDsKKyAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKKyAgYXR0ci5iYWNrZ3JvdW5kX3BpeGVsID0gZGVmYXVsdEJnOworICBhdHRyLmJvcmRlcl9waXhlbCA9IDA7CisgIFdpbmRvdyBwYXIgPSBwYXJlbnQgPyBwYXJlbnQtPndpbigpIDogRGVmYXVsdFJvb3RXaW5kb3coZHB5KTsKKyAgd2luXyA9IFhDcmVhdGVXaW5kb3coZHB5LCBwYXIsIDAsIDAsIHdpZHRoXywgaGVpZ2h0XywgYm9yZGVyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgQ29weUZyb21QYXJlbnQsIENvcHlGcm9tUGFyZW50LCBDb3B5RnJvbVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWwsICZhdHRyKTsKKyAgaWYgKHBhcmVudCkgbWFwKCk7CisKKyAgd2luZG93cy5wdXNoX2JhY2sodGhpcyk7Cit9CisKK1RYV2luZG93Ojp+VFhXaW5kb3coKQoreworICB3aW5kb3dzLnJlbW92ZSh0aGlzKTsKKyAgWERlc3Ryb3lXaW5kb3coZHB5LCB3aW4oKSk7Cit9CisKK3ZvaWQgVFhXaW5kb3c6OnRvcGxldmVsKGNvbnN0IGNoYXIqIG5hbWUsIFRYRGVsZXRlV2luZG93Q2FsbGJhY2sqIGR3Y18sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhcioqIGFyZ3YsIGNvbnN0IGNoYXIqIHdpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpY29uaWMpCit7CisgIHRvcGxldmVsXyA9IHRydWU7CisgIFhXTUhpbnRzIHdtSGludHM7CisgIHdtSGludHMuZmxhZ3MgPSBJbnB1dEhpbnR8U3RhdGVIaW50OworICB3bUhpbnRzLmlucHV0ID0gVHJ1ZTsKKyAgd21IaW50cy5pbml0aWFsX3N0YXRlID0gaWNvbmljID8gSWNvbmljU3RhdGUgOiBOb3JtYWxTdGF0ZTsKKyAgWENsYXNzSGludCBjbGFzc0hpbnQ7CisgIGlmICghd2luZG93Q2xhc3MpIHdpbmRvd0NsYXNzID0gZGVmYXVsdFdpbmRvd0NsYXNzOworICBjbGFzc0hpbnQucmVzX25hbWUgPSAoY2hhciopbmFtZTsKKyAgY2xhc3NIaW50LnJlc19jbGFzcyA9IChjaGFyKil3aW5kb3dDbGFzczsKKyAgWFNldFdNUHJvcGVydGllcyhkcHksIHdpbigpLCAwLCAwLCBhcmd2LCBhcmdjLAorICAgICAgICAgICAgICAgICAgICZzaXplSGludHMsICZ3bUhpbnRzLCAmY2xhc3NIaW50KTsKKyAgWFN0b3JlTmFtZShkcHksIHdpbigpLCBuYW1lKTsKKyAgWFNldEljb25OYW1lKGRweSwgd2luKCksIG5hbWUpOworICBBdG9tIHByb3RvY29sc1sxMF07CisgIGludCBuUHJvdG9jb2xzID0gMDsKKyAgcHJvdG9jb2xzW25Qcm90b2NvbHMrK10gPSB3bVRha2VGb2N1czsKKyAgZHdjID0gZHdjXzsKKyAgaWYgKGR3YykKKyAgICBwcm90b2NvbHNbblByb3RvY29scysrXSA9IHdtRGVsZXRlV2luZG93OworICBYU2V0V01Qcm90b2NvbHMoZHB5LCB3aW4oKSwgcHJvdG9jb2xzLCBuUHJvdG9jb2xzKTsKKyAgYWRkRXZlbnRNYXNrKFN0cnVjdHVyZU5vdGlmeU1hc2spOworfQorCit2b2lkIFRYV2luZG93OjpzZXRNYXhTaXplKGludCB3LCBpbnQgaCkKK3sKKyAgc2l6ZUhpbnRzLmZsYWdzIHw9IFBNYXhTaXplOworICBzaXplSGludHMubWF4X3dpZHRoID0gdzsKKyAgc2l6ZUhpbnRzLm1heF9oZWlnaHQgPSBoOworICBYU2V0V01Ob3JtYWxIaW50cyhkcHksIHdpbigpLCAmc2l6ZUhpbnRzKTsKK30KKwordm9pZCBUWFdpbmRvdzo6c2V0VVNQb3NpdGlvbihpbnQgeCwgaW50IHkpCit7CisgIHNpemVIaW50cy5mbGFncyB8PSBVU1Bvc2l0aW9uOworICBzaXplSGludHMueCA9IHg7CisgIHNpemVIaW50cy55ID0geTsKKyAgWFNldFdNTm9ybWFsSGludHMoZHB5LCB3aW4oKSwgJnNpemVIaW50cyk7CisgIG1vdmUoeCwgeSk7Cit9CisKK3ZvaWQgVFhXaW5kb3c6OnNldEdlb21ldHJ5KGNvbnN0IGNoYXIqIGdlb20sIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICBjaGFyIGRlZkdlb21bMjU2XTsKKyAgc3ByaW50ZihkZWZHZW9tLCIlZHglZCslZCslZCIsdyxoLHgseSk7CisgIFhXTUdlb21ldHJ5KGRweSwgRGVmYXVsdFNjcmVlbihkcHkpLCBzdHJFbXB0eVRvTnVsbCgoY2hhciopZ2VvbSksIGRlZkdlb20sCisgICAgICAgICAgICAgIDAsICZzaXplSGludHMsICZ4LCAmeSwgJncsICZoLCAmc2l6ZUhpbnRzLndpbl9ncmF2aXR5KTsKKyAgc2l6ZUhpbnRzLmZsYWdzIHw9IFBXaW5HcmF2aXR5OworICBzZXRVU1Bvc2l0aW9uKHgsIHkpOworICByZXNpemUodywgaCk7Cit9CisKK1RYRXZlbnRIYW5kbGVyKiBUWFdpbmRvdzo6c2V0RXZlbnRIYW5kbGVyKFRYRXZlbnRIYW5kbGVyKiBoKQoreworICBUWEV2ZW50SGFuZGxlciogb2xkID0gZXZlbnRIYW5kbGVyOworICBldmVudEhhbmRsZXIgPSBoOworICByZXR1cm4gb2xkOworfQorCit2b2lkIFRYV2luZG93OjphZGRFdmVudE1hc2sobG9uZyBtYXNrKQoreworICBldmVudE1hc2sgfD0gbWFzazsKKyAgWFNlbGVjdElucHV0KGRweSwgd2luKCksIGV2ZW50TWFzayk7Cit9CisKK3ZvaWQgVFhXaW5kb3c6OnJlbW92ZUV2ZW50TWFzayhsb25nIG1hc2spCit7CisgIGV2ZW50TWFzayAmPSB+bWFzazsKKyAgWFNlbGVjdElucHV0KGRweSwgd2luKCksIGV2ZW50TWFzayk7Cit9CisKK3ZvaWQgVFhXaW5kb3c6OnVubWFwKCkKK3sKKyAgWFVubWFwV2luZG93KGRweSwgd2luKCkpOworICBpZiAodG9wbGV2ZWxfKSB7CisgICAgWFVubWFwRXZlbnQgdWU7CisgICAgdWUudHlwZSA9IFVubWFwTm90aWZ5OworICAgIHVlLmRpc3BsYXkgPSBkcHk7CisgICAgdWUuZXZlbnQgPSBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpOworICAgIHVlLndpbmRvdyA9IHdpbigpOworICAgIHVlLmZyb21fY29uZmlndXJlID0gRmFsc2U7CisgICAgWFNlbmRFdmVudChkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIEZhbHNlLAorICAgICAgICAgICAgICAgKFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFza3xTdWJzdHJ1Y3R1cmVOb3RpZnlNYXNrKSwKKyAgICAgICAgICAgICAgIChYRXZlbnQqKSZ1ZSk7CisgIH0KK30KKwordm9pZCBUWFdpbmRvdzo6cmVzaXplKGludCB3LCBpbnQgaCkKK3sKKyAgLy9pZiAodyA9PSB3aWR0aF8gJiYgaCA9PSBoZWlnaHRfKSByZXR1cm47CisgIFhSZXNpemVXaW5kb3coZHB5LCB3aW4oKSwgdywgaCk7CisgIHdpZHRoXyA9IHc7CisgIGhlaWdodF8gPSBoOworICByZXNpemVOb3RpZnkoKTsKK30KKwordm9pZCBUWFdpbmRvdzo6c2V0Qm9yZGVyV2lkdGgoaW50IGJ3KQoreworICBYV2luZG93Q2hhbmdlcyBjOworICBjLmJvcmRlcl93aWR0aCA9IGJ3OworICBYQ29uZmlndXJlV2luZG93KGRweSwgd2luKCksIENXQm9yZGVyV2lkdGgsICZjKTsKK30KKwordm9pZCBUWFdpbmRvdzo6b3duU2VsZWN0aW9uKEF0b20gc2VsZWN0aW9uLCBUaW1lIHRpbWUpCit7CisgIFhTZXRTZWxlY3Rpb25Pd25lcihkcHksIHNlbGVjdGlvbiwgd2luKCksIHRpbWUpOworICBpZiAoWEdldFNlbGVjdGlvbk93bmVyKGRweSwgc2VsZWN0aW9uKSA9PSB3aW4oKSkgeworICAgIHNlbGVjdGlvbk93bmVyX1tzZWxlY3Rpb25dID0gdHJ1ZTsKKyAgICBzZWxlY3Rpb25Pd25UaW1lW3NlbGVjdGlvbl0gPSB0aW1lOworICB9Cit9CisKK3ZvaWQgVFhXaW5kb3c6OmhhbmRsZVhFdmVudChYRXZlbnQqIGV2KQoreworICBzd2l0Y2ggKGV2LT50eXBlKSB7CisKKyAgY2FzZSBDbGllbnRNZXNzYWdlOgorICAgIGlmIChldi0+eGNsaWVudC5tZXNzYWdlX3R5cGUgPT0gd21Qcm90b2NvbHMpIHsKKyAgICAgIGlmICgoQXRvbSlldi0+eGNsaWVudC5kYXRhLmxbMF0gPT0gd21EZWxldGVXaW5kb3cpIHsKKyAgICAgICAgaWYgKGR3YykgZHdjLT5kZWxldGVXaW5kb3codGhpcyk7CisgICAgICB9IGVsc2UgaWYgKChBdG9tKWV2LT54Y2xpZW50LmRhdGEubFswXSA9PSB3bVRha2VGb2N1cykgeworICAgICAgICB0YWtlRm9jdXMoZXYtPnhjbGllbnQuZGF0YS5sWzFdKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBDb25maWd1cmVOb3RpZnk6CisgICAgaWYgKGV2LT54Y29uZmlndXJlLndpZHRoICE9IHdpZHRoXyB8fCBldi0+eGNvbmZpZ3VyZS5oZWlnaHQgIT0gaGVpZ2h0XykgeworICAgICAgd2lkdGhfID0gZXYtPnhjb25maWd1cmUud2lkdGg7CisgICAgICBoZWlnaHRfID0gZXYtPnhjb25maWd1cmUuaGVpZ2h0OworICAgICAgcmVzaXplTm90aWZ5KCk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgU2VsZWN0aW9uTm90aWZ5OgorICAgIGlmIChldi0+eHNlbGVjdGlvbi5wcm9wZXJ0eSAhPSBOb25lKSB7CisgICAgICBBdG9tIHR5cGU7CisgICAgICBpbnQgZm9ybWF0OworICAgICAgdW5zaWduZWQgbG9uZyBuaXRlbXMsIGFmdGVyOworICAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgIFhHZXRXaW5kb3dQcm9wZXJ0eShkcHksIHdpbigpLCBldi0+eHNlbGVjdGlvbi5wcm9wZXJ0eSwgMCwgMTYzODQsIFRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQW55UHJvcGVydHlUeXBlLCAmdHlwZSwgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbml0ZW1zLCAmYWZ0ZXIsICZkYXRhKTsKKyAgICAgIGlmICh0eXBlICE9IE5vbmUpIHsKKyAgICAgICAgc2VsZWN0aW9uTm90aWZ5KCZldi0+eHNlbGVjdGlvbiwgdHlwZSwgZm9ybWF0LCBuaXRlbXMsIGRhdGEpOworICAgICAgICBYRnJlZShkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHNlbGVjdGlvbk5vdGlmeSgmZXYtPnhzZWxlY3Rpb24sIDAsIDAsIDAsIDApOworICAgIGJyZWFrOworCisgIGNhc2UgU2VsZWN0aW9uUmVxdWVzdDoKKyAgICB7CisgICAgICBYU2VsZWN0aW9uRXZlbnQgc2U7CisgICAgICBzZS50eXBlID0gU2VsZWN0aW9uTm90aWZ5OworICAgICAgc2UuZGlzcGxheSA9IGV2LT54c2VsZWN0aW9ucmVxdWVzdC5kaXNwbGF5OworICAgICAgc2UucmVxdWVzdG9yID0gZXYtPnhzZWxlY3Rpb25yZXF1ZXN0LnJlcXVlc3RvcjsKKyAgICAgIHNlLnNlbGVjdGlvbiA9IGV2LT54c2VsZWN0aW9ucmVxdWVzdC5zZWxlY3Rpb247CisgICAgICBzZS50aW1lID0gZXYtPnhzZWxlY3Rpb25yZXF1ZXN0LnRpbWU7CisgICAgICBzZS50YXJnZXQgPSBldi0+eHNlbGVjdGlvbnJlcXVlc3QudGFyZ2V0OworICAgICAgaWYgKGV2LT54c2VsZWN0aW9ucmVxdWVzdC5wcm9wZXJ0eSA9PSBOb25lKQorICAgICAgICBldi0+eHNlbGVjdGlvbnJlcXVlc3QucHJvcGVydHkgPSBldi0+eHNlbGVjdGlvbnJlcXVlc3QudGFyZ2V0OworICAgICAgaWYgKCFzZWxlY3Rpb25Pd25lcl9bc2Uuc2VsZWN0aW9uXSkgeworICAgICAgICBzZS5wcm9wZXJ0eSA9IE5vbmU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZS5wcm9wZXJ0eSA9IGV2LT54c2VsZWN0aW9ucmVxdWVzdC5wcm9wZXJ0eTsKKyAgICAgICAgaWYgKHNlLnRhcmdldCA9PSB4YVRBUkdFVFMpIHsKKyAgICAgICAgICBBdG9tIHRhcmdldHNbMl07CisgICAgICAgICAgdGFyZ2V0c1swXSA9IHhhVElNRVNUQU1QOworICAgICAgICAgIHRhcmdldHNbMV0gPSBYQV9TVFJJTkc7CisgICAgICAgICAgWENoYW5nZVByb3BlcnR5KGRweSwgc2UucmVxdWVzdG9yLCBzZS5wcm9wZXJ0eSwgWEFfQVRPTSwgMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIqKXRhcmdldHMsIDIpOworICAgICAgICB9IGVsc2UgaWYgKHNlLnRhcmdldCA9PSB4YVRJTUVTVEFNUCkgeworICAgICAgICAgIHJkcjo6VTMyIHQgPSBzZWxlY3Rpb25Pd25UaW1lW3NlLnNlbGVjdGlvbl07CisgICAgICAgICAgWENoYW5nZVByb3BlcnR5KGRweSwgc2UucmVxdWVzdG9yLCBzZS5wcm9wZXJ0eSwgWEFfSU5URUdFUiwgMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIqKSZ0LCAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZS50YXJnZXQgPT0gWEFfU1RSSU5HKSB7CisgICAgICAgICAgaWYgKCFzZWxlY3Rpb25SZXF1ZXN0KHNlLnJlcXVlc3Rvciwgc2Uuc2VsZWN0aW9uLCBzZS5wcm9wZXJ0eSkpCisgICAgICAgICAgICBzZS5wcm9wZXJ0eSA9IE5vbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFhTZW5kRXZlbnQoZHB5LCBzZS5yZXF1ZXN0b3IsIEZhbHNlLCAwLCAoWEV2ZW50Kikmc2UpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGNhc2UgU2VsZWN0aW9uQ2xlYXI6CisgICAgc2VsZWN0aW9uT3duZXJfW2V2LT54c2VsZWN0aW9uY2xlYXIuc2VsZWN0aW9uXSA9IGZhbHNlOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLT5oYW5kbGVFdmVudCh0aGlzLCBldik7Cit9CisKK3ZvaWQgVFhXaW5kb3c6OmRyYXdCZXZlbChHQyBnYywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbWlkZGxlLCB1bnNpZ25lZCBsb25nIHRsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnIsIGJvb2wgcm91bmQpCit7CisgIGlmIChyb3VuZCkgeworICAgIFhHQ1ZhbHVlcyBnY3Y7CisgICAgZ2N2LmxpbmVfd2lkdGggPSBiOworICAgIFhDaGFuZ2VHQyhkcHksIGdjLCBHQ0xpbmVXaWR0aCwgJmdjdik7CisgICAgWFNldEZvcmVncm91bmQoZHB5LCBnYywgbWlkZGxlKTsKKyAgICBYRmlsbEFyYyhkcHksIHdpbigpLCBnYywgIHgsIHksIHctYi8yLCBoLWIvMiwgMCwgMzYwKjY0KTsKKyAgICBYU2V0Rm9yZWdyb3VuZChkcHksIGdjLCB0bCk7CisgICAgWERyYXdBcmMoZHB5LCB3aW4oKSwgZ2MsICB4LCB5LCB3LWIvMiwgaC1iLzIsIDQ1KjY0LCAxODAqNjQpOworICAgIFhTZXRGb3JlZ3JvdW5kKGRweSwgZ2MsIGJyKTsKKyAgICBYRHJhd0FyYyhkcHksIHdpbigpLCBnYywgIHgsIHksIHctYi8yLCBoLWIvMiwgMjI1KjY0LCAxODAqNjQpOworICB9IGVsc2UgeworICAgIFhTZXRGb3JlZ3JvdW5kKGRweSwgZ2MsIG1pZGRsZSk7CisgICAgaWYgKHctMipiID4gMCAmJiBoLTIqYiA+IDApCisgICAgICBYRmlsbFJlY3RhbmdsZShkcHksIHdpbigpLCBnYywgeCtiLCB5K2IsIHctMipiLCBoLTIqYik7CisgICAgWFNldEZvcmVncm91bmQoZHB5LCBnYywgdGwpOworICAgIFhGaWxsUmVjdGFuZ2xlKGRweSwgd2luKCksIGdjLCB4LCB5LCB3LCBiKTsKKyAgICBYRmlsbFJlY3RhbmdsZShkcHksIHdpbigpLCBnYywgeCwgeSwgYiwgaCk7CisgICAgWFNldEZvcmVncm91bmQoZHB5LCBnYywgYnIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYjsgaSsrKSB7CisgICAgICBpZiAody1pID4gMCkgWEZpbGxSZWN0YW5nbGUoZHB5LCB3aW4oKSwgZ2MsIHgraSwgeStoLTEtaSwgdy1pLCAxKTsgCisgICAgICBpZiAoaC0xLWkgPiAwKSBYRmlsbFJlY3RhbmdsZShkcHksIHdpbigpLCBnYywgeCt3LTEtaSwgeStpKzEsIDEsIGgtMS1pKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3VuaXgvdHgvVFhXaW5kb3cuaCBiL3VuaXgvdHgvVFhXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWRhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC90eC9UWFdpbmRvdy5oCkBAIC0wLDAgKzEsMjExIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gVFhXaW5kb3cuaAorLy8KKy8vIEEgVFhXaW5kb3cgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCB0eCB3aW5kb3dzICh3aWRnZXRzKS4gIEluIGFkZGl0aW9uIGl0CisvLyBjb250YWlucyBhIG51bWJlciBvZiBzdGF0aWMgbWV0aG9kcyBhbmQgbWVtYmVycyB3aGljaCBhcmUgdXNlZCB0aHJvdWdob3V0CisvLyB0eC4KKy8vCisvLyBCZWZvcmUgY2FsbGluZyBhbnkgb3RoZXIgdHggbWV0aG9kcywgVFhXaW5kb3c6OmluaXQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoCisvLyB0aGUgWCBkaXNwbGF5IHRvIHVzZS4KKworI2lmbmRlZiBfX1RYV0lORE9XX0hfXworI2RlZmluZSBfX1RYV0lORE9XX0hfXworCisjaW5jbHVkZSA8cmRyL3R5cGVzLmg+CisjaW5jbHVkZSA8WDExL1guaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPG1hcD4KKworCisvLyBUWERlbGV0ZVdpbmRvd0NhbGxiYWNrJ3MgZGVsZXRlV2luZG93KCkgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgdG9wLWxldmVsCisvLyB3aW5kb3cgaXMgImRlbGV0ZWQiIChjbG9zZWQpIGJ5IHRoZSB1c2VyIHVzaW5nIHRoZSB3aW5kb3cgbWFuYWdlci4KK2NsYXNzIFRYV2luZG93OworY2xhc3MgVFhEZWxldGVXaW5kb3dDYWxsYmFjayB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBkZWxldGVXaW5kb3coVFhXaW5kb3cqIHcpID0gMDsKK307CisKKy8vIFRYRXZlbnRIYW5kbGVyIGlzIGFuIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHdhbnRpbmcgdG8gaGFuZGxlIFgKKy8vIGV2ZW50cyBvbiBhIHdpbmRvdy4gIE1vc3QgZGVyaXZlZCBjbGFzc2VzIG9mIHdpbmRvdyBhcmUgdGhlaXIgb3duIGV2ZW50CisvLyBoYW5kbGVycy4KK2NsYXNzIFRYRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KFRYV2luZG93KiB3LCBYRXZlbnQqIGV2KSA9IDA7Cit9OworCitjbGFzcyBUWFdpbmRvdyB7CitwdWJsaWM6CisKKyAgLy8gQ29uc3RydWN0b3IgLSBjcmVhdGVzIGEgd2luZG93IG9mIHRoZSBnaXZlbiBzaXplLCB3aXRoIHRoZSBkZWZhdWx0CisgIC8vIGJhY2tncm91bmQgKGN1cnJlbnRseSBncmV5KS4gIEl0IGlzIG1hcHBlZCBieSBkZWZhdWx0IGlmIGl0IGhhcyBhIHBhcmVudC4KKyAgLy8gSWYgbm8gcGFyZW50IGlzIHNwZWNpZmllZCBpdHMgcGFyZW50IGlzIHRoZSByb290IHdpbmRvdyBhbmQgaXQgd2lsbCByZW1haW4KKyAgLy8gdW5tYXBwZWQuCisgIFRYV2luZG93KERpc3BsYXkqIGRweV8sIGludCB3aWR0aD0xLCBpbnQgaGVpZ2h0PTEsIFRYV2luZG93KiBwYXJlbnRfPTAsCisgICAgICAgICAgIGludCBib3JkZXJXaWR0aD0wKTsKKyAgdmlydHVhbCB+VFhXaW5kb3coKTsKKworICAvLyB0b3BsZXZlbCgpIGRlY2xhcmVzIHRoYXQgdGhpcyBpcyBhIHRvcC1sZXZlbCB3aW5kb3cuICBWYXJpb3VzCisgIC8vIHdpbmRvdy1tYW5hZ2VyLXJlbGF0ZWQgcHJvcGVydGllcyBhcmUgc2V0IG9uIHRoZSB3aW5kb3cuICBUaGUgZ2l2ZW4KKyAgLy8gVFhEZWxldGVXaW5kb3dDYWxsYmFjayBpcyBub3RpZmllZCB3aGVuIHRoZSB3aW5kb3cgaXMgImRlbGV0ZWQiIChjbG9lc2QpCisgIC8vIGJ5IHRoZSB1c2VyLgorICB2b2lkIHRvcGxldmVsKGNvbnN0IGNoYXIqIG5hbWUsIFRYRGVsZXRlV2luZG93Q2FsbGJhY2sqIGR3Yz0wLAorICAgICAgICAgICAgICAgIGludCBhcmdjPTAsIGNoYXIqKiBhcmd2PTAsIGNvbnN0IGNoYXIqIHdpbmRvd0NsYXNzPTAsCisgICAgICAgICAgICAgICAgYm9vbCBpY29uaWM9ZmFsc2UpOworCisgIC8vIHNldE1heFNpemUoKSB0ZWxscyB0aGUgd2luZG93IG1hbmFnZXIgdGhlIG1heGltdW0gc2l6ZSB0byBhbGxvdyBhCisgIC8vIHRvcC1sZXZlbCB3aW5kb3cuICBJdCBoYXMgbm8gZWZmZWN0IG9uIGEgbm9uLXRvcC1sZXZlbCB3aW5kb3cuCisgIHZvaWQgc2V0TWF4U2l6ZShpbnQgdywgaW50IGgpOworCisgIC8vIHNldFVTUG9zaXRpb24oKSB0ZWxscyB0aGUgd2luZG93IG1hbmFnZXIgdGhlIHBvc2l0aW9uIHdoaWNoIHRoZSAidXNlciIgaGFzCisgIC8vIGFza2VkIGZvciBhIHRvcC1sZXZlbCB3aW5kb3cuICBNb3N0IHdpbmRvdyBtYW5hZ2VycyBpZ25vcmUgcmVxdWVzdHMgYnkgYQorICAvLyBwcm9ncmFtIGZvciBwb3NpdGlvbiwgc28geW91IGhhdmUgdG8gdGVsbCBpdCB0aGF0IHRoZSAidXNlciIgYXNrZWQgZm9yIHRoZQorICAvLyBwb3NpdGlvbi4gIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiBhIG5vbi10b3AtbGV2ZWwgd2luZG93LgorICB2b2lkIHNldFVTUG9zaXRpb24oaW50IHgsIGludCB5KTsKKworICB2b2lkIHNldEdlb21ldHJ5KGNvbnN0IGNoYXIqIGdlb20sIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKKworICAvLyBzZXRUcmFuc2llbnRGb3IoKSB0ZWxscyB0aGUgd2luZG93IG1hbmFnZXIgdGhhdCB0aGlzIHdpbmRvdyBpcyAib3duZWQiIGJ5CisgIC8vIHRoZSBnaXZlbiB3aW5kb3cuICBUaGUgd2luZG93IG1hbmFnZXIgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIGFzIGl0IHNlZXMKKyAgLy8gZml0LgorICB2b2lkIHNldFRyYW5zaWVudEZvcihXaW5kb3cgdykgeyBYU2V0VHJhbnNpZW50Rm9ySGludChkcHksIHdpbigpLCB3KTsgfQorCisgIC8vIHNldEV2ZW50SGFuZGxlcigpIHNldHMgdGhlIFRYRXZlbnRIYW5kbGVyIHRvIGhhbmRsZSBYIGV2ZW50cyBmb3IgdGhpcworICAvLyB3aW5kb3cuICBJdCByZXR1cm5zIHRoZSBwcmV2aW91cyBldmVudCBoYW5kbGVyLCBzbyB0aGF0IGhhbmRsZXJzIGNhbiBjaGFpbgorICAvLyB0aGVtc2VsdmVzLgorICBUWEV2ZW50SGFuZGxlciogc2V0RXZlbnRIYW5kbGVyKFRYRXZlbnRIYW5kbGVyKiBoKTsKKworICAvLyBBY2Nlc3NvciBtZXRob2RzCisgIFdpbmRvdyB3aW4oKSB7IHJldHVybiB3aW5fOyB9CisgIGludCB3aWR0aCgpIHsgcmV0dXJuIHdpZHRoXzsgfQorICBpbnQgaGVpZ2h0KCkgeyByZXR1cm4gaGVpZ2h0XzsgfQorCisgIC8vIHNlbGVjdGlvbk93bmVyKCkgcmV0dXJucyB0cnVlIGlmIHRoaXMgd2luZG93IG93bnMgdGhlIGdpdmVuIHNlbGVjdGlvbi4KKyAgYm9vbCBzZWxlY3Rpb25Pd25lcihBdG9tIHNlbGVjdGlvbikgeyByZXR1cm4gc2VsZWN0aW9uT3duZXJfW3NlbGVjdGlvbl07IH0KKworICAvLyBXcmFwcGVycyBhcm91bmQgY29tbW9uIFhsaWIgY2FsbHMKKyAgdm9pZCBhZGRFdmVudE1hc2sobG9uZyBtYXNrKTsKKyAgdm9pZCByZW1vdmVFdmVudE1hc2sobG9uZyBtYXNrKTsKKyAgdm9pZCBtYXAoKSAgICAgICAgICAgICAgICAgICB7IFhNYXBXaW5kb3coZHB5LCB3aW4oKSk7IH0KKyAgdm9pZCB1bm1hcCgpOworICB2b2lkIHNldEJnKHVuc2lnbmVkIGxvbmcgYmcpIHsgWFNldFdpbmRvd0JhY2tncm91bmQoZHB5LCB3aW4oKSwgYmcpOyB9CisgIHZvaWQgbW92ZShpbnQgeCwgaW50IHkpICAgICAgeyBYTW92ZVdpbmRvdyhkcHksIHdpbigpLCB4LCB5KTsgfQorICB2b2lkIHJlc2l6ZShpbnQgdywgaW50IGgpOworICB2b2lkIHJhaXNlKCkgICAgICAgICAgICAgICAgIHsgWFJhaXNlV2luZG93KGRweSwgd2luKCkpOyB9CisgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoaW50IGJ3KTsKKyAgdm9pZCBpbnZhbGlkYXRlKGludCB4PTAsIGludCB5PTAsIGludCB3PTAsIGludCBoPTApIHsgWENsZWFyQXJlYShkcHksIHdpbigpLCB4LCB5LCB3LCBoLCBUcnVlKTsgfQorCisgIC8vIG93blNlbGVjdGlvbiByZXF1ZXN0cyB0aGF0IHRoZSB3aW5kb3cgb3ducyB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGZyb20gdGhlCisgIC8vIGdpdmVuIHRpbWUgKHRoZSB0aW1lIHNob3VsZCBiZSB0YWtlbiBmcm9tIGFuIFggZXZlbnQpLgorICB2b2lkIG93blNlbGVjdGlvbihBdG9tIHNlbGVjdGlvbiwgVGltZSB0aW1lKTsKKworCisgIC8vIGRyYXdCZXZlbCBkcmF3cyBhIHJlY3Rhbmd1bGFyIG9yIGNpcmN1bGFyIGJldmVsIGZpbGxpbmcgdGhlIGdpdmVuCisgIC8vIHJlY3RhbmdsZSwgdXNpbmcgdGhlIGdpdmVuIGNvbG91cnMgZm9yIHRoZSBtaWRkbGUsIHRoZSB0b3AvbGVmdCBhbmQgdGhlCisgIC8vIGJvdHRvbS9yaWdodC4KKyAgdm9pZCBkcmF3QmV2ZWwoR0MgZ2MsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtaWRkbGUsIHVuc2lnbmVkIGxvbmcgdGwsIHVuc2lnbmVkIGxvbmcgYnIsCisgICAgICAgICAgICAgICAgIGJvb2wgcm91bmQ9ZmFsc2UpOworCisgIC8vIE1ldGhvZHMgdG8gYmUgb3ZlcnJpZGRlbiBpbiBhIGRlcml2ZWQgY2xhc3MKKworICAvLyByZXNpemVOb3RpZnkoKSBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHdpbmRvdydzIGRpbWVuc2lvbnMgbWF5IGhhdmUKKyAgLy8gY2hhbmdlZC4KKyAgdmlydHVhbCB2b2lkIHJlc2l6ZU5vdGlmeSgpIHt9CisKKyAgLy8gdGFrZUZvY3VzKCkgaXMgY2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBoYXMgcmVjZWl2ZWQga2V5Ym9hcmQgZm9jdXMgZnJvbSB0aGUKKyAgLy8gd2luZG93IG1hbmFnZXIuCisgIHZpcnR1YWwgdm9pZCB0YWtlRm9jdXMoVGltZSB0aW1lKSB7fQorCisgIC8vIHNlbGVjdGlvbk5vdGlmeSgpIGlzIGNhbGxlZCB3aGVuIHRoZSBzZWxlY3Rpb24gb3duZXIgaGFzIHJlcGxpZWQgdG8gYQorICAvLyByZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNlbGVjdGlvbiBmcm9tIHRoZSBzZWxlY3Rpb24gb3duZXIuCisgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25Ob3RpZnkoWFNlbGVjdGlvbkV2ZW50KiBldiwgQXRvbSB0eXBlLCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuaXRlbXMsIHZvaWQqIGRhdGEpIHt9CisKKyAgLy8gc2VsZWN0aW9uUmVxdWVzdCgpIGlzIGNhbGxlZCB3aGVuIHRoaXMgd2luZG93IGlzIHRoZSBzZWxlY3Rpb24gb3duZXIgYW5kCisgIC8vIGFub3RoZXIgWCBjbGllbnQgaGFzIHJlcXVlc3RlZCB0aGUgc2VsZWN0aW9uLiAgSXQgc2hvdWxkIHNldCB0aGUgZ2l2ZW4KKyAgLy8gcHJvcGVydHkgb24gdGhlIGdpdmVuIHdpbmRvdyB0byB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHNlbGVjdGlvbiwKKyAgLy8gcmV0dXJuaW5nIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgc2VsZWN0aW9uUmVxdWVzdChXaW5kb3cgcmVxdWVzdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9tIHNlbGVjdGlvbiwgQXRvbSBwcm9wZXJ0eSkgeyByZXR1cm4gZmFsc2U7fQorCisgIC8vIFN0YXRpYyBtZXRob2RzCisKKyAgLy8gaW5pdCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgdHggbWV0aG9kcy4KKyAgc3RhdGljIHZvaWQgaW5pdChEaXNwbGF5KiBkcHksIGNvbnN0IGNoYXIqIGRlZmF1bHRXaW5kb3dDbGFzcyk7CisKKyAgLy8gZ2V0Q29sb3VycygpIHNldHMgdGhlIHBpeGVsIHZhbHVlcyBpbiB0aGUgY29scyBhcnJheSB0byB0aGUgYmVzdCBhdmFpbGFibGUKKyAgLy8gZm9yIHRoZSBnaXZlbiByZ2IgdmFsdWVzLCBldmVuIGluIHRoZSBjYXNlIG9mIGEgZnVsbCBjb2xvcm1hcC4KKyAgc3RhdGljIHZvaWQgZ2V0Q29sb3VycyhEaXNwbGF5KiBkcHksIFhDb2xvciogY29scywgaW50IG5Db2xzKTsKKworICAvLyBoYW5kbGVYRXZlbnRzKCkgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBhcmUgZXZlbnRzIHRvIGhhbmRsZSBvbgorICAvLyB0aGUgY29ubmVjdGlvbiB0byB0aGUgWCBkaXNwbGF5LiAgSXQgcHJvY2VzcyBhbGwgYXZhaWxhYmxlIGV2ZW50cywgdGhlbgorICAvLyByZXR1cm5zIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIHRvIHByb2Nlc3MuCisgIHN0YXRpYyB2b2lkIGhhbmRsZVhFdmVudHMoRGlzcGxheSogZHB5KTsKKworICAvLyB3aW5kb3dXaXRoTmFtZSgpIGxvY2F0ZXMgYSB3aW5kb3cgd2l0aCBhIGdpdmVuIG5hbWUgb24gYSBkaXNwbGF5LgorICBzdGF0aWMgV2luZG93IHdpbmRvd1dpdGhOYW1lKERpc3BsYXkqIGRweSwgV2luZG93IHRvcCwgY29uc3QgY2hhciogbmFtZSk7CisKKyAgLy8gc3RyRW1wdHlUb051bGwoKSByZXR1cm5zIHRoZSBzdHJpbmcgaXQncyBnaXZlbiBidXQgdHVybnMgYW4gZW1wdHkgc3RyaW5nCisgIC8vIGludG8gbnVsbCwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3IgcGFzc2luZyByZmIgcGFyYW1ldGVycyB0byBYbGliIGNhbGxzLgorICBzdGF0aWMgY2hhciogc3RyRW1wdHlUb051bGwoY2hhciogcykgeyByZXR1cm4gcyAmJiBzWzBdID8gcyA6IDA7IH0KKworICAvLyBUaGUgZm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaW91cyB0aGluZ3MuCisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJsYWNrLCB3aGl0ZTsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdEZnLCBkZWZhdWx0QmcsIGxpZ2h0QmcsIGRhcmtCZzsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZGlzYWJsZWRGZywgZGlzYWJsZWRCZywgZW5hYmxlZEJnOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzY3JvbGxiYXJCZzsKKyAgc3RhdGljIEdDIGRlZmF1bHRHQzsKKyAgc3RhdGljIENvbG9ybWFwIGNtYXA7CisgIHN0YXRpYyBGb250IGRlZmF1bHRGb250OworICBzdGF0aWMgWEZvbnRTdHJ1Y3QqIGRlZmF1bHRGUzsKKyAgc3RhdGljIFRpbWUgY3V0QnVmZmVyVGltZTsKKyAgc3RhdGljIFBpeG1hcCBkb3QsIHRpY2s7CisgIHN0YXRpYyBjb25zdCBpbnQgZG90U2l6ZSwgdGlja1NpemU7CisgIHN0YXRpYyBjaGFyKiBkZWZhdWx0V2luZG93Q2xhc3M7CisKKyAgRGlzcGxheSogY29uc3QgZHB5OworCisgIGludCB4UGFkLCB5UGFkLCBiZXZlbDsKKworcHJpdmF0ZToKKworICAvLyBoYW5kbGVYRXZlbnQoKSBpcyBjYWxsZWQgZnJvbSBoYW5kbGVYRXZlbnRzKCkgd2hlbiBhbiBldmVudCBmb3IgdGhpcworICAvLyB3aW5kb3cgYXJyaXZlcy4gIEl0IGRvZXMgZ2VuZXJhbCBldmVudCBwcm9jZXNzaW5nIGJlZm9yZSBjYWxsaW5nIG9uIHRvIHRoZQorICAvLyBldmVudCBoYW5kbGVyLgorICB2b2lkIGhhbmRsZVhFdmVudChYRXZlbnQqIGV2KTsKKworICBUWFdpbmRvdyogcGFyZW50OworICBXaW5kb3cgd2luXzsKKyAgaW50IHdpZHRoXywgaGVpZ2h0XzsKKyAgVFhFdmVudEhhbmRsZXIqIGV2ZW50SGFuZGxlcjsKKyAgVFhEZWxldGVXaW5kb3dDYWxsYmFjayogZHdjOworICBsb25nIGV2ZW50TWFzazsKKyAgWFNpemVIaW50cyBzaXplSGludHM7CisgIHN0ZDo6bWFwPEF0b20sVGltZT4gc2VsZWN0aW9uT3duVGltZTsKKyAgc3RkOjptYXA8QXRvbSxib29sPiBzZWxlY3Rpb25Pd25lcl87CisgIGJvb2wgdG9wbGV2ZWxfOworfTsKKworZXh0ZXJuIEF0b20gd21Qcm90b2NvbHMsIHdtRGVsZXRlV2luZG93LCB3bVRha2VGb2N1czsKK2V4dGVybiBBdG9tIHhhVElNRVNUQU1QLCB4YVRBUkdFVFMsIHhhU0VMRUNUSU9OX1RJTUUsIHhhU0VMRUNUSU9OX1NUUklORzsKK2V4dGVybiBBdG9tIHhhQ0xJUEJPQVJEOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdm5jY29uZmlnL01ha2VmaWxlLmluIGIvdW5peC92bmNjb25maWcvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MWZjZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jY29uZmlnL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjMgQEAKKworU1JDUyA9IHZuY0V4dC5jIHZuY2NvbmZpZy5jeHggUXVlcnlDb25uZWN0RGlhbG9nLmN4eAorCitPQkpTID0gdm5jRXh0Lm8gdm5jY29uZmlnLm8gUXVlcnlDb25uZWN0RGlhbG9nLm8KKworcHJvZ3JhbSA9IHZuY2NvbmZpZworCitERVBfTElCUyA9IC4uL3R4L2xpYnR4LmEgLi4vcmZiL2xpYnJmYi5hIC4uL25ldHdvcmsvbGlibmV0d29yay5hIFwKKyAgICAgICAgICAgLi4vcmRyL2xpYnJkci5hCisKK0VYVFJBX0xJQlMgPSBAWF9QUkVfTElCU0AgQFhfTElCU0AgLWxYMTEgLWxYZXh0IEBYX0VYVFJBX0xJQlNACisKK0RJUl9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKSAtSSQodG9wX3NyY2RpcikvdHggQFhfQ0ZMQUdTQCAjIFhfQ0ZMQUdTIGFyZSByZWFsbHkgQ1BQRkxBR1MKKworYWxsOjogJChwcm9ncmFtKQorCiskKHByb2dyYW0pOiAkKE9CSlMpIGJ1aWxkdGltZS5vICQoREVQX0xJQlMpCisJcm0gLWYgJChwcm9ncmFtKQorCSQoQ1hYTEQpICQoQ1hYRkxBR1MpICQoTERGTEFHUykgLW8gJEAgJChPQkpTKSBidWlsZHRpbWUubyAkKERFUF9MSUJTKSAkKExJQlMpICQoRVhUUkFfTElCUykKKworYnVpbGR0aW1lLm86ICQoT0JKUykgJChERVBfTElCUykKKworIyBmb2xsb3dlZCBieSBib2lsZXJwbGF0ZS5tawpkaWZmIC0tZ2l0IGEvdW5peC92bmNjb25maWcvUXVlcnlDb25uZWN0RGlhbG9nLmN4eCBiL3VuaXgvdm5jY29uZmlnL1F1ZXJ5Q29ubmVjdERpYWxvZy5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1NDA1MQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jY29uZmlnL1F1ZXJ5Q29ubmVjdERpYWxvZy5jeHgKQEAgLTAsMCArMSw4OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSAiUXVlcnlDb25uZWN0RGlhbG9nLmgiCisjaW5jbHVkZSAidm5jRXh0LmgiCisKK1F1ZXJ5Q29ubmVjdERpYWxvZzo6UXVlcnlDb25uZWN0RGlhbG9nKERpc3BsYXkqIGRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3NfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXNlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVJlc3VsdENhbGxiYWNrKiBjYikKKyAgOiBUWERpYWxvZyhkcHksIDMwMCwgMTAwLCAiVk5DIFNlcnZlciA6IEFjY2VwdCBDb25uZWN0aW9uPyIpLAorICAgIGFkZHJlc3NMYmwoZHB5LCAiSG9zdDoiLHRoaXMpLAorICAgIGFkZHJlc3MoZHB5LCBhZGRyZXNzXywgdGhpcyksCisgICAgdXNlckxibChkcHksICJVc2VyOiIsIHRoaXMpLAorICAgIHVzZXIoZHB5LCB1c2VyXywgdGhpcyksCisgICAgdGltZW91dExibChkcHksICJTZWNvbmRzIHVudGlsIGF1dG9tYXRpYyByZWplY3Q6IiwgdGhpcyksCisgICAgdGltZW91dChkcHksICIwMDAwMDAwMDAwIiwgdGhpcyksCisgICAgYWNjZXB0KGRweSwgIkFjY2VwdCIsIHRoaXMsIHRoaXMsIDYwKSwKKyAgICByZWplY3QoZHB5LCAiUmVqZWN0IiwgdGhpcywgdGhpcywgNjApLAorICAgIGNhbGxiYWNrKGNiKSwgdGltZVVudGlsUmVqZWN0KHRpbWVvdXRfKSwgdGltZXIodGhpcykKK3sKKyAgY29uc3QgaW50IHBhZCA9IDQ7CisgIGludCB5PXBhZDsKKyAgaW50IGxibFdpZHRoID0gX19yZmJtYXgoYWRkcmVzc0xibC53aWR0aCgpLCB1c2VyTGJsLndpZHRoKCkpOworICB1c2VyTGJsLm1vdmUocGFkK2xibFdpZHRoLXVzZXJMYmwud2lkdGgoKSwgeSk7CisgIHVzZXIubW92ZShwYWQrbGJsV2lkdGgsIHkpOworICBhZGRyZXNzTGJsLm1vdmUocGFkK2xibFdpZHRoLWFkZHJlc3NMYmwud2lkdGgoKSwgeSs9dXNlckxibC5oZWlnaHQoKSk7CisgIGFkZHJlc3MubW92ZShwYWQrbGJsV2lkdGgsIHkpOworICB0aW1lb3V0TGJsLm1vdmUocGFkLCB5Kz1hZGRyZXNzTGJsLmhlaWdodCgpKTsKKyAgdGltZW91dC5tb3ZlKHBhZCt0aW1lb3V0TGJsLndpZHRoKCksIHkpOworICBhY2NlcHQubW92ZShwYWQsIHkrPWFkZHJlc3NMYmwuaGVpZ2h0KCkpOworICBpbnQgbWF4V2lkdGggPSBfX3JmYm1heCh1c2VyLndpZHRoKCksIGFkZHJlc3Mud2lkdGgoKStwYWQrbGJsV2lkdGgpOworICBtYXhXaWR0aCA9IF9fcmZibWF4KG1heFdpZHRoLCBhY2NlcHQud2lkdGgoKSozKTsKKyAgbWF4V2lkdGggPSBfX3JmYm1heChtYXhXaWR0aCwgdGltZW91dExibC53aWR0aCgpK3RpbWVvdXQud2lkdGgoKStwYWQpOworICByZWplY3QubW92ZShtYXhXaWR0aC1yZWplY3Qud2lkdGgoKSwgeSk7CisgIHJlc2l6ZShtYXhXaWR0aCArIHBhZCwgeStyZWplY3QuaGVpZ2h0KCkrcGFkKTsKKyAgc2V0Qm9yZGVyV2lkdGgoMSk7CisgIHJlZnJlc2hUaW1lb3V0KCk7CisgIHRpbWVyLnN0YXJ0KDEwMDApOworfQorCit2b2lkIFF1ZXJ5Q29ubmVjdERpYWxvZzo6ZGVsZXRlV2luZG93KFRYV2luZG93KikgeworICB1bm1hcCgpOworICBjYWxsYmFjay0+cXVlcnlSZWplY3RlZCgpOworfQorCit2b2lkIFF1ZXJ5Q29ubmVjdERpYWxvZzo6YnV0dG9uQWN0aXZhdGUoVFhCdXR0b24qIGIpIHsKKyAgdW5tYXAoKTsKKyAgaWYgKGIgPT0gJmFjY2VwdCkKKyAgICBjYWxsYmFjay0+cXVlcnlBcHByb3ZlZCgpOworICBlbHNlIGlmIChiID09ICZyZWplY3QpCisgICAgY2FsbGJhY2stPnF1ZXJ5UmVqZWN0ZWQoKTsKK30KKyAgCitib29sIFF1ZXJ5Q29ubmVjdERpYWxvZzo6aGFuZGxlVGltZW91dChyZmI6OlRpbWVyKiB0KSB7CisgIGlmICh0aW1lVW50aWxSZWplY3QtLSA9PSAwKSB7CisgICAgdW5tYXAoKTsKKyAgICBjYWxsYmFjay0+cXVlcnlUaW1lZE91dCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZWZyZXNoVGltZW91dCgpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3ZvaWQgUXVlcnlDb25uZWN0RGlhbG9nOjpyZWZyZXNoVGltZW91dCgpIHsKKyAgY2hhciBidWZbMTZdOworICBzcHJpbnRmKGJ1ZiwgIiVkIiwgdGltZVVudGlsUmVqZWN0KTsKKyAgdGltZW91dC5zZXRUZXh0KGJ1Zik7Cit9CmRpZmYgLS1naXQgYS91bml4L3ZuY2NvbmZpZy9RdWVyeUNvbm5lY3REaWFsb2cuaCBiL3VuaXgvdm5jY29uZmlnL1F1ZXJ5Q29ubmVjdERpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODVkYzMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY2NvbmZpZy9RdWVyeUNvbm5lY3REaWFsb2cuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX19RVUVSWUNPTk5FQ1RESUFMT0dfSF9fCisjZGVmaW5lIF9fUVVFUllDT05ORUNURElBTE9HX0hfXworCisjaW5jbHVkZSA8cmZiL1RpbWVyLmg+CisjaW5jbHVkZSAiVFhMYWJlbC5oIgorI2luY2x1ZGUgIlRYQnV0dG9uLmgiCisjaW5jbHVkZSAiVFhEaWFsb2cuaCIKKworY2xhc3MgUXVlcnlSZXN1bHRDYWxsYmFjayB7CisgcHVibGljOgorICB2aXJ0dWFsIH5RdWVyeVJlc3VsdENhbGxiYWNrKCkge30KKyAgdmlydHVhbCB2b2lkIHF1ZXJ5QXBwcm92ZWQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBxdWVyeVJlamVjdGVkKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgcXVlcnlUaW1lZE91dCgpIHsgcXVlcnlSZWplY3RlZCgpOyB9OworfTsKKworY2xhc3MgUXVlcnlDb25uZWN0RGlhbG9nIDogcHVibGljIFRYRGlhbG9nLCBwdWJsaWMgVFhFdmVudEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVFhCdXR0b25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyByZmI6OlRpbWVyOjpDYWxsYmFjaworeworIHB1YmxpYzoKKyAgUXVlcnlDb25uZWN0RGlhbG9nKERpc3BsYXkqIGRweSwgY29uc3QgY2hhciogYWRkcmVzc18sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1c2VyXywgaW50IHRpbWVvdXRfLAorICAgICAgICAgICAgICAgICAgICAgUXVlcnlSZXN1bHRDYWxsYmFjayogY2IpOworICB2b2lkIGhhbmRsZUV2ZW50KFRYV2luZG93KiwgWEV2ZW50KiApIHsgfQorICB2b2lkIGRlbGV0ZVdpbmRvdyhUWFdpbmRvdyopOworICB2b2lkIGJ1dHRvbkFjdGl2YXRlKFRYQnV0dG9uKiBiKTsKKyAgYm9vbCBoYW5kbGVUaW1lb3V0KHJmYjo6VGltZXIqIHQpOworIHByaXZhdGU6CisgIHZvaWQgcmVmcmVzaFRpbWVvdXQoKTsKKyAgVFhMYWJlbCBhZGRyZXNzTGJsLCBhZGRyZXNzLCB1c2VyTGJsLCB1c2VyLCB0aW1lb3V0TGJsLCB0aW1lb3V0OworICBUWEJ1dHRvbiBhY2NlcHQsIHJlamVjdDsKKyAgUXVlcnlSZXN1bHRDYWxsYmFjayogY2FsbGJhY2s7CisgIGludCB0aW1lVW50aWxSZWplY3Q7CisgIHJmYjo6VGltZXIgdGltZXI7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdm5jY29uZmlnL2J1aWxkdGltZS5jIGIvdW5peC92bmNjb25maWcvYnVpbGR0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0YzM2OQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jY29uZmlnL2J1aWxkdGltZS5jCkBAIC0wLDAgKzEsMTggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KK2NoYXIgYnVpbGR0aW1lW10gPSBfX0RBVEVfXyAiICIgX19USU1FX187CmRpZmYgLS1naXQgYS91bml4L3ZuY2NvbmZpZy92bmNFeHQuYyBiL3VuaXgvdm5jY29uZmlnL3ZuY0V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTUzMmIKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY2NvbmZpZy92bmNFeHQuYwpAQCAtMCwwICsxLDM4NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTkVFRF9SRVBMSUVTCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYmludC5oPgorI2RlZmluZSBfVk5DRVhUX1BST1RPXworI2luY2x1ZGUgInZuY0V4dC5oIgorCitzdGF0aWMgQm9vbCBYVm5jRXh0Q2xpZW50Q3V0VGV4dE5vdGlmeVdpcmVUb0V2ZW50KERpc3BsYXkqIGRweSwgWEV2ZW50KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4RXZlbnQqIHcpOworc3RhdGljIEJvb2wgWFZuY0V4dFNlbGVjdGlvbkNoYW5nZU5vdGlmeVdpcmVUb0V2ZW50KERpc3BsYXkqIGRweSwgWEV2ZW50KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhFdmVudCogdyk7CitzdGF0aWMgQm9vbCBYVm5jRXh0UXVlcnlDb25uZWN0Tm90aWZ5V2lyZVRvRXZlbnQoRGlzcGxheSogZHB5LCBYRXZlbnQqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEV2ZW50KiB3KTsKKworc3RhdGljIEJvb2wgZXh0ZW5zaW9uSW5pdGVkID0gRmFsc2U7CitzdGF0aWMgWEV4dENvZGVzKiBjb2RlcyA9IDA7CisKK3N0YXRpYyBCb29sIGNoZWNrRXh0ZW5zaW9uKERpc3BsYXkqIGRweSkKK3sKKyAgaWYgKCFleHRlbnNpb25Jbml0ZWQpIHsKKyAgICBleHRlbnNpb25Jbml0ZWQgPSBUcnVlOworICAgIGNvZGVzID0gWEluaXRFeHRlbnNpb24oZHB5LCBWTkNFWFROQU1FKTsKKyAgICBpZiAoIWNvZGVzKSByZXR1cm4gRmFsc2U7CisgICAgWEVTZXRXaXJlVG9FdmVudChkcHksIGNvZGVzLT5maXJzdF9ldmVudCArIFZuY0V4dENsaWVudEN1dFRleHROb3RpZnksCisgICAgICAgICAgICAgICAgICAgICBYVm5jRXh0Q2xpZW50Q3V0VGV4dE5vdGlmeVdpcmVUb0V2ZW50KTsKKyAgICBYRVNldFdpcmVUb0V2ZW50KGRweSwgY29kZXMtPmZpcnN0X2V2ZW50ICsgVm5jRXh0U2VsZWN0aW9uQ2hhbmdlTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgWFZuY0V4dFNlbGVjdGlvbkNoYW5nZU5vdGlmeVdpcmVUb0V2ZW50KTsKKyAgICBYRVNldFdpcmVUb0V2ZW50KGRweSwgY29kZXMtPmZpcnN0X2V2ZW50ICsgVm5jRXh0UXVlcnlDb25uZWN0Tm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgWFZuY0V4dFF1ZXJ5Q29ubmVjdE5vdGlmeVdpcmVUb0V2ZW50KTsKKyAgfQorICByZXR1cm4gY29kZXMgIT0gMDsKK30KKworQm9vbCBYVm5jRXh0UXVlcnlFeHRlbnNpb24oRGlzcGxheSogZHB5LCBpbnQqIGV2ZW50X2Jhc2VwLCBpbnQqIGVycm9yX2Jhc2VwKQoreworICBpZiAoIWNoZWNrRXh0ZW5zaW9uKGRweSkpIHJldHVybiBGYWxzZTsKKyAgKmV2ZW50X2Jhc2VwID0gY29kZXMtPmZpcnN0X2V2ZW50OworICAqZXJyb3JfYmFzZXAgPSBjb2Rlcy0+Zmlyc3RfZXJyb3I7CisgIHJldHVybiBUcnVlOworfQorCitCb29sIFhWbmNFeHRTZXRQYXJhbShEaXNwbGF5KiBkcHksIGNvbnN0IGNoYXIqIHBhcmFtKQoreworICB4Vm5jRXh0U2V0UGFyYW1SZXEqIHJlcTsKKyAgeFZuY0V4dFNldFBhcmFtUmVwbHkgcmVwOworCisgIGludCBwYXJhbUxlbiA9IHN0cmxlbihwYXJhbSk7CisgIGlmIChwYXJhbUxlbiA+IDI1NSkgcmV0dXJuIEZhbHNlOworICBpZiAoIWNoZWNrRXh0ZW5zaW9uKGRweSkpIHJldHVybiBGYWxzZTsKKworICBMb2NrRGlzcGxheShkcHkpOworICBHZXRSZXEoVm5jRXh0U2V0UGFyYW0sIHJlcSk7CisgIHJlcS0+cmVxVHlwZSA9IGNvZGVzLT5tYWpvcl9vcGNvZGU7CisgIHJlcS0+dm5jRXh0UmVxVHlwZSA9IFhfVm5jRXh0U2V0UGFyYW07CisgIHJlcS0+bGVuZ3RoICs9IChwYXJhbUxlbiArIDMpID4+IDI7CisgIHJlcS0+cGFyYW1MZW4gPSBwYXJhbUxlbjsKKyAgRGF0YShkcHksIHBhcmFtLCBwYXJhbUxlbik7CisgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gRmFsc2U7CisgIH0KKyAgVW5sb2NrRGlzcGxheShkcHkpOworICBTeW5jSGFuZGxlKCk7CisgIHJldHVybiByZXAuc3VjY2VzczsKK30KKworQm9vbCBYVm5jRXh0R2V0UGFyYW0oRGlzcGxheSogZHB5LCBjb25zdCBjaGFyKiBwYXJhbSwgY2hhcioqIHZhbHVlLCBpbnQqIGxlbikKK3sKKyAgeFZuY0V4dEdldFBhcmFtUmVxKiByZXE7CisgIHhWbmNFeHRHZXRQYXJhbVJlcGx5IHJlcDsKKworICBpbnQgcGFyYW1MZW4gPSBzdHJsZW4ocGFyYW0pOworICAqdmFsdWUgPSAwOworICAqbGVuID0gMDsKKyAgaWYgKHBhcmFtTGVuID4gMjU1KSByZXR1cm4gRmFsc2U7CisgIGlmICghY2hlY2tFeHRlbnNpb24oZHB5KSkgcmV0dXJuIEZhbHNlOworCisgIExvY2tEaXNwbGF5KGRweSk7CisgIEdldFJlcShWbmNFeHRHZXRQYXJhbSwgcmVxKTsKKyAgcmVxLT5yZXFUeXBlID0gY29kZXMtPm1ham9yX29wY29kZTsKKyAgcmVxLT52bmNFeHRSZXFUeXBlID0gWF9WbmNFeHRHZXRQYXJhbTsKKyAgcmVxLT5sZW5ndGggKz0gKHBhcmFtTGVuICsgMykgPj4gMjsKKyAgcmVxLT5wYXJhbUxlbiA9IHBhcmFtTGVuOworICBEYXRhKGRweSwgcGFyYW0sIHBhcmFtTGVuKTsKKyAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBGYWxzZTsKKyAgfQorICBpZiAocmVwLnN1Y2Nlc3MpIHsKKyAgICAqbGVuID0gcmVwLnZhbHVlTGVuOworICAgICp2YWx1ZSA9IChjaGFyKikgWG1hbGxvYyAoKmxlbisxKTsKKyAgICBfWFJlYWRQYWQoZHB5LCAqdmFsdWUsICpsZW4pOworICAgICgqdmFsdWUpWypsZW5dID0gMDsKKyAgfQorICBVbmxvY2tEaXNwbGF5KGRweSk7CisgIFN5bmNIYW5kbGUoKTsKKyAgcmV0dXJuIHJlcC5zdWNjZXNzOworfQorCitjaGFyKiBYVm5jRXh0R2V0UGFyYW1EZXNjKERpc3BsYXkqIGRweSwgY29uc3QgY2hhciogcGFyYW0pCit7CisgIHhWbmNFeHRHZXRQYXJhbURlc2NSZXEqIHJlcTsKKyAgeFZuY0V4dEdldFBhcmFtRGVzY1JlcGx5IHJlcDsKKyAgY2hhciogZGVzYyA9IDA7CisKKyAgaW50IHBhcmFtTGVuID0gc3RybGVuKHBhcmFtKTsKKyAgaWYgKHBhcmFtTGVuID4gMjU1KSByZXR1cm4gRmFsc2U7CisgIGlmICghY2hlY2tFeHRlbnNpb24oZHB5KSkgcmV0dXJuIEZhbHNlOworCisgIExvY2tEaXNwbGF5KGRweSk7CisgIEdldFJlcShWbmNFeHRHZXRQYXJhbURlc2MsIHJlcSk7CisgIHJlcS0+cmVxVHlwZSA9IGNvZGVzLT5tYWpvcl9vcGNvZGU7CisgIHJlcS0+dm5jRXh0UmVxVHlwZSA9IFhfVm5jRXh0R2V0UGFyYW1EZXNjOworICByZXEtPmxlbmd0aCArPSAocGFyYW1MZW4gKyAzKSA+PiAyOworICByZXEtPnBhcmFtTGVuID0gcGFyYW1MZW47CisgIERhdGEoZHB5LCBwYXJhbSwgcGFyYW1MZW4pOworICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIEZhbHNlOworICB9CisgIGlmIChyZXAuc3VjY2VzcykgeworICAgIGRlc2MgPSAoY2hhciopWG1hbGxvYyhyZXAuZGVzY0xlbisxKTsKKyAgICBfWFJlYWRQYWQoZHB5LCBkZXNjLCByZXAuZGVzY0xlbik7CisgICAgZGVzY1tyZXAuZGVzY0xlbl0gPSAwOworICB9CisgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgU3luY0hhbmRsZSgpOworICByZXR1cm4gZGVzYzsKK30KKworY2hhcioqIFhWbmNFeHRMaXN0UGFyYW1zKERpc3BsYXkqIGRweSwgaW50KiBuUGFyYW1zKQoreworICB4Vm5jRXh0TGlzdFBhcmFtc1JlcSogcmVxOworICB4Vm5jRXh0TGlzdFBhcmFtc1JlcGx5IHJlcDsKKyAgY2hhcioqIGxpc3QgPSAwOworICBjaGFyKiBjaDsKKyAgaW50IHJsZW4sIHBhcmFtTGVuLCBpOworCisgIGlmICghY2hlY2tFeHRlbnNpb24oZHB5KSkgcmV0dXJuIEZhbHNlOworCisgIExvY2tEaXNwbGF5KGRweSk7CisgIEdldFJlcShWbmNFeHRMaXN0UGFyYW1zLCByZXEpOworICByZXEtPnJlcVR5cGUgPSBjb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICByZXEtPnZuY0V4dFJlcVR5cGUgPSBYX1ZuY0V4dExpc3RQYXJhbXM7CisgIGlmICghX1hSZXBseShkcHksICh4UmVwbHkgKikmcmVwLCAwLCB4RmFsc2UpKSB7CisgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgIFN5bmNIYW5kbGUoKTsKKyAgICByZXR1cm4gRmFsc2U7CisgIH0KKyAgVW5sb2NrRGlzcGxheShkcHkpOworICBTeW5jSGFuZGxlKCk7CisgIGlmIChyZXAublBhcmFtcykgeworICAgIGxpc3QgPSAoY2hhcioqKVhtYWxsb2MocmVwLm5QYXJhbXMgKiBzaXplb2YoY2hhciopKTsKKyAgICBybGVuID0gcmVwLmxlbmd0aCA8PCAyOworICAgIGNoID0gKGNoYXIqKVhtYWxsb2MocmxlbiArIDEpOworICAgIGlmICghbGlzdCB8fCAhY2gpIHsKKyAgICAgIGlmIChsaXN0KSBYZnJlZSgoY2hhciopbGlzdCk7CisgICAgICBpZiAoY2gpIFhmcmVlKGNoKTsKKyAgICAgIF9YRWF0RGF0YShkcHksIHJsZW4pOworICAgICAgVW5sb2NrRGlzcGxheShkcHkpOworICAgICAgU3luY0hhbmRsZSgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIF9YUmVhZFBhZChkcHksIGNoLCBybGVuKTsKKyAgICBwYXJhbUxlbiA9ICpjaCsrOworICAgIGZvciAoaSA9IDA7IGkgPCByZXAublBhcmFtczsgaSsrKSB7CisgICAgICBsaXN0W2ldID0gY2g7CisgICAgICBjaCArPSBwYXJhbUxlbjsKKyAgICAgIHBhcmFtTGVuID0gKmNoOworICAgICAgKmNoKysgPSAwOworICAgIH0KKyAgfQorICAqblBhcmFtcyA9IHJlcC5uUGFyYW1zOworICBVbmxvY2tEaXNwbGF5KGRweSk7CisgIFN5bmNIYW5kbGUoKTsKKyAgcmV0dXJuIGxpc3Q7Cit9CisKK3ZvaWQgWFZuY0V4dEZyZWVQYXJhbUxpc3QoY2hhcioqIGxpc3QpCit7CisgIGlmIChsaXN0KSB7CisgICAgWGZyZWUobGlzdFswXS0xKTsKKyAgICBYZnJlZSgoY2hhciopbGlzdCk7CisgIH0KK30KKworQm9vbCBYVm5jRXh0U2V0U2VydmVyQ3V0VGV4dChEaXNwbGF5KiBkcHksIGNvbnN0IGNoYXIqIHN0ciwgaW50IGxlbikKK3sKKyAgeFZuY0V4dFNldFNlcnZlckN1dFRleHRSZXEqIHJlcTsKKworICBpZiAoIWNoZWNrRXh0ZW5zaW9uKGRweSkpIHJldHVybiBGYWxzZTsKKworICBMb2NrRGlzcGxheShkcHkpOworICBHZXRSZXEoVm5jRXh0U2V0U2VydmVyQ3V0VGV4dCwgcmVxKTsKKyAgcmVxLT5yZXFUeXBlID0gY29kZXMtPm1ham9yX29wY29kZTsKKyAgcmVxLT52bmNFeHRSZXFUeXBlID0gWF9WbmNFeHRTZXRTZXJ2ZXJDdXRUZXh0OworICByZXEtPmxlbmd0aCArPSAobGVuICsgMykgPj4gMjsKKyAgcmVxLT50ZXh0TGVuID0gbGVuOworICBEYXRhKGRweSwgc3RyLCBsZW4pOworICBVbmxvY2tEaXNwbGF5KGRweSk7CisgIFN5bmNIYW5kbGUoKTsKKyAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wgWFZuY0V4dEdldENsaWVudEN1dFRleHQoRGlzcGxheSogZHB5LCBjaGFyKiogc3RyLCBpbnQqIGxlbikKK3sKKyAgeFZuY0V4dEdldENsaWVudEN1dFRleHRSZXEqIHJlcTsKKyAgeFZuY0V4dEdldENsaWVudEN1dFRleHRSZXBseSByZXA7CisKKyAgaWYgKCFjaGVja0V4dGVuc2lvbihkcHkpKSByZXR1cm4gRmFsc2U7CisKKyAgTG9ja0Rpc3BsYXkoZHB5KTsKKyAgR2V0UmVxKFZuY0V4dEdldENsaWVudEN1dFRleHQsIHJlcSk7CisgIHJlcS0+cmVxVHlwZSA9IGNvZGVzLT5tYWpvcl9vcGNvZGU7CisgIHJlcS0+dm5jRXh0UmVxVHlwZSA9IFhfVm5jRXh0R2V0Q2xpZW50Q3V0VGV4dDsKKyAgaWYgKCFfWFJlcGx5KGRweSwgKHhSZXBseSAqKSZyZXAsIDAsIHhGYWxzZSkpIHsKKyAgICBVbmxvY2tEaXNwbGF5KGRweSk7CisgICAgU3luY0hhbmRsZSgpOworICAgIHJldHVybiBGYWxzZTsKKyAgfQorICBVbmxvY2tEaXNwbGF5KGRweSk7CisgIFN5bmNIYW5kbGUoKTsKKyAgKmxlbiA9IHJlcC50ZXh0TGVuOworICAqc3RyID0gKGNoYXIqKSBYbWFsbG9jICgqbGVuKzEpOworICBfWFJlYWRQYWQoZHB5LCAqc3RyLCAqbGVuKTsKKyAgKCpzdHIpWypsZW5dID0gMDsKKyAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wgWFZuY0V4dFNlbGVjdElucHV0KERpc3BsYXkqIGRweSwgV2luZG93IHcsIGludCBtYXNrKQoreworICB4Vm5jRXh0U2VsZWN0SW5wdXRSZXEqIHJlcTsKKworICBpZiAoIWNoZWNrRXh0ZW5zaW9uKGRweSkpIHJldHVybiBGYWxzZTsKKworICBMb2NrRGlzcGxheShkcHkpOworICBHZXRSZXEoVm5jRXh0U2VsZWN0SW5wdXQsIHJlcSk7CisgIHJlcS0+cmVxVHlwZSA9IGNvZGVzLT5tYWpvcl9vcGNvZGU7CisgIHJlcS0+dm5jRXh0UmVxVHlwZSA9IFhfVm5jRXh0U2VsZWN0SW5wdXQ7CisgIHJlcS0+d2luZG93ID0gdzsKKyAgcmVxLT5tYXNrID0gbWFzazsKKyAgVW5sb2NrRGlzcGxheShkcHkpOworICBTeW5jSGFuZGxlKCk7CisgIHJldHVybiBUcnVlOworfQorCitCb29sIFhWbmNFeHRDb25uZWN0KERpc3BsYXkqIGRweSwgY2hhciogaG9zdEFuZFBvcnQpCit7CisgIHhWbmNFeHRDb25uZWN0UmVxKiByZXE7CisgIHhWbmNFeHRDb25uZWN0UmVwbHkgcmVwOworCisgIGludCBzdHJMZW4gPSBzdHJsZW4oaG9zdEFuZFBvcnQpOworICBpZiAoc3RyTGVuID4gMjU1KSByZXR1cm4gRmFsc2U7CisgIGlmICghY2hlY2tFeHRlbnNpb24oZHB5KSkgcmV0dXJuIEZhbHNlOworCisgIExvY2tEaXNwbGF5KGRweSk7CisgIEdldFJlcShWbmNFeHRDb25uZWN0LCByZXEpOworICByZXEtPnJlcVR5cGUgPSBjb2Rlcy0+bWFqb3Jfb3Bjb2RlOworICByZXEtPnZuY0V4dFJlcVR5cGUgPSBYX1ZuY0V4dENvbm5lY3Q7CisgIHJlcS0+bGVuZ3RoICs9IChzdHJMZW4gKyAzKSA+PiAyOworICByZXEtPnN0ckxlbiA9IHN0ckxlbjsKKyAgRGF0YShkcHksIGhvc3RBbmRQb3J0LCBzdHJMZW4pOworICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIEZhbHNlOworICB9CisgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgU3luY0hhbmRsZSgpOworICByZXR1cm4gcmVwLnN1Y2Nlc3M7Cit9CisKK0Jvb2wgWFZuY0V4dEdldFF1ZXJ5Q29ubmVjdChEaXNwbGF5KiBkcHksIGNoYXIqKiBhZGRyLCBjaGFyKiogdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHRpbWVvdXQsIHZvaWQqKiBvcGFxdWVJZCkKK3sKKyAgeFZuY0V4dEdldFF1ZXJ5Q29ubmVjdFJlcSogcmVxOworICB4Vm5jRXh0R2V0UXVlcnlDb25uZWN0UmVwbHkgcmVwOworCisgIGlmICghY2hlY2tFeHRlbnNpb24oZHB5KSkgcmV0dXJuIEZhbHNlOworCisgIExvY2tEaXNwbGF5KGRweSk7CisgIEdldFJlcShWbmNFeHRHZXRRdWVyeUNvbm5lY3QsIHJlcSk7CisgIHJlcS0+cmVxVHlwZSA9IGNvZGVzLT5tYWpvcl9vcGNvZGU7CisgIHJlcS0+dm5jRXh0UmVxVHlwZSA9IFhfVm5jRXh0R2V0UXVlcnlDb25uZWN0OworICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSkgeworICAgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgICBTeW5jSGFuZGxlKCk7CisgICAgcmV0dXJuIEZhbHNlOworICB9CisgIFVubG9ja0Rpc3BsYXkoZHB5KTsKKyAgU3luY0hhbmRsZSgpOworCisgICphZGRyID0gWG1hbGxvYyhyZXAuYWRkckxlbisxKTsKKyAgX1hSZWFkUGFkKGRweSwgKmFkZHIsIHJlcC5hZGRyTGVuKTsKKyAgKCphZGRyKVtyZXAuYWRkckxlbl0gPSAwOworICAqdXNlciA9IFhtYWxsb2MocmVwLnVzZXJMZW4rMSk7CisgIF9YUmVhZFBhZChkcHksICp1c2VyLCByZXAudXNlckxlbik7CisgICgqdXNlcilbcmVwLnVzZXJMZW5dID0gMDsKKyAgKnRpbWVvdXQgPSByZXAudGltZW91dDsKKyAgKm9wYXF1ZUlkID0gKHZvaWQqKXJlcC5vcGFxdWVJZDsKKyAgcmV0dXJuIFRydWU7Cit9CisKK0Jvb2wgWFZuY0V4dEFwcHJvdmVDb25uZWN0KERpc3BsYXkqIGRweSwgdm9pZCogb3BhcXVlSWQsIGludCBhcHByb3ZlKQoreworICB4Vm5jRXh0QXBwcm92ZUNvbm5lY3RSZXEqIHJlcTsKKworICBpZiAoIWNoZWNrRXh0ZW5zaW9uKGRweSkpIHJldHVybiBGYWxzZTsKKworICBMb2NrRGlzcGxheShkcHkpOworICBHZXRSZXEoVm5jRXh0QXBwcm92ZUNvbm5lY3QsIHJlcSk7CisgIHJlcS0+cmVxVHlwZSA9IGNvZGVzLT5tYWpvcl9vcGNvZGU7CisgIHJlcS0+dm5jRXh0UmVxVHlwZSA9IFhfVm5jRXh0QXBwcm92ZUNvbm5lY3Q7CisgIHJlcS0+YXBwcm92ZSA9IGFwcHJvdmU7CisgIHJlcS0+b3BhcXVlSWQgPSAoQ0FSRDMyKW9wYXF1ZUlkOworICBVbmxvY2tEaXNwbGF5KGRweSk7CisgIFN5bmNIYW5kbGUoKTsKKyAgcmV0dXJuIFRydWU7Cit9CisKKworc3RhdGljIEJvb2wgWFZuY0V4dENsaWVudEN1dFRleHROb3RpZnlXaXJlVG9FdmVudChEaXNwbGF5KiBkcHksIFhFdmVudCogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEV2ZW50KiB3KQoreworICBYVm5jRXh0Q2xpZW50Q3V0VGV4dEV2ZW50KiBldiA9IChYVm5jRXh0Q2xpZW50Q3V0VGV4dEV2ZW50KillOworICB4Vm5jRXh0Q2xpZW50Q3V0VGV4dE5vdGlmeUV2ZW50KiB3aXJlID0gKHhWbmNFeHRDbGllbnRDdXRUZXh0Tm90aWZ5RXZlbnQqKXc7CisgIGV2LT50eXBlID0gd2lyZS0+dHlwZSAmIDB4N2Y7CisgIGV2LT5zZXJpYWwgPSBfWFNldExhc3RSZXF1ZXN0UmVhZChkcHksKHhHZW5lcmljUmVwbHkqKXdpcmUpOworICBldi0+c2VuZF9ldmVudCA9ICh3aXJlLT50eXBlICYgMHg4MCkgIT0gMDsKKyAgZXYtPmRpc3BsYXkgPSBkcHk7CisgIGV2LT53aW5kb3cgPSB3aXJlLT53aW5kb3c7CisgIGV2LT50aW1lID0gd2lyZS0+dGltZTsKKyAgcmV0dXJuIFRydWU7Cit9CisKK3N0YXRpYyBCb29sIFhWbmNFeHRTZWxlY3Rpb25DaGFuZ2VOb3RpZnlXaXJlVG9FdmVudChEaXNwbGF5KiBkcHksIFhFdmVudCogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4RXZlbnQqIHcpCit7CisgIFhWbmNFeHRTZWxlY3Rpb25DaGFuZ2VFdmVudCogZXYgPSAoWFZuY0V4dFNlbGVjdGlvbkNoYW5nZUV2ZW50KillOworICB4Vm5jRXh0U2VsZWN0aW9uQ2hhbmdlTm90aWZ5RXZlbnQqIHdpcmUKKyAgICA9ICh4Vm5jRXh0U2VsZWN0aW9uQ2hhbmdlTm90aWZ5RXZlbnQqKXc7CisgIGV2LT50eXBlID0gd2lyZS0+dHlwZSAmIDB4N2Y7CisgIGV2LT5zZXJpYWwgPSBfWFNldExhc3RSZXF1ZXN0UmVhZChkcHksKHhHZW5lcmljUmVwbHkqKXdpcmUpOworICBldi0+c2VuZF9ldmVudCA9ICh3aXJlLT50eXBlICYgMHg4MCkgIT0gMDsKKyAgZXYtPmRpc3BsYXkgPSBkcHk7CisgIGV2LT53aW5kb3cgPSB3aXJlLT53aW5kb3c7CisgIGV2LT5zZWxlY3Rpb24gPSB3aXJlLT5zZWxlY3Rpb247CisgIHJldHVybiBUcnVlOworfQorCitzdGF0aWMgQm9vbCBYVm5jRXh0UXVlcnlDb25uZWN0Tm90aWZ5V2lyZVRvRXZlbnQoRGlzcGxheSogZHB5LCBYRXZlbnQqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEV2ZW50KiB3KQoreworICBYVm5jRXh0UXVlcnlDb25uZWN0RXZlbnQqIGV2ID0gKFhWbmNFeHRRdWVyeUNvbm5lY3RFdmVudCopZTsKKyAgeFZuY0V4dFF1ZXJ5Q29ubmVjdE5vdGlmeUV2ZW50KiB3aXJlCisgICAgPSAoeFZuY0V4dFF1ZXJ5Q29ubmVjdE5vdGlmeUV2ZW50Kil3OworICBldi0+dHlwZSA9IHdpcmUtPnR5cGUgJiAweDdmOworICBldi0+c2VyaWFsID0gX1hTZXRMYXN0UmVxdWVzdFJlYWQoZHB5LCh4R2VuZXJpY1JlcGx5Kil3aXJlKTsKKyAgZXYtPnNlbmRfZXZlbnQgPSAod2lyZS0+dHlwZSAmIDB4ODApICE9IDA7CisgIGV2LT5kaXNwbGF5ID0gZHB5OworICBldi0+d2luZG93ID0gd2lyZS0+d2luZG93OworICByZXR1cm4gVHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3VuaXgvdm5jY29uZmlnL3ZuY0V4dC5oIGIvdW5peC92bmNjb25maWcvdm5jRXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MDJjNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jY29uZmlnL3ZuY0V4dC5oCkBAIC0wLDAgKzEsMzQzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9WTkNFWFRfSF8KKyNkZWZpbmUgX1ZOQ0VYVF9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWF9WbmNFeHRTZXRQYXJhbSAwCisjZGVmaW5lIFhfVm5jRXh0R2V0UGFyYW0gMQorI2RlZmluZSBYX1ZuY0V4dEdldFBhcmFtRGVzYyAyCisjZGVmaW5lIFhfVm5jRXh0TGlzdFBhcmFtcyAzCisjZGVmaW5lIFhfVm5jRXh0U2V0U2VydmVyQ3V0VGV4dCA0CisjZGVmaW5lIFhfVm5jRXh0R2V0Q2xpZW50Q3V0VGV4dCA1CisjZGVmaW5lIFhfVm5jRXh0U2VsZWN0SW5wdXQgNgorI2RlZmluZSBYX1ZuY0V4dENvbm5lY3QgNworI2RlZmluZSBYX1ZuY0V4dEdldFF1ZXJ5Q29ubmVjdCA4CisjZGVmaW5lIFhfVm5jRXh0QXBwcm92ZUNvbm5lY3QgOQorCisjZGVmaW5lIFZuY0V4dENsaWVudEN1dFRleHROb3RpZnkgMAorI2RlZmluZSBWbmNFeHRTZWxlY3Rpb25DaGFuZ2VOb3RpZnkgMQorI2RlZmluZSBWbmNFeHRRdWVyeUNvbm5lY3ROb3RpZnkgMgorI2RlZmluZSBWbmNFeHRDbGllbnRDdXRUZXh0TWFzayAoMSA8PCBWbmNFeHRDbGllbnRDdXRUZXh0Tm90aWZ5KQorI2RlZmluZSBWbmNFeHRTZWxlY3Rpb25DaGFuZ2VNYXNrICgxIDw8IFZuY0V4dFNlbGVjdGlvbkNoYW5nZU5vdGlmeSkKKyNkZWZpbmUgVm5jRXh0UXVlcnlDb25uZWN0TWFzayAoMSA8PCBWbmNFeHRRdWVyeUNvbm5lY3ROb3RpZnkpCisKKyNkZWZpbmUgVm5jRXh0TnVtYmVyRXZlbnRzIDMKKyNkZWZpbmUgVm5jRXh0TnVtYmVyRXJyb3JzIDAKKworI2lmbmRlZiBfVk5DRVhUX1NFUlZFUl8KKworQm9vbCBYVm5jRXh0UXVlcnlFeHRlbnNpb24oRGlzcGxheSogZHB5LCBpbnQqIGV2ZW50X2Jhc2VwLCBpbnQqIGVycm9yX2Jhc2VwKTsKK0Jvb2wgWFZuY0V4dFNldFBhcmFtKERpc3BsYXkqIGRweSwgY29uc3QgY2hhciogcGFyYW0pOworQm9vbCBYVm5jRXh0R2V0UGFyYW0oRGlzcGxheSogZHB5LCBjb25zdCBjaGFyKiBwYXJhbSwgY2hhcioqIHZhbHVlLCBpbnQqIGxlbik7CitjaGFyKiBYVm5jRXh0R2V0UGFyYW1EZXNjKERpc3BsYXkqIGRweSwgY29uc3QgY2hhciogcGFyYW0pOworY2hhcioqIFhWbmNFeHRMaXN0UGFyYW1zKERpc3BsYXkqIGRweSwgaW50KiBuUGFyYW1zKTsKK3ZvaWQgWFZuY0V4dEZyZWVQYXJhbUxpc3QoY2hhcioqIGxpc3QpOworQm9vbCBYVm5jRXh0U2V0U2VydmVyQ3V0VGV4dChEaXNwbGF5KiBkcHksIGNvbnN0IGNoYXIqIHN0ciwgaW50IGxlbik7CitCb29sIFhWbmNFeHRHZXRDbGllbnRDdXRUZXh0KERpc3BsYXkqIGRweSwgY2hhcioqIHN0ciwgaW50KiBsZW4pOworQm9vbCBYVm5jRXh0U2VsZWN0SW5wdXQoRGlzcGxheSogZHB5LCBXaW5kb3cgdywgaW50IG1hc2spOworQm9vbCBYVm5jRXh0Q29ubmVjdChEaXNwbGF5KiBkcHksIGNoYXIqIGhvc3RBbmRQb3J0KTsKK0Jvb2wgWFZuY0V4dEdldFF1ZXJ5Q29ubmVjdChEaXNwbGF5KiBkcHksIGNoYXIqKiBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiB1c2VyLCBpbnQqIHRpbWVvdXQsIHZvaWQqKiBvcGFxdWVJZCk7CitCb29sIFhWbmNFeHRBcHByb3ZlQ29ubmVjdChEaXNwbGF5KiBkcHksIHZvaWQqIG9wYXF1ZUlkLCBpbnQgYXBwcm92ZSk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgdHlwZTsKKyAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CisgIEJvb2wgc2VuZF9ldmVudDsKKyAgRGlzcGxheSAqZGlzcGxheTsKKyAgV2luZG93IHdpbmRvdzsKKyAgVGltZSB0aW1lOworfSBYVm5jRXh0Q2xpZW50Q3V0VGV4dEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB0eXBlOworICB1bnNpZ25lZCBsb25nIHNlcmlhbDsKKyAgQm9vbCBzZW5kX2V2ZW50OworICBEaXNwbGF5ICpkaXNwbGF5OworICBXaW5kb3cgd2luZG93OworICBBdG9tIHNlbGVjdGlvbjsKK30gWFZuY0V4dFNlbGVjdGlvbkNoYW5nZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB0eXBlOworICB1bnNpZ25lZCBsb25nIHNlcmlhbDsKKyAgQm9vbCBzZW5kX2V2ZW50OworICBEaXNwbGF5ICpkaXNwbGF5OworICBXaW5kb3cgd2luZG93OworfSBYVm5jRXh0UXVlcnlDb25uZWN0RXZlbnQ7CisKKyNlbmRpZgorCisjaWZkZWYgX1ZOQ0VYVF9QUk9UT18KKworI2RlZmluZSBWTkNFWFROQU1FICJWTkMtRVhURU5TSU9OIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIENBUkQ4IHJlcVR5cGU7ICAgICAgIC8qIGFsd2F5cyBWbmNFeHRSZXFDb2RlICovCisgIENBUkQ4IHZuY0V4dFJlcVR5cGU7IC8qIGFsd2F5cyBWbmNFeHRTZXRQYXJhbSAqLworICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgQ0FSRDggcGFyYW1MZW47CisgIENBUkQ4IHBhZDA7CisgIENBUkQxNiBwYWQxIEIxNjsKK30geFZuY0V4dFNldFBhcmFtUmVxOworI2RlZmluZSBzel94Vm5jRXh0U2V0UGFyYW1SZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgQllURSB0eXBlOyAvKiBYX1JlcGx5ICovCisgQllURSBzdWNjZXNzOworIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgQ0FSRDMyIGxlbmd0aCBCMzI7CisgQ0FSRDMyIHBhZDAgQjMyOworIENBUkQzMiBwYWQxIEIzMjsKKyBDQVJEMzIgcGFkMiBCMzI7CisgQ0FSRDMyIHBhZDMgQjMyOworIENBUkQzMiBwYWQ0IEIzMjsKKyBDQVJEMzIgcGFkNSBCMzI7Cit9IHhWbmNFeHRTZXRQYXJhbVJlcGx5OworI2RlZmluZSBzel94Vm5jRXh0U2V0UGFyYW1SZXBseSAzMgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0FSRDggcmVxVHlwZTsgICAgICAgLyogYWx3YXlzIFZuY0V4dFJlcUNvZGUgKi8KKyAgQ0FSRDggdm5jRXh0UmVxVHlwZTsgLyogYWx3YXlzIFZuY0V4dEdldFBhcmFtICovCisgIENBUkQxNiBsZW5ndGggQjE2OworICBDQVJEOCBwYXJhbUxlbjsKKyAgQ0FSRDggcGFkMDsKKyAgQ0FSRDE2IHBhZDEgQjE2OworfSB4Vm5jRXh0R2V0UGFyYW1SZXE7CisjZGVmaW5lIHN6X3hWbmNFeHRHZXRQYXJhbVJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyBCWVRFIHN1Y2Nlc3M7CisgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyBDQVJEMzIgbGVuZ3RoIEIzMjsKKyBDQVJEMTYgdmFsdWVMZW4gQjE2OworIENBUkQxNiBwYWQwIEIxNjsKKyBDQVJEMzIgcGFkMSBCMzI7CisgQ0FSRDMyIHBhZDIgQjMyOworIENBUkQzMiBwYWQzIEIzMjsKKyBDQVJEMzIgcGFkNCBCMzI7CisgQ0FSRDMyIHBhZDUgQjMyOworfSB4Vm5jRXh0R2V0UGFyYW1SZXBseTsKKyNkZWZpbmUgc3pfeFZuY0V4dEdldFBhcmFtUmVwbHkgMzIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIENBUkQ4IHJlcVR5cGU7ICAgICAgIC8qIGFsd2F5cyBWbmNFeHRSZXFDb2RlICovCisgIENBUkQ4IHZuY0V4dFJlcVR5cGU7IC8qIGFsd2F5cyBWbmNFeHRHZXRQYXJhbURlc2MgKi8KKyAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgIENBUkQ4IHBhcmFtTGVuOworICBDQVJEOCBwYWQwOworICBDQVJEMTYgcGFkMSBCMTY7Cit9IHhWbmNFeHRHZXRQYXJhbURlc2NSZXE7CisjZGVmaW5lIHN6X3hWbmNFeHRHZXRQYXJhbURlc2NSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgQllURSB0eXBlOyAvKiBYX1JlcGx5ICovCisgQllURSBzdWNjZXNzOworIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgQ0FSRDMyIGxlbmd0aCBCMzI7CisgQ0FSRDE2IGRlc2NMZW4gQjE2OworIENBUkQxNiBwYWQwIEIxNjsKKyBDQVJEMzIgcGFkMSBCMzI7CisgQ0FSRDMyIHBhZDIgQjMyOworIENBUkQzMiBwYWQzIEIzMjsKKyBDQVJEMzIgcGFkNCBCMzI7CisgQ0FSRDMyIHBhZDUgQjMyOworfSB4Vm5jRXh0R2V0UGFyYW1EZXNjUmVwbHk7CisjZGVmaW5lIHN6X3hWbmNFeHRHZXRQYXJhbURlc2NSZXBseSAzMgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0FSRDggcmVxVHlwZTsgICAgICAgLyogYWx3YXlzIFZuY0V4dFJlcUNvZGUgKi8KKyAgQ0FSRDggdm5jRXh0UmVxVHlwZTsgLyogYWx3YXlzIFZuY0V4dExpc3RQYXJhbXMgKi8KKyAgQ0FSRDE2IGxlbmd0aCBCMTY7Cit9IHhWbmNFeHRMaXN0UGFyYW1zUmVxOworI2RlZmluZSBzel94Vm5jRXh0TGlzdFBhcmFtc1JlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyBCWVRFIHBhZDA7CisgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyBDQVJEMzIgbGVuZ3RoIEIzMjsKKyBDQVJEMTYgblBhcmFtcyBCMTY7CisgQ0FSRDE2IHBhZDEgQjE2OworIENBUkQzMiBwYWQyIEIzMjsKKyBDQVJEMzIgcGFkMyBCMzI7CisgQ0FSRDMyIHBhZDQgQjMyOworIENBUkQzMiBwYWQ1IEIzMjsKKyBDQVJEMzIgcGFkNiBCMzI7Cit9IHhWbmNFeHRMaXN0UGFyYW1zUmVwbHk7CisjZGVmaW5lIHN6X3hWbmNFeHRMaXN0UGFyYW1zUmVwbHkgMzIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIENBUkQ4IHJlcVR5cGU7ICAgICAgIC8qIGFsd2F5cyBWbmNFeHRSZXFDb2RlICovCisgIENBUkQ4IHZuY0V4dFJlcVR5cGU7IC8qIGFsd2F5cyBWbmNFeHRTZXRTZXJ2ZXJDdXRUZXh0ICovCisgIENBUkQxNiBsZW5ndGggQjE2OworICBDQVJEMzIgdGV4dExlbiBCMzI7Cit9IHhWbmNFeHRTZXRTZXJ2ZXJDdXRUZXh0UmVxOworI2RlZmluZSBzel94Vm5jRXh0U2V0U2VydmVyQ3V0VGV4dFJlcSA4CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDQVJEOCByZXFUeXBlOyAgICAgICAvKiBhbHdheXMgVm5jRXh0UmVxQ29kZSAqLworICBDQVJEOCB2bmNFeHRSZXFUeXBlOyAvKiBhbHdheXMgVm5jRXh0R2V0Q2xpZW50Q3V0VGV4dCAqLworICBDQVJEMTYgbGVuZ3RoIEIxNjsKK30geFZuY0V4dEdldENsaWVudEN1dFRleHRSZXE7CisjZGVmaW5lIHN6X3hWbmNFeHRHZXRDbGllbnRDdXRUZXh0UmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworIEJZVEUgdHlwZTsgLyogWF9SZXBseSAqLworIEJZVEUgcGFkMDsKKyBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworIENBUkQzMiBsZW5ndGggQjMyOworIENBUkQzMiB0ZXh0TGVuIEIzMjsKKyBDQVJEMzIgcGFkMSBCMzI7CisgQ0FSRDMyIHBhZDIgQjMyOworIENBUkQzMiBwYWQzIEIzMjsKKyBDQVJEMzIgcGFkNCBCMzI7CisgQ0FSRDMyIHBhZDUgQjMyOworfSB4Vm5jRXh0R2V0Q2xpZW50Q3V0VGV4dFJlcGx5OworI2RlZmluZSBzel94Vm5jRXh0R2V0Q2xpZW50Q3V0VGV4dFJlcGx5IDMyCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDQVJEOCByZXFUeXBlOyAgICAgICAvKiBhbHdheXMgVm5jRXh0UmVxQ29kZSAqLworICBDQVJEOCB2bmNFeHRSZXFUeXBlOyAvKiBhbHdheXMgVm5jRXh0U2VsZWN0SW5wdXQgKi8KKyAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgIENBUkQzMiB3aW5kb3cgQjMyOworICBDQVJEMzIgbWFzayBCMzI7Cit9IHhWbmNFeHRTZWxlY3RJbnB1dFJlcTsKKyNkZWZpbmUgc3pfeFZuY0V4dFNlbGVjdElucHV0UmVxIDEyCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDQVJEOCByZXFUeXBlOyAgICAgICAvKiBhbHdheXMgVm5jRXh0UmVxQ29kZSAqLworICBDQVJEOCB2bmNFeHRSZXFUeXBlOyAvKiBhbHdheXMgVm5jRXh0Q29ubmVjdCAqLworICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgQ0FSRDggc3RyTGVuOworICBDQVJEOCBwYWQwOworICBDQVJEMTYgcGFkMSBCMTY7Cit9IHhWbmNFeHRDb25uZWN0UmVxOworI2RlZmluZSBzel94Vm5jRXh0Q29ubmVjdFJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyBCWVRFIHN1Y2Nlc3M7CisgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyBDQVJEMzIgbGVuZ3RoIEIzMjsKKyBDQVJEMzIgcGFkMCBCMzI7CisgQ0FSRDMyIHBhZDEgQjMyOworIENBUkQzMiBwYWQyIEIzMjsKKyBDQVJEMzIgcGFkMyBCMzI7CisgQ0FSRDMyIHBhZDQgQjMyOworIENBUkQzMiBwYWQ1IEIzMjsKK30geFZuY0V4dENvbm5lY3RSZXBseTsKKyNkZWZpbmUgc3pfeFZuY0V4dENvbm5lY3RSZXBseSAzMgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0FSRDggcmVxVHlwZTsgICAgICAgLyogYWx3YXlzIFZuY0V4dFJlcUNvZGUgKi8KKyAgQ0FSRDggdm5jRXh0UmVxVHlwZTsgLyogYWx3YXlzIFZuY0V4dEdldFF1ZXJ5Q29ubmVjdCAqLworICBDQVJEMTYgbGVuZ3RoIEIxNjsKK30geFZuY0V4dEdldFF1ZXJ5Q29ubmVjdFJlcTsKKyNkZWZpbmUgc3pfeFZuY0V4dEdldFF1ZXJ5Q29ubmVjdFJlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyBCWVRFIHBhZDA7CisgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyBDQVJEMzIgbGVuZ3RoIEIzMjsKKyBDQVJEMzIgYWRkckxlbiBCMzI7CisgQ0FSRDMyIHVzZXJMZW4gQjMyOworIENBUkQzMiB0aW1lb3V0IEIzMjsKKyBDQVJEMzIgb3BhcXVlSWQgQjMyOworIENBUkQzMiBwYWQ0IEIzMjsKKyBDQVJEMzIgcGFkNSBCMzI7Cit9IHhWbmNFeHRHZXRRdWVyeUNvbm5lY3RSZXBseTsKKyNkZWZpbmUgc3pfeFZuY0V4dEdldFF1ZXJ5Q29ubmVjdFJlcGx5IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0FSRDggcmVxVHlwZTsgICAgICAgLyogYWx3YXlzIFZuY0V4dFJlcUNvZGUgKi8KKyAgQ0FSRDggdm5jRXh0UmVxVHlwZTsgLyogYWx3YXlzIFZuY0V4dEFwcHJvdmVDb25uZWN0ICovCisgIENBUkQxNiBsZW5ndGggQjE2OworICBDQVJEOCBhcHByb3ZlOworICBDQVJEOCBwYWQwOworICBDQVJEMTYgcGFkMTsKKyAgQ0FSRDMyIG9wYXF1ZUlkIEIzMjsKK30geFZuY0V4dEFwcHJvdmVDb25uZWN0UmVxOworI2RlZmluZSBzel94Vm5jRXh0QXBwcm92ZUNvbm5lY3RSZXEgMTIKKworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQllURSB0eXBlOyAgICAvKiBhbHdheXMgZXZlbnRCYXNlICsgVm5jRXh0Q2xpZW50Q3V0VGV4dE5vdGlmeSAqLworICBCWVRFIHBhZDA7CisgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgIENBUkQzMiB3aW5kb3cgQjMyOworICBDQVJEMzIgdGltZSBCMzI7CisgIENBUkQzMiBwYWQxIEIzMjsKKyAgQ0FSRDMyIHBhZDIgQjMyOworICBDQVJEMzIgcGFkMyBCMzI7CisgIENBUkQzMiBwYWQ0IEIzMjsKKyAgQ0FSRDMyIHBhZDUgQjMyOworfSB4Vm5jRXh0Q2xpZW50Q3V0VGV4dE5vdGlmeUV2ZW50OworI2RlZmluZSBzel94Vm5jRXh0Q2xpZW50Q3V0VGV4dE5vdGlmeUV2ZW50IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQllURSB0eXBlOyAgICAvKiBhbHdheXMgZXZlbnRCYXNlICsgVm5jRXh0U2VsZWN0aW9uQ2hhbmdlTm90aWZ5ICovCisgIEJZVEUgcGFkMDsKKyAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgQ0FSRDMyIHdpbmRvdyBCMzI7CisgIENBUkQzMiBzZWxlY3Rpb24gQjMyOworICBDQVJEMzIgcGFkMSBCMzI7CisgIENBUkQzMiBwYWQyIEIzMjsKKyAgQ0FSRDMyIHBhZDMgQjMyOworICBDQVJEMzIgcGFkNCBCMzI7CisgIENBUkQzMiBwYWQ1IEIzMjsKK30geFZuY0V4dFNlbGVjdGlvbkNoYW5nZU5vdGlmeUV2ZW50OworI2RlZmluZSBzel94Vm5jRXh0U2VsZWN0aW9uQ2hhbmdlTm90aWZ5RXZlbnQgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBCWVRFIHR5cGU7ICAgIC8qIGFsd2F5cyBldmVudEJhc2UgKyBWbmNFeHRRdWVyeUNvbm5lY3ROb3RpZnkgKi8KKyAgQllURSBwYWQwOworICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICBDQVJEMzIgd2luZG93IEIzMjsKKyAgQ0FSRDMyIHBhZDYgQjMyOworICBDQVJEMzIgcGFkMSBCMzI7CisgIENBUkQzMiBwYWQyIEIzMjsKKyAgQ0FSRDMyIHBhZDMgQjMyOworICBDQVJEMzIgcGFkNCBCMzI7CisgIENBUkQzMiBwYWQ1IEIzMjsKK30geFZuY0V4dFF1ZXJ5Q29ubmVjdE5vdGlmeUV2ZW50OworI2RlZmluZSBzel94Vm5jRXh0UXVlcnlDb25uZWN0Tm90aWZ5RXZlbnQgMzIKKworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC92bmNjb25maWcvdm5jY29uZmlnLmN4eCBiL3VuaXgvdm5jY29uZmlnL3ZuY2NvbmZpZy5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwMWQxOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jY29uZmlnL3ZuY2NvbmZpZy5jeHgKQEAgLTAsMCArMSw0MzggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBWTkMgc2VydmVyIGNvbmZpZ3VyYXRpb24gdXRpbGl0eQorLy8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8WDExL1guaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KKyNpbmNsdWRlICJ2bmNFeHQuaCIKKyNpbmNsdWRlIDxyZHIvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxyZmIvTG9nZ2VyX3N0ZGlvLmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9UaW1lci5oPgorI2luY2x1ZGUgIlRYV2luZG93LmgiCisjaW5jbHVkZSAiVFhDaGVja2JveC5oIgorI2luY2x1ZGUgIlRYTGFiZWwuaCIKKyNpbmNsdWRlICJRdWVyeUNvbm5lY3REaWFsb2cuaCIKKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworTG9nV3JpdGVyIHZsb2coInZuY2NvbmZpZyIpOworCitTdHJpbmdQYXJhbWV0ZXIgZGlzcGxheW5hbWUoImRpc3BsYXkiLCAiVGhlIFggZGlzcGxheSIsICIiKTsKK0Jvb2xQYXJhbWV0ZXIgbm9XaW5kb3coIm5vd2luIiwgIkRvbid0IGRpc3BsYXkgYSB3aW5kb3ciLCAwKTsKK0Jvb2xQYXJhbWV0ZXIgaWNvbmljKCJpY29uaWMiLCAiU3RhcnQgd2l0aCB3aW5kb3cgaWNvbmlmaWVkIiwgMCk7CitCb29sUGFyYW1ldGVyIHNlbmRQcmltYXJ5KCJTZW5kUHJpbWFyeSIsICJTZW5kIHRoZSBQUklNQVJZIGFzIHdlbGwgYXMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNMSVBCT0FSRCBzZWxlY3Rpb24iLCB0cnVlKTsKK0ludFBhcmFtZXRlciBwb2xsVGltZSgicG9sbCIsCisgICAgICAgICAgICAgICAgICAgICAgIkhvdyBvZnRlbiB0byBwb2xsIGZvciBjbGlwYm9hcmQgY2hhbmdlcyBpbiBtcyIsIDApOworCitpbmxpbmUgY29uc3QgY2hhciogc2VsZWN0aW9uTmFtZShBdG9tIHNlbCkgeworICBpZiAoc2VsID09IHhhQ0xJUEJPQVJEKSByZXR1cm4gIkNMSVBCT0FSRCI7CisgIGlmIChzZWwgPT0gWEFfUFJJTUFSWSkgcmV0dXJuICJQUklNQVJZIjsKKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKworI2RlZmluZSBBQ0NFUFRfQ1VUX1RFWFQgIkFjY2VwdEN1dFRleHQiCisjZGVmaW5lIFNFTkRfQ1VUX1RFWFQgIlNlbmRDdXRUZXh0IgorCitjaGFyKiBwcm9ncmFtTmFtZSA9IDA7CitEaXNwbGF5KiBkcHk7CitpbnQgdm5jRXh0RXZlbnRCYXNlLCB2bmNFeHRFcnJvckJhc2U7CisKK3N0YXRpYyBib29sIGdldEJvb2xQYXJhbShEaXNwbGF5KiBkcHksIGNvbnN0IGNoYXIqIHBhcmFtKSB7CisgIGNoYXIqIGRhdGE7CisgIGludCBsZW47CisgIGlmIChYVm5jRXh0R2V0UGFyYW0oZHB5LCBwYXJhbSwgJmRhdGEsICZsZW4pKSB7CisgICAgaWYgKHN0cmNtcChkYXRhLCIxIikgPT0gMCkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitjbGFzcyBWbmNDb25maWdXaW5kb3cgOiBwdWJsaWMgVFhXaW5kb3csIHB1YmxpYyBUWEV2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUWERlbGV0ZVdpbmRvd0NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRYQ2hlY2tib3hDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyByZmI6OlRpbWVyOjpDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBRdWVyeVJlc3VsdENhbGxiYWNrIHsKK3B1YmxpYzoKKyAgVm5jQ29uZmlnV2luZG93KERpc3BsYXkqIGRweSkKKyAgICA6IFRYV2luZG93KGRweSwgMzAwLCAxMDApLCBjdXRUZXh0KDApLCBjdXRUZXh0TGVuKDApLAorICAgICAgYWNjZXB0Q2xpcGJvYXJkKGRweSwgIkFjY2VwdCBjbGlwYm9hcmQgZnJvbSB2aWV3ZXJzIiwgdGhpcywgZmFsc2UsIHRoaXMpLAorICAgICAgc2VuZENsaXBib2FyZChkcHksICJTZW5kIGNsaXBib2FyZCB0byB2aWV3ZXJzIiwgdGhpcywgZmFsc2UsIHRoaXMpLAorICAgICAgc2VuZFByaW1hcnlDQihkcHksICJTZW5kIHByaW1hcnkgc2VsZWN0aW9uIHRvIHZpZXdlcnMiLCB0aGlzLGZhbHNlLHRoaXMpLAorICAgICAgcG9sbFRpbWVyKHRoaXMpLAorICAgICAgcXVlcnlDb25uZWN0RGlhbG9nKDApCisgIHsKKyAgICBzZWxlY3Rpb25bMF0gPSBzZWxlY3Rpb25bMV0gPSAwOworICAgIHNlbGVjdGlvbkxlblswXSA9IHNlbGVjdGlvbkxlblsxXSA9IDA7CisgICAgaW50IHkgPSB5UGFkOworICAgIGFjY2VwdENsaXBib2FyZC5tb3ZlKHhQYWQsIHkpOworICAgIGFjY2VwdENsaXBib2FyZC5jaGVja2VkKGdldEJvb2xQYXJhbShkcHksIEFDQ0VQVF9DVVRfVEVYVCkpOworICAgIHkgKz0gYWNjZXB0Q2xpcGJvYXJkLmhlaWdodCgpOworICAgIHNlbmRDbGlwYm9hcmQubW92ZSh4UGFkLCB5KTsKKyAgICBzZW5kQ2xpcGJvYXJkLmNoZWNrZWQoZ2V0Qm9vbFBhcmFtKGRweSwgU0VORF9DVVRfVEVYVCkpOworICAgIHkgKz0gc2VuZENsaXBib2FyZC5oZWlnaHQoKTsKKyAgICBzZW5kUHJpbWFyeUNCLm1vdmUoeFBhZCwgeSk7CisgICAgc2VuZFByaW1hcnlDQi5jaGVja2VkKHNlbmRQcmltYXJ5KTsKKyAgICBzZW5kUHJpbWFyeUNCLmRpc2FibGVkKCFzZW5kQ2xpcGJvYXJkLmNoZWNrZWQoKSk7CisgICAgeSArPSBzZW5kUHJpbWFyeUNCLmhlaWdodCgpOworICAgIHNldEV2ZW50SGFuZGxlcih0aGlzKTsKKyAgICB0b3BsZXZlbCgiVk5DIGNvbmZpZyIsIHRoaXMsIDAsIDAsIDAsIGljb25pYyk7CisgICAgWFZuY0V4dFNlbGVjdElucHV0KGRweSwgd2luKCksCisgICAgICAgICAgICAgICAgICAgICAgIFZuY0V4dENsaWVudEN1dFRleHRNYXNrfAorICAgICAgICAgICAgICAgICAgICAgICBWbmNFeHRTZWxlY3Rpb25DaGFuZ2VNYXNrfAorICAgICAgICAgICAgICAgICAgICAgICBWbmNFeHRRdWVyeUNvbm5lY3RNYXNrKTsKKyAgICBYQ29udmVydFNlbGVjdGlvbihkcHksIFhBX1BSSU1BUlksIFhBX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICBYQV9QUklNQVJZLCB3aW4oKSwgQ3VycmVudFRpbWUpOworICAgIFhDb252ZXJ0U2VsZWN0aW9uKGRweSwgeGFDTElQQk9BUkQsIFhBX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICB4YUNMSVBCT0FSRCwgd2luKCksIEN1cnJlbnRUaW1lKTsKKyAgICBpZiAocG9sbFRpbWUgIT0gMCkKKyAgICAgIHBvbGxUaW1lci5zdGFydChwb2xsVGltZSk7CisgIH0KKworICAvLyBoYW5kbGVFdmVudCgpLiBJZiB3ZSBnZXQgYSBDbGllbnRDdXRUZXh0Tm90aWZ5IGV2ZW50IGZyb20gWHZuYywgc2V0IHRoZQorICAvLyBwcmltYXJ5IGFuZCBjbGlwYm9hcmQgc2VsZWN0aW9ucyB0byB0aGUgY2xpZW50Q3V0VGV4dC4gSWYgd2UgZ2V0IGEKKyAgLy8gU2VsZWN0aW9uQ2hhbmdlTm90aWZ5IGV2ZW50IGZyb20gWHZuYywgc2V0IHRoZSBzZXJ2ZXJDdXRUZXh0IHRvIHRoZSB2YWx1ZQorICAvLyBvZiB0aGUgbmV3IHNlbGVjdGlvbi4KKworICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnQoVFhXaW5kb3cqIHcsIFhFdmVudCogZXYpIHsKKyAgICBpZiAoYWNjZXB0Q2xpcGJvYXJkLmNoZWNrZWQoKSkgeworICAgICAgaWYgKGV2LT50eXBlID09IHZuY0V4dEV2ZW50QmFzZSArIFZuY0V4dENsaWVudEN1dFRleHROb3RpZnkpIHsKKyAgICAgICAgWFZuY0V4dENsaWVudEN1dFRleHRFdmVudCogY3V0RXYgPSAoWFZuY0V4dENsaWVudEN1dFRleHRFdmVudCopZXY7CisgICAgICAgIGlmIChjdXRUZXh0KQorICAgICAgICAgIFhGcmVlKGN1dFRleHQpOworICAgICAgICBjdXRUZXh0ID0gMDsKKyAgICAgICAgaWYgKFhWbmNFeHRHZXRDbGllbnRDdXRUZXh0KGRweSwgJmN1dFRleHQsICZjdXRUZXh0TGVuKSkgeworICAgICAgICAgIHZsb2cuZGVidWcoIkdvdCBjbGllbnQgY3V0IHRleHQ6ICclLipzJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGN1dFRleHRMZW48OT9jdXRUZXh0TGVuOjgsIGN1dFRleHQsCisgICAgICAgICAgICAgICAgICAgICBjdXRUZXh0TGVuPDk/IiI6Ii4uLiIpOworICAgICAgICAgIFhTdG9yZUJ5dGVzKGRweSwgY3V0VGV4dCwgY3V0VGV4dExlbik7CisgICAgICAgICAgb3duU2VsZWN0aW9uKFhBX1BSSU1BUlksIGN1dEV2LT50aW1lKTsKKyAgICAgICAgICBvd25TZWxlY3Rpb24oeGFDTElQQk9BUkQsIGN1dEV2LT50aW1lKTsKKyAgICAgICAgICBkZWxldGUgW10gc2VsZWN0aW9uWzBdOworICAgICAgICAgIGRlbGV0ZSBbXSBzZWxlY3Rpb25bMV07CisgICAgICAgICAgc2VsZWN0aW9uWzBdID0gc2VsZWN0aW9uWzFdID0gMDsKKyAgICAgICAgICBzZWxlY3Rpb25MZW5bMF0gPSBzZWxlY3Rpb25MZW5bMV0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChzZW5kQ2xpcGJvYXJkLmNoZWNrZWQoKSkgeworICAgICAgaWYgKGV2LT50eXBlID09IHZuY0V4dEV2ZW50QmFzZSArIFZuY0V4dFNlbGVjdGlvbkNoYW5nZU5vdGlmeSkgeworICAgICAgICB2bG9nLmRlYnVnKCJzZWxlY3Rpb24gY2hhbmdlIGV2ZW50Iik7CisgICAgICAgIFhWbmNFeHRTZWxlY3Rpb25DaGFuZ2VFdmVudCogc2VsRXYgPSAoWFZuY0V4dFNlbGVjdGlvbkNoYW5nZUV2ZW50KilldjsKKyAgICAgICAgaWYgKHNlbEV2LT5zZWxlY3Rpb24gPT0geGFDTElQQk9BUkQgfHwKKyAgICAgICAgICAgIChzZWxFdi0+c2VsZWN0aW9uID09IFhBX1BSSU1BUlkgJiYgc2VuZFByaW1hcnlDQi5jaGVja2VkKCkpKSB7CisgICAgICAgICAgaWYgKCFzZWxlY3Rpb25Pd25lcihzZWxFdi0+c2VsZWN0aW9uKSkKKyAgICAgICAgICAgIFhDb252ZXJ0U2VsZWN0aW9uKGRweSwgc2VsRXYtPnNlbGVjdGlvbiwgWEFfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsRXYtPnNlbGVjdGlvbiwgd2luKCksIEN1cnJlbnRUaW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoZXYtPnR5cGUgPT0gdm5jRXh0RXZlbnRCYXNlICsgVm5jRXh0UXVlcnlDb25uZWN0Tm90aWZ5KSB7CisgICAgICAgdmxvZy5kZWJ1ZygicXVlcnkgY29ubmVjdGlvbiBldmVudCIpOworICAgICAgIGlmIChxdWVyeUNvbm5lY3REaWFsb2cpCisgICAgICAgICBkZWxldGUgcXVlcnlDb25uZWN0RGlhbG9nOworICAgICAgIHF1ZXJ5Q29ubmVjdERpYWxvZyA9IDA7CisgICAgICAgY2hhciogcWNBZGRyZXNzOworICAgICAgIGNoYXIqIHFjVXNlcjsKKyAgICAgICBpbnQgcWNUaW1lb3V0OworICAgICAgIGlmIChYVm5jRXh0R2V0UXVlcnlDb25uZWN0KGRweSwgJnFjQWRkcmVzcywgJnFjVXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNUaW1lb3V0LCAmcXVlcnlDb25uZWN0SWQpKSB7CisgICAgICAgICBpZiAocWNUaW1lb3V0KQorICAgICAgICAgICBxdWVyeUNvbm5lY3REaWFsb2cgPSBuZXcgUXVlcnlDb25uZWN0RGlhbG9nKGRweSwgcWNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjVXNlciwgcWNUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgaWYgKHF1ZXJ5Q29ubmVjdERpYWxvZykKKyAgICAgICAgICAgcXVlcnlDb25uZWN0RGlhbG9nLT5tYXAoKTsKKyAgICAgICAgIFhGcmVlKHFjQWRkcmVzcyk7CisgICAgICAgICBYRnJlZShxY1VzZXIpOworICAgICAgIH0KKyAgICB9CisgIH0KKyAgCisKKyAgLy8gc2VsZWN0aW9uUmVxdWVzdCgpIGlzIGNhbGxlZCB3aGVuIHdlIGFyZSB0aGUgc2VsZWN0aW9uIG93bmVyIGFuZCBhbm90aGVyIFgKKyAgLy8gY2xpZW50IGhhcyByZXF1ZXN0ZWQgdGhlIHNlbGVjdGlvbi4gIFdlIHNpbXBseSBwdXQgdGhlIHNlcnZlcidzIGN1dCB0ZXh0CisgIC8vIGludG8gdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eS4gIFRYV2luZG93IHdpbGwgaGFuZGxlIHRoZSByZXN0LgorICBib29sIHNlbGVjdGlvblJlcXVlc3QoV2luZG93IHJlcXVlc3RvciwgQXRvbSBzZWxlY3Rpb24sIEF0b20gcHJvcGVydHkpCisgIHsKKyAgICBpZiAoY3V0VGV4dCkKKyAgICAgIFhDaGFuZ2VQcm9wZXJ0eShkcHksIHJlcXVlc3RvciwgcHJvcGVydHksIFhBX1NUUklORywgOCwKKyAgICAgICAgICAgICAgICAgICAgICBQcm9wTW9kZVJlcGxhY2UsICh1bnNpZ25lZCBjaGFyKiljdXRUZXh0LAorICAgICAgICAgICAgICAgICAgICAgIGN1dFRleHRMZW4pOworICAgIHJldHVybiBjdXRUZXh0OworICB9CisKKyAgLy8gc2VsZWN0aW9uTm90aWZ5KCkgaXMgY2FsbGVkIHdoZW4gd2UgaGF2ZSByZXF1ZXN0ZWQgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZQorICAvLyBzZWxlY3Rpb24gb3duZXIuCisgIHZvaWQgc2VsZWN0aW9uTm90aWZ5KFhTZWxlY3Rpb25FdmVudCogZXYsIEF0b20gdHlwZSwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pdGVtcywgdm9pZCogZGF0YSkKKyAgeworICAgIGlmIChldi0+cmVxdWVzdG9yICE9IHdpbigpIHx8IGV2LT50YXJnZXQgIT0gWEFfU1RSSU5HKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKGRhdGEgJiYgZm9ybWF0ID09IDgpIHsKKyAgICAgIGludCBpID0gKGV2LT5zZWxlY3Rpb24gPT0gWEFfUFJJTUFSWSA/IDAgOiAxKTsKKyAgICAgIGlmIChzZWxlY3Rpb25MZW5baV0gPT0gbml0ZW1zICYmIG1lbWNtcChzZWxlY3Rpb25baV0sIGRhdGEsIG5pdGVtcykgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgICAgZGVsZXRlIFtdIHNlbGVjdGlvbltpXTsKKyAgICAgIHNlbGVjdGlvbltpXSA9IG5ldyBjaGFyW25pdGVtc107CisgICAgICBtZW1jcHkoc2VsZWN0aW9uW2ldLCBkYXRhLCBuaXRlbXMpOworICAgICAgc2VsZWN0aW9uTGVuW2ldID0gbml0ZW1zOworICAgICAgaWYgKGN1dFRleHRMZW4gPT0gbml0ZW1zICYmIG1lbWNtcChjdXRUZXh0LCBkYXRhLCBuaXRlbXMpID09IDApIHsKKyAgICAgICAgdmxvZy5kZWJ1ZygiaWdub3JpbmcgZHVwbGljYXRlIGN1dCB0ZXh0Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChjdXRUZXh0KQorICAgICAgICBYRnJlZShjdXRUZXh0KTsKKyAgICAgIGN1dFRleHQgPSAoY2hhciopbWFsbG9jKG5pdGVtcyk7IC8vIGFzc3VtaW5nIFhGcmVlKCkgc2FtZSBhcyBmcmVlKCkKKyAgICAgIG1lbWNweShjdXRUZXh0LCBkYXRhLCBuaXRlbXMpOworICAgICAgY3V0VGV4dExlbiA9IG5pdGVtczsKKyAgICAgIHZsb2cuZGVidWcoInNlbmRpbmcgJXMgc2VsZWN0aW9uIGFzIHNlcnZlciBjdXQgdGV4dDogJyUuKnMlcyciLAorICAgICAgICAgICAgICAgICBzZWxlY3Rpb25OYW1lKGV2LT5zZWxlY3Rpb24pLGN1dFRleHRMZW48OT9jdXRUZXh0TGVuOjgsCisgICAgICAgICAgICAgICAgIGN1dFRleHQsIGN1dFRleHRMZW48OT8iIjoiLi4uIik7CisgICAgICBYVm5jRXh0U2V0U2VydmVyQ3V0VGV4dChkcHksIGN1dFRleHQsIGN1dFRleHRMZW4pOworICAgIH0KKyAgfQorCisgIC8vIFRYRGVsZXRlV2luZG93Q2FsbGJhY2sgbWV0aG9kCisgIHZpcnR1YWwgdm9pZCBkZWxldGVXaW5kb3coVFhXaW5kb3cqIHcpIHsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gVFhDaGVja2JveENhbGxiYWNrIG1ldGhvZAorICB2aXJ0dWFsIHZvaWQgY2hlY2tib3hTZWxlY3QoVFhDaGVja2JveCogY2hlY2tib3gpIHsKKyAgICBpZiAoY2hlY2tib3ggPT0gJmFjY2VwdENsaXBib2FyZCkgeworICAgICAgWFZuY0V4dFNldFBhcmFtKGRweSwgKGFjY2VwdENsaXBib2FyZC5jaGVja2VkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFDQ0VQVF9DVVRfVEVYVCAiPTEiIDogQUNDRVBUX0NVVF9URVhUICI9MCIpKTsKKyAgICB9IGVsc2UgaWYgKGNoZWNrYm94ID09ICZzZW5kQ2xpcGJvYXJkKSB7CisgICAgICBYVm5jRXh0U2V0UGFyYW0oZHB5LCAoc2VuZENsaXBib2FyZC5jaGVja2VkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFTkRfQ1VUX1RFWFQgIj0xIiA6IFNFTkRfQ1VUX1RFWFQgIj0wIikpOworICAgICAgc2VuZFByaW1hcnlDQi5kaXNhYmxlZCghc2VuZENsaXBib2FyZC5jaGVja2VkKCkpOworICAgIH0KKyAgfQorCisgIC8vIHJmYjo6VGltZXI6OkNhbGxiYWNrIGludGVyZmFjZQorICB2aXJ0dWFsIGJvb2wgaGFuZGxlVGltZW91dChyZmI6OlRpbWVyKiB0aW1lcikgeworICAgIGlmIChzZW5kUHJpbWFyeUNCLmNoZWNrZWQoKSAmJiAhc2VsZWN0aW9uT3duZXIoWEFfUFJJTUFSWSkpCisgICAgICBYQ29udmVydFNlbGVjdGlvbihkcHksIFhBX1BSSU1BUlksIFhBX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhBX1BSSU1BUlksIHdpbigpLCBDdXJyZW50VGltZSk7CisgICAgaWYgKCFzZWxlY3Rpb25Pd25lcih4YUNMSVBCT0FSRCkpCisgICAgICBYQ29udmVydFNlbGVjdGlvbihkcHksIHhhQ0xJUEJPQVJELCBYQV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICB4YUNMSVBCT0FSRCwgd2luKCksIEN1cnJlbnRUaW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFF1ZXJ5UmVzdWx0Q2FsbGJhY2sgaW50ZXJmYWNlCisgIHZpcnR1YWwgdm9pZCBxdWVyeUFwcHJvdmVkKCkgeworICAgIFhWbmNFeHRBcHByb3ZlQ29ubmVjdChkcHksIHF1ZXJ5Q29ubmVjdElkLCAxKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgcXVlcnlSZWplY3RlZCgpIHsKKyAgICBYVm5jRXh0QXBwcm92ZUNvbm5lY3QoZHB5LCBxdWVyeUNvbm5lY3RJZCwgMCk7CisgIH0KKworcHJpdmF0ZToKKyAgY2hhciogY3V0VGV4dDsKKyAgaW50IGN1dFRleHRMZW47CisgIGNoYXIqIHNlbGVjdGlvblsyXTsKKyAgaW50IHNlbGVjdGlvbkxlblsyXTsKKyAgVFhDaGVja2JveCBhY2NlcHRDbGlwYm9hcmQsIHNlbmRDbGlwYm9hcmQsIHNlbmRQcmltYXJ5Q0I7CisgIHJmYjo6VGltZXIgcG9sbFRpbWVyOworCisgIFF1ZXJ5Q29ubmVjdERpYWxvZyogcXVlcnlDb25uZWN0RGlhbG9nOworICB2b2lkKiBxdWVyeUNvbm5lY3RJZDsKK307CisKK3N0YXRpYyB2b2lkIHVzYWdlKCkKK3sKKyAgZnByaW50ZihzdGRlcnIsInVzYWdlOiAlcyBbcGFyYW1ldGVyc11cbiIsCisgICAgICAgICAgcHJvZ3JhbU5hbWUpOworICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICVzIFtwYXJhbWV0ZXJzXSAtY29ubmVjdCA8aG9zdD5bOjxwb3J0Pl1cbiIsCisgICAgICAgICAgcHJvZ3JhbU5hbWUpOworICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICVzIFtwYXJhbWV0ZXJzXSAtZGlzY29ubmVjdFxuIiwgcHJvZ3JhbU5hbWUpOworICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICVzIFtwYXJhbWV0ZXJzXSBbLXNldF0gPFh2bmMtcGFyYW0+PTx2YWx1ZT4gLi4uXG4iLAorICAgICAgICAgIHByb2dyYW1OYW1lKTsKKyAgZnByaW50ZihzdGRlcnIsIiAgICAgICAlcyBbcGFyYW1ldGVyc10gLWxpc3RcbiIsIHByb2dyYW1OYW1lKTsKKyAgZnByaW50ZihzdGRlcnIsIiAgICAgICAlcyBbcGFyYW1ldGVyc10gLWdldCA8cGFyYW0+XG4iLCBwcm9ncmFtTmFtZSk7CisgIGZwcmludGYoc3RkZXJyLCIgICAgICAgJXMgW3BhcmFtZXRlcnNdIC1kZXNjIDxwYXJhbT5cbiIscHJvZ3JhbU5hbWUpOworICBmcHJpbnRmKHN0ZGVyciwiXG4iCisgICAgICAgICAgIlBhcmFtZXRlcnMgY2FuIGJlIHR1cm5lZCBvbiB3aXRoIC08cGFyYW0+IG9yIG9mZiB3aXRoIC08cGFyYW0+PTBcbiIKKyAgICAgICAgICAiUGFyYW1ldGVycyB3aGljaCB0YWtlIGEgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBhcyAiCisgICAgICAgICAgIi08cGFyYW0+IDx2YWx1ZT5cbiIKKyAgICAgICAgICAiT3RoZXIgdmFsaWQgZm9ybXMgYXJlIDxwYXJhbT49PHZhbHVlPiAtPHBhcmFtPj08dmFsdWU+ICIKKyAgICAgICAgICAiLS08cGFyYW0+PTx2YWx1ZT5cbiIKKyAgICAgICAgICAiUGFyYW1ldGVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLiAgVGhlIHBhcmFtZXRlcnMgYXJlOlxuXG4iKTsKKyAgQ29uZmlndXJhdGlvbjo6bGlzdFBhcmFtcyg3OSwgMTQpOworICBleGl0KDEpOworfQorCit2b2lkIHJlbW92ZUFyZ3MoaW50KiBhcmdjLCBjaGFyKiogYXJndiwgaW50IGZpcnN0LCBpbnQgbikKK3sKKyAgaWYgKGZpcnN0ICsgbiA+ICphcmdjKSByZXR1cm47CisgIGZvciAoaW50IGkgPSBmaXJzdCArIG47IGkgPCAqYXJnYzsgaSsrKQorICAgIGFyZ3ZbaS1uXSA9IGFyZ3ZbaV07CisgICphcmdjIC09IG47Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgcHJvZ3JhbU5hbWUgPSBhcmd2WzBdOworICByZmI6OmluaXRTdGRJT0xvZ2dlcnMoKTsKKyAgcmZiOjpMb2dXcml0ZXI6OnNldExvZ1BhcmFtcygiKjpzdGRlcnI6MzAiKTsKKworICAvLyBQcm9jZXNzIHZuY2NvbmZpZydzIG93biBwYXJhbWV0ZXJzIGZpcnN0LCB0aGVuIHdlIHByb2Nlc3MgdGhlCisgIC8vIG90aGVyIGFyZ3VtZW50cyB3aGVuIHdlIGhhdmUgdGhlIFggZGlzcGxheS4KKyAgaW50IGk7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoQ29uZmlndXJhdGlvbjo6c2V0UGFyYW0oYXJndltpXSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChhcmd2W2ldWzBdID09ICctJyAmJiBpKzEgPCBhcmdjICYmCisgICAgICAgIENvbmZpZ3VyYXRpb246OnNldFBhcmFtKCZhcmd2W2ldWzFdLCBhcmd2W2krMV0pKSB7CisgICAgICBpKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBDaGFyQXJyYXkgZGlzcGxheW5hbWVTdHIoZGlzcGxheW5hbWUuZ2V0RGF0YSgpKTsKKyAgaWYgKCEoZHB5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lU3RyLmJ1ZikpKSB7CisgICAgZnByaW50ZihzdGRlcnIsIiVzOiB1bmFibGUgdG8gb3BlbiBkaXNwbGF5IFwiJXNcIlxuIiwKKyAgICAgICAgICAgIHByb2dyYW1OYW1lLCBYRGlzcGxheU5hbWUoZGlzcGxheW5hbWVTdHIuYnVmKSk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIGlmICghWFZuY0V4dFF1ZXJ5RXh0ZW5zaW9uKGRweSwgJnZuY0V4dEV2ZW50QmFzZSwgJnZuY0V4dEVycm9yQmFzZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiTm8gVk5DIGV4dGVuc2lvbiBvbiBkaXNwbGF5ICVzXG4iLAorICAgICAgICAgICAgWERpc3BsYXlOYW1lKGRpc3BsYXluYW1lU3RyLmJ1ZikpOworICAgIGV4aXQoMSk7CisgIH0KKworICBpZiAoaSA8IGFyZ2MpIHsKKyAgICBmb3IgKDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWNvbm5lY3QiKSA9PSAwKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKGkgPj0gYXJnYykgdXNhZ2UoKTsKKyAgICAgICAgaWYgKCFYVm5jRXh0Q29ubmVjdChkcHksIGFyZ3ZbaV0pKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsImNvbm5lY3RpbmcgdG8gJXMgZmFpbGVkXG4iLGFyZ3ZbaV0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWRpc2Nvbm5lY3QiKSA9PSAwKSB7CisgICAgICAgIGlmICghWFZuY0V4dENvbm5lY3QoZHB5LCAiIikpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZGlzY29ubmVjdGluZyBhbGwgY2xpZW50cyBmYWlsZWRcbiIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWdldCIpID09IDApIHsKKyAgICAgICAgaSsrOworICAgICAgICBpZiAoaSA+PSBhcmdjKSB1c2FnZSgpOworICAgICAgICBjaGFyKiBkYXRhOworICAgICAgICBpbnQgbGVuOworICAgICAgICBpZiAoWFZuY0V4dEdldFBhcmFtKGRweSwgYXJndltpXSwgJmRhdGEsICZsZW4pKSB7CisgICAgICAgICAgcHJpbnRmKCIlLipzXG4iLGxlbixkYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZ2V0dGluZyBwYXJhbSAlcyBmYWlsZWRcbiIsYXJndltpXSk7CisgICAgICAgIH0KKyAgICAgICAgWEZyZWUoZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWRlc2MiKSA9PSAwKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKGkgPj0gYXJnYykgdXNhZ2UoKTsKKyAgICAgICAgY2hhciogZGVzYyA9IFhWbmNFeHRHZXRQYXJhbURlc2MoZHB5LCBhcmd2W2ldKTsKKyAgICAgICAgaWYgKGRlc2MpIHsKKyAgICAgICAgICBwcmludGYoIiVzXG4iLGRlc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJnZXR0aW5nIGRlc2NyaXB0aW9uIGZvciBwYXJhbSAlcyBmYWlsZWRcbiIsYXJndltpXSk7CisgICAgICAgIH0KKyAgICAgICAgWEZyZWUoZGVzYyk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWxpc3QiKSA9PSAwKSB7CisgICAgICAgIGludCBuUGFyYW1zOworICAgICAgICBjaGFyKiogbGlzdCA9IFhWbmNFeHRMaXN0UGFyYW1zKGRweSwgJm5QYXJhbXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QYXJhbXM7IGkrKykgeworICAgICAgICAgIHByaW50ZigiJXNcbiIsbGlzdFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgWFZuY0V4dEZyZWVQYXJhbUxpc3QobGlzdCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLXNldCIpID09IDApIHsKKyAgICAgICAgaSsrOworICAgICAgICBpZiAoaSA+PSBhcmdjKSB1c2FnZSgpOworICAgICAgICBpZiAoIVhWbmNFeHRTZXRQYXJhbShkcHksIGFyZ3ZbaV0pKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsInNldHRpbmcgcGFyYW0gJXMgZmFpbGVkXG4iLGFyZ3ZbaV0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKFhWbmNFeHRTZXRQYXJhbShkcHksIGFyZ3ZbaV0pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJzZXQgcGFyYW1ldGVyICVzXG4iLGFyZ3ZbaV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdXNhZ2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHRyeSB7CisgICAgVFhXaW5kb3c6OmluaXQoZHB5LCJWbmNjb25maWciKTsKKworICAgIFZuY0NvbmZpZ1dpbmRvdyB3KGRweSk7CisgICAgaWYgKCFub1dpbmRvdykgdy5tYXAoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgIHN0cnVjdCB0aW1ldmFsKiB0dnAgPSAwOworCisgICAgICAvLyBQcm9jZXNzIGFueSBpbmNvbWluZyBYIGV2ZW50cworICAgICAgVFhXaW5kb3c6OmhhbmRsZVhFdmVudHMoZHB5KTsKKyAgICAgIAorICAgICAgLy8gUHJvY2VzcyBleHBpcmVkIHRpbWVycyBhbmQgZ2V0IHRoZSB0aW1lIHVudGlsIHRoZSBuZXh0IG9uZQorICAgICAgaW50IHRpbWVvdXRNcyA9IFRpbWVyOjpjaGVja1RpbWVvdXRzKCk7CisgICAgICBpZiAodGltZW91dE1zKSB7CisgICAgICAgIHR2LnR2X3NlYyA9IHRpbWVvdXRNcyAvIDEwMDA7CisgICAgICAgIHR2LnR2X3VzZWMgPSAodGltZW91dE1zICUgMTAwMCkgKiAxMDAwOworICAgICAgICB0dnAgPSAmdHY7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBYIHJlcXVlc3RzIHBlbmRpbmcgdGhlbiBwb2xsLCBkb24ndCB3YWl0IQorICAgICAgaWYgKFhQZW5kaW5nKGRweSkpIHsKKyAgICAgICAgdHYudHZfdXNlYyA9IHR2LnR2X3NlYyA9IDA7CisgICAgICAgIHR2cCA9ICZ0djsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gV2FpdCBmb3IgWCBldmVudHMsIFZOQyB0cmFmZmljLCBvciB0aGUgbmV4dCB0aW1lciBleHBpcnkKKyAgICAgIGZkX3NldCByZmRzOworICAgICAgRkRfWkVSTygmcmZkcyk7CisgICAgICBGRF9TRVQoQ29ubmVjdGlvbk51bWJlcihkcHkpLCAmcmZkcyk7CisgICAgICBpbnQgbiA9IHNlbGVjdChGRF9TRVRTSVpFLCAmcmZkcywgMCwgMCwgdHZwKTsKKyAgICAgIGlmIChuIDwgMCkgdGhyb3cgcmRyOjpTeXN0ZW1FeGNlcHRpb24oInNlbGVjdCIsZXJybm8pOworICAgIH0KKworICAgIFhDbG9zZURpc3BsYXkoZHB5KTsKKworICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiAmZSkgeworICAgIHZsb2cuZXJyb3IoZS5zdHIoKSk7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VuaXgvdm5jY29uZmlnL3ZuY2NvbmZpZy5tYW4gYi91bml4L3ZuY2NvbmZpZy92bmNjb25maWcubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDc1M2QKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY2NvbmZpZy92bmNjb25maWcubWFuCkBAIC0wLDAgKzEsMTI4IEBACisuVEggdm5jY29uZmlnIDEgIjE3IEFwciAyMDA2IiAiVGlnaHRWTkMiICJWaXJ0dWFsIE5ldHdvcmsgQ29tcHV0aW5nIgorLlNIIE5BTUUKK3ZuY2NvbmZpZyBcLSBjb25maWd1cmUgYW5kIGNvbnRyb2wgYSBWTkMgc2VydmVyCisuU0ggU1lOT1BTSVMKKy5CIHZuY2NvbmZpZworLlJJIFsgcGFyYW1ldGVycyBdIAorLmJyCisuQiB2bmNjb25maWcKKy5SSSBbIHBhcmFtZXRlcnMgXSAKKy5CIFwtY29ubmVjdAorLklSIGhvc3QgWzogcG9ydCBdCisuYnIKKy5CIHZuY2NvbmZpZworLlJJIFsgcGFyYW1ldGVycyBdIAorLkIgXC1kaXNjb25uZWN0CisuYnIKKy5CIHZuY2NvbmZpZworLlJJIFsgcGFyYW1ldGVycyBdIAorLlJCIFsgLXNldCBdIAorLklSIFh2bmMtcGFyYW0gPSB2YWx1ZSAiIC4uLiIKKy5icgorLkIgdm5jY29uZmlnCisuUkkgWyBwYXJhbWV0ZXJzIF0gCisuQiBcLWxpc3QKKy5icgorLkIgdm5jY29uZmlnCisuUkkgWyBwYXJhbWV0ZXJzIF0gCitcZkJcLWdldFxmUCBcZklYdm5jLXBhcmFtXGZQCisuYnIKKy5CIHZuY2NvbmZpZworLlJJIFsgcGFyYW1ldGVycyBdIAorXGZCXC1kZXNjXGZQIFxmSVh2bmMtcGFyYW1cZlAKKy5TSCBERVNDUklQVElPTgorLkIgdm5jY29uZmlnCitpcyB1c2VkIHRvIGNvbmZpZ3VyZSBhbmQgY29udHJvbCBhIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgWHZuYywgb3IgYW55IG90aGVyIFgKK3NlcnZlciB3aXRoIHRoZSBWTkMgZXh0ZW5zaW9uLiAgTm90ZSB0aGF0IGl0IGNhbm5vdCBiZSB1c2VkIHRvIGNvbnRyb2wgVk5DCitzZXJ2ZXJzIHByaW9yIHRvIHZlcnNpb24gNC4KKworV2hlbiBydW4gd2l0aCBubyBvcHRpb25zLCBpdCBydW5zIGFzIGEga2luZCBvZiAiaGVscGVyIiBhcHBsaWNhdGlvbiBmb3IgWHZuYy4KK0l0cyBtYWluIHB1cnBvc2Ugd2hlbiBydW4gaW4gdGhpcyBtb2RlIGlzIHRvIHN1cHBvcnQgY2xpcGJvYXJkIHRyYW5zZmVyIHRvIGFuZAorZnJvbSB0aGUgVk5DIHZpZXdlcihzKS4gIE5vdGUgdGhhdCB3aXRob3V0IGEgcnVubmluZyBpbnN0YW5jZSBvZgorXGZCdm5jY29uZmlnXGZQIHRoZXJlIHdpbGwgYmUgbm8gY2xpcGJvYXJkIHN1cHBvcnQuICBJdCBwdXRzIHVwIGEgd2luZG93IHdpdGgKK3NvbWUgY2hlY2tib3hlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGNsaXBib2FyZCB0cmFuc2ZlcnMgaWYgcmVxdWlyZWQKKyhpbiB0aGUgZnV0dXJlIHRoZXJlIG1heSBiZSBtb3JlIGZ1bmN0aW9ucyBhdmFpbGFibGUgZnJvbSB0aGlzIHdpbmRvdykuICBUaGUKK1xmQi1ub3dpblxmUCBmbGFnIGNhbiBiZSB1c2VkIGlmIHlvdSBhbHdheXMgd2FudCBjbGlwYm9hcmQgc3VwcG9ydCBidXQgZG9uJ3QKK3dpc2ggdG8gY2x1dHRlciB0aGUgZGVza3RvcCB3aXRoIHRoaXMgd2luZG93IC0gYWx0ZXJuYXRpdmVseSB0aGUgXGZCLWljb25pY1xmUAorb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG1ha2UgaXQgaWNvbmlmaWVkIGJ5IGRlZmF1bHQuCisKK1doZW4gcnVuIGluIGFueSBvdGhlciBtb2RlLCBcZkJ2bmNjb25maWdcZlAgaXMgYSBvbmUtc2hvdCBwcm9ncmFtIHVzZWQgdG8KK2NvbmZpZ3VyZSBvciBjb250cm9sIFh2bmMgYXMgYXBwcm9wcmlhdGUuICBJdCBjYW4gYmUgdXNlZCB0byB0ZWxsIFh2bmMgdG8KK2Nvbm5lY3Qgb3IgZGlzY29ubmVjdCBmcm9tIGxpc3RlbmluZyB2aWV3ZXJzLCBhbmQgdG8gc2V0IGFuZCByZXRyaWV2ZSBYdm5jJ3MKK3BhcmFtZXRlcnMuCisKK05vdGUgdGhhdCB0aGUgRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciB0aGUgXGZCXC1kaXNwbGF5XGZQIG9wdGlvbgorbXVzdCBiZSBzZXQgYXMgYXBwcm9wcmlhdGUgdG8gY29udHJvbCBYdm5jLiAgSWYgeW91IHJ1biBpdCBvbiBhbiBvcmRpbmFyeSBYCitzZXJ2ZXIgKG9yIG9uIGEgdmVyc2lvbiAzIFh2bmMpIHlvdSB3aWxsIGdldCBhbiBlcnJvciBtZXNzYWdlIHNheWluZyB0aGF0IHRoZXJlCitpcyBubyBWTkMgZXh0ZW5zaW9uLgorCisuU0ggT1BUSU9OUworLlRQCisuQiBcLWNvbm5lY3QgXGZJaG9zdFxmUFs6XGZJcG9ydFxmUF0KK1RlbGxzIGFuIFh2bmMgc2VydmVyIHRvIG1ha2UgYSAicmV2ZXJzZSIgY29ubmVjdGlvbiB0byBhIGxpc3RlbmluZyBWTkMgdmlld2VyCisobm9ybWFsbHkgY29ubmVjdGlvbnMgYXJlIG1hZGUgdGhlIG90aGVyIHdheSByb3VuZCAtIHRoZSB2aWV3ZXIgY29ubmVjdHMgdG8gdGhlCitzZXJ2ZXIpLiBcZklob3N0XGZQIGlzIHRoZSBob3N0IHdoZXJlIHRoZSBsaXN0ZW5pbmcgdmlld2VyIGlzIHJ1bm5pbmcuIElmIGl0J3MKK25vdCBsaXN0ZW5pbmcgb24gdGhlIGRlZmF1bHQgcG9ydCBvZiA1NTAwLCB5b3UgY2FuIHNwZWNpZnkgXGZJaG9zdDpwb3J0XGZQCitpbnN0ZWFkLgorCisuVFAKKy5CIFwtZGlzY29ubmVjdAorVGhpcyBjYXVzZXMgWHZuYyB0byBkaXNjb25uZWN0IGZyb20gYWxsIHZpZXdlcnMgc28gdGhhdCB0aGUgVk5DIGRlc2t0b3AgaXMgbm90CitkaXNwbGF5ZWQgYW55d2hlcmUuCisKKy5UUAorW1xmQi1zZXRcZlBdIFxmSVh2bmMtcGFyYW1cZlA9XGZJdmFsdWVcZlAKK1NldHMgYW4gWHZuYyBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIHZhbHVlLiAgTm90ZSB0aGF0IHNvbWUgb2YgWHZuYydzIHBhcmFtZXRlcnMKK2FyZSByZWFkIG9ubHkgb25jZSBhdCBzdGFydHVwIHNvIHRoYXQgY2hhbmdpbmcgdGhlbSBpbiB0aGlzIHdheSBtYXkgbm90IGhhdmUKK2FueSBlZmZlY3QuCisKKy5UUAorLkIgXC1saXN0CitMaXN0cyBhbGwgdGhlIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5IFh2bmMuCisKKy5UUAorLkIgXC1nZXQgXGZJWHZuYy1wYXJhbVxmUAorUHJpbnRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbiBYdm5jIHBhcmFtZXRlci4KKworLlRQCisuQiBcLWRlc2MgXGZJWHZuYy1wYXJhbVxmUAorUHJpbnRzIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIFh2bmMgcGFyYW1ldGVyLgorCisuU0ggUEFSQU1FVEVSUworLkIgdm5jY29uZmlnCithbHNvIGhhcyBwYXJhbWV0ZXJzIG9mIGl0cyBvd24gd2hpY2ggY2FuIGJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhlc2UKK3Nob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCBYdm5jJ3MgcGFyYW1ldGVycyB3aGljaCBhcmUgbWFuaXB1bGF0ZWQgd2l0aCB0aGUKK1xmQi1zZXRcZlAsIFxmQi1nZXRcZlAsIFxmQi1saXN0XGZQIGFuZCBcZkItZGVzY1xmUCBvcHRpb25zLgorCitQYXJhbWV0ZXJzIGNhbiBiZSB0dXJuZWQgb24gd2l0aCAtXGZJcGFyYW1cZlAgb3Igb2ZmIHdpdGggLVxmSXBhcmFtXGZQPTAuCitQYXJhbWV0ZXJzIHdoaWNoIHRha2UgYSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIC1cZklwYXJhbVxmUCBcZkl2YWx1ZVxmUC4KK090aGVyIHZhbGlkIGZvcm1zIGFyZSBcZklwYXJhbVxmUFxmQj1cZlBcZkl2YWx1ZVxmUCAtXGZJcGFyYW1cZlA9XGZJdmFsdWVcZlAKKy0tXGZJcGFyYW1cZlA9XGZJdmFsdWVcZlAuICBQYXJhbWV0ZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCisKKy5UUAorLkIgXC1kaXNwbGF5IFxmSVhkaXNwbGF5XGZQCitTcGVjaWZpZXMgdGhlIFh2bmMgc2VydmVyIHRvIGNvbnRyb2wuCisKKy5UUAorLkIgXC1ub3dpbgorV2hlbiBydW4gYXMgYSAiaGVscGVyIiBhcHAsIGRvbid0IHB1dCB1cCBhIHdpbmRvdy4KKworLlRQCisuQiBcLWljb25pYworV2hlbiBydW4gYXMgYSAiaGVscGVyIiBhcHAsIG1ha2UgdGhlIHdpbmRvdyBpY29uaWZpZWQgYXQgc3RhcnR1cC4KKworLlNIIFNFRSBBTFNPCisuQlIgdm5jcGFzc3dkICgxKSwKKy5CUiB2bmN2aWV3ZXIgKDEpLAorLkJSIHZuY3NlcnZlciAoMSksCisuQlIgWHZuYyAoMSkKKy5icgoraHR0cDovL3d3dy50aWdodHZuYy5jb20KKworLlNIIEFVVEhPUgorVHJpc3RhbiBSaWNoYXJkc29uLCBSZWFsVk5DIEx0ZC4KKworVk5DIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSB0aGUgUmVhbFZOQyB0ZWFtIHdoaWxlIGF0IE9saXZldHRpCitSZXNlYXJjaCBMdGQgLyBBVCZUIExhYm9yYXRvcmllcyBDYW1icmlkZ2UuICBUaWdodFZOQyBhZGRpdGlvbnMgd2FzCitpbXBsZW1lbnRlZCBieSBDb25zdGFudGluIEthcGxpbnNreS4gTWFueSBvdGhlciBwZW9wbGUgcGFydGljaXBhdGVkIGluCitkZXZlbG9wbWVudCwgdGVzdGluZyBhbmQgc3VwcG9ydC4KZGlmZiAtLWdpdCBhL3VuaXgvdm5jaW5zdGFsbCBiL3VuaXgvdm5jaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDVkZDgzCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNpbnN0YWxsCkBAIC0wLDAgKzEsOTcgQEAKKyMhL2Jpbi9zaAorIworIyAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuCisjCisjICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorIyAgVVNBLgorIworCisjCisjIHZuY2luc3RhbGwgLSBjb3B5IHRoZSBWTkMgcHJvZ3JhbXMgdG8gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKyMgQWxzbyB0cmllcyB0byBpbnN0YWxsIHRoZSBtYW51YWwgcGFnZXMgc29tZXdoZXJlIHNlbnNpYmxlLgorIworCitpZiBbICQjIC1sdCAxIC1vICQjIC1ndCAzIC1vICEgLWQgIiQxIiBdOyB0aGVuIAorICBlY2hvICJ1c2FnZTogJDAgPGluc3RhbGxhdGlvbi1kaXJlY3Rvcnk+IFs8bWFuLXBhZ2UtZGlyZWN0b3J5Pl0gWzxtb2R1bGUtZGlyZWN0b3J5Pl0iCisgIGVjaG8gImUuZy4gICAkMCAvdXNyL2xvY2FsL2JpbiIKKyAgZXhpdCAxCitmaQorCitkc3Q9JDEKK3NoaWZ0CitpZiBbICQjIC1ndCAwIF07IHRoZW4KKyAgbWFuZHN0PSIkMS9tYW4xIgorICBzaGlmdAorICBpZiBbICQjIC1ndCAwIF07IHRoZW4KKyAgICBtb2R1bGVkc3Q9JDEKKyAgICBzaGlmdAorICBlbHNlCisgICAgbW9kdWxlZHN0PS91c3IvWDExUjYvbGliL21vZHVsZXMvZXh0ZW5zaW9ucworICBmaQorZWxzZQorICBpZiBbICJgYmFzZW5hbWUgJGRzdGAiID0gYmluIF07IHRoZW4KKyAgICBtYW5kc3Q9ImBkaXJuYW1lICRkc3RgL21hbi9tYW4xIgorICAgIGlmIFsgISAtZCAiJG1hbmRzdCIgLWEgIiRkc3QiID0gL3Vzci9iaW4gXTsgdGhlbgorICAgICAgbWFuZHN0PS91c3Ivc2hhcmUvbWFuL21hbjEKKyAgICBmaQorICBmaQorZmkKKworaWYgWyAiJG1hbmRzdCIgIT0gIiIgXTsgdGhlbgorICBpZiBbICEgLWQgIiRtYW5kc3QiIC1vICEgLXcgIiRtYW5kc3QiIF07IHRoZW4KKyAgICBlY2hvICJDYW4ndCBpbnN0YWxsIG1hbnVhbCBwYWdlcyB0byAkbWFuZHN0IgorICAgIG1hbmRzdD0iIgorICBmaQorZmkKKworZm9yIGYgaW4geGMvcHJvZ3JhbXMvWHNlcnZlci9Ydm5jIHZuY3ZpZXdlci92bmN2aWV3ZXIgdm5jcGFzc3dkL3ZuY3Bhc3N3ZCBcCisJIHZuY2NvbmZpZy92bmNjb25maWcgdm5jc2VydmVyIHgwdm5jc2VydmVyL3gwdm5jc2VydmVyOyBkbworICBpZiBbICEgLWYgJGYgXTsgdGhlbgorICAgIGVjaG8gIkNvdWxkbid0IGZpbmQgJGYiCisgIGVsc2UKKyAgICBpZiBjbXAgLXMgJGYgJGRzdC9gYmFzZW5hbWUgJGZgOyB0aGVuCisgICAgICBlY2hvICJgYmFzZW5hbWUgJGZgIGhhc24ndCBjaGFuZ2VkIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIkNvcHlpbmcgJGYgdG8gJGRzdCIKKyAgICAgIGNwIC1wZiAkZiAkZHN0CisgICAgICBjaG1vZCAwNTU1ICRkc3QvYGJhc2VuYW1lICRmYAorICAgIGZpCisKKworICAgIGlmIFsgLWYgJGYubWFuIF07IHRoZW4KKyAgICAgIGlmIFsgIiRtYW5kc3QiICE9ICIiIC1hIC1kICIkbWFuZHN0IiBdOyB0aGVuCisgICAgICAgIGlmIGNtcCAtcyAkZi5tYW4gJG1hbmRzdC9gYmFzZW5hbWUgJGYuMWA7IHRoZW4KKyAgICAgICAgICBlY2hvICJgYmFzZW5hbWUgJGYubWFuYCBoYXNuJ3QgY2hhbmdlZCIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIkNvcHlpbmcgJGYubWFuIHRvICRtYW5kc3QvYGJhc2VuYW1lICRmLjFgIgorICAgICAgICAgIGNwIC1wZiAkZi5tYW4gJG1hbmRzdC9gYmFzZW5hbWUgJGYuMWAKKyAgICAgICAgICBjaG1vZCAwNDQ0ICRtYW5kc3QvYGJhc2VuYW1lICRmLjFgCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGZpCisgIGZpCisKK2RvbmUKKwordm5jTW9kdWxlPXhjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL21vZHVsZS92bmMuc28KK2lmIFsgLWYgIiR2bmNNb2R1bGUiIC1hIC1kICIkbW9kdWxlZHN0IiBdOyB0aGVuCisgIGlmIGNtcCAtcyAkdm5jTW9kdWxlICRtb2R1bGVkc3QvYGJhc2VuYW1lICR2bmNNb2R1bGVgOyB0aGVuCisgICAgZWNobyAiYGJhc2VuYW1lICR2bmNNb2R1bGVgIGhhc24ndCBjaGFuZ2VkIgorICBlbHNlCisgICAgZWNobyAiQ29weWluZyAkdm5jTW9kdWxlIHRvICRtb2R1bGVkc3QiCisgICAgY3AgLXBmICR2bmNNb2R1bGUgJG1vZHVsZWRzdAorICAgIGNobW9kIDA1NTUgJG1vZHVsZWRzdC9gYmFzZW5hbWUgJHZuY01vZHVsZWAKKyAgZmkKK2ZpCmRpZmYgLS1naXQgYS91bml4L3ZuY21rZGVwZW5kL01ha2VmaWxlIGIvdW5peC92bmNta2RlcGVuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjc4MzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNta2RlcGVuZC9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK1NSQ1MgPSBpbmNsdWRlLmMgbWFpbi5jIHBhcnNlLmMgcHIuYyBjcHBzZXR1cC5jIGlmcGFyc2VyLmMKK09CSlMgPSAkKFNSQ1M6LmM9Lm8pCit2bmNta2RlcGVuZDogJChPQkpTKQorCSQoQ0MpICReIC1vICRACmRpZmYgLS1naXQgYS91bml4L3ZuY21rZGVwZW5kL1JFQURNRSBiL3VuaXgvdm5jbWtkZXBlbmQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGI2MmMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY21rZGVwZW5kL1JFQURNRQpAQCAtMCwwICsxLDM5IEBACit2bmNta2RlcGVuZAorPT09PT09PT09PT0KKworVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFgxMVI2IG1ha2VkZXBlbmQgc291cmNlcy4gIEFsbCBJIGhhdmUgZG9uZSBpczoKKworICogUmVtb3ZlIGFsbCBwcmVkZWZpbmVkIHN5bWJvbHMsIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIG90aGVyCisgICBwbGF0Zm9ybS1zcGVjaWZpYyBiZWhhdmlvdXIuICBJdHMgYmVoYXZpb3VyIHNob3VsZCBiZSB0aGUgc2FtZSBvbiBhbGwKKyAgIHBsYXRmb3Jtcy4gIEFsbCBzeW1ib2xzIGFuZCBpbmNsdWRlIGRpcmVjdG9yaWVzIG11c3QgYmUgZXhwbGljaXRseSBnaXZlbiBvbgorICAgdGhlIGNvbW1hbmQgbGluZSB3aXRoIC1EIGFuZCAtSSBmbGFncy4KKyAqIEZpeCBwcm9jZXNzaW5nIG9mIG51bWJlcnMgaW4gI2lmIGV4cHJlc3Npb25zLgorICogRml4IHByb2Nlc3Npbmcgb2YgLUQgZmxhZy4KKyAqIEZpeCBDKysgY29tbWVudCBoYW5kbGluZy4KKyAqIEltcHJvdmUgI2Vycm9yIHdhcm5pbmdzLgorICogQ2hhbmdlIHRoZSBvdXRwdXQgc28gdGhhdCBwcm9jZXNzaW5nIDxuYW1lPi48c3VmZml4PiBwcm9kdWNlcyA8bmFtZT4uZAorCitUaGUgY29weXJpZ2h0IG9uIHRoZSBjb2RlIGlzOgorCitDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQgIFggQ29uc29ydGl1bQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK1ggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29ydGl1bS4KZGlmZiAtLWdpdCBhL3VuaXgvdm5jbWtkZXBlbmQvY3Bwc2V0dXAuYyBiL3VuaXgvdm5jbWtkZXBlbmQvY3Bwc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjFjNGZjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNta2RlcGVuZC9jcHBzZXR1cC5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiAkWENvbnNvcnRpdW06IGNwcHNldHVwLmMsdiAxLjEzIDk0LzA0LzE3IDIwOjEwOjMyIGdpbGRlYSBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0ICBYIENvbnNvcnRpdW0KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvcnRpdW0uCisKKyovCisKKyNpbmNsdWRlICJkZWYuaCIKKworI2lmZGVmCUNQUAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdHJpY3RseSBmb3IgdGhlIHNha2Ugb2YgY3B5LnkgYW5kIHl5bGV4LmMgKGlmCisgKiB5b3UgaW5kZWVkIGhhdmUgdGhlIHNvdXJjZSBmb3IgY3BwKS4KKyAqLworI2RlZmluZSBJQiAxCisjZGVmaW5lIFNCIDIKKyNkZWZpbmUgTkIgNAorI2RlZmluZSBDQiA4CisjZGVmaW5lIFFCIDE2CisjZGVmaW5lIFdCIDMyCisjZGVmaW5lIFNBTFQgJyMnCisjaWYgcGRwMTEgfCB2YXggfCBuczE2MDAwIHwgbWM2ODAwMCB8IGlibTAzMgorI2RlZmluZSBDT0ZGIDEyOAorI2Vsc2UKKyNkZWZpbmUgQ09GRiAwCisjZW5kaWYKKy8qCisgKiBUaGVzZSB2YXJpYWJsZXMgdXNlZCBieSBjcHkueSBhbmQgeXlsZXguYworICovCitleHRlcm4gY2hhcgkqb3V0cCwgKmlucCwgKm5ld3AsICpwZW5kOworZXh0ZXJuIGNoYXIJKnB0cnRhYjsKK2V4dGVybiBjaGFyCWZhc3RhYltdOworZXh0ZXJuIGNoYXIJc2xvdGFiW107CisKKy8qCisgKiBjcHBzZXR1cAorICovCitzdHJ1Y3QgZmlsZXBvaW50ZXIJKmN1cnJlbnRmaWxlOworc3RydWN0IGluY2xpc3QJCSpjdXJyZW50aW5jOworCitjcHBzZXR1cChsaW5lLCBmaWxlcCwgaW5jKQorCXJlZ2lzdGVyIGNoYXIJKmxpbmU7CisJcmVnaXN0ZXIgc3RydWN0IGZpbGVwb2ludGVyCSpmaWxlcDsKKwlyZWdpc3RlciBzdHJ1Y3QgaW5jbGlzdAkJKmluYzsKK3sKKwlyZWdpc3RlciBjaGFyICpwLCBzYXZlYzsKKwlzdGF0aWMgYm9vbGVhbiBzZXR1cGRvbmUgPSBGQUxTRTsKKwlib29sZWFuCXZhbHVlOworCisJaWYgKCFzZXR1cGRvbmUpIHsKKwkJY3BwX3ZhcnNldHVwKCk7CisJCXNldHVwZG9uZSA9IFRSVUU7CisJfQorCisJY3VycmVudGZpbGUgPSBmaWxlcDsKKwljdXJyZW50aW5jID0gaW5jOworCWlucCA9IG5ld3AgPSBsaW5lOworCWZvciAocD1uZXdwOyAqcDsgcCsrKQorCQk7CisKKwkvKgorCSAqIHB1dCBhIG5ld2xpbmUgYmFjayBvbiB0aGUgZW5kLCBhbmQgc2V0IHVwIHBlbmQsIGV0Yy4KKwkgKi8KKwkqcCsrID0gJ1xuJzsKKwlzYXZlYyA9ICpwOworCSpwID0gJ1wwJzsKKwlwZW5kID0gcDsKKworCXB0cnRhYiA9IHNsb3RhYitDT0ZGOworCSotLWlucCA9IFNBTFQ7IAorCW91dHA9aW5wOyAKKwl2YWx1ZSA9IHl5cGFyc2UoKTsKKwkqcCA9IHNhdmVjOworCXJldHVybih2YWx1ZSk7Cit9CisKK3N0cnVjdCBzeW10YWIgKmxvb2t1cChzeW1ib2wpCisJY2hhcgkqc3ltYm9sOworeworCXN0YXRpYyBzdHJ1Y3Qgc3ltdGFiICAgIHVuZGVmaW5lZDsKKwlzdHJ1Y3Qgc3ltdGFiICAgKnNwOworCisJc3AgPSBpc2RlZmluZWQoc3ltYm9sLCBjdXJyZW50aW5jLCBOVUxMKTsKKwlpZiAoc3AgPT0gTlVMTCkgeworCQlzcCA9ICZ1bmRlZmluZWQ7CisJCXNwLT5zX3ZhbHVlID0gTlVMTDsKKwl9CisJcmV0dXJuIChzcCk7Cit9CisKK3BwZXJyb3IodGFnLCB4MCx4MSx4Mix4Myx4NCkKKwlpbnQJdGFnLHgwLHgxLHgyLHgzLHg0OworeworCXdhcm5pbmcoIlwiJXNcIiwgbGluZSAlZDogIiwgY3VycmVudGluYy0+aV9maWxlLCBjdXJyZW50ZmlsZS0+Zl9saW5lKTsKKwl3YXJuaW5nKHgwLHgxLHgyLHgzLHg0KTsKK30KKworCit5eWVycm9yKHMpCisJcmVnaXN0ZXIgY2hhcgkqczsKK3sKKwlmYXRhbGVycigiRmF0YWwgZXJyb3I6ICVzXG4iLCBzKTsKK30KKyNlbHNlIC8qIG5vdCBDUFAgKi8KKworI2luY2x1ZGUgImlmcGFyc2VyLmgiCitzdHJ1Y3QgX3BhcnNlX2RhdGEgeworICAgIHN0cnVjdCBmaWxlcG9pbnRlciAqZmlsZXA7CisgICAgc3RydWN0IGluY2xpc3QgKmluYzsKKyAgICBjb25zdCBjaGFyICpsaW5lOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKgorX215X2lmX2Vycm9ycyAoaXAsIGNwLCBleHBlY3RpbmcpCisgICAgSWZQYXJzZXIgKmlwOworICAgIGNvbnN0IGNoYXIgKmNwOworICAgIGNvbnN0IGNoYXIgKmV4cGVjdGluZzsKK3sKKyAgICBzdHJ1Y3QgX3BhcnNlX2RhdGEgKnBkID0gKHN0cnVjdCBfcGFyc2VfZGF0YSAqKSBpcC0+ZGF0YTsKKyAgICBpbnQgbGluZW5vID0gcGQtPmZpbGVwLT5mX2xpbmU7CisgICAgY2hhciAqZmlsZW5hbWUgPSBwZC0+aW5jLT5pX2ZpbGU7CisgICAgY2hhciBwcmVmaXhbMzAwXTsKKyAgICBpbnQgcHJlZml4bGVuOworICAgIGludCBpOworCisgICAgc3ByaW50ZiAocHJlZml4LCAiXCIlc1wiOiVkIiwgZmlsZW5hbWUsIGxpbmVubyk7CisgICAgcHJlZml4bGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICAlcyIsIHByZWZpeCwgcGQtPmxpbmUpOworICAgIGkgPSBjcCAtIHBkLT5saW5lOworICAgIGlmIChpID4gMCAmJiBwZC0+bGluZVtpLTFdICE9ICdcbicpIHsKKwlwdXRjICgnXG4nLCBzdGRlcnIpOworICAgIH0KKyAgICBmb3IgKGkgKz0gcHJlZml4bGVuICsgMzsgaSA+IDA7IGktLSkgeworCXB1dGMgKCcgJywgc3RkZXJyKTsKKyAgICB9CisgICAgZnByaW50ZiAoc3RkZXJyLCAiXi0tLSBleHBlY3RpbmcgJXNcbiIsIGV4cGVjdGluZyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworI2RlZmluZSBNQVhOQU1FTEVOIDI1NgorCitzdGF0aWMgc3RydWN0IHN5bXRhYiAqCitfbG9va3VwX3ZhcmlhYmxlIChpcCwgdmFyLCBsZW4pCisgICAgSWZQYXJzZXIgKmlwOworICAgIGNvbnN0IGNoYXIgKnZhcjsKKyAgICBpbnQgbGVuOworeworICAgIGNoYXIgdG1wYnVmW01BWE5BTUVMRU4gKyAxXTsKKyAgICBzdHJ1Y3QgX3BhcnNlX2RhdGEgKnBkID0gKHN0cnVjdCBfcGFyc2VfZGF0YSAqKSBpcC0+ZGF0YTsKKworICAgIGlmIChsZW4gPiBNQVhOQU1FTEVOKQorCXJldHVybiAwOworCisgICAgc3RybmNweSAodG1wYnVmLCB2YXIsIGxlbik7CisgICAgdG1wYnVmW2xlbl0gPSAnXDAnOworICAgIHJldHVybiBpc2RlZmluZWQgKHRtcGJ1ZiwgcGQtPmluYywgTlVMTCk7Cit9CisKKworc3RhdGljIGludAorX215X2V2YWxfZGVmaW5lZCAoaXAsIHZhciwgbGVuKQorICAgIElmUGFyc2VyICppcDsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgaW50IGxlbjsKK3sKKyAgICBpZiAoX2xvb2t1cF92YXJpYWJsZSAoaXAsIHZhciwgbGVuKSkKKwlyZXR1cm4gMTsKKyAgICBlbHNlCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgaXN2YXJmaXJzdGxldHRlcihjY2MpIChpc2FscGhhKGNjYykgfHwgKGNjYykgPT0gJ18nKQorCitzdGF0aWMgaW50CitfbXlfZXZhbF92YXJpYWJsZSAoaXAsIHZhciwgbGVuKQorICAgIElmUGFyc2VyICppcDsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgaW50IGxlbjsKK3sKKyAgICBzdHJ1Y3Qgc3ltdGFiICpzOworCisgICAgcyA9IF9sb29rdXBfdmFyaWFibGUgKGlwLCB2YXIsIGxlbik7CisgICAgaWYgKCFzKQorCXJldHVybiAwOworICAgIGRvIHsKKwl2YXIgPSBzLT5zX3ZhbHVlOworCWlmICghaXN2YXJmaXJzdGxldHRlcigqdmFyKSkKKwkgICAgYnJlYWs7CisJcyA9IF9sb29rdXBfdmFyaWFibGUgKGlwLCB2YXIsIHN0cmxlbih2YXIpKTsKKyAgICB9IHdoaWxlIChzKTsKKworICAgIHJldHVybiBhdG9pKHZhcik7Cit9CisKKworY3Bwc2V0dXAobGluZSwgZmlsZXAsIGluYykKKwlyZWdpc3RlciBjaGFyCSpsaW5lOworCXJlZ2lzdGVyIHN0cnVjdCBmaWxlcG9pbnRlcgkqZmlsZXA7CisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QJCSppbmM7Cit7CisgICAgSWZQYXJzZXIgaXA7CisgICAgc3RydWN0IF9wYXJzZV9kYXRhIHBkOworICAgIGludCB2YWwgPSAwOworCisgICAgcGQuZmlsZXAgPSBmaWxlcDsKKyAgICBwZC5pbmMgPSBpbmM7CisgICAgcGQubGluZSA9IGxpbmU7CisgICAgaXAuZnVuY3MuaGFuZGxlX2Vycm9yID0gX215X2lmX2Vycm9yczsKKyAgICBpcC5mdW5jcy5ldmFsX2RlZmluZWQgPSBfbXlfZXZhbF9kZWZpbmVkOworICAgIGlwLmZ1bmNzLmV2YWxfdmFyaWFibGUgPSBfbXlfZXZhbF92YXJpYWJsZTsKKyAgICBpcC5kYXRhID0gKGNoYXIgKikgJnBkOworCisgICAgKHZvaWQpIFBhcnNlSWZFeHByZXNzaW9uICgmaXAsIGxpbmUsICZ2YWwpOworICAgIGlmICh2YWwpCisJcmV0dXJuIElGOworICAgIGVsc2UKKwlyZXR1cm4gSUZGQUxTRTsKK30KKyNlbmRpZiAvKiBDUFAgKi8KKwpkaWZmIC0tZ2l0IGEvdW5peC92bmNta2RlcGVuZC9kZWYuaCBiL3VuaXgvdm5jbWtkZXBlbmQvZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiNGMyMwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jbWtkZXBlbmQvZGVmLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qICRYQ29uc29ydGl1bTogZGVmLmgsdiAxLjI1IDk0LzA0LzE3IDIwOjEwOjMzIGdpbGRlYSBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0ICBYIENvbnNvcnRpdW0KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvcnRpdW0uCisKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZuZGVmIFhfTk9UX1BPU0lYCisjaWZuZGVmIF9QT1NJWF9TT1VSQ0UKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNkZWZpbmUgTUFYREVGSU5FUwk1MTIKKyNkZWZpbmUgTUFYRklMRVMJNTEyCisjZGVmaW5lIE1BWERJUlMJCTY0CisjZGVmaW5lIFNZTVRBQklOQwkxMAkvKiBtdXN0IGJlID4gMSBmb3IgZGVmaW5lKCkgdG8gd29yayByaWdodCAqLworI2RlZmluZQlUUlVFCQkxCisjZGVmaW5lCUZBTFNFCQkwCisKKy8qIHRoZSBmb2xsb3dpbmcgbXVzdCBtYXRjaCB0aGUgZGlyZWN0aXZlcyB0YWJsZSBpbiBtYWluLmMgKi8KKyNkZWZpbmUJSUYJCTAKKyNkZWZpbmUJSUZERUYJCTEKKyNkZWZpbmUJSUZOREVGCQkyCisjZGVmaW5lCUVMU0UJCTMKKyNkZWZpbmUJRU5ESUYJCTQKKyNkZWZpbmUJREVGSU5FCQk1CisjZGVmaW5lCVVOREVGCQk2CisjZGVmaW5lCUlOQ0xVREUJCTcKKyNkZWZpbmUJTElORQkJOAorI2RlZmluZQlQUkFHTUEJCTkKKyNkZWZpbmUgRVJST1IgICAgICAgICAgIDEwCisjZGVmaW5lIElERU5UICAgICAgICAgICAxMQorI2RlZmluZSBTQ0NTICAgICAgICAgICAgMTIKKyNkZWZpbmUgRUxJRiAgICAgICAgICAgIDEzCisjZGVmaW5lIEVKRUNUICAgICAgICAgICAxNAorI2RlZmluZSBJRkZBTFNFICAgICAgICAgMTUgICAgIC8qIHBzZXVkbyB2YWx1ZSAtLS0gbmV2ZXIgbWF0Y2hlZCAqLworI2RlZmluZSBFTElGRkFMU0UgICAgICAgMTYgICAgIC8qIHBzZXVkbyB2YWx1ZSAtLS0gbmV2ZXIgbWF0Y2hlZCAqLworI2RlZmluZSBJTkNMVURFRE9UICAgICAgMTcgICAgIC8qIHBzZXVkbyB2YWx1ZSAtLS0gbmV2ZXIgbWF0Y2hlZCAqLworI2RlZmluZSBJRkdVRVNTRkFMU0UgICAgMTggICAgIC8qIHBzZXVkbyB2YWx1ZSAtLS0gbmV2ZXIgbWF0Y2hlZCAqLworI2RlZmluZSBFTElGR1VFU1NGQUxTRSAgMTkgICAgIC8qIHBzZXVkbyB2YWx1ZSAtLS0gbmV2ZXIgbWF0Y2hlZCAqLworCisjaWZkZWYgREVCVUcKK2V4dGVybiBpbnQJX2RlYnVnbWFzazsKKy8qCisgKiBkZWJ1ZyBsZXZlbHMgYXJlOgorICogCisgKiAgICAgMAlzaG93IGlmbiooZGVmKSosZW5kaWYKKyAqICAgICAxCXRyYWNlIGRlZmluZWQvIWRlZmluZWQKKyAqICAgICAyCXNob3cgI2luY2x1ZGUKKyAqICAgICAzCXNob3cgI2luY2x1ZGUgU1lNQk9MCisgKiAgICAgNC02CXVudXNlZAorICovCisjZGVmaW5lIGRlYnVnKGxldmVsLGFyZykgeyBpZiAoX2RlYnVnbWFzayAmICgxIDw8IGxldmVsKSkgd2FybmluZyBhcmc7IH0KKyNlbHNlCisjZGVmaW5lCWRlYnVnKGxldmVsLGFyZykgLyoqLworI2VuZGlmIC8qIERFQlVHICovCisKK3R5cGVkZWYJdW5zaWduZWQgY2hhciBib29sZWFuOworCitzdHJ1Y3Qgc3ltdGFiIHsKKwljaGFyCSpzX25hbWU7CisJY2hhcgkqc192YWx1ZTsKK307CisKK3N0cnVjdAlpbmNsaXN0IHsKKwljaGFyCQkqaV9pbmNzdHJpbmc7CS8qIHN0cmluZyBmcm9tICNpbmNsdWRlIGxpbmUgKi8KKwljaGFyCQkqaV9maWxlOwkvKiBwYXRoIG5hbWUgb2YgdGhlIGluY2x1ZGUgZmlsZSAqLworCXN0cnVjdCBpbmNsaXN0CSoqaV9saXN0OwkvKiBsaXN0IG9mIGZpbGVzIGl0IGl0c2VsZiBpbmNsdWRlcyAqLworCWludAkJaV9saXN0bGVuOwkvKiBsZW5ndGggb2YgaV9saXN0ICovCisJc3RydWN0IHN5bXRhYgkqaV9kZWZzOwkvKiBzeW1ib2wgdGFibGUgZm9yIHRoaXMgZmlsZSAqLworCWludAkJaV9uZGVmczsJLyogY3VycmVudCAjIGRlZmluZXMgKi8KKwlpbnQJCWlfZGVmbGVuOwkvKiBhbW91bnQgb2Ygc3BhY2UgaW4gdGFibGUgKi8KKwlib29sZWFuCQlpX2RlZmNoZWNrZWQ7CS8qIHdoZXRoZXIgZGVmaW5lcyBoYXZlIGJlZW4gY2hlY2tlZCAqLworCWJvb2xlYW4JCWlfbm90aWZpZWQ7CS8qIHdoZXRoZXIgd2UgaGF2ZSByZXZlYWxlZCBpbmNsdWRlcyAqLworCWJvb2xlYW4JCWlfbWFya2VkOwkvKiB3aGV0aGVyIGl0J3MgaW4gdGhlIG1ha2VmaWxlICovCisJYm9vbGVhbgkJaV9zZWFyY2hlZDsJLyogd2hldGhlciB3ZSBoYXZlIHJlYWQgdGhpcyAqLworCWJvb2xlYW4gICAgICAgICBpX2luY2x1ZGVkX3N5bTsgLyogd2hldGhlciAjaW5jbHVkZSBTWU1CT0wgd2FzIGZvdW5kICovCisJCQkJCS8qIENhbid0IHVzZSBpX2xpc3QgaWYgVFJVRSAqLworfTsKKworc3RydWN0IGZpbGVwb2ludGVyIHsKKwljaGFyCSpmX3A7CisJY2hhcgkqZl9iYXNlOworCWNoYXIJKmZfZW5kOworCWxvbmcJZl9sZW47CisJbG9uZwlmX2xpbmU7Cit9OworCisjaWZuZGVmIFhfTk9UX1NURENfRU5WCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgZGVmaW5lZChtYWNJSSkgJiYgIWRlZmluZWQoX19TVERDX18pICAvKiBzdGRsaWIuaCBmYWlscyB0byBkZWZpbmUgdGhlc2UgKi8KK2NoYXIgKm1hbGxvYygpLCAqcmVhbGxvYygpOworI2VuZGlmIC8qIG1hY0lJICovCisjZWxzZQorY2hhcgkJCSptYWxsb2MoKTsKK2NoYXIJCQkqcmVhbGxvYygpOworI2VuZGlmCisKK2NoYXIJCQkqY29weSgpOworY2hhcgkJCSpiYXNlX25hbWUoKTsKK2NoYXIJCQkqZ2V0bGluZSgpOworc3RydWN0IHN5bXRhYgkJKnNsb29rdXAoKTsKK3N0cnVjdCBzeW10YWIJCSppc2RlZmluZWQoKTsKK3N0cnVjdCBzeW10YWIJCSpmZGVmaW5lZCgpOworc3RydWN0IGZpbGVwb2ludGVyCSpnZXRmaWxlKCk7CitzdHJ1Y3QgaW5jbGlzdAkJKm5ld2luY2x1ZGUoKTsKK3N0cnVjdCBpbmNsaXN0CQkqaW5jX3BhdGgoKTsKKworI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcworZXh0ZXJuIGZhdGFsZXJyKGNoYXIgKiwgLi4uKTsKK2V4dGVybiB3YXJuaW5nKGNoYXIgKiwgLi4uKTsKK2V4dGVybiB3YXJuaW5nMShjaGFyICosIC4uLik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdm5jbWtkZXBlbmQvaWZwYXJzZXIuYyBiL3VuaXgvdm5jbWtkZXBlbmQvaWZwYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDc0MGJjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNta2RlcGVuZC9pZnBhcnNlci5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogJFhDb25zb3J0aXVtOiBpZnBhcnNlci5jLHYgMS43IDk0LzAxLzE4IDIxOjMwOjUwIHJ3cyBFeHAgJAorICoKKyAqIENvcHlyaWdodCAxOTkyIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCisgKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcyBtYXkgbm90IGJlCisgKiB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMgbWFrZXMKKyAqIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisgKiBJdCBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKiAKKyAqIE5FVFdPUksgQ09NUFVUSU5HIERFVklDRVMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKKyAqIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBORVRXT1JLIENPTVBVVElORyBERVZJQ0VTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCisgKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQorICogTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKiAKKyAqIEF1dGhvcjogIEppbSBGdWx0b24KKyAqICAgICAgICAgIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqIAorICogU2ltcGxlIGlmIHN0YXRlbWVudCBwcm9jZXNzb3IKKyAqCisgKiBUaGlzIG1vZHVsZSBjYW4gYmUgdXNlZCB0byBldmFsdWF0ZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIEMgbGFuZ3VhZ2UKKyAqIGlmIGNvbnN0cnVjdHMuICBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKyAqIAorICogICAgIEVYUFJFU1NJT04JOj0JVkFMVUUKKyAqIAkJCSB8CVZBTFVFICBCSU5PUAlFWFBSRVNTSU9OCisgKiAKKyAqICAgICBWQUxVRQkJOj0JJygnICBFWFBSRVNTSU9OICAnKScKKyAqIAkJCSB8CSchJyAgVkFMVUUKKyAqIAkJCSB8CSctJyAgVkFMVUUKKyAqIAkJCSB8CSdkZWZpbmVkJyAgJygnICB2YXJpYWJsZSAgJyknCisgKiAJCQkgfAknZGVmaW5lZCcgIHZhcmlhYmxlCisgKgkJCSB8CSMgdmFyaWFibGUgJygnIHZhcmlhYmxlLWxpc3QgJyknCisgKiAJCQkgfAl2YXJpYWJsZQorICogCQkJIHwJbnVtYmVyCisgKiAKKyAqICAgICBCSU5PUAkJOj0JJyonCXwgICcvJwl8ICAnJScKKyAqIAkJCSB8CScrJwl8ICAnLScKKyAqIAkJCSB8CSc8PCcJfCAgJz4+JworICogCQkJIHwJJzwnCXwgICc+Jwl8ICAnPD0nICB8ICAnPj0nCisgKiAJCQkgfAknPT0nCXwgICchPScKKyAqIAkJCSB8CScmJwl8ICAnfCcKKyAqIAkJCSB8CScmJicJfCAgJ3x8JworICogCisgKiBUaGUgbm9ybWFsIEMgb3JkZXIgb2YgcHJlY2lkZW5jZSBpcyBzdXBwb3J0ZWQuCisgKiAKKyAqIAorICogRXh0ZXJuYWwgRW50cnkgUG9pbnRzOgorICogCisgKiAgICAgUGFyc2VJZkV4cHJlc3Npb24JCXBhcnNlIGEgc3RyaW5nIGZvciAjaWYKKyAqLworCisjaW5jbHVkZSAiaWZwYXJzZXIuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkgICBJbnRlcm5hbCBNYWNyb3MgYW5kIFV0aWxpdGllcyBmb3IgUGFyc2VyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBETyh2YWwpIGlmICghKHZhbCkpIHJldHVybiBOVUxMCisjZGVmaW5lIENBTExGVU5DKGdnZyxmZmYpICgqKChnZ2cpLT5mdW5jcy5mZmYpKQorI2RlZmluZSBTS0lQU1BBQ0UoY2NjKSB3aGlsZSAoaXNzcGFjZSgqY2NjKSkgY2NjKysKKyNkZWZpbmUgaXN2YXJmaXJzdGxldHRlcihjY2MpIChpc2FscGhhKGNjYykgfHwgKGNjYykgPT0gJ18nKQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX3ZhcmlhYmxlIChnLCBjcCwgdmFycCkKKyAgICBJZlBhcnNlciAqZzsKKyAgICBjb25zdCBjaGFyICpjcDsKKyAgICBjb25zdCBjaGFyICoqdmFycDsKK3sKKyAgICBTS0lQU1BBQ0UgKGNwKTsKKworICAgIGlmICghaXN2YXJmaXJzdGxldHRlciAoKmNwKSkKKwlyZXR1cm4gQ0FMTEZVTkMoZywgaGFuZGxlX2Vycm9yKSAoZywgY3AsICJ2YXJpYWJsZSBuYW1lIik7CisKKyAgICAqdmFycCA9IGNwOworICAgIC8qIEVNUFRZICovCisgICAgZm9yIChjcCsrOyBpc2FsbnVtKCpjcCkgfHwgKmNwID09ICdfJzsgY3ArKykgOworICAgIHJldHVybiBjcDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV9udW1iZXIgKGcsIGNwLCB2YWxwKQorICAgIElmUGFyc2VyICpnOworICAgIGNvbnN0IGNoYXIgKmNwOworICAgIGludCAqdmFscDsKK3sKKyAgICBTS0lQU1BBQ0UgKGNwKTsKKworICAgIGlmICghaXNkaWdpdCgqY3ApKQorCXJldHVybiBDQUxMRlVOQyhnLCBoYW5kbGVfZXJyb3IpIChnLCBjcCwgIm51bWJlciIpOworCisgICAgKnZhbHAgPSBzdHJ0b2woY3AsICZjcCwgMCk7CisgICAgcmV0dXJuIGNwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX3ZhbHVlIChnLCBjcCwgdmFscCkKKyAgICBJZlBhcnNlciAqZzsKKyAgICBjb25zdCBjaGFyICpjcDsKKyAgICBpbnQgKnZhbHA7Cit7CisgICAgY29uc3QgY2hhciAqdmFyOworCisgICAgKnZhbHAgPSAwOworCisgICAgU0tJUFNQQUNFIChjcCk7CisgICAgaWYgKCEqY3ApCisJcmV0dXJuIGNwOworCisgICAgc3dpdGNoICgqY3ApIHsKKyAgICAgIGNhc2UgJygnOgorCURPIChjcCA9IFBhcnNlSWZFeHByZXNzaW9uIChnLCBjcCArIDEsIHZhbHApKTsKKwlTS0lQU1BBQ0UgKGNwKTsKKwlpZiAoKmNwICE9ICcpJykgCisJICAgIHJldHVybiBDQUxMRlVOQyhnLCBoYW5kbGVfZXJyb3IpIChnLCBjcCwgIikiKTsKKworCXJldHVybiBjcCArIDE7CQkJLyogc2tpcCB0aGUgcmlnaHQgcGFyZW4gKi8KKworICAgICAgY2FzZSAnISc6CisJRE8gKGNwID0gcGFyc2VfdmFsdWUgKGcsIGNwICsgMSwgdmFscCkpOworCSp2YWxwID0gISgqdmFscCk7CisJcmV0dXJuIGNwOworCisgICAgICBjYXNlICctJzoKKwlETyAoY3AgPSBwYXJzZV92YWx1ZSAoZywgY3AgKyAxLCB2YWxwKSk7CisJKnZhbHAgPSAtKCp2YWxwKTsKKwlyZXR1cm4gY3A7CisKKyAgICAgIGNhc2UgJyMnOgorCURPIChjcCA9IHBhcnNlX3ZhcmlhYmxlIChnLCBjcCArIDEsICZ2YXIpKTsKKwlTS0lQU1BBQ0UgKGNwKTsKKwlpZiAoKmNwICE9ICcoJykKKwkgICAgcmV0dXJuIENBTExGVU5DKGcsIGhhbmRsZV9lcnJvcikgKGcsIGNwLCAiKCIpOworCWRvIHsKKwkgICAgRE8gKGNwID0gcGFyc2VfdmFyaWFibGUgKGcsIGNwICsgMSwgJnZhcikpOworCSAgICBTS0lQU1BBQ0UgKGNwKTsKKwl9IHdoaWxlICgqY3AgJiYgKmNwICE9ICcpJyk7CisJaWYgKCpjcCAhPSAnKScpCisJICAgIHJldHVybiBDQUxMRlVOQyhnLCBoYW5kbGVfZXJyb3IpIChnLCBjcCwgIikiKTsKKwkqdmFscCA9IDE7IC8qIFhYWCAqLworCXJldHVybiBjcCArIDE7CisKKyAgICAgIGNhc2UgJ2QnOgorCWlmIChzdHJuY21wIChjcCwgImRlZmluZWQiLCA3KSA9PSAwICYmICFpc2FsbnVtKGNwWzddKSkgeworCSAgICBpbnQgcGFyZW4gPSAwOworCSAgICBjcCArPSA3OworCSAgICBTS0lQU1BBQ0UgKGNwKTsKKwkgICAgaWYgKCpjcCA9PSAnKCcpIHsKKwkJcGFyZW4gPSAxOworCQljcCsrOworCSAgICB9CisJICAgIERPIChjcCA9IHBhcnNlX3ZhcmlhYmxlIChnLCBjcCwgJnZhcikpOworCSAgICBTS0lQU1BBQ0UgKGNwKTsKKwkgICAgaWYgKHBhcmVuICYmICpjcCAhPSAnKScpCisJCXJldHVybiBDQUxMRlVOQyhnLCBoYW5kbGVfZXJyb3IpIChnLCBjcCwgIikiKTsKKwkgICAgKnZhbHAgPSAoKihnLT5mdW5jcy5ldmFsX2RlZmluZWQpKSAoZywgdmFyLCBjcCAtIHZhcik7CisJICAgIHJldHVybiBjcCArIHBhcmVuOwkJLyogc2tpcCB0aGUgcmlnaHQgcGFyZW4gKi8KKwl9CisJLyogZmFsbCBvdXQgKi8KKyAgICB9CisKKyAgICBpZiAoaXNkaWdpdCgqY3ApKSB7CisJRE8gKGNwID0gcGFyc2VfbnVtYmVyIChnLCBjcCwgdmFscCkpOworICAgIH0gZWxzZSBpZiAoIWlzdmFyZmlyc3RsZXR0ZXIoKmNwKSkKKwlyZXR1cm4gQ0FMTEZVTkMoZywgaGFuZGxlX2Vycm9yKSAoZywgY3AsICJ2YXJpYWJsZSBvciBudW1iZXIiKTsKKyAgICBlbHNlIHsKKwlETyAoY3AgPSBwYXJzZV92YXJpYWJsZSAoZywgY3AsICZ2YXIpKTsKKwkqdmFscCA9ICgqKGctPmZ1bmNzLmV2YWxfdmFyaWFibGUpKSAoZywgdmFyLCBjcCAtIHZhcik7CisgICAgfQorICAgIAorICAgIHJldHVybiBjcDsKK30KKworCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX3Byb2R1Y3QgKGcsIGNwLCB2YWxwKQorICAgIElmUGFyc2VyICpnOworICAgIGNvbnN0IGNoYXIgKmNwOworICAgIGludCAqdmFscDsKK3sKKyAgICBpbnQgcmlnaHR2YWw7CisKKyAgICBETyAoY3AgPSBwYXJzZV92YWx1ZSAoZywgY3AsIHZhbHApKTsKKyAgICBTS0lQU1BBQ0UgKGNwKTsKKworICAgIHN3aXRjaCAoKmNwKSB7CisgICAgICBjYXNlICcqJzoKKwlETyAoY3AgPSBwYXJzZV9wcm9kdWN0IChnLCBjcCArIDEsICZyaWdodHZhbCkpOworCSp2YWxwID0gKCp2YWxwICogcmlnaHR2YWwpOworCWJyZWFrOworCisgICAgICBjYXNlICcvJzoKKwlETyAoY3AgPSBwYXJzZV9wcm9kdWN0IChnLCBjcCArIDEsICZyaWdodHZhbCkpOworCSp2YWxwID0gKCp2YWxwIC8gcmlnaHR2YWwpOworCWJyZWFrOworCisgICAgICBjYXNlICclJzoKKwlETyAoY3AgPSBwYXJzZV9wcm9kdWN0IChnLCBjcCArIDEsICZyaWdodHZhbCkpOworCSp2YWxwID0gKCp2YWxwICUgcmlnaHR2YWwpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY3A7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFyc2Vfc3VtIChnLCBjcCwgdmFscCkKKyAgICBJZlBhcnNlciAqZzsKKyAgICBjb25zdCBjaGFyICpjcDsKKyAgICBpbnQgKnZhbHA7Cit7CisgICAgaW50IHJpZ2h0dmFsOworCisgICAgRE8gKGNwID0gcGFyc2VfcHJvZHVjdCAoZywgY3AsIHZhbHApKTsKKyAgICBTS0lQU1BBQ0UgKGNwKTsKKworICAgIHN3aXRjaCAoKmNwKSB7CisgICAgICBjYXNlICcrJzoKKwlETyAoY3AgPSBwYXJzZV9zdW0gKGcsIGNwICsgMSwgJnJpZ2h0dmFsKSk7CisJKnZhbHAgPSAoKnZhbHAgKyByaWdodHZhbCk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJy0nOgorCURPIChjcCA9IHBhcnNlX3N1bSAoZywgY3AgKyAxLCAmcmlnaHR2YWwpKTsKKwkqdmFscCA9ICgqdmFscCAtIHJpZ2h0dmFsKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGNwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX3NoaWZ0IChnLCBjcCwgdmFscCkKKyAgICBJZlBhcnNlciAqZzsKKyAgICBjb25zdCBjaGFyICpjcDsKKyAgICBpbnQgKnZhbHA7Cit7CisgICAgaW50IHJpZ2h0dmFsOworCisgICAgRE8gKGNwID0gcGFyc2Vfc3VtIChnLCBjcCwgdmFscCkpOworICAgIFNLSVBTUEFDRSAoY3ApOworCisgICAgc3dpdGNoICgqY3ApIHsKKyAgICAgIGNhc2UgJzwnOgorCWlmIChjcFsxXSA9PSAnPCcpIHsKKwkgICAgRE8gKGNwID0gcGFyc2Vfc2hpZnQgKGcsIGNwICsgMiwgJnJpZ2h0dmFsKSk7CisJICAgICp2YWxwID0gKCp2YWxwIDw8IHJpZ2h0dmFsKTsKKwl9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJz4nOgorCWlmIChjcFsxXSA9PSAnPicpIHsKKwkgICAgRE8gKGNwID0gcGFyc2Vfc2hpZnQgKGcsIGNwICsgMiwgJnJpZ2h0dmFsKSk7CisJICAgICp2YWxwID0gKCp2YWxwID4+IHJpZ2h0dmFsKTsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjcDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV9pbmVxdWFsaXR5IChnLCBjcCwgdmFscCkKKyAgICBJZlBhcnNlciAqZzsKKyAgICBjb25zdCBjaGFyICpjcDsKKyAgICBpbnQgKnZhbHA7Cit7CisgICAgaW50IHJpZ2h0dmFsOworCisgICAgRE8gKGNwID0gcGFyc2Vfc2hpZnQgKGcsIGNwLCB2YWxwKSk7CisgICAgU0tJUFNQQUNFIChjcCk7CisKKyAgICBzd2l0Y2ggKCpjcCkgeworICAgICAgY2FzZSAnPCc6CisJaWYgKGNwWzFdID09ICc9JykgeworCSAgICBETyAoY3AgPSBwYXJzZV9pbmVxdWFsaXR5IChnLCBjcCArIDIsICZyaWdodHZhbCkpOworCSAgICAqdmFscCA9ICgqdmFscCA8PSByaWdodHZhbCk7CisJfSBlbHNlIHsKKwkgICAgRE8gKGNwID0gcGFyc2VfaW5lcXVhbGl0eSAoZywgY3AgKyAxLCAmcmlnaHR2YWwpKTsKKwkgICAgKnZhbHAgPSAoKnZhbHAgPCByaWdodHZhbCk7CisJfQorCWJyZWFrOworCisgICAgICBjYXNlICc+JzoKKwlpZiAoY3BbMV0gPT0gJz0nKSB7CisJICAgIERPIChjcCA9IHBhcnNlX2luZXF1YWxpdHkgKGcsIGNwICsgMiwgJnJpZ2h0dmFsKSk7CisJICAgICp2YWxwID0gKCp2YWxwID49IHJpZ2h0dmFsKTsKKwl9IGVsc2UgeworCSAgICBETyAoY3AgPSBwYXJzZV9pbmVxdWFsaXR5IChnLCBjcCArIDEsICZyaWdodHZhbCkpOworCSAgICAqdmFscCA9ICgqdmFscCA+IHJpZ2h0dmFsKTsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjcDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV9lcXVhbGl0eSAoZywgY3AsIHZhbHApCisgICAgSWZQYXJzZXIgKmc7CisgICAgY29uc3QgY2hhciAqY3A7CisgICAgaW50ICp2YWxwOworeworICAgIGludCByaWdodHZhbDsKKworICAgIERPIChjcCA9IHBhcnNlX2luZXF1YWxpdHkgKGcsIGNwLCB2YWxwKSk7CisgICAgU0tJUFNQQUNFIChjcCk7CisKKyAgICBzd2l0Y2ggKCpjcCkgeworICAgICAgY2FzZSAnPSc6CisJaWYgKGNwWzFdID09ICc9JykKKwkgICAgY3ArKzsKKwlETyAoY3AgPSBwYXJzZV9lcXVhbGl0eSAoZywgY3AgKyAxLCAmcmlnaHR2YWwpKTsKKwkqdmFscCA9ICgqdmFscCA9PSByaWdodHZhbCk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJyEnOgorCWlmIChjcFsxXSAhPSAnPScpCisJICAgIGJyZWFrOworCURPIChjcCA9IHBhcnNlX2VxdWFsaXR5IChnLCBjcCArIDIsICZyaWdodHZhbCkpOworCSp2YWxwID0gKCp2YWxwICE9IHJpZ2h0dmFsKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGNwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX2JhbmQgKGcsIGNwLCB2YWxwKQorICAgIElmUGFyc2VyICpnOworICAgIGNvbnN0IGNoYXIgKmNwOworICAgIGludCAqdmFscDsKK3sKKyAgICBpbnQgcmlnaHR2YWw7CisKKyAgICBETyAoY3AgPSBwYXJzZV9lcXVhbGl0eSAoZywgY3AsIHZhbHApKTsKKyAgICBTS0lQU1BBQ0UgKGNwKTsKKworICAgIHN3aXRjaCAoKmNwKSB7CisgICAgICBjYXNlICcmJzoKKwlpZiAoY3BbMV0gIT0gJyYnKSB7CisJICAgIERPIChjcCA9IHBhcnNlX2JhbmQgKGcsIGNwICsgMSwgJnJpZ2h0dmFsKSk7CisJICAgICp2YWxwID0gKCp2YWxwICYgcmlnaHR2YWwpOworCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGNwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX2JvciAoZywgY3AsIHZhbHApCisgICAgSWZQYXJzZXIgKmc7CisgICAgY29uc3QgY2hhciAqY3A7CisgICAgaW50ICp2YWxwOworeworICAgIGludCByaWdodHZhbDsKKworICAgIERPIChjcCA9IHBhcnNlX2JhbmQgKGcsIGNwLCB2YWxwKSk7CisgICAgU0tJUFNQQUNFIChjcCk7CisKKyAgICBzd2l0Y2ggKCpjcCkgeworICAgICAgY2FzZSAnfCc6CisJaWYgKGNwWzFdICE9ICd8JykgeworCSAgICBETyAoY3AgPSBwYXJzZV9ib3IgKGcsIGNwICsgMSwgJnJpZ2h0dmFsKSk7CisJICAgICp2YWxwID0gKCp2YWxwIHwgcmlnaHR2YWwpOworCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGNwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX2xhbmQgKGcsIGNwLCB2YWxwKQorICAgIElmUGFyc2VyICpnOworICAgIGNvbnN0IGNoYXIgKmNwOworICAgIGludCAqdmFscDsKK3sKKyAgICBpbnQgcmlnaHR2YWw7CisKKyAgICBETyAoY3AgPSBwYXJzZV9ib3IgKGcsIGNwLCB2YWxwKSk7CisgICAgU0tJUFNQQUNFIChjcCk7CisKKyAgICBzd2l0Y2ggKCpjcCkgeworICAgICAgY2FzZSAnJic6CisJaWYgKGNwWzFdICE9ICcmJykKKwkgICAgcmV0dXJuIENBTExGVU5DKGcsIGhhbmRsZV9lcnJvcikgKGcsIGNwLCAiJiYiKTsKKwlETyAoY3AgPSBwYXJzZV9sYW5kIChnLCBjcCArIDIsICZyaWdodHZhbCkpOworCSp2YWxwID0gKCp2YWxwICYmIHJpZ2h0dmFsKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGNwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX2xvciAoZywgY3AsIHZhbHApCisgICAgSWZQYXJzZXIgKmc7CisgICAgY29uc3QgY2hhciAqY3A7CisgICAgaW50ICp2YWxwOworeworICAgIGludCByaWdodHZhbDsKKworICAgIERPIChjcCA9IHBhcnNlX2xhbmQgKGcsIGNwLCB2YWxwKSk7CisgICAgU0tJUFNQQUNFIChjcCk7CisKKyAgICBzd2l0Y2ggKCpjcCkgeworICAgICAgY2FzZSAnfCc6CisJaWYgKGNwWzFdICE9ICd8JykKKwkgICAgcmV0dXJuIENBTExGVU5DKGcsIGhhbmRsZV9lcnJvcikgKGcsIGNwLCAifHwiKTsKKwlETyAoY3AgPSBwYXJzZV9sb3IgKGcsIGNwICsgMiwgJnJpZ2h0dmFsKSk7CisJKnZhbHAgPSAoKnZhbHAgfHwgcmlnaHR2YWwpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY3A7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCSAgICAgRXh0ZXJuYWwgRW50cnkgUG9pbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgY2hhciAqCitQYXJzZUlmRXhwcmVzc2lvbiAoZywgY3AsIHZhbHApCisgICAgSWZQYXJzZXIgKmc7CisgICAgY29uc3QgY2hhciAqY3A7CisgICAgaW50ICp2YWxwOworeworICAgIHJldHVybiBwYXJzZV9sb3IgKGcsIGNwLCB2YWxwKTsKK30KKworCmRpZmYgLS1naXQgYS91bml4L3ZuY21rZGVwZW5kL2lmcGFyc2VyLmggYi91bml4L3ZuY21rZGVwZW5kL2lmcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzMzc5OAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jbWtkZXBlbmQvaWZwYXJzZXIuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogJFhDb25zb3J0aXVtOiBpZnBhcnNlci5oLHYgMS4xIDkyLzA4LzIyIDEzOjA1OjM5IHJ3cyBFeHAgJAorICoKKyAqIENvcHlyaWdodCAxOTkyIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCisgKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcyBtYXkgbm90IGJlCisgKiB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMgbWFrZXMKKyAqIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisgKiBJdCBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKiAKKyAqIE5FVFdPUksgQ09NUFVUSU5HIERFVklDRVMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKKyAqIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBORVRXT1JLIENPTVBVVElORyBERVZJQ0VTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCisgKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQorICogTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKiAKKyAqIEF1dGhvcjogIEppbSBGdWx0b24KKyAqICAgICAgICAgIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqIAorICogU2ltcGxlIGlmIHN0YXRlbWVudCBwcm9jZXNzb3IKKyAqCisgKiBUaGlzIG1vZHVsZSBjYW4gYmUgdXNlZCB0byBldmFsdWF0ZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIEMgbGFuZ3VhZ2UKKyAqIGlmIGNvbnN0cnVjdHMuICBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKyAqIAorICogICAgIEVYUFJFU1NJT04JOj0JVkFMVUUKKyAqIAkJCSB8CVZBTFVFICBCSU5PUAlFWFBSRVNTSU9OCisgKiAKKyAqICAgICBWQUxVRQkJOj0JJygnICBFWFBSRVNTSU9OICAnKScKKyAqIAkJCSB8CSchJyAgVkFMVUUKKyAqIAkJCSB8CSctJyAgVkFMVUUKKyAqIAkJCSB8CSdkZWZpbmVkJyAgJygnICB2YXJpYWJsZSAgJyknCisgKiAJCQkgfAl2YXJpYWJsZQorICogCQkJIHwJbnVtYmVyCisgKiAKKyAqICAgICBCSU5PUAkJOj0JJyonCXwgICcvJwl8ICAnJScKKyAqIAkJCSB8CScrJwl8ICAnLScKKyAqIAkJCSB8CSc8PCcJfCAgJz4+JworICogCQkJIHwJJzwnCXwgICc+Jwl8ICAnPD0nICB8ICAnPj0nCisgKiAJCQkgfAknPT0nCXwgICchPScKKyAqIAkJCSB8CScmJwl8ICAnfCcKKyAqIAkJCSB8CScmJicJfCAgJ3x8JworICogCisgKiBUaGUgbm9ybWFsIEMgb3JkZXIgb2YgcHJlY2lkZW5jZSBpcyBzdXBwb3J0ZWQuCisgKiAKKyAqIAorICogRXh0ZXJuYWwgRW50cnkgUG9pbnRzOgorICogCisgKiAgICAgUGFyc2VJZkV4cHJlc3Npb24JCXBhcnNlIGEgc3RyaW5nIGZvciAjaWYKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBjb25zdCAvKiovCit0eXBlZGVmIGludCBCb29sOworI2RlZmluZSBGYWxzZSAwCisjZGVmaW5lIFRydWUgMQorCit0eXBlZGVmIHN0cnVjdCBfaWZfcGFyc2VyIHsKKyAgICBzdHJ1Y3QgewkJCQkvKiBmdW5jdGlvbnMgKi8KKwljaGFyICooKmhhbmRsZV9lcnJvcikgKC8qIHN0cnVjdCBfaWZfcGFyc2VyICosIGNvbnN0IGNoYXIgKiwKKwkJCQkgY29uc3QgY2hhciAqICovKTsKKwlpbnQgKCpldmFsX3ZhcmlhYmxlKSAoLyogc3RydWN0IF9pZl9wYXJzZXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKi8pOworCWludCAoKmV2YWxfZGVmaW5lZCkgKC8qIHN0cnVjdCBfaWZfcGFyc2VyICosIGNvbnN0IGNoYXIgKiwgaW50ICovKTsKKyAgICB9IGZ1bmNzOworICAgIGNoYXIgKmRhdGE7Cit9IElmUGFyc2VyOworCitjaGFyICpQYXJzZUlmRXhwcmVzc2lvbiAoLyogSWZQYXJzZXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKiAqLyk7CisKZGlmZiAtLWdpdCBhL3VuaXgvdm5jbWtkZXBlbmQvaW5jbHVkZS5jIGIvdW5peC92bmNta2RlcGVuZC9pbmNsdWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjZDEzOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jbWtkZXBlbmQvaW5jbHVkZS5jCkBAIC0wLDAgKzEsMzEyIEBACisvKiAkWENvbnNvcnRpdW06IGluY2x1ZGUuYyx2IDEuMTcgOTQvMTIvMDUgMTk6MzM6MDggZ2lsZGVhIEV4cCAkICovCisvKgorCitDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQgIFggQ29uc29ydGl1bQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK1ggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29ydGl1bS4KKworKi8KKworCisjaW5jbHVkZSAiZGVmLmgiCisKK2V4dGVybiBzdHJ1Y3QJaW5jbGlzdAlpbmNsaXN0WyBNQVhGSUxFUyBdLAorCQkJKmluY2xpc3RwOworZXh0ZXJuIGNoYXIJKmluY2x1ZGVkaXJzWyBdOworZXh0ZXJuIGNoYXIJKm5vdGRvdGRvdFsgXTsKK2V4dGVybiBib29sZWFuIHNob3dfd2hlcmVfbm90OworZXh0ZXJuIGJvb2xlYW4gd2Fybl9tdWx0aXBsZTsKKworc3RydWN0IGluY2xpc3QgKmluY19wYXRoKGZpbGUsIGluY2x1ZGUsIGRvdCkKKwlyZWdpc3RlciBjaGFyCSpmaWxlLAorCQkJKmluY2x1ZGU7CisJYm9vbGVhbglkb3Q7Cit7CisJc3RhdGljIGNoYXIJcGF0aFsgQlVGU0laIF07CisJcmVnaXN0ZXIgY2hhcgkJKipwcCwgKnA7CisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QJKmlwOworCXN0cnVjdCBzdGF0CXN0OworCWJvb2xlYW4JZm91bmQgPSBGQUxTRTsKKworCS8qCisJICogQ2hlY2sgYWxsIHByZXZpb3VzbHkgZm91bmQgaW5jbHVkZSBmaWxlcyBmb3IgYSBwYXRoIHRoYXQKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIGV4cGFuZGVkLgorCSAqLworCWZvciAoaXAgPSBpbmNsaXN0OyBpcC0+aV9maWxlOyBpcCsrKQorCSAgICBpZiAoKHN0cmNtcChpcC0+aV9pbmNzdHJpbmcsIGluY2x1ZGUpID09IDApICYmICFpcC0+aV9pbmNsdWRlZF9zeW0pCisJICAgIHsKKwkJZm91bmQgPSBUUlVFOworCQlicmVhazsKKwkgICAgfQorCisJLyoKKwkgKiBJZiB0aGUgcGF0aCB3YXMgc3Vycm91bmRlZCBieSAiIiBvciBpcyBhbiBhYnNvbHV0ZSBwYXRoLAorCSAqIHRoZW4gY2hlY2sgdGhlIGV4YWN0IHBhdGggcHJvdmlkZWQuCisJICovCisJaWYgKCFmb3VuZCAmJiAoZG90IHx8ICppbmNsdWRlID09ICcvJykpIHsKKwkJaWYgKHN0YXQoaW5jbHVkZSwgJnN0KSA9PSAwKSB7CisJCQlpcCA9IG5ld2luY2x1ZGUoaW5jbHVkZSwgaW5jbHVkZSk7CisJCQlmb3VuZCA9IFRSVUU7CisJCX0KKwkJZWxzZSBpZiAoc2hvd193aGVyZV9ub3QpCisJCQl3YXJuaW5nMSgiXHRub3QgaW4gJXNcbiIsIGluY2x1ZGUpOworCX0KKworCS8qCisJICogU2VlIGlmIHRoaXMgaW5jbHVkZSBmaWxlIGlzIGluIHRoZSBkaXJlY3Rvcnkgb2YgdGhlCisJICogZmlsZSBiZWluZyBjb21waWxlZC4KKwkgKi8KKwlpZiAoIWZvdW5kKSB7CisJCWZvciAocD1maWxlK3N0cmxlbihmaWxlKTsgcD5maWxlOyBwLS0pCisJCQlpZiAoKnAgPT0gJy8nKQorCQkJCWJyZWFrOworCQlpZiAocCA9PSBmaWxlKQorCQkJc3RyY3B5KHBhdGgsIGluY2x1ZGUpOworCQllbHNlIHsKKwkJCXN0cm5jcHkocGF0aCwgZmlsZSwgKHAtZmlsZSkgKyAxKTsKKwkJCXBhdGhbIChwLWZpbGUpICsgMSBdID0gJ1wwJzsKKwkJCXN0cmNweShwYXRoICsgKHAtZmlsZSkgKyAxLCBpbmNsdWRlKTsKKwkJfQorCQlyZW1vdmVfZG90ZG90KHBhdGgpOworCQlpZiAoc3RhdChwYXRoLCAmc3QpID09IDApIHsKKwkJCWlwID0gbmV3aW5jbHVkZShwYXRoLCBpbmNsdWRlKTsKKwkJCWZvdW5kID0gVFJVRTsKKwkJfQorCQllbHNlIGlmIChzaG93X3doZXJlX25vdCkKKwkJCXdhcm5pbmcxKCJcdG5vdCBpbiAlc1xuIiwgcGF0aCk7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQuIChzdGFuZGFyZCBpbmNsdWRlIGRpcgorCSAqIHNob3VsZCBiZSBhdCB0aGUgZW5kLikKKwkgKi8KKwlpZiAoIWZvdW5kKQorCQlmb3IgKHBwID0gaW5jbHVkZWRpcnM7ICpwcDsgcHArKykgeworI2lmZGVmIFdJTjMyCisJCQlzcHJpbnRmKHBhdGgsICIlc1xcJXMiLCAqcHAsIGluY2x1ZGUpOworI2Vsc2UKKwkJCXNwcmludGYocGF0aCwgIiVzLyVzIiwgKnBwLCBpbmNsdWRlKTsKKyNlbmRpZgorCQkJcmVtb3ZlX2RvdGRvdChwYXRoKTsKKwkJCWlmIChzdGF0KHBhdGgsICZzdCkgPT0gMCkgeworCQkJCWlwID0gbmV3aW5jbHVkZShwYXRoLCBpbmNsdWRlKTsKKwkJCQlmb3VuZCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChzaG93X3doZXJlX25vdCkKKwkJCQl3YXJuaW5nMSgiXHRub3QgaW4gJXNcbiIsIHBhdGgpOworCQl9CisKKwlpZiAoIWZvdW5kKQorCQlpcCA9IE5VTEw7CisJcmV0dXJuKGlwKTsKK30KKworLyoKKyAqIE9jY2FzaW9uYWxseSwgcGF0aG5hbWVzIGFyZSBjcmVhdGVkIHRoYXQgbG9vayBsaWtlIC4uLi94Ly4uL3kKKyAqIEFueSBvZiB0aGUgJ3gvLi4nIHNlcXVlbmNlcyB3aXRoaW4gdGhlIG5hbWUgY2FuIGJlIGVsaW1pbmF0ZWQuCisgKiAoYnV0IG9ubHkgaWYgJ3gnIGlzIG5vdCBhIHN5bWJvbGljIGxpbmshISkKKyAqLworcmVtb3ZlX2RvdGRvdChwYXRoKQorCWNoYXIJKnBhdGg7Cit7CisJcmVnaXN0ZXIgY2hhcgkqZW5kLCAqZnJvbSwgKnRvLCAqKmNwOworCWNoYXIJCSpjb21wb25lbnRzWyBNQVhGSUxFUyBdLAorCQkJbmV3cGF0aFsgQlVGU0laIF07CisJYm9vbGVhbgkJY29tcG9uZW50X2NvcGllZDsKKworCS8qCisJICogc2xpY2UgcGF0aCB1cCBpbnRvIGNvbXBvbmVudHMuCisJICovCisJdG8gPSBuZXdwYXRoOworCWlmICgqcGF0aCA9PSAnLycpCisJCSp0bysrID0gJy8nOworCSp0byA9ICdcMCc7CisJY3AgPSBjb21wb25lbnRzOworCWZvciAoZnJvbT1lbmQ9cGF0aDsgKmVuZDsgZW5kKyspCisJCWlmICgqZW5kID09ICcvJykgeworCQkJd2hpbGUgKCplbmQgPT0gJy8nKQorCQkJCSplbmQrKyA9ICdcMCc7CisJCQlpZiAoKmZyb20pCisJCQkJKmNwKysgPSBmcm9tOworCQkJZnJvbSA9IGVuZDsKKwkJfQorCSpjcCsrID0gZnJvbTsKKwkqY3AgPSBOVUxMOworCisJLyoKKwkgKiBSZWN1cnNpdmVseSByZW1vdmUgYWxsICd4Ly4uJyBjb21wb25lbnQgcGFpcnMuCisJICovCisJY3AgPSBjb21wb25lbnRzOworCXdoaWxlKCpjcCkgeworCQlpZiAoIWlzZG90KCpjcCkgJiYgIWlzZG90ZG90KCpjcCkgJiYgaXNkb3Rkb3QoKihjcCsxKSkKKwkJICAgICYmICFpc3N5bWJvbGljKG5ld3BhdGgsICpjcCkpCisJCXsKKwkJICAgIGNoYXIgKipmcCA9IGNwICsgMjsKKwkJICAgIGNoYXIgKip0cCA9IGNwOworCisJCSAgICBkbyAKKwkJCSp0cCsrID0gKmZwOyAvKiBtb3ZlIGFsbCB0aGUgcG9pbnRlcnMgZG93biAqLworCQkgICAgd2hpbGUgKCpmcCsrKTsKKwkJICAgIGlmIChjcCAhPSBjb21wb25lbnRzKQorCQkJY3AtLTsJLyogZ28gYmFjayBhbmQgY2hlY2sgZm9yIG5lc3RlZCAiLi4iICovCisJCX0gZWxzZSB7CisJCSAgICBjcCsrOworCQl9CisJfQorCS8qCisJICogQ29uY2F0ZW5hdGUgdGhlIHJlbWFpbmluZyBwYXRoIGVsZW1lbnRzLgorCSAqLworCWNwID0gY29tcG9uZW50czsKKwljb21wb25lbnRfY29waWVkID0gRkFMU0U7CisJd2hpbGUoKmNwKSB7CisJCWlmIChjb21wb25lbnRfY29waWVkKQorCQkJKnRvKysgPSAnLyc7CisJCWNvbXBvbmVudF9jb3BpZWQgPSBUUlVFOworCQlmb3IgKGZyb20gPSAqY3A7ICpmcm9tOyApCisJCQkqdG8rKyA9ICpmcm9tKys7CisJCSp0byA9ICdcMCc7CisJCWNwKys7CisJfQorCSp0bysrID0gJ1wwJzsKKworCS8qCisJICogY29weSB0aGUgcmVjb25zdGl0dXRlZCBwYXRoIGJhY2sgdG8gb3VyIHBvaW50ZXIuCisJICovCisJc3RyY3B5KHBhdGgsIG5ld3BhdGgpOworfQorCitpc2RvdChwKQorCXJlZ2lzdGVyIGNoYXIJKnA7Cit7CisJaWYocCAmJiAqcCsrID09ICcuJyAmJiAqcCsrID09ICdcMCcpCisJCXJldHVybihUUlVFKTsKKwlyZXR1cm4oRkFMU0UpOworfQorCitpc2RvdGRvdChwKQorCXJlZ2lzdGVyIGNoYXIJKnA7Cit7CisJaWYocCAmJiAqcCsrID09ICcuJyAmJiAqcCsrID09ICcuJyAmJiAqcCsrID09ICdcMCcpCisJCXJldHVybihUUlVFKTsKKwlyZXR1cm4oRkFMU0UpOworfQorCitpc3N5bWJvbGljKGRpciwgY29tcG9uZW50KQorCXJlZ2lzdGVyIGNoYXIJKmRpciwgKmNvbXBvbmVudDsKK3sKKyNpZmRlZiBTX0lGTE5LCisJc3RydWN0IHN0YXQJc3Q7CisJY2hhcglidWZbIEJVRlNJWiBdLCAqKnBwOworCisJc3ByaW50ZihidWYsICIlcyVzJXMiLCBkaXIsICpkaXIgPyAiLyIgOiAiIiwgY29tcG9uZW50KTsKKwlmb3IgKHBwPW5vdGRvdGRvdDsgKnBwOyBwcCsrKQorCQlpZiAoc3RyY21wKCpwcCwgYnVmKSA9PSAwKQorCQkJcmV0dXJuIChUUlVFKTsKKwlpZiAobHN0YXQoYnVmLCAmc3QpID09IDAKKwkmJiAoc3Quc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworCQkqcHArKyA9IGNvcHkoYnVmKTsKKwkJaWYgKHBwID49ICZub3Rkb3Rkb3RbIE1BWERJUlMgXSkKKwkJCWZhdGFsZXJyKCJvdXQgb2YgLi4gZGlycywgaW5jcmVhc2UgTUFYRElSU1xuIik7CisJCXJldHVybihUUlVFKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4oRkFMU0UpOworfQorCisvKgorICogQWRkIGFuIGluY2x1ZGUgZmlsZSB0byB0aGUgbGlzdCBvZiB0aG9zZSBpbmNsdWRlZCBieSAnZmlsZScuCisgKi8KK3N0cnVjdCBpbmNsaXN0ICpuZXdpbmNsdWRlKG5ld2ZpbGUsIGluY3N0cmluZykKKwlyZWdpc3RlciBjaGFyCSpuZXdmaWxlLCAqaW5jc3RyaW5nOworeworCXJlZ2lzdGVyIHN0cnVjdCBpbmNsaXN0CSppcDsKKworCS8qCisJICogRmlyc3QsIHB1dCB0aGlzIGZpbGUgb24gdGhlIGdsb2JhbCBsaXN0IG9mIGluY2x1ZGUgZmlsZXMuCisJICovCisJaXAgPSBpbmNsaXN0cCsrOworCWlmIChpbmNsaXN0cCA9PSBpbmNsaXN0ICsgTUFYRklMRVMgLSAxKQorCQlmYXRhbGVycigib3V0IG9mIHNwYWNlOiBpbmNyZWFzZSBNQVhGSUxFU1xuIik7CisJaXAtPmlfZmlsZSA9IGNvcHkobmV3ZmlsZSk7CisJaXAtPmlfaW5jbHVkZWRfc3ltID0gRkFMU0U7CisJaWYgKGluY3N0cmluZyA9PSBOVUxMKQorCQlpcC0+aV9pbmNzdHJpbmcgPSBpcC0+aV9maWxlOworCWVsc2UKKwkJaXAtPmlfaW5jc3RyaW5nID0gY29weShpbmNzdHJpbmcpOworCisJcmV0dXJuKGlwKTsKK30KKworaW5jbHVkZWRfYnkoaXAsIG5ld2ZpbGUpCisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QJKmlwLCAqbmV3ZmlsZTsKK3sKKwlyZWdpc3RlciBpOworCisJaWYgKGlwID09IE5VTEwpCisJCXJldHVybjsKKwkvKgorCSAqIFB1dCB0aGlzIGluY2x1ZGUgZmlsZSAobmV3ZmlsZSkgb24gdGhlIGxpc3Qgb2YgZmlsZXMgaW5jbHVkZWQKKwkgKiBieSAnZmlsZScuICBJZiAnZmlsZScgaXMgTlVMTCwgdGhlbiBpdCBpcyBub3QgYW4gaW5jbHVkZQorCSAqIGZpbGUgaXRzZWxmIChpLmUuIHdhcyBwcm9iYWJseSBtZW50aW9uZWQgb24gdGhlIGNvbW1hbmQgbGluZSkuCisJICogSWYgaXQgaXMgYWxyZWFkeSBvbiB0aGUgbGlzdCwgZG9uJ3Qgc3RpY2sgaXQgb24gYWdhaW4uCisJICovCisJaWYgKGlwLT5pX2xpc3QgPT0gTlVMTCkKKwkJaXAtPmlfbGlzdCA9IChzdHJ1Y3QgaW5jbGlzdCAqKikKKwkJCW1hbGxvYyhzaXplb2Yoc3RydWN0IGluY2xpc3QgKikgKiArK2lwLT5pX2xpc3RsZW4pOworCWVsc2UgeworCQlmb3IgKGk9MDsgaTxpcC0+aV9saXN0bGVuOyBpKyspCisJCQlpZiAoaXAtPmlfbGlzdFsgaSBdID09IG5ld2ZpbGUpIHsKKwkJCSAgICBpID0gc3RybGVuKG5ld2ZpbGUtPmlfZmlsZSk7CisJCQkgICAgaWYgKCFpcC0+aV9pbmNsdWRlZF9zeW0gJiYKKwkJCQkhKGkgPiAyICYmCisJCQkJICBuZXdmaWxlLT5pX2ZpbGVbaS0xXSA9PSAnYycgJiYKKwkJCQkgIG5ld2ZpbGUtPmlfZmlsZVtpLTJdID09ICcuJykpCisJCQkgICAgeworCQkJCS8qIG9ubHkgYml0Y2ggaWYgaXAgaGFzICovCisJCQkJLyogbm8gI2luY2x1ZGUgU1lNQk9MIGxpbmVzICAqLworCQkJCS8qIGFuZCBpcyBub3QgYSAuYyBmaWxlICovCisJCQkJaWYgKHdhcm5fbXVsdGlwbGUpCisJCQkJeworCQkJCQl3YXJuaW5nKCIlcyBpbmNsdWRlcyAlcyBtb3JlIHRoYW4gb25jZSFcbiIsCisJCQkJCQlpcC0+aV9maWxlLCBuZXdmaWxlLT5pX2ZpbGUpOworCQkJCQl3YXJuaW5nMSgiQWxyZWFkeSBoYXZlXG4iKTsKKwkJCQkJZm9yIChpPTA7IGk8aXAtPmlfbGlzdGxlbjsgaSsrKQorCQkJCQkJd2FybmluZzEoIlx0JXNcbiIsIGlwLT5pX2xpc3RbaV0tPmlfZmlsZSk7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgICByZXR1cm47CisJCQl9CisJCWlwLT5pX2xpc3QgPSAoc3RydWN0IGluY2xpc3QgKiopIHJlYWxsb2MoaXAtPmlfbGlzdCwKKwkJCXNpemVvZihzdHJ1Y3QgaW5jbGlzdCAqKSAqICsraXAtPmlfbGlzdGxlbik7CisJfQorCWlwLT5pX2xpc3RbIGlwLT5pX2xpc3RsZW4tMSBdID0gbmV3ZmlsZTsKK30KKworaW5jX2NsZWFuICgpCit7CisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QgKmlwOworCisJZm9yIChpcCA9IGluY2xpc3Q7IGlwIDwgaW5jbGlzdHA7IGlwKyspIHsKKwkJaXAtPmlfbWFya2VkID0gRkFMU0U7CisJfQorfQpkaWZmIC0tZ2l0IGEvdW5peC92bmNta2RlcGVuZC9tYWluLmMgYi91bml4L3ZuY21rZGVwZW5kL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA1N2FlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNta2RlcGVuZC9tYWluLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qICRYQ29uc29ydGl1bTogbWFpbi5jLHYgMS44NCA5NC8xMS8zMCAxNjoxMDo0NCBrYWxlYiBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0ICBYIENvbnNvcnRpdW0KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvcnRpdW0uCisKKyovCisKKyNpbmNsdWRlICJkZWYuaCIKKyNpZmRlZiBocHV4CisjZGVmaW5lIHNpZ3ZlYyBzaWd2ZWN0b3IKKyNlbmRpZiAvKiBocHV4ICovCisKKyNpZmRlZiBYX1BPU0lYX0NfU09VUkNFCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSBYX1BPU0lYX0NfU09VUkNFCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjdW5kZWYgX1BPU0lYX0NfU09VUkNFCisjZWxzZQorI2lmIGRlZmluZWQoWF9OT1RfUE9TSVgpIHx8IGRlZmluZWQoX1BPU0lYX1NPVVJDRSkKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbHNlCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisjZW5kaWYKKyNlbmRpZgorCisjaWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZW5kaWYKKworI2lmZGVmIERFQlVHCitpbnQJX2RlYnVnbWFzazsKKyNlbmRpZgorCitjaGFyICpQcm9ncmFtTmFtZTsKKworY2hhcgkqZGlyZWN0aXZlc1tdID0geworCSJpZiIsCisJImlmZGVmIiwKKwkiaWZuZGVmIiwKKwkiZWxzZSIsCisJImVuZGlmIiwKKwkiZGVmaW5lIiwKKwkidW5kZWYiLAorCSJpbmNsdWRlIiwKKwkibGluZSIsCisJInByYWdtYSIsCisJImVycm9yIiwKKwkiaWRlbnQiLAorCSJzY2NzIiwKKwkiZWxpZiIsCisJImVqZWN0IiwKKwlOVUxMCit9OworCitzdHJ1Y3Qgc3ltdGFiIHByZWRlZnNbXSA9IHsge05VTEwsIE5VTEx9IH07CisKK3N0cnVjdAlpbmNsaXN0IGluY2xpc3RbIE1BWEZJTEVTIF0sCisJCSppbmNsaXN0cCA9IGluY2xpc3QsCisJCW1haW5pbmNsaXN0OworCitjaGFyCSpmaWxlbGlzdFsgTUFYRklMRVMgXTsKK2NoYXIJKmluY2x1ZGVkaXJzWyBNQVhESVJTICsgMSBdOworY2hhcgkqbm90ZG90ZG90WyBNQVhESVJTIF07CitjaGFyCSpvYmpwcmVmaXggPSAiIjsKK2NoYXIJKm9ianN1ZmZpeCA9ICIubyI7CitpbnQJd2lkdGggPSA3ODsKK2Jvb2xlYW4JYXBwZW5kID0gRkFMU0U7Citib29sZWFuCXByaW50ZWQgPSBGQUxTRTsKK2Jvb2xlYW4JdmVyYm9zZSA9IEZBTFNFOworYm9vbGVhbglzaG93X3doZXJlX25vdCA9IEZBTFNFOworYm9vbGVhbiB3YXJuX211bHRpcGxlID0gRkFMU0U7CS8qIFdhcm4gb24gbXVsdGlwbGUgaW5jbHVkZXMgb2Ygc2FtZSBmaWxlICovCisKK3N0YXRpYworI2lmZGVmIFNJR05BTFJFVFVSTlNJTlQKK2ludAorI2Vsc2UKK3ZvaWQKKyNlbmRpZgorY2F0Y2ggKHNpZykKKyAgICBpbnQgc2lnOworeworCWZmbHVzaCAoc3Rkb3V0KTsKKwlmYXRhbGVyciAoImdvdCBzaWduYWwgJWRcbiIsIHNpZyk7Cit9CisKKyNpZiBkZWZpbmVkKFVTRykgfHwgKGRlZmluZWQoaTM4NikgJiYgZGVmaW5lZChTWVNWKSkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX25leHRzdGVwX18pCisjZGVmaW5lIFVTR0lTSAorI2VuZGlmCisKKyNpZm5kZWYgVVNHSVNICisjaWZuZGVmIF9QT1NJWF9TT1VSQ0UKKyNkZWZpbmUgc2lnYWN0aW9uIHNpZ3ZlYworI2RlZmluZSBzYV9oYW5kbGVyIHN2X2hhbmRsZXIKKyNkZWZpbmUgc2FfbWFzayBzdl9tYXNrCisjZGVmaW5lIHNhX2ZsYWdzIHN2X2ZsYWdzCisjZW5kaWYKK3N0cnVjdCBzaWdhY3Rpb24gc2lnX2FjdDsKKyNlbmRpZiAvKiBVU0dJU0ggKi8KKworbWFpbihhcmdjLCBhcmd2KQorCWludAlhcmdjOworCWNoYXIJKiphcmd2OworeworCXJlZ2lzdGVyIGNoYXIJKipmcCA9IGZpbGVsaXN0OworCXJlZ2lzdGVyIGNoYXIJKippbmNwID0gaW5jbHVkZWRpcnM7CisJcmVnaXN0ZXIgY2hhcgkqcDsKKwlyZWdpc3RlciBzdHJ1Y3QgaW5jbGlzdAkqaXA7CisJY2hhcgkqbWFrZWZpbGUgPSBOVUxMOworCXN0cnVjdCBmaWxlcG9pbnRlcgkqZmlsZWNvbnRlbnQ7CisJc3RydWN0IHN5bXRhYiAqcHN5bXAgPSBwcmVkZWZzOworCWNoYXIgKmVuZG1hcmtlciA9IE5VTEw7CisJY2hhciAqZGVmaW5jZGlyID0gTlVMTDsKKworCVByb2dyYW1OYW1lID0gYXJndlswXTsKKworCXdoaWxlIChwc3ltcC0+c19uYW1lKQorCXsKKwkgICAgZGVmaW5lMihwc3ltcC0+c19uYW1lLCBwc3ltcC0+c192YWx1ZSwgJm1haW5pbmNsaXN0KTsKKwkgICAgcHN5bXArKzsKKwl9CisJaWYgKGFyZ2MgPT0gMiAmJiBhcmd2WzFdWzBdID09ICdAJykgeworCSAgICBzdHJ1Y3Qgc3RhdCBhc3Q7CisJICAgIGludCBhZmQ7CisJICAgIGNoYXIgKmFyZ3M7CisJICAgIGNoYXIgKipuYXJndjsKKwkgICAgaW50IG5hcmdjOworCSAgICBjaGFyIHF1b3RlY2hhciA9ICdcMCc7CisKKwkgICAgbmFyZ2MgPSAxOworCSAgICBpZiAoKGFmZCA9IG9wZW4oYXJndlsxXSsxLCBPX1JET05MWSkpIDwgMCkKKwkJZmF0YWxlcnIoImNhbm5vdCBvcGVuIFwiJXNcIlxuIiwgYXJndlsxXSsxKTsKKwkgICAgZnN0YXQoYWZkLCAmYXN0KTsKKwkgICAgYXJncyA9IChjaGFyICopbWFsbG9jKGFzdC5zdF9zaXplICsgMSk7CisJICAgIGlmICgoYXN0LnN0X3NpemUgPSByZWFkKGFmZCwgYXJncywgYXN0LnN0X3NpemUpKSA8IDApCisJCWZhdGFsZXJyKCJmYWlsZWQgdG8gcmVhZCAlc1xuIiwgYXJndlsxXSsxKTsKKwkgICAgYXJnc1thc3Quc3Rfc2l6ZV0gPSAnXDAnOworCSAgICBjbG9zZShhZmQpOworCSAgICBmb3IgKHAgPSBhcmdzOyAqcDsgcCsrKSB7CisJCWlmIChxdW90ZWNoYXIpIHsKKwkJICAgIGlmIChxdW90ZWNoYXIgPT0gJ1xcJyB8fAorCQkJKCpwID09IHF1b3RlY2hhciAmJiBwWy0xXSAhPSAnXFwnKSkKKwkJCXF1b3RlY2hhciA9ICdcMCc7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgJ1xcJzoKKwkJY2FzZSAnIic6CisJCWNhc2UgJ1wnJzoKKwkJICAgIHF1b3RlY2hhciA9ICpwOworCQkgICAgYnJlYWs7CisJCWNhc2UgJyAnOgorCQljYXNlICdcbic6CisJCSAgICAqcCA9ICdcMCc7CisJCSAgICBpZiAocCA+IGFyZ3MgJiYgcFstMV0pCisJCQluYXJnYysrOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBpZiAocFstMV0pCisJCW5hcmdjKys7CisJICAgIG5hcmd2ID0gKGNoYXIgKiopbWFsbG9jKG5hcmdjICogc2l6ZW9mKGNoYXIgKikpOworCSAgICBuYXJndlswXSA9IGFyZ3ZbMF07CisJICAgIGFyZ2MgPSAxOworCSAgICBmb3IgKHAgPSBhcmdzOyBhcmdjIDwgbmFyZ2M7IHAgKz0gc3RybGVuKHApICsgMSkKKwkJaWYgKCpwKSBuYXJndlthcmdjKytdID0gcDsKKwkgICAgYXJndiA9IG5hcmd2OworCX0KKwlmb3IoYXJnYy0tLCBhcmd2Kys7IGFyZ2M7IGFyZ2MtLSwgYXJndisrKSB7CisJICAgIAkvKiBpZiBsb29raW5nIGZvciBlbmRtYXJrZXIgdGhlbiBjaGVjayBiZWZvcmUgcGFyc2luZyAqLworCQlpZiAoZW5kbWFya2VyICYmIHN0cmNtcCAoZW5kbWFya2VyLCAqYXJndikgPT0gMCkgeworCQkgICAgZW5kbWFya2VyID0gTlVMTDsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJCWlmICgqKmFyZ3YgIT0gJy0nKSB7CisJCQkvKiB0cmVhdCArdGhpbmcgYXMgYW4gb3B0aW9uIGZvciBDKysgKi8KKwkJCWlmIChlbmRtYXJrZXIgJiYgKiphcmd2ID09ICcrJykKKwkJCQljb250aW51ZTsKKwkJCSpmcCsrID0gYXJndlswXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaChhcmd2WzBdWzFdKSB7CisJCWNhc2UgJy0nOgorCQkJZW5kbWFya2VyID0gJmFyZ3ZbMF1bMl07CisJCQlpZiAoZW5kbWFya2VyWzBdID09ICdcMCcpIGVuZG1hcmtlciA9ICItLSI7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCSAgICB7CisJCQlpbnQgb2Zmc2V0ID0gMjsKKwkJCWlmIChhcmd2WzBdWzJdID09ICdcMCcpIHsKKwkJCQlhcmd2Kys7CisJCQkJYXJnYy0tOworCQkJCW9mZnNldCA9IDA7CisJCQl9CisJCQlmb3IgKHA9YXJndlswXSArIG9mZnNldDsgKnAgOyBwKyspCisJCQkJaWYgKCpwID09ICc9JykgeworCQkJCQkqcCA9ICcgJzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZGVmaW5lKGFyZ3ZbMF0gKyBvZmZzZXQsICZtYWluaW5jbGlzdCk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJY2FzZSAnSSc6CisJCQlpZiAoaW5jcCA+PSBpbmNsdWRlZGlycyArIE1BWERJUlMpCisJCQkgICAgZmF0YWxlcnIoIlRvbyBtYW55IC1JIGZsYWdzLlxuIik7CisJCQkqaW5jcCsrID0gYXJndlswXSsyOworCQkJaWYgKCoqKGluY3AtMSkgPT0gJ1wwJykgeworCQkJCSooaW5jcC0xKSA9ICooKythcmd2KTsKKwkJCQlhcmdjLS07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnWSc6CisJCQlkZWZpbmNkaXIgPSBhcmd2WzBdKzI7CisJCQlicmVhazsKKwkJLyogZG8gbm90IHVzZSBpZiBlbmRtYXJrZXIgcHJvY2Vzc2luZyAqLworCQljYXNlICdhJzoKKwkJCWlmIChlbmRtYXJrZXIpIGJyZWFrOworCQkJYXBwZW5kID0gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCWlmIChlbmRtYXJrZXIpIGJyZWFrOworCQkJaWYgKGFyZ3ZbMF1bMl0gPT0gJ1wwJykgeworCQkJCWFyZ3YrKzsKKwkJCQlhcmdjLS07CisJCQkJd2lkdGggPSBhdG9pKGFyZ3ZbMF0pOworCQkJfSBlbHNlCisJCQkJd2lkdGggPSBhdG9pKGFyZ3ZbMF0rMik7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlpZiAoZW5kbWFya2VyKSBicmVhazsKKwkJCWlmIChhcmd2WzBdWzJdID09ICdcMCcpIHsKKwkJCQlhcmd2Kys7CisJCQkJYXJnYy0tOworCQkJCW9ianN1ZmZpeCA9IGFyZ3ZbMF07CisJCQl9IGVsc2UKKwkJCQlvYmpzdWZmaXggPSBhcmd2WzBdKzI7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlpZiAoZW5kbWFya2VyKSBicmVhazsKKwkJCWlmIChhcmd2WzBdWzJdID09ICdcMCcpIHsKKwkJCQlhcmd2Kys7CisJCQkJYXJnYy0tOworCQkJCW9ianByZWZpeCA9IGFyZ3ZbMF07CisJCQl9IGVsc2UKKwkJCQlvYmpwcmVmaXggPSBhcmd2WzBdKzI7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlpZiAoZW5kbWFya2VyKSBicmVhazsKKwkJCXZlcmJvc2UgPSBUUlVFOworI2lmZGVmIERFQlVHCisJCQlpZiAoYXJndlswXVsyXSkKKwkJCQlfZGVidWdtYXNrID0gYXRvaShhcmd2WzBdKzIpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQl3YXJuX211bHRpcGxlID0gVFJVRTsKKwkJCWJyZWFrOworCQkJCisJCS8qIElnbm9yZSAtTywgLWcgc28gd2UgY2FuIGp1c3QgcGFzcyAke0NGTEFHU30gdG8KKwkJICAgbWFrZWRlcGVuZAorCQkgKi8KKwkJY2FzZSAnTyc6CisJCWNhc2UgJ2cnOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoZW5kbWFya2VyKSBicmVhazsKKwkvKgkJZmF0YWxlcnIoInVua25vd24gb3B0ID0gJXNcbiIsIGFyZ3ZbMF0pOyAqLworCQkJd2FybmluZygiaWdub3Jpbmcgb3B0aW9uICVzXG4iLCBhcmd2WzBdKTsKKwkJfQorCX0KKwlpZiAoIWRlZmluY2RpcikgeworCX0gZWxzZSBpZiAoKmRlZmluY2RpcikgeworCSAgICBpZiAoaW5jcCA+PSBpbmNsdWRlZGlycyArIE1BWERJUlMpCisJCWZhdGFsZXJyKCJUb28gbWFueSAtSSBmbGFncy5cbiIpOworCSAgICAqaW5jcCsrID0gZGVmaW5jZGlyOworCX0KKworCS8qCisJICogY2F0Y2ggc2lnbmFscy4KKwkgKi8KKyNpZmRlZiBVU0dJU0gKKy8qICBzaG91bGQgcmVhbGx5IHJlc2V0IFNJR0lOVCB0byBTSUdfSUdOIGlmIGl0IHdhcy4gICovCisjaWZkZWYgU0lHSFVQCisJc2lnbmFsIChTSUdIVVAsIGNhdGNoKTsKKyNlbmRpZgorCXNpZ25hbCAoU0lHSU5ULCBjYXRjaCk7CisjaWZkZWYgU0lHUVVJVAorCXNpZ25hbCAoU0lHUVVJVCwgY2F0Y2gpOworI2VuZGlmCisJc2lnbmFsIChTSUdJTEwsIGNhdGNoKTsKKyNpZmRlZiBTSUdCVVMKKwlzaWduYWwgKFNJR0JVUywgY2F0Y2gpOworI2VuZGlmCisJc2lnbmFsIChTSUdTRUdWLCBjYXRjaCk7CisjaWZkZWYgU0lHU1lTCisJc2lnbmFsIChTSUdTWVMsIGNhdGNoKTsKKyNlbmRpZgorI2Vsc2UKKwlzaWdfYWN0LnNhX2hhbmRsZXIgPSBjYXRjaDsKKyNpZmRlZiBfUE9TSVhfU09VUkNFCisJc2lnZW1wdHlzZXQoJnNpZ19hY3Quc2FfbWFzayk7CisJc2lnYWRkc2V0KCZzaWdfYWN0LnNhX21hc2ssIFNJR0lOVCk7CisJc2lnYWRkc2V0KCZzaWdfYWN0LnNhX21hc2ssIFNJR1FVSVQpOworI2lmZGVmIFNJR0JVUworCXNpZ2FkZHNldCgmc2lnX2FjdC5zYV9tYXNrLCBTSUdCVVMpOworI2VuZGlmCisJc2lnYWRkc2V0KCZzaWdfYWN0LnNhX21hc2ssIFNJR0lMTCk7CisJc2lnYWRkc2V0KCZzaWdfYWN0LnNhX21hc2ssIFNJR1NFR1YpOworCXNpZ2FkZHNldCgmc2lnX2FjdC5zYV9tYXNrLCBTSUdIVVApOworCXNpZ2FkZHNldCgmc2lnX2FjdC5zYV9tYXNrLCBTSUdQSVBFKTsKKyNpZmRlZiBTSUdTWVMKKwlzaWdhZGRzZXQoJnNpZ19hY3Quc2FfbWFzaywgU0lHU1lTKTsKKyNlbmRpZgorI2Vsc2UKKwlzaWdfYWN0LnNhX21hc2sgPSAoKDE8PChTSUdJTlQgLTEpKQorCQkJICAgfCgxPDwoU0lHUVVJVC0xKSkKKyNpZmRlZiBTSUdCVVMKKwkJCSAgIHwoMTw8KFNJR0JVUy0xKSkKKyNlbmRpZgorCQkJICAgfCgxPDwoU0lHSUxMLTEpKQorCQkJICAgfCgxPDwoU0lHU0VHVi0xKSkKKwkJCSAgIHwoMTw8KFNJR0hVUC0xKSkKKwkJCSAgIHwoMTw8KFNJR1BJUEUtMSkpCisjaWZkZWYgU0lHU1lTCisJCQkgICB8KDE8PChTSUdTWVMtMSkpCisjZW5kaWYKKwkJCSAgICk7CisjZW5kaWYgLyogX1BPU0lYX1NPVVJDRSAqLworCXNpZ19hY3Quc2FfZmxhZ3MgPSAwOworCXNpZ2FjdGlvbihTSUdIVVAsICZzaWdfYWN0LCAoc3RydWN0IHNpZ2FjdGlvbiAqKTApOworCXNpZ2FjdGlvbihTSUdJTlQsICZzaWdfYWN0LCAoc3RydWN0IHNpZ2FjdGlvbiAqKTApOworCXNpZ2FjdGlvbihTSUdRVUlULCAmc2lnX2FjdCwgKHN0cnVjdCBzaWdhY3Rpb24gKikwKTsKKwlzaWdhY3Rpb24oU0lHSUxMLCAmc2lnX2FjdCwgKHN0cnVjdCBzaWdhY3Rpb24gKikwKTsKKyNpZmRlZiBTSUdCVVMKKwlzaWdhY3Rpb24oU0lHQlVTLCAmc2lnX2FjdCwgKHN0cnVjdCBzaWdhY3Rpb24gKikwKTsKKyNlbmRpZgorCXNpZ2FjdGlvbihTSUdTRUdWLCAmc2lnX2FjdCwgKHN0cnVjdCBzaWdhY3Rpb24gKikwKTsKKyNpZmRlZiBTSUdTWVMKKwlzaWdhY3Rpb24oU0lHU1lTLCAmc2lnX2FjdCwgKHN0cnVjdCBzaWdhY3Rpb24gKikwKTsKKyNlbmRpZgorI2VuZGlmIC8qIFVTR0lTSCAqLworCisJLyoKKwkgKiBub3cgcGVydXNlIHRocm91Z2ggdGhlIGxpc3Qgb2YgZmlsZXMuCisJICovCisJZm9yKGZwPWZpbGVsaXN0OyAqZnA7IGZwKyspIHsKKwkJY2hhciAqYmFzZSA9IGJhc2VfbmFtZSgqZnApOworCQljaGFyICpkZXBmaWxlID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGJhc2UpICsgMyk7CisJCXNwcmludGYoZGVwZmlsZSwiJXMuZCIsYmFzZSk7CisJCWlmICghZnJlb3BlbihkZXBmaWxlLCAid2IiLCBzdGRvdXQpKQorCQkgICAgZmF0YWxlcnIoImNhbm5vdCBvcGVuIFwiJXNcIlxuIiwgZGVwZmlsZSk7CisJCWZyZWUoZGVwZmlsZSk7CisJCWZyZWUoYmFzZSk7CisJCXByaW50ZWQgPSBGQUxTRTsKKwkJZmlsZWNvbnRlbnQgPSBnZXRmaWxlKCpmcCk7CisJCWlwID0gbmV3aW5jbHVkZSgqZnAsIChjaGFyICopTlVMTCk7CisKKwkJZmluZF9pbmNsdWRlcyhmaWxlY29udGVudCwgaXAsIGlwLCAwLCBUUlVFKTsKKwkJZnJlZWZpbGUoZmlsZWNvbnRlbnQpOworCQlyZWN1cnNpdmVfcHJfaW5jbHVkZShpcCwgaXAtPmlfZmlsZSwgYmFzZV9uYW1lKCpmcCkpOworCQlpbmNfY2xlYW4oKTsKKwkJaWYgKHByaW50ZWQpCisJCQlwcmludGYoIlxuIik7CisJfQorCWV4aXQoMCk7Cit9CisKK3N0cnVjdCBmaWxlcG9pbnRlciAqZ2V0ZmlsZShmaWxlKQorCWNoYXIJKmZpbGU7Cit7CisJcmVnaXN0ZXIgaW50CWZkOworCXN0cnVjdCBmaWxlcG9pbnRlcgkqY29udGVudDsKKwlzdHJ1Y3Qgc3RhdAlzdDsKKworCWNvbnRlbnQgPSAoc3RydWN0IGZpbGVwb2ludGVyICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlsZXBvaW50ZXIpKTsKKwlpZiAoKGZkID0gb3BlbihmaWxlLCBPX1JET05MWSkpIDwgMCkgeworCQl3YXJuaW5nKCJjYW5ub3Qgb3BlbiBcIiVzXCJcbiIsIGZpbGUpOworCQljb250ZW50LT5mX3AgPSBjb250ZW50LT5mX2Jhc2UgPSBjb250ZW50LT5mX2VuZCA9IChjaGFyICopbWFsbG9jKDEpOworCQkqY29udGVudC0+Zl9wID0gJ1wwJzsKKwkJcmV0dXJuKGNvbnRlbnQpOworCX0KKwlmc3RhdChmZCwgJnN0KTsKKwljb250ZW50LT5mX2Jhc2UgPSAoY2hhciAqKW1hbGxvYyhzdC5zdF9zaXplKzEpOworCWlmIChjb250ZW50LT5mX2Jhc2UgPT0gTlVMTCkKKwkJZmF0YWxlcnIoImNhbm5vdCBhbGxvY2F0ZSBtZW1cbiIpOworCWlmICgoc3Quc3Rfc2l6ZSA9IHJlYWQoZmQsIGNvbnRlbnQtPmZfYmFzZSwgc3Quc3Rfc2l6ZSkpIDwgMCkKKwkJZmF0YWxlcnIoImZhaWxlZCB0byByZWFkICVzXG4iLCBmaWxlKTsKKwljbG9zZShmZCk7CisJY29udGVudC0+Zl9sZW4gPSBzdC5zdF9zaXplKzE7CisJY29udGVudC0+Zl9wID0gY29udGVudC0+Zl9iYXNlOworCWNvbnRlbnQtPmZfZW5kID0gY29udGVudC0+Zl9iYXNlICsgc3Quc3Rfc2l6ZTsKKwkqY29udGVudC0+Zl9lbmQgPSAnXDAnOworCWNvbnRlbnQtPmZfbGluZSA9IDA7CisJcmV0dXJuKGNvbnRlbnQpOworfQorCitmcmVlZmlsZShmcCkKKwlzdHJ1Y3QgZmlsZXBvaW50ZXIJKmZwOworeworCWZyZWUoZnAtPmZfYmFzZSk7CisJZnJlZShmcCk7Cit9CisKK2NoYXIgKmNvcHkoc3RyKQorCXJlZ2lzdGVyIGNoYXIJKnN0cjsKK3sKKwlyZWdpc3RlciBjaGFyCSpwID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHN0cikgKyAxKTsKKworCXN0cmNweShwLCBzdHIpOworCXJldHVybihwKTsKK30KKworbWF0Y2goc3RyLCBsaXN0KQorCXJlZ2lzdGVyIGNoYXIJKnN0ciwgKipsaXN0OworeworCXJlZ2lzdGVyIGludAlpOworCisJZm9yIChpPTA7ICpsaXN0OyBpKyssIGxpc3QrKykKKwkJaWYgKHN0cmNtcChzdHIsICpsaXN0KSA9PSAwKQorCQkJcmV0dXJuKGkpOworCXJldHVybigtMSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIG5leHQgbGluZS4gIFdlIG9ubHkgcmV0dXJuIGxpbmVzIGJlZ2lubmluZyB3aXRoICcjJyBzaW5jZSB0aGF0CisgKiBpcyBhbGwgdGhpcyBwcm9ncmFtIGlzIGV2ZXIgaW50ZXJlc3RlZCBpbi4KKyAqLworY2hhciAqZ2V0bGluZShmaWxlcCkKKwlyZWdpc3RlciBzdHJ1Y3QgZmlsZXBvaW50ZXIJKmZpbGVwOworeworCXJlZ2lzdGVyIGNoYXIJKnAsCS8qIHdhbGtpbmcgcG9pbnRlciAqLworCQkJKmVvZiwJLyogZW5kIG9mIGZpbGUgcG9pbnRlciAqLworCQkJKmJvbDsJLyogYmVnaW5uaW5nIG9mIGxpbmUgcG9pbnRlciAqLworCXJlZ2lzdGVyCWxpbmVubzsJLyogbGluZSBudW1iZXIgKi8KKworCXAgPSBmaWxlcC0+Zl9wOworCWVvZiA9IGZpbGVwLT5mX2VuZDsKKwlpZiAocCA+PSBlb2YpCisJCXJldHVybigoY2hhciAqKU5VTEwpOworCWxpbmVubyA9IGZpbGVwLT5mX2xpbmU7CisKKwlmb3IoYm9sID0gcC0tOyArK3AgPCBlb2Y7ICkgeworCQlpZiAoKnAgPT0gJy8nICYmICoocCsxKSA9PSAnKicpIHsgLyogY29uc3VtZSBjb21tZW50cyAqLworCQkJKnArKyA9ICcgJywgKnArKyA9ICcgJzsKKwkJCXdoaWxlICgqcCkgeworCQkJCWlmICgqcCA9PSAnKicgJiYgKihwKzEpID09ICcvJykgeworCQkJCQkqcCsrID0gJyAnLCAqcCA9ICcgJzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UgaWYgKCpwID09ICdcbicpCisJCQkJCWxpbmVubysrOworCQkJCSpwKysgPSAnICc7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmICgqcCA9PSAnLycgJiYgKihwKzEpID09ICcvJykgeyAvKiBjb25zdW1lIGNvbW1lbnRzICovCisJCQkqcCsrID0gJyAnLCAqcCsrID0gJyAnOworCQkJd2hpbGUgKCpwICYmICpwICE9ICdcbicpCisJCQkJKnArKyA9ICcgJzsKKwkJCXAtLTsJLyogZ28gYmFjayB0byBiZWZvcmUgbmV3bGluZSAqLworCQkJbGluZW5vKys7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmICgqcCA9PSAnXFwnKSB7CisJCQlpZiAoKihwKzEpID09ICdcbicpIHsKKwkJCQkqcCA9ICcgJzsKKwkJCQkqKHArMSkgPSAnICc7CisJCQkJbGluZW5vKys7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKnAgPT0gJ1xuJykgeworCQkJbGluZW5vKys7CisJCQlpZiAoKmJvbCA9PSAnIycpIHsKKwkJCQlyZWdpc3RlciBjaGFyICpjcDsKKworCQkJCSpwKysgPSAnXDAnOworCQkJCS8qIHB1bnQgbGluZXMgd2l0aCBqdXN0ICMgKHlhY2MgZ2VuZXJhdGVkKSAqLworCQkJCWZvciAoY3AgPSBib2wrMTsgCisJCQkJICAgICAqY3AgJiYgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpOyBjcCsrKTsKKwkJCQlpZiAoKmNwKSBnb3RvIGRvbmU7CisJCQl9CisJCQlib2wgPSBwKzE7CisJCX0KKwl9CisJaWYgKCpib2wgIT0gJyMnKQorCQlib2wgPSBOVUxMOworZG9uZToKKwlmaWxlcC0+Zl9wID0gcDsKKwlmaWxlcC0+Zl9saW5lID0gbGluZW5vOworCXJldHVybihib2wpOworfQorCisvKgorICogU3RyaXAgdGhlIGZpbGUgbmFtZSBkb3duIHRvIHdoYXQgd2Ugd2FudCB0byBzZWUgaW4gdGhlIE1ha2VmaWxlLgorICogSXQgd2lsbCBoYXZlIG9ianByZWZpeCBhbmQgb2Jqc3VmZml4IGFyb3VuZCBpdC4KKyAqLworY2hhciAqYmFzZV9uYW1lKGZpbGUpCisJcmVnaXN0ZXIgY2hhcgkqZmlsZTsKK3sKKwlyZWdpc3RlciBjaGFyCSpwOworCisJZm9yKHA9ZmlsZStzdHJsZW4oZmlsZSk7IHA+ZmlsZSAmJiAqcCAhPSAnLycgJiYgKnAgIT0gJ1xcJzsgcC0tKSA7CisJaWYgKHA+ZmlsZSkgcCsrOworCWZpbGUgPSBjb3B5KHApOworCWZvcihwPWZpbGUrc3RybGVuKGZpbGUpOyBwPmZpbGUgJiYgKnAgIT0gJy4nOyBwLS0pIDsKKworCWlmICgqcCA9PSAnLicpCisJCSpwID0gJ1wwJzsKKwlyZXR1cm4oZmlsZSk7Cit9CisKKworI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcworZmF0YWxlcnIoY2hhciAqbXNnLCAuLi4pCisjZWxzZQorLypWQVJBUkdTKi8KK2ZhdGFsZXJyKG1zZyx4MSx4Mix4Myx4NCx4NSx4Nix4Nyx4OCx4OSkKKyAgICBjaGFyICptc2c7CisjZW5kaWYKK3sKKyNpZiBOZWVkVmFyYXJnc1Byb3RvdHlwZXMKKwl2YV9saXN0IGFyZ3M7CisjZW5kaWYKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvcjogICIsIFByb2dyYW1OYW1lKTsKKyNpZiBOZWVkVmFyYXJnc1Byb3RvdHlwZXMKKwl2YV9zdGFydChhcmdzLCBtc2cpOworCXZmcHJpbnRmKHN0ZGVyciwgbXNnLCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisjZWxzZQorCWZwcmludGYoc3RkZXJyLCBtc2cseDEseDIseDMseDQseDUseDYseDcseDgseDkpOworI2VuZGlmCisJZXhpdCAoMSk7Cit9CisKKyNpZiBOZWVkVmFyYXJnc1Byb3RvdHlwZXMKK3dhcm5pbmcoY2hhciAqbXNnLCAuLi4pCisjZWxzZQorLypWQVJBUkdTMCovCit3YXJuaW5nKG1zZyx4MSx4Mix4Myx4NCx4NSx4Nix4Nyx4OCx4OSkKKyAgICBjaGFyICptc2c7CisjZW5kaWYKK3sKKyNpZiBOZWVkVmFyYXJnc1Byb3RvdHlwZXMKKwl2YV9saXN0IGFyZ3M7CisjZW5kaWYKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nOiAgIiwgUHJvZ3JhbU5hbWUpOworI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcworCXZhX3N0YXJ0KGFyZ3MsIG1zZyk7CisJdmZwcmludGYoc3RkZXJyLCBtc2csIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKyNlbHNlCisJZnByaW50ZihzdGRlcnIsIG1zZyx4MSx4Mix4Myx4NCx4NSx4Nix4Nyx4OCx4OSk7CisjZW5kaWYKK30KKworI2lmIE5lZWRWYXJhcmdzUHJvdG90eXBlcword2FybmluZzEoY2hhciAqbXNnLCAuLi4pCisjZWxzZQorLypWQVJBUkdTMCovCit3YXJuaW5nMShtc2cseDEseDIseDMseDQseDUseDYseDcseDgseDkpCisgICAgY2hhciAqbXNnOworI2VuZGlmCit7CisjaWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCisJdmFfbGlzdCBhcmdzOworCXZhX3N0YXJ0KGFyZ3MsIG1zZyk7CisJdmZwcmludGYoc3RkZXJyLCBtc2csIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKyNlbHNlCisJZnByaW50ZihzdGRlcnIsIG1zZyx4MSx4Mix4Myx4NCx4NSx4Nix4Nyx4OCx4OSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3VuaXgvdm5jbWtkZXBlbmQvcGFyc2UuYyBiL3VuaXgvdm5jbWtkZXBlbmQvcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjliMmZlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNta2RlcGVuZC9wYXJzZS5jCkBAIC0wLDAgKzEsNTY4IEBACisvKiAkWENvbnNvcnRpdW06IHBhcnNlLmMsdiAxLjMwIDk0LzA0LzE3IDIwOjEwOjM4IGdpbGRlYSBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0ICBYIENvbnNvcnRpdW0KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvcnRpdW0uCisKKyovCisKKyNpbmNsdWRlICJkZWYuaCIKKworZXh0ZXJuIGNoYXIJKmRpcmVjdGl2ZXNbXTsKK2V4dGVybiBzdHJ1Y3QgaW5jbGlzdAltYWluaW5jbGlzdDsKKworZmluZF9pbmNsdWRlcyhmaWxlcCwgZmlsZSwgZmlsZV9yZWQsIHJlY3Vyc2lvbiwgZmFpbE9LKQorCXN0cnVjdCBmaWxlcG9pbnRlcgkqZmlsZXA7CisJc3RydWN0IGluY2xpc3QJCSpmaWxlLCAqZmlsZV9yZWQ7CisJaW50CQkJcmVjdXJzaW9uOworCWJvb2xlYW4JCQlmYWlsT0s7Cit7CisJcmVnaXN0ZXIgY2hhcgkqbGluZTsKKwlyZWdpc3RlciBpbnQJdHlwZTsKKwlib29sZWFuIHJlY2ZhaWxPSzsKKworCXdoaWxlIChsaW5lID0gZ2V0bGluZShmaWxlcCkpIHsKKwkJc3dpdGNoKHR5cGUgPSBkZWZ0eXBlKGxpbmUsIGZpbGVwLCBmaWxlX3JlZCwgZmlsZSwgVFJVRSkpIHsKKwkJY2FzZSBJRjoKKwkJZG9pZjoKKwkJCXR5cGUgPSBmaW5kX2luY2x1ZGVzKGZpbGVwLCBmaWxlLAorCQkJCWZpbGVfcmVkLCByZWN1cnNpb24rMSwgZmFpbE9LKTsKKwkJCXdoaWxlICgodHlwZSA9PSBFTElGKSB8fCAodHlwZSA9PSBFTElGRkFMU0UpIHx8CisJCQkgICAgICAgKHR5cGUgPT0gRUxJRkdVRVNTRkFMU0UpKQorCQkJCXR5cGUgPSBnb2JibGUoZmlsZXAsIGZpbGUsIGZpbGVfcmVkKTsKKwkJCWlmICh0eXBlID09IEVMU0UpCisJCQkJZ29iYmxlKGZpbGVwLCBmaWxlLCBmaWxlX3JlZCk7CisJCQlicmVhazsKKwkJY2FzZSBJRkZBTFNFOgorCQljYXNlIElGR1VFU1NGQUxTRToKKwkJICAgIGRvaWZmYWxzZToKKwkJCWlmICh0eXBlID09IElGR1VFU1NGQUxTRSB8fCB0eXBlID09IEVMSUZHVUVTU0ZBTFNFKQorCQkJICAgIHJlY2ZhaWxPSyA9IFRSVUU7CisJCQllbHNlCisJCQkgICAgcmVjZmFpbE9LID0gZmFpbE9LOworCQkJdHlwZSA9IGdvYmJsZShmaWxlcCwgZmlsZSwgZmlsZV9yZWQpOworCQkJaWYgKHR5cGUgPT0gRUxTRSkKKwkJCSAgICBmaW5kX2luY2x1ZGVzKGZpbGVwLCBmaWxlLAorCQkJCQkgIGZpbGVfcmVkLCByZWN1cnNpb24rMSwgcmVjZmFpbE9LKTsKKwkJCWVsc2UKKwkJCWlmICh0eXBlID09IEVMSUYpCisJCQkgICAgZ290byBkb2lmOworCQkJZWxzZQorCQkJaWYgKCh0eXBlID09IEVMSUZGQUxTRSkgfHwgKHR5cGUgPT0gRUxJRkdVRVNTRkFMU0UpKQorCQkJICAgIGdvdG8gZG9pZmZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgSUZERUY6CisJCWNhc2UgSUZOREVGOgorCQkJaWYgKCh0eXBlID09IElGREVGICYmIGlzZGVmaW5lZChsaW5lLCBmaWxlX3JlZCwgTlVMTCkpCisJCQkgfHwgKHR5cGUgPT0gSUZOREVGICYmICFpc2RlZmluZWQobGluZSwgZmlsZV9yZWQsIE5VTEwpKSkgeworCQkJCWRlYnVnKDEsKHR5cGUgPT0gSUZOREVGID8KKwkJCQkgICAgImxpbmUgJWQ6ICVzICFkZWYnZCBpbiAlcyB2aWEgJXMlc1xuIiA6ICIiLAorCQkJCSAgICBmaWxlcC0+Zl9saW5lLCBsaW5lLAorCQkJCSAgICBmaWxlLT5pX2ZpbGUsIGZpbGVfcmVkLT5pX2ZpbGUsICI6IGRvaXQiKSk7CisJCQkJdHlwZSA9IGZpbmRfaW5jbHVkZXMoZmlsZXAsIGZpbGUsCisJCQkJCWZpbGVfcmVkLCByZWN1cnNpb24rMSwgZmFpbE9LKTsKKwkJCQl3aGlsZSAodHlwZSA9PSBFTElGIHx8IHR5cGUgPT0gRUxJRkZBTFNFIHx8IHR5cGUgPT0gRUxJRkdVRVNTRkFMU0UpCisJCQkJCXR5cGUgPSBnb2JibGUoZmlsZXAsIGZpbGUsIGZpbGVfcmVkKTsKKwkJCQlpZiAodHlwZSA9PSBFTFNFKQorCQkJCQlnb2JibGUoZmlsZXAsIGZpbGUsIGZpbGVfcmVkKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWRlYnVnKDEsKHR5cGUgPT0gSUZERUYgPworCQkJCSAgICAibGluZSAlZDogJXMgIWRlZidkIGluICVzIHZpYSAlcyVzXG4iIDogIiIsCisJCQkJICAgIGZpbGVwLT5mX2xpbmUsIGxpbmUsCisJCQkJICAgIGZpbGUtPmlfZmlsZSwgZmlsZV9yZWQtPmlfZmlsZSwgIjogZ29iYmxlIikpOworCQkJCXR5cGUgPSBnb2JibGUoZmlsZXAsIGZpbGUsIGZpbGVfcmVkKTsKKwkJCQlpZiAodHlwZSA9PSBFTFNFKQorCQkJCQlmaW5kX2luY2x1ZGVzKGZpbGVwLCBmaWxlLAorCQkJCQkJZmlsZV9yZWQsIHJlY3Vyc2lvbisxLCBmYWlsT0spOworCQkJCWVsc2UgaWYgKHR5cGUgPT0gRUxJRikKKwkJCQkgICAgCWdvdG8gZG9pZjsKKwkJCQllbHNlIGlmICh0eXBlID09IEVMSUZGQUxTRSB8fCB0eXBlID09IEVMSUZHVUVTU0ZBTFNFKQorCQkJCSAgICAJZ290byBkb2lmZmFsc2U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBFTFNFOgorCQljYXNlIEVMSUZGQUxTRToKKwkJY2FzZSBFTElGR1VFU1NGQUxTRToKKwkJY2FzZSBFTElGOgorCQkJaWYgKCFyZWN1cnNpb24pCisJCQkJZ29iYmxlKGZpbGVwLCBmaWxlLCBmaWxlX3JlZCk7CisJCWNhc2UgRU5ESUY6CisJCQlpZiAocmVjdXJzaW9uKQorCQkJCXJldHVybih0eXBlKTsKKwkJY2FzZSBERUZJTkU6CisJCQlkZWZpbmUobGluZSwgZmlsZSk7CisJCQlicmVhazsKKwkJY2FzZSBVTkRFRjoKKwkJCWlmICghKmxpbmUpIHsKKwkJCSAgICB3YXJuaW5nKCIlcywgbGluZSAlZDogaW5jb21wbGV0ZSB1bmRlZiA9PSBcIiVzXCJcbiIsCisJCQkJZmlsZV9yZWQtPmlfZmlsZSwgZmlsZXAtPmZfbGluZSwgbGluZSk7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQl1bmRlZmluZShsaW5lLCBmaWxlX3JlZCk7CisJCQlicmVhazsKKwkJY2FzZSBJTkNMVURFOgorCQkJYWRkX2luY2x1ZGUoZmlsZXAsIGZpbGUsIGZpbGVfcmVkLCBsaW5lLCBGQUxTRSwgZmFpbE9LKTsKKwkJCWJyZWFrOworCQljYXNlIElOQ0xVREVET1Q6CisJCQlhZGRfaW5jbHVkZShmaWxlcCwgZmlsZSwgZmlsZV9yZWQsIGxpbmUsIFRSVUUsIGZhaWxPSyk7CisJCQlicmVhazsKKwkJY2FzZSBFUlJPUjoKKwkJICAgIAl3YXJuaW5nKCIoZnJvbSAlcykgJXM6ICVkOiAlc1xuIiwKKwkJCQlmaWxlX3JlZC0+aV9maWxlLCBmaWxlLT5pX2ZpbGUsCisJCQkJIGZpbGVwLT5mX2xpbmUsIGxpbmUpOworCQkgICAgCWJyZWFrOworCQkgICAgCisJCWNhc2UgUFJBR01BOgorCQljYXNlIElERU5UOgorCQljYXNlIFNDQ1M6CisJCWNhc2UgRUpFQ1Q6CisJCQlicmVhazsKKwkJY2FzZSAtMToKKwkJCXdhcm5pbmcoIiVzIiwgZmlsZV9yZWQtPmlfZmlsZSk7CisJCQlpZiAoZmlsZV9yZWQgIT0gZmlsZSkKKwkJCSAgICB3YXJuaW5nMSgiIChyZWFkaW5nICVzKSIsIGZpbGUtPmlfZmlsZSk7CisJCQl3YXJuaW5nMSgiLCBsaW5lICVkOiB1bmtub3duIGRpcmVjdGl2ZSA9PSBcIiVzXCJcbiIsCisJCQkJIGZpbGVwLT5mX2xpbmUsIGxpbmUpOworCQkJYnJlYWs7CisJCWNhc2UgLTI6CisJCQl3YXJuaW5nKCIlcyIsIGZpbGVfcmVkLT5pX2ZpbGUpOworCQkJaWYgKGZpbGVfcmVkICE9IGZpbGUpCisJCQkgICAgd2FybmluZzEoIiAocmVhZGluZyAlcykiLCBmaWxlLT5pX2ZpbGUpOworCQkJd2FybmluZzEoIiwgbGluZSAlZDogaW5jb21wbGV0ZSBpbmNsdWRlID09IFwiJXNcIlxuIiwKKwkJCQkgZmlsZXAtPmZfbGluZSwgbGluZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4oLTEpOworfQorCitnb2JibGUoZmlsZXAsIGZpbGUsIGZpbGVfcmVkKQorCXJlZ2lzdGVyIHN0cnVjdCBmaWxlcG9pbnRlciAqZmlsZXA7CisJc3RydWN0IGluY2xpc3QJCSpmaWxlLCAqZmlsZV9yZWQ7Cit7CisJcmVnaXN0ZXIgY2hhcgkqbGluZTsKKwlyZWdpc3RlciBpbnQJdHlwZTsKKworCXdoaWxlIChsaW5lID0gZ2V0bGluZShmaWxlcCkpIHsKKwkJc3dpdGNoKHR5cGUgPSBkZWZ0eXBlKGxpbmUsIGZpbGVwLCBmaWxlX3JlZCwgZmlsZSwgRkFMU0UpKSB7CisJCWNhc2UgSUY6CisJCWNhc2UgSUZGQUxTRToKKwkJY2FzZSBJRkdVRVNTRkFMU0U6CisJCWNhc2UgSUZERUY6CisJCWNhc2UgSUZOREVGOgorCQkJdHlwZSA9IGdvYmJsZShmaWxlcCwgZmlsZSwgZmlsZV9yZWQpOworCQkJd2hpbGUgKCh0eXBlID09IEVMSUYpIHx8ICh0eXBlID09IEVMSUZGQUxTRSkgfHwKKwkJCSAgICAgICAodHlwZSA9PSBFTElGR1VFU1NGQUxTRSkpCisJCQkgICAgdHlwZSA9IGdvYmJsZShmaWxlcCwgZmlsZSwgZmlsZV9yZWQpOworCQkJaWYgKHR5cGUgPT0gRUxTRSkKKwkJCSAgICAgICAgKHZvaWQpZ29iYmxlKGZpbGVwLCBmaWxlLCBmaWxlX3JlZCk7CisJCQlicmVhazsKKwkJY2FzZSBFTFNFOgorCQljYXNlIEVORElGOgorCQkJZGVidWcoMCwoIiVzLCBsaW5lICVkOiAjJXNcbiIsCisJCQkJZmlsZS0+aV9maWxlLCBmaWxlcC0+Zl9saW5lLAorCQkJCWRpcmVjdGl2ZXNbdHlwZV0pKTsKKwkJCXJldHVybih0eXBlKTsKKwkJY2FzZSBERUZJTkU6CisJCWNhc2UgVU5ERUY6CisJCWNhc2UgSU5DTFVERToKKwkJY2FzZSBJTkNMVURFRE9UOgorCQljYXNlIFBSQUdNQToKKwkJY2FzZSBFUlJPUjoKKwkJY2FzZSBJREVOVDoKKwkJY2FzZSBTQ0NTOgorCQljYXNlIEVKRUNUOgorCQkJYnJlYWs7CisJCWNhc2UgRUxJRjoKKwkJY2FzZSBFTElGRkFMU0U6CisJCWNhc2UgRUxJRkdVRVNTRkFMU0U6CisJCQlyZXR1cm4odHlwZSk7CisJCWNhc2UgLTE6CisJCQl3YXJuaW5nKCIlcywgbGluZSAlZDogdW5rbm93biBkaXJlY3RpdmUgPT0gXCIlc1wiXG4iLAorCQkJCWZpbGVfcmVkLT5pX2ZpbGUsIGZpbGVwLT5mX2xpbmUsIGxpbmUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuKC0xKTsKK30KKworLyoKKyAqIERlY2lkZSB3aGF0IHR5cGUgb2YgIyBkaXJlY3RpdmUgdGhpcyBsaW5lIGlzLgorICovCitpbnQgZGVmdHlwZSAobGluZSwgZmlsZXAsIGZpbGVfcmVkLCBmaWxlLCBwYXJzZV9pdCkKKwlyZWdpc3RlciBjaGFyCSpsaW5lOworCXJlZ2lzdGVyIHN0cnVjdCBmaWxlcG9pbnRlciAqZmlsZXA7CisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QgKmZpbGVfcmVkLCAqZmlsZTsKKwlpbnQJcGFyc2VfaXQ7Cit7CisJcmVnaXN0ZXIgY2hhcgkqcDsKKwljaGFyCSpkaXJlY3RpdmUsIHNhdmVjaGFyOworCXJlZ2lzdGVyIGludAlyZXQ7CisKKwkvKgorCSAqIFBhcnNlIHRoZSBkaXJlY3RpdmUuLi4KKwkgKi8KKwlkaXJlY3RpdmU9bGluZSsxOworCXdoaWxlICgqZGlyZWN0aXZlID09ICcgJyB8fCAqZGlyZWN0aXZlID09ICdcdCcpCisJCWRpcmVjdGl2ZSsrOworCisJcCA9IGRpcmVjdGl2ZTsKKwl3aGlsZSAoKnAgPj0gJ2EnICYmICpwIDw9ICd6JykKKwkJcCsrOworCXNhdmVjaGFyID0gKnA7CisJKnAgPSAnXDAnOworCXJldCA9IG1hdGNoKGRpcmVjdGl2ZSwgZGlyZWN0aXZlcyk7CisJKnAgPSBzYXZlY2hhcjsKKworCS8qIElmIHdlIGRvbid0IHJlY29nbml6ZSB0aGlzIGNvbXBpbGVyIGRpcmVjdGl2ZSBvciB3ZSBoYXBwZW4gdG8ganVzdAorCSAqIGJlIGdvYmJsaW5nIHVwIHRleHQgd2hpbGUgd2FpdGluZyBmb3IgYW4gI2VuZGlmIG9yICNlbGlmIG9yICNlbHNlCisJICogaW4gdGhlIGNhc2Ugb2YgYW4gI2VsaWYgd2UgbXVzdCBjaGVjayB0aGUgemVyb192YWx1ZSBhbmQgcmV0dXJuIGFuCisJICogRUxJRiBvciBhbiBFTElGRkFMU0UuCisJICovCisKKwlpZiAocmV0ID09IEVMSUYgJiYgIXBhcnNlX2l0KQorCXsKKwkgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQlwKys7CisJICAgIC8qCisJICAgICAqIHBhcnNlIGFuIGV4cHJlc3Npb24uCisJICAgICAqLworCSAgICBkZWJ1ZygwLCgiJXMsIGxpbmUgJWQ6ICNlbGlmICVzICIsCisJCSAgIGZpbGUtPmlfZmlsZSwgZmlsZXAtPmZfbGluZSwgcCkpOworCSAgICByZXQgPSB6ZXJvX3ZhbHVlKHAsIGZpbGVwLCBmaWxlX3JlZCk7CisJICAgIGlmIChyZXQgIT0gSUYpCisJICAgIHsKKwkJZGVidWcoMCwoImZhbHNlLi4uXG4iKSk7CisJCWlmIChyZXQgPT0gSUZGQUxTRSkKKwkJICAgIHJldHVybihFTElGRkFMU0UpOworCQllbHNlCisJCSAgICByZXR1cm4oRUxJRkdVRVNTRkFMU0UpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlkZWJ1ZygwLCgidHJ1ZS4uLlxuIikpOworCQlyZXR1cm4oRUxJRik7CisJICAgIH0KKwl9CisKKwlpZiAocmV0IDwgMCB8fCAhIHBhcnNlX2l0KQorCQlyZXR1cm4ocmV0KTsKKworCS8qCisJICogbm93IGRlY2lkZSBob3cgdG8gcGFyc2UgdGhlIGRpcmVjdGl2ZSwgYW5kIGRvIGl0LgorCSAqLworCXdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkJcCsrOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBJRjoKKwkJLyoKKwkJICogcGFyc2UgYW4gZXhwcmVzc2lvbi4KKwkJICovCisJCXJldCA9IHplcm9fdmFsdWUocCwgZmlsZXAsIGZpbGVfcmVkKTsKKwkJZGVidWcoMCwoIiVzLCBsaW5lICVkOiAlcyAjaWYgJXNcbiIsCisJCQkgZmlsZS0+aV9maWxlLCBmaWxlcC0+Zl9saW5lLCByZXQ/ImZhbHNlIjoidHJ1ZSIsIHApKTsKKwkJYnJlYWs7CisJY2FzZSBJRkRFRjoKKwljYXNlIElGTkRFRjoKKwkJZGVidWcoMCwoIiVzLCBsaW5lICVkOiAjJXMgJXNcbiIsCisJCQlmaWxlLT5pX2ZpbGUsIGZpbGVwLT5mX2xpbmUsIGRpcmVjdGl2ZXNbcmV0XSwgcCkpOworCWNhc2UgVU5ERUY6CisJCS8qCisJCSAqIHNlcGFyYXRlIHRoZSBuYW1lIG9mIGEgc2luZ2xlIHN5bWJvbC4KKwkJICovCisJCXdoaWxlIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpCisJCQkqbGluZSsrID0gKnArKzsKKwkJKmxpbmUgPSAnXDAnOworCQlicmVhazsKKwljYXNlIElOQ0xVREU6CisJCWRlYnVnKDIsKCIlcywgbGluZSAlZDogI2luY2x1ZGUgJXNcbiIsCisJCQlmaWxlLT5pX2ZpbGUsIGZpbGVwLT5mX2xpbmUsIHApKTsKKworCQkvKiBTdXBwb3J0IEFOU0kgbWFjcm8gc3Vic3RpdHV0aW9uICovCisJCXsKKwkJICAgIHN0cnVjdCBzeW10YWIgKnN5bSA9IGlzZGVmaW5lZChwLCBmaWxlX3JlZCwgTlVMTCk7CisJCSAgICB3aGlsZSAoc3ltKSB7CisJCQlwID0gc3ltLT5zX3ZhbHVlOworCQkJZGVidWcoMywoIiVzIDogI2luY2x1ZGVzIFNZTUJPTCAlcyA9ICVzXG4iLAorCQkJICAgICAgIGZpbGUtPmlfaW5jc3RyaW5nLAorCQkJICAgICAgIHN5bSAtPiBzX25hbWUsCisJCQkgICAgICAgc3ltIC0+IHNfdmFsdWUpKTsKKwkJCS8qIG1hcmsgZmlsZSBhcyBoYXZpbmcgaW5jbHVkZWQgYSAnc29mdCBpbmNsdWRlJyAqLworCQkJZmlsZS0+aV9pbmNsdWRlZF9zeW0gPSBUUlVFOyAKKwkJCXN5bSA9IGlzZGVmaW5lZChwLCBmaWxlX3JlZCwgTlVMTCk7CisJCSAgICB9CisJCX0KKworCQkvKgorCQkgKiBTZXBhcmF0ZSB0aGUgbmFtZSBvZiB0aGUgaW5jbHVkZSBmaWxlLgorCQkgKi8KKwkJd2hpbGUgKCpwICYmICpwICE9ICciJyAmJiAqcCAhPSAnPCcpCisJCQlwKys7CisJCWlmICghICpwKQorCQkJcmV0dXJuKC0yKTsKKwkJaWYgKCpwKysgPT0gJyInKSB7CisJCQlyZXQgPSBJTkNMVURFRE9UOworCQkJd2hpbGUgKCpwICYmICpwICE9ICciJykKKwkJCQkqbGluZSsrID0gKnArKzsKKwkJfSBlbHNlCisJCQl3aGlsZSAoKnAgJiYgKnAgIT0gJz4nKQorCQkJCSpsaW5lKysgPSAqcCsrOworCQkqbGluZSA9ICdcMCc7CisJCWJyZWFrOworCWNhc2UgREVGSU5FOgorCQkvKgorCQkgKiBjb3B5IHRoZSBkZWZpbml0aW9uIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KKwkJICovCisJCXN0cmNweSAobGluZSwgcCk7CisJCWJyZWFrOworCWNhc2UgRUxTRToKKwljYXNlIEVORElGOgorCWNhc2UgRUxJRjoKKwljYXNlIFBSQUdNQToKKwljYXNlIEVSUk9SOgorCWNhc2UgSURFTlQ6CisJY2FzZSBTQ0NTOgorCWNhc2UgRUpFQ1Q6CisJCWRlYnVnKDAsKCIlcywgbGluZSAlZDogIyVzXG4iLAorCQkJZmlsZS0+aV9maWxlLCBmaWxlcC0+Zl9saW5lLCBkaXJlY3RpdmVzW3JldF0pKTsKKwkJLyoKKwkJICogbm90aGluZyB0byBkby4KKwkJICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4ocmV0KTsKK30KKworc3RydWN0IHN5bXRhYiAqaXNkZWZpbmVkKHN5bWJvbCwgZmlsZSwgc3JjZmlsZSkKKwlyZWdpc3RlciBjaGFyCSpzeW1ib2w7CisJc3RydWN0IGluY2xpc3QJKmZpbGU7CisJc3RydWN0IGluY2xpc3QJKipzcmNmaWxlOworeworCXJlZ2lzdGVyIHN0cnVjdCBzeW10YWIJKnZhbDsKKworCWlmICh2YWwgPSBzbG9va3VwKHN5bWJvbCwgJm1haW5pbmNsaXN0KSkgeworCQlkZWJ1ZygxLCgiJXMgZGVmaW5lZCBvbiBjb21tYW5kIGxpbmVcbiIsIHN5bWJvbCkpOworCQlpZiAoc3JjZmlsZSAhPSBOVUxMKSAqc3JjZmlsZSA9ICZtYWluaW5jbGlzdDsKKwkJcmV0dXJuKHZhbCk7CisJfQorCWlmICh2YWwgPSBmZGVmaW5lZChzeW1ib2wsIGZpbGUsIHNyY2ZpbGUpKQorCQlyZXR1cm4odmFsKTsKKwlkZWJ1ZygxLCgiJXMgbm90IGRlZmluZWQgaW4gJXNcbiIsIHN5bWJvbCwgZmlsZS0+aV9maWxlKSk7CisJcmV0dXJuKE5VTEwpOworfQorCitzdHJ1Y3Qgc3ltdGFiICpmZGVmaW5lZChzeW1ib2wsIGZpbGUsIHNyY2ZpbGUpCisJcmVnaXN0ZXIgY2hhcgkqc3ltYm9sOworCXN0cnVjdCBpbmNsaXN0CSpmaWxlOworCXN0cnVjdCBpbmNsaXN0CSoqc3JjZmlsZTsKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgaW5jbGlzdAkqKmlwOworCXJlZ2lzdGVyIHN0cnVjdCBzeW10YWIJKnZhbDsKKwlyZWdpc3RlciBpbnQJaTsKKwlzdGF0aWMgaW50CXJlY3Vyc2VfbHZsID0gMDsKKworCWlmIChmaWxlLT5pX2RlZmNoZWNrZWQpCisJCXJldHVybihOVUxMKTsKKwlmaWxlLT5pX2RlZmNoZWNrZWQgPSBUUlVFOworCWlmICh2YWwgPSBzbG9va3VwKHN5bWJvbCwgZmlsZSkpCisJCWRlYnVnKDEsKCIlcyBkZWZpbmVkIGluICVzIGFzICVzXG4iLCBzeW1ib2wsIGZpbGUtPmlfZmlsZSwgdmFsLT5zX3ZhbHVlKSk7CisJaWYgKHZhbCA9PSBOVUxMICYmIGZpbGUtPmlfbGlzdCkKKwkJeworCQlmb3IgKGlwID0gZmlsZS0+aV9saXN0LCBpPTA7IGkgPCBmaWxlLT5pX2xpc3RsZW47IGkrKywgaXArKykKKwkJCWlmICh2YWwgPSBmZGVmaW5lZChzeW1ib2wsICppcCwgc3JjZmlsZSkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCWVsc2UgaWYgKHZhbCAhPSBOVUxMICYmIHNyY2ZpbGUgIT0gTlVMTCkgKnNyY2ZpbGUgPSBmaWxlOworCXJlY3Vyc2VfbHZsLS07CisJZmlsZS0+aV9kZWZjaGVja2VkID0gRkFMU0U7CisKKwlyZXR1cm4odmFsKTsKK30KKworLyoKKyAqIFJldHVybiB0eXBlIGJhc2VkIG9uIGlmIHRoZSAjaWYgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gMAorICovCit6ZXJvX3ZhbHVlKGV4cCwgZmlsZXAsIGZpbGVfcmVkKQorCXJlZ2lzdGVyIGNoYXIJKmV4cDsKKwlyZWdpc3RlciBzdHJ1Y3QgZmlsZXBvaW50ZXIgKmZpbGVwOworCXJlZ2lzdGVyIHN0cnVjdCBpbmNsaXN0ICpmaWxlX3JlZDsKK3sKKwlpZiAoY3Bwc2V0dXAoZXhwLCBmaWxlcCwgZmlsZV9yZWQpKQorCSAgICByZXR1cm4oSUZGQUxTRSk7CisJZWxzZQorCSAgICByZXR1cm4oSUYpOworfQorCitkZWZpbmUoZGVmLCBmaWxlKQorCWNoYXIJKmRlZjsKKwlzdHJ1Y3QgaW5jbGlzdAkqZmlsZTsKK3sKKyAgICBjaGFyICp2YWw7CisKKyAgICAvKiBTZXBhcmF0ZSBzeW1ib2wgbmFtZSBhbmQgaXRzIHZhbHVlICovCisgICAgdmFsID0gZGVmOworICAgIHdoaWxlIChpc2FsbnVtKCp2YWwpIHx8ICp2YWwgPT0gJ18nKQorCXZhbCsrOworICAgIGlmICgqdmFsKQorCSp2YWwrKyA9ICdcMCc7CisgICAgd2hpbGUgKCp2YWwgPT0gJyAnIHx8ICp2YWwgPT0gJ1x0JykKKwl2YWwrKzsKKworICAgIGlmICghKnZhbCkKKwl2YWwgPSAiMSI7CisgICAgZGVmaW5lMihkZWYsIHZhbCwgZmlsZSk7Cit9CisKK2RlZmluZTIobmFtZSwgdmFsLCBmaWxlKQorCWNoYXIJKm5hbWUsICp2YWw7CisJc3RydWN0IGluY2xpc3QJKmZpbGU7Cit7CisgICAgaW50IGZpcnN0LCBsYXN0LCBiZWxvdzsKKyAgICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzcCA9IE5VTEwsICpkZXN0OworCisgICAgLyogTWFrZSBzcGFjZSBpZiBpdCdzIG5lZWRlZCAqLworICAgIGlmIChmaWxlLT5pX2RlZnMgPT0gTlVMTCkKKyAgICB7CisJZmlsZS0+aV9kZWZzID0gKHN0cnVjdCBzeW10YWIgKikKKwkJCW1hbGxvYyhzaXplb2YgKHN0cnVjdCBzeW10YWIpICogU1lNVEFCSU5DKTsKKwlmaWxlLT5pX2RlZmxlbiA9IFNZTVRBQklOQzsKKwlmaWxlLT5pX25kZWZzID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoZmlsZS0+aV9uZGVmcyA9PSBmaWxlLT5pX2RlZmxlbikKKwlmaWxlLT5pX2RlZnMgPSAoc3RydWN0IHN5bXRhYiAqKQorCQkJcmVhbGxvYyhmaWxlLT5pX2RlZnMsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzeW10YWIpKihmaWxlLT5pX2RlZmxlbis9U1lNVEFCSU5DKSk7CisKKyAgICBpZiAoZmlsZS0+aV9kZWZzID09IE5VTEwpCisJZmF0YWxlcnIoIm1hbGxvYygpL3JlYWxsb2MoKSBmYWlsdXJlIGluIGluc2VydF9kZWZuKClcbiIpOworCisgICAgYmVsb3cgPSBmaXJzdCA9IDA7CisgICAgbGFzdCA9IGZpbGUtPmlfbmRlZnMgLSAxOworICAgIHdoaWxlIChsYXN0ID49IGZpcnN0KQorICAgIHsKKwkvKiBGYXN0IGlubGluZSBiaW5hcnkgc2VhcmNoICovCisJcmVnaXN0ZXIgY2hhciAqczE7CisJcmVnaXN0ZXIgY2hhciAqczI7CisJcmVnaXN0ZXIgaW50IG1pZGRsZSA9IChmaXJzdCArIGxhc3QpIC8gMjsKKworCS8qIEZhc3QgaW5saW5lIHN0cmNocigpICovCisJczEgPSBuYW1lOworCXMyID0gZmlsZS0+aV9kZWZzW21pZGRsZV0uc19uYW1lOworCXdoaWxlICgqczErKyA9PSAqczIrKykKKwkgICAgaWYgKHMyWy0xXSA9PSAnXDAnKSBicmVhazsKKworCS8qIElmIGV4YWN0IG1hdGNoLCBzZXQgc3AgYW5kIGJyZWFrICovCisJaWYgKCotLXMxID09ICotLXMyKSAKKwl7CisJICAgIHNwID0gZmlsZS0+aV9kZWZzICsgbWlkZGxlOworCSAgICBicmVhazsKKwl9CisKKwkvKiBJZiBuYW1lID4gaV9kZWZzW21pZGRsZV0gLi4uICovCisJaWYgKCpzMSA+ICpzMikgCisJeworCSAgICBiZWxvdyA9IGZpcnN0OworCSAgICBmaXJzdCA9IG1pZGRsZSArIDE7CisJfQorCS8qIGVsc2UgLi4uICovCisJZWxzZQorCXsKKwkgICAgYmVsb3cgPSBsYXN0ID0gbWlkZGxlIC0gMTsKKwl9CisgICAgfQorCisgICAgLyogU2VhcmNoIGlzIGRvbmUuICBJZiB3ZSBmb3VuZCBhbiBleGFjdCBtYXRjaCB0byB0aGUgc3ltYm9sIG5hbWUsCisgICAgICAganVzdCByZXBsYWNlIGl0cyBzX3ZhbHVlICovCisgICAgaWYgKHNwICE9IE5VTEwpCisgICAgeworCWZyZWUoc3AtPnNfdmFsdWUpOworCXNwLT5zX3ZhbHVlID0gY29weSh2YWwpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzcCA9IGZpbGUtPmlfZGVmcyArIGZpbGUtPmlfbmRlZnMrKzsKKyAgICBkZXN0ID0gZmlsZS0+aV9kZWZzICsgYmVsb3cgKyAxOworICAgIHdoaWxlIChzcCA+IGRlc3QpCisgICAgeworCSpzcCA9IHNwWy0xXTsKKwlzcC0tOworICAgIH0KKyAgICBzcC0+c19uYW1lID0gY29weShuYW1lKTsKKyAgICBzcC0+c192YWx1ZSA9IGNvcHkodmFsKTsKK30KKworc3RydWN0IHN5bXRhYiAqc2xvb2t1cChzeW1ib2wsIGZpbGUpCisJcmVnaXN0ZXIgY2hhcgkqc3ltYm9sOworCXJlZ2lzdGVyIHN0cnVjdCBpbmNsaXN0CSpmaWxlOworeworCXJlZ2lzdGVyIGludCBmaXJzdCA9IDA7CisJcmVnaXN0ZXIgaW50IGxhc3QgPSBmaWxlLT5pX25kZWZzIC0gMTsKKworCWlmIChmaWxlKSB3aGlsZSAobGFzdCA+PSBmaXJzdCkKKwl7CisJICAgIC8qIEZhc3QgaW5saW5lIGJpbmFyeSBzZWFyY2ggKi8KKwkgICAgcmVnaXN0ZXIgY2hhciAqczE7CisJICAgIHJlZ2lzdGVyIGNoYXIgKnMyOworCSAgICByZWdpc3RlciBpbnQgbWlkZGxlID0gKGZpcnN0ICsgbGFzdCkgLyAyOworCisJICAgIC8qIEZhc3QgaW5saW5lIHN0cmNocigpICovCisJICAgIHMxID0gc3ltYm9sOworCSAgICBzMiA9IGZpbGUtPmlfZGVmc1ttaWRkbGVdLnNfbmFtZTsKKwkgICAgd2hpbGUgKCpzMSsrID09ICpzMisrKQorCSAgICAgICAgaWYgKHMyWy0xXSA9PSAnXDAnKSBicmVhazsKKworCSAgICAvKiBJZiBleGFjdCBtYXRjaCwgd2UncmUgZG9uZSAqLworCSAgICBpZiAoKi0tczEgPT0gKi0tczIpIAorCSAgICB7CisJICAgICAgICByZXR1cm4gZmlsZS0+aV9kZWZzICsgbWlkZGxlOworCSAgICB9CisKKwkgICAgLyogSWYgc3ltYm9sID4gaV9kZWZzW21pZGRsZV0gLi4uICovCisJICAgIGlmICgqczEgPiAqczIpIAorCSAgICB7CisJICAgICAgICBmaXJzdCA9IG1pZGRsZSArIDE7CisJICAgIH0KKwkgICAgLyogZWxzZSAuLi4gKi8KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgICBsYXN0ID0gbWlkZGxlIC0gMTsKKwkgICAgfQorCX0KKwlyZXR1cm4oTlVMTCk7Cit9CisKK3VuZGVmaW5lKHN5bWJvbCwgZmlsZSkKKwljaGFyCSpzeW1ib2w7CisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QJKmZpbGU7Cit7CisJcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqcHRyOworCXN0cnVjdCBpbmNsaXN0ICpzcmNmaWxlOworCXdoaWxlICgocHRyID0gaXNkZWZpbmVkKHN5bWJvbCwgZmlsZSwgJnNyY2ZpbGUpKSAhPSBOVUxMKQorCXsKKwkgICAgc3JjZmlsZS0+aV9uZGVmcy0tOworCSAgICBmb3IgKDsgcHRyIDwgc3JjZmlsZS0+aV9kZWZzICsgc3JjZmlsZS0+aV9uZGVmczsgcHRyKyspCisJCSpwdHIgPSBwdHJbMV07CisJfQorfQpkaWZmIC0tZ2l0IGEvdW5peC92bmNta2RlcGVuZC9wci5jIGIvdW5peC92bmNta2RlcGVuZC9wci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODA0NmQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY21rZGVwZW5kL3ByLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qICRYQ29uc29ydGl1bTogcHIuYyx2IDEuMTcgOTQvMDQvMTcgMjA6MTA6MzggZ2lsZGVhIEV4cCAkICovCisvKgorCitDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQgIFggQ29uc29ydGl1bQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK1ggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29ydGl1bS4KKworKi8KKworI2luY2x1ZGUgImRlZi5oIgorCitleHRlcm4gc3RydWN0CWluY2xpc3QJaW5jbGlzdFsgTUFYRklMRVMgXSwKKwkJCSppbmNsaXN0cDsKK2V4dGVybiBjaGFyCSpvYmpwcmVmaXg7CitleHRlcm4gY2hhcgkqb2Jqc3VmZml4OworZXh0ZXJuIGludAl3aWR0aDsKK2V4dGVybiBib29sZWFuCXByaW50ZWQ7CitleHRlcm4gYm9vbGVhbgl2ZXJib3NlOworZXh0ZXJuIGJvb2xlYW4Jc2hvd193aGVyZV9ub3Q7CisKK2FkZF9pbmNsdWRlKGZpbGVwLCBmaWxlLCBmaWxlX3JlZCwgaW5jbHVkZSwgZG90LCBmYWlsT0spCisJc3RydWN0IGZpbGVwb2ludGVyCSpmaWxlcDsKKwlzdHJ1Y3QgaW5jbGlzdAkqZmlsZSwgKmZpbGVfcmVkOworCWNoYXIJKmluY2x1ZGU7CisJYm9vbGVhbglkb3Q7Cit7CisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QJKm5ld2ZpbGU7CisJcmVnaXN0ZXIgc3RydWN0IGZpbGVwb2ludGVyCSpjb250ZW50OworCisJLyoKKwkgKiBGaXJzdCBkZWNpZGUgd2hhdCB0aGUgcGF0aG5hbWUgb2YgdGhpcyBpbmNsdWRlIGZpbGUgcmVhbGx5IGlzLgorCSAqLworCW5ld2ZpbGUgPSBpbmNfcGF0aChmaWxlLT5pX2ZpbGUsIGluY2x1ZGUsIGRvdCk7CisJaWYgKG5ld2ZpbGUgPT0gTlVMTCkgeworCQlpZiAoZmFpbE9LKQorCQkgICAgcmV0dXJuOworCQlpZiAoZmlsZSAhPSBmaWxlX3JlZCkKKwkJCXdhcm5pbmcoIiVzIChyZWFkaW5nICVzLCBsaW5lICVkKTogIiwKKwkJCQlmaWxlX3JlZC0+aV9maWxlLCBmaWxlLT5pX2ZpbGUsIGZpbGVwLT5mX2xpbmUpOworCQllbHNlCisJCQl3YXJuaW5nKCIlcywgbGluZSAlZDogIiwgZmlsZS0+aV9maWxlLCBmaWxlcC0+Zl9saW5lKTsKKwkJd2FybmluZzEoImNhbm5vdCBmaW5kIGluY2x1ZGUgZmlsZSBcIiVzXCJcbiIsIGluY2x1ZGUpOworCQlzaG93X3doZXJlX25vdCA9IFRSVUU7CisJCW5ld2ZpbGUgPSBpbmNfcGF0aChmaWxlLT5pX2ZpbGUsIGluY2x1ZGUsIGRvdCk7CisJCXNob3dfd2hlcmVfbm90ID0gRkFMU0U7CisJfQorCisJaWYgKG5ld2ZpbGUpIHsKKwkJaW5jbHVkZWRfYnkoZmlsZSwgbmV3ZmlsZSk7CisJCWlmICghbmV3ZmlsZS0+aV9zZWFyY2hlZCkgeworCQkJbmV3ZmlsZS0+aV9zZWFyY2hlZCA9IFRSVUU7CisJCQljb250ZW50ID0gZ2V0ZmlsZShuZXdmaWxlLT5pX2ZpbGUpOworCQkJZmluZF9pbmNsdWRlcyhjb250ZW50LCBuZXdmaWxlLCBmaWxlX3JlZCwgMCwgZmFpbE9LKTsKKwkJCWZyZWVmaWxlKGNvbnRlbnQpOworCQl9CisJfQorfQorCityZWN1cnNpdmVfcHJfaW5jbHVkZShoZWFkLCBmaWxlLCBiYXNlKQorCXJlZ2lzdGVyIHN0cnVjdCBpbmNsaXN0CSpoZWFkOworCXJlZ2lzdGVyIGNoYXIJKmZpbGUsICpiYXNlOworeworCXJlZ2lzdGVyIGludAlpOworCisJaWYgKGhlYWQtPmlfbWFya2VkKQorCQlyZXR1cm47CisJaGVhZC0+aV9tYXJrZWQgPSBUUlVFOworCWlmIChoZWFkLT5pX2ZpbGUgIT0gZmlsZSkKKwkJcHIoaGVhZCwgZmlsZSwgYmFzZSk7CisJZm9yIChpPTA7IGk8aGVhZC0+aV9saXN0bGVuOyBpKyspCisJCXJlY3Vyc2l2ZV9wcl9pbmNsdWRlKGhlYWQtPmlfbGlzdFsgaSBdLCBmaWxlLCBiYXNlKTsKK30KKworcHIoaXAsIGZpbGUsIGJhc2UpCisJcmVnaXN0ZXIgc3RydWN0IGluY2xpc3QgICppcDsKKwljaGFyCSpmaWxlLCAqYmFzZTsKK3sKKwlzdGF0aWMgY2hhcgkqbGFzdGZpbGU7CisJcmVnaXN0ZXIgaW50CWxlbiwgaTsKKwljaGFyCWJ1ZlsgQlVGU0laIF07CisjaWZkZWYgV0lOMzIKKwljaGFyICp0cmFuc2ZpbGUgPSBUcmFuc2xhdGVGaWxlTmFtZUQyVShpcC0+aV9maWxlLDApOworI2Vsc2UKKwljaGFyICp0cmFuc2ZpbGUgPSBpcC0+aV9maWxlOworI2VuZGlmCisKKwlwcmludGVkID0gVFJVRTsKKwlpZiAoZmlsZSAhPSBsYXN0ZmlsZSkgeworCQlsYXN0ZmlsZSA9IGZpbGU7CisJCXNwcmludGYoYnVmLCAiJXMlcyVzICVzLmQ6ICVzIiwgb2JqcHJlZml4LCBiYXNlLCBvYmpzdWZmaXgsCisJCQliYXNlLCB0cmFuc2ZpbGUpOworCX0KKwllbHNlIHsKKwkJc3ByaW50ZihidWYsICIgXFxcbiAlcyIsIHRyYW5zZmlsZSk7CisJfQorCWZ3cml0ZShidWYsIHN0cmxlbihidWYpLCAxLCBzdGRvdXQpOworCisJLyoKKwkgKiBJZiB2ZXJib3NlIGlzIHNldCwgdGhlbiBwcmludCBvdXQgd2hhdCB0aGlzIGZpbGUgaW5jbHVkZXMuCisJICovCisJaWYgKCEgdmVyYm9zZSB8fCBpcC0+aV9saXN0ID09IE5VTEwgfHwgaXAtPmlfbm90aWZpZWQpCisJCXJldHVybjsKKwlpcC0+aV9ub3RpZmllZCA9IFRSVUU7CisJbGFzdGZpbGUgPSBOVUxMOworCXByaW50ZigiXG4jICVzIGluY2x1ZGVzOiIsIHRyYW5zZmlsZSk7CisJZm9yIChpPTA7IGk8aXAtPmlfbGlzdGxlbjsgaSsrKQorCQlwcmludGYoIlxuI1x0JXMiLCBpcC0+aV9saXN0WyBpIF0tPmlfaW5jc3RyaW5nKTsKKyNpZmRlZiBXSU4zMgorCWZyZWUodHJhbnNmaWxlKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdW5peC92bmNwYXNzd2QvTWFrZWZpbGUuaW4gYi91bml4L3ZuY3Bhc3N3ZC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjdhN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNwYXNzd2QvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxOCBAQAorCitTUkNTID0gdm5jcGFzc3dkLmN4eAorCitPQkpTID0gdm5jcGFzc3dkLm8KKworcHJvZ3JhbSA9IHZuY3Bhc3N3ZAorCitERVBfTElCUyA9IC4uL3JmYi9saWJyZmIuYQorCitESVJfQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikKKworYWxsOjogJChwcm9ncmFtKQorCiskKHByb2dyYW0pOiAkKE9CSlMpICQoREVQX0xJQlMpCisJcm0gLWYgJChwcm9ncmFtKQorCSQoQ1hYTEQpICQoQ1hYRkxBR1MpICQoTERGTEFHUykgLW8gJEAgJChPQkpTKSAkKERFUF9MSUJTKSAkKExJQlMpCisKKyMgZm9sbG93ZWQgYnkgYm9pbGVycGxhdGUubWsKZGlmZiAtLWdpdCBhL3VuaXgvdm5jcGFzc3dkL3ZuY3Bhc3N3ZC5jeHggYi91bml4L3ZuY3Bhc3N3ZC92bmNwYXNzd2QuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODk4NzkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY3Bhc3N3ZC92bmNwYXNzd2QuY3h4CkBAIC0wLDAgKzEsMTM4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHJmYi9QYXNzd29yZC5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisKKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworY2hhciogcHJvZzsKKworc3RhdGljIHZvaWQgdXNhZ2UoKQoreworICBmcHJpbnRmKHN0ZGVyciwidXNhZ2U6ICVzIFtmaWxlXVxuIixwcm9nKTsKKyAgZXhpdCgxKTsKK30KKworCitzdGF0aWMgdm9pZCBlbmFibGVFY2hvKGJvb2wgZW5hYmxlKSB7CisgIHRlcm1pb3MgYXR0cnM7CisgIHRjZ2V0YXR0cihmaWxlbm8oc3RkaW4pLCAmYXR0cnMpOworICBpZiAoZW5hYmxlKQorICAgIGF0dHJzLmNfbGZsYWcgfD0gRUNITzsKKyAgZWxzZQorICAgIGF0dHJzLmNfbGZsYWcgJj0gfkVDSE87CisgIGF0dHJzLmNfbGZsYWcgfD0gRUNIT05MOworICB0Y3NldGF0dHIoZmlsZW5vKHN0ZGluKSwgVENTQUZMVVNILCAmYXR0cnMpOworfQorCitzdGF0aWMgY2hhciogZ2V0cGFzc3dvcmQoY29uc3QgY2hhciogcHJvbXB0KSB7CisgIFBsYWluUGFzc3dkIGJ1ZigyNTYpOworICBmcHV0cyhwcm9tcHQsIHN0ZG91dCk7CisgIGVuYWJsZUVjaG8oZmFsc2UpOworICBjaGFyKiByZXN1bHQgPSBmZ2V0cyhidWYuYnVmLCAyNTYsIHN0ZGluKTsKKyAgZW5hYmxlRWNobyh0cnVlKTsKKyAgaWYgKHJlc3VsdCkgeworICAgIGlmIChyZXN1bHRbc3RybGVuKHJlc3VsdCktMV0gPT0gJ1xuJykKKyAgICAgIHJlc3VsdFtzdHJsZW4ocmVzdWx0KS0xXSA9IDA7CisgICAgcmV0dXJuIGJ1Zi50YWtlQnVmKCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICBwcm9nID0gYXJndlswXTsKKworICBjaGFyKiBmbmFtZSA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItcSIpID09IDApIHsgLy8gYWxsb3dlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nKSB7CisgICAgICB1c2FnZSgpOworICAgIH0gZWxzZSBpZiAoIWZuYW1lKSB7CisgICAgICBmbmFtZSA9IGFyZ3ZbaV07CisgICAgfSBlbHNlIHsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICB9CisKKyAgaWYgKCFmbmFtZSkgeworICAgIGlmICghZ2V0ZW52KCJIT01FIikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCJIT01FIGlzIG5vdCBzZXRcbiIpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZm5hbWUgPSBuZXcgY2hhcltzdHJsZW4oZ2V0ZW52KCJIT01FIikpICsgMjBdOworICAgIHNwcmludGYoZm5hbWUsICIlcy8udm5jIiwgZ2V0ZW52KCJIT01FIikpOworICAgIG1rZGlyKGZuYW1lLCAwNzc3KTsKKyAgICBzcHJpbnRmKGZuYW1lLCAiJXMvLnZuYy9wYXNzd2QiLCBnZXRlbnYoIkhPTUUiKSk7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworICAgIFBsYWluUGFzc3dkIHBhc3N3ZChnZXRwYXNzd29yZCgiUGFzc3dvcmQ6IikpOworICAgIGlmICghcGFzc3dkLmJ1ZikgeworICAgICAgcGVycm9yKCJnZXRwYXNzd29yZCBlcnJvciIpOworICAgICAgZXhpdCgxKTsKKyAgICB9ICAgCisgICAgaWYgKHN0cmxlbihwYXNzd2QuYnVmKSA8IDYpIHsKKyAgICAgIGlmIChzdHJsZW4ocGFzc3dkLmJ1ZikgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiUGFzc3dvcmQgbm90IGNoYW5nZWRcbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsIlBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIC0gdHJ5IGFnYWluXG4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFBsYWluUGFzc3dkIHBhc3N3ZDIoZ2V0cGFzc3dvcmQoIlZlcmlmeToiKSk7CisgICAgaWYgKCFwYXNzd2QyLmJ1ZikgeworICAgICAgcGVycm9yKCJnZXRwYXNzIGVycm9yIik7CisgICAgICBleGl0KDEpOworICAgIH0gICAKKyAgICBpZiAoc3RyY21wKHBhc3N3ZC5idWYsIHBhc3N3ZDIuYnVmKSAhPSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiUGFzc3dvcmRzIGRvbid0IG1hdGNoIC0gdHJ5IGFnYWluXG4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZm9wZW4oZm5hbWUsInciKTsKKyAgICBpZiAoIWZwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiQ291bGRuJ3Qgb3BlbiAlcyBmb3Igd3JpdGluZ1xuIixmbmFtZSk7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICBjaG1vZChmbmFtZSwgU19JUlVTUnxTX0lXVVNSKTsKKworICAgIE9iZnVzY2F0ZWRQYXNzd2Qgb2JmdXNjYXRlZChwYXNzd2QpOworCisgICAgaWYgKGZ3cml0ZShvYmZ1c2NhdGVkLmJ1Ziwgb2JmdXNjYXRlZC5sZW5ndGgsIDEsIGZwKSAhPSAxKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiV3JpdGluZyB0byAlcyBmYWlsZWRcbiIsZm5hbWUpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBmY2xvc2UoZnApOworCisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3VuaXgvdm5jcGFzc3dkL3ZuY3Bhc3N3ZC5tYW4gYi91bml4L3ZuY3Bhc3N3ZC92bmNwYXNzd2QubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDY4NzQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY3Bhc3N3ZC92bmNwYXNzd2QubWFuCkBAIC0wLDAgKzEsNDMgQEAKKy5USCB2bmNwYXNzd2QgMSAiMDUgTWF5IDIwMDYiICJUaWdodFZOQyIgIlZpcnR1YWwgTmV0d29yayBDb21wdXRpbmciCisuU0ggTkFNRQordm5jcGFzc3dkIFwtIGNoYW5nZSBhIFZOQyBwYXNzd29yZAorLlNIIFNZTk9QU0lTCisuQiB2bmNwYXNzd2QKKy5SSSBbIHBhc3N3ZC1maWxlIF0KKy5TSCBERVNDUklQVElPTgorLkIgdm5jcGFzc3dkCithbGxvd3MgeW91IHRvIHNldCB0aGUgcGFzc3dvcmQgdXNlZCB0byBhY2Nlc3MgVk5DIGRlc2t0b3BzLiAgSXQgc3RvcmVzIGFuCitvYmZ1c2NhdGVkIHZlcnNpb24gb2YgdGhlIHBhc3N3b3JkIGluIHRoZSBnaXZlbiBmaWxlIChkZWZhdWx0CiskSE9NRS8udm5jL3Bhc3N3ZCkuICBUaGUgXGZCdm5jc2VydmVyXGZQIHNjcmlwdCBydW5zIFxmQnZuY3Bhc3N3ZFxmUCB0aGUgZmlyc3QKK3RpbWUgeW91IHN0YXJ0IGEgVk5DIGRlc2t0b3AsIGFuZCBpbnZva2VzIFxmQlh2bmNcZlAgd2l0aCB0aGUgYXBwcm9wcmlhdGUKK1xmQlwtcmZiYXV0aFxmUCBvcHRpb24uICBcZkJ2bmN2aWV3ZXJcZlAgY2FuIGFsc28gYmUgZ2l2ZW4gYSBwYXNzd29yZCBmaWxlIHRvCit1c2UgdmlhIHRoZSBcZkJcLXBhc3N3ZFxmUCBvcHRpb24uCisKK1RoZSBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0IHNpeCBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBvbmx5IHRoZSBmaXJzdCBlaWdodAorY2hhcmFjdGVycyBhcmUgc2lnbmlmaWNhbnQuICBOb3RlIHRoYXQgdGhlIHN0b3JlZCBwYXNzd29yZCBpcyBcZkJub3RcZlAKK2VuY3J5cHRlZCBzZWN1cmVseSAtIGFueW9uZSB3aG8gaGFzIGFjY2VzcyB0byB0aGlzIGZpbGUgY2FuIHRyaXZpYWxseSBmaW5kIG91dAordGhlIHBsYWludGV4dCBwYXNzd29yZCwgc28gXGZCdm5jcGFzc3dkXGZQIGFsd2F5cyBzZXRzIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zCisocmVhZCBhbmQgd3JpdGUgb25seSBieSB0aGUgb3duZXIpLiAgSG93ZXZlciwgd2hlbiBhY2Nlc3NpbmcgYSBWTkMgZGVza3RvcCBhCitjaGFsbGVuZ2UtcmVzcG9uc2UgbWVjaGFuaXNtIGlzIHVzZWQgb3ZlciB0aGUgd2lyZSBtYWtpbmcgaXQgaGFyZCBmb3IgYW55b25lIHRvCitjcmFjayB0aGUgcGFzc3dvcmQgc2ltcGx5IGJ5IHNub29waW5nIG9uIHRoZSBuZXR3b3JrLgorCisuU0ggRklMRVMKKy5UUAorJEhPTUUvLnZuYy9wYXNzd2QKK0RlZmF1bHQgbG9jYXRpb24gb2YgdGhlIFZOQyBwYXNzd29yZCBmaWxlLgorCisuU0ggU0VFIEFMU08KKy5CUiB2bmN2aWV3ZXIgKDEpLAorLkJSIHZuY3NlcnZlciAoMSksCisuQlIgWHZuYyAoMSkKKy5CUiB2bmNjb25maWcgKDEpLAorLmJyCitodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbQorCisuU0ggQVVUSE9SCitUcmlzdGFuIFJpY2hhcmRzb24sIFJlYWxWTkMgTHRkLgorCitWTkMgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IHRoZSBSZWFsVk5DIHRlYW0gd2hpbGUgYXQgT2xpdmV0dGkKK1Jlc2VhcmNoIEx0ZCAvIEFUJlQgTGFib3JhdG9yaWVzIENhbWJyaWRnZS4gIFRpZ2h0Vk5DIGFkZGl0aW9ucyB3YXMKK2ltcGxlbWVudGVkIGJ5IENvbnN0YW50aW4gS2FwbGluc2t5LiBNYW55IG90aGVyIHBlb3BsZSBwYXJ0aWNpcGF0ZWQgaW4KK2RldmVsb3BtZW50LCB0ZXN0aW5nIGFuZCBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvdW5peC92bmNzZXJ2ZXIgYi91bml4L3ZuY3NlcnZlcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNmZlNTRhCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNzZXJ2ZXIKQEAgLTAsMCArMSw1NzAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLgorIyAgQ29weXJpZ2h0IChDKSAxOTk5IEFUJlQgTGFib3JhdG9yaWVzIENhbWJyaWRnZS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorIyAgVVNBLgorIworCisjCisjIHZuY3NlcnZlciAtIHdyYXBwZXIgc2NyaXB0IHRvIHN0YXJ0IGFuIFggVk5DIHNlcnZlci4KKyMKKworIworIyBGaXJzdCBtYWtlIHN1cmUgd2UncmUgb3BlcmF0aW5nIGluIGEgc2FuZSBlbnZpcm9ubWVudC4KKyMKKworJlNhbml0eUNoZWNrKCk7CisKKyMKKyMgR2xvYmFsIHZhcmlhYmxlcy4gIFlvdSBtYXkgd2FudCB0byBjb25maWd1cmUgc29tZSBvZiB0aGVzZSBmb3IgeW91ciBzaXRlLgorIworCiskZ2VvbWV0cnkgPSAiMTAyNHg3NjgiOworJGRlcHRoID0gMTY7Ciskdm5jSmF2YUZpbGVzID0gKCgoLWQgIi91c3Ivc2hhcmUvdm5jL2NsYXNzZXMiKSAmJiAiL3Vzci9zaGFyZS92bmMvY2xhc3NlcyIpIHx8CisgICAgICAgICAgICAgICAgICgoLWQgIi91c3IvbG9jYWwvdm5jL2NsYXNzZXMiKSAmJiAiL3Vzci9sb2NhbC92bmMvY2xhc3NlcyIpKTsKKyR2bmNVc2VyRGlyID0gIiRFTlZ7SE9NRX0vLnZuYyI7CiskeGF1dGhvcml0eUZpbGUgPSAiJEVOVntYQVVUSE9SSVRZfSIgfHwgIiRFTlZ7SE9NRX0vLlhhdXRob3JpdHkiOworCiskZGVmYXVsdFhTdGFydHVwCisgICAgPSAoIiMhL2Jpbi9zaFxuXG4iLgorICAgICAgICJbIC1yIFwkSE9NRS8uWHJlc291cmNlcyBdICYmIHhyZGIgXCRIT01FLy5YcmVzb3VyY2VzXG4iLgorICAgICAgICJ4c2V0cm9vdCAtc29saWQgZ3JleVxuIi4KKyAgICAgICAidm5jY29uZmlnIC1pY29uaWMgJlxuIi4KKyAgICAgICAieHRlcm0gLWdlb21ldHJ5IDgweDI0KzEwKzEwIC1scyAtdGl0bGUgXCJcJFZOQ0RFU0tUT1AgRGVza3RvcFwiICZcbiIuCisgICAgICAgInR3bSAmXG4iKTsKKworY2hvcCgkaG9zdCA9IGB1bmFtZSAtbmApOworCisKKyMgQ2hlY2sgY29tbWFuZCBsaW5lIG9wdGlvbnMKKworJlBhcnNlT3B0aW9ucygiLWdlb21ldHJ5IiwxLCItZGVwdGgiLDEsIi1waXhlbGZvcm1hdCIsMSwiLW5hbWUiLDEsIi1raWxsIiwxLAorCSAgICAgICItaGVscCIsMCwiLWgiLDAsIi0taGVscCIsMCk7CisKKyZVc2FnZSgpIGlmICgkb3B0eyctaGVscCd9IHx8ICRvcHR7Jy1oJ30gfHwgJG9wdHsnLS1oZWxwJ30pOworCismS2lsbCgpIGlmICgkb3B0eycta2lsbCd9KTsKKworIyBVbmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IGRlZmF1bHQgZ2VvbWV0cnksIGRlcHRoIGFuZCBwaXhlbGZvcm1hdAorIyB0byBtYXRjaCB0aGUgY3VycmVudCBYIGRpc3BsYXk6CisjICZHZXRYRGlzcGxheURlZmF1bHRzKCk7CisKK2lmICgkb3B0eyctZ2VvbWV0cnknfSkgeworICAgICRnZW9tZXRyeSA9ICRvcHR7Jy1nZW9tZXRyeSd9OworfQoraWYgKCRvcHR7Jy1kZXB0aCd9KSB7CisgICAgJGRlcHRoID0gJG9wdHsnLWRlcHRoJ307CisgICAgJHBpeGVsZm9ybWF0ID0gIiI7Cit9CitpZiAoJG9wdHsnLXBpeGVsZm9ybWF0J30pIHsKKyAgICAkcGl4ZWxmb3JtYXQgPSAkb3B0eyctcGl4ZWxmb3JtYXQnfTsKK30KKworJkNoZWNrR2VvbWV0cnlBbmREZXB0aCgpOworCisKKyMgQ3JlYXRlIHRoZSB1c2VyJ3Mgdm5jIGRpcmVjdG9yeSBpZiBuZWNlc3NhcnkuCisKK2lmICghKC1lICR2bmNVc2VyRGlyKSkgeworICAgIGlmICghbWtkaXIoJHZuY1VzZXJEaXIsMDc1NSkpIHsKKwlkaWUgIiRwcm9nOiBDb3VsZCBub3QgY3JlYXRlICR2bmNVc2VyRGlyLlxuIjsKKyAgICB9Cit9CisgICAgCisjIE1ha2Ugc3VyZSB0aGUgdXNlciBoYXMgYSBwYXNzd29yZC4KKworKCR6LCR6LCRtb2RlKSA9IHN0YXQoIiR2bmNVc2VyRGlyL3Bhc3N3ZCIpOworaWYgKCEoLWUgIiR2bmNVc2VyRGlyL3Bhc3N3ZCIpIHx8ICgkbW9kZSAmIDA3NykpIHsKKyAgICB3YXJuICJcbllvdSB3aWxsIHJlcXVpcmUgYSBwYXNzd29yZCB0byBhY2Nlc3MgeW91ciBkZXNrdG9wcy5cblxuIjsKKyAgICBzeXN0ZW0oInZuY3Bhc3N3ZCAtcSAkdm5jVXNlckRpci9wYXNzd2QiKTsgCisgICAgaWYgKCgkPyA+PiA4KSAhPSAwKSB7CisJZXhpdCAxOworICAgIH0KK30KKworIyBGaW5kIGRpc3BsYXkgbnVtYmVyLgorCitpZiAoKEBBUkdWID4gMCkgJiYgKCRBUkdWWzBdID1+IC9eOihcZCspJC8pKSB7CisgICAgJGRpc3BsYXlOdW1iZXIgPSAkMTsKKyAgICBzaGlmdChAQVJHVik7CisgICAgaWYgKCEmQ2hlY2tEaXNwbGF5TnVtYmVyKCRkaXNwbGF5TnVtYmVyKSkgeworCWRpZSAiQSBWTkMgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyBhcyA6JGRpc3BsYXlOdW1iZXJcbiI7CisgICAgfQorfSBlbHNpZiAoKEBBUkdWID4gMCkgJiYgKCRBUkdWWzBdICF+IC9eLS8pKSB7CisgICAgJlVzYWdlKCk7Cit9IGVsc2UgeworICAgICRkaXNwbGF5TnVtYmVyID0gJkdldERpc3BsYXlOdW1iZXIoKTsKK30KKworJHZuY1BvcnQgPSA1OTAwICsgJGRpc3BsYXlOdW1iZXI7CisKKyRkZXNrdG9wTG9nID0gIiR2bmNVc2VyRGlyLyRob3N0OiRkaXNwbGF5TnVtYmVyLmxvZyI7Cit1bmxpbmsoJGRlc2t0b3BMb2cpOworCisjIE1ha2UgYW4gWCBzZXJ2ZXIgY29va2llIC0gdXNlIGFzIHRoZSBzZWVkIHRoZSBzdW0gb2YgdGhlIGN1cnJlbnQgdGltZSwgb3VyCisjIFBJRCBhbmQgcGFydCBvZiB0aGUgZW5jcnlwdGVkIGZvcm0gb2YgdGhlIHBhc3N3b3JkLiAgSWRlYWxseSB3ZSdkIHVzZQorIyAvZGV2L3VyYW5kb20sIGJ1dCB0aGF0J3Mgb25seSBhdmFpbGFibGUgb24gTGludXguCisKK3NyYW5kKHRpbWUrJCQrdW5wYWNrKCJMIixgY2F0ICR2bmNVc2VyRGlyL3Bhc3N3ZGApKTsKKyRjb29raWUgPSAiIjsKK2ZvciAoMS4uMTYpIHsKKyAgICAkY29va2llIC49IHNwcmludGYoIiUwMngiLCBpbnQocmFuZCgyNTYpKSAlIDI1Nik7Cit9CisgICAgCitzeXN0ZW0oInhhdXRoIC1mICR4YXV0aG9yaXR5RmlsZSBhZGQgJGhvc3Q6JGRpc3BsYXlOdW1iZXIgLiAkY29va2llIik7CitzeXN0ZW0oInhhdXRoIC1mICR4YXV0aG9yaXR5RmlsZSBhZGQgJGhvc3QvdW5peDokZGlzcGxheU51bWJlciAuICRjb29raWUiKTsgCisKK2lmICgkb3B0eyctbmFtZSd9KSB7CisgICAgJGRlc2t0b3BOYW1lID0gJG9wdHsnLW5hbWUnfTsKK30gZWxzZSB7CisgICAgJGRlc2t0b3BOYW1lID0gIiRob3N0OiRkaXNwbGF5TnVtYmVyICgkRU5We1VTRVJ9KSI7Cit9CisKKyMgTm93IHN0YXJ0IHRoZSBYIFZOQyBTZXJ2ZXIKKworJGNtZCA9ICJYdm5jIDokZGlzcGxheU51bWJlciI7CiskY21kIC49ICIgLWRlc2t0b3AgIiAuICZxdW90ZWRTdHJpbmcoJGRlc2t0b3BOYW1lKTsKKyRjbWQgLj0gIiAtaHR0cGQgJHZuY0phdmFGaWxlcyIgaWYgKCR2bmNKYXZhRmlsZXMpOworJGNtZCAuPSAiIC1hdXRoICR4YXV0aG9yaXR5RmlsZSI7CiskY21kIC49ICIgLWdlb21ldHJ5ICRnZW9tZXRyeSIgaWYgKCRnZW9tZXRyeSk7CiskY21kIC49ICIgLWRlcHRoICRkZXB0aCIgaWYgKCRkZXB0aCk7CiskY21kIC49ICIgLXBpeGVsZm9ybWF0ICRwaXhlbGZvcm1hdCIgaWYgKCRwaXhlbGZvcm1hdCk7CiskY21kIC49ICIgLXJmYndhaXQgMzAwMDAiOworJGNtZCAuPSAiIC1yZmJhdXRoICR2bmNVc2VyRGlyL3Bhc3N3ZCI7CiskY21kIC49ICIgLXJmYnBvcnQgJHZuY1BvcnQiOworJGNtZCAuPSAiIC1wbiI7CisKKyMgQWRkIGZvbnQgcGF0aCBhbmQgY29sb3IgZGF0YWJhc2Ugc3R1ZmYgaGVyZSwgZS5nLjoKKyMKKyMgJGNtZCAuPSAiIC1mcCAvdXNyL2xpYi9YMTEvZm9udHMvbWlzYy8sL3Vzci9saWIvWDExL2ZvbnRzLzc1ZHBpLyI7CisjICRjbWQgLj0gIiAtY28gL3Vzci9saWIvWDExL3JnYiI7CisjCisKK2ZvcmVhY2ggJGFyZyAoQEFSR1YpIHsKKyAgICAkY21kIC49ICIgIiAuICZxdW90ZWRTdHJpbmcoJGFyZyk7Cit9CiskY21kIC49ICIgPj4gIiAuICZxdW90ZWRTdHJpbmcoJGRlc2t0b3BMb2cpIC4gIiAyPiYxIjsKKworIyBSdW4gJGNtZCBhbmQgcmVjb3JkIHRoZSBwcm9jZXNzIElELgorCiskcGlkRmlsZSA9ICIkdm5jVXNlckRpci8kaG9zdDokZGlzcGxheU51bWJlci5waWQiOworc3lzdGVtKCIkY21kICYgZWNobyBcJCEgPiRwaWRGaWxlIik7CisKKyMgR2l2ZSBYdm5jIGEgY2hhbmNlIHRvIHN0YXJ0IHVwCisKK3NsZWVwKDMpOyAKKword2FybiAiXG5OZXcgJyRkZXNrdG9wTmFtZScgZGVza3RvcCBpcyAkaG9zdDokZGlzcGxheU51bWJlclxuXG4iOworCisjIENyZWF0ZSB0aGUgdXNlcidzIHhzdGFydHVwIHNjcmlwdCBpZiBuZWNlc3NhcnkuCisKK2lmICghKC1lICIkdm5jVXNlckRpci94c3RhcnR1cCIpKSB7CisgICAgd2FybiAiQ3JlYXRpbmcgZGVmYXVsdCBzdGFydHVwIHNjcmlwdCAkdm5jVXNlckRpci94c3RhcnR1cFxuIjsKKyAgICBvcGVuKFhTVEFSVFVQLCAiPiR2bmNVc2VyRGlyL3hzdGFydHVwIik7CisgICAgcHJpbnQgWFNUQVJUVVAgJGRlZmF1bHRYU3RhcnR1cDsKKyAgICBjbG9zZShYU1RBUlRVUCk7CisgICAgY2htb2QgMDc1NSwgIiR2bmNVc2VyRGlyL3hzdGFydHVwIjsKK30KKworIyBSdW4gdGhlIFggc3RhcnR1cCBzY3JpcHQuCisKK3dhcm4gIlN0YXJ0aW5nIGFwcGxpY2F0aW9ucyBzcGVjaWZpZWQgaW4gJHZuY1VzZXJEaXIveHN0YXJ0dXBcbiI7Cit3YXJuICJMb2cgZmlsZSBpcyAkZGVza3RvcExvZ1xuXG4iOworCisjIElmIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgZXhpc3RzIHRoZW4gdXNlIHRoYXQgKERJU1BMQVk9Om4pIG90aGVyd2lzZSB1c2UKKyMgVENQIChESVNQTEFZPWhvc3Q6bikKKworaWYgKC1lICIvdG1wLy5YMTEtdW5peC9YJGRpc3BsYXlOdW1iZXIiIHx8CisgICAgLWUgIi91c3Ivc3Bvb2wvc29ja2V0cy9YMTEvJGRpc3BsYXlOdW1iZXIiKQoreworICAgICRFTlZ7RElTUExBWX09ICI6JGRpc3BsYXlOdW1iZXIiOworfSBlbHNlIHsKKyAgICAkRU5We0RJU1BMQVl9PSAiJGhvc3Q6JGRpc3BsYXlOdW1iZXIiOworfQorJEVOVntWTkNERVNLVE9QfT0gJGRlc2t0b3BOYW1lOworCitzeXN0ZW0oIiR2bmNVc2VyRGlyL3hzdGFydHVwID4+ICIgLiAmcXVvdGVkU3RyaW5nKCRkZXNrdG9wTG9nKSAuICIgMj4mMSAmIik7CisKK2V4aXQ7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDaGVja0dlb21ldHJ5QW5kRGVwdGggc2ltcGx5IG1ha2VzIHN1cmUgdGhhdCB0aGUgZ2VvbWV0cnkgYW5kIGRlcHRoIHZhbHVlcworIyBhcmUgc2Vuc2libGUuCisjCisKK3N1YiBDaGVja0dlb21ldHJ5QW5kRGVwdGgKK3sKKyAgICBpZiAoJGdlb21ldHJ5ID1+IC9eKFxkKyl4KFxkKykkLykgeworCSR3aWR0aCA9ICQxOyAkaGVpZ2h0ID0gJDI7CisKKwlpZiAoKCR3aWR0aDwxKSB8fCAoJGhlaWdodDwxKSkgeworCSAgICBkaWUgIiRwcm9nOiBnZW9tZXRyeSAkZ2VvbWV0cnkgaXMgaW52YWxpZFxuIjsKKwl9CisKKwl3aGlsZSAoKCR3aWR0aCAlIDQpIT0wKSB7CisJICAgICR3aWR0aCA9ICR3aWR0aCArIDE7CisJfQorCisJd2hpbGUgKCgkaGVpZ2h0ICUgMikhPTApIHsKKwkgICAgJGhlaWdodCA9ICRoZWlnaHQgKyAxOworCX0KKworCSRnZW9tZXRyeSA9ICIke3dpZHRofXgkaGVpZ2h0IjsKKyAgICB9IGVsc2UgeworCWRpZSAiJHByb2c6IGdlb21ldHJ5ICRnZW9tZXRyeSBpcyBpbnZhbGlkXG4iOworICAgIH0KKworICAgIGlmICgoJGRlcHRoIDwgOCkgfHwgKCRkZXB0aCA+IDMyKSkgeworCWRpZSAiRGVwdGggbXVzdCBiZSBiZXR3ZWVuIDggYW5kIDMyXG4iOworICAgIH0KK30KKworCisjCisjIEdldERpc3BsYXlOdW1iZXIgZ2V0cyB0aGUgbG93ZXN0IGF2YWlsYWJsZSBkaXNwbGF5IG51bWJlci4gIEEgZGlzcGxheSBudW1iZXIKKyMgbiBpcyB0YWtlbiBpZiBzb21ldGhpbmcgaXMgbGlzdGVuaW5nIG9uIHRoZSBWTkMgc2VydmVyIHBvcnQgKDU5MDArbikgb3IgdGhlCisjIFggc2VydmVyIHBvcnQgKDYwMDArbikuCisjCisKK3N1YiBHZXREaXNwbGF5TnVtYmVyCit7CisgICAgZm9yZWFjaCAkbiAoMS4uOTkpIHsKKwlpZiAoJkNoZWNrRGlzcGxheU51bWJlcigkbikpIHsKKwkgICAgcmV0dXJuICRuKzA7ICMgQnJ1Y2UgTWFoJ3Mgd29ya2Fyb3VuZCBmb3IgYnVnIGluIHBlcmwgNS4wMDVfMDIKKwl9CisgICAgfQorICAgIAorICAgIGRpZSAiJHByb2c6IG5vIGZyZWUgZGlzcGxheSBudW1iZXIgb24gJGhvc3QuXG4iOworfQorCisKKyMKKyMgQ2hlY2tEaXNwbGF5TnVtYmVyIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gZGlzcGxheSBudW1iZXIgaXMgYXZhaWxhYmxlLiAgQQorIyBkaXNwbGF5IG51bWJlciBuIGlzIHRha2VuIGlmIHNvbWV0aGluZyBpcyBsaXN0ZW5pbmcgb24gdGhlIFZOQyBzZXJ2ZXIgcG9ydAorIyAoNTkwMCtuKSBvciB0aGUgWCBzZXJ2ZXIgcG9ydCAoNjAwMCtuKS4KKyMKKworc3ViIENoZWNrRGlzcGxheU51bWJlcgoreworICAgIGxvY2FsICgkbikgPSBAXzsKKworICAgIHNvY2tldChTLCAkQUZfSU5FVCwgJFNPQ0tfU1RSRUFNLCAwKSB8fCBkaWUgIiRwcm9nOiBzb2NrZXQgZmFpbGVkOiAkIVxuIjsKKyAgICBldmFsICdzZXRzb2Nrb3B0KFMsICZTT0xfU09DS0VULCAmU09fUkVVU0VBRERSLCBwYWNrKCJsIiwgMSkpJzsKKyAgICBpZiAoIWJpbmQoUywgcGFjaygnUyBuIHgxMicsICRBRl9JTkVULCA2MDAwICsgJG4pKSkgeworCWNsb3NlKFMpOworCXJldHVybiAwOworICAgIH0KKyAgICBjbG9zZShTKTsKKworICAgIHNvY2tldChTLCAkQUZfSU5FVCwgJFNPQ0tfU1RSRUFNLCAwKSB8fCBkaWUgIiRwcm9nOiBzb2NrZXQgZmFpbGVkOiAkIVxuIjsKKyAgICBldmFsICdzZXRzb2Nrb3B0KFMsICZTT0xfU09DS0VULCAmU09fUkVVU0VBRERSLCBwYWNrKCJsIiwgMSkpJzsKKyAgICBpZiAoIWJpbmQoUywgcGFjaygnUyBuIHgxMicsICRBRl9JTkVULCA1OTAwICsgJG4pKSkgeworCWNsb3NlKFMpOworCXJldHVybiAwOworICAgIH0KKyAgICBjbG9zZShTKTsKKworICAgIGlmICgtZSAiL3RtcC8uWCRuLWxvY2siKSB7CisJd2FybiAiXG5XYXJuaW5nOiAkaG9zdDokbiBpcyB0YWtlbiBiZWNhdXNlIG9mIC90bXAvLlgkbi1sb2NrXG4iOworCXdhcm4gIlJlbW92ZSB0aGlzIGZpbGUgaWYgdGhlcmUgaXMgbm8gWCBzZXJ2ZXIgJGhvc3Q6JG5cbiI7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKC1lICIvdG1wLy5YMTEtdW5peC9YJG4iKSB7CisJd2FybiAiXG5XYXJuaW5nOiAkaG9zdDokbiBpcyB0YWtlbiBiZWNhdXNlIG9mIC90bXAvLlgxMS11bml4L1gkblxuIjsKKwl3YXJuICJSZW1vdmUgdGhpcyBmaWxlIGlmIHRoZXJlIGlzIG5vIFggc2VydmVyICRob3N0OiRuXG4iOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICgtZSAiL3Vzci9zcG9vbC9zb2NrZXRzL1gxMS8kbiIpIHsKKwl3YXJuKCJcbldhcm5pbmc6ICRob3N0OiRuIGlzIHRha2VuIGJlY2F1c2Ugb2YgIi4KKyAgICAgICAgICAgICAiL3Vzci9zcG9vbC9zb2NrZXRzL1gxMS8kblxuIik7CisJd2FybiAiUmVtb3ZlIHRoaXMgZmlsZSBpZiB0aGVyZSBpcyBubyBYIHNlcnZlciAkaG9zdDokblxuIjsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisjCisjIEdldFhEaXNwbGF5RGVmYXVsdHMgdXNlcyB4ZHB5aW5mbyB0byBmaW5kIG91dCB0aGUgZ2VvbWV0cnksIGRlcHRoIGFuZCBwaXhlbAorIyBmb3JtYXQgb2YgdGhlIGN1cnJlbnQgWCBkaXNwbGF5IGJlaW5nIHVzZWQuICBJZiBzdWNjZXNzZnVsLCBpdCBzZXRzIHRoZQorIyBvcHRpb25zIGFzIGFwcHJvcHJpYXRlIHNvIHRoYXQgdGhlIFggVk5DIHNlcnZlciB3aWxsIHVzZSB0aGUgc2FtZSBzZXR0aW5ncworIyAobWludXMgYW4gYWxsb3dhbmNlIGZvciB3aW5kb3cgbWFuYWdlciBkZWNvcmF0aW9ucyBvbiB0aGUgZ2VvbWV0cnkpLiAgVXNpbmcKKyMgdGhlIHNhbWUgZGVwdGggYW5kIHBpeGVsIGZvcm1hdCBtZWFucyB0aGF0IHRoZSBWTkMgc2VydmVyIHdvbid0IGhhdmUgdG8KKyMgdHJhbnNsYXRlIHBpeGVscyB3aGVuIHRoZSBkZXNrdG9wIGlzIGJlaW5nIHZpZXdlZCBvbiB0aGlzIFggZGlzcGxheSAoZm9yCisjIFRydWVDb2xvciBkaXNwbGF5cyBhbnl3YXkpLgorIworCitzdWIgR2V0WERpc3BsYXlEZWZhdWx0cworeworICAgIGxvY2FsIChAbGluZXMsIEBtYXRjaGxpbmVzLCAkd2lkdGgsICRoZWlnaHQsICRkZWZhdWx0VmlzdWFsSWQsICRpLAorCSAgICRyZWQsICRncmVlbiwgJGJsdWUpOworCisgICAgJHdtRGVjb3JhdGlvbldpZHRoID0gNDsJIyBhIGd1ZXNzIGF0IHR5cGljYWwgc2l6ZSBmb3Igd2luZG93IG1hbmFnZXIKKyAgICAkd21EZWNvcmF0aW9uSGVpZ2h0ID0gMjQ7CSMgZGVjb3JhdGlvbiBzaXplCisKKyAgICByZXR1cm4gaWYgKCFkZWZpbmVkKCRFTlZ7RElTUExBWX0pKTsKKworICAgIEBsaW5lcyA9IGB4ZHB5aW5mbyAyPi9kZXYvbnVsbGA7CisKKyAgICByZXR1cm4gaWYgKCQ/ICE9IDApOworCisgICAgQG1hdGNobGluZXMgPSBncmVwKC9kaW1lbnNpb25zLywgQGxpbmVzKTsKKyAgICBpZiAoQG1hdGNobGluZXMpIHsKKwkoJHdpZHRoLCAkaGVpZ2h0KSA9ICgkbWF0Y2hsaW5lc1swXSA9fiAvKFxkKyl4KFxkKykgcGl4ZWxzLyk7CisKKwkkd2lkdGggLT0gJHdtRGVjb3JhdGlvbldpZHRoOworCSRoZWlnaHQgLT0gJHdtRGVjb3JhdGlvbkhlaWdodDsKKworCSRnZW9tZXRyeSA9ICIke3dpZHRofXgkaGVpZ2h0IjsKKyAgICB9CisKKyAgICBAbWF0Y2hsaW5lcyA9IGdyZXAoL2RlZmF1bHQgdmlzdWFsIGlkLywgQGxpbmVzKTsKKyAgICBpZiAoQG1hdGNobGluZXMpIHsKKwkoJGRlZmF1bHRWaXN1YWxJZCkgPSAoJG1hdGNobGluZXNbMF0gPX4gL2lkOlxzKyhcUyspLyk7CisKKwlmb3IgKCRpID0gMDsgJGkgPCBAbGluZXM7ICRpKyspIHsKKwkgICAgaWYgKCRsaW5lc1skaV0gPX4gL15ccyp2aXN1YWwgaWQ6XHMrJGRlZmF1bHRWaXN1YWxJZCQvKSB7CisJCWlmICgoJGxpbmVzWyRpKzFdICF+IC9UcnVlQ29sb3IvKSB8fAorCQkgICAgKCRsaW5lc1skaSsyXSAhfiAvZGVwdGgvKSB8fAorCQkgICAgKCRsaW5lc1skaSs0XSAhfiAvcmVkLCBncmVlbiwgYmx1ZSBtYXNrcy8pKQorCQl7CisJCSAgICByZXR1cm47CisJCX0KKwkJbGFzdDsKKwkgICAgfQorCX0KKworCXJldHVybiBpZiAoJGkgPj0gQGxpbmVzKTsKKworCSgkZGVwdGgpID0gKCRsaW5lc1skaSsyXSA9fiAvZGVwdGg6XHMrKFxkKykvKTsKKwkoJHJlZCwkZ3JlZW4sJGJsdWUpCisJICAgID0gKCRsaW5lc1skaSs0XQorCSAgICAgICA9fiAvbWFza3M6XHMrMHgoWzAtOWEtZl0rKSwgMHgoWzAtOWEtZl0rKSwgMHgoWzAtOWEtZl0rKS8pOworCisJJHJlZCA9IGhleCgkcmVkKTsKKwkkZ3JlZW4gPSBoZXgoJGdyZWVuKTsKKwkkYmx1ZSA9IGhleCgkYmx1ZSk7CisKKwlpZiAoJHJlZCA+ICRibHVlKSB7CisJICAgICRyZWQgPSBpbnQobG9nKCRyZWQpIC8gbG9nKDIpKSAtIGludChsb2coJGdyZWVuKSAvIGxvZygyKSk7CisJICAgICRncmVlbiA9IGludChsb2coJGdyZWVuKSAvIGxvZygyKSkgLSBpbnQobG9nKCRibHVlKSAvIGxvZygyKSk7CisJICAgICRibHVlID0gaW50KGxvZygkYmx1ZSkgLyBsb2coMikpICsgMTsKKwkgICAgJHBpeGVsZm9ybWF0ID0gInJnYiRyZWQkZ3JlZW4kYmx1ZSI7CisJfSBlbHNlIHsKKwkgICAgJGJsdWUgPSBpbnQobG9nKCRibHVlKSAvIGxvZygyKSkgLSBpbnQobG9nKCRncmVlbikgLyBsb2coMikpOworCSAgICAkZ3JlZW4gPSBpbnQobG9nKCRncmVlbikgLyBsb2coMikpIC0gaW50KGxvZygkcmVkKSAvIGxvZygyKSk7CisJICAgICRyZWQgPSBpbnQobG9nKCRyZWQpIC8gbG9nKDIpKSArIDE7CisJICAgICRwaXhlbGZvcm1hdCA9ICJiZ3IkYmx1ZSRncmVlbiRyZWQiOworCX0KKyAgICB9Cit9CisKKworIworIyBxdW90ZWRTdHJpbmcgcmV0dXJucyBhIHN0cmluZyB3aGljaCB5aWVsZHMgdGhlIG9yaWdpbmFsIHN0cmluZyB3aGVuIHBhcnNlZAorIyBieSBhIHNoZWxsLgorIworCitzdWIgcXVvdGVkU3RyaW5nCit7CisgICAgbG9jYWwgKCRpbikgPSBAXzsKKworICAgICRpbiA9fiBzL1wnL1wnXCJcJ1wiXCcvZzsKKworICAgIHJldHVybiAiJyRpbiciOworfQorCisKKyMKKyMgcmVtb3ZlU2xhc2hlcyB0dXJucyBzbGFzaGVzIGludG8gdW5kZXJzY29yZXMgZm9yIHVzZSBhcyBhIGZpbGUgbmFtZS4KKyMKKworc3ViIHJlbW92ZVNsYXNoZXMKK3sKKyAgICBsb2NhbCAoJGluKSA9IEBfOworCisgICAgJGluID1+IHN8L3xffGc7CisKKyAgICByZXR1cm4gIiRpbiI7Cit9CisKKworIworIyBVc2FnZQorIworCitzdWIgVXNhZ2UKK3sKKyAgICBkaWUoIlxudXNhZ2U6ICRwcm9nIFs6PG51bWJlcj5dIFstbmFtZSA8ZGVza3RvcC1uYW1lPl0gWy1kZXB0aCA8ZGVwdGg+XVxuIi4KKwkiICAgICAgICAgICAgICAgICBbLWdlb21ldHJ5IDx3aWR0aD54PGhlaWdodD5dXG4iLgorCSIgICAgICAgICAgICAgICAgIFstcGl4ZWxmb3JtYXQgcmdiTk5OfGJnck5OTl1cbiIuCisJIiAgICAgICAgICAgICAgICAgPFh2bmMtb3B0aW9ucz4uLi5cblxuIi4KKwkiICAgICAgICRwcm9nIC1raWxsIDxYLWRpc3BsYXk+XG5cbiIpOworfQorCisKKyMKKyMgS2lsbAorIworCitzdWIgS2lsbAoreworICAgICRvcHR7Jy1raWxsJ30gPX4gcy8oOlxkKylcLlxkKyQvJDEvOyAjIGUuZy4gdHVybiA6MS4wIGludG8gOjEKKworICAgIGlmICgkb3B0eycta2lsbCd9ID1+IC9eOlxkKyQvKSB7CisJJHBpZEZpbGUgPSAiJHZuY1VzZXJEaXIvJGhvc3Qkb3B0eycta2lsbCd9LnBpZCI7CisgICAgfSBlbHNlIHsKKwlpZiAoJG9wdHsnLWtpbGwnfSAhfiAvXiRob3N0Oi8pIHsKKwkgICAgZGllICJcbkNhbid0IHRlbGwgaWYgJG9wdHsnLWtpbGwnfSBpcyBvbiAkaG9zdFxuIi4KKwkJIlVzZSAta2lsbCA6PG51bWJlcj4gaW5zdGVhZFxuXG4iOworCX0KKwkkcGlkRmlsZSA9ICIkdm5jVXNlckRpci8kb3B0eycta2lsbCd9LnBpZCI7CisgICAgfQorCisgICAgaWYgKCEgLXIgJHBpZEZpbGUpIHsKKwlkaWUgIlxuQ2FuJ3QgZmluZCBmaWxlICRwaWRGaWxlXG4iLgorCSAgICAiWW91J2xsIGhhdmUgdG8ga2lsbCB0aGUgWHZuYyBwcm9jZXNzIG1hbnVhbGx5XG5cbiI7CisgICAgfQorCisgICAgJFNJR3snSFVQJ30gPSAnSUdOT1JFJzsKKyAgICBjaG9wKCRwaWQgPSBgY2F0ICRwaWRGaWxlYCk7CisgICAgd2FybiAiS2lsbGluZyBYdm5jIHByb2Nlc3MgSUQgJHBpZFxuIjsKKyAgICBzeXN0ZW0oImtpbGwgJHBpZCIpOworICAgIHVubGluayAkcGlkRmlsZTsKKyAgICBleGl0OworfQorCisKKyMKKyMgUGFyc2VPcHRpb25zIHRha2VzIGEgbGlzdCBvZiBwb3NzaWJsZSBvcHRpb25zIGFuZCBhIGJvb2xlYW4gaW5kaWNhdGluZworIyB3aGV0aGVyIHRoZSBvcHRpb24gaGFzIGEgdmFsdWUgZm9sbG93aW5nLCBhbmQgc2V0cyB1cCBhbiBhc3NvY2lhdGl2ZSBhcnJheQorIyAlb3B0IG9mIHRoZSB2YWx1ZXMgb2YgdGhlIG9wdGlvbnMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gSXQgcmVtb3ZlcyBhbGwKKyMgdGhlIGFyZ3VtZW50cyBpdCB1c2VzIGZyb20gQEFSR1YgYW5kIHJldHVybnMgdGhlbSBpbiBAb3B0QXJncy4KKyMKKworc3ViIFBhcnNlT3B0aW9ucworeworICAgIGxvY2FsIChAb3B0dmFsKSA9IEBfOworICAgIGxvY2FsICgkb3B0LCBAb3B0cywgJXZhbEZvbGxvd3MsIEBuZXdhcmdzKTsKKworICAgIHdoaWxlIChAb3B0dmFsKSB7CisJJG9wdCA9IHNoaWZ0KEBvcHR2YWwpOworCXB1c2goQG9wdHMsJG9wdCk7CisJJHZhbEZvbGxvd3N7JG9wdH0gPSBzaGlmdChAb3B0dmFsKTsKKyAgICB9CisKKyAgICBAb3B0QXJncyA9ICgpOworICAgICVvcHQgPSAoKTsKKworICAgIGFyZzogd2hpbGUgKGRlZmluZWQoJGFyZyA9IHNoaWZ0KEBBUkdWKSkpIHsKKwlmb3JlYWNoICRvcHQgKEBvcHRzKSB7CisJICAgIGlmICgkYXJnIGVxICRvcHQpIHsKKwkJcHVzaChAb3B0QXJncywgJGFyZyk7CisJCWlmICgkdmFsRm9sbG93c3skb3B0fSkgeworCQkgICAgaWYgKEBBUkdWID09IDApIHsKKwkJCSZVc2FnZSgpOworCQkgICAgfQorCQkgICAgJG9wdHskb3B0fSA9IHNoaWZ0KEBBUkdWKTsKKwkJICAgIHB1c2goQG9wdEFyZ3MsICRvcHR7JG9wdH0pOworCQl9IGVsc2UgeworCQkgICAgJG9wdHskb3B0fSA9IDE7CisJCX0KKwkJbmV4dCBhcmc7CisJICAgIH0KKwl9CisJcHVzaChAbmV3YXJncywkYXJnKTsKKyAgICB9CisKKyAgICBAQVJHViA9IEBuZXdhcmdzOworfQorCisKKyMKKyMgUm91dGluZSB0byBtYWtlIHN1cmUgd2UncmUgb3BlcmF0aW5nIGluIGEgc2FuZSBlbnZpcm9ubWVudC4KKyMKKworc3ViIFNhbml0eUNoZWNrCit7CisgICAgbG9jYWwgKCRjbWQpOworCisgICAgIworICAgICMgR2V0IHRoZSBwcm9ncmFtIG5hbWUKKyAgICAjCisKKyAgICAoJHByb2cpID0gKCQwID1+IG18KFteL10rKSR8KTsKKworICAgICMKKyAgICAjIENoZWNrIHdlIGhhdmUgYWxsIHRoZSBjb21tYW5kcyB3ZSdsbCBuZWVkIG9uIHRoZSBwYXRoLgorICAgICMKKworIGNtZDoKKyAgICBmb3JlYWNoICRjbWQgKCJ1bmFtZSIsInhhdXRoIiwiWHZuYyIsInZuY3Bhc3N3ZCIpIHsKKwlmb3IgKHNwbGl0KC86LywkRU5We1BBVEh9KSkgeworCSAgICBpZiAoLXggIiRfLyRjbWQiKSB7CisJCW5leHQgY21kOworCSAgICB9CisJfQorCWRpZSAiJHByb2c6IGNvdWxkbid0IGZpbmQgXCIkY21kXCIgb24geW91ciBQQVRILlxuIjsKKyAgICB9CisKKyAgICAjCisgICAgIyBDaGVjayB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQKKyAgICAjCisKKyAgICBpZiAoIWRlZmluZWQoJEVOVntIT01FfSkpIHsKKwlkaWUgIiRwcm9nOiBUaGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LlxuIjsKKyAgICB9CisgICAgY2hkaXIoJEVOVntIT01FfSk7CisKKyAgICAjCisgICAgIyBGaW5kIHNvY2tldCBjb25zdGFudHMuICd1c2UgU29ja2V0JyBpcyBhIHBlcmw1LWlzbSwgc28gd2Ugd3JhcCBpdCBpbiBhbgorICAgICMgZXZhbCwgYW5kIGlmIGl0IGZhaWxzIHdlIHRyeSAncmVxdWlyZSAic3lzL3NvY2tldC5waCInLiAgSWYgdGhpcyBmYWlscywKKyAgICAjIHdlIGp1c3QgZ3Vlc3MgYXQgdGhlIHZhbHVlcy4gIElmIHlvdSBmaW5kIHBlcmwgbW9hbmluZyBoZXJlLCBqdXN0CisgICAgIyBoYXJkLWNvZGUgdGhlIHZhbHVlcyBvZiBBRl9JTkVUIGFuZCBTT0NLX1NUUkVBTS4gIFlvdSBjYW4gZmluZCB0aGVzZSBvdXQKKyAgICAjIGZvciB5b3VyIHBsYXRmb3JtIGJ5IGxvb2tpbmcgaW4gL3Vzci9pbmNsdWRlL3N5cy9zb2NrZXQuaCBhbmQgcmVsYXRlZAorICAgICMgZmlsZXMuCisgICAgIworCisgICAgY2hvcCgkb3MgPSBgdW5hbWVgKTsKKyAgICBjaG9wKCRvc3JldiA9IGB1bmFtZSAtcmApOworCisgICAgZXZhbCAndXNlIFNvY2tldCc7CisgICAgaWYgKCRAKSB7CisJZXZhbCAncmVxdWlyZSAic3lzL3NvY2tldC5waCInOworCWlmICgkQCkgeworCSAgICBpZiAoKCRvcyBlcSAiU3VuT1MiKSAmJiAoJG9zcmV2ICF+IC9eNC8pKSB7CisJCSRBRl9JTkVUID0gMjsKKwkJJFNPQ0tfU1RSRUFNID0gMjsKKwkgICAgfSBlbHNlIHsKKwkJJEFGX0lORVQgPSAyOworCQkkU09DS19TVFJFQU0gPSAxOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgJEFGX0lORVQgPSAmQUZfSU5FVDsKKwkgICAgJFNPQ0tfU1RSRUFNID0gJlNPQ0tfU1RSRUFNOworCX0KKyAgICB9IGVsc2UgeworCSRBRl9JTkVUID0gJkFGX0lORVQ7CisJJFNPQ0tfU1RSRUFNID0gJlNPQ0tfU1RSRUFNOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3VuaXgvdm5jc2VydmVyLm1hbiBiL3VuaXgvdm5jc2VydmVyLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI4OGVjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmNzZXJ2ZXIubWFuCkBAIC0wLDAgKzEsMTIxIEBACisuVEggdm5jc2VydmVyIDEgIjE3IEFwciAyMDA2IiAiVGlnaHRWTkMiICJWaXJ0dWFsIE5ldHdvcmsgQ29tcHV0aW5nIgorLlNIIE5BTUUKK3ZuY3NlcnZlciBcLSBzdGFydCBvciBzdG9wIGEgVk5DIHNlcnZlcgorLlNIIFNZTk9QU0lTCisuQiB2bmNzZXJ2ZXIKKy5SSSBbOiBkaXNwbGF5IyBdCisuUkIgWyBcLW5hbWUKKy5JUiBkZXNrdG9wLW5hbWUgXQorLlJCIFsgXC1nZW9tZXRyeQorLklSIHdpZHRoIHggaGVpZ2h0IF0KKy5SQiBbIFwtZGVwdGgKKy5JUiBkZXB0aCBdCisuUkIgWyBcLXBpeGVsZm9ybWF0CisuSVIgZm9ybWF0IF0KKy5SSSBbIFh2bmMtb3B0aW9ucy4uLiBdCisuYnIKKy5CSSAidm5jc2VydmVyIFwta2lsbCA6IiBkaXNwbGF5IworLlNIIERFU0NSSVBUSU9OCisuQiB2bmNzZXJ2ZXIKK2lzIHVzZWQgdG8gc3RhcnQgYSBWTkMgKFZpcnR1YWwgTmV0d29yayBDb21wdXRpbmcpIGRlc2t0b3AuCisuQiB2bmNzZXJ2ZXIKK2lzIGEgUGVybCBzY3JpcHQgd2hpY2ggc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyBhbiBYdm5jIHNlcnZlci4gIEl0CitydW5zIFh2bmMgd2l0aCBhcHByb3ByaWF0ZSBvcHRpb25zIGFuZCBzdGFydHMgc29tZSBYIGFwcGxpY2F0aW9ucyB0byBiZQorZGlzcGxheWVkIGluIHRoZSBWTkMgZGVza3RvcC4KKworLkIgdm5jc2VydmVyCitjYW4gYmUgcnVuIHdpdGggbm8gb3B0aW9ucyBhdCBhbGwuIEluIHRoaXMgY2FzZSBpdCB3aWxsIGNob29zZSB0aGUgZmlyc3QKK2F2YWlsYWJsZSBkaXNwbGF5IG51bWJlciAodXN1YWxseSA6MSksIHN0YXJ0IFh2bmMgYXMgdGhhdCBkaXNwbGF5LCBhbmQgcnVuIGEKK2NvdXBsZSBvZiBiYXNpYyBhcHBsaWNhdGlvbnMgdG8gZ2V0IHlvdSBzdGFydGVkLiBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUKK2Rpc3BsYXkgbnVtYmVyLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgdXNlIHRoYXQgbnVtYmVyIGlmIGl0IGlzIGF2YWlsYWJsZSBhbmQKK2V4aXQgaWYgbm90LCBlZzoKKworLlJTCit2bmNzZXJ2ZXIgOjEzCisuUkUKKworRWRpdGluZyB0aGUgZmlsZSAkSE9NRS8udm5jL3hzdGFydHVwIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBhcHBsaWNhdGlvbnMgcnVuCithdCBzdGFydHVwIChidXQgbm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgYWZmZWN0IGFuIGV4aXN0aW5nIGRlc2t0b3ApLgorCisuU0ggT1BUSU9OUworWW91IGNhbiBnZXQgYSBsaXN0IG9mIG9wdGlvbnMgYnkgZ2l2aW5nIFxmQlwtaFxmUCBhcyBhbiBvcHRpb24gdG8gdm5jc2VydmVyLgorSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGJlbG93LCBhbnkgdW5yZWNvZ25pc2VkIG9wdGlvbnMgd2lsbCBiZQorcGFzc2VkIHRvIFh2bmMgLSBzZWUgdGhlIFh2bmMgbWFuIHBhZ2UsIG9yICJYdm5jIFwtaGVscCIgZm9yIGRldGFpbHMuCisKKy5UUAorLkIgXC1uYW1lIFxmSWRlc2t0b3AtbmFtZVxmUAorRWFjaCBkZXNrdG9wIGhhcyBhIG5hbWUgd2hpY2ggbWF5IGJlIGRpc3BsYXllZCBieSB0aGUgdmlld2VyLiBJdCBkZWZhdWx0cyB0bworIlxmSWhvc3RcZlA6XGZJZGlzcGxheSNcZlAgKFxmSXVzZXJuYW1lXGZQKSIgYnV0IHlvdSBjYW4gY2hhbmdlIGl0IHdpdGggdGhpcworb3B0aW9uLiAgSXQgaXMgcGFzc2VkIGluIHRvIHRoZSB4c3RhcnR1cCBzY3JpcHQgdmlhIHRoZSAkVk5DREVTS1RPUCBlbnZpcm9ubWVudAordmFyaWFibGUsIGFsbG93aW5nIHlvdSB0byBydW4gYSBkaWZmZXJlbnQgc2V0IG9mIGFwcGxpY2F0aW9ucyBhY2NvcmRpbmcgdG8gdGhlCituYW1lIG9mIHRoZSBkZXNrdG9wLgorCisuVFAKKy5CIFwtZ2VvbWV0cnkgXGZJd2lkdGhcZlB4XGZJaGVpZ2h0XGZQCitTcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBkZXNrdG9wIHRvIGJlIGNyZWF0ZWQuIERlZmF1bHQgaXMgMTAyNHg3NjguIAorCisuVFAKKy5CIFwtZGVwdGggXGZJZGVwdGhcZlAKK1NwZWNpZnkgdGhlIHBpeGVsIGRlcHRoIGluIGJpdHMgb2YgdGhlIGRlc2t0b3AgdG8gYmUgY3JlYXRlZC4gRGVmYXVsdCBpcyAxNiwKK290aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgOCwgMTUgYW5kIDI0IC0gYW55dGhpbmcgZWxzZSBpcyBsaWtlbHkgdG8gY2F1c2UKK3N0cmFuZ2UgYmVoYXZpb3VyIGJ5IGFwcGxpY2F0aW9ucy4KKworLlRQCisuQiBcLXBpeGVsZm9ybWF0IFxmSWZvcm1hdFxmUAorU3BlY2lmeSBwaXhlbCBmb3JtYXQgZm9yIHNlcnZlciB0byB1c2UgKEJHUm5ubiBvciBSR0Jubm4pLiAgVGhlIGRlZmF1bHQgZm9yCitkZXB0aCA4IGlzIEJHUjIzMyAobWVhbmluZyB0aGUgbW9zdCBzaWduaWZpY2FudCB0d28gYml0cyByZXByZXNlbnQgYmx1ZSwgdGhlCituZXh0IHRocmVlIGdyZWVuLCBhbmQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHRocmVlIHJlcHJlc2VudCByZWQpLCB0aGUgZGVmYXVsdAorZm9yIGRlcHRoIDE2IGlzIFJHQjU2NSBhbmQgZm9yIGRlcHRoIDI0IGlzIFJHQjg4OC4KKworLlRQCisuQiBcLWNjIDMKK0FzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBkZWZhdWx0IFRydWVDb2xvciB2aXN1YWwsIHRoaXMgYWxsb3dzIHlvdSB0byBydW4gYW4KK1h2bmMgc2VydmVyIHdpdGggYSBQc2V1ZG9Db2xvciB2aXN1YWwgKGkuZS4gb25lIHdoaWNoIHVzZXMgYSBjb2xvciBtYXAgb3IKK3BhbGV0dGUpLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciBydW5uaW5nIHNvbWUgb2xkIFggYXBwbGljYXRpb25zIHdoaWNoIG9ubHkKK3dvcmsgb24gc3VjaCBhIGRpc3BsYXkuICBWYWx1ZXMgb3RoZXIgdGhhbiAzIChQc2V1ZG9Db2xvcikgYW5kIDQgKFRydWVDb2xvcikKK2ZvciB0aGUgXC1jYyBvcHRpb24gbWF5IHJlc3VsdCBpbiBzdHJhbmdlIGJlaGF2aW91ciwgYW5kIFBzZXVkb0NvbG9yIGRlc2t0b3BzCittdXN0IGJlIDggYml0cyBkZWVwLgorCisuVFAKKy5CIFwta2lsbCA6XGZJZGlzcGxheSNcZlAKK1RoaXMga2lsbHMgYSBWTkMgZGVza3RvcCBwcmV2aW91c2x5IHN0YXJ0ZWQgd2l0aCB2bmNzZXJ2ZXIuICBJdCBkb2VzIHRoaXMgYnkKK2tpbGxpbmcgdGhlIFh2bmMgcHJvY2Vzcywgd2hvc2UgcHJvY2VzcyBJRCBpcyBzdG9yZWQgaW4gdGhlIGZpbGUKKyIkSE9NRS8udm5jL1xmSWhvc3RcZlA6XGZJZGlzcGxheSNcZlAucGlkIi4gIEl0IGFjdHVhbGx5IGlnbm9yZXMgYW55dGhpbmcKK3ByZWNlZGluZyBhICI6IiBpbiBpdHMgYXJndW1lbnQuICBUaGlzIGNhbiBiZSB1c2VmdWwgc28geW91IGNhbiB3cml0ZQorInZuY3NlcnZlciBcLWtpbGwgJERJU1BMQVkiLCBmb3IgZXhhbXBsZSBhdCB0aGUgZW5kIG9mIHlvdXIgeHN0YXJ0dXAgZmlsZSBhZnRlcgorYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGV4aXRzLgorCisuU0ggRklMRVMKK1NldmVyYWwgVk5DLXJlbGF0ZWQgZmlsZXMgYXJlIGZvdW5kIGluIHRoZSBkaXJlY3RvcnkgJEhPTUUvLnZuYzoKKy5UUAorJEhPTUUvLnZuYy94c3RhcnR1cAorQSBzaGVsbCBzY3JpcHQgc3BlY2lmeWluZyBYIGFwcGxpY2F0aW9ucyB0byBiZSBydW4gd2hlbiBhIFZOQyBkZXNrdG9wIGlzCitzdGFydGVkLiAgSWYgaXQgZG9lc24ndCBleGlzdCwgdm5jc2VydmVyIHdpbGwgY3JlYXRlIGEgbmV3IG9uZSB3aGljaCBydW5zIGEKK2NvdXBsZSBvZiBiYXNpYyBhcHBsaWNhdGlvbnMuCisuVFAKKyRIT01FLy52bmMvcGFzc3dkCitUaGUgVk5DIHBhc3N3b3JkIGZpbGUuCisuVFAKKyRIT01FLy52bmMvXGZJaG9zdFxmUDpcZklkaXNwbGF5I1xmUC5sb2cKK1RoZSBsb2cgZmlsZSBmb3IgWHZuYyBhbmQgYXBwbGljYXRpb25zIHN0YXJ0ZWQgaW4geHN0YXJ0dXAuCisuVFAKKyRIT01FLy52bmMvXGZJaG9zdFxmUDpcZklkaXNwbGF5I1xmUC5waWQKK0lkZW50aWZpZXMgdGhlIFh2bmMgcHJvY2VzcyBJRCwgdXNlZCBieSB0aGUKKy5CIFwta2lsbAorb3B0aW9uLgorCisuU0ggU0VFIEFMU08KKy5CUiB2bmN2aWV3ZXIgKDEpLAorLkJSIHZuY3Bhc3N3ZCAoMSksCisuQlIgdm5jY29uZmlnICgxKSwKKy5CUiBYdm5jICgxKQorLmJyCitodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbQorCisuU0ggQVVUSE9SCitUcmlzdGFuIFJpY2hhcmRzb24sIFJlYWxWTkMgTHRkLgorCitWTkMgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IHRoZSBSZWFsVk5DIHRlYW0gd2hpbGUgYXQgT2xpdmV0dGkKK1Jlc2VhcmNoIEx0ZCAvIEFUJlQgTGFib3JhdG9yaWVzIENhbWJyaWRnZS4gIFRpZ2h0Vk5DIGFkZGl0aW9ucyB3YXMKK2ltcGxlbWVudGVkIGJ5IENvbnN0YW50aW4gS2FwbGluc2t5LiBNYW55IG90aGVyIHBlb3BsZSBwYXJ0aWNpcGF0ZWQgaW4KK2RldmVsb3BtZW50LCB0ZXN0aW5nIGFuZCBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvdW5peC92bmN2aWV3ZXIvQWJvdXREaWFsb2cuaCBiL3VuaXgvdm5jdmlld2VyL0Fib3V0RGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmMGE3YwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jdmlld2VyL0Fib3V0RGlhbG9nLmgKQEAgLTAsMCArMSw0MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIEFib3V0RGlhbG9nLmgKKy8vCisKKyNpZm5kZWYgX19BQk9VVERJQUxPR19IX18KKyNkZWZpbmUgX19BQk9VVERJQUxPR19IX18KKworI2luY2x1ZGUgIlRYTXNnQm94LmgiCisjaW5jbHVkZSAicGFyYW1ldGVycy5oIgorCisjaW5jbHVkZSA8aW50bC9nZXR0ZXh0Lmg+CisjZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCisjZGVmaW5lIGdldHRleHRfbm9vcChTdHJpbmcpIFN0cmluZworI2RlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQorCitleHRlcm4gY2hhciBidWlsZHRpbWVbXTsKKworY2xhc3MgQWJvdXREaWFsb2cgOiBwdWJsaWMgVFhNc2dCb3ggeworcHVibGljOgorICBBYm91dERpYWxvZyhEaXNwbGF5KiBkcHkpCisgICAgOiBUWE1zZ0JveChkcHksIGFib3V0VGV4dCwgTUJfT0ssIF8oIkFib3V0IFZOQyBWaWV3ZXIiKSkgeworICB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdm5jdmlld2VyL0NDb25uLmN4eCBiL3VuaXgvdm5jdmlld2VyL0NDb25uLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlMzNhCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmN2aWV3ZXIvQ0Nvbm4uY3h4CkBAIC0wLDAgKzEsNzQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gQ0Nvbm4uY3h4CisvLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQ0Nvbm4uaCIKKyNpbmNsdWRlIDxyZmIvQ01zZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi9lbmNvZGluZ3MuaD4KKyNpbmNsdWRlIDxyZmIvc2VjVHlwZXMuaD4KKyNpbmNsdWRlIDxyZmIvQ1NlY3VyaXR5Tm9uZS5oPgorI2luY2x1ZGUgPHJmYi9DU2VjdXJpdHlWbmNBdXRoLmg+CisjaW5jbHVkZSA8cmZiL0hvc3RuYW1lLmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisjaW5jbHVkZSA8cmZiL1Bhc3N3b3JkLmg+CisjaW5jbHVkZSA8bmV0d29yay9UY3BTb2NrZXQuaD4KKworI2luY2x1ZGUgIlRYVmlld3BvcnQuaCIKKyNpbmNsdWRlICJEZXNrdG9wV2luZG93LmgiCisjaW5jbHVkZSAiU2VydmVyRGlhbG9nLmgiCisjaW5jbHVkZSAiUGFzc3dkRGlhbG9nLmgiCisjaW5jbHVkZSAicGFyYW1ldGVycy5oIgorCit1c2luZyBuYW1lc3BhY2UgcmZiOworCitzdGF0aWMgcmZiOjpMb2dXcml0ZXIgdmxvZygiQ0Nvbm4iKTsKKworSW50UGFyYW1ldGVyIGRlYnVnRGVsYXkoIkRlYnVnRGVsYXkiLCJNaWxsaXNlY29uZHMgdG8gZGlzcGxheSBpbnZlcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicGl4ZWwgZGF0YSAtIGEgZGVidWdnaW5nIGZlYXR1cmUiLCAwKTsKKworU3RyaW5nUGFyYW1ldGVyIG1lbnVLZXkoIk1lbnVLZXkiLCAiVGhlIGtleSB3aGljaCBicmluZ3MgdXAgdGhlIHBvcHVwIG1lbnUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkY4Iik7CitTdHJpbmdQYXJhbWV0ZXIgd2luZG93TmFtZSgibmFtZSIsICJUaGUgWCB3aW5kb3cgbmFtZSIsICIiKTsKKworQ0Nvbm46OkNDb25uKERpc3BsYXkqIGRweV8sIGludCBhcmdjXywgY2hhcioqIGFyZ3ZfLCBuZXR3b3JrOjpTb2NrZXQqIHNvY2tfLAorICAgICAgICAgICAgIGNoYXIqIHZuY1NlcnZlck5hbWUsIGJvb2wgcmV2ZXJzZSkKKyAgOiBkcHkoZHB5XyksIGFyZ2MoYXJnY18pLAorICAgIGFyZ3YoYXJndl8pLCBzZXJ2ZXJIb3N0KDApLCBzZXJ2ZXJQb3J0KDApLCBzb2NrKHNvY2tfKSwgdmlld3BvcnQoMCksCisgICAgZGVza3RvcCgwKSwgZGVza3RvcEV2ZW50SGFuZGxlcigwKSwKKyAgICBjdXJyZW50RW5jb2RpbmcoZW5jb2RpbmdaUkxFKSwgbGFzdFNlcnZlckVuY29kaW5nKCh1bnNpZ25lZCBpbnQpLTEpLAorICAgIGZ1bGxDb2xvdXIoOjpmdWxsQ29sb3VyKSwKKyAgICBhdXRvU2VsZWN0KDo6YXV0b1NlbGVjdCksIHNoYXJlZCg6OnNoYXJlZCksIGZvcm1hdENoYW5nZShmYWxzZSksCisgICAgZW5jb2RpbmdDaGFuZ2UoZmFsc2UpLCBzYW1lTWFjaGluZShmYWxzZSksIGZ1bGxTY3JlZW4oOjpmdWxsU2NyZWVuKSwKKyAgICBjdHJsRG93bihmYWxzZSksIGFsdERvd24oZmFsc2UpLAorICAgIG1lbnVLZXlzeW0oMCksIG1lbnUoZHB5LCB0aGlzKSwgb3B0aW9ucyhkcHksIHRoaXMpLCBhYm91dChkcHkpLCBpbmZvKGRweSksCisgICAgcmV2ZXJzZUNvbm5lY3Rpb24ocmV2ZXJzZSkKK3sKKyAgQ2hhckFycmF5IG1lbnVLZXlTdHIobWVudUtleS5nZXREYXRhKCkpOworICBtZW51S2V5c3ltID0gWFN0cmluZ1RvS2V5c3ltKG1lbnVLZXlTdHIuYnVmKTsKKworICBzZXRTaGFyZWQoc2hhcmVkKTsKKyAgYWRkU2VjVHlwZShzZWNUeXBlTm9uZSk7CisgIGFkZFNlY1R5cGUoc2VjVHlwZVZuY0F1dGgpOworICBDaGFyQXJyYXkgZW5jU3RyKHByZWZlcnJlZEVuY29kaW5nLmdldERhdGEoKSk7CisgIGludCBlbmNOdW0gPSBlbmNvZGluZ051bShlbmNTdHIuYnVmKTsKKyAgaWYgKGVuY051bSAhPSAtMSkgeworICAgIGN1cnJlbnRFbmNvZGluZyA9IGVuY051bTsKKyAgfQorICBjcC5zdXBwb3J0c0Rlc2t0b3BSZXNpemUgPSB0cnVlOworICBjcC5zdXBwb3J0c0xvY2FsQ3Vyc29yID0gdXNlTG9jYWxDdXJzb3I7CisgIGNwLmN1c3RvbUNvbXByZXNzTGV2ZWwgPSBjdXN0b21Db21wcmVzc0xldmVsOworICBjcC5jb21wcmVzc0xldmVsID0gY29tcHJlc3NMZXZlbDsKKyAgY3Aubm9KcGVnID0gbm9KcGVnOworICBjcC5xdWFsaXR5TGV2ZWwgPSBxdWFsaXR5TGV2ZWw7CisgIGluaXRNZW51KCk7CisKKyAgaWYgKHNvY2spIHsKKyAgICBjaGFyKiBuYW1lID0gc29jay0+Z2V0UGVlckVuZHBvaW50KCk7CisgICAgdmxvZy5pbmZvKCJBY2NlcHRlZCBjb25uZWN0aW9uIGZyb20gJXMiLCBuYW1lKTsKKyAgICBpZiAobmFtZSkgZnJlZShuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodm5jU2VydmVyTmFtZSkgeworICAgICAgZ2V0SG9zdEFuZFBvcnQodm5jU2VydmVyTmFtZSwgJnNlcnZlckhvc3QsICZzZXJ2ZXJQb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgU2VydmVyRGlhbG9nIGRsZyhkcHksICZvcHRpb25zLCAmYWJvdXQpOworICAgICAgaWYgKCFkbGcuc2hvdygpIHx8IGRsZy5lbnRyeS5nZXRUZXh0KClbMF0gPT0gMCkgeworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgZ2V0SG9zdEFuZFBvcnQoZGxnLmVudHJ5LmdldFRleHQoKSwgJnNlcnZlckhvc3QsICZzZXJ2ZXJQb3J0KTsKKyAgICB9CisKKyAgICBzb2NrID0gbmV3IG5ldHdvcms6OlRjcFNvY2tldChzZXJ2ZXJIb3N0LCBzZXJ2ZXJQb3J0KTsKKyAgICB2bG9nLmluZm8oImNvbm5lY3RlZCB0byBob3N0ICVzIHBvcnQgJWQiLCBzZXJ2ZXJIb3N0LCBzZXJ2ZXJQb3J0KTsKKyAgfQorCisgIHNhbWVNYWNoaW5lID0gc29jay0+c2FtZU1hY2hpbmUoKTsKKyAgc29jay0+aW5TdHJlYW0oKS5zZXRCbG9ja0NhbGxiYWNrKHRoaXMpOworICBzZXRTZXJ2ZXJOYW1lKHNvY2stPmdldFBlZXJFbmRwb2ludCgpKTsKKyAgc2V0U3RyZWFtcygmc29jay0+aW5TdHJlYW0oKSwgJnNvY2stPm91dFN0cmVhbSgpKTsKKyAgaW5pdGlhbGlzZVByb3RvY29sKCk7Cit9CisKK0NDb25uOjp+Q0Nvbm4oKSB7CisgIGZyZWUoc2VydmVySG9zdCk7CisgIGRlbGV0ZSBkZXNrdG9wOworICBkZWxldGUgdmlld3BvcnQ7CisgIGRlbGV0ZSBzb2NrOworfQorCisvLyBkZWxldGVXaW5kb3coKSBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIGRlc2t0b3Agb3IgbWVudSB3aW5kb3dzLgorCit2b2lkIENDb25uOjpkZWxldGVXaW5kb3coVFhXaW5kb3cqIHcpIHsKKyAgaWYgKHcgPT0gJm1lbnUpIHsKKyAgICBtZW51LnVubWFwKCk7CisgIH0gZWxzZSBpZiAodyA9PSB2aWV3cG9ydCkgeworICAgIGV4aXQoMSk7CisgIH0KK30KKworLy8gaGFuZGxlRXZlbnQoKSBmaWx0ZXJzIGFsbCBldmVudHMgb24gdGhlIGRlc2t0b3AgYW5kIG1lbnUuICBNb3N0IGFyZSBwYXNzZWQKKy8vIHN0cmFpZ2h0IHRocm91Z2guICBUaGUgZXhjZXB0aW9uIGlzIHRoZSBGOCBrZXkuICBXaGVuIHByZXNzZWQgb24gdGhlCisvLyBkZXNrdG9wLCBpdCBpcyB1c2VkIHRvIGJyaW5nIHVwIHRoZSBtZW51LiAgQW4gRjggcHJlc3Mgb3IgcmVsZWFzZSBvbiB0aGUKKy8vIG1lbnUgaXMgcGFzc2VkIHRocm91Z2ggYXMgaWYgaXQgd2VyZSBvbiB0aGUgZGVza3RvcC4KKwordm9pZCBDQ29ubjo6aGFuZGxlRXZlbnQoVFhXaW5kb3cqIHcsIFhFdmVudCogZXYpCit7CisgIEtleVN5bSBrczsKKyAgY2hhciBzdHJbMjU2XTsKKworICBzd2l0Y2ggKGV2LT50eXBlKSB7CisgIGNhc2UgS2V5UHJlc3M6CisgIGNhc2UgS2V5UmVsZWFzZToKKyAgICBYTG9va3VwU3RyaW5nKCZldi0+eGtleSwgc3RyLCAyNTYsICZrcywgTlVMTCk7CisgICAgaWYgKGtzID09IG1lbnVLZXlzeW0gJiYgKGV2LT54a2V5LnN0YXRlICYgKFNoaWZ0TWFza3xDb250cm9sTWFzaykpID09IDApIHsKKyAgICAgIGlmICh3ID09IGRlc2t0b3AgJiYgZXYtPnR5cGUgPT0gS2V5UHJlc3MpIHsKKyAgICAgICAgc2hvd01lbnUoZXYtPnhrZXkueF9yb290LCBldi0+eGtleS55X3Jvb3QpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAodyA9PSAmbWVudSkgeworICAgICAgICBpZiAoZXYtPnR5cGUgPT0gS2V5UHJlc3MpIG1lbnUudW5tYXAoKTsKKyAgICAgICAgZGVza3RvcEV2ZW50SGFuZGxlci0+aGFuZGxlRXZlbnQodywgZXYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gZHJvcCB0aHJvdWdoCisKKyAgZGVmYXVsdDoKKyAgICBpZiAodyA9PSBkZXNrdG9wKSBkZXNrdG9wRXZlbnRIYW5kbGVyLT5oYW5kbGVFdmVudCh3LCBldik7CisgICAgZWxzZSBpZiAodyA9PSAmbWVudSkgbWVudUV2ZW50SGFuZGxlci0+aGFuZGxlRXZlbnQodywgZXYpOworICB9Cit9CisKKy8vIGJsb2NrQ2FsbGJhY2soKSBpcyBjYWxsZWQgd2hlbiByZWFkaW5nIGZyb20gdGhlIHNvY2tldCB3b3VsZCBibG9jay4gIFdlCisvLyBwcm9jZXNzIFggZXZlbnRzIHVudGlsIHRoZSBzb2NrZXQgaXMgcmVhZHkgZm9yIHJlYWRpbmcgYWdhaW4uCisKK3ZvaWQgQ0Nvbm46OmJsb2NrQ2FsbGJhY2soKSB7CisgIGZkX3NldCByZmRzOworICBkbyB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgc3RydWN0IHRpbWV2YWwqIHR2cCA9IDA7CisKKyAgICAvLyBQcm9jZXNzIGFueSBpbmNvbWluZyBYIGV2ZW50cworICAgIFRYV2luZG93OjpoYW5kbGVYRXZlbnRzKGRweSk7CisgICAgCisgICAgLy8gUHJvY2VzcyBleHBpcmVkIHRpbWVycyBhbmQgZ2V0IHRoZSB0aW1lIHVudGlsIHRoZSBuZXh0IG9uZQorICAgIGludCB0aW1lb3V0TXMgPSBUaW1lcjo6Y2hlY2tUaW1lb3V0cygpOworICAgIGlmICh0aW1lb3V0TXMpIHsKKyAgICAgIHR2LnR2X3NlYyA9IHRpbWVvdXRNcyAvIDEwMDA7CisgICAgICB0di50dl91c2VjID0gKHRpbWVvdXRNcyAlIDEwMDApICogMTAwMDsKKyAgICAgIHR2cCA9ICZ0djsKKyAgICB9CisgICAgCisgICAgLy8gSWYgdGhlcmUgYXJlIFggcmVxdWVzdHMgcGVuZGluZyB0aGVuIHBvbGwsIGRvbid0IHdhaXQhCisgICAgaWYgKFhQZW5kaW5nKGRweSkpIHsKKyAgICAgIHR2LnR2X3VzZWMgPSB0di50dl9zZWMgPSAwOworICAgICAgdHZwID0gJnR2OworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIFggZXZlbnRzLCBWTkMgdHJhZmZpYywgb3IgdGhlIG5leHQgdGltZXIgZXhwaXJ5CisgICAgRkRfWkVSTygmcmZkcyk7CisgICAgRkRfU0VUKENvbm5lY3Rpb25OdW1iZXIoZHB5KSwgJnJmZHMpOworICAgIEZEX1NFVChzb2NrLT5nZXRGZCgpLCAmcmZkcyk7CisgICAgaW50IG4gPSBzZWxlY3QoRkRfU0VUU0laRSwgJnJmZHMsIDAsIDAsIHR2cCk7CisgICAgaWYgKG4gPCAwKSB0aHJvdyByZHI6OlN5c3RlbUV4Y2VwdGlvbigic2VsZWN0IixlcnJubyk7CisgIH0gd2hpbGUgKCEoRkRfSVNTRVQoc29jay0+Z2V0RmQoKSwgJnJmZHMpKSk7Cit9CisKKworLy8gZ2V0UGFzc3dkKCkgaXMgY2FsbGVkIGJ5IHRoZSBDU2VjdXJpdHkgb2JqZWN0IHdoZW4gaXQgbmVlZHMgdXMgdG8gcmVhZCBhCisvLyBwYXNzd29yZCBmcm9tIHRoZSB1c2VyLgorCit2b2lkIENDb25uOjpnZXRVc2VyUGFzc3dkKGNoYXIqKiB1c2VyLCBjaGFyKiogcGFzc3dvcmQpCit7CisgIENoYXJBcnJheSBwYXNzd29yZEZpbGVTdHIocGFzc3dvcmRGaWxlLmdldERhdGEoKSk7CisgIGlmICghdXNlciAmJiBwYXNzd29yZEZpbGVTdHIuYnVmWzBdKSB7CisgICAgRklMRSogZnAgPSBmb3BlbihwYXNzd29yZEZpbGVTdHIuYnVmLCAiciIpOworICAgIGlmICghZnApIHRocm93IHJmYjo6RXhjZXB0aW9uKCJPcGVuaW5nIHBhc3N3b3JkIGZpbGUgZmFpbGVkIik7CisgICAgT2JmdXNjYXRlZFBhc3N3ZCBvYmZQd2QoMjU2KTsKKyAgICBvYmZQd2QubGVuZ3RoID0gZnJlYWQob2JmUHdkLmJ1ZiwgMSwgb2JmUHdkLmxlbmd0aCwgZnApOworICAgIGZjbG9zZShmcCk7CisgICAgUGxhaW5QYXNzd2QgcGFzc3dkKG9iZlB3ZCk7CisgICAgKnBhc3N3b3JkID0gcGFzc3dkLnRha2VCdWYoKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBjaGFyKiBzZWNUeXBlID0gc2VjVHlwZU5hbWUoZ2V0Q3VycmVudENTZWN1cml0eSgpLT5nZXRUeXBlKCkpOworICBjb25zdCBjaGFyKiB0aXRsZVByZWZpeCA9IF8oIlZOQyBhdXRoZW50aWNhdGlvbiIpOworICB1bnNpZ25lZCBpbnQgdGl0bGVMZW4gPSBzdHJsZW4odGl0bGVQcmVmaXgpICsgc3RybGVuKHNlY1R5cGUpICsgNDsKKyAgQ2hhckFycmF5IHRpdGxlKHRpdGxlTGVuKTsKKyAgc25wcmludGYodGl0bGUuYnVmLCB0aXRsZUxlbiwgIiVzIFslc10iLCB0aXRsZVByZWZpeCwgc2VjVHlwZSk7CisgIFBhc3N3ZERpYWxvZyBkbGcoZHB5LCB0aXRsZS5idWYsICF1c2VyKTsKKyAgaWYgKCFkbGcuc2hvdygpKSB0aHJvdyByZmI6OkV4Y2VwdGlvbigiQXV0aGVudGljYXRpb24gY2FuY2VsbGVkIik7CisgIGlmICh1c2VyKQorICAgICp1c2VyID0gc3RyRHVwKGRsZy51c2VyRW50cnkuZ2V0VGV4dCgpKTsKKyAgKnBhc3N3b3JkID0gc3RyRHVwKGRsZy5wYXNzd2RFbnRyeS5nZXRUZXh0KCkpOworfQorCisKKy8vIENDb25uZWN0aW9uIGNhbGxiYWNrIG1ldGhvZHMKKworLy8gZ2V0Q1NlY3VyaXR5KCkgZ2V0cyB0aGUgYXBwcm9wcmlhdGUgQ1NlY3VyaXR5IG9iamVjdCBmb3IgdGhlIHNlY3VyaXR5CisvLyB0eXBlcyB3aGljaCB3ZSBzdXBwb3J0LgorQ1NlY3VyaXR5KiBDQ29ubjo6Z2V0Q1NlY3VyaXR5KGludCBzZWNUeXBlKSB7CisgIHN3aXRjaCAoc2VjVHlwZSkgeworICBjYXNlIHNlY1R5cGVOb25lOgorICAgIHJldHVybiBuZXcgQ1NlY3VyaXR5Tm9uZSgpOworICBjYXNlIHNlY1R5cGVWbmNBdXRoOgorICAgIHJldHVybiBuZXcgQ1NlY3VyaXR5Vm5jQXV0aCh0aGlzKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyByZmI6OkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgc2VjVHlwZT8iKTsKKyAgfQorfQorCisvLyBzZXJ2ZXJJbml0KCkgaXMgY2FsbGVkIHdoZW4gdGhlIHNlcnZlckluaXQgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZC4gIEF0CisvLyB0aGlzIHBvaW50IHdlIGNyZWF0ZSB0aGUgZGVza3RvcCB3aW5kb3cgYW5kIGRpc3BsYXkgaXQuICBXZSBhbHNvIHRlbGwgdGhlCisvLyBzZXJ2ZXIgdGhlIHBpeGVsIGZvcm1hdCBhbmQgZW5jb2RpbmdzIHRvIHVzZSBhbmQgcmVxdWVzdCB0aGUgZmlyc3QgdXBkYXRlLgordm9pZCBDQ29ubjo6c2VydmVySW5pdCgpIHsKKyAgQ0Nvbm5lY3Rpb246OnNlcnZlckluaXQoKTsKKworICAvLyBJZiB1c2luZyBBdXRvU2VsZWN0IHdpdGggb2xkIHNlcnZlcnMsIHN0YXJ0IGluIEZ1bGxDb2xvcgorICAvLyBtb2RlLiBTZWUgY29tbWVudCBpbiBhdXRvU2VsZWN0Rm9ybWF0QW5kRW5jb2RpbmcuIAorICBpZiAoY3AuYmVmb3JlVmVyc2lvbigzLCA4KSAmJiBhdXRvU2VsZWN0KSB7CisgICAgZnVsbENvbG91ciA9IHRydWU7CisgIH0KKworICBzZXJ2ZXJQRiA9IGNwLnBmKCk7CisgIGRlc2t0b3AgPSBuZXcgRGVza3RvcFdpbmRvdyhkcHksIGNwLndpZHRoLCBjcC5oZWlnaHQsIHNlcnZlclBGLCB0aGlzKTsKKyAgZGVza3RvcEV2ZW50SGFuZGxlciA9IGRlc2t0b3AtPnNldEV2ZW50SGFuZGxlcih0aGlzKTsKKyAgZGVza3RvcC0+YWRkRXZlbnRNYXNrKEtleVByZXNzTWFzayB8IEtleVJlbGVhc2VNYXNrKTsKKyAgZnVsbENvbG91clBGID0gZGVza3RvcC0+Z2V0UEYoKTsKKyAgaWYgKCFzZXJ2ZXJQRi50cnVlQ29sb3VyKQorICAgIGZ1bGxDb2xvdXIgPSB0cnVlOworICByZWNyZWF0ZVZpZXdwb3J0KCk7CisgIGZvcm1hdENoYW5nZSA9IGVuY29kaW5nQ2hhbmdlID0gdHJ1ZTsKKyAgcmVxdWVzdE5ld1VwZGF0ZSgpOworfQorCisvLyBzZXREZXNrdG9wU2l6ZSgpIGlzIGNhbGxlZCB3aGVuIHRoZSBkZXNrdG9wIHNpemUgY2hhbmdlcyAoaW5jbHVkaW5nIHdoZW4KKy8vIGl0IGlzIHNldCBpbml0aWFsbHkpLgordm9pZCBDQ29ubjo6c2V0RGVza3RvcFNpemUoaW50IHcsIGludCBoKSB7CisgIENDb25uZWN0aW9uOjpzZXREZXNrdG9wU2l6ZSh3LGgpOworICBpZiAoZGVza3RvcCkgeworICAgIGRlc2t0b3AtPnJlc2l6ZSh3LCBoKTsKKyAgICByZWNyZWF0ZVZpZXdwb3J0KCk7CisgIH0KK30KKworLy8gZnJhbWVidWZmZXJVcGRhdGVFbmQoKSBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhbiB1cGRhdGUuCisvLyBGb3IgZWFjaCByZWN0YW5nbGUsIHRoZSBGZEluU3RyZWFtIHdpbGwgaGF2ZSB0aW1lZCB0aGUgc3BlZWQKKy8vIG9mIHRoZSBjb25uZWN0aW9uLCBhbGxvd2luZyB1cyB0byBzZWxlY3QgZm9ybWF0IGFuZCBlbmNvZGluZworLy8gYXBwcm9wcmlhdGVseSwgYW5kIHRoZW4gcmVxdWVzdCBhbm90aGVyIGluY3JlbWVudGFsIHVwZGF0ZS4KK3ZvaWQgQ0Nvbm46OmZyYW1lYnVmZmVyVXBkYXRlRW5kKCkgeworICBpZiAoZGVidWdEZWxheSAhPSAwKSB7CisgICAgWFN5bmMoZHB5LCBGYWxzZSk7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgdHYudHZfc2VjID0gZGVidWdEZWxheSAvIDEwMDA7CisgICAgdHYudHZfdXNlYyA9IChkZWJ1Z0RlbGF5ICUgMTAwMCkgKiAxMDAwOworICAgIHNlbGVjdCgwLCAwLCAwLCAwLCAmdHYpOworICAgIHN0ZDo6bGlzdDxyZmI6OlJlY3Q+OjppdGVyYXRvciBpOworICAgIGZvciAoaSA9IGRlYnVnUmVjdHMuYmVnaW4oKTsgaSAhPSBkZWJ1Z1JlY3RzLmVuZCgpOyBpKyspIHsKKyAgICAgIGRlc2t0b3AtPmludmVydFJlY3QoKmkpOworICAgIH0KKyAgICBkZWJ1Z1JlY3RzLmNsZWFyKCk7CisgIH0KKyAgZGVza3RvcC0+ZnJhbWVidWZmZXJVcGRhdGVFbmQoKTsKKyAgaWYgKGF1dG9TZWxlY3QpCisgICAgYXV0b1NlbGVjdEZvcm1hdEFuZEVuY29kaW5nKCk7CisgIHJlcXVlc3ROZXdVcGRhdGUoKTsKK30KKworLy8gVGhlIHJlc3Qgb2YgdGhlIGNhbGxiYWNrcyBhcmUgZmFpcmx5IHNlbGYtZXhwbGFuYXRvcnkuLi4KKwordm9pZCBDQ29ubjo6c2V0Q29sb3VyTWFwRW50cmllcyhpbnQgZmlyc3RDb2xvdXIsIGludCBuQ29sb3VycywgcmRyOjpVMTYqIHJnYnMpCit7CisgIGRlc2t0b3AtPnNldENvbG91ck1hcEVudHJpZXMoZmlyc3RDb2xvdXIsIG5Db2xvdXJzLCByZ2JzKTsKK30KKwordm9pZCBDQ29ubjo6YmVsbCgpIHsgWEJlbGwoZHB5LCAwKTsgfQorCit2b2lkIENDb25uOjpzZXJ2ZXJDdXRUZXh0KGNvbnN0IGNoYXIqIHN0ciwgaW50IGxlbikgeworICBkZXNrdG9wLT5zZXJ2ZXJDdXRUZXh0KHN0cixsZW4pOworfQorCisvLyBXZSBzdGFydCB0aW1pbmcgb24gYmVnaW5SZWN0IGFuZCBzdG9wIHRpbWluZyBvbiBlbmRSZWN0LCB0bworLy8gYXZvaWQgc2tld2luZyB0aGUgYmFuZHdpZHRoIGVzdGltYXRpb24gYXMgYSByZXN1bHQgb2YgdGhlIHNlcnZlcgorLy8gYmVpbmcgc2xvdyBvciB0aGUgbmV0d29yayBoYXZpbmcgaGlnaCBsYXRlbmN5Cit2b2lkIENDb25uOjpiZWdpblJlY3QoY29uc3QgUmVjdCYgciwgdW5zaWduZWQgaW50IGVuY29kaW5nKQoreworICBzb2NrLT5pblN0cmVhbSgpLnN0YXJ0VGltaW5nKCk7CisgIGlmIChlbmNvZGluZyAhPSBlbmNvZGluZ0NvcHlSZWN0KSB7CisgICAgbGFzdFNlcnZlckVuY29kaW5nID0gZW5jb2Rpbmc7CisgIH0KK30KKwordm9pZCBDQ29ubjo6ZW5kUmVjdChjb25zdCBSZWN0JiByLCB1bnNpZ25lZCBpbnQgZW5jb2RpbmcpCit7CisgIHNvY2stPmluU3RyZWFtKCkuc3RvcFRpbWluZygpOworICBpZiAoZGVidWdEZWxheSAhPSAwKSB7CisgICAgZGVza3RvcC0+aW52ZXJ0UmVjdChyKTsKKyAgICBkZWJ1Z1JlY3RzLnB1c2hfYmFjayhyKTsKKyAgfQorfQorCit2b2lkIENDb25uOjpmaWxsUmVjdChjb25zdCByZmI6OlJlY3QmIHIsIHJmYjo6UGl4ZWwgcCkgeworICBkZXNrdG9wLT5maWxsUmVjdChyLHApOworfQordm9pZCBDQ29ubjo6aW1hZ2VSZWN0KGNvbnN0IHJmYjo6UmVjdCYgciwgdm9pZCogcCkgeworICBkZXNrdG9wLT5pbWFnZVJlY3QocixwKTsKK30KK3ZvaWQgQ0Nvbm46OmNvcHlSZWN0KGNvbnN0IHJmYjo6UmVjdCYgciwgaW50IHN4LCBpbnQgc3kpIHsKKyAgZGVza3RvcC0+Y29weVJlY3QocixzeCxzeSk7Cit9Cit2b2lkIENDb25uOjpzZXRDdXJzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBQb2ludCYgaG90c3BvdCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhLCB2b2lkKiBtYXNrKSB7CisgIGRlc2t0b3AtPnNldEN1cnNvcih3aWR0aCwgaGVpZ2h0LCBob3RzcG90LCBkYXRhLCBtYXNrKTsKK30KKworCisvLyBNZW51IHN0dWZmIC0gbWVudVNlbGVjdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBtZW51IG9wdGlvbi4KKworZW51bSB7IElEX09QVElPTlMsIElEX0lORk8sIElEX0ZVTExTQ1JFRU4sIElEX1JFRlJFU0gsIElEX0Y4LCBJRF9DVFJMQUxUREVMLAorICAgICAgIElEX0FCT1VULCBJRF9ESVNNSVNTLCBJRF9FWElULCBJRF9ORVdDT05OLCBJRF9DVFJMLCBJRF9BTFQgfTsKKwordm9pZCBDQ29ubjo6aW5pdE1lbnUoKSB7CisgIG1lbnVFdmVudEhhbmRsZXIgPSBtZW51LnNldEV2ZW50SGFuZGxlcih0aGlzKTsKKyAgbWVudS5hZGRFdmVudE1hc2soS2V5UHJlc3NNYXNrIHwgS2V5UmVsZWFzZU1hc2spOworICBtZW51LmFkZEVudHJ5KF8oIkV4aXQgdmlld2VyIiksIElEX0VYSVQpOworICBtZW51LmFkZEVudHJ5KDAsIDApOworICBtZW51LmFkZEVudHJ5KF8oIkZ1bGwgc2NyZWVuIiksIElEX0ZVTExTQ1JFRU4pOworICBtZW51LmNoZWNrKElEX0ZVTExTQ1JFRU4sIGZ1bGxTY3JlZW4pOworICBtZW51LmFkZEVudHJ5KDAsIDApOworICBtZW51LmFkZEVudHJ5KF8oIkN0cmwiKSwgSURfQ1RSTCk7CisgIG1lbnUuYWRkRW50cnkoXygiQWx0IiksIElEX0FMVCk7CisgIENoYXJBcnJheSBtZW51S2V5U3RyKG1lbnVLZXkuZ2V0RGF0YSgpKTsKKyAgQ2hhckFycmF5IHNlbmRNZW51S2V5KDY0KTsKKyAgc25wcmludGYoc2VuZE1lbnVLZXkuYnVmLCA2NCwgXygiU2VuZCAlcyIpLCBtZW51S2V5U3RyLmJ1Zik7CisgIG1lbnUuYWRkRW50cnkoc2VuZE1lbnVLZXkuYnVmLCBJRF9GOCk7CisgIG1lbnUuYWRkRW50cnkoXygiU2VuZCBDdHJsLUFsdC1EZWwiKSwgSURfQ1RSTEFMVERFTCk7CisgIG1lbnUuYWRkRW50cnkoMCwgMCk7CisgIG1lbnUuYWRkRW50cnkoXygiUmVmcmVzaCBzY3JlZW4iKSwgSURfUkVGUkVTSCk7CisgIG1lbnUuYWRkRW50cnkoMCwgMCk7CisgIG1lbnUuYWRkRW50cnkoXygiTmV3IGNvbm5lY3Rpb24uLi4iKSwgSURfTkVXQ09OTik7CisgIG1lbnUuYWRkRW50cnkoXygiT3B0aW9ucy4uLiIpLCBJRF9PUFRJT05TKTsKKyAgbWVudS5hZGRFbnRyeShfKCJDb25uZWN0aW9uIGluZm8uLi4iKSwgSURfSU5GTyk7CisgIG1lbnUuYWRkRW50cnkoXygiQWJvdXQgVk5Ddmlld2VyLi4uIiksIElEX0FCT1VUKTsKKyAgbWVudS5hZGRFbnRyeSgwLCAwKTsKKyAgbWVudS5hZGRFbnRyeShfKCJEaXNtaXNzIG1lbnUiKSwgSURfRElTTUlTUyk7CisgIG1lbnUudG9wbGV2ZWwoXygiVk5DIE1lbnUiKSwgdGhpcyk7CisgIG1lbnUuc2V0Qm9yZGVyV2lkdGgoMSk7Cit9CisKK3ZvaWQgQ0Nvbm46OnNob3dNZW51KGludCB4LCBpbnQgeSkgeworICBtZW51LmNoZWNrKElEX0ZVTExTQ1JFRU4sIGZ1bGxTY3JlZW4pOworICBpZiAoeCArIG1lbnUud2lkdGgoKSA+IHZpZXdwb3J0LT53aWR0aCgpKQorICAgICAgeCA9IHZpZXdwb3J0LT53aWR0aCgpIC0gbWVudS53aWR0aCgpOworICBpZiAoeSArIG1lbnUuaGVpZ2h0KCkgPiB2aWV3cG9ydC0+aGVpZ2h0KCkpCisgICAgICB5ID0gdmlld3BvcnQtPmhlaWdodCgpIC0gbWVudS5oZWlnaHQoKTsKKyAgbWVudS5tb3ZlKHgsIHkpOworICBtZW51LnJhaXNlKCk7CisgIG1lbnUubWFwKCk7Cit9CisKK3ZvaWQgQ0Nvbm46Om1lbnVTZWxlY3QobG9uZyBpZCwgVFhNZW51KiBtKSB7CisgIHN3aXRjaCAoaWQpIHsKKyAgY2FzZSBJRF9ORVdDT05OOgorICAgIHsKKyAgICAgIG1lbnUudW5tYXAoKTsKKyAgICAgIGlmIChmdWxsU2NyZWVuKSB7CisgICAgICAgIGZ1bGxTY3JlZW4gPSBmYWxzZTsKKyAgICAgICAgaWYgKHZpZXdwb3J0KSByZWNyZWF0ZVZpZXdwb3J0KCk7CisgICAgICB9CisgICAgICBpbnQgcGlkID0gZm9yaygpOworICAgICAgaWYgKHBpZCA8IDApIHsgcGVycm9yKCJmb3JrIik7IGV4aXQoMSk7IH0KKyAgICAgIGlmIChwaWQgPT0gMCkgeworICAgICAgICBkZWxldGUgc29jazsKKyAgICAgICAgY2xvc2UoQ29ubmVjdGlvbk51bWJlcihkcHkpKTsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIHR2LnR2X3NlYyA9IDA7CisgICAgICAgIHR2LnR2X3VzZWMgPSAyMDAqMTAwMDsKKyAgICAgICAgc2VsZWN0KDAsIDAsIDAsIDAsICZ0dik7CisgICAgICAgIGV4ZWNscChwcm9ncmFtTmFtZSwgcHJvZ3JhbU5hbWUsIDApOworICAgICAgICBwZXJyb3IoImV4ZWNscCIpOyBleGl0KDEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICBjYXNlIElEX09QVElPTlM6CisgICAgbWVudS51bm1hcCgpOworICAgIG9wdGlvbnMuc2hvdygpOworICAgIGJyZWFrOworICBjYXNlIElEX0lORk86CisgICAgeworICAgICAgbWVudS51bm1hcCgpOworICAgICAgY2hhciBwZlN0clsxMDBdOworICAgICAgY2hhciBzcGZTdHJbMTAwXTsKKyAgICAgIGNwLnBmKCkucHJpbnQocGZTdHIsIDEwMCk7CisgICAgICBzZXJ2ZXJQRi5wcmludChzcGZTdHIsIDEwMCk7CisgICAgICBpbnQgc2VjVHlwZSA9IGdldEN1cnJlbnRDU2VjdXJpdHkoKS0+Z2V0VHlwZSgpOworICAgICAgY2hhciBpbmZvVGV4dFsxMDI0XTsKKyAgICAgIHNucHJpbnRmKGluZm9UZXh0LCBzaXplb2YoaW5mb1RleHQpLAorCSAgICAgICBfKCJEZXNrdG9wIG5hbWU6ICUuODBzXG4iCisJCSAiSG9zdDogJS44MHMgcG9ydDogJWRcbiIKKwkJICJTaXplOiAlZCB4ICVkXG4iCisJCSAiUGl4ZWwgZm9ybWF0OiAlc1xuIgorCQkgIihzZXJ2ZXIgZGVmYXVsdCAlcylcbiIKKwkJICJSZXF1ZXN0ZWQgZW5jb2Rpbmc6ICVzXG4iCisJCSAiTGFzdCB1c2VkIGVuY29kaW5nOiAlc1xuIgorCQkgIkxpbmUgc3BlZWQgZXN0aW1hdGU6ICVkIGtiaXQvc1xuIgorCQkgIlByb3RvY29sIHZlcnNpb246ICVkLiVkXG4iCisJCSAiU2VjdXJpdHkgbWV0aG9kOiAlc1xuIiksCisgICAgICAgICAgICAgIGNwLm5hbWUoKSwgc2VydmVySG9zdCwgc2VydmVyUG9ydCwgY3Aud2lkdGgsIGNwLmhlaWdodCwKKyAgICAgICAgICAgICAgcGZTdHIsIHNwZlN0ciwgZW5jb2RpbmdOYW1lKGN1cnJlbnRFbmNvZGluZyksCisgICAgICAgICAgICAgIGVuY29kaW5nTmFtZShsYXN0U2VydmVyRW5jb2RpbmcpLAorICAgICAgICAgICAgICBzb2NrLT5pblN0cmVhbSgpLmtiaXRzUGVyU2Vjb25kKCksCisgICAgICAgICAgICAgIGNwLm1ham9yVmVyc2lvbiwgY3AubWlub3JWZXJzaW9uLAorICAgICAgICAgICAgICBzZWNUeXBlTmFtZShzZWNUeXBlKSk7CisgICAgICBpbmZvLnNldFRleHQoaW5mb1RleHQpOworICAgICAgaW5mby5zaG93KCk7CisgICAgICBicmVhazsKKyAgICB9CisgIGNhc2UgSURfRlVMTFNDUkVFTjoKKyAgICBtZW51LnVubWFwKCk7CisgICAgZnVsbFNjcmVlbiA9ICFmdWxsU2NyZWVuOworICAgIGlmICh2aWV3cG9ydCkgcmVjcmVhdGVWaWV3cG9ydCgpOworICAgIGJyZWFrOworICBjYXNlIElEX1JFRlJFU0g6CisgICAgbWVudS51bm1hcCgpOworICAgIHdyaXRlcigpLT53cml0ZUZyYW1lYnVmZmVyVXBkYXRlUmVxdWVzdChSZWN0KDAsIDAsIGNwLndpZHRoLCBjcC5oZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgYnJlYWs7CisgIGNhc2UgSURfRjg6CisgICAgbWVudS51bm1hcCgpOworICAgIGlmICghdmlld09ubHkpIHsKKyAgICAgIHdyaXRlcigpLT5rZXlFdmVudChtZW51S2V5c3ltLCB0cnVlKTsKKyAgICAgIHdyaXRlcigpLT5rZXlFdmVudChtZW51S2V5c3ltLCBmYWxzZSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElEX0NUUkxBTFRERUw6CisgICAgbWVudS51bm1hcCgpOworICAgIGlmICghdmlld09ubHkpIHsKKyAgICAgIHdyaXRlcigpLT5rZXlFdmVudChYS19Db250cm9sX0wsIHRydWUpOworICAgICAgd3JpdGVyKCktPmtleUV2ZW50KFhLX0FsdF9MLCB0cnVlKTsKKyAgICAgIHdyaXRlcigpLT5rZXlFdmVudChYS19EZWxldGUsIHRydWUpOworICAgICAgd3JpdGVyKCktPmtleUV2ZW50KFhLX0RlbGV0ZSwgZmFsc2UpOworICAgICAgd3JpdGVyKCktPmtleUV2ZW50KFhLX0FsdF9MLCBmYWxzZSk7CisgICAgICB3cml0ZXIoKS0+a2V5RXZlbnQoWEtfQ29udHJvbF9MLCBmYWxzZSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElEX0NUUkw6CisgICAgbWVudS51bm1hcCgpOworICAgIGlmICghdmlld09ubHkpIHsKKyAgICAgIGN0cmxEb3duID0gIWN0cmxEb3duOworICAgICAgd3JpdGVyKCktPmtleUV2ZW50KFhLX0NvbnRyb2xfTCwgY3RybERvd24pOworICAgICAgbWVudS5jaGVjayhJRF9DVFJMLCBjdHJsRG93bik7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIElEX0FMVDoKKyAgICBtZW51LnVubWFwKCk7CisgICAgaWYgKCF2aWV3T25seSkgeworICAgICAgYWx0RG93biA9ICFhbHREb3duOworICAgICAgd3JpdGVyKCktPmtleUV2ZW50KFhLX0FsdF9MLCBhbHREb3duKTsKKyAgICAgIG1lbnUuY2hlY2soSURfQUxULCBhbHREb3duKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSURfQUJPVVQ6CisgICAgbWVudS51bm1hcCgpOworICAgIGFib3V0LnNob3coKTsKKyAgICBicmVhazsKKyAgY2FzZSBJRF9ESVNNSVNTOgorICAgIG1lbnUudW5tYXAoKTsKKyAgICBicmVhazsKKyAgY2FzZSBJRF9FWElUOgorICAgIGV4aXQoMSk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvLyBPcHRpb25zRGlhbG9nQ2FsbGJhY2suICBzZXRPcHRpb25zKCkgc2V0cyB0aGUgb3B0aW9ucyBkaWFsb2cncyBjaGVja2JveGVzCisvLyBldGMgdG8gcmVmbGVjdCBvdXIgZmxhZ3MuICBnZXRPcHRpb25zKCkgc2V0cyBvdXIgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQorLy8gb3B0aW9ucyBkaWFsb2cncyBjaGVja2JveGVzLgorCit2b2lkIENDb25uOjpzZXRPcHRpb25zKCkgeworICBjaGFyIGRpZ2l0WzJdID0gIjAiOworICBvcHRpb25zLmF1dG9TZWxlY3QuY2hlY2tlZChhdXRvU2VsZWN0KTsKKyAgb3B0aW9ucy5mdWxsQ29sb3VyLmNoZWNrZWQoZnVsbENvbG91cik7CisgIG9wdGlvbnMudmVyeUxvd0NvbG91ci5jaGVja2VkKCFmdWxsQ29sb3VyICYmIGxvd0NvbG91ckxldmVsID09IDApOworICBvcHRpb25zLmxvd0NvbG91ci5jaGVja2VkKCFmdWxsQ29sb3VyICYmIGxvd0NvbG91ckxldmVsID09IDEpOworICBvcHRpb25zLm1lZGl1bUNvbG91ci5jaGVja2VkKCFmdWxsQ29sb3VyICYmIGxvd0NvbG91ckxldmVsID09IDIpOworICBvcHRpb25zLnRpZ2h0LmNoZWNrZWQoY3VycmVudEVuY29kaW5nID09IGVuY29kaW5nVGlnaHQpOworICBvcHRpb25zLnpybGUuY2hlY2tlZChjdXJyZW50RW5jb2RpbmcgPT0gZW5jb2RpbmdaUkxFKTsKKyAgb3B0aW9ucy5oZXh0aWxlLmNoZWNrZWQoY3VycmVudEVuY29kaW5nID09IGVuY29kaW5nSGV4dGlsZSk7CisgIG9wdGlvbnMucmF3LmNoZWNrZWQoY3VycmVudEVuY29kaW5nID09IGVuY29kaW5nUmF3KTsKKworICBvcHRpb25zLmN1c3RvbUNvbXByZXNzTGV2ZWwuY2hlY2tlZChjdXN0b21Db21wcmVzc0xldmVsKTsgCisgIGRpZ2l0WzBdID0gJzAnICsgY29tcHJlc3NMZXZlbDsKKyAgb3B0aW9ucy5jb21wcmVzc0xldmVsLnNldFRleHQoZGlnaXQpOyAKKyAgb3B0aW9ucy5ub0pwZWcuY2hlY2tlZCghbm9KcGVnKTsKKyAgZGlnaXRbMF0gPSAnMCcgKyBxdWFsaXR5TGV2ZWw7CisgIG9wdGlvbnMucXVhbGl0eUxldmVsLnNldFRleHQoZGlnaXQpOyAKKworICBvcHRpb25zLnZpZXdPbmx5LmNoZWNrZWQodmlld09ubHkpOworICBvcHRpb25zLmFjY2VwdENsaXBib2FyZC5jaGVja2VkKGFjY2VwdENsaXBib2FyZCk7CisgIG9wdGlvbnMuc2VuZENsaXBib2FyZC5jaGVja2VkKHNlbmRDbGlwYm9hcmQpOworICBvcHRpb25zLnNlbmRQcmltYXJ5LmNoZWNrZWQoc2VuZFByaW1hcnkpOworICBpZiAoc3RhdGUoKSA9PSBSRkJTVEFURV9OT1JNQUwpCisgICAgb3B0aW9ucy5zaGFyZWQuZGlzYWJsZWQodHJ1ZSk7CisgIGVsc2UKKyAgICBvcHRpb25zLnNoYXJlZC5jaGVja2VkKHNoYXJlZCk7CisgIG9wdGlvbnMuZnVsbFNjcmVlbi5jaGVja2VkKGZ1bGxTY3JlZW4pOworICBvcHRpb25zLnVzZUxvY2FsQ3Vyc29yLmNoZWNrZWQodXNlTG9jYWxDdXJzb3IpOworICBvcHRpb25zLmRvdFdoZW5Ob0N1cnNvci5jaGVja2VkKGRvdFdoZW5Ob0N1cnNvcik7Cit9CisKK3ZvaWQgQ0Nvbm46OmdldE9wdGlvbnMoKSB7CisgIGF1dG9TZWxlY3QgPSBvcHRpb25zLmF1dG9TZWxlY3QuY2hlY2tlZCgpOworICBpZiAoZnVsbENvbG91ciAhPSBvcHRpb25zLmZ1bGxDb2xvdXIuY2hlY2tlZCgpKQorICAgIGZvcm1hdENoYW5nZSA9IHRydWU7CisgIGZ1bGxDb2xvdXIgPSBvcHRpb25zLmZ1bGxDb2xvdXIuY2hlY2tlZCgpOworICBpZiAoIWZ1bGxDb2xvdXIpIHsKKyAgICBpbnQgbmV3TG93Q29sb3VyTGV2ZWwgPSAob3B0aW9ucy52ZXJ5TG93Q29sb3VyLmNoZWNrZWQoKSA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxvd0NvbG91ci5jaGVja2VkKCkgPyAxIDogMik7CisgICAgaWYgKG5ld0xvd0NvbG91ckxldmVsICE9IGxvd0NvbG91ckxldmVsKSB7CisgICAgICBsb3dDb2xvdXJMZXZlbC5zZXRQYXJhbShuZXdMb3dDb2xvdXJMZXZlbCk7CisgICAgICBmb3JtYXRDaGFuZ2UgPSB0cnVlOworICAgIH0KKyAgfQorICB1bnNpZ25lZCBpbnQgbmV3RW5jb2RpbmcgPSAob3B0aW9ucy50aWdodC5jaGVja2VkKCkgPyBlbmNvZGluZ1RpZ2h0IDoKKwkJCSAgICAgIG9wdGlvbnMuenJsZS5jaGVja2VkKCkgPyBlbmNvZGluZ1pSTEUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5oZXh0aWxlLmNoZWNrZWQoKSA/IGVuY29kaW5nSGV4dGlsZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1Jhdyk7CisgIGlmIChuZXdFbmNvZGluZyAhPSBjdXJyZW50RW5jb2RpbmcpIHsKKyAgICBjdXJyZW50RW5jb2RpbmcgPSBuZXdFbmNvZGluZzsKKyAgICBlbmNvZGluZ0NoYW5nZSA9IHRydWU7CisgIH0KKworICBjdXN0b21Db21wcmVzc0xldmVsLnNldFBhcmFtKG9wdGlvbnMuY3VzdG9tQ29tcHJlc3NMZXZlbC5jaGVja2VkKCkpOworICBpZiAoY3AuY3VzdG9tQ29tcHJlc3NMZXZlbCAhPSBjdXN0b21Db21wcmVzc0xldmVsKSB7CisgICAgY3AuY3VzdG9tQ29tcHJlc3NMZXZlbCA9IGN1c3RvbUNvbXByZXNzTGV2ZWw7CisgICAgZW5jb2RpbmdDaGFuZ2UgPSB0cnVlOworICB9CisgIGNvbXByZXNzTGV2ZWwuc2V0UGFyYW0ob3B0aW9ucy5jb21wcmVzc0xldmVsLmdldFRleHQoKSk7CisgIGlmIChjcC5jb21wcmVzc0xldmVsICE9IGNvbXByZXNzTGV2ZWwpIHsKKyAgICBjcC5jb21wcmVzc0xldmVsID0gY29tcHJlc3NMZXZlbDsKKyAgICBlbmNvZGluZ0NoYW5nZSA9IHRydWU7CisgIH0KKyAgbm9KcGVnLnNldFBhcmFtKCFvcHRpb25zLm5vSnBlZy5jaGVja2VkKCkpOworICBpZiAoY3Aubm9KcGVnICE9IG5vSnBlZykgeworICAgIGNwLm5vSnBlZyA9IG5vSnBlZzsKKyAgICBlbmNvZGluZ0NoYW5nZSA9IHRydWU7CisgIH0KKyAgcXVhbGl0eUxldmVsLnNldFBhcmFtKG9wdGlvbnMucXVhbGl0eUxldmVsLmdldFRleHQoKSk7CisgIGlmIChjcC5xdWFsaXR5TGV2ZWwgIT0gcXVhbGl0eUxldmVsKSB7CisgICAgY3AucXVhbGl0eUxldmVsID0gcXVhbGl0eUxldmVsOworICAgIGVuY29kaW5nQ2hhbmdlID0gdHJ1ZTsKKyAgfQorCisgIHZpZXdPbmx5LnNldFBhcmFtKG9wdGlvbnMudmlld09ubHkuY2hlY2tlZCgpKTsKKyAgYWNjZXB0Q2xpcGJvYXJkLnNldFBhcmFtKG9wdGlvbnMuYWNjZXB0Q2xpcGJvYXJkLmNoZWNrZWQoKSk7CisgIHNlbmRDbGlwYm9hcmQuc2V0UGFyYW0ob3B0aW9ucy5zZW5kQ2xpcGJvYXJkLmNoZWNrZWQoKSk7CisgIHNlbmRQcmltYXJ5LnNldFBhcmFtKG9wdGlvbnMuc2VuZFByaW1hcnkuY2hlY2tlZCgpKTsKKyAgc2hhcmVkID0gb3B0aW9ucy5zaGFyZWQuY2hlY2tlZCgpOworICBzZXRTaGFyZWQoc2hhcmVkKTsKKyAgaWYgKGZ1bGxTY3JlZW4gIT0gb3B0aW9ucy5mdWxsU2NyZWVuLmNoZWNrZWQoKSkgeworICAgIGZ1bGxTY3JlZW4gPSBvcHRpb25zLmZ1bGxTY3JlZW4uY2hlY2tlZCgpOworICAgIGlmICh2aWV3cG9ydCkgcmVjcmVhdGVWaWV3cG9ydCgpOworICB9CisgIHVzZUxvY2FsQ3Vyc29yLnNldFBhcmFtKG9wdGlvbnMudXNlTG9jYWxDdXJzb3IuY2hlY2tlZCgpKTsKKyAgaWYgKGNwLnN1cHBvcnRzTG9jYWxDdXJzb3IgIT0gdXNlTG9jYWxDdXJzb3IpIHsKKyAgICBjcC5zdXBwb3J0c0xvY2FsQ3Vyc29yID0gdXNlTG9jYWxDdXJzb3I7CisgICAgZW5jb2RpbmdDaGFuZ2UgPSB0cnVlOworICAgIGlmIChkZXNrdG9wKQorICAgICAgZGVza3RvcC0+cmVzZXRMb2NhbEN1cnNvcigpOworICB9CisgIGRvdFdoZW5Ob0N1cnNvci5zZXRQYXJhbShvcHRpb25zLmRvdFdoZW5Ob0N1cnNvci5jaGVja2VkKCkpOworICBjaGVja0VuY29kaW5ncygpOworfQorCit2b2lkIENDb25uOjpyZWNyZWF0ZVZpZXdwb3J0KCkKK3sKKyAgVFhWaWV3cG9ydCogb2xkVmlld3BvcnQgPSB2aWV3cG9ydDsKKyAgdmlld3BvcnQgPSBuZXcgVFhWaWV3cG9ydChkcHksIGNwLndpZHRoLCBjcC5oZWlnaHQpOworICBkZXNrdG9wLT5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7CisgIENoYXJBcnJheSB3aW5kb3dOYW1lU3RyKHdpbmRvd05hbWUuZ2V0RGF0YSgpKTsKKyAgaWYgKCF3aW5kb3dOYW1lU3RyLmJ1ZlswXSkgeworICAgIHdpbmRvd05hbWVTdHIucmVwbGFjZUJ1ZihuZXcgY2hhclsyNTZdKTsKKyAgICBzbnByaW50Zih3aW5kb3dOYW1lU3RyLmJ1ZiwgMjU2LCAiVk5DOiAlLjI0MHMiLCBjcC5uYW1lKCkpOworICB9CisgIHZpZXdwb3J0LT50b3BsZXZlbCh3aW5kb3dOYW1lU3RyLmJ1ZiwgdGhpcywgYXJnYywgYXJndik7CisgIHZpZXdwb3J0LT5zZXRCdW1wU2Nyb2xsKGZ1bGxTY3JlZW4pOworICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOworICBhdHRyLm92ZXJyaWRlX3JlZGlyZWN0ID0gZnVsbFNjcmVlbjsKKyAgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoZHB5LCB2aWV3cG9ydC0+d2luKCksIENXT3ZlcnJpZGVSZWRpcmVjdCwgJmF0dHIpOworICBYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhkcHksIG1lbnUud2luKCksIENXT3ZlcnJpZGVSZWRpcmVjdCwgJmF0dHIpOworICBYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhkcHksIG9wdGlvbnMud2luKCksIENXT3ZlcnJpZGVSZWRpcmVjdCwgJmF0dHIpOworICBYQ2hhbmdlV2luZG93QXR0cmlidXRlcyhkcHksIGFib3V0LndpbigpLCBDV092ZXJyaWRlUmVkaXJlY3QsICZhdHRyKTsKKyAgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoZHB5LCBpbmZvLndpbigpLCBDV092ZXJyaWRlUmVkaXJlY3QsICZhdHRyKTsKKyAgcmVjb25maWd1cmVWaWV3cG9ydCgpOworICBtZW51LnNldFRyYW5zaWVudEZvcih2aWV3cG9ydC0+d2luKCkpOworICB2aWV3cG9ydC0+bWFwKCk7CisgIGlmIChmdWxsU2NyZWVuKSB7CisgICAgWEdyYWJLZXlib2FyZChkcHksIGRlc2t0b3AtPndpbigpLCBUcnVlLCBHcmFiTW9kZUFzeW5jLCBHcmFiTW9kZUFzeW5jLAorICAgICAgICAgICAgICAgICAgQ3VycmVudFRpbWUpOworICB9IGVsc2UgeworICAgIFhVbmdyYWJLZXlib2FyZChkcHksIEN1cnJlbnRUaW1lKTsKKyAgfQorICBpZiAob2xkVmlld3BvcnQpIGRlbGV0ZSBvbGRWaWV3cG9ydDsKK30KKwordm9pZCBDQ29ubjo6cmVjb25maWd1cmVWaWV3cG9ydCgpCit7CisgIHZpZXdwb3J0LT5zZXRNYXhTaXplKGNwLndpZHRoLCBjcC5oZWlnaHQpOworICBpZiAoZnVsbFNjcmVlbikgeworICAgIHZpZXdwb3J0LT5yZXNpemUoRGlzcGxheVdpZHRoKGRweSxEZWZhdWx0U2NyZWVuKGRweSkpLAorICAgICAgICAgICAgICAgICAgICAgRGlzcGxheUhlaWdodChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IHcgPSBjcC53aWR0aDsKKyAgICBpbnQgaCA9IGNwLmhlaWdodDsKKyAgICBpZiAodyArIHdtRGVjb3JhdGlvbldpZHRoID49IERpc3BsYXlXaWR0aChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSkKKyAgICAgIHcgPSBEaXNwbGF5V2lkdGgoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSkgLSB3bURlY29yYXRpb25XaWR0aDsKKyAgICBpZiAoaCArIHdtRGVjb3JhdGlvbkhlaWdodCA+PSBEaXNwbGF5SGVpZ2h0KGRweSxEZWZhdWx0U2NyZWVuKGRweSkpKQorICAgICAgaCA9IERpc3BsYXlIZWlnaHQoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSkgLSB3bURlY29yYXRpb25IZWlnaHQ7CisKKyAgICBpbnQgeCA9IChEaXNwbGF5V2lkdGgoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSkgLSB3IC0gd21EZWNvcmF0aW9uV2lkdGgpIC8gMjsKKyAgICBpbnQgeSA9IChEaXNwbGF5SGVpZ2h0KGRweSxEZWZhdWx0U2NyZWVuKGRweSkpIC0gaCAtIHdtRGVjb3JhdGlvbkhlaWdodCkvMjsKKworICAgIENoYXJBcnJheSBnZW9tZXRyeVN0cihnZW9tZXRyeS5nZXREYXRhKCkpOworICAgIHZpZXdwb3J0LT5zZXRHZW9tZXRyeShnZW9tZXRyeVN0ci5idWYsIHgsIHksIHcsIGgpOworICB9Cit9CisKKy8vIE5vdGU6IFRoZSBtZXRob2QgYmVsb3cgaXMgZHVwbGljYXRlZCBpbiB2bmN2aWV3ZXIvY3ZpZXcuY3h4IQorCisvLyBhdXRvU2VsZWN0Rm9ybWF0QW5kRW5jb2RpbmcoKSBjaG9vc2VzIHRoZSBmb3JtYXQgYW5kIGVuY29kaW5nIGFwcHJvcHJpYXRlCisvLyB0byB0aGUgY29ubmVjdGlvbiBzcGVlZDoKKy8vCisvLyAgIEFib3ZlIDE2TWJwcyAodGltaW5nIGZvciBhdCBsZWFzdCBhIHNlY29uZCksIHN3aXRjaCB0byBoZXh0aWxlCisvLyAgIE90aGVyd2lzZSwgc3dpdGNoIHRvIFpSTEUKKy8vCisvLyAgIEFib3ZlIDI1NkticHMsIHVzZSBmdWxsIGNvbG91ciBtb2RlCisvLwordm9pZCBDQ29ubjo6YXV0b1NlbGVjdEZvcm1hdEFuZEVuY29kaW5nKCkKK3sKKyAgaW50IGtiaXRzUGVyU2Vjb25kID0gc29jay0+aW5TdHJlYW0oKS5rYml0c1BlclNlY29uZCgpOworICB1bnNpZ25lZCBpbnQgbmV3RW5jb2RpbmcgPSBjdXJyZW50RW5jb2Rpbmc7CisgIGJvb2wgbmV3RnVsbENvbG91ciA9IGZ1bGxDb2xvdXI7CisgIHVuc2lnbmVkIGludCB0aW1lV2FpdGVkID0gc29jay0+aW5TdHJlYW0oKS50aW1lV2FpdGVkKCk7CisKKyAgLy8gU2VsZWN0IGJlc3QgZW5jb2RpbmcKKyAgaWYgKGtiaXRzUGVyU2Vjb25kID4gMTYwMDAgJiYgdGltZVdhaXRlZCA+PSAxMDAwMCkgeworICAgIG5ld0VuY29kaW5nID0gZW5jb2RpbmdIZXh0aWxlOworICB9IGVsc2UgeworICAgIG5ld0VuY29kaW5nID0gZW5jb2RpbmdaUkxFOworICB9CisKKyAgaWYgKG5ld0VuY29kaW5nICE9IGN1cnJlbnRFbmNvZGluZykgeworICAgIHZsb2cuaW5mbygiVGhyb3VnaHB1dCAlZCBrYml0L3MgLSBjaGFuZ2luZyB0byAlcyBlbmNvZGluZyIsCisgICAgICAgICAgICAgIGtiaXRzUGVyU2Vjb25kLCBlbmNvZGluZ05hbWUobmV3RW5jb2RpbmcpKTsKKyAgICBjdXJyZW50RW5jb2RpbmcgPSBuZXdFbmNvZGluZzsKKyAgICBlbmNvZGluZ0NoYW5nZSA9IHRydWU7CisgIH0KKworICBpZiAoa2JpdHNQZXJTZWNvbmQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjcC5iZWZvcmVWZXJzaW9uKDMsIDgpKSB7CisgICAgLy8gWHZuYyBmcm9tIFRpZ2h0Vk5DIDEuMi45IHNlbmRzIG91dCBGcmFtZWJ1ZmZlclVwZGF0ZXMgd2l0aAorICAgIC8vIGN1cnNvcnMgImFzeW5jaHJvbm91c2x5Ii4gSWYgdGhpcyBoYXBwZW5zIGluIHRoZSBtaWRkbGUgb2YgYQorICAgIC8vIHBpeGVsIGZvcm1hdCBjaGFuZ2UsIHRoZSBzZXJ2ZXIgd2lsbCBlbmNvZGUgdGhlIGN1cnNvciB3aXRoCisgICAgLy8gdGhlIG9sZCBmb3JtYXQsIGJ1dCB0aGUgY2xpZW50IHdpbGwgdHJ5IHRvIGRlY29kZSBpdAorICAgIC8vIGFjY29yZGluZyB0byB0aGUgbmV3IGZvcm1hdC4gVGhpcyB3aWxsIGxlYWQgdG8gYQorICAgIC8vIGNyYXNoLiBUaGVyZWZvcmUsIHdlIGRvIG5vdCBhbGxvdyBhdXRvbWF0aWMgZm9ybWF0IGNoYW5nZSBmb3IKKyAgICAvLyBvbGQgc2VydmVycy4KKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIFNlbGVjdCBiZXN0IGNvbG9yIGxldmVsCisgIG5ld0Z1bGxDb2xvdXIgPSAoa2JpdHNQZXJTZWNvbmQgPiAyNTYpOworICBpZiAobmV3RnVsbENvbG91ciAhPSBmdWxsQ29sb3VyKSB7CisgICAgdmxvZy5pbmZvKCJUaHJvdWdocHV0ICVkIGtiaXQvcyAtIGZ1bGwgY29sb3IgaXMgbm93ICVzIiwgCisJICAgICAga2JpdHNQZXJTZWNvbmQsCisJICAgICAgbmV3RnVsbENvbG91ciA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworICAgIGZ1bGxDb2xvdXIgPSBuZXdGdWxsQ29sb3VyOworICAgIGZvcm1hdENoYW5nZSA9IHRydWU7CisgIH0gCit9CisKKy8vIGNoZWNrRW5jb2RpbmdzKCkgc2VuZHMgYSBzZXRFbmNvZGluZ3MgbWVzc2FnZSBpZiBvbmUgaXMgbmVlZGVkLgordm9pZCBDQ29ubjo6Y2hlY2tFbmNvZGluZ3MoKQoreworICBpZiAoZW5jb2RpbmdDaGFuZ2UgJiYgd3JpdGVyKCkpIHsKKyAgICB2bG9nLmluZm8oIlVzaW5nICVzIGVuY29kaW5nIixlbmNvZGluZ05hbWUoY3VycmVudEVuY29kaW5nKSk7CisgICAgd3JpdGVyKCktPndyaXRlU2V0RW5jb2RpbmdzKGN1cnJlbnRFbmNvZGluZywgdHJ1ZSk7CisgICAgZW5jb2RpbmdDaGFuZ2UgPSBmYWxzZTsKKyAgfQorfQorCisvLyByZXF1ZXN0TmV3VXBkYXRlKCkgcmVxdWVzdHMgYW4gdXBkYXRlIGZyb20gdGhlIHNlcnZlciwgaGF2aW5nIHNldCB0aGUKKy8vIGZvcm1hdCBhbmQgZW5jb2RpbmcgYXBwcm9wcmlhdGVseS4KK3ZvaWQgQ0Nvbm46OnJlcXVlc3ROZXdVcGRhdGUoKQoreworICBpZiAoZm9ybWF0Q2hhbmdlKSB7CisgICAgaWYgKGZ1bGxDb2xvdXIpIHsKKyAgICAgIGRlc2t0b3AtPnNldFBGKGZ1bGxDb2xvdXJQRik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChsb3dDb2xvdXJMZXZlbCA9PSAwKQorICAgICAgICBkZXNrdG9wLT5zZXRQRihQaXhlbEZvcm1hdCg4LDMsMCwxLDEsMSwxLDIsMSwwKSk7CisgICAgICBlbHNlIGlmIChsb3dDb2xvdXJMZXZlbCA9PSAxKQorICAgICAgICBkZXNrdG9wLT5zZXRQRihQaXhlbEZvcm1hdCg4LDYsMCwxLDMsMywzLDQsMiwwKSk7CisgICAgICBlbHNlCisgICAgICAgIGRlc2t0b3AtPnNldFBGKFBpeGVsRm9ybWF0KDgsOCwwLDApKTsKKyAgICB9CisgICAgY2hhciBzdHJbMjU2XTsKKyAgICBkZXNrdG9wLT5nZXRQRigpLnByaW50KHN0ciwgMjU2KTsKKyAgICB2bG9nLmluZm8oIlVzaW5nIHBpeGVsIGZvcm1hdCAlcyIsc3RyKTsKKyAgICBjcC5zZXRQRihkZXNrdG9wLT5nZXRQRigpKTsKKyAgICB3cml0ZXIoKS0+d3JpdGVTZXRQaXhlbEZvcm1hdChjcC5wZigpKTsKKyAgfQorICBjaGVja0VuY29kaW5ncygpOworICB3cml0ZXIoKS0+d3JpdGVGcmFtZWJ1ZmZlclVwZGF0ZVJlcXVlc3QoUmVjdCgwLCAwLCBjcC53aWR0aCwgY3AuaGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmb3JtYXRDaGFuZ2UpOworICBmb3JtYXRDaGFuZ2UgPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3VuaXgvdm5jdmlld2VyL0NDb25uLmggYi91bml4L3ZuY3ZpZXdlci9DQ29ubi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MWFmNDgKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY3ZpZXdlci9DQ29ubi5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gQ0Nvbm4gcmVwcmVzZW50cyBhIGNsaWVudCBjb25uZWN0aW9uIHRvIGEgVk5DIHNlcnZlci4KKy8vCisKKyNpZm5kZWYgX19DQ09OTl9IX18KKyNkZWZpbmUgX19DQ09OTl9IX18KKworI2luY2x1ZGUgPHJmYi9DQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvVXNlclBhc3N3ZEdldHRlci5oPgorI2luY2x1ZGUgPHJkci9GZEluU3RyZWFtLmg+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgIlRYV2luZG93LmgiCisjaW5jbHVkZSAiQWJvdXREaWFsb2cuaCIKKyNpbmNsdWRlICJJbmZvRGlhbG9nLmgiCisjaW5jbHVkZSAiVFhNZW51LmgiCisjaW5jbHVkZSAiT3B0aW9uc0RpYWxvZy5oIgorCitjbGFzcyBUWFdpbmRvdzsKK2NsYXNzIFRYVmlld3BvcnQ7CitjbGFzcyBEZXNrdG9wV2luZG93OworbmFtZXNwYWNlIG5ldHdvcmsgeyBjbGFzcyBTb2NrZXQ7IH0KKworY2xhc3MgQ0Nvbm4gOiBwdWJsaWMgcmZiOjpDQ29ubmVjdGlvbiwgcHVibGljIHJmYjo6VXNlclBhc3N3ZEdldHRlciwKKyAgICAgICAgICAgICAgcHVibGljIFRYRGVsZXRlV2luZG93Q2FsbGJhY2ssCisgICAgICAgICAgICAgIHB1YmxpYyByZHI6OkZkSW5TdHJlYW1CbG9ja0NhbGxiYWNrLAorICAgICAgICAgICAgICBwdWJsaWMgVFhNZW51Q2FsbGJhY2sgLCBwdWJsaWMgT3B0aW9uc0RpYWxvZ0NhbGxiYWNrLAorICAgICAgICAgICAgICBwdWJsaWMgVFhFdmVudEhhbmRsZXIKK3sKK3B1YmxpYzoKKworICBDQ29ubihEaXNwbGF5KiBkcHlfLCBpbnQgYXJnY18sIGNoYXIqKiBhcmd2XywgbmV0d29yazo6U29ja2V0KiBzb2NrXywKKyAgICAgICAgY2hhciogdm5jU2VydmVyTmFtZSwgYm9vbCByZXZlcnNlPWZhbHNlKTsKKyAgfkNDb25uKCk7CisKKyAgLy8gVFhEZWxldGVXaW5kb3dDYWxsYmFjayBtZXRob2RzCisgIHZvaWQgZGVsZXRlV2luZG93KFRYV2luZG93KiB3KTsKKworICAvLyBGZEluU3RyZWFtQmxvY2tDYWxsYmFjayBtZXRob2RzCisgIHZvaWQgYmxvY2tDYWxsYmFjaygpOworCisgIC8vIFVzZXJQYXNzd2RHZXR0ZXIgbWV0aG9kcworICB2aXJ0dWFsIHZvaWQgZ2V0VXNlclBhc3N3ZChjaGFyKiogdXNlciwgY2hhcioqIHBhc3N3b3JkKTsKKworICAvLyBUWE1lbnVDYWxsYmFjayBtZXRob2RzCisgIHZvaWQgbWVudVNlbGVjdChsb25nIGlkLCBUWE1lbnUqIG0pOworCisgIC8vIE9wdGlvbnNEaWFsb2dDYWxsYmFjayBtZXRob2RzCisgIHZpcnR1YWwgdm9pZCBzZXRPcHRpb25zKCk7CisgIHZpcnR1YWwgdm9pZCBnZXRPcHRpb25zKCk7CisKKyAgLy8gVFhFdmVudEhhbmRsZXIgY2FsbGJhY2sgbWV0aG9kCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVFdmVudChUWFdpbmRvdyogdywgWEV2ZW50KiBldik7CisgIAorICAvLyBDQ29ubmVjdGlvbiBjYWxsYmFjayBtZXRob2RzCisgIHJmYjo6Q1NlY3VyaXR5KiBnZXRDU2VjdXJpdHkoaW50IHNlY1R5cGUpOworICB2b2lkIHNlcnZlckluaXQoKTsKKyAgdm9pZCBzZXREZXNrdG9wU2l6ZShpbnQgdywgaW50IGgpOworICB2b2lkIHNldENvbG91ck1hcEVudHJpZXMoaW50IGZpcnN0Q29sb3VyLCBpbnQgbkNvbG91cnMsIHJkcjo6VTE2KiByZ2JzKTsKKyAgdm9pZCBiZWxsKCk7CisgIHZvaWQgc2VydmVyQ3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pOworICB2b2lkIGZyYW1lYnVmZmVyVXBkYXRlRW5kKCk7CisgIHZvaWQgYmVnaW5SZWN0KGNvbnN0IHJmYjo6UmVjdCYgciwgdW5zaWduZWQgaW50IGVuY29kaW5nKTsKKyAgdm9pZCBlbmRSZWN0KGNvbnN0IHJmYjo6UmVjdCYgciwgdW5zaWduZWQgaW50IGVuY29kaW5nKTsKKyAgdm9pZCBmaWxsUmVjdChjb25zdCByZmI6OlJlY3QmIHIsIHJmYjo6UGl4ZWwgcCk7CisgIHZvaWQgaW1hZ2VSZWN0KGNvbnN0IHJmYjo6UmVjdCYgciwgdm9pZCogcCk7CisgIHZvaWQgY29weVJlY3QoY29uc3QgcmZiOjpSZWN0JiByLCBpbnQgc3gsIGludCBzeSk7CisgIHZvaWQgc2V0Q3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgcmZiOjpQb2ludCYgaG90c3BvdCwKKyAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwgdm9pZCogbWFzayk7CisKK3ByaXZhdGU6CisKKyAgdm9pZCByZWNyZWF0ZVZpZXdwb3J0KCk7CisgIHZvaWQgcmVjb25maWd1cmVWaWV3cG9ydCgpOworICB2b2lkIGluaXRNZW51KCk7CisgIHZvaWQgc2hvd01lbnUoaW50IHgsIGludCB5KTsKKyAgdm9pZCBhdXRvU2VsZWN0Rm9ybWF0QW5kRW5jb2RpbmcoKTsKKyAgdm9pZCBjaGVja0VuY29kaW5ncygpOworICB2b2lkIHJlcXVlc3ROZXdVcGRhdGUoKTsKKworICBEaXNwbGF5KiBkcHk7CisgIGludCBhcmdjOworICBjaGFyKiogYXJndjsKKyAgY2hhciogc2VydmVySG9zdDsKKyAgaW50IHNlcnZlclBvcnQ7CisgIG5ldHdvcms6OlNvY2tldCogc29jazsKKyAgcmZiOjpQaXhlbEZvcm1hdCBzZXJ2ZXJQRjsKKyAgVFhWaWV3cG9ydCogdmlld3BvcnQ7CisgIERlc2t0b3BXaW5kb3cqIGRlc2t0b3A7CisgIFRYRXZlbnRIYW5kbGVyKiBkZXNrdG9wRXZlbnRIYW5kbGVyOworICByZmI6OlBpeGVsRm9ybWF0IGZ1bGxDb2xvdXJQRjsKKyAgc3RkOjpsaXN0PHJmYjo6UmVjdD4gZGVidWdSZWN0czsKKyAgdW5zaWduZWQgaW50IGN1cnJlbnRFbmNvZGluZywgbGFzdFNlcnZlckVuY29kaW5nOworICBib29sIGZ1bGxDb2xvdXI7CisgIGJvb2wgYXV0b1NlbGVjdDsKKyAgYm9vbCBzaGFyZWQ7CisgIGJvb2wgZm9ybWF0Q2hhbmdlOworICBib29sIGVuY29kaW5nQ2hhbmdlOworICBib29sIHNhbWVNYWNoaW5lOworICBib29sIGZ1bGxTY3JlZW47CisgIGJvb2wgY3RybERvd247CisgIGJvb2wgYWx0RG93bjsKKyAgS2V5U3ltIG1lbnVLZXlzeW07CisgIFRYTWVudSBtZW51OworICBUWEV2ZW50SGFuZGxlciogbWVudUV2ZW50SGFuZGxlcjsKKyAgT3B0aW9uc0RpYWxvZyBvcHRpb25zOworICBBYm91dERpYWxvZyBhYm91dDsKKyAgSW5mb0RpYWxvZyBpbmZvOworICBib29sIHJldmVyc2VDb25uZWN0aW9uOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3ZuY3ZpZXdlci9EZXNrdG9wV2luZG93LmN4eCBiL3VuaXgvdm5jdmlld2VyL0Rlc2t0b3BXaW5kb3cuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzU3MmEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY3ZpZXdlci9EZXNrdG9wV2luZG93LmN4eApAQCAtMCwwICsxLDU3MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIERlc2t0b3BXaW5kb3cuY3h4CisvLworCisjaW5jbHVkZSAiRGVza3RvcFdpbmRvdy5oIgorI2luY2x1ZGUgIkNDb25uLmgiCisjaW5jbHVkZSA8cmZiL0NNc2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisjaW5jbHVkZSA8WDExL2tleXN5bS5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicGFyYW1ldGVycy5oIgorCisjaWZuZGVmIFhLX0lTT19MZWZ0X1RhYgorI2RlZmluZQlYS19JU09fTGVmdF9UYWIJCQkJCTB4RkUyMAorI2VuZGlmCisKK3N0YXRpYyByZHI6OlU4IHJldmVyc2VCaXRzW10gPSB7CisgIDB4MDAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4MjAsIDB4YTAsIDB4NjAsIDB4ZTAsIDB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsCisgIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsIDB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsCisgIDB4MTgsIDB4OTgsIDB4NTgsIDB4ZDgsIDB4MzgsIDB4YjgsIDB4NzgsIDB4ZjgsIDB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsCisgIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsIDB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsCisgIDB4MGMsIDB4OGMsIDB4NGMsIDB4Y2MsIDB4MmMsIDB4YWMsIDB4NmMsIDB4ZWMsIDB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsCisgIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsIDB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsCisgIDB4MTIsIDB4OTIsIDB4NTIsIDB4ZDIsIDB4MzIsIDB4YjIsIDB4NzIsIDB4ZjIsIDB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsCisgIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsIDB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsCisgIDB4MDYsIDB4ODYsIDB4NDYsIDB4YzYsIDB4MjYsIDB4YTYsIDB4NjYsIDB4ZTYsIDB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsCisgIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsIDB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsCisgIDB4MWUsIDB4OWUsIDB4NWUsIDB4ZGUsIDB4M2UsIDB4YmUsIDB4N2UsIDB4ZmUsIDB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsCisgIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsIDB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsCisgIDB4MDksIDB4ODksIDB4NDksIDB4YzksIDB4MjksIDB4YTksIDB4NjksIDB4ZTksIDB4MTksIDB4OTksIDB4NTksIDB4ZDksCisgIDB4MzksIDB4YjksIDB4NzksIDB4ZjksIDB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsCisgIDB4MTUsIDB4OTUsIDB4NTUsIDB4ZDUsIDB4MzUsIDB4YjUsIDB4NzUsIDB4ZjUsIDB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsCisgIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsIDB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsCisgIDB4MDMsIDB4ODMsIDB4NDMsIDB4YzMsIDB4MjMsIDB4YTMsIDB4NjMsIDB4ZTMsIDB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsCisgIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsIDB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsCisgIDB4MWIsIDB4OWIsIDB4NWIsIDB4ZGIsIDB4M2IsIDB4YmIsIDB4N2IsIDB4ZmIsIDB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsCisgIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsIDB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsCisgIDB4MGYsIDB4OGYsIDB4NGYsIDB4Y2YsIDB4MmYsIDB4YWYsIDB4NmYsIDB4ZWYsIDB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsCisgIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmYKK307CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK3N0YXRpYyByZmI6OkxvZ1dyaXRlciB2bG9nKCJEZXNrdG9wV2luZG93Iik7CisKK0Rlc2t0b3BXaW5kb3c6OkRlc2t0b3BXaW5kb3coRGlzcGxheSogZHB5LCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJmYjo6UGl4ZWxGb3JtYXQmIHNlcnZlclBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29ubiogY2NfLCBUWFdpbmRvdyogcGFyZW50KQorICA6IFRYV2luZG93KGRweSwgdywgaCwgcGFyZW50KSwgY2MoY2NfKSwgaW0oMCksCisgICAgY3Vyc29yVmlzaWJsZShmYWxzZSksIGN1cnNvckF2YWlsYWJsZShmYWxzZSksIGN1cnJlbnRTZWxlY3Rpb25UaW1lKDApLAorICAgIG5ld1NlbGVjdGlvbigwKSwgZ2V0dGluZ0luaXRpYWxTZWxlY3Rpb25UaW1lKHRydWUpLAorICAgIG5ld1NlcnZlckN1dFRleHQoZmFsc2UpLCBzZXJ2ZXJDdXRUZXh0XygwKSwKKyAgICBzZXRDb2xvdXJNYXBFbnRyaWVzVGltZXIodGhpcyksIHZpZXdwb3J0KDApLAorICAgIHBvaW50ZXJFdmVudFRpbWVyKHRoaXMpLAorICAgIGxhc3RCdXR0b25NYXNrKDApCit7CisgIHNldEV2ZW50SGFuZGxlcih0aGlzKTsKKyAgZ2MgPSBYQ3JlYXRlR0MoZHB5LCB3aW4oKSwgMCwgMCk7CisgIGFkZEV2ZW50TWFzayhFeHBvc3VyZU1hc2sgfCBCdXR0b25QcmVzc01hc2sgfCBCdXR0b25SZWxlYXNlTWFzayB8CisgICAgICAgICAgICAgICBQb2ludGVyTW90aW9uTWFzayB8IEtleVByZXNzTWFzayB8IEtleVJlbGVhc2VNYXNrIHwKKyAgICAgICAgICAgICAgIEVudGVyV2luZG93TWFzayB8IExlYXZlV2luZG93TWFzayk7CisgIGNyZWF0ZVhDdXJzb3JzKCk7CisgIFhEZWZpbmVDdXJzb3IoZHB5LCB3aW4oKSwgZG90Q3Vyc29yKTsKKyAgaW0gPSBuZXcgVFhJbWFnZShkcHksIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgaWYgKCFzZXJ2ZXJQRi50cnVlQ29sb3VyKQorICAgIGltLT5zZXRQRihzZXJ2ZXJQRik7CisgIFhDb252ZXJ0U2VsZWN0aW9uKGRweSwgc2VuZFByaW1hcnkgPyBYQV9QUklNQVJZIDogeGFDTElQQk9BUkQsIHhhVElNRVNUQU1QLAorICAgICAgICAgICAgICAgICAgICB4YVNFTEVDVElPTl9USU1FLCB3aW4oKSwgQ3VycmVudFRpbWUpOworICBtZW1zZXQoZG93bktleXN5bSwgMCwgMjU2KjQpOworfQorCitEZXNrdG9wV2luZG93Ojp+RGVza3RvcFdpbmRvdygpCit7CisgIFhGcmVlR0MoZHB5LCBnYyk7CisgIFhGcmVlQ3Vyc29yKGRweSwgZG90Q3Vyc29yKTsKKyAgWEZyZWVDdXJzb3IoZHB5LCBub0N1cnNvcik7CisgIGlmIChsb2NhbFhDdXJzb3IpCisgICAgWEZyZWVDdXJzb3IoZHB5LCBsb2NhbFhDdXJzb3IpOworICBkZWxldGUgaW07Cit9CisKK3ZvaWQgRGVza3RvcFdpbmRvdzo6c2V0Vmlld3BvcnQoVFhWaWV3cG9ydCogdmlld3BvcnRfKQoreworICB2aWV3cG9ydCA9IHZpZXdwb3J0XzsKKyAgdmlld3BvcnQtPnNldENoaWxkKHRoaXMpOworfQorCisvLyBDdXJzb3Igc3R1ZmYKKwordm9pZCBEZXNrdG9wV2luZG93OjpjcmVhdGVYQ3Vyc29ycygpCit7CisgIHN0YXRpYyBjaGFyIGRvdFNvdXJjZVtdID0geyAweDAwLCAweDBlLCAweDBlLCAweDBlLCAweDAwIH07CisgIHN0YXRpYyBjaGFyIGRvdE1hc2tbXSAgID0geyAweDFmLCAweDFmLCAweDFmLCAweDFmLCAweDFmIH07CisgIFBpeG1hcCBzb3VyY2UgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCB3aW4oKSwgZG90U291cmNlLCA1LCA1KTsKKyAgUGl4bWFwIG1hc2sgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCB3aW4oKSwgZG90TWFzaywgNSwgNSk7CisgIFhDb2xvciBmZywgYmc7CisgIGZnLnJlZCA9IGZnLmdyZWVuID0gZmcuYmx1ZSA9IDA7CisgIGJnLnJlZCA9IGJnLmdyZWVuID0gYmcuYmx1ZSA9IDB4ZmZmZjsKKyAgZG90Q3Vyc29yID0gWENyZWF0ZVBpeG1hcEN1cnNvcihkcHksIHNvdXJjZSwgbWFzaywgJmZnLCAmYmcsIDIsIDIpOworICBYRnJlZVBpeG1hcChkcHksIHNvdXJjZSk7CisgIFhGcmVlUGl4bWFwKGRweSwgbWFzayk7CisgIGNoYXIgemVybyA9IDA7CisgIFBpeG1hcCBlbXB0eSA9IFhDcmVhdGVCaXRtYXBGcm9tRGF0YShkcHksIHdpbigpLCAmemVybywgMSwgMSk7CisgIG5vQ3Vyc29yID0gWENyZWF0ZVBpeG1hcEN1cnNvcihkcHksIGVtcHR5LCBlbXB0eSwgJmZnLCAmYmcsIDAsIDApOworICBYRnJlZVBpeG1hcChkcHksIGVtcHR5KTsKKyAgbG9jYWxYQ3Vyc29yID0gMDsKK30KKwordm9pZCBEZXNrdG9wV2luZG93OjpzZXRDdXJzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBQb2ludCYgaG90c3BvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEsIHZvaWQqIG1hc2spCit7CisgIGlmICghdXNlTG9jYWxDdXJzb3IpIHJldHVybjsKKworICBoaWRlTG9jYWxDdXJzb3IoKTsKKworICBpbnQgbWFza19sZW4gPSAoKHdpZHRoKzcpLzgpICogaGVpZ2h0OworCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWFza19sZW47IGkrKykKKyAgICBpZiAoKChyZHI6OlU4KiltYXNrKVtpXSkgYnJlYWs7CisKKyAgaWYgKGkgPT0gbWFza19sZW4pIHsKKyAgICBpZiAoZG90V2hlbk5vQ3Vyc29yKSB7CisgICAgICB2bG9nLmRlYnVnKCJjdXJzb3IgaXMgZW1wdHkgLSB1c2luZyBkb3QiKTsKKyAgICAgIFhEZWZpbmVDdXJzb3IoZHB5LCB3aW4oKSwgZG90Q3Vyc29yKTsKKyAgICB9IGVsc2UgeworICAgICAgWERlZmluZUN1cnNvcihkcHksIHdpbigpLCBub0N1cnNvcik7CisgICAgfQorICAgIGN1cnNvckF2YWlsYWJsZSA9IGZhbHNlOworICAgIHJldHVybjsKKyAgfQorCisgIGN1cnNvci5ob3RzcG90ID0gaG90c3BvdDsKKworICBjdXJzb3Iuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgY3Vyc29yLnNldFBGKGdldFBGKCkpOworICBjdXJzb3IuaW1hZ2VSZWN0KGN1cnNvci5nZXRSZWN0KCksIGRhdGEpOworCisgIGN1cnNvckJhY2tpbmcuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgY3Vyc29yQmFja2luZy5zZXRQRihnZXRQRigpKTsKKworICBkZWxldGUgW10gY3Vyc29yLm1hc2suYnVmOworICBjdXJzb3IubWFzay5idWYgPSBuZXcgcmRyOjpVOFttYXNrX2xlbl07CisgIG1lbWNweShjdXJzb3IubWFzay5idWYsIG1hc2ssIG1hc2tfbGVuKTsKKworICBQaXhlbCBwaXgwLCBwaXgxOworICByZHI6OlU4QXJyYXkgYml0bWFwKGN1cnNvci5nZXRCaXRtYXAoJnBpeDAsICZwaXgxKSk7CisgIGlmIChiaXRtYXAuYnVmICYmIGN1cnNvci5nZXRSZWN0KCkuY29udGFpbnMoY3Vyc29yLmhvdHNwb3QpKSB7CisgICAgaW50IGJ5dGVzUGVyUm93ID0gKGN1cnNvci53aWR0aCgpICsgNykgLyA4OworICAgIGZvciAoaW50IGogPSAwOyBqIDwgY3Vyc29yLmhlaWdodCgpOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNQZXJSb3c7IGkrKykgeworICAgICAgICBiaXRtYXAuYnVmW2ogKiBieXRlc1BlclJvdyArIGldCisgICAgICAgICAgPSByZXZlcnNlQml0c1tiaXRtYXAuYnVmW2ogKiBieXRlc1BlclJvdyArIGldXTsKKyAgICAgICAgY3Vyc29yLm1hc2suYnVmW2ogKiBieXRlc1BlclJvdyArIGldCisgICAgICAgICAgPSByZXZlcnNlQml0c1tjdXJzb3IubWFzay5idWZbaiAqIGJ5dGVzUGVyUm93ICsgaV1dOworICAgICAgfQorICAgIH0KKyAgICBQaXhtYXAgc291cmNlID0gWENyZWF0ZUJpdG1hcEZyb21EYXRhKGRweSwgd2luKCksIChjaGFyKiliaXRtYXAuYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLndpZHRoKCksIGN1cnNvci5oZWlnaHQoKSk7CisgICAgUGl4bWFwIG1hc2sgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoZHB5LCB3aW4oKSwgKGNoYXIqKWN1cnNvci5tYXNrLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Iud2lkdGgoKSwgY3Vyc29yLmhlaWdodCgpKTsKKyAgICBDb2xvdXIgcmdiOworICAgIFhDb2xvciBmZywgYmc7CisgICAgZ2V0UEYoKS5yZ2JGcm9tUGl4ZWwocGl4MSwgaW0tPmdldENvbG91ck1hcCgpLCAmcmdiKTsKKyAgICBmZy5yZWQgPSByZ2IucjsgZmcuZ3JlZW4gPSByZ2IuZzsgZmcuYmx1ZSA9IHJnYi5iOworICAgIGdldFBGKCkucmdiRnJvbVBpeGVsKHBpeDAsIGltLT5nZXRDb2xvdXJNYXAoKSwgJnJnYik7CisgICAgYmcucmVkID0gcmdiLnI7IGJnLmdyZWVuID0gcmdiLmc7IGJnLmJsdWUgPSByZ2IuYjsKKyAgICBpZiAobG9jYWxYQ3Vyc29yKQorICAgICAgWEZyZWVDdXJzb3IoZHB5LCBsb2NhbFhDdXJzb3IpOworICAgIGxvY2FsWEN1cnNvciA9IFhDcmVhdGVQaXhtYXBDdXJzb3IoZHB5LCBzb3VyY2UsIG1hc2ssICZmZywgJmJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmhvdHNwb3QueCwgY3Vyc29yLmhvdHNwb3QueSk7CisgICAgWERlZmluZUN1cnNvcihkcHksIHdpbigpLCBsb2NhbFhDdXJzb3IpOworICAgIFhGcmVlUGl4bWFwKGRweSwgc291cmNlKTsKKyAgICBYRnJlZVBpeG1hcChkcHksIG1hc2spOworICAgIGN1cnNvckF2YWlsYWJsZSA9IGZhbHNlOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghY3Vyc29yQXZhaWxhYmxlKSB7CisgICAgWERlZmluZUN1cnNvcihkcHksIHdpbigpLCBub0N1cnNvcik7CisgICAgY3Vyc29yQXZhaWxhYmxlID0gdHJ1ZTsKKyAgfQorCisgIHNob3dMb2NhbEN1cnNvcigpOworfQorCit2b2lkIERlc2t0b3BXaW5kb3c6OnJlc2V0TG9jYWxDdXJzb3IoKQoreworICBoaWRlTG9jYWxDdXJzb3IoKTsKKyAgWERlZmluZUN1cnNvcihkcHksIHdpbigpLCBkb3RDdXJzb3IpOworICBjdXJzb3JBdmFpbGFibGUgPSBmYWxzZTsKK30KKwordm9pZCBEZXNrdG9wV2luZG93OjpoaWRlTG9jYWxDdXJzb3IoKQoreworICAvLyAtIEJsaXQgdGhlIGN1cnNvciBiYWNraW5nIHN0b3JlIG92ZXIgdGhlIGN1cnNvcgorICBpZiAoY3Vyc29yVmlzaWJsZSkgeworICAgIGN1cnNvclZpc2libGUgPSBmYWxzZTsKKyAgICBpbS0+aW1hZ2VSZWN0KGN1cnNvckJhY2tpbmdSZWN0LCBjdXJzb3JCYWNraW5nLmRhdGEpOworICAgIGltLT5wdXQod2luKCksIGdjLCBjdXJzb3JCYWNraW5nUmVjdCk7CisgIH0KK30KKwordm9pZCBEZXNrdG9wV2luZG93OjpzaG93TG9jYWxDdXJzb3IoKQoreworICBpZiAoY3Vyc29yQXZhaWxhYmxlICYmICFjdXJzb3JWaXNpYmxlKSB7CisgICAgaWYgKCFnZXRQRigpLmVxdWFsKGN1cnNvci5nZXRQRigpKSB8fAorICAgICAgICBjdXJzb3IuZ2V0UmVjdCgpLmlzX2VtcHR5KCkpIHsKKyAgICAgIHZsb2cuZXJyb3IoImF0dGVtcHRpbmcgdG8gcmVuZGVyIGludmFsaWQgbG9jYWwgY3Vyc29yIik7CisgICAgICBYRGVmaW5lQ3Vyc29yKGRweSwgd2luKCksIGRvdEN1cnNvcik7CisgICAgICBjdXJzb3JBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3Vyc29yVmlzaWJsZSA9IHRydWU7CisKKyAgICByZmI6OlJlY3QgY3Vyc29yUmVjdCA9IChjdXJzb3IuZ2V0UmVjdCgpLnRyYW5zbGF0ZShjdXJzb3JQb3MpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShjdXJzb3IuaG90c3BvdC5uZWdhdGUoKSkpOworICAgIGN1cnNvckJhY2tpbmdSZWN0ID0gY3Vyc29yUmVjdC5pbnRlcnNlY3QoaW0tPmdldFJlY3QoKSk7CisgICAgaW0tPmdldEltYWdlKGN1cnNvckJhY2tpbmcuZGF0YSwgY3Vyc29yQmFja2luZ1JlY3QpOworCisgICAgaW0tPm1hc2tSZWN0KGN1cnNvclJlY3QsIGN1cnNvci5kYXRhLCBjdXJzb3IubWFzay5idWYpOworICAgIGltLT5wdXQod2luKCksIGdjLCBjdXJzb3JCYWNraW5nUmVjdCk7CisgIH0KK30KKworLy8gc2V0Q29sb3VyTWFwRW50cmllcygpIGNoYW5nZXMgc29tZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3VybWFwLgorLy8gVW5mb3J0dW5hdGVseSB0aGVzZSBtZXNzYWdlcyBhcmUgb2Z0ZW4gc2VudCBvbmUgYXQgYSB0aW1lLCBzbyB3ZSBkZWxheSB0aGUKKy8vIHNldHRpbmdzIHRha2luZyBlZmZlY3QgYnkgMTAwbXMuICBUaGlzIGlzIGJlY2F1c2UgcmVjYWxjdWxhdGluZyB0aGUgaW50ZXJuYWwKKy8vIHRyYW5zbGF0aW9uIHRhYmxlIGNhbiBiZSBleHBlbnNpdmUuCit2b2lkIERlc2t0b3BXaW5kb3c6OnNldENvbG91ck1hcEVudHJpZXMoaW50IGZpcnN0Q29sb3VyLCBpbnQgbkNvbG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRyOjpVMTYqIHJnYnMpCit7CisgIGltLT5zZXRDb2xvdXJNYXBFbnRyaWVzKGZpcnN0Q29sb3VyLCBuQ29sb3Vycywgcmdicyk7CisgIGlmICghc2V0Q29sb3VyTWFwRW50cmllc1RpbWVyLmlzU3RhcnRlZCgpKQorICAgIHNldENvbG91ck1hcEVudHJpZXNUaW1lci5zdGFydCgxMDApOworfQorCit2b2lkIERlc2t0b3BXaW5kb3c6OnNlcnZlckN1dFRleHQoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKQoreworICBpZiAoYWNjZXB0Q2xpcGJvYXJkKSB7CisgICAgbmV3U2VydmVyQ3V0VGV4dCA9IHRydWU7CisgICAgZGVsZXRlIFtdIHNlcnZlckN1dFRleHRfOworICAgIHNlcnZlckN1dFRleHRfID0gbmV3IGNoYXJbbGVuKzFdOworICAgIG1lbWNweShzZXJ2ZXJDdXRUZXh0Xywgc3RyLCBsZW4pOworICAgIHNlcnZlckN1dFRleHRfW2xlbl0gPSAwOworICB9Cit9CisKKworLy8gQ2FsbCBYU3luYygpIGF0IHRoZSBlbmQgb2YgYW4gdXBkYXRlLiAgV2UgZG8gdGhpcyBiZWNhdXNlIHdlJ2QgbGlrZSB0bworLy8gZW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgdXBkYXRlIGhhcyBhY3R1YWxseSBiZWVuIGRyYXduIGJ5IHRoZSBYIHNlcnZlcgorLy8gYmVmb3JlIHRoZSBuZXh0IHVwZGF0ZSBhcnJpdmVzIC0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNvcHlSZWN0IHRvCisvLyBiZWhhdmUgY29ycmVjdGx5LiAgSW4gcGFydGljdWxhciwgaWYgcGFydCBvZiB0aGUgc291cmNlIG9mIGEgY29weVJlY3QgaXMKKy8vIG5vdCBhY3R1YWxseSBkaXNwbGF5ZWQgaW4gdGhlIHdpbmRvdywgdGhlbiBYQ29weUFyZWEgcmVzdWx0cyBpbgorLy8gR3JhcGhpY3NFeHBvc2UgZXZlbnRzLCB3aGljaCByZXF1aXJlIHVzIHRvIGRyYXcgZnJvbSB0aGUgb2ZmLXNjcmVlbgorLy8gaW1hZ2UuICBCeSB0aGUgdGltZSBYU3luYyByZXR1cm5zLCB0aGUgR3JhcGhpY3NFeHBvc2UgZXZlbnRzIHdpbGwgYmUgaW4KKy8vIFhsaWIncyBxdWV1ZSwgc28gaG9wZWZ1bGx5IHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgbmV4dCB1cGRhdGUuCisvLyBQb3NzaWJseSB3ZSBzaG91bGQgcHJvY2VzcyB0aGUgR3JhcGhpY3NFeHBvc2UgZXZlbnRzIGhlcmUgZXhwbGljaXRseT8KKwordm9pZCBEZXNrdG9wV2luZG93OjpmcmFtZWJ1ZmZlclVwZGF0ZUVuZCgpCit7CisgIFhTeW5jKGRweSwgRmFsc2UpOworfQorCisKKy8vIGludmVydFJlY3QoKSBmbGlwcyBhbGwgdGhlIGJpdHMgaW4gZXZlcnkgcGl4ZWwgaW4gdGhlIGdpdmVuIHJlY3RhbmdsZQorCit2b2lkIERlc2t0b3BXaW5kb3c6OmludmVydFJlY3QoY29uc3QgUmVjdCYgcikKK3sKKyAgaW50IHN0cmlkZTsKKyAgcmRyOjpVOCogcCA9IGltLT5nZXRQaXhlbHNSVyhyLCAmc3RyaWRlKTsKKyAgZm9yIChpbnQgeSA9IDA7IHkgPCByLmhlaWdodCgpOyB5KyspIHsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHIud2lkdGgoKTsgeCsrKSB7CisgICAgICBzd2l0Y2ggKGdldFBGKCkuYnBwKSB7CisgICAgICBjYXNlIDg6ICAoKHJkcjo6VTgqIClwKVt4K3kqc3RyaWRlXSBePSAweGZmOyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTY6ICgocmRyOjpVMTYqKXApW3greSpzdHJpZGVdIF49IDB4ZmZmZjsgICAgIGJyZWFrOworICAgICAgY2FzZSAzMjogKChyZHI6OlUzMiopcClbeCt5KnN0cmlkZV0gXj0gMHhmZmZmZmZmZjsgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGltLT5wdXQod2luKCksIGdjLCByKTsKK30KKworCisvLyByZXNpemUoKSAtIHJlc2l6ZSB0aGUgd2luZG93IGFuZCB0aGUgaW1hZ2UsIHRha2luZyBjYXJlIHRvIHJlbW92ZSB0aGUgbG9jYWwKKy8vIGN1cnNvciBmaXJzdC4KK3ZvaWQgRGVza3RvcFdpbmRvdzo6cmVzaXplKGludCB3LCBpbnQgaCkKK3sKKyAgaGlkZUxvY2FsQ3Vyc29yKCk7CisgIFRYV2luZG93OjpyZXNpemUodywgaCk7CisgIGltLT5yZXNpemUodywgaCk7Cit9CisKKworYm9vbCBEZXNrdG9wV2luZG93OjpoYW5kbGVUaW1lb3V0KHJmYjo6VGltZXIqIHRpbWVyKQoreworICBpZiAodGltZXIgPT0gJnNldENvbG91ck1hcEVudHJpZXNUaW1lcikgeworICAgIGltLT51cGRhdGVDb2xvdXJNYXAoKTsKKyAgICBpbS0+cHV0KHdpbigpLCBnYywgaW0tPmdldFJlY3QoKSk7CisgIH0gZWxzZSBpZiAodGltZXIgPT0gJnBvaW50ZXJFdmVudFRpbWVyKSB7CisgICAgaWYgKCF2aWV3T25seSkgeworICAgICAgY2MtPndyaXRlcigpLT5wb2ludGVyRXZlbnQobGFzdFBvaW50ZXJQb3MsIGxhc3RCdXR0b25NYXNrKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK3ZvaWQgRGVza3RvcFdpbmRvdzo6aGFuZGxlUG9pbnRlckV2ZW50KGNvbnN0IFBvaW50JiBwb3MsIGludCBidXR0b25NYXNrKQoreworICBpZiAoIXZpZXdPbmx5KSB7CisgICAgaWYgKHBvaW50ZXJFdmVudEludGVydmFsID09IDAgfHwgYnV0dG9uTWFzayAhPSBsYXN0QnV0dG9uTWFzaykgeworICAgICAgY2MtPndyaXRlcigpLT5wb2ludGVyRXZlbnQocG9zLCBidXR0b25NYXNrKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFwb2ludGVyRXZlbnRUaW1lci5pc1N0YXJ0ZWQoKSkKKyAgICAgICAgcG9pbnRlckV2ZW50VGltZXIuc3RhcnQocG9pbnRlckV2ZW50SW50ZXJ2YWwpOworICAgIH0KKyAgICBsYXN0UG9pbnRlclBvcyA9IHBvczsKKyAgICBsYXN0QnV0dG9uTWFzayA9IGJ1dHRvbk1hc2s7CisgIH0KKyAgLy8gLSBJZiBsb2NhbCBjdXJzb3IgcmVuZGVyaW5nIGlzIGVuYWJsZWQgdGhlbiB1c2UgaXQKKyAgaWYgKGN1cnNvckF2YWlsYWJsZSkgeworICAgIC8vIC0gUmVuZGVyIHRoZSBjdXJzb3IhCisgICAgaWYgKCFwb3MuZXF1YWxzKGN1cnNvclBvcykpIHsKKyAgICAgIGhpZGVMb2NhbEN1cnNvcigpOworICAgICAgaWYgKGltLT5nZXRSZWN0KCkuY29udGFpbnMocG9zKSkgeworICAgICAgICBjdXJzb3JQb3MgPSBwb3M7CisgICAgICAgIHNob3dMb2NhbEN1cnNvcigpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8vIGhhbmRsZVhFdmVudCgpIGhhbmRsZXMgdGhlIHZhcmlvdXMgWCBldmVudHMgb24gdGhlIHdpbmRvdwordm9pZCBEZXNrdG9wV2luZG93OjpoYW5kbGVFdmVudChUWFdpbmRvdyogdywgWEV2ZW50KiBldikKK3sKKyAgc3dpdGNoIChldi0+dHlwZSkgeworICBjYXNlIEdyYXBoaWNzRXhwb3NlOgorICBjYXNlIEV4cG9zZToKKyAgICBpbS0+cHV0KHdpbigpLCBnYywgUmVjdChldi0+eGV4cG9zZS54LCBldi0+eGV4cG9zZS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LT54ZXhwb3NlLnggKyBldi0+eGV4cG9zZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi0+eGV4cG9zZS55ICsgZXYtPnhleHBvc2UuaGVpZ2h0KSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBNb3Rpb25Ob3RpZnk6CisgICAgd2hpbGUgKFhDaGVja1R5cGVkV2luZG93RXZlbnQoZHB5LCB3aW4oKSwgTW90aW9uTm90aWZ5LCBldikpOworICAgIGlmICh2aWV3cG9ydCAmJiB2aWV3cG9ydC0+YnVtcFNjcm9sbEV2ZW50KCZldi0+eG1vdGlvbikpIGJyZWFrOworICAgIGhhbmRsZVBvaW50ZXJFdmVudChQb2ludChldi0+eG1vdGlvbi54LCBldi0+eG1vdGlvbi55KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGV2LT54bW90aW9uLnN0YXRlICYgMHgxZjAwKSA+PiA4KTsKKyAgICBicmVhazsKKworICBjYXNlIEJ1dHRvblByZXNzOgorICAgIGhhbmRsZVBvaW50ZXJFdmVudChQb2ludChldi0+eGJ1dHRvbi54LCBldi0+eGJ1dHRvbi55KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgoZXYtPnhidXR0b24uc3RhdGUgJiAweDFmMDApID4+IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IChldi0+eGJ1dHRvbi5idXR0b24tMSkpKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBCdXR0b25SZWxlYXNlOgorICAgIGhhbmRsZVBvaW50ZXJFdmVudChQb2ludChldi0+eGJ1dHRvbi54LCBldi0+eGJ1dHRvbi55KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgoZXYtPnhidXR0b24uc3RhdGUgJiAweDFmMDApID4+IDgpICYKKyAgICAgICAgICAgICAgICAgICAgICAgIH4oMSA8PCAoZXYtPnhidXR0b24uYnV0dG9uLTEpKSkpOworICAgIGJyZWFrOworCisgIGNhc2UgS2V5UHJlc3M6CisgICAgaWYgKCF2aWV3T25seSkgeworICAgICAgS2V5U3ltIGtzOworICAgICAgY2hhciBrZXluYW1lWzI1Nl07CisgICAgICBYTG9va3VwU3RyaW5nKCZldi0+eGtleSwga2V5bmFtZSwgMjU2LCAma3MsIE5VTEwpOworICAgICAgYm9vbCBmYWtlU2hpZnRQcmVzcyA9IGZhbHNlOworCisgICAgICAvLyBUdXJuIElTT19MZWZ0X1RhYiBpbnRvIHNoaWZ0ZWQgVGFiCisgICAgICBpZiAoa3MgPT0gWEtfSVNPX0xlZnRfVGFiKSB7CisgICAgICAgIGZha2VTaGlmdFByZXNzID0gIShldi0+eGtleS5zdGF0ZSAmIFNoaWZ0TWFzayk7CisgICAgICAgIGtzID0gWEtfVGFiOworICAgICAgfQorCisgICAgICBpZiAoZmFrZVNoaWZ0UHJlc3MpCisgICAgICAgIGNjLT53cml0ZXIoKS0+a2V5RXZlbnQoWEtfU2hpZnRfTCwgdHJ1ZSk7CisKKyAgICAgIGRvd25LZXlzeW1bZXYtPnhrZXkua2V5Y29kZV0gPSBrczsKKyAgICAgIGNjLT53cml0ZXIoKS0+a2V5RXZlbnQoa3MsIHRydWUpOworCisgICAgICBpZiAoZmFrZVNoaWZ0UHJlc3MpCisgICAgICAgIGNjLT53cml0ZXIoKS0+a2V5RXZlbnQoWEtfU2hpZnRfTCwgZmFsc2UpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGNhc2UgS2V5UmVsZWFzZToKKyAgICBpZiAoIXZpZXdPbmx5KSB7CisgICAgICBpZiAoZG93bktleXN5bVtldi0+eGtleS5rZXljb2RlXSkgeworICAgICAgICBjYy0+d3JpdGVyKCktPmtleUV2ZW50KGRvd25LZXlzeW1bZXYtPnhrZXkua2V5Y29kZV0sIGZhbHNlKTsKKyAgICAgICAgZG93bktleXN5bVtldi0+eGtleS5rZXljb2RlXSA9IDA7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgRW50ZXJOb3RpZnk6CisgICAgbmV3U2VsZWN0aW9uID0gMDsKKyAgICBpZiAoc2VuZFByaW1hcnkgJiYgIXNlbGVjdGlvbk93bmVyKFhBX1BSSU1BUlkpKSB7CisgICAgICBYQ29udmVydFNlbGVjdGlvbihkcHksIFhBX1BSSU1BUlksIHhhVElNRVNUQU1QLCB4YVNFTEVDVElPTl9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgd2luKCksIGV2LT54Y3Jvc3NpbmcudGltZSk7CisgICAgfSBlbHNlIGlmICghc2VsZWN0aW9uT3duZXIoeGFDTElQQk9BUkQpKSB7CisgICAgICBYQ29udmVydFNlbGVjdGlvbihkcHksIHhhQ0xJUEJPQVJELCB4YVRJTUVTVEFNUCwgeGFTRUxFQ1RJT05fVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpbigpLCBldi0+eGNyb3NzaW5nLnRpbWUpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIExlYXZlTm90aWZ5OgorICAgIGlmIChzZXJ2ZXJDdXRUZXh0XyAmJiBuZXdTZXJ2ZXJDdXRUZXh0KSB7CisgICAgICBuZXdTZXJ2ZXJDdXRUZXh0ID0gZmFsc2U7CisgICAgICB2bG9nLmRlYnVnKCJhY3F1aXJpbmcgcHJpbWFyeSBhbmQgY2xpcGJvYXJkIHNlbGVjdGlvbnMiKTsKKyAgICAgIFhTdG9yZUJ5dGVzKGRweSwgc2VydmVyQ3V0VGV4dF8sIHN0cmxlbihzZXJ2ZXJDdXRUZXh0XykpOworICAgICAgb3duU2VsZWN0aW9uKFhBX1BSSU1BUlksIGV2LT54Y3Jvc3NpbmcudGltZSk7CisgICAgICBvd25TZWxlY3Rpb24oeGFDTElQQk9BUkQsIGV2LT54Y3Jvc3NpbmcudGltZSk7CisgICAgICBjdXJyZW50U2VsZWN0aW9uVGltZSA9IGV2LT54Y3Jvc3NpbmcudGltZTsKKyAgICB9CisgICAgLy8gUmVsZWFzZSBhbGwga2V5cyAtIHRoaXMgc2hvdWxkIHByb2JhYmx5IGRvbmUgb24gYSBGb2N1c091dCBldmVudCwgYnV0CisgICAgLy8gTGVhdmVOb3RpZnkgaXMgbmVhciBlbm91Z2guLi4KKyAgICBmb3IgKGludCBpID0gODsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBpZiAoZG93bktleXN5bVtpXSkgeworICAgICAgICBjYy0+d3JpdGVyKCktPmtleUV2ZW50KGRvd25LZXlzeW1baV0sIGZhbHNlKTsKKyAgICAgICAgZG93bktleXN5bVtpXSA9IDA7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICB9Cit9CisKKy8vIHNlbGVjdGlvblJlcXVlc3QoKSBpcyBjYWxsZWQgd2hlbiB3ZSBhcmUgdGhlIHNlbGVjdGlvbiBvd25lciBhbmQgYW5vdGhlciBYCisvLyBjbGllbnQgaGFzIHJlcXVlc3RlZCB0aGUgc2VsZWN0aW9uLiAgV2Ugc2ltcGx5IHB1dCB0aGUgc2VydmVyJ3MgY3V0IHRleHQKKy8vIGludG8gdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eS4gIFRYV2luZG93IHdpbGwgaGFuZGxlIHRoZSByZXN0LgorYm9vbCBEZXNrdG9wV2luZG93OjpzZWxlY3Rpb25SZXF1ZXN0KFdpbmRvdyByZXF1ZXN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbSBzZWxlY3Rpb24sIEF0b20gcHJvcGVydHkpCit7CisgIFhDaGFuZ2VQcm9wZXJ0eShkcHksIHJlcXVlc3RvciwgcHJvcGVydHksIFhBX1NUUklORywgOCwKKyAgICAgICAgICAgICAgICAgIFByb3BNb2RlUmVwbGFjZSwgKHVuc2lnbmVkIGNoYXIqKXNlcnZlckN1dFRleHRfLAorICAgICAgICAgICAgICAgICAgc3RybGVuKHNlcnZlckN1dFRleHRfKSk7CisgIHJldHVybiB0cnVlOworfQorCisKKy8vIHNlbGVjdGlvbk5vdGlmeSgpIGlzIGNhbGxlZCB3aGVuIHdlIGhhdmUgcmVxdWVzdGVkIGFueSBpbmZvcm1hdGlvbiBhYm91dCBhCisvLyBzZWxlY3Rpb24gZnJvbSB0aGUgc2VsZWN0aW9uIG93bmVyLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gc2VsZWN0aW9ucywKKy8vIFBSSU1BUlkgYW5kIENMSVBCT0FSRCwgcGx1cyB0aGUgY3V0IGJ1ZmZlciwgYW5kIHdlIHRyeSB0byB1c2Ugd2hpY2hldmVyIGlzCisvLyB0aGUgbW9zdCByZWNlbnQgb2YgdGhlIHRocmVlLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50ICJ0YXJnZXRzIiBmb3Igd2hpY2ggc2VsZWN0aW9uTm90aWZ5KCkgaXMgY2FsbGVkLCB0aGUKKy8vIHRpbWVzdGFtcCBhbmQgdGhlIGFjdHVhbCBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlbGVjdGlvbi4gIFdlIGFsd2F5cyB1c2UgdGhlCisvLyB0aW1lc3RhbXAgdG8gZGVjaWRlIHdoaWNoIHNlbGVjdGlvbiB0byByZXRyaWV2ZS4KKy8vCisvLyBUaGUgZmlyc3QgdGltZSBzZWxlY3Rpb25Ob3RpZnkoKSBpcyBjYWxsZWQgaXMgd2hlbiB3ZSBhcmUgdHJ5aW5nIHRvIGZpbmQgdGhlCisvLyB0aW1lc3RhbXAgb2YgdGhlIHNlbGVjdGlvbnMgYXQgaW5pdGlhbGlzYXRpb24uICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QKKy8vIGZvciBQUklNQVJZLCB0aGVuIHdlIGNhbGwgWENvbnZlcnRTZWxlY3Rpb24oKSBmb3IgQ0xJUEJPQVJELiAgVGhlIHNlY29uZAorLy8gdGltZSBzaG91bGQgYmUgdGhlIHJlc3VsdCBmb3IgQ0xJUEJPQVJELiAgQXQgdGhpcyBzdGFnZSB3ZSd2ZSBnb3QgdGhlCisvLyAiY3VycmVudFNlbGVjdGlvblRpbWUiIHNvIHdlIHJldHVybi4KKy8vCisvLyBTdWJzZXF1ZW50bHkgc2VsZWN0aW9uTm90aWZ5KCkgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBtb3VzZSBlbnRlcnMgdGhlCisvLyB2aWV3ZXIgd2luZG93LiAgQWdhaW4sIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGNhbGxlZCBzaG91bGQgYmUgdGhlIHRpbWVzdGFtcAorLy8gZm9yIFBSSU1BUlksIGFuZCB3ZSB0aGVuIHJlcXVlc3QgdGhlIHRpbWVzdGFtcCBmb3IgQ0xJUEJPQVJELiAgV2hlbgorLy8gc2VsZWN0aW9uTm90aWZ5KCkgaXMgY2FsbGVkIGFnYWluIHdpdGggdGhlIHRpbWVzdGFtcCBmb3IgQ0xJUEJPQVJELCB3ZSBub3cKKy8vIGtub3cgaWYgZWl0aGVyIHNlbGVjdGlvbiBpcyAibmV3IiBpLmUuIGxhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHZhbHVlIG9mCisvLyBjdXJyZW50U2VsZWN0aW9uVGltZS4gIFRoZSBsYXN0IHRoaW5nIHRvIGNoZWNrIGlzIHRoZSB0aW1lc3RhbXAgb24gdGhlIGN1dAorLy8gYnVmZmVyLiAgSWYgdGhlIGN1dCBidWZmZXIgaXMgbmV3ZXN0IHdlIHNlbmQgdGhhdCB0byB0aGUgc2VydmVyLCBvdGhlcndpc2UKKy8vIGlmIG9uZSBvZiB0aGUgc2VsZWN0aW9ucyB3YXMgbmV3ZXIsIHdlIHJlcXVlc3QgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGF0CisvLyBzZWxlY3Rpb24uCisvLworLy8gRmluYWxseSwgaWYgd2UgZ2V0IHNlbGVjdGlvbk5vdGlmeSgpIGNhbGxlZCBmb3IgdGhlIHN0cmluZyB2YWx1ZSBvZiBhCisvLyBzZWxlY3Rpb24sIHdlIHNlbnQgdGhhdCB0byB0aGUgc2VydmVyLgorLy8KKy8vIEFzIGEgZmluYWwgbWlub3IgY29tcGxpY2F0aW9uLCB3aGVuIG9uZSBvZiB0aGUgc2VsZWN0aW9ucyBpcyBhY3R1YWxseSBvd25lZAorLy8gYnkgdXMsIHdlIGRvbid0IHJlcXVlc3QgdGhlIGRldGFpbHMgZm9yIGl0LgorCisvLyBUSU1FX0xBVEVSIHRyZWF0cyAwIGFzIG1lYW5pbmcgYSBsb25nIHRpbWUgYWdvLCBzbyBhPT0wIG1lYW5zIGEgY2Fubm90IGJlCisvLyBsYXRlciB0aGFuIGIuICBUaGlzIGlzIGRpZmZlcmVudCB0byB0aGUgdXN1YWwgbWVhbmluZyBvZiBDdXJyZW50VGltZS4KKyNkZWZpbmUgVElNRV9MQVRFUihhLCBiKSAoKGEpICE9IDAgJiYgKChiKSA9PSAwIHx8IChsb25nKSgoYSkgLSAoYikpID4gMCkpCisKKwordm9pZCBEZXNrdG9wV2luZG93OjpzZWxlY3Rpb25Ob3RpZnkoWFNlbGVjdGlvbkV2ZW50KiBldiwgQXRvbSB0eXBlLCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pdGVtcywgdm9pZCogZGF0YSkKK3sKKyAgaWYgKGV2LT5yZXF1ZXN0b3IgIT0gd2luKCkpCisgICAgcmV0dXJuOworCisgIGlmIChldi0+dGFyZ2V0ID09IHhhVElNRVNUQU1QKSB7CisgICAgaWYgKGV2LT5wcm9wZXJ0eSA9PSB4YVNFTEVDVElPTl9USU1FKSB7CisgICAgICBpZiAoZGF0YSAmJiBmb3JtYXQgPT0gMzIgJiYgbml0ZW1zID09IDEpIHsKKyAgICAgICAgVGltZSB0ID0gKihyZHI6OlUzMiAqKWRhdGE7CisgICAgICAgIHZsb2cuZGVidWcoInNlbGVjdGlvbiAoJWQpIHRpbWUgaXMgJWQsIGxhdGVyICVkIiwKKyAgICAgICAgICAgICAgICAgICBldi0+c2VsZWN0aW9uLCB0LCBUSU1FX0xBVEVSKHQsIGN1cnJlbnRTZWxlY3Rpb25UaW1lKSk7CisgICAgICAgIGlmIChUSU1FX0xBVEVSKHQsIGN1cnJlbnRTZWxlY3Rpb25UaW1lKSkgeworICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb25UaW1lID0gdDsKKyAgICAgICAgICBuZXdTZWxlY3Rpb24gPSBldi0+c2VsZWN0aW9uOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZsb2cuZGVidWcoIm5vIHNlbGVjdGlvbiAoJWQpIixldi0+c2VsZWN0aW9uKTsKKyAgICB9CisKKyAgICBpZiAoZXYtPnNlbGVjdGlvbiA9PSBYQV9QUklNQVJZKSB7CisgICAgICBpZiAoIXNlbGVjdGlvbk93bmVyKHhhQ0xJUEJPQVJEKSkgeworICAgICAgICBYQ29udmVydFNlbGVjdGlvbihkcHksIHhhQ0xJUEJPQVJELCB4YVRJTUVTVEFNUCwgeGFTRUxFQ1RJT05fVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2luKCksIGV2LT50aW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXYtPnNlbGVjdGlvbiAhPSB4YUNMSVBCT0FSRCkgeworICAgICAgdmxvZy5lcnJvcigidW5rbm93biBzZWxlY3Rpb24gJWQiLGV2LT5zZWxlY3Rpb24pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChnZXR0aW5nSW5pdGlhbFNlbGVjdGlvblRpbWUpIHsKKyAgICAgIGdldHRpbmdJbml0aWFsU2VsZWN0aW9uVGltZSA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2VuZENsaXBib2FyZCkgcmV0dXJuOworICAgIGlmIChzZW5kUHJpbWFyeSkgeworICAgICAgdmxvZy5kZWJ1ZygiY3V0IGJ1ZmZlciB0aW1lIGlzICVkLCBsYXRlciAlZCIsIGN1dEJ1ZmZlclRpbWUsCisgICAgICAgICAgICAgICAgIFRJTUVfTEFURVIoY3V0QnVmZmVyVGltZSwgY3VycmVudFNlbGVjdGlvblRpbWUpKTsKKyAgICAgIGlmIChUSU1FX0xBVEVSKGN1dEJ1ZmZlclRpbWUsIGN1cnJlbnRTZWxlY3Rpb25UaW1lKSkgeworICAgICAgICBjdXJyZW50U2VsZWN0aW9uVGltZSA9IGN1dEJ1ZmZlclRpbWU7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNoYXIqIHN0ciA9IFhGZXRjaEJ5dGVzKGRweSwgJmxlbik7CisgICAgICAgIGlmIChzdHIpIHsKKyAgICAgICAgICBpZiAoIXZpZXdPbmx5KSB7CisgICAgICAgICAgICB2bG9nLmRlYnVnKCJzZW5kaW5nIGN1dCBidWZmZXIgdG8gc2VydmVyIik7CisgICAgICAgICAgICBjYy0+d3JpdGVyKCktPmNsaWVudEN1dFRleHQoc3RyLCBsZW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBYRnJlZShzdHIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobmV3U2VsZWN0aW9uKSB7CisgICAgICBYQ29udmVydFNlbGVjdGlvbihkcHksIG5ld1NlbGVjdGlvbiwgWEFfU1RSSU5HLCB4YVNFTEVDVElPTl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICB3aW4oKSwgQ3VycmVudFRpbWUpOworICAgIH0KKworICB9IGVsc2UgaWYgKGV2LT50YXJnZXQgPT0gWEFfU1RSSU5HKSB7CisgICAgaWYgKCFzZW5kQ2xpcGJvYXJkKSByZXR1cm47CisgICAgaWYgKGV2LT5wcm9wZXJ0eSA9PSB4YVNFTEVDVElPTl9TVFJJTkcpIHsKKyAgICAgIGlmIChkYXRhICYmIGZvcm1hdCA9PSA4KSB7CisgICAgICAgIGlmICghdmlld09ubHkpIHsKKyAgICAgICAgICB2bG9nLmRlYnVnKCJzZW5kaW5nICVzIHNlbGVjdGlvbiB0byBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgZXYtPnNlbGVjdGlvbiA9PSBYQV9QUklNQVJZID8gInByaW1hcnkiIDoKKyAgICAgICAgICAgICAgICAgICAgIGV2LT5zZWxlY3Rpb24gPT0geGFDTElQQk9BUkQgPyAiY2xpcGJvYXJkIiA6ICJ1bmtub3duIiApOworICAgICAgICAgIGNjLT53cml0ZXIoKS0+Y2xpZW50Q3V0VGV4dCgoY2hhciopZGF0YSwgbml0ZW1zKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5peC92bmN2aWV3ZXIvRGVza3RvcFdpbmRvdy5oIGIvdW5peC92bmN2aWV3ZXIvRGVza3RvcFdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWY3NTAKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY3ZpZXdlci9EZXNrdG9wV2luZG93LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBEZXNrdG9wV2luZG93IGlzIGEgVFhXaW5kb3cgcmVwcmVzZW50aW5nIGEgVk5DIGRlc2t0b3AuCisvLworCisjaWZuZGVmIF9fREVTS1RPUFdJTkRPV19IX18KKyNkZWZpbmUgX19ERVNLVE9QV0lORE9XX0hfXworCisjaW5jbHVkZSA8cmZiL0N1cnNvci5oPgorI2luY2x1ZGUgPHJmYi9SZWN0Lmg+CisjaW5jbHVkZSA8cmZiL1RpbWVyLmg+CisjaW5jbHVkZSAiVFhXaW5kb3cuaCIKKyNpbmNsdWRlICJUWFZpZXdwb3J0LmgiCisjaW5jbHVkZSAiVFhJbWFnZS5oIgorCitjbGFzcyBDQ29ubjsKKworY2xhc3MgRGVza3RvcFdpbmRvdyA6IHB1YmxpYyBUWFdpbmRvdywgcHVibGljIFRYRXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyByZmI6OlRpbWVyOjpDYWxsYmFjayB7CitwdWJsaWM6CisKKyAgRGVza3RvcFdpbmRvdyhEaXNwbGF5KiBkcHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICBjb25zdCByZmI6OlBpeGVsRm9ybWF0JiBzZXJ2ZXJQRiwgQ0Nvbm4qIGNjXywKKyAgICAgICAgICAgICAgICBUWFdpbmRvdyogcGFyZW50PTApOworICB+RGVza3RvcFdpbmRvdygpOworCisgIHZvaWQgc2V0Vmlld3BvcnQoVFhWaWV3cG9ydCogdmlld3BvcnQpOworCisgIC8vIGdldFBGKCkgYW5kIHNldFBGKCkgZ2V0IGFuZCBzZXQgdGhlIFRYSW1hZ2UncyBwaXhlbCBmb3JtYXQKKyAgY29uc3QgcmZiOjpQaXhlbEZvcm1hdCYgZ2V0UEYoKSB7IHJldHVybiBpbS0+Z2V0UEYoKTsgfQorICB2b2lkIHNldFBGKGNvbnN0IHJmYjo6UGl4ZWxGb3JtYXQmIHBmKSB7IGltLT5zZXRQRihwZik7IH0KKworICAvLyBzZXRDdXJzb3IoKSBzZXRzIHRoZSBzaGFwZSBvZiB0aGUgbG9jYWwgY3Vyc29yCisgIHZvaWQgc2V0Q3Vyc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgcmZiOjpQb2ludCYgaG90c3BvdCwKKyAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwgdm9pZCogbWFzayk7CisKKyAgLy8gcmVzZXRMb2NhbEN1cnNvcigpIHN0b3BzIHRoZSByZW5kZXJpbmcgb2YgdGhlIGxvY2FsIGN1cnNvcgorICB2b2lkIHJlc2V0TG9jYWxDdXJzb3IoKTsKKworICAvLyBNZXRob2RzIGZvcndhcmRlZCBmcm9tIENDb25uCisgIHZvaWQgc2V0Q29sb3VyTWFwRW50cmllcyhpbnQgZmlyc3RDb2xvdXIsIGludCBuQ29sb3VycywgcmRyOjpVMTYqIHJnYnMpOworICB2b2lkIHNlcnZlckN1dFRleHQoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKTsKKyAgdm9pZCBmcmFtZWJ1ZmZlclVwZGF0ZUVuZCgpOworCisgIHZvaWQgZmlsbFJlY3QoY29uc3QgcmZiOjpSZWN0JiByLCByZmI6OlBpeGVsIHBpeCkgeworICAgIGlmIChyLm92ZXJsYXBzKGN1cnNvckJhY2tpbmdSZWN0KSkgaGlkZUxvY2FsQ3Vyc29yKCk7CisgICAgaW0tPmZpbGxSZWN0KHIsIHBpeCk7CisgICAgaW0tPnB1dCh3aW4oKSwgZ2MsIHIpOworICAgIHNob3dMb2NhbEN1cnNvcigpOworICB9CisgIHZvaWQgaW1hZ2VSZWN0KGNvbnN0IHJmYjo6UmVjdCYgciwgdm9pZCogcGl4ZWxzKSB7CisgICAgaWYgKHIub3ZlcmxhcHMoY3Vyc29yQmFja2luZ1JlY3QpKSBoaWRlTG9jYWxDdXJzb3IoKTsKKyAgICBpbS0+aW1hZ2VSZWN0KHIsIHBpeGVscyk7CisgICAgaW0tPnB1dCh3aW4oKSwgZ2MsIHIpOworICAgIHNob3dMb2NhbEN1cnNvcigpOworICB9CisgIHZvaWQgY29weVJlY3QoY29uc3QgcmZiOjpSZWN0JiByLCBpbnQgc3JjWCwgaW50IHNyY1kpIHsKKyAgICBpZiAoci5vdmVybGFwcyhjdXJzb3JCYWNraW5nUmVjdCkgfHwKKyAgICAgICAgY3Vyc29yQmFja2luZ1JlY3Qub3ZlcmxhcHMocmZiOjpSZWN0KHNyY1gsIHNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNYK3Iud2lkdGgoKSwgc3JjWStyLmhlaWdodCgpKSkpCisgICAgICBoaWRlTG9jYWxDdXJzb3IoKTsKKyAgICBpZiAoaW0tPnVzaW5nU2htKCkpCisgICAgICBYU3luYyhkcHksIEZhbHNlKTsKKyAgICBpbS0+Y29weVJlY3QociwgcmZiOjpQb2ludChyLnRsLngtc3JjWCwgci50bC55LXNyY1kpKTsKKyAgICBYQ29weUFyZWEoZHB5LCB3aW4oKSwgd2luKCksIGdjLCBzcmNYLCBzcmNZLAorICAgICAgICAgICAgICByLndpZHRoKCksIHIuaGVpZ2h0KCksIHIudGwueCwgci50bC55KTsKKyAgICBzaG93TG9jYWxDdXJzb3IoKTsKKyAgfQorICB2b2lkIGludmVydFJlY3QoY29uc3QgcmZiOjpSZWN0JiByKTsKKworICAvLyBUWFdpbmRvdyBtZXRob2RzCisgIHZpcnR1YWwgdm9pZCByZXNpemUoaW50IHcsIGludCBoKTsKKyAgdmlydHVhbCBib29sIHNlbGVjdGlvblJlcXVlc3QoV2luZG93IHJlcXVlc3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbSBzZWxlY3Rpb24sIEF0b20gcHJvcGVydHkpOworICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uTm90aWZ5KFhTZWxlY3Rpb25FdmVudCogZXYsIEF0b20gdHlwZSwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbml0ZW1zLCB2b2lkKiBkYXRhKTsKKyAgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KFRYV2luZG93KiB3LCBYRXZlbnQqIGV2KTsKKworcHJpdmF0ZToKKworICB2b2lkIGNyZWF0ZVhDdXJzb3JzKCk7CisgIHZvaWQgaGlkZUxvY2FsQ3Vyc29yKCk7CisgIHZvaWQgc2hvd0xvY2FsQ3Vyc29yKCk7CisgIGJvb2wgaGFuZGxlVGltZW91dChyZmI6OlRpbWVyKiB0aW1lcik7CisgIHZvaWQgaGFuZGxlUG9pbnRlckV2ZW50KGNvbnN0IHJmYjo6UG9pbnQmIHBvcywgaW50IGJ1dHRvbk1hc2spOworCisgIENDb25uKiBjYzsKKyAgVFhJbWFnZSogaW07CisgIEdDIGdjOworICA6OkN1cnNvciBkb3RDdXJzb3IsIG5vQ3Vyc29yLCBsb2NhbFhDdXJzb3I7CisKKyAgcmZiOjpDdXJzb3IgY3Vyc29yOworICBib29sIGN1cnNvclZpc2libGU7ICAgICAvLyBJcyBjdXJzb3IgY3VycmVudGx5IHJlbmRlcmVkPworICBib29sIGN1cnNvckF2YWlsYWJsZTsgICAvLyBJcyBjdXJzb3IgYXZhaWxhYmxlIGZvciByZW5kZXJpbmc/CisgIHJmYjo6UG9pbnQgY3Vyc29yUG9zOworICByZmI6Ok1hbmFnZWRQaXhlbEJ1ZmZlciBjdXJzb3JCYWNraW5nOworICByZmI6OlJlY3QgY3Vyc29yQmFja2luZ1JlY3Q7CisKKyAgVGltZSBjdXJyZW50U2VsZWN0aW9uVGltZTsKKyAgQXRvbSBuZXdTZWxlY3Rpb247CisgIGJvb2wgZ2V0dGluZ0luaXRpYWxTZWxlY3Rpb25UaW1lOworICBib29sIG5ld1NlcnZlckN1dFRleHQ7CisgIGNoYXIqIHNlcnZlckN1dFRleHRfOworCisgIHJmYjo6VGltZXIgc2V0Q29sb3VyTWFwRW50cmllc1RpbWVyOworICBUWFZpZXdwb3J0KiB2aWV3cG9ydDsKKyAgcmZiOjpUaW1lciBwb2ludGVyRXZlbnRUaW1lcjsKKyAgcmZiOjpQb2ludCBsYXN0UG9pbnRlclBvczsKKyAgaW50IGxhc3RCdXR0b25NYXNrOworICByZHI6OlUzMiBkb3duS2V5c3ltWzI1Nl07Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdm5jdmlld2VyL0luZm9EaWFsb2cuaCBiL3VuaXgvdm5jdmlld2VyL0luZm9EaWFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTVmNTdiCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmN2aWV3ZXIvSW5mb0RpYWxvZy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBJbmZvRGlhbG9nLmgKKy8vCisKKyNpZm5kZWYgX19JTkZPRElBTE9HX0hfXworI2RlZmluZSBfX0lORk9ESUFMT0dfSF9fCisKKyNpbmNsdWRlICJUWERpYWxvZy5oIgorI2luY2x1ZGUgIlRYTGFiZWwuaCIKKyNpbmNsdWRlICJUWEJ1dHRvbi5oIgorCitleHRlcm4gY2hhciBidWlsZHRpbWVbXTsKKworY2xhc3MgSW5mb0RpYWxvZyA6IHB1YmxpYyBUWERpYWxvZywgcHVibGljIFRYQnV0dG9uQ2FsbGJhY2sgeworcHVibGljOgorICBJbmZvRGlhbG9nKERpc3BsYXkqIGRweSkKKyAgICA6IFRYRGlhbG9nKGRweSwgMSwgMSwgXygiVk5DIGNvbm5lY3Rpb24gaW5mbyIpKSwKKyAgICAgIGluZm9MYWJlbChkcHksICIiLCB0aGlzLCAxLCAxLCBUWExhYmVsOjpsZWZ0KSwKKyAgICAgIG9rQnV0dG9uKGRweSwgIk9LIiwgdGhpcywgdGhpcywgNjApCisgIHsKKyAgICBpbmZvTGFiZWwueFBhZCA9IDg7CisgICAgaW5mb0xhYmVsLm1vdmUoMCwgeVBhZCo0KTsKKyAgICBzZXRCb3JkZXJXaWR0aCgxKTsKKyAgfQorCisgIHZvaWQgc2V0VGV4dChjaGFyKiBpbmZvVGV4dCkgeworICAgIGluZm9MYWJlbC5zZXRUZXh0KGluZm9UZXh0KTsKKyAgICByZXNpemUoaW5mb0xhYmVsLndpZHRoKCksCisgICAgICAgICAgIGluZm9MYWJlbC5oZWlnaHQoKSArIG9rQnV0dG9uLmhlaWdodCgpICsgeVBhZCoxMik7CisKKyAgICBva0J1dHRvbi5tb3ZlKCh3aWR0aCgpIC0gb2tCdXR0b24ud2lkdGgoKSkgLyAyLAorICAgICAgICAgICAgICAgICAgaGVpZ2h0KCkgLSB5UGFkKjQgLSBva0J1dHRvbi5oZWlnaHQoKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgYnV0dG9uQWN0aXZhdGUoVFhCdXR0b24qIGIpIHsKKyAgICB1bm1hcCgpOworICB9CisKKyAgVFhMYWJlbCBpbmZvTGFiZWw7CisgIFRYQnV0dG9uIG9rQnV0dG9uOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3ZuY3ZpZXdlci9NYWtlZmlsZS5pbiBiL3VuaXgvdm5jdmlld2VyL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmI2ODAKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY3ZpZXdlci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMwIEBACisKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKKworcHJlZml4ID0gQHByZWZpeEAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCisKK1NSQ1MgPSBEZXNrdG9wV2luZG93LmN4eCBDQ29ubi5jeHggdm5jdmlld2VyLmN4eAorCitPQkpTID0gJChTUkNTOi5jeHg9Lm8pCisKK3Byb2dyYW0gPSB2bmN2aWV3ZXIKKworREVQX0xJQlMgPSAuLi90eC9saWJ0eC5hIC4uL3JmYi9saWJyZmIuYSAuLi9uZXR3b3JrL2xpYm5ldHdvcmsuYSBcCisgICAgICAgICAgIC4uL3Jkci9saWJyZHIuYQorCitFWFRSQV9MSUJTID0gQFpMSUJfTElCQCBASlBFR19MSUJAIEBYX1BSRV9MSUJTQCBAWF9MSUJTQCAtbFhleHQgLWxYMTEgQFhfRVhUUkFfTElCU0AgQExJQklOVExACisKK0RJUl9DUFBGTEFHUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS90eCAtSSQodG9wX3NyY2RpcikvaW50bCBAWF9DRkxBR1NAICMgWF9DRkxBR1MgYXJlIHJlYWxseSBDUFBGTEFHUworCithbGw6OiAkKHByb2dyYW0pCisKKyQocHJvZ3JhbSk6ICQoT0JKUykgYnVpbGR0aW1lLm8gJChERVBfTElCUykKKwlybSAtZiAkKHByb2dyYW0pCisJJChDWFhMRCkgJChDWFhGTEFHUykgJChMREZMQUdTKSAtbyAkQCAkKE9CSlMpIGJ1aWxkdGltZS5vICQoREVQX0xJQlMpICQoTElCUykgJChFWFRSQV9MSUJTKQorCitidWlsZHRpbWUubzogJChPQkpTKSAkKERFUF9MSUJTKQorCisjIGZvbGxvd2VkIGJ5IGJvaWxlcnBsYXRlLm1rCmRpZmYgLS1naXQgYS91bml4L3ZuY3ZpZXdlci9PcHRpb25zRGlhbG9nLmggYi91bml4L3ZuY3ZpZXdlci9PcHRpb25zRGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjZThkNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jdmlld2VyL09wdGlvbnNEaWFsb2cuaApAQCAtMCwwICsxLDIxMyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIE9wdGlvbnNEaWFsb2cuaAorLy8KKworI2lmbmRlZiBfX09QVElPTlNESUFMT0dfSF9fCisjZGVmaW5lIF9fT1BUSU9OU0RJQUxPR19IX18KKworI2luY2x1ZGUgIlRYRGlhbG9nLmgiCisjaW5jbHVkZSAiVFhMYWJlbC5oIgorI2luY2x1ZGUgIlRYRW50cnkuaCIKKyNpbmNsdWRlICJUWEJ1dHRvbi5oIgorI2luY2x1ZGUgIlRYQ2hlY2tib3guaCIKKyNpbmNsdWRlICJwYXJhbWV0ZXJzLmgiCisKK2NsYXNzIE9wdGlvbnNEaWFsb2dDYWxsYmFjayB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBzZXRPcHRpb25zKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2V0T3B0aW9ucygpID0gMDsKK307CisKK2NsYXNzIE9wdGlvbnNEaWFsb2cgOiBwdWJsaWMgVFhEaWFsb2csIHB1YmxpYyBUWEJ1dHRvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUWENoZWNrYm94Q2FsbGJhY2ssIHB1YmxpYyBUWEVudHJ5Q2FsbGJhY2sgIHsKK3B1YmxpYzoKKyAgT3B0aW9uc0RpYWxvZyhEaXNwbGF5KiBkcHksIE9wdGlvbnNEaWFsb2dDYWxsYmFjayogY2JfKQorICAgIDogVFhEaWFsb2coZHB5LCA0MDAsIDQ1MCwgXygiVk5DIFZpZXdlcjogQ29ubmVjdGlvbiBPcHRpb25zIikpLCBjYihjYl8pLAorICAgICAgZm9ybWF0QW5kRW5jKGRweSwgXygiRW5jb2RpbmcgYW5kIENvbG9yIExldmVsOiIpLCB0aGlzKSwKKyAgICAgIGlucHV0cyhkcHksIF8oIklucHV0czoiKSwgdGhpcyksCisgICAgICBtaXNjKGRweSwgXygiTWlzYzoiKSwgdGhpcyksCisgICAgICBhdXRvU2VsZWN0KGRweSwgXygiQXV0byBzZWxlY3QiKSwgdGhpcywgZmFsc2UsIHRoaXMpLAorICAgICAgZnVsbENvbG91cihkcHksIF8oIkZ1bGwgKGFsbCBhdmFpbGFibGUgY29sb3JzKSIpLCB0aGlzLCB0cnVlLCB0aGlzKSwKKyAgICAgIG1lZGl1bUNvbG91cihkcHksIF8oIk1lZGl1bSAoMjU2IGNvbG9ycykiKSwgdGhpcywgdHJ1ZSwgdGhpcyksCisgICAgICBsb3dDb2xvdXIoZHB5LCBfKCJMb3cgKDY0IGNvbG9ycykiKSwgdGhpcywgdHJ1ZSwgdGhpcyksCisgICAgICB2ZXJ5TG93Q29sb3VyKGRweSwgXygiVmVyeSBsb3cgKDggY29sb3JzKSIpLCB0aGlzLCB0cnVlLCB0aGlzKSwKKyAgICAgIHRpZ2h0KGRweSwgIlRpZ2h0IiwgdGhpcywgdHJ1ZSwgdGhpcyksCisgICAgICB6cmxlKGRweSwgIlpSTEUiLCB0aGlzLCB0cnVlLCB0aGlzKSwKKyAgICAgIGhleHRpbGUoZHB5LCAiSGV4dGlsZSIsIHRoaXMsIHRydWUsIHRoaXMpLAorICAgICAgcmF3KGRweSwgIlJhdyIsIHRoaXMsIHRydWUsIHRoaXMpLAorICAgICAgY3VzdG9tQ29tcHJlc3NMZXZlbChkcHksIF8oIkN1c3RvbSBjb21wcmVzc2lvbiBsZXZlbDoiKSwgdGhpcywgZmFsc2UsIHRoaXMpLAorICAgICAgY29tcHJlc3NMZXZlbChkcHksIHRoaXMsIHRoaXMsIGZhbHNlLCAzMCksCisgICAgICBjb21wcmVzc0xldmVsTGFiZWwoZHB5LCBfKCJsZXZlbCAoMT1mYXN0LCA5PWJlc3QpIiksIHRoaXMpLAorICAgICAgbm9KcGVnKGRweSwgXygiQWxsb3cgSlBFRyBjb21wcmVzc2lvbjoiKSwgdGhpcywgZmFsc2UsIHRoaXMpLAorICAgICAgcXVhbGl0eUxldmVsKGRweSwgdGhpcywgdGhpcywgZmFsc2UsIDMwKSwKKyAgICAgIHF1YWxpdHlMZXZlbExhYmVsKGRweSwgXygicXVhbGl0eSAoMT1wb29yLCA5PWJlc3QpIiksIHRoaXMpLAorICAgICAgdmlld09ubHkoZHB5LCBfKCJWaWV3IG9ubHkgKGlnbm9yZSBtb3VzZSAmIGtleWJvYXJkKSIpLCB0aGlzLCBmYWxzZSwgdGhpcyksCisgICAgICBhY2NlcHRDbGlwYm9hcmQoZHB5LCBfKCJBY2NlcHQgY2xpcGJvYXJkIGZyb20gc2VydmVyIiksIHRoaXMsIGZhbHNlLCB0aGlzKSwKKyAgICAgIHNlbmRDbGlwYm9hcmQoZHB5LCBfKCJTZW5kIGNsaXBib2FyZCB0byBzZXJ2ZXIiKSwgdGhpcywgZmFsc2UsIHRoaXMpLAorICAgICAgc2VuZFByaW1hcnkoZHB5LCBfKCJTZW5kIHByaW1hcnkgc2VsZWN0aW9uICYgY3V0IGJ1ZmZlciBhcyBjbGlwYm9hcmQiKSwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIGZhbHNlLCB0aGlzKSwKKyAgICAgIHNoYXJlZChkcHksIF8oIlNoYXJlZCAoZG9uJ3QgZGlzY29ubmVjdCBvdGhlciB2aWV3ZXJzKSIpLCB0aGlzLCBmYWxzZSx0aGlzKSwKKyAgICAgIGZ1bGxTY3JlZW4oZHB5LCBfKCJGdWxsLXNjcmVlbiBtb2RlIiksIHRoaXMsIGZhbHNlLCB0aGlzKSwKKyAgICAgIHVzZUxvY2FsQ3Vyc29yKGRweSwgXygiUmVuZGVyIGN1cnNvciBsb2NhbGx5IiksIHRoaXMsIGZhbHNlLCB0aGlzKSwKKyAgICAgIGRvdFdoZW5Ob0N1cnNvcihkcHksIF8oIlNob3cgZG90IHdoZW4gbm8gY3Vyc29yIiksIHRoaXMsIGZhbHNlLCB0aGlzKSwKKyAgICAgIG9rQnV0dG9uKGRweSwgXygiT0siKSwgdGhpcywgdGhpcywgNjApLAorICAgICAgY2FuY2VsQnV0dG9uKGRweSwgXygiQ2FuY2VsIiksIHRoaXMsIHRoaXMsIDYwKQorICB7CisgICAgaW50IHkgPSB5UGFkOworICAgIGZvcm1hdEFuZEVuYy5tb3ZlKHhQYWQsIHkpOworICAgIHkgKz0gZm9ybWF0QW5kRW5jLmhlaWdodCgpOworICAgIGF1dG9TZWxlY3QubW92ZSh4UGFkLCB5KTsKKyAgICBpbnQgeDIgPSB4UGFkICsgYXV0b1NlbGVjdC53aWR0aCgpICsgeFBhZCo1OworICAgIHkgKz0gYXV0b1NlbGVjdC5oZWlnaHQoKTsKKyAgICB0aWdodC5tb3ZlKHhQYWQsIHkpOworICAgIGZ1bGxDb2xvdXIubW92ZSh4MiwgeSk7CisgICAgeSArPSB0aWdodC5oZWlnaHQoKTsKKyAgICB6cmxlLm1vdmUoeFBhZCwgeSk7CisgICAgbWVkaXVtQ29sb3VyLm1vdmUoeDIsIHkpOworICAgIHkgKz0genJsZS5oZWlnaHQoKTsKKyAgICBoZXh0aWxlLm1vdmUoeFBhZCwgeSk7CisgICAgbG93Q29sb3VyLm1vdmUoeDIsIHkpOworICAgIHkgKz0gaGV4dGlsZS5oZWlnaHQoKTsKKyAgICByYXcubW92ZSh4UGFkLCB5KTsKKyAgICB2ZXJ5TG93Q29sb3VyLm1vdmUoeDIsIHkpOworICAgIHkgKz0gcmF3LmhlaWdodCgpICsgeVBhZCoyOworCisgICAgY3VzdG9tQ29tcHJlc3NMZXZlbC5tb3ZlKHhQYWQsIHkpOworICAgIHkgKz0gY3VzdG9tQ29tcHJlc3NMZXZlbC5oZWlnaHQoKTsKKyAgICBjb21wcmVzc0xldmVsLm1vdmUoeFBhZCoxMCwgeSk7CisgICAgY29tcHJlc3NMZXZlbExhYmVsLm1vdmUoeFBhZCoyMCwgeSk7CisgICAgeSArPSBjb21wcmVzc0xldmVsLmhlaWdodCgpOworCisgICAgbm9KcGVnLm1vdmUoeFBhZCwgeSk7CisgICAgeSArPSBub0pwZWcuaGVpZ2h0KCk7CisgICAgcXVhbGl0eUxldmVsLm1vdmUoeFBhZCoxMCwgeSk7CisgICAgcXVhbGl0eUxldmVsTGFiZWwubW92ZSh4UGFkKjIwLCB5KTsKKyAgICB5ICs9IHF1YWxpdHlMZXZlbC5oZWlnaHQoKTsKKworICAgIHkgKz0geVBhZCo0OworICAgIGlucHV0cy5tb3ZlKHhQYWQsIHkpOworICAgIHkgKz0gaW5wdXRzLmhlaWdodCgpOworICAgIHZpZXdPbmx5Lm1vdmUoeFBhZCwgeSk7CisgICAgeSArPSB2aWV3T25seS5oZWlnaHQoKTsKKyAgICBhY2NlcHRDbGlwYm9hcmQubW92ZSh4UGFkLCB5KTsKKyAgICB5ICs9IGFjY2VwdENsaXBib2FyZC5oZWlnaHQoKTsKKyAgICBzZW5kQ2xpcGJvYXJkLm1vdmUoeFBhZCwgeSk7CisgICAgeSArPSBzZW5kQ2xpcGJvYXJkLmhlaWdodCgpOworICAgIHNlbmRQcmltYXJ5Lm1vdmUoeFBhZCwgeSk7CisgICAgeSArPSBzZW5kUHJpbWFyeS5oZWlnaHQoKTsKKworICAgIHkgKz0geVBhZCo0OworICAgIG1pc2MubW92ZSh4UGFkLCB5KTsKKyAgICB5ICs9IG1pc2MuaGVpZ2h0KCk7CisgICAgc2hhcmVkLm1vdmUoeFBhZCwgeSk7CisgICAgeSArPSBzaGFyZWQuaGVpZ2h0KCk7CisgICAgZnVsbFNjcmVlbi5tb3ZlKHhQYWQsIHkpOworICAgIHkgKz0gZnVsbFNjcmVlbi5oZWlnaHQoKTsKKyAgICB1c2VMb2NhbEN1cnNvci5tb3ZlKHhQYWQsIHkpOworICAgIHkgKz0gdXNlTG9jYWxDdXJzb3IuaGVpZ2h0KCk7CisgICAgZG90V2hlbk5vQ3Vyc29yLm1vdmUoeFBhZCwgeSk7CisgICAgeSArPSBkb3RXaGVuTm9DdXJzb3IuaGVpZ2h0KCk7CisKKyAgICBva0J1dHRvbi5tb3ZlKHdpZHRoKCkgLSB4UGFkKjEyIC0gY2FuY2VsQnV0dG9uLndpZHRoKCkgLSBva0J1dHRvbi53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgaGVpZ2h0KCkgLSB5UGFkKjQgLSBva0J1dHRvbi5oZWlnaHQoKSk7CisgICAgY2FuY2VsQnV0dG9uLm1vdmUod2lkdGgoKSAtIHhQYWQqNiAtIGNhbmNlbEJ1dHRvbi53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCgpIC0geVBhZCo0IC0gY2FuY2VsQnV0dG9uLmhlaWdodCgpKTsKKyAgICBzZXRCb3JkZXJXaWR0aCgxKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBpbml0RGlhbG9nKCkgeworICAgIGlmIChjYikgY2ItPnNldE9wdGlvbnMoKTsKKyAgICB0aWdodC5kaXNhYmxlZChhdXRvU2VsZWN0LmNoZWNrZWQoKSk7CisgICAgenJsZS5kaXNhYmxlZChhdXRvU2VsZWN0LmNoZWNrZWQoKSk7CisgICAgaGV4dGlsZS5kaXNhYmxlZChhdXRvU2VsZWN0LmNoZWNrZWQoKSk7CisgICAgcmF3LmRpc2FibGVkKGF1dG9TZWxlY3QuY2hlY2tlZCgpKTsKKyAgICBmdWxsQ29sb3VyLmRpc2FibGVkKGF1dG9TZWxlY3QuY2hlY2tlZCgpKTsKKyAgICBtZWRpdW1Db2xvdXIuZGlzYWJsZWQoYXV0b1NlbGVjdC5jaGVja2VkKCkpOworICAgIGxvd0NvbG91ci5kaXNhYmxlZChhdXRvU2VsZWN0LmNoZWNrZWQoKSk7CisgICAgdmVyeUxvd0NvbG91ci5kaXNhYmxlZChhdXRvU2VsZWN0LmNoZWNrZWQoKSk7CisgICAgc2VuZFByaW1hcnkuZGlzYWJsZWQoIXNlbmRDbGlwYm9hcmQuY2hlY2tlZCgpKTsKKyAgICBkb3RXaGVuTm9DdXJzb3IuZGlzYWJsZWQoIXVzZUxvY2FsQ3Vyc29yLmNoZWNrZWQoKSk7CisgICAgY29tcHJlc3NMZXZlbC5kaXNhYmxlZCghY3VzdG9tQ29tcHJlc3NMZXZlbC5jaGVja2VkKCkpOworICAgIHF1YWxpdHlMZXZlbC5kaXNhYmxlZCghbm9KcGVnLmNoZWNrZWQoKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGFrZUZvY3VzKFRpbWUgdGltZSkgeworICAgIC8vWFNldElucHV0Rm9jdXMoZHB5LCBlbnRyeS53aW4sIFJldmVydFRvUGFyZW50LCB0aW1lKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBidXR0b25BY3RpdmF0ZShUWEJ1dHRvbiogYikgeworICAgIGlmIChiID09ICZva0J1dHRvbikgeworICAgICAgaWYgKGNiKSBjYi0+Z2V0T3B0aW9ucygpOworICAgICAgdW5tYXAoKTsKKyAgICB9IGVsc2UgaWYgKGIgPT0gJmNhbmNlbEJ1dHRvbikgeworICAgICAgdW5tYXAoKTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQgY2hlY2tib3hTZWxlY3QoVFhDaGVja2JveCogY2hlY2tib3gpIHsKKyAgICBpZiAoY2hlY2tib3ggPT0gJmF1dG9TZWxlY3QpIHsKKyAgICAgIHRpZ2h0LmRpc2FibGVkKGF1dG9TZWxlY3QuY2hlY2tlZCgpKTsKKyAgICAgIHpybGUuZGlzYWJsZWQoYXV0b1NlbGVjdC5jaGVja2VkKCkpOworICAgICAgaGV4dGlsZS5kaXNhYmxlZChhdXRvU2VsZWN0LmNoZWNrZWQoKSk7CisgICAgICByYXcuZGlzYWJsZWQoYXV0b1NlbGVjdC5jaGVja2VkKCkpOworICAgICAgZnVsbENvbG91ci5kaXNhYmxlZChhdXRvU2VsZWN0LmNoZWNrZWQoKSk7CisgICAgICBtZWRpdW1Db2xvdXIuZGlzYWJsZWQoYXV0b1NlbGVjdC5jaGVja2VkKCkpOworICAgICAgbG93Q29sb3VyLmRpc2FibGVkKGF1dG9TZWxlY3QuY2hlY2tlZCgpKTsKKyAgICAgIHZlcnlMb3dDb2xvdXIuZGlzYWJsZWQoYXV0b1NlbGVjdC5jaGVja2VkKCkpOworICAgIH0gZWxzZSBpZiAoY2hlY2tib3ggPT0gJmZ1bGxDb2xvdXIgfHwgY2hlY2tib3ggPT0gJm1lZGl1bUNvbG91ciB8fAorICAgICAgICAgICAgICAgY2hlY2tib3ggPT0gJmxvd0NvbG91ciB8fCBjaGVja2JveCA9PSAmdmVyeUxvd0NvbG91cikgeworICAgICAgZnVsbENvbG91ci5jaGVja2VkKGNoZWNrYm94ID09ICZmdWxsQ29sb3VyKTsKKyAgICAgIG1lZGl1bUNvbG91ci5jaGVja2VkKGNoZWNrYm94ID09ICZtZWRpdW1Db2xvdXIpOworICAgICAgbG93Q29sb3VyLmNoZWNrZWQoY2hlY2tib3ggPT0gJmxvd0NvbG91cik7CisgICAgICB2ZXJ5TG93Q29sb3VyLmNoZWNrZWQoY2hlY2tib3ggPT0gJnZlcnlMb3dDb2xvdXIpOworICAgIH0gZWxzZSBpZiAoY2hlY2tib3ggPT0gJnRpZ2h0IHx8IGNoZWNrYm94ID09ICZ6cmxlIHx8IGNoZWNrYm94ID09ICZoZXh0aWxlIHx8IGNoZWNrYm94ID09ICZyYXcpIHsKKyAgICAgIHRpZ2h0LmNoZWNrZWQoY2hlY2tib3ggPT0gJnRpZ2h0KTsKKyAgICAgIHpybGUuY2hlY2tlZChjaGVja2JveCA9PSAmenJsZSk7CisgICAgICBoZXh0aWxlLmNoZWNrZWQoY2hlY2tib3ggPT0gJmhleHRpbGUpOworICAgICAgcmF3LmNoZWNrZWQoY2hlY2tib3ggPT0gJnJhdyk7CisgICAgfSBlbHNlIGlmIChjaGVja2JveCA9PSAmc2VuZENsaXBib2FyZCkgeworICAgICAgc2VuZFByaW1hcnkuZGlzYWJsZWQoIXNlbmRDbGlwYm9hcmQuY2hlY2tlZCgpKTsKKyAgICB9IGVsc2UgaWYgKGNoZWNrYm94ID09ICZ1c2VMb2NhbEN1cnNvcikgeworICAgICAgZG90V2hlbk5vQ3Vyc29yLmRpc2FibGVkKCF1c2VMb2NhbEN1cnNvci5jaGVja2VkKCkpOworICAgIH0gZWxzZSBpZiAoY2hlY2tib3ggPT0gJmN1c3RvbUNvbXByZXNzTGV2ZWwpIHsKKyAgICAgIGNvbXByZXNzTGV2ZWwuZGlzYWJsZWQoIWN1c3RvbUNvbXByZXNzTGV2ZWwuY2hlY2tlZCgpKTsKKyAgICB9IGVsc2UgaWYgKGNoZWNrYm94ID09ICZub0pwZWcpIHsKKyAgICAgIHF1YWxpdHlMZXZlbC5kaXNhYmxlZCghbm9KcGVnLmNoZWNrZWQoKSk7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB2b2lkIGVudHJ5Q2FsbGJhY2soVFhFbnRyeSogZSwgRGV0YWlsIGRldGFpbCwgVGltZSB0aW1lKSB7CisgIH0KKworICBPcHRpb25zRGlhbG9nQ2FsbGJhY2sqIGNiOworICBUWExhYmVsIGZvcm1hdEFuZEVuYywgaW5wdXRzLCBtaXNjOworICBUWENoZWNrYm94IGF1dG9TZWxlY3Q7CisgIFRYQ2hlY2tib3ggZnVsbENvbG91ciwgbWVkaXVtQ29sb3VyLCBsb3dDb2xvdXIsIHZlcnlMb3dDb2xvdXI7CisgIFRYQ2hlY2tib3ggdGlnaHQsIHpybGUsIGhleHRpbGUsIHJhdzsKKworICBUWENoZWNrYm94IGN1c3RvbUNvbXByZXNzTGV2ZWw7IFRYRW50cnkgY29tcHJlc3NMZXZlbDsgVFhMYWJlbCBjb21wcmVzc0xldmVsTGFiZWw7CisgIFRYQ2hlY2tib3ggbm9KcGVnOyBUWEVudHJ5IHF1YWxpdHlMZXZlbDsgVFhMYWJlbCBxdWFsaXR5TGV2ZWxMYWJlbDsKKworICBUWENoZWNrYm94IHZpZXdPbmx5LCBhY2NlcHRDbGlwYm9hcmQsIHNlbmRDbGlwYm9hcmQsIHNlbmRQcmltYXJ5OworICBUWENoZWNrYm94IHNoYXJlZCwgZnVsbFNjcmVlbiwgdXNlTG9jYWxDdXJzb3IsIGRvdFdoZW5Ob0N1cnNvcjsKKyAgVFhCdXR0b24gb2tCdXR0b24sIGNhbmNlbEJ1dHRvbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC92bmN2aWV3ZXIvUGFzc3dkRGlhbG9nLmggYi91bml4L3ZuY3ZpZXdlci9QYXNzd2REaWFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjYyYjhlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC92bmN2aWV3ZXIvUGFzc3dkRGlhbG9nLmgKQEAgLTAsMCArMSw3MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFBhc3N3ZERpYWxvZy5oCisvLworCisjaWZuZGVmIF9fUEFTU1dERElBTE9HX0hfXworI2RlZmluZSBfX1BBU1NXRERJQUxPR19IX18KKworI2luY2x1ZGUgIlRYRGlhbG9nLmgiCisjaW5jbHVkZSAiVFhMYWJlbC5oIgorI2luY2x1ZGUgIlRYRW50cnkuaCIKKworY2xhc3MgUGFzc3dkRGlhbG9nIDogcHVibGljIFRYRGlhbG9nLCBwdWJsaWMgVFhFbnRyeUNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgUGFzc3dkRGlhbG9nKERpc3BsYXkqIGRweSwgY29uc3QgY2hhciogdGl0bGUsIGJvb2wgdXNlckRpc2FibGVkKQorICAgIDogVFhEaWFsb2coZHB5LCAzMjAsIDEwMCwgdGl0bGUsIHRydWUpLAorICAgICAgdXNlckxhYmVsKGRweSwgXygiVXNlcm5hbWU6IiksIHRoaXMsIDEyMCksCisgICAgICB1c2VyRW50cnkoZHB5LCB0aGlzLCB0aGlzLCBmYWxzZSwgMTgwKSwKKyAgICAgIHBhc3N3ZExhYmVsKGRweSwgXygiUGFzc3dvcmQ6IiksIHRoaXMsIDEyMCksCisgICAgICBwYXNzd2RFbnRyeShkcHksIHRoaXMsIHRoaXMsIHRydWUsIDE4MCkKKyAgeworICAgIHVzZXJMYWJlbC5tb3ZlKDAsIDIwKTsKKyAgICB1c2VyRW50cnkubW92ZSh1c2VyTGFiZWwud2lkdGgoKSwgMTgpOworICAgIHVzZXJFbnRyeS5kaXNhYmxlZCh1c2VyRGlzYWJsZWQpOworICAgIHBhc3N3ZExhYmVsLm1vdmUoMCwgNjApOworICAgIHBhc3N3ZEVudHJ5Lm1vdmUocGFzc3dkTGFiZWwud2lkdGgoKSwgNTgpOworICB9CisKKyAgdm9pZCB0YWtlRm9jdXMoVGltZSB0aW1lKSB7CisgICAgaWYgKCF1c2VyRW50cnkuZGlzYWJsZWQoKSkKKyAgICAgIFhTZXRJbnB1dEZvY3VzKGRweSwgdXNlckVudHJ5LndpbigpLCBSZXZlcnRUb1BhcmVudCwgdGltZSk7CisgICAgZWxzZQorICAgICAgWFNldElucHV0Rm9jdXMoZHB5LCBwYXNzd2RFbnRyeS53aW4oKSwgUmV2ZXJ0VG9QYXJlbnQsIHRpbWUpOworICB9CisKKyAgdm9pZCBlbnRyeUNhbGxiYWNrKFRYRW50cnkqIGUsIERldGFpbCBkZXRhaWwsIFRpbWUgdGltZSkgeworICAgIGlmIChlID09ICZ1c2VyRW50cnkpIHsKKyAgICAgIGlmIChkZXRhaWwgPT0gRU5URVIgfHwgZGV0YWlsID09IE5FWFRfRk9DVVMgfHwgZGV0YWlsID09IFBSRVZfRk9DVVMpCisgICAgICAgIFhTZXRJbnB1dEZvY3VzKGRweSwgcGFzc3dkRW50cnkud2luKCksIFJldmVydFRvUGFyZW50LCB0aW1lKTsKKyAgICB9IGVsc2UgaWYgKGUgPT0gJnBhc3N3ZEVudHJ5KSB7CisgICAgICBpZiAoZGV0YWlsID09IEVOVEVSKSB7CisgICAgICAgIG9rID0gdHJ1ZTsKKyAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGRldGFpbCA9PSBORVhUX0ZPQ1VTIHx8IGRldGFpbCA9PSBQUkVWX0ZPQ1VTKSB7CisgICAgICAgIFhTZXRJbnB1dEZvY3VzKGRweSwgdXNlckVudHJ5LndpbigpLCBSZXZlcnRUb1BhcmVudCwgdGltZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVFhMYWJlbCB1c2VyTGFiZWw7CisgIFRYRW50cnkgdXNlckVudHJ5OworICBUWExhYmVsIHBhc3N3ZExhYmVsOworICBUWEVudHJ5IHBhc3N3ZEVudHJ5OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3ZuY3ZpZXdlci9TZXJ2ZXJEaWFsb2cuaCBiL3VuaXgvdm5jdmlld2VyL1NlcnZlckRpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTgwZGMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3ZuY3ZpZXdlci9TZXJ2ZXJEaWFsb2cuaApAQCAtMCwwICsxLDkxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvLworLy8gU2VydmVyRGlhbG9nLmgKKy8vCisKKyNpZm5kZWYgX19TRVJWRVJESUFMT0dfSF9fCisjZGVmaW5lIF9fU0VSVkVSRElBTE9HX0hfXworCisjaW5jbHVkZSAiVFhEaWFsb2cuaCIKKyNpbmNsdWRlICJUWExhYmVsLmgiCisjaW5jbHVkZSAiVFhFbnRyeS5oIgorI2luY2x1ZGUgIlRYQnV0dG9uLmgiCisjaW5jbHVkZSAiT3B0aW9uc0RpYWxvZy5oIgorI2luY2x1ZGUgIkFib3V0RGlhbG9nLmgiCisKK2NsYXNzIFNlcnZlckRpYWxvZyA6IHB1YmxpYyBUWERpYWxvZywgcHVibGljIFRYRW50cnlDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUWEJ1dHRvbkNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgU2VydmVyRGlhbG9nKERpc3BsYXkqIGRweSwgT3B0aW9uc0RpYWxvZyogb3B0aW9uc18sIEFib3V0RGlhbG9nKiBhYm91dF8pCisgICAgOiBUWERpYWxvZyhkcHksIDM1NSwgMTIwLCBfKCJWTkMgVmlld2VyOiBDb25uZWN0aW9uIERldGFpbHMiKSwgdHJ1ZSksCisgICAgICBsYWJlbChkcHksIF8oIlZOQyBzZXJ2ZXI6IiksIHRoaXMsIDEwMCksCisgICAgICBlbnRyeShkcHksIHRoaXMsIHRoaXMsIGZhbHNlLCAxODApLAorICAgICAgYWJvdXRCdXR0b24oZHB5LCBfKCJBYm91dC4uLiIpLCB0aGlzLCB0aGlzLCA3MCksCisgICAgICBvcHRpb25zQnV0dG9uKGRweSwgXygiT3B0aW9ucy4uLiIpLCB0aGlzLCB0aGlzLCA3MCksCisgICAgICBva0J1dHRvbihkcHksIF8oIk9LIiksIHRoaXMsIHRoaXMsIDcwKSwKKyAgICAgIGNhbmNlbEJ1dHRvbihkcHksIF8oIkNhbmNlbCIpLCB0aGlzLCB0aGlzLCA3MCksCisgICAgICBvcHRpb25zKG9wdGlvbnNfKSwgYWJvdXQoYWJvdXRfKQorICB7CisgICAgbGFiZWwubW92ZSgwLCAzMCk7CisgICAgZW50cnkubW92ZShsYWJlbC53aWR0aCgpLCAyOCk7CisgICAgaW50IHggPSB3aWR0aCgpOworICAgIGludCB5ID0gaGVpZ2h0KCkgLSB5UGFkKjQgLSBjYW5jZWxCdXR0b24uaGVpZ2h0KCk7CisgICAgeCAtPSBjYW5jZWxCdXR0b24ud2lkdGgoKSArIHhQYWQqNDsKKyAgICBjYW5jZWxCdXR0b24ubW92ZSh4LCB5KTsKKyAgICB4IC09IG9rQnV0dG9uLndpZHRoKCkgKyB4UGFkKjQ7CisgICAgb2tCdXR0b24ubW92ZSh4LCB5KTsKKyAgICB4IC09IG9wdGlvbnNCdXR0b24ud2lkdGgoKSArIHhQYWQqNDsKKyAgICBvcHRpb25zQnV0dG9uLm1vdmUoeCwgeSk7CisgICAgeCAtPSBhYm91dEJ1dHRvbi53aWR0aCgpICsgeFBhZCo0OworICAgIGFib3V0QnV0dG9uLm1vdmUoeCwgeSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGFrZUZvY3VzKFRpbWUgdGltZSkgeworICAgIFhTZXRJbnB1dEZvY3VzKGRweSwgZW50cnkud2luKCksIFJldmVydFRvUGFyZW50LCB0aW1lKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBlbnRyeUNhbGxiYWNrKFRYRW50cnkqIGUsIERldGFpbCBkZXRhaWwsIFRpbWUgdGltZSkgeworICAgIGlmIChkZXRhaWwgPT0gRU5URVIpIHsKKyAgICAgIG9rID0gdHJ1ZTsKKyAgICAgIGRvbmUgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBidXR0b25BY3RpdmF0ZShUWEJ1dHRvbiogYikgeworICAgIGlmIChiID09ICZva0J1dHRvbikgeworICAgICAgb2sgPSB0cnVlOworICAgICAgZG9uZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChiID09ICZjYW5jZWxCdXR0b24pIHsKKyAgICAgIG9rID0gZmFsc2U7CisgICAgICBkb25lID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGIgPT0gJm9wdGlvbnNCdXR0b24pIHsKKyAgICAgIG9wdGlvbnMtPnNob3coKTsKKyAgICB9IGVsc2UgaWYgKGIgPT0gJmFib3V0QnV0dG9uKSB7CisgICAgICBhYm91dC0+c2hvdygpOworICAgIH0KKyAgfQorCisgIFRYTGFiZWwgbGFiZWw7CisgIFRYRW50cnkgZW50cnk7CisgIFRYQnV0dG9uIGFib3V0QnV0dG9uLCBvcHRpb25zQnV0dG9uLCBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOworICBPcHRpb25zRGlhbG9nKiBvcHRpb25zOworICBBYm91dERpYWxvZyogYWJvdXQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvdm5jdmlld2VyL2J1aWxkdGltZS5jIGIvdW5peC92bmN2aWV3ZXIvYnVpbGR0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0YzM2OQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jdmlld2VyL2J1aWxkdGltZS5jCkBAIC0wLDAgKzEsMTggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KK2NoYXIgYnVpbGR0aW1lW10gPSBfX0RBVEVfXyAiICIgX19USU1FX187CmRpZmYgLS1naXQgYS91bml4L3ZuY3ZpZXdlci9wYXJhbWV0ZXJzLmggYi91bml4L3ZuY3ZpZXdlci9wYXJhbWV0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNWFhOAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jdmlld2VyL3BhcmFtZXRlcnMuaApAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUEFSQU1FVEVSU19IX18KKyNkZWZpbmUgX19QQVJBTUVURVJTX0hfXworCisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKworZXh0ZXJuIHJmYjo6SW50UGFyYW1ldGVyIHBvaW50ZXJFdmVudEludGVydmFsOworZXh0ZXJuIHJmYjo6SW50UGFyYW1ldGVyIHdtRGVjb3JhdGlvbldpZHRoOworZXh0ZXJuIHJmYjo6SW50UGFyYW1ldGVyIHdtRGVjb3JhdGlvbkhlaWdodDsKK2V4dGVybiByZmI6OlN0cmluZ1BhcmFtZXRlciBwYXNzd29yZEZpbGU7CitleHRlcm4gcmZiOjpCb29sUGFyYW1ldGVyIHVzZUxvY2FsQ3Vyc29yOworZXh0ZXJuIHJmYjo6Qm9vbFBhcmFtZXRlciBkb3RXaGVuTm9DdXJzb3I7CitleHRlcm4gcmZiOjpCb29sUGFyYW1ldGVyIGF1dG9TZWxlY3Q7CitleHRlcm4gcmZiOjpCb29sUGFyYW1ldGVyIGZ1bGxDb2xvdXI7CitleHRlcm4gcmZiOjpJbnRQYXJhbWV0ZXIgbG93Q29sb3VyTGV2ZWw7CitleHRlcm4gcmZiOjpTdHJpbmdQYXJhbWV0ZXIgcHJlZmVycmVkRW5jb2Rpbmc7CitleHRlcm4gcmZiOjpCb29sUGFyYW1ldGVyIHZpZXdPbmx5OworZXh0ZXJuIHJmYjo6Qm9vbFBhcmFtZXRlciBzaGFyZWQ7CitleHRlcm4gcmZiOjpCb29sUGFyYW1ldGVyIGFjY2VwdENsaXBib2FyZDsKK2V4dGVybiByZmI6OkJvb2xQYXJhbWV0ZXIgc2VuZENsaXBib2FyZDsKK2V4dGVybiByZmI6OkJvb2xQYXJhbWV0ZXIgc2VuZFByaW1hcnk7CitleHRlcm4gcmZiOjpCb29sUGFyYW1ldGVyIGZ1bGxTY3JlZW47CitleHRlcm4gcmZiOjpTdHJpbmdQYXJhbWV0ZXIgZ2VvbWV0cnk7CitleHRlcm4gcmZiOjpCb29sUGFyYW1ldGVyIGN1c3RvbUNvbXByZXNzTGV2ZWw7CitleHRlcm4gcmZiOjpJbnRQYXJhbWV0ZXIgY29tcHJlc3NMZXZlbDsKK2V4dGVybiByZmI6OkJvb2xQYXJhbWV0ZXIgbm9KcGVnOworZXh0ZXJuIHJmYjo6SW50UGFyYW1ldGVyIHF1YWxpdHlMZXZlbDsKKworZXh0ZXJuIGNoYXIgYWJvdXRUZXh0W107CitleHRlcm4gY2hhciogcHJvZ3JhbU5hbWU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC92bmN2aWV3ZXIvdm5jdmlld2VyLmN4eCBiL3VuaXgvdm5jdmlld2VyL3ZuY3ZpZXdlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljOWFjNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jdmlld2VyL3ZuY3ZpZXdlci5jeHgKQEAgLTAsMCArMSwzOTYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBBbGwtbmV3IFZOQyB2aWV3ZXIgZm9yIFguCisvLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8cmZiL0xvZ2dlcl9zdGRpby5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxuZXR3b3JrL1RjcFNvY2tldC5oPgorI2luY2x1ZGUgIlRYV2luZG93LmgiCisjaW5jbHVkZSAiVFhNc2dCb3guaCIKKyNpbmNsdWRlICJDQ29ubi5oIgorCisjaW5jbHVkZSA8aW50bC9nZXR0ZXh0Lmg+CisjZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCisjZGVmaW5lIGdldHRleHRfbm9vcChTdHJpbmcpIFN0cmluZworI2RlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQorCityZmI6OkxvZ1dyaXRlciB2bG9nKCJtYWluIik7CisKK3VzaW5nIG5hbWVzcGFjZSBuZXR3b3JrOwordXNpbmcgbmFtZXNwYWNlIHJmYjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK0ludFBhcmFtZXRlciBwb2ludGVyRXZlbnRJbnRlcnZhbCgiUG9pbnRlckV2ZW50SW50ZXJ2YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lIGluIG1pbGxpc2Vjb25kcyB0byByYXRlLWxpbWl0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3VjY2Vzc2l2ZSBwb2ludGVyIGV2ZW50cyIsIDApOworSW50UGFyYW1ldGVyIHdtRGVjb3JhdGlvbldpZHRoKCJXTURlY29yYXRpb25XaWR0aCIsICJXaWR0aCBvZiB3aW5kb3cgbWFuYWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY29yYXRpb24gYXJvdW5kIGEgd2luZG93IiwgNik7CitJbnRQYXJhbWV0ZXIgd21EZWNvcmF0aW9uSGVpZ2h0KCJXTURlY29yYXRpb25IZWlnaHQiLCAiSGVpZ2h0IG9mIHdpbmRvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYW5hZ2VyIGRlY29yYXRpb24gYXJvdW5kIGEgd2luZG93IiwgMjQpOworU3RyaW5nUGFyYW1ldGVyIHBhc3N3b3JkRmlsZSgiUGFzc3dvcmRGaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhc3N3b3JkIGZpbGUgZm9yIFZOQyBhdXRoZW50aWNhdGlvbiIsICIiKTsKK0FsaWFzUGFyYW1ldGVyIHJmYmF1dGgoInBhc3N3ZCIsICJBbGlhcyBmb3IgUGFzc3dvcmRGaWxlIiwgJnBhc3N3b3JkRmlsZSk7CisKK0Jvb2xQYXJhbWV0ZXIgdXNlTG9jYWxDdXJzb3IoIlVzZUxvY2FsQ3Vyc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbmRlciB0aGUgbW91c2UgY3Vyc29yIGxvY2FsbHkiLCB0cnVlKTsKK0Jvb2xQYXJhbWV0ZXIgZG90V2hlbk5vQ3Vyc29yKCJEb3RXaGVuTm9DdXJzb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNob3cgdGhlIGRvdCBjdXJzb3Igd2hlbiB0aGUgc2VydmVyIHNlbmRzIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZpc2libGUgY3Vyc29yIiwgdHJ1ZSk7CitCb29sUGFyYW1ldGVyIGF1dG9TZWxlY3QoIkF1dG9TZWxlY3QiLAorCQkJIkF1dG8gc2VsZWN0IHBpeGVsIGZvcm1hdCBhbmQgZW5jb2RpbmcuICIKKwkJCSAiRGVmYXVsdCBpZiBQcmVmZXJyZWRFbmNvZGluZyBhbmQgRnVsbENvbG9yIGFyZSBub3Qgc3BlY2lmaWVkLiIsIAorCQkJIHRydWUpOworQm9vbFBhcmFtZXRlciBmdWxsQ29sb3VyKCJGdWxsQ29sb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgZnVsbCBjb2xvciIsIHRydWUpOworQWxpYXNQYXJhbWV0ZXIgZnVsbENvbG91ckFsaWFzKCJGdWxsQ29sb3VyIiwgIkFsaWFzIGZvciBGdWxsQ29sb3IiLCAmZnVsbENvbG91cik7CitJbnRQYXJhbWV0ZXIgbG93Q29sb3VyTGV2ZWwoIkxvd0NvbG9yTGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xvciBsZXZlbCB0byB1c2Ugb24gc2xvdyBjb25uZWN0aW9ucy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwID0gVmVyeSBMb3cgKDggY29sb3JzKSwgMSA9IExvdyAoNjQgY29sb3JzKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyID0gTWVkaXVtICgyNTYgY29sb3JzKSIsIDIpOworQWxpYXNQYXJhbWV0ZXIgbG93Q29sb3VyTGV2ZWxBbGlhcygiTG93Q29sb3VyTGV2ZWwiLCAiQWxpYXMgZm9yIExvd0NvbG9yTGV2ZWwiLCAmbG93Q29sb3VyTGV2ZWwpOworU3RyaW5nUGFyYW1ldGVyIHByZWZlcnJlZEVuY29kaW5nKCJQcmVmZXJyZWRFbmNvZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlcnJlZCBlbmNvZGluZyB0byB1c2UgKFRpZ2h0LCBaUkxFLCBIZXh0aWxlIG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUmF3KSIsICJUaWdodCIpOworQm9vbFBhcmFtZXRlciBmdWxsU2NyZWVuKCJGdWxsU2NyZWVuIiwgIkZ1bGwgc2NyZWVuIG1vZGUiLCBmYWxzZSk7CitCb29sUGFyYW1ldGVyIHZpZXdPbmx5KCJWaWV3T25seSIsCisgICAgICAgICAgICAgICAgICAgICAgICJEb24ndCBzZW5kIGFueSBtb3VzZSBvciBrZXlib2FyZCBldmVudHMgdG8gdGhlIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK0Jvb2xQYXJhbWV0ZXIgc2hhcmVkKCJTaGFyZWQiLAorICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGRpc2Nvbm5lY3Qgb3RoZXIgdmlld2VycyB1cG9uIGNvbm5lY3Rpb24gLSAiCisgICAgICAgICAgICAgICAgICAgICAic2hhcmUgdGhlIGRlc2t0b3AgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CitCb29sUGFyYW1ldGVyIGFjY2VwdENsaXBib2FyZCgiQWNjZXB0Q2xpcGJvYXJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2NlcHQgY2xpcGJvYXJkIGNoYW5nZXMgZnJvbSB0aGUgc2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworQm9vbFBhcmFtZXRlciBzZW5kQ2xpcGJvYXJkKCJTZW5kQ2xpcGJvYXJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZCBjbGlwYm9hcmQgY2hhbmdlcyB0byB0aGUgc2VydmVyIiwgdHJ1ZSk7CitCb29sUGFyYW1ldGVyIHNlbmRQcmltYXJ5KCJTZW5kUHJpbWFyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kIHRoZSBwcmltYXJ5IHNlbGVjdGlvbiBhbmQgY3V0IGJ1ZmZlciB0byB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIGFzIHdlbGwgYXMgdGhlIGNsaXBib2FyZCBzZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKworQm9vbFBhcmFtZXRlciBsaXN0ZW5Nb2RlKCJsaXN0ZW4iLCAiTGlzdGVuIGZvciBjb25uZWN0aW9ucyBmcm9tIFZOQyBzZXJ2ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CitTdHJpbmdQYXJhbWV0ZXIgZ2VvbWV0cnkoImdlb21ldHJ5IiwgIlggZ2VvbWV0cnkgc3BlY2lmaWNhdGlvbiIsICIiKTsKK1N0cmluZ1BhcmFtZXRlciBkaXNwbGF5bmFtZSgiZGlzcGxheSIsICJUaGUgWCBkaXNwbGF5IiwgIiIpOworCitTdHJpbmdQYXJhbWV0ZXIgdmlhKCJ2aWEiLCAiR2F0ZXdheSB0byB0dW5uZWwgdmlhIiwgIiIpOworCitCb29sUGFyYW1ldGVyIGN1c3RvbUNvbXByZXNzTGV2ZWwoIkN1c3RvbUNvbXByZXNzTGV2ZWwiLAorCQkJCSAiVXNlIGN1c3RvbSBjb21wcmVzc2lvbiBsZXZlbC4gIgorCQkJCSAiRGVmYXVsdCBpZiBDb21wcmVzc0xldmVsIGlzIHNwZWNpZmllZC4iLCBmYWxzZSk7CisKK0ludFBhcmFtZXRlciBjb21wcmVzc0xldmVsKCJDb21wcmVzc0xldmVsIiwKKwkJCSAgICJVc2Ugc3BlY2lmaWVkIGNvbXByZXNzaW9uIGxldmVsIgorCQkJICAgIjAgPSBMb3csIDkgPSBIaWdoIiwKKwkJCSAgIDYpOworCitCb29sUGFyYW1ldGVyIG5vSnBlZygiTm9KUEVHIiwKKwkJICAgICAiRGlzYWJsZSBsb3NzeSBKUEVHIGNvbXByZXNzaW9uIGluIFRpZ2h0IGVuY29kaW5nLiIsCisJCSAgICAgZmFsc2UpOworCitJbnRQYXJhbWV0ZXIgcXVhbGl0eUxldmVsKCJRdWFsaXR5TGV2ZWwiLAorCQkJICAiSlBFRyBxdWFsaXR5IGxldmVsLiAiCisJCQkgICIwID0gTG93LCA5ID0gSGlnaCIsCisJCQkgIDYpOworCitjaGFyIGFib3V0VGV4dFsxMDI0XTsKK2NoYXIqIHByb2dyYW1OYW1lOworZXh0ZXJuIGNoYXIgYnVpbGR0aW1lW107CisKK3N0YXRpYyB2b2lkIENsZWFudXBTaWduYWxIYW5kbGVyKGludCBzaWcpCit7CisgIC8vIENsZWFudXBTaWduYWxIYW5kbGVyIGFsbG93cyBDKysgb2JqZWN0IGNsZWFudXAgdG8gaGFwcGVuIGJlY2F1c2UgaXQgY2FsbHMKKyAgLy8gZXhpdCgpIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IHdoaWNoIGlzIHRvIGFib3J0LgorICB2bG9nLmluZm8oIkNsZWFudXBTaWduYWxIYW5kbGVyIGNhbGxlZCIpOworICBleGl0KDEpOworfQorCisvLyBYTG9naW5JY29uaWZpZXIgaXMgYSBjbGFzcyB3aGljaCBpY29uaWZpZXMgdGhlIFhETSBsb2dpbiB3aW5kb3cgd2hlbiBpdCBoYXMKKy8vIGdyYWJiZWQgdGhlIGtleWJvYXJkLCB0aHVzIHJlbGVhc2luZyB0aGUgZ3JhYiwgYWxsb3dpbmcgdGhlIHZpZXdlciB0byB1c2UKKy8vIHRoZSBrZXlib2FyZC4gIEl0IHJlbWFwcyB0aGUgeGxvZ2luIHdpbmRvdyBvbiBleGl0LgorY2xhc3MgWExvZ2luSWNvbmlmaWVyIHsKK3B1YmxpYzoKKyAgRGlzcGxheSogZHB5OworICBXaW5kb3cgeGxvZ2luOworICBYTG9naW5JY29uaWZpZXIoKSA6IGRweSgwKSwgeGxvZ2luKDApIHt9CisgIHZvaWQgaWNvbmlmeShEaXNwbGF5KiBkcHlfKSB7CisgICAgZHB5ID0gZHB5XzsKKyAgICBpZiAoWEdyYWJLZXlib2FyZChkcHksIERlZmF1bHRSb290V2luZG93KGRweSksIEZhbHNlLCBHcmFiTW9kZVN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgR3JhYk1vZGVTeW5jLCBDdXJyZW50VGltZSkgPT0gR3JhYlN1Y2Nlc3MpIHsKKyAgICAgIFhVbmdyYWJLZXlib2FyZChkcHksIEN1cnJlbnRUaW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgeGxvZ2luID0gVFhXaW5kb3c6OndpbmRvd1dpdGhOYW1lKGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwgInhsb2dpbiIpOworICAgICAgaWYgKHhsb2dpbikgeworICAgICAgICBYSWNvbmlmeVdpbmRvdyhkcHksIHhsb2dpbiwgRGVmYXVsdFNjcmVlbihkcHkpKTsKKyAgICAgICAgWFN5bmMoZHB5LCBGYWxzZSk7CisgICAgICB9CisgICAgfQorICB9CisgIH5YTG9naW5JY29uaWZpZXIoKSB7CisgICAgaWYgKHhsb2dpbikgeworICAgICAgZnByaW50ZihzdGRlcnIsIn5YTG9naW5JY29uaWZpZXIgcmVtYXBwaW5nIHhsb2dpblxuIik7CisgICAgICBYTWFwV2luZG93KGRweSwgeGxvZ2luKTsKKyAgICAgIFhGbHVzaChkcHkpOworICAgICAgc2xlZXAoMSk7CisgICAgfQorICB9Cit9OworCitzdGF0aWMgWExvZ2luSWNvbmlmaWVyIHhsb2dpbkljb25pZmllcjsKKworc3RhdGljIHZvaWQgdXNhZ2UoKQoreworICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiXG51c2FnZTogJXMgW3BhcmFtZXRlcnNdIFtob3N0OmRpc3BsYXlOdW1dIFtwYXJhbWV0ZXJzXVxuIgorICAgICAgICAgICIgICAgICAgJXMgW3BhcmFtZXRlcnNdIC1saXN0ZW4gW3BvcnRdIFtwYXJhbWV0ZXJzXVxuIiwKKyAgICAgICAgICBwcm9ncmFtTmFtZSxwcm9ncmFtTmFtZSk7CisgIGZwcmludGYoc3RkZXJyLCJcbiIKKyAgICAgICAgICAiUGFyYW1ldGVycyBjYW4gYmUgdHVybmVkIG9uIHdpdGggLTxwYXJhbT4gb3Igb2ZmIHdpdGggLTxwYXJhbT49MFxuIgorICAgICAgICAgICJQYXJhbWV0ZXJzIHdoaWNoIHRha2UgYSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGFzICIKKyAgICAgICAgICAiLTxwYXJhbT4gPHZhbHVlPlxuIgorICAgICAgICAgICJPdGhlciB2YWxpZCBmb3JtcyBhcmUgPHBhcmFtPj08dmFsdWU+IC08cGFyYW0+PTx2YWx1ZT4gIgorICAgICAgICAgICItLTxwYXJhbT49PHZhbHVlPlxuIgorICAgICAgICAgICJQYXJhbWV0ZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuICBUaGUgcGFyYW1ldGVycyBhcmU6XG5cbiIpOworICBDb25maWd1cmF0aW9uOjpsaXN0UGFyYW1zKDc5LCAxNCk7CisgIGV4aXQoMSk7Cit9CisKKy8qIFR1bm5lbGxpbmcgc3VwcG9ydC4gKi8KK3N0YXRpYyB2b2lkCitpbnRlcnByZXRWaWFQYXJhbSAoY2hhciAqKmdhdGV3YXlIb3N0LCBjaGFyICoqcmVtb3RlSG9zdCwKKwkJICAgaW50ICpyZW1vdGVQb3J0LCBjaGFyICoqdm5jU2VydmVyTmFtZSwKKwkJICAgaW50IGxvY2FsUG9ydCkKK3sKKyAgY29uc3QgaW50IFNFUlZFUl9QT1JUX09GRlNFVCA9IDU5MDA7CisgIGNoYXIgKnBvcyA9IHN0cmNociAoKnZuY1NlcnZlck5hbWUsICc6Jyk7CisgIGlmIChwb3MgPT0gTlVMTCkKKyAgICAqcmVtb3RlUG9ydCA9IFNFUlZFUl9QT1JUX09GRlNFVDsKKyAgZWxzZSB7CisgICAgaW50IHBvcnRPZmZzZXQgPSBTRVJWRVJfUE9SVF9PRkZTRVQ7CisgICAgc2l6ZV90IGxlbjsKKyAgICAqcG9zKysgPSAnXDAnOworICAgIGxlbiA9IHN0cmxlbiAocG9zKTsKKyAgICBpZiAoKnBvcyA9PSAnOicpIHsKKyAgICAgIC8qIFR3byBjb2xvbnMgaXMgYW4gYWJzb2x1dGUgcG9ydCBudW1iZXIsIG5vdCBhbiBvZmZzZXQuICovCisgICAgICBwb3MrKzsKKyAgICAgIGxlbi0tOworICAgICAgcG9ydE9mZnNldCA9IDA7CisgICAgfQorICAgIGlmICghbGVuIHx8IHN0cnNwbiAocG9zLCAiLTAxMjM0NTY3ODkiKSAhPSBsZW4gKQorICAgICAgdXNhZ2UgKCk7CisgICAgKnJlbW90ZVBvcnQgPSBhdG9pIChwb3MpICsgcG9ydE9mZnNldDsKKyAgfQorCisgIGlmICgqKnZuY1NlcnZlck5hbWUgIT0gJ1wwJykKKyAgICAqcmVtb3RlSG9zdCA9ICp2bmNTZXJ2ZXJOYW1lOworCisgICpnYXRld2F5SG9zdCA9IHN0ckR1cCAodmlhLmdldFZhbHVlU3RyICgpKTsKKyAgKnZuY1NlcnZlck5hbWUgPSBuZXcgY2hhcls1MF07CisgIHNwcmludGYgKCp2bmNTZXJ2ZXJOYW1lLCAibG9jYWxob3N0OjolZCIsIGxvY2FsUG9ydCk7Cit9CisKKyNpZm5kZWYgSEFWRV9TRVRFTlYKK2ludAorc2V0ZW52KGNvbnN0IGNoYXIgKmVudm5hbWUsIGNvbnN0IGNoYXIgKiBlbnZ2YWwsIGludCBvdmVyd3JpdGUpCit7CisgIGlmIChlbnZuYW1lICYmIGVudnZhbCkgeworICAgIGNoYXIgKiBlbnZwID0gTlVMTDsKKyAgICBlbnZwID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oZW52bmFtZSkgKyBzdHJsZW4oZW52dmFsKSArIDIpOworICAgIGlmIChlbnZwKSB7CisgICAgICAvLyBUaGUgcHV0ZW52IEFQSSBndWFyYW50ZWVzIG1lbW9yeSBsZWFrcyB3aGVuCisgICAgICAvLyBjaGFuZ2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVwZWF0ZWRseS4KKyAgICAgIHNwcmludGYoZW52cCwgIiVzPSVzIiwgZW52bmFtZSwgZW52dmFsKTsKKyAgICAgIAorICAgICAgLy8gQ2Fubm90IGZyZWUgZW52cAorICAgICAgcHV0ZW52KGVudnApOworICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgfQorICByZXR1cm4oLTEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitjcmVhdGVUdW5uZWwgKGNvbnN0IGNoYXIgKmdhdGV3YXlIb3N0LCBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAorCSAgICAgIGludCByZW1vdGVQb3J0LCBpbnQgbG9jYWxQb3J0KQoreworICBjaGFyICpjbWQgPSBnZXRlbnYgKCJWTkNfVklBX0NNRCIpOworICBjaGFyICpwZXJjZW50OworICBjaGFyIGxwb3J0WzEwXSwgcnBvcnRbMTBdOworICBzcHJpbnRmIChscG9ydCwgIiVkIiwgbG9jYWxQb3J0KTsKKyAgc3ByaW50ZiAocnBvcnQsICIlZCIsIHJlbW90ZVBvcnQpOworICBzZXRlbnYgKCJHIiwgZ2F0ZXdheUhvc3QsIDEpOworICBzZXRlbnYgKCJIIiwgcmVtb3RlSG9zdCwgMSk7CisgIHNldGVudiAoIlIiLCBycG9ydCwgMSk7CisgIHNldGVudiAoIkwiLCBscG9ydCwgMSk7CisgIGlmICghY21kKQorICAgIGNtZCA9ICIvdXNyL2Jpbi9zc2ggLWYgLUwgXCIkTFwiOlwiJEhcIjpcIiRSXCIgXCIkR1wiIHNsZWVwIDIwIjsKKyAgLyogQ29tcGF0aWJpbGl0eSB3aXRoIFRpZ2h0Vk5DJ3MgbWV0aG9kLiAqLworICB3aGlsZSAoKHBlcmNlbnQgPSBzdHJjaHIgKGNtZCwgJyUnKSkgIT0gTlVMTCkKKyAgICAqcGVyY2VudCA9ICckJzsKKyAgc3lzdGVtIChjbWQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIHNldGxvY2FsZShMQ19BTEwsICIiKTsKKyAgYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbihQQUNLQUdFKTsKKworICBzbnByaW50ZihhYm91dFRleHQsIHNpemVvZihhYm91dFRleHQpLCAKKyAgICAgICAgICAgXygiVGlnaHRWTkMgdmlld2VyIGZvciBYIHZlcnNpb24gMS41IC0gYnVpbHQgJXNcbiIKKyAgICAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuXG4iCisgICAgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMC0yMDA0IENvbnN0YW50aW4gS2FwbGluc2t5XG4iCisgICAgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwNC0yMDA1IFBldGVyIEFzdHJhbmQsIENlbmRpbyBBQlxuIgorICAgICAgICAgICAgICJTZWUgaHR0cDovL3d3dy50aWdodHZuYy5jb20gZm9yIGluZm9ybWF0aW9uIG9uIFRpZ2h0Vk5DLiIpLAorICAgICAgICAgICBidWlsZHRpbWUpOworICBmcHJpbnRmKHN0ZGVyciwiXG4lc1xuIiwgYWJvdXRUZXh0KTsKKworICBiaW5kX3RleHRkb21haW5fY29kZXNldChQQUNLQUdFLCAiaXNvLTg4NTktMSIpOworCisgIHJmYjo6aW5pdFN0ZElPTG9nZ2VycygpOworICByZmI6OkxvZ1dyaXRlcjo6c2V0TG9nUGFyYW1zKCIqOnN0ZGVycjozMCIpOworCisgIHNpZ25hbChTSUdIVVAsIENsZWFudXBTaWduYWxIYW5kbGVyKTsKKyAgc2lnbmFsKFNJR0lOVCwgQ2xlYW51cFNpZ25hbEhhbmRsZXIpOworICBzaWduYWwoU0lHVEVSTSwgQ2xlYW51cFNpZ25hbEhhbmRsZXIpOworCisgIHByb2dyYW1OYW1lID0gYXJndlswXTsKKyAgY2hhciogdm5jU2VydmVyTmFtZSA9IDA7CisgIERpc3BsYXkqIGRweSA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoQ29uZmlndXJhdGlvbjo6c2V0UGFyYW0oYXJndltpXSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeworICAgICAgaWYgKGkrMSA8IGFyZ2MpIHsKKyAgICAgICAgaWYgKENvbmZpZ3VyYXRpb246OnNldFBhcmFtKCZhcmd2W2ldWzFdLCBhcmd2W2krMV0pKSB7CisgICAgICAgICAgaSsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICB1c2FnZSgpOworICAgIH0KKworICAgIHZuY1NlcnZlck5hbWUgPSBhcmd2W2ldOworICB9CisKKyAgLy8gQ3JlYXRlIC52bmMgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QKKyAgY2hhciogaG9tZURpciA9IGdldGVudigiSE9NRSIpOworICBpZiAoaG9tZURpcikgeworICAgIENoYXJBcnJheSB2bmNEaXIoc3RybGVuKGhvbWVEaXIpKzYpOworICAgIHNwcmludGYodm5jRGlyLmJ1ZiwgIiVzLy52bmMiLCBob21lRGlyKTsKKyAgICBpbnQgcmVzdWx0ID0gIG1rZGlyKHZuY0Rpci5idWYsIDA3NTUpOworICAgIGlmIChyZXN1bHQgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKQorICAgICAgdmxvZy5lcnJvcigiQ291bGQgbm90IGNyZWF0ZSAudm5jIGRpcmVjdG9yeTogJXMuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgfSBlbHNlCisgICAgdmxvZy5lcnJvcigiQ291bGQgbm90IGNyZWF0ZSAudm5jIGRpcmVjdG9yeTogZW52aXJvbm1lbnQgdmFyaWFibGUgJEhPTUUgbm90IHNldC4iKTsKKworICBpZiAoITo6YXV0b1NlbGVjdC5oYXNCZWVuU2V0KCkpIHsKKyAgICAvLyBEZWZhdWx0IHRvIEF1dG9TZWxlY3Q9MCBpZiAtUHJlZmVycmVkRW5jb2Rpbmcgb3IgLUZ1bGxDb2xvciBpcyB1c2VkCisgICAgOjphdXRvU2VsZWN0LnNldFBhcmFtKCE6OnByZWZlcnJlZEVuY29kaW5nLmhhc0JlZW5TZXQoKSAKKwkJCSYmICE6OmZ1bGxDb2xvdXIuaGFzQmVlblNldCgpCisJCQkmJiAhOjpmdWxsQ29sb3VyQWxpYXMuaGFzQmVlblNldCgpKTsKKyAgfQorICBpZiAoITo6Y3VzdG9tQ29tcHJlc3NMZXZlbC5oYXNCZWVuU2V0KCkpIHsKKyAgICAvLyBEZWZhdWx0IHRvIEN1c3RvbUNvbXByZXNzTGV2ZWw9MSBpZiBDb21wcmVzc0xldmVsIGlzIHVzZWQuCisgICAgOjpjdXN0b21Db21wcmVzc0xldmVsLnNldFBhcmFtKDo6Y29tcHJlc3NMZXZlbC5oYXNCZWVuU2V0KCkpOworICB9CisKKyAgdHJ5IHsKKyAgICAvKiBUdW5uZWxsaW5nIHN1cHBvcnQuICovCisgICAgaWYgKHN0cmxlbiAodmlhLmdldFZhbHVlU3RyICgpKSA+IDApIHsKKyAgICAgIGNoYXIgKmdhdGV3YXlIb3N0ID0gIiI7CisgICAgICBjaGFyICpyZW1vdGVIb3N0ID0gImxvY2FsaG9zdCI7CisgICAgICBpbnQgbG9jYWxQb3J0ID0gZmluZEZyZWVUY3BQb3J0ICgpOworICAgICAgaW50IHJlbW90ZVBvcnQ7CisgICAgICBpZiAoIXZuY1NlcnZlck5hbWUpCisgICAgICAgIHVzYWdlKCk7CisgICAgICBpbnRlcnByZXRWaWFQYXJhbSAoJmdhdGV3YXlIb3N0LCAmcmVtb3RlSG9zdCwgJnJlbW90ZVBvcnQsCisJCQkgJnZuY1NlcnZlck5hbWUsIGxvY2FsUG9ydCk7CisgICAgICBjcmVhdGVUdW5uZWwgKGdhdGV3YXlIb3N0LCByZW1vdGVIb3N0LCByZW1vdGVQb3J0LCBsb2NhbFBvcnQpOworICAgIH0KKworICAgIFNvY2tldCogc29jayA9IDA7CisKKyAgICBpZiAobGlzdGVuTW9kZSkgeworICAgICAgaW50IHBvcnQgPSA1NTAwOworICAgICAgaWYgKHZuY1NlcnZlck5hbWUgJiYgaXNkaWdpdCh2bmNTZXJ2ZXJOYW1lWzBdKSkKKyAgICAgICAgcG9ydCA9IGF0b2kodm5jU2VydmVyTmFtZSk7CisKKyAgICAgIFRjcExpc3RlbmVyIGxpc3RlbmVyKHBvcnQpOworCisgICAgICB2bG9nLmluZm8oIkxpc3RlbmluZyBvbiBwb3J0ICVkXG4iLHBvcnQpOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzb2NrID0gbGlzdGVuZXIuYWNjZXB0KCk7CisgICAgICAgIGludCBwaWQgPSBmb3JrKCk7CisgICAgICAgIGlmIChwaWQgPCAwKSB7IHBlcnJvcigiZm9yayIpOyBleGl0KDEpOyB9CisgICAgICAgIGlmIChwaWQgPT0gMCkgYnJlYWs7IC8vIGNoaWxkCisgICAgICAgIGRlbGV0ZSBzb2NrOworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICB3aGlsZSAod2FpdDMoJnN0YXR1cywgV05PSEFORywgMCkgPiAwKSA7CisgICAgICB9CisgICAgfQorCisgICAgQ2hhckFycmF5IGRpc3BsYXluYW1lU3RyKGRpc3BsYXluYW1lLmdldERhdGEoKSk7CisgICAgaWYgKCEoZHB5ID0gWE9wZW5EaXNwbGF5KFRYV2luZG93OjpzdHJFbXB0eVRvTnVsbChkaXNwbGF5bmFtZVN0ci5idWYpKSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCIlczogdW5hYmxlIHRvIG9wZW4gZGlzcGxheSBcIiVzXCJcbiIsCisgICAgICAgICAgICAgIHByb2dyYW1OYW1lLCBYRGlzcGxheU5hbWUoZGlzcGxheW5hbWVTdHIuYnVmKSk7CisgICAgICBleGl0KDEpOworICAgIH0KKworICAgIFRYV2luZG93Ojppbml0KGRweSwgIlZuY3ZpZXdlciIpOworICAgIHhsb2dpbkljb25pZmllci5pY29uaWZ5KGRweSk7CisgICAgQ0Nvbm4gY2MoZHB5LCBhcmdjLCBhcmd2LCBzb2NrLCB2bmNTZXJ2ZXJOYW1lLCBsaXN0ZW5Nb2RlKTsKKworICAgIC8vIFggZXZlbnRzIGFyZSBwcm9jZXNzZWQgd2hlbmV2ZXIgcmVhZGluZyBmcm9tIHRoZSBzb2NrZXQgd291bGQgYmxvY2suCisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgY2MuZ2V0SW5TdHJlYW0oKS0+Y2hlY2soMSk7CisgICAgICBjYy5wcm9jZXNzTXNnKCk7CisgICAgfQorCisgIH0gY2F0Y2ggKHJkcjo6RW5kT2ZTdHJlYW0mIGUpIHsKKyAgICB2bG9nLmluZm8oZS5zdHIoKSk7CisgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgdmxvZy5lcnJvcihlLnN0cigpKTsKKyAgICBpZiAoZHB5KSB7CisgICAgICBUWE1zZ0JveCBtc2dCb3goZHB5LCBlLnN0cigpLCBNQl9PSywgIlZOQyBWaWV3ZXI6IEluZm9ybWF0aW9uIik7CisgICAgICBtc2dCb3guc2hvdygpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5peC92bmN2aWV3ZXIvdm5jdmlld2VyLm1hbiBiL3VuaXgvdm5jdmlld2VyL3ZuY3ZpZXdlci5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNWQzMgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvdm5jdmlld2VyL3ZuY3ZpZXdlci5tYW4KQEAgLTAsMCArMSwyMTIgQEAKKy5USCB2bmN2aWV3ZXIgMSAiMDUgTWF5IDIwMDQiICJUaWdodFZOQyIgIlZpcnR1YWwgTmV0d29yayBDb21wdXRpbmciCisuU0ggTkFNRQordm5jdmlld2VyIFwtIFZOQyB2aWV3ZXIgZm9yIFgKKy5TSCBTWU5PUFNJUworLkIgdm5jdmlld2VyCisuUkkgWyBvcHRpb25zIF0gCisuUkkgWyBob3N0IF1bOiBkaXNwbGF5IyBdCisuYnIKKy5CIHZuY3ZpZXdlcgorLlJJIFsgb3B0aW9ucyBdIAorLkIgXC1saXN0ZW4KKy5SSSBbIHBvcnQgXQorLlNIIERFU0NSSVBUSU9OCisuQiB2bmN2aWV3ZXIKK2lzIGEgdmlld2VyIChjbGllbnQpIGZvciBWaXJ0dWFsIE5ldHdvcmsgQ29tcHV0aW5nLiAgVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMKK3ZlcnNpb24gNCBmb3IgdGhlIFggd2luZG93IHN5c3RlbS4KKworSWYgeW91IHJ1biB0aGUgdmlld2VyIHdpdGggbm8gYXJndW1lbnRzIGl0IHdpbGwgcHJvbXB0IHlvdSBmb3IgYSBWTkMgc2VydmVyIHRvCitjb25uZWN0IHRvLiAgQWx0ZXJuYXRpdmVseSwgc3BlY2lmeSB0aGUgVk5DIHNlcnZlciBhcyBhbiBhcmd1bWVudCwgZS5nLjoKKworLlJTCit2bmN2aWV3ZXIgc25vb3B5OjIKKy5SRQorCit3aGVyZSAnc25vb3B5JyBpcyB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSwgYW5kICcyJyBpcyB0aGUgZGlzcGxheSBudW1iZXIgb2YgdGhlCitWTkMgc2VydmVyIG9uIHRoYXQgbWFjaGluZS4gIEVpdGhlciB0aGUgbWFjaGluZSBuYW1lIG9yIGRpc3BsYXkgbnVtYmVyIGNhbiBiZQorb21pdHRlZC4gIFNvIGZvciBleGFtcGxlICI6MSIgbWVhbnMgZGlzcGxheSBudW1iZXIgMSBvbiB0aGUgc2FtZSBtYWNoaW5lLCBhbmQKKyJzbm9vcHkiIG1lYW5zICJzbm9vcHk6MCIgaS5lLiBkaXNwbGF5IDAgb24gbWFjaGluZSAic25vb3B5Ii4KKworSWYgdGhlIFZOQyBzZXJ2ZXIgaXMgc3VjY2Vzc2Z1bGx5IGNvbnRhY3RlZCwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEKK3Bhc3N3b3JkIHRvIGF1dGhlbnRpY2F0ZSB5b3UuICBJZiB0aGUgcGFzc3dvcmQgaXMgY29ycmVjdCwgYSB3aW5kb3cgd2lsbCBhcHBlYXIKK3Nob3dpbmcgdGhlIGRlc2t0b3Agb2YgdGhlIFZOQyBzZXJ2ZXIuCisKKy5TSCBBVVRPTUFUSUMgUFJPVE9DT0wgU0VMRUNUSU9OCisKK1RoZSB2aWV3ZXIgdGVzdHMgdGhlIHNwZWVkIG9mIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgYW5kIGNob29zZXMgdGhlCitlbmNvZGluZyBhbmQgcGl4ZWwgZm9ybWF0IChjb2xvciBsZXZlbCkgYXBwcm9wcmlhdGVseS4gIFRoaXMgbWFrZXMgaXQgbXVjaAorZWFzaWVyIHRvIHVzZSB0aGFuIHByZXZpb3VzIHZlcnNpb25zIHdoZXJlIHRoZSB1c2VyIGhhZCB0byBzcGVjaWZ5IGFyY2FuZQorY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKworVGhlIHZpZXdlciBub3JtYWxseSBzdGFydHMgb3V0IGFzc3VtaW5nIHRoZSBsaW5rIGlzIHNsb3csIHVzaW5nIHRoZQorZW5jb2Rpbmcgd2l0aCB0aGUgYmVzdCBjb21wcmVzc2lvbi4gIElmIGl0IHR1cm5zIG91dCB0aGF0IHRoZSBsaW5rIGlzCitmYXN0IGVub3VnaCBpdCBzd2l0Y2hlcyB0byBhbiBlbmNvZGluZyB3aGljaCBjb21wcmVzc2VzIGxlc3MgYnV0IGlzCitmYXN0ZXIgdG8gZ2VuZXJhdGUsIHRodXMgaW1wcm92aW5nIHRoZSBpbnRlcmFjdGl2ZSBmZWVsLgorCitUaGUgdmlld2VyIG5vcm1hbGx5IHN0YXJ0cyBpbiBmdWxsLWNvbG9yIG1vZGUsIGJ1dCBzd2l0Y2hlcyB0bworbG93LWNvbG9yIG1vZGUgaWYgdGhlIGJhbmR3aWR0aCBpcyBpbnN1ZmZpY2llbnQuIEhvd2V2ZXIsIHRoaXMgb25seQorb2NjdXJzIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlcnMgc3VwcG9ydGluZyBwcm90b2NvbCAzLjggb3IKK25ld2VyLCBzaW5jZSBtYW55IG9sZCBzZXJ2ZXJzIGRvZXMgbm90IHN1cHBvcnQgY29sb3IgbW9kZSBjaGFuZ2VzCitzYWZlbHkuCisKK0F1dG9tYXRpYyBzZWxlY3Rpb24gY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0aGUKK1xmQkF1dG9TZWxlY3RcZlAgcGFyYW1ldGVyIHRvIGZhbHNlLCBvciBmcm9tIHRoZSBvcHRpb25zIGRpYWxvZy4KKworLlNIIFBPUFVQIE1FTlUKK1RoZSB2aWV3ZXIgaGFzIGEgcG9wdXAgbWVudSBjb250YWluaW5nIGVudHJpZXMgd2hpY2ggcGVyZm9ybSB2YXJpb3VzIGFjdGlvbnMuCitJdCBpcyB1c3VhbGx5IGJyb3VnaHQgdXAgYnkgcHJlc3NpbmcgRjgsIGJ1dCB0aGlzIGNhbiBiZSBjb25maWd1cmVkIHdpdGggdGhlCitNZW51S2V5IHBhcmFtZXRlci4gIEFjdGlvbnMgd2hpY2ggdGhlIHBvcHVwIG1lbnUgY2FuIHBlcmZvcm0gaW5jbHVkZToKKy5SUyAyCisuSVAgKiAyCitzd2l0Y2hpbmcgaW4gYW5kIG91dCBvZiBmdWxsLXNjcmVlbiBtb2RlCisuSVAgKgorcXVpdHRpbmcgdGhlIHZpZXdlcgorLklQICoKK2dlbmVyYXRpbmcga2V5IGV2ZW50cywgZS5nLiBzZW5kaW5nIGN0cmwtYWx0LWRlbAorLklQICoKK2FjY2Vzc2luZyB0aGUgb3B0aW9ucyBkaWFsb2cgYW5kIHZhcmlvdXMgb3RoZXIgZGlhbG9ncworLlJFCisuUFAKK0J5IGRlZmF1bHQsIGtleSBwcmVzc2VzIGluIHRoZSBwb3B1cCBtZW51IGdldCBzZW50IHRvIHRoZSBWTkMgc2VydmVyIGFuZAorZGlzbWlzcyB0aGUgcG9wdXAuICBTbyB0byBnZXQgYW4gRjggdGhyb3VnaCB0byB0aGUgVk5DIHNlcnZlciBzaW1wbHkgcHJlc3MgaXQKK3R3aWNlLgorCisuU0ggRlVMTCBTQ1JFRU4gTU9ERQorQSBmdWxsLXNjcmVlbiBtb2RlIGlzIHN1cHBvcnRlZC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGNvbm5lY3RpbmcKK3RvIGEgcmVtb3RlIHNjcmVlbiB3aGljaCBpcyB0aGUgc2FtZSBzaXplIGFzIHlvdXIgbG9jYWwgb25lLiBJZiB0aGUgcmVtb3RlCitzY3JlZW4gaXMgYmlnZ2VyLCB5b3UgY2FuIHNjcm9sbCBieSBidW1waW5nIHRoZSBtb3VzZSBhZ2FpbnN0IHRoZSBlZGdlIG9mIHRoZQorc2NyZWVuLgorCitVbmZvcnR1bmF0ZWx5IHRoaXMgbW9kZSBkb2Vzbid0IHdvcmsgY29tcGxldGVseSB3aXRoIGFsbCB3aW5kb3cgbWFuYWdlcnMsIHNpbmNlCitpdCBicmVha3MgdGhlIFggd2luZG93IG1hbmFnZW1lbnQgY29udmVudGlvbnMuCisKKy5TSCBPUFRJT05TIChQQVJBTUVURVJTKQorWW91IGNhbiBnZXQgYSBsaXN0IG9mIHBhcmFtZXRlcnMgYnkgZ2l2aW5nIFxmQlwtaFxmUCBhcyBhIGNvbW1hbmQtbGluZSBvcHRpb24KK3RvIHZuY3ZpZXdlci4gIFBhcmFtZXRlcnMgY2FuIGJlIHR1cm5lZCBvbiB3aXRoIC1cZklwYXJhbVxmUCBvciBvZmYgd2l0aAorLVxmSXBhcmFtXGZQPTAuICBQYXJhbWV0ZXJzIHdoaWNoIHRha2UgYSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGFzCistXGZJcGFyYW1cZlAgXGZJdmFsdWVcZlAuICBPdGhlciB2YWxpZCBmb3JtcyBhcmUgXGZJcGFyYW1cZlBcZkI9XGZQXGZJdmFsdWVcZlAKKy1cZklwYXJhbVxmUD1cZkl2YWx1ZVxmUCAtLVxmSXBhcmFtXGZQPVxmSXZhbHVlXGZQLiAgUGFyYW1ldGVyIG5hbWVzIGFyZQorY2FzZS1pbnNlbnNpdGl2ZS4KKworTWFueSBvZiB0aGUgcGFyYW1ldGVycyBjYW4gYWxzbyBiZSBzZXQgZ3JhcGhpY2FsbHkgdmlhIHRoZSBvcHRpb25zIGRpYWxvZyBib3guCitUaGlzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBwb3B1cCBtZW51IG9yIGZyb20gdGhlICJDb25uZWN0aW9uIGRldGFpbHMiCitkaWFsb2cgYm94LgorCisuVFAKKy5CIFwtZGlzcGxheSBcZklYZGlzcGxheVxmUAorU3BlY2lmaWVzIHRoZSBYIGRpc3BsYXkgb24gd2hpY2ggdGhlIFZOQyB2aWV3ZXIgd2luZG93IHNob3VsZCBhcHBlYXIuCisKKy5UUAorLkIgXC1nZW9tZXRyeSBcZklnZW9tZXRyeVxmUAorU3RhbmRhcmQgWCBwb3NpdGlvbiBhbmQgc2l6aW5nIHNwZWNpZmljYXRpb24uCisKKy5UUAorLkIgXC1saXN0ZW4gXGZJW3BvcnRdXGZQCitDYXVzZXMgdm5jdmlld2VyIHRvIGxpc3RlbiBvbiB0aGUgZ2l2ZW4gcG9ydCAoZGVmYXVsdCA1NTAwKSBmb3IgcmV2ZXJzZQorY29ubmVjdGlvbnMgZnJvbSBhIFZOQyBzZXJ2ZXIuICBXaW5WTkMgc3VwcG9ydHMgcmV2ZXJzZSBjb25uZWN0aW9ucyBpbml0aWF0ZWQKK3VzaW5nIHRoZSAnQWRkIE5ldyBDbGllbnQnIG1lbnUgb3B0aW9uIG9yIHRoZSAnXC1jb25uZWN0JyBjb21tYW5kLWxpbmUgb3B0aW9uLgorWHZuYyBzdXBwb3J0cyByZXZlcnNlIGNvbm5lY3Rpb25zIHdpdGggYSBoZWxwZXIgcHJvZ3JhbSBjYWxsZWQKKy5CIHZuY2NvbmZpZy4KKworLlRQCisuQiBcLXBhc3N3ZCBcZklwYXNzd29yZC1maWxlXGZQCitJZiB5b3UgYXJlIG9uIGEgZmlsZXN5c3RlbSB3aGljaCBnaXZlcyB5b3UgYWNjZXNzIHRvIHRoZSBwYXNzd29yZCBmaWxlIHVzZWQgYnkKK3RoZSBzZXJ2ZXIsIHlvdSBjYW4gc3BlY2lmeSBpdCBoZXJlIHRvIGF2b2lkIHR5cGluZyBpdCBpbi4gIEl0IHdpbGwgdXN1YWxseSBiZQorIn4vLnZuYy9wYXNzd2QiLgorCisuVFAKKy5CIFwtU2hhcmVkCitXaGVuIHlvdSBtYWtlIGEgY29ubmVjdGlvbiB0byBhIFZOQyBzZXJ2ZXIsIGFsbCBvdGhlciBleGlzdGluZyBjb25uZWN0aW9ucyBhcmUKK25vcm1hbGx5IGNsb3NlZC4gIFRoaXMgb3B0aW9uIHJlcXVlc3RzIHRoYXQgdGhleSBiZSBsZWZ0IG9wZW4sIGFsbG93aW5nIHlvdSB0bworc2hhcmUgdGhlIGRlc2t0b3Agd2l0aCBzb21lb25lIGFscmVhZHkgdXNpbmcgaXQuCisKKy5UUAorLkIgXC1WaWV3T25seQorU3BlY2lmaWVzIHRoYXQgbm8ga2V5Ym9hcmQgb3IgbW91c2UgZXZlbnRzIHNob3VsZCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCitVc2VmdWwgaWYgeW91IHdhbnQgdG8gdmlldyBhIGRlc2t0b3Agd2l0aG91dCBpbnRlcmZlcmluZzsgb2Z0ZW4gbmVlZHMgdG8gYmUKK2NvbWJpbmVkIHdpdGgKKy5CIFwtU2hhcmVkLgorCisuVFAKKy5CIFwtRnVsbFNjcmVlbgorU3RhcnQgaW4gZnVsbC1zY3JlZW4gbW9kZS4KKworLlRQCisuQiBcLUF1dG9TZWxlY3QKK1VzZSBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIGVuY29kaW5nIGFuZCBwaXhlbCBmb3JtYXQgKGRlZmF1bHQgaXMgb24pLiAgTm9ybWFsbHkKK3RoZSB2aWV3ZXIgdGVzdHMgdGhlIHNwZWVkIG9mIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgYW5kIGNob29zZXMgdGhlCitlbmNvZGluZyBhbmQgcGl4ZWwgZm9ybWF0IGFwcHJvcHJpYXRlbHkuICBUdXJuIGl0IG9mZiB3aXRoIFxmQi1BdXRvU2VsZWN0PTBcZlAuCisKKy5UUAorLkIgXC1GdWxsQ29sb3IsIFwtRnVsbENvbG91cgorVGVsbHMgdGhlIFZOQyBzZXJ2ZXIgdG8gc2VuZCBmdWxsLWNvbG9yIHBpeGVscyBpbiB0aGUgYmVzdCBmb3JtYXQgZm9yIHRoaXMKK2Rpc3BsYXkuICBUaGlzIGlzIGRlZmF1bHQuIAorCisuVFAKKy5CIFwtTG93Q29sb3JMZXZlbCwgXC1Mb3dDb2xvdXJMZXZlbCBcZklsZXZlbFxmUAorU2VsZWN0cyB0aGUgcmVkdWNlZCBjb2xvciBsZXZlbCB0byB1c2Ugb24gc2xvdyBsaW5rcy4gIFxmSWxldmVsXGZQIGNhbiByYW5nZQorZnJvbSAwIHRvIDIsIDAgbWVhbmluZyA4IGNvbG9ycywgMSBtZWFuaW5nIDY0IGNvbG9ycyAodGhlIGRlZmF1bHQpLCAyIG1lYW5pbmcKKzI1NiBjb2xvcnMuCisKKy5UUAorLkIgXC1QcmVmZXJyZWRFbmNvZGluZyBcZkllbmNvZGluZ1xmUAorVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgZW5jb2RpbmcgdG8gdXNlIGZyb20gb25lIG9mICJUaWdodCIsICJaUkxFIiwKKyJoZXh0aWxlIiBvciAicmF3Ii4KKworLlRQCisuQiAtVXNlTG9jYWxDdXJzb3IKK1JlbmRlciB0aGUgbW91c2UgY3Vyc29yIGxvY2FsbHkgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdCAoZGVmYXVsdCBpcyBvbikuCitUaGlzIGNhbiBtYWtlIHRoZSBpbnRlcmFjdGl2ZSBwZXJmb3JtYW5jZSBmZWVsIG11Y2ggYmV0dGVyIG92ZXIgc2xvdyBsaW5rcy4KKworLlRQCisuQiBcLVdNRGVjb3JhdGlvbldpZHRoIFxmSXdcZlAsIFwtV01EZWNvcmF0aW9uSGVpZ2h0IFxmSWhcZlAKK1RoZSB0b3RhbCB3aWR0aCBhbmQgaGVpZ2h0IHRha2VuIHVwIGJ5IHdpbmRvdyBtYW5hZ2VyIGRlY29yYXRpb25zLiAgVGhpcyBpcwordXNlZCB0byBjYWxjdWxhdGUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgVk5DIHZpZXdlciB3aW5kb3cuICBEZWZhdWx0IGlzCit3aWR0aCA2LCBoZWlnaHQgMjQuCisKKy5UUAorLkIgXC1sb2cgXGZJbG9nbmFtZVxmUDpcZklkZXN0XGZQOlxmSWxldmVsXGZQCitDb25maWd1cmVzIHRoZSBkZWJ1ZyBsb2cgc2V0dGluZ3MuICBcZklkZXN0XGZQIGNhbiBjdXJyZW50bHkgYmUgXGZCc3RkZXJyXGZQIG9yCitcZkJzdGRvdXRcZlAsIGFuZCBcZklsZXZlbFxmUCBpcyBiZXR3ZWVuIDAgYW5kIDEwMCwgMTAwIG1lYW5pbmcgbW9zdCB2ZXJib3NlCitvdXRwdXQuICBcZklsb2duYW1lXGZQIGlzIHVzdWFsbHkgXGZCKlxmUCBtZWFuaW5nIGFsbCwgYnV0IHlvdSBjYW4gdGFyZ2V0IGEKK3NwZWNpZmljIHNvdXJjZSBmaWxlIGlmIHlvdSBrbm93IHRoZSBuYW1lIG9mIGl0cyAiTG9nV3JpdGVyIi4gIERlZmF1bHQgaXMKK1xmQio6c3RkZXJyOjMwXGZQLgorCisuVFAKKy5CIFwtTWVudUtleSBcZklrZXlzeW0tbmFtZVxmUAorVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSBrZXkgd2hpY2ggYnJpbmdzIHVwIHRoZSBwb3B1cCBtZW51LiAgVGhlIGtleSBpcworc3BlY2lmaWVkIGFzIGFuIFgxMSBrZXlzeW0gbmFtZSAodGhlc2UgY2FuIGJlIG9idGFpbmVkIGJ5IHJlbW92aW5nIHRoZSBYS18KK3ByZWZpeCBmcm9tIHRoZSBlbnRyaWVzIGluICIvdXNyL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oIikuICBEZWZhdWx0IGlzIEY4LgorCisuVFAKK1xmQlwtdmlhXGZSIFxmSWdhdGV3YXlcZlIKK0F1dG9tYXRpY2FsbHkgY3JlYXRlIGVuY3J5cHRlZCBUQ1AgdHVubmVsIHRvIHRoZSBcZklnYXRld2F5XGZSIG1hY2hpbmUKK2JlZm9yZSBjb25uZWN0aW9uLCBjb25uZWN0IHRvIHRoZSBcZklob3N0XGZSIHRocm91Z2ggdGhhdCB0dW5uZWwKKyhUaWdodFZOQ1wtc3BlY2lmaWMpLiBCeSBkZWZhdWx0LCB0aGlzIG9wdGlvbiBpbnZva2VzIFNTSCBsb2NhbCBwb3J0Citmb3J3YXJkaW5nLCBhc3N1bWluZyB0aGF0IFNTSCBjbGllbnQgYmluYXJ5IGNhbiBiZSBhY2Nlc3NlZCBhcworL3Vzci9iaW4vc3NoLiBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGUgXGZCXC12aWFcZlIgb3B0aW9uLCB0aGUgaG9zdAorbWFjaGluZSBuYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgYXMga25vd24gdG8gdGhlIGdhdGV3YXkgbWFjaGluZSwgZS5nLiAKKyJsb2NhbGhvc3QiIGRlbm90ZXMgdGhlIFxmSWdhdGV3YXlcZlIsIG5vdCB0aGUgbWFjaGluZSB3aGVyZSB2bmN2aWV3ZXIKK3dhcyBsYXVuY2hlZC4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxmSVZOQ19WSUFfQ01EXGZSIGNhbiBvdmVycmlkZQordGhlIGRlZmF1bHQgdHVubmVsIGNvbW1hbmQgb2YKK1xmQi91c3IvYmluL3NzaFwgLWZcIC1MXCAiJEwiOiIkSCI6IiRSIlwgIiRHIlwgc2xlZXBcIDIwXGZSLiAgVGhlIHR1bm5lbAorY29tbWFuZCBpcyBleGVjdXRlZCB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgXGZJTFxmUiwgXGZJSFxmUiwKK1xmSVJcZlIsIGFuZCBcZklHXGZSIHRha2VuIHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsIHBvcnQgbnVtYmVyLCB0aGUgcmVtb3RlCitob3N0LCB0aGUgcG9ydCBudW1iZXIgb24gdGhlIHJlbW90ZSBob3N0LCBhbmQgdGhlIGdhdGV3YXkgbWFjaGluZQorcmVzcGVjdGl2ZWx5LgorCisuU0ggU0VFIEFMU08KKy5CUiBYdm5jICgxKSwKKy5CUiB2bmNwYXNzd2QgKDEpLAorLkJSIHZuY2NvbmZpZyAoMSksCisuQlIgdm5jc2VydmVyICgxKQorLmJyCitodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbQorCisuU0ggQVVUSE9SCitUcmlzdGFuIFJpY2hhcmRzb24sIFJlYWxWTkMgTHRkLgorCitWTkMgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IHRoZSBSZWFsVk5DIHRlYW0gd2hpbGUgYXQgT2xpdmV0dGkKK1Jlc2VhcmNoIEx0ZCAvIEFUJlQgTGFib3JhdG9yaWVzIENhbWJyaWRnZS4gIFRpZ2h0Vk5DIGFkZGl0aW9ucyB3YXMKK2ltcGxlbWVudGVkIGJ5IENvbnN0YW50aW4gS2FwbGluc2t5LiBNYW55IG90aGVyIHBlb3BsZSBwYXJ0aWNpcGF0ZWQgaW4KK2RldmVsb3BtZW50LCB0ZXN0aW5nIGFuZCBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvdW5peC94MHZuY3NlcnZlci9HZW9tZXRyeS5jeHggYi91bml4L3gwdm5jc2VydmVyL0dlb21ldHJ5LmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2I0ZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC94MHZuY3NlcnZlci9HZW9tZXRyeS5jeHgKQEAgLTAsMCArMSw3MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIEdlb21ldHJ5LmN4eAorLy8KKworI2luY2x1ZGUgPHJmYi9SZWN0Lmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHgwdm5jc2VydmVyL0dlb21ldHJ5Lmg+CisKK3N0YXRpYyBMb2dXcml0ZXIgdmxvZygiR2VvbWV0cnkiKTsKKworU3RyaW5nUGFyYW1ldGVyIEdlb21ldHJ5OjptX2dlb21ldHJ5UGFyYW0oIkdlb21ldHJ5IiwKKyAgIlNjcmVlbiBhcmVhIHNob3duIHRvIFZOQyBjbGllbnRzLiAiCisgICJGb3JtYXQgaXMgPHdpZHRoPng8aGVpZ2h0Pis8b2Zmc2V0X3g+KzxvZmZzZXRfeT4sICIKKyAgIm1vcmUgaW5mb3JtYXRpb24gaW4gbWFuIFgsIHNlY3Rpb24gR0VPTUVUUlkgU1BFQ0lGSUNBVElPTlMuICIKKyAgIklmIHRoZSBhcmd1bWVudCBpcyBlbXB0eSwgZnVsbCBzY3JlZW4gaXMgc2hvd24gdG8gVk5DIGNsaWVudHMuIiwKKyAgIiIpOworCitHZW9tZXRyeTo6R2VvbWV0cnkoaW50IGZ1bGxXaWR0aCwgaW50IGZ1bGxIZWlnaHQpCisgIDogbV93aWR0aChmdWxsV2lkdGgpLCBtX2hlaWdodChmdWxsSGVpZ2h0KSwKKyAgICBtX29mZnNldExlZnQoMCksIG1fb2Zmc2V0VG9wKDApCit7CisgIGNvbnN0IGNoYXIgKnBhcmFtID0gbV9nZW9tZXRyeVBhcmFtLmdldERhdGEoKTsKKyAgaWYgKHN0cmxlbihwYXJhbSkgIT0gMCkgeworICAgIGludCB3LCBoOworICAgIGludCB4ID0gMCwgeSA9IDA7CisgICAgY2hhciBzaWduX3hbMl0gPSAiKyI7CisgICAgY2hhciBzaWduX3lbMl0gPSAiKyI7CisgICAgaW50IG4gPSBzc2NhbmYocGFyYW0sICIlZHglZCUxWystXSVkJTFbKy1dJWQiLAorICAgICAgICAgICAgICAgICAgICZ3LCAmaCwgc2lnbl94LCAmeCwgc2lnbl95LCAmeSk7CisgICAgaWYgKChuID09IDIgfHwgbiA9PSA2KSAmJiB3ID4gMCAmJiBoID4gMCAmJiB4ID49IDAgJiYgeSA+PSAwKSB7CisgICAgICBpZiAoc2lnbl94WzBdID09ICctJykKKyAgICAgICAgeCA9IGZ1bGxXaWR0aCAtIHcgLSB4OworICAgICAgaWYgKHNpZ25feVswXSA9PSAnLScpCisgICAgICAgIHkgPSBmdWxsSGVpZ2h0IC0gaCAtIHk7CisgICAgICBSZWN0IGZ1bGxSZWN0KDAsIDAsIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCk7CisgICAgICBSZWN0IHBhcnRSZWN0KHgsIHksIHggKyB3LCB5ICsgaCk7CisgICAgICBSZWN0IHIgPSBwYXJ0UmVjdC5pbnRlcnNlY3QoZnVsbFJlY3QpOworICAgICAgaWYgKHIuYXJlYSgpID4gMCkgeworICAgICAgICBtX3dpZHRoID0gci53aWR0aCgpOworICAgICAgICBtX2hlaWdodCA9IHIuaGVpZ2h0KCk7CisgICAgICAgIG1fb2Zmc2V0TGVmdCA9IHIudGwueDsKKyAgICAgICAgbV9vZmZzZXRUb3AgPSByLnRsLnk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2bG9nLmVycm9yKCJSZXF1ZXN0ZWQgYXJlYSBpcyBvdXQgb2YgdGhlIGRlc2t0b3AgYm91bmRhcmllcyIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2bG9nLmVycm9yKCJXcm9uZyBhcmd1bWVudCBmb3JtYXQiKTsKKyAgICB9CisgIH0KKyAgdmxvZy5pbmZvKCJEZXNrdG9wIGdlb21ldHJ5IGlzICVkeCVkKyVkKyVkIiwKKyAgICAgICAgICAgIG1fd2lkdGgsIG1faGVpZ2h0LCBtX29mZnNldExlZnQsIG1fb2Zmc2V0VG9wKTsKK30KKwpkaWZmIC0tZ2l0IGEvdW5peC94MHZuY3NlcnZlci9HZW9tZXRyeS5oIGIvdW5peC94MHZuY3NlcnZlci9HZW9tZXRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDU5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3gwdm5jc2VydmVyL0dlb21ldHJ5LmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIEdlb21ldHJ5LmgKKy8vCisKKyNpZm5kZWYgX19HRU9NRVRSWV9IX18KKyNkZWZpbmUgX19HRU9NRVRSWV9IX18KKworI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK2NsYXNzIEdlb21ldHJ5Cit7CitwdWJsaWM6CisgIEdlb21ldHJ5KGludCBmdWxsV2lkdGgsIGludCBmdWxsSGVpZ2h0KTsKKworICBpbnQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3dpZHRoOyB9CisgIGludCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2hlaWdodDsgfQorICBpbnQgb2Zmc2V0TGVmdCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0TGVmdDsgfQorICBpbnQgb2Zmc2V0VG9wKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRUb3A7IH0KKworcHJvdGVjdGVkOgorICBzdGF0aWMgU3RyaW5nUGFyYW1ldGVyIG1fZ2VvbWV0cnlQYXJhbTsKKworICBpbnQgbV93aWR0aDsKKyAgaW50IG1faGVpZ2h0OworICBpbnQgbV9vZmZzZXRMZWZ0OworICBpbnQgbV9vZmZzZXRUb3A7Cit9OworCisjZW5kaWYgLy8gX19HRU9NRVRSWV9IX18KKwpkaWZmIC0tZ2l0IGEvdW5peC94MHZuY3NlcnZlci9JbWFnZS5jeHggYi91bml4L3gwdm5jc2VydmVyL0ltYWdlLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzY2YzVhCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94MHZuY3NlcnZlci9JbWFnZS5jeHgKQEAgLTAsMCArMSw1NDkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBJbWFnZS5jeHgKKy8vCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgSEFWRV9NSVRTSE0KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisjaW5jbHVkZSA8eDB2bmNzZXJ2ZXIvSW1hZ2UuaD4KKworLy8KKy8vIEltYWdlQ2xlYW51cCBpcyB1c2VkIHRvIGRlbGV0ZSBJbWFnZSBpbnN0YW5jZXMgYXV0b21hdGljYWxseSBvbgorLy8gcHJvZ3JhbSBzaHV0ZG93bi4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNoYXJlZCBtZW1vcnkgaW1hZ2VzLgorLy8KKworI2luY2x1ZGUgPGxpc3Q+CisKK2NsYXNzIEltYWdlQ2xlYW51cCB7CitwdWJsaWM6CisgIHN0ZDo6bGlzdDxJbWFnZSAqPiBpbWFnZXM7CisKKyAgfkltYWdlQ2xlYW51cCgpCisgIHsKKyAgICB3aGlsZSAoIWltYWdlcy5lbXB0eSgpKSB7CisgICAgICBkZWxldGUgaW1hZ2VzLmZyb250KCk7CisgICAgfQorICB9Cit9OworCitJbWFnZUNsZWFudXAgaW1hZ2VDbGVhbnVwOworCisvLworLy8gSW1hZ2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisvLworCitzdGF0aWMgcmZiOjpMb2dXcml0ZXIgdmxvZygiSW1hZ2UiKTsKKworSW1hZ2U6OkltYWdlKERpc3BsYXkgKmQpCisgIDogeGltKE5VTEwpLCBkcHkoZCksIHRydWVDb2xvcih0cnVlKQoreworICBpbWFnZUNsZWFudXAuaW1hZ2VzLnB1c2hfYmFjayh0aGlzKTsKK30KKworSW1hZ2U6OkltYWdlKERpc3BsYXkgKmQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgOiB4aW0oTlVMTCksIGRweShkKSwgdHJ1ZUNvbG9yKHRydWUpCit7CisgIGltYWdlQ2xlYW51cC5pbWFnZXMucHVzaF9iYWNrKHRoaXMpOworICBJbml0KHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIEltYWdlOjpJbml0KGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgVmlzdWFsKiB2aXMgPSBEZWZhdWx0VmlzdWFsKGRweSwgRGVmYXVsdFNjcmVlbihkcHkpKTsKKyAgdHJ1ZUNvbG9yID0gKHZpcy0+Y19jbGFzcyA9PSBUcnVlQ29sb3IpOworCisgIHhpbSA9IFhDcmVhdGVJbWFnZShkcHksIHZpcywgRGVmYXVsdERlcHRoKGRweSwgRGVmYXVsdFNjcmVlbihkcHkpKSwKKyAgICAgICAgICAgICAgICAgICAgIFpQaXhtYXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIEJpdG1hcFBhZChkcHkpLCAwKTsKKworICB4aW0tPmRhdGEgPSAoY2hhciAqKW1hbGxvYyh4aW0tPmJ5dGVzX3Blcl9saW5lICogeGltLT5oZWlnaHQpOworICBpZiAoeGltLT5kYXRhID09IE5VTEwpIHsKKyAgICB2bG9nLmVycm9yKCJtYWxsb2MoKSBmYWlsZWQiKTsKKyAgICBleGl0KDEpOworICB9Cit9CisKK0ltYWdlOjp+SW1hZ2UoKQoreworICBpbWFnZUNsZWFudXAuaW1hZ2VzLnJlbW92ZSh0aGlzKTsKKworICAvLyBYRGVzdHJveUltYWdlIHdpbGwgZnJlZSB4aW0tPmRhdGEgaWYgbmVjZXNzYXJ5CisgIGlmICh4aW0gIT0gTlVMTCkKKyAgICBYRGVzdHJveUltYWdlKHhpbSk7Cit9CisKK3ZvaWQgSW1hZ2U6OmdldChXaW5kb3cgd25kLCBpbnQgeCwgaW50IHkpCit7CisgIGdldCh3bmQsIHgsIHksIHhpbS0+d2lkdGgsIHhpbS0+aGVpZ2h0KTsKK30KKwordm9pZCBJbWFnZTo6Z2V0KFdpbmRvdyB3bmQsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICBYR2V0U3ViSW1hZ2UoZHB5LCB3bmQsIHgsIHksIHcsIGgsIEFsbFBsYW5lcywgWlBpeG1hcCwgeGltLCAwLCAwKTsKK30KKworLy8KKy8vIENvcHlpbmcgcGl4ZWxzIGZyb20gb25lIGltYWdlIHRvIGFub3RoZXIuCisvLworLy8gRklYTUU6IFVzZSBQb2ludCBhbmQgUmVjdCBzdHJ1Y3R1cmVzPworLy8gRklYTUU6IFRvbyBtYW55IHNpbWlsYXIgbWV0aG9kcz8KKy8vCisKK2lubGluZQordm9pZCBJbWFnZTo6Y29weVBpeGVscyhYSW1hZ2UgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF94LCBpbnQgZHN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfeCwgaW50IHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgIGNvbnN0IGNoYXIgKnNyY09mZnNldCA9CisgICAgc3JjLT5kYXRhICsgKHNyY195ICogc3JjLT5ieXRlc19wZXJfbGluZSArCisgICAgICAgICAgICAgICAgIHNyY194ICogKHNyYy0+Yml0c19wZXJfcGl4ZWwgLyA4KSk7CisgIGNoYXIgKmRzdE9mZnNldCA9CisgICAgeGltLT5kYXRhICsgKGRzdF95ICogeGltLT5ieXRlc19wZXJfbGluZSArCisgICAgICAgICAgICAgICAgIGRzdF94ICogKHhpbS0+Yml0c19wZXJfcGl4ZWwgLyA4KSk7CisKKyAgaW50IHJvd0xlbmd0aCA9IHcgKiAoeGltLT5iaXRzX3Blcl9waXhlbCAvIDgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaCA7IGkrKykgeworICAgIG1lbWNweShkc3RPZmZzZXQsIHNyY09mZnNldCwgcm93TGVuZ3RoKTsKKyAgICBzcmNPZmZzZXQgKz0gc3JjLT5ieXRlc19wZXJfbGluZTsKKyAgICBkc3RPZmZzZXQgKz0geGltLT5ieXRlc19wZXJfbGluZTsKKyAgfQorfQorCit2b2lkIEltYWdlOjp1cGRhdGVSZWN0KFhJbWFnZSAqc3JjLCBpbnQgZHN0X3gsIGludCBkc3RfeSkKK3sKKyAgLy8gTGltaXQgd2lkdGggYW5kIGhlaWdodCBhdCBkZXN0aW5hdGlvbiBpbWFnZSBzaXplLgorICBpbnQgdyA9IHNyYy0+d2lkdGg7CisgIGlmIChkc3RfeCArIHcgPiB4aW0tPndpZHRoKQorICAgIHcgPSB4aW0tPndpZHRoIC0gZHN0X3g7CisgIGludCBoID0gc3JjLT5oZWlnaHQ7CisgIGlmIChkc3RfeSArIGggPiB4aW0tPmhlaWdodCkKKyAgICBoID0geGltLT5oZWlnaHQgLSBkc3RfeTsKKworICBjb3B5UGl4ZWxzKHNyYywgZHN0X3gsIGRzdF95LCAwLCAwLCB3LCBoKTsKK30KKwordm9pZCBJbWFnZTo6dXBkYXRlUmVjdChJbWFnZSAqc3JjLCBpbnQgZHN0X3gsIGludCBkc3RfeSkKK3sKKyAgdXBkYXRlUmVjdChzcmMtPnhpbSwgZHN0X3gsIGRzdF95KTsKK30KKwordm9pZCBJbWFnZTo6dXBkYXRlUmVjdChYSW1hZ2UgKnNyYywgaW50IGRzdF94LCBpbnQgZHN0X3ksIGludCB3LCBpbnQgaCkKK3sKKyAgLy8gQ29ycmVjdCB3aWR0aCBhbmQgaGVpZ2h0IGlmIG5lY2Vzc2FyeS4KKyAgaWYgKHcgPiBzcmMtPndpZHRoKQorICAgIHcgPSBzcmMtPndpZHRoOworICBpZiAoZHN0X3ggKyB3ID4geGltLT53aWR0aCkKKyAgICB3ID0geGltLT53aWR0aCAtIGRzdF94OworICBpZiAoaCA+IHNyYy0+aGVpZ2h0KQorICAgIGggPSBzcmMtPmhlaWdodDsKKyAgaWYgKGRzdF95ICsgaCA+IHhpbS0+aGVpZ2h0KQorICAgIGggPSB4aW0tPmhlaWdodCAtIGRzdF95OworCisgIGNvcHlQaXhlbHMoc3JjLCBkc3RfeCwgZHN0X3ksIDAsIDAsIHcsIGgpOworfQorCit2b2lkIEltYWdlOjp1cGRhdGVSZWN0KEltYWdlICpzcmMsIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgdywgaW50IGgpCit7CisgIHVwZGF0ZVJlY3Qoc3JjLT54aW0sIGRzdF94LCBkc3RfeSwgdywgaCk7Cit9CisKK3ZvaWQgSW1hZ2U6OnVwZGF0ZVJlY3QoWEltYWdlICpzcmMsIGludCBkc3RfeCwgaW50IGRzdF95LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHcsIGludCBoKQoreworICAvLyBDb3JyZWN0IHdpZHRoIGFuZCBoZWlnaHQgaWYgbmVjZXNzYXJ5LgorICBpZiAoc3JjX3ggKyB3ID4gc3JjLT53aWR0aCkKKyAgICB3ID0gc3JjLT53aWR0aCAtIHNyY194OworICBpZiAoZHN0X3ggKyB3ID4geGltLT53aWR0aCkKKyAgICB3ID0geGltLT53aWR0aCAtIGRzdF94OworICBpZiAoc3JjX3kgKyBoID4gc3JjLT5oZWlnaHQpCisgICAgaCA9IHNyYy0+aGVpZ2h0IC0gc3JjX3k7CisgIGlmIChkc3RfeSArIGggPiB4aW0tPmhlaWdodCkKKyAgICBoID0geGltLT5oZWlnaHQgLSBkc3RfeTsKKworICBjb3B5UGl4ZWxzKHNyYywgZHN0X3gsIGRzdF95LCBzcmNfeCwgc3JjX3ksIHcsIGgpOworfQorCit2b2lkIEltYWdlOjp1cGRhdGVSZWN0KEltYWdlICpzcmMsIGludCBkc3RfeCwgaW50IGRzdF95LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IHcsIGludCBoKQoreworICB1cGRhdGVSZWN0KHNyYy0+eGltLCBkc3RfeCwgZHN0X3ksIHNyY194LCBzcmNfeSwgdywgaCk7Cit9CisKKyNpZmRlZiBIQVZFX01JVFNITQorCisvLworLy8gU2htSW1hZ2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisvLworCitzdGF0aWMgYm9vbCBjYXVnaHRTaG1FcnJvciA9IGZhbHNlOworCitzdGF0aWMgaW50IFNobUNyZWF0aW9uWEVycm9ySGFuZGxlcihEaXNwbGF5ICpkcHksIFhFcnJvckV2ZW50ICplcnJvcikKK3sKKyAgY2F1Z2h0U2htRXJyb3IgPSB0cnVlOworICByZXR1cm4gMDsKK30KKworU2htSW1hZ2U6OlNobUltYWdlKERpc3BsYXkgKmQpCisgIDogSW1hZ2UoZCksIHNobWluZm8oTlVMTCkKK3sKK30KKworU2htSW1hZ2U6OlNobUltYWdlKERpc3BsYXkgKmQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgOiBJbWFnZShkKSwgc2htaW5mbyhOVUxMKQoreworICBJbml0KHdpZHRoLCBoZWlnaHQpOworfQorCisvLyBGSVhNRTogUmVtb3ZlIGR1cGxpY2F0aW9uIG9mIGNsZWFudXAgb3BlcmF0aW9ucy4KK3ZvaWQgU2htSW1hZ2U6OkluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBYVmlzdWFsSW5mbyAqdmluZm8pCit7CisgIGludCBtYWpvciwgbWlub3I7CisgIEJvb2wgcGl4bWFwczsKKworICBpZiAoIVhTaG1RdWVyeVZlcnNpb24oZHB5LCAmbWFqb3IsICZtaW5vciwgJnBpeG1hcHMpKSB7CisgICAgdmxvZy5lcnJvcigiWFNobVF1ZXJ5VmVyc2lvbigpIGZhaWxlZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIFZpc3VhbCAqdmlzdWFsOworICBpbnQgZGVwdGg7CisKKyAgaWYgKHZpbmZvID09IE5VTEwpIHsKKyAgICB2aXN1YWwgPSBEZWZhdWx0VmlzdWFsKGRweSwgRGVmYXVsdFNjcmVlbihkcHkpKTsKKyAgICBkZXB0aCA9IERlZmF1bHREZXB0aChkcHksIERlZmF1bHRTY3JlZW4oZHB5KSk7CisgIH0gZWxzZSB7CisgICAgdmlzdWFsID0gdmluZm8tPnZpc3VhbDsKKyAgICBkZXB0aCA9IHZpbmZvLT5kZXB0aDsKKyAgfQorCisgIHRydWVDb2xvciA9ICh2aXN1YWwtPmNfY2xhc3MgPT0gVHJ1ZUNvbG9yKTsKKworICBzaG1pbmZvID0gbmV3IFhTaG1TZWdtZW50SW5mbzsKKworICB4aW0gPSBYU2htQ3JlYXRlSW1hZ2UoZHB5LCB2aXN1YWwsIGRlcHRoLCBaUGl4bWFwLCAwLCBzaG1pbmZvLAorCQkJd2lkdGgsIGhlaWdodCk7CisgIGlmICh4aW0gPT0gTlVMTCkgeworICAgIHZsb2cuZXJyb3IoIlhTaG1DcmVhdGVJbWFnZSgpIGZhaWxlZCIpOworICAgIGRlbGV0ZSBzaG1pbmZvOworICAgIHNobWluZm8gPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorCisgIHNobWluZm8tPnNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4aW0tPmJ5dGVzX3Blcl9saW5lICogeGltLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ19DUkVBVHwwNzc3KTsKKyAgaWYgKHNobWluZm8tPnNobWlkID09IC0xKSB7CisgICAgcGVycm9yKCJzaG1nZXQiKTsKKyAgICB2bG9nLmVycm9yKCJzaG1nZXQoKSBmYWlsZWQgKCVkIGJ5dGVzIHJlcXVlc3RlZCkiLAorICAgICAgICAgICAgICAgaW50KHhpbS0+Ynl0ZXNfcGVyX2xpbmUgKiB4aW0tPmhlaWdodCkpOworICAgIFhEZXN0cm95SW1hZ2UoeGltKTsKKyAgICB4aW0gPSBOVUxMOworICAgIGRlbGV0ZSBzaG1pbmZvOworICAgIHNobWluZm8gPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorCisgIHNobWluZm8tPnNobWFkZHIgPSB4aW0tPmRhdGEgPSAoY2hhciAqKXNobWF0KHNobWluZm8tPnNobWlkLCAwLCAwKTsKKyAgaWYgKHNobWluZm8tPnNobWFkZHIgPT0gKGNoYXIgKiktMSkgeworICAgIHBlcnJvcigic2htYXQiKTsKKyAgICB2bG9nLmVycm9yKCJzaG1hdCgpIGZhaWxlZCAoJWQgYnl0ZXMgcmVxdWVzdGVkKSIsCisgICAgICAgICAgICAgICBpbnQoeGltLT5ieXRlc19wZXJfbGluZSAqIHhpbS0+aGVpZ2h0KSk7CisgICAgc2htY3RsKHNobWluZm8tPnNobWlkLCBJUENfUk1JRCwgMCk7CisgICAgWERlc3Ryb3lJbWFnZSh4aW0pOworICAgIHhpbSA9IE5VTEw7CisgICAgZGVsZXRlIHNobWluZm87CisgICAgc2htaW5mbyA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisKKyAgc2htaW5mby0+cmVhZE9ubHkgPSBGYWxzZTsKKworICBYRXJyb3JIYW5kbGVyIG9sZEhkbHIgPSBYU2V0RXJyb3JIYW5kbGVyKFNobUNyZWF0aW9uWEVycm9ySGFuZGxlcik7CisgIFhTaG1BdHRhY2goZHB5LCBzaG1pbmZvKTsKKyAgWFN5bmMoZHB5LCBGYWxzZSk7CisgIFhTZXRFcnJvckhhbmRsZXIob2xkSGRscik7CisgIGlmIChjYXVnaHRTaG1FcnJvcikgeworICAgIHZsb2cuZXJyb3IoIlhTaG1BdHRhY2goKSBmYWlsZWQiKTsKKyAgICBzaG1kdChzaG1pbmZvLT5zaG1hZGRyKTsKKyAgICBzaG1jdGwoc2htaW5mby0+c2htaWQsIElQQ19STUlELCAwKTsKKyAgICBYRGVzdHJveUltYWdlKHhpbSk7CisgICAgeGltID0gTlVMTDsKKyAgICBkZWxldGUgc2htaW5mbzsKKyAgICBzaG1pbmZvID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KK30KKworU2htSW1hZ2U6On5TaG1JbWFnZSgpCit7CisgIC8vIEZJWE1FOiBEZXN0cm95IGltYWdlIGFzIGRlc2NyaWJlZCBpbiBNSVQtU0hNIGRvY3VtZW50YXRpb24uCisgIGlmIChzaG1pbmZvICE9IE5VTEwpIHsKKyAgICBzaG1kdChzaG1pbmZvLT5zaG1hZGRyKTsKKyAgICBzaG1jdGwoc2htaW5mby0+c2htaWQsIElQQ19STUlELCAwKTsKKyAgICBkZWxldGUgc2htaW5mbzsKKyAgfQorfQorCit2b2lkIFNobUltYWdlOjpnZXQoV2luZG93IHduZCwgaW50IHgsIGludCB5KQoreworICBYU2htR2V0SW1hZ2UoZHB5LCB3bmQsIHhpbSwgeCwgeSwgQWxsUGxhbmVzKTsKK30KKwordm9pZCBTaG1JbWFnZTo6Z2V0KFdpbmRvdyB3bmQsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAvLyBGSVhNRTogVXNlIFNITSBmb3IgdGhpcyBhcyB3ZWxsPworICBYR2V0U3ViSW1hZ2UoZHB5LCB3bmQsIHgsIHksIHcsIGgsIEFsbFBsYW5lcywgWlBpeG1hcCwgeGltLCAwLCAwKTsKK30KKworI2lmZGVmIEhBVkVfUkVBRERJU1BMQVkKKworLy8KKy8vIElyaXhPdmVybGF5U2htSW1hZ2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisvLworCitJcml4T3ZlcmxheVNobUltYWdlOjpJcml4T3ZlcmxheVNobUltYWdlKERpc3BsYXkgKmQpCisgIDogU2htSW1hZ2UoZCksIHJlYWREaXNwbGF5QnVmKE5VTEwpCit7Cit9CisKK0lyaXhPdmVybGF5U2htSW1hZ2U6OklyaXhPdmVybGF5U2htSW1hZ2UoRGlzcGxheSAqZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorICA6IFNobUltYWdlKGQpLCByZWFkRGlzcGxheUJ1ZihOVUxMKQoreworICBJbml0KHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIElyaXhPdmVybGF5U2htSW1hZ2U6OkluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIHBpeGVsIGZvcm1hdCB1c2VkIGJ5IFhSZWFkRGlzcGxheS4KKyAgWFZpc3VhbEluZm8gdmluZm87CisgIGlmICghZ2V0T3ZlcmxheVZpc3VhbEluZm8oJnZpbmZvKSkKKyAgICByZXR1cm47CisKKyAgLy8gQ3JlYXRlIGFuIFNITSBpbWFnZSBvZiB0aGUgc2FtZSBmb3JtYXQuCisgIFNobUltYWdlOjpJbml0KHdpZHRoLCBoZWlnaHQsICZ2aW5mbyk7CisgIGlmICh4aW0gPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLy8gRklYTUU6IENoZWNrIGlmIHRoZSBleHRlbnNpb24gaXMgYXZhaWxhYmxlIGF0IHJ1biB0aW1lLgorICByZWFkRGlzcGxheUJ1ZiA9IFhTaG1DcmVhdGVSZWFkRGlzcGxheUJ1ZihkcHksIE5VTEwsIHNobWluZm8sIHdpZHRoLCBoZWlnaHQpOworfQorCitib29sIElyaXhPdmVybGF5U2htSW1hZ2U6OmdldE92ZXJsYXlWaXN1YWxJbmZvKFhWaXN1YWxJbmZvICp2aW5mb19yZXQpCit7CisgIC8vIEZpcnN0LCBnZXQgYW4gaW1hZ2UgaW4gdGhlIGZvcm1hdCByZXR1cm5lZCBieSBYUmVhZERpc3BsYXkuCisgIHVuc2lnbmVkIGxvbmcgaGludHMgPSAwLCBoaW50c19yZXQ7CisgIFhJbWFnZSAqdGVzdEltYWdlID0gWFJlYWREaXNwbGF5KGRweSwgRGVmYXVsdFJvb3RXaW5kb3coZHB5KSwKKwkJCQkgICAwLCAwLCA4LCA4LCBoaW50cywgJmhpbnRzX3JldCk7CisgIGlmICh0ZXN0SW1hZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRmlsbCBpbiBhIHRlbXBsYXRlIGZvciBtYXRjaGluZyB2aXN1YWxzLgorICBYVmlzdWFsSW5mbyB0bXBsOworICB0bXBsLmNfY2xhc3MgPSBUcnVlQ29sb3I7CisgIHRtcGwuZGVwdGggPSAyNDsKKyAgdG1wbC5yZWRfbWFzayA9IHRlc3RJbWFnZS0+cmVkX21hc2s7CisgIHRtcGwuZ3JlZW5fbWFzayA9IHRlc3RJbWFnZS0+Z3JlZW5fbWFzazsKKyAgdG1wbC5ibHVlX21hc2sgPSB0ZXN0SW1hZ2UtPmJsdWVfbWFzazsKKworICAvLyBMaXN0IGZpZWxkcyBpbiB0ZW1wbGF0ZSB0aGF0IG1ha2Ugc2Vuc2UuCisgIGxvbmcgbWFzayA9IChWaXN1YWxDbGFzc01hc2sgfAorCSAgICAgICBWaXN1YWxSZWRNYXNrTWFzayB8CisJICAgICAgIFZpc3VhbEdyZWVuTWFza01hc2sgfAorCSAgICAgICBWaXN1YWxCbHVlTWFza01hc2spOworCisgIC8vIFdlIGRvbid0IG5lZWQgdGhhdCBpbWFnZSBhbnkgbW9yZS4KKyAgWERlc3Ryb3lJbWFnZSh0ZXN0SW1hZ2UpOworCisgIC8vIE5vdywgZ2V0IGEgbGlzdCBvZiBtYXRjaGluZyB2aXN1YWxzIGF2YWlsYWJsZS4KKyAgaW50IG5WaXN1YWxzOworICBYVmlzdWFsSW5mbyAqdmluZm8gPSBYR2V0VmlzdWFsSW5mbyhkcHksIG1hc2ssICZ0bXBsLCAmblZpc3VhbHMpOworICBpZiAodmluZm8gPT0gTlVMTCB8fCBuVmlzdWFscyA8PSAwKSB7CisgICAgaWYgKHZpbmZvICE9IE5VTEwpIHsKKyAgICAgIFhGcmVlKHZpbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVXNlIGZpcnN0IHZpc3VhbCBmcm9tIHRoZSBsaXN0LgorICAqdmluZm9fcmV0ID0gdmluZm9bMF07CisKKyAgWEZyZWUodmluZm8pOworCisgIHJldHVybiB0cnVlOworfQorCitJcml4T3ZlcmxheVNobUltYWdlOjp+SXJpeE92ZXJsYXlTaG1JbWFnZSgpCit7CisgIGlmIChyZWFkRGlzcGxheUJ1ZiAhPSBOVUxMKQorICAgIFhTaG1EZXN0cm95UmVhZERpc3BsYXlCdWYocmVhZERpc3BsYXlCdWYpOworfQorCit2b2lkIElyaXhPdmVybGF5U2htSW1hZ2U6OmdldChXaW5kb3cgd25kLCBpbnQgeCwgaW50IHkpCit7CisgIGdldCh3bmQsIHgsIHksIHhpbS0+d2lkdGgsIHhpbS0+aGVpZ2h0KTsKK30KKwordm9pZCBJcml4T3ZlcmxheVNobUltYWdlOjpnZXQoV2luZG93IHduZCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgIFhSZWN0YW5nbGUgcmVjdDsKKyAgdW5zaWduZWQgbG9uZyBoaW50cyA9IFhSRF9UUkFOU1BBUkVOVCB8IFhSRF9SRUFEX1BPSU5URVI7CisKKyAgcmVjdC54ID0geDsKKyAgcmVjdC55ID0geTsKKyAgcmVjdC53aWR0aCA9IHc7CisgIHJlY3QuaGVpZ2h0ID0gaDsKKworICBYU2htUmVhZERpc3BsYXlSZWN0cyhkcHksIHduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIDEsIHJlYWREaXNwbGF5QnVmLCAteCwgLXksCisgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLCAmaGludHMpOworfQorCisjZW5kaWYgLy8gSEFWRV9SRUFERElTUExBWQorI2VuZGlmIC8vIEhBVkVfTUlUU0hNCisKKyNpZmRlZiBIQVZFX1NVTl9PVkwKKworLy8KKy8vIFNvbGFyaXNPdmVybGF5SW1hZ2UgY2xhc3MgaW1wbGVtZW50YXRpb24KKy8vCisKK1NvbGFyaXNPdmVybGF5SW1hZ2U6OlNvbGFyaXNPdmVybGF5SW1hZ2UoRGlzcGxheSAqZCkKKyAgOiBJbWFnZShkKQoreworfQorCitTb2xhcmlzT3ZlcmxheUltYWdlOjpTb2xhcmlzT3ZlcmxheUltYWdlKERpc3BsYXkgKmQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgOiBJbWFnZShkKQoreworICBJbml0KHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIFNvbGFyaXNPdmVybGF5SW1hZ2U6OkluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAvLyBGSVhNRTogQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUgYXQgcnVuIHRpbWUuCisgIC8vIEZJWE1FOiBNYXliZSBqdXN0IHJlYWQgYSBzbWFsbCAoZS5nLiA4eDgpIHNjcmVlbiBhcmVhIHRoZW4KKyAgLy8gICAgICAgIHJlYWxsb2NhdGUgeGltLT5kYXRhW10gYW5kIGNvcnJlY3Qgd2lkdGggYW5kIGhlaWdodD8KKyAgeGltID0gWFJlYWRTY3JlZW4oZHB5LCBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBUcnVlKTsKKyAgaWYgKHhpbSA9PSBOVUxMKSB7CisgICAgdmxvZy5lcnJvcigiWFJlYWRTY3JlZW4oKSBmYWlsZWQiKTsKKyAgICByZXR1cm47CisgIH0KK30KKworU29sYXJpc092ZXJsYXlJbWFnZTo6flNvbGFyaXNPdmVybGF5SW1hZ2UoKQoreworfQorCit2b2lkIFNvbGFyaXNPdmVybGF5SW1hZ2U6OmdldChXaW5kb3cgd25kLCBpbnQgeCwgaW50IHkpCit7CisgIGdldCh3bmQsIHgsIHksIHhpbS0+d2lkdGgsIHhpbS0+aGVpZ2h0KTsKK30KKwordm9pZCBTb2xhcmlzT3ZlcmxheUltYWdlOjpnZXQoV2luZG93IHduZCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgIFhJbWFnZSAqdG1wX3hpbSA9IFhSZWFkU2NyZWVuKGRweSwgd25kLCB4LCB5LCB3LCBoLCBUcnVlKTsKKyAgaWYgKHRtcF94aW0gPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgdXBkYXRlUmVjdCh0bXBfeGltLCAwLCAwKTsKKworICBYRGVzdHJveUltYWdlKHRtcF94aW0pOworfQorCisjZW5kaWYgLy8gSEFWRV9TVU5fT1ZMCisKKy8vCisvLyBJbWFnZUZhY3RvcnkgY2xhc3MgaW1wbGVtZW50YXRpb24KKy8vCisvLyBGSVhNRTogTWFrZSBJbWFnZUZhY3RvcnkgYWx3YXlzIGNyZWF0ZSBpbWFnZXMgb2YgdGhlIHNhbWUgY2xhc3M/CisvLworCisvLyBQcmVwYXJlIHVzZWZ1bCBzaG9ydGN1dHMgZm9yIGNvbXBpbGUtdGltZSBvcHRpb25zLgorI2lmIGRlZmluZWQoSEFWRV9SRUFERElTUExBWSkgJiYgZGVmaW5lZChIQVZFX01JVFNITSkKKyNkZWZpbmUgSEFWRV9TSE1fUkVBRERJU1BMQVkKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TSE1fUkVBRERJU1BMQVkpIHx8IGRlZmluZWQoSEFWRV9TVU5fT1ZMKQorI2RlZmluZSBIQVZFX09WRVJMQVlfRVhUCisjZW5kaWYKKworSW1hZ2VGYWN0b3J5OjpJbWFnZUZhY3RvcnkoYm9vbCBhbGxvd1NobSwgYm9vbCBhbGxvd092ZXJsYXkpCisgIDogbWF5VXNlU2htKGFsbG93U2htKSwgbWF5VXNlT3ZlcmxheShhbGxvd092ZXJsYXkpCit7Cit9CisKK0ltYWdlRmFjdG9yeTo6fkltYWdlRmFjdG9yeSgpCit7Cit9CisKK0ltYWdlICpJbWFnZUZhY3Rvcnk6Om5ld0ltYWdlKERpc3BsYXkgKmQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgSW1hZ2UgKmltYWdlID0gTlVMTDsKKworICAvLyBGaXJzdCwgdHJ5IHRvIGNyZWF0ZSBhbiBpbWFnZSB3aXRoIG92ZXJsYXkgc3VwcG9ydC4KKworI2lmZGVmIEhBVkVfT1ZFUkxBWV9FWFQKKyAgaWYgKG1heVVzZU92ZXJsYXkpIHsKKyNpZiBkZWZpbmVkKEhBVkVfU0hNX1JFQURESVNQTEFZKQorICAgIGlmIChtYXlVc2VTaG0pIHsKKyAgICAgIGltYWdlID0gbmV3IElyaXhPdmVybGF5U2htSW1hZ2UoZCwgd2lkdGgsIGhlaWdodCk7CisgICAgICBpZiAoaW1hZ2UtPnhpbSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICAgIH0KKyAgICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfU1VOX09WTCkKKyAgICBpbWFnZSA9IG5ldyBTb2xhcmlzT3ZlcmxheUltYWdlKGQsIHdpZHRoLCBoZWlnaHQpOworICAgIGlmIChpbWFnZS0+eGltICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBpbWFnZTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoaW1hZ2UgIT0gTlVMTCkgeworICAgICAgZGVsZXRlIGltYWdlOworICAgICAgdmxvZy5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBvdmVybGF5IGltYWdlLCB0cnlpbmcgb3RoZXIgb3B0aW9ucyIpOworICAgIH0KKyAgfQorI2VuZGlmIC8vIEhBVkVfT1ZFUkxBWV9FWFQKKworICAvLyBOb3csIHRyeSB0byB1c2Ugc2hhcmVkIG1lbW9yeSBpbWFnZS4KKworI2lmZGVmIEhBVkVfTUlUU0hNCisgIGlmIChtYXlVc2VTaG0pIHsKKyAgICBpbWFnZSA9IG5ldyBTaG1JbWFnZShkLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAoaW1hZ2UtPnhpbSAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gaW1hZ2U7CisgICAgfQorCisgICAgZGVsZXRlIGltYWdlOworICAgIHZsb2cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgU0hNIGltYWdlLCBmYWxsaW5nIGJhY2sgdG8gWGxpYiBpbWFnZSIpOworICB9CisjZW5kaWYgLy8gSEFWRV9NSVRTSE0KKworICAvLyBGYWxsIGJhY2sgdG8gWGxpYiBpbWFnZS4KKworICBpbWFnZSA9IG5ldyBJbWFnZShkLCB3aWR0aCwgaGVpZ2h0KTsKKyAgcmV0dXJuIGltYWdlOworfQpkaWZmIC0tZ2l0IGEvdW5peC94MHZuY3NlcnZlci9JbWFnZS5oIGIvdW5peC94MHZuY3NlcnZlci9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNWNlZTYKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3gwdm5jc2VydmVyL0ltYWdlLmgKQEAgLTAsMCArMSwyMjMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBJbWFnZS5oCisvLworCisjaWZuZGVmIF9fSU1BR0VfSF9fCisjZGVmaW5lIF9fSU1BR0VfSF9fCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCisvLworLy8gSW1hZ2UgY2xhc3MgaXMgYW4gWGxpYi1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBzY3JlZW4gaW1hZ2Ugc3RvcmFnZS4KKy8vCisKK2NsYXNzIEltYWdlIHsKKworcHVibGljOgorCisgIEltYWdlKERpc3BsYXkgKmQpOworICBJbWFnZShEaXNwbGF5ICpkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2aXJ0dWFsIH5JbWFnZSgpOworCisgIGJvb2wgaXNUcnVlQ29sb3IoKSBjb25zdCB7IHJldHVybiB0cnVlQ29sb3I7IH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIkltYWdlIjsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzRGVzYygpIGNvbnN0IHsKKyAgICByZXR1cm4gImJhc2ljIFhsaWIgaW1hZ2UiOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdldChXaW5kb3cgd25kLCBpbnQgeCA9IDAsIGludCB5ID0gMCk7CisgIHZpcnR1YWwgdm9pZCBnZXQoV2luZG93IHduZCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOworCisvLyBDb3B5aW5nIHBpeGVscyBmcm9tIG9uZSBpbWFnZSB0byBhbm90aGVyLgorICB2aXJ0dWFsIHZvaWQgdXBkYXRlUmVjdChYSW1hZ2UgKnNyYywgaW50IGRzdF94ID0gMCwgaW50IGRzdF95ID0gMCk7CisgIHZpcnR1YWwgdm9pZCB1cGRhdGVSZWN0KEltYWdlICpzcmMsIGludCBkc3RfeCA9IDAsIGludCBkc3RfeSA9IDApOworICB2aXJ0dWFsIHZvaWQgdXBkYXRlUmVjdChYSW1hZ2UgKnNyYywgaW50IGRzdF94LCBpbnQgZHN0X3ksIGludCB3LCBpbnQgaCk7CisgIHZpcnR1YWwgdm9pZCB1cGRhdGVSZWN0KEltYWdlICpzcmMsIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgdywgaW50IGgpOworICB2aXJ0dWFsIHZvaWQgdXBkYXRlUmVjdChYSW1hZ2UgKnNyYywgaW50IGRzdF94LCBpbnQgZHN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfeCwgaW50IHNyY195LCBpbnQgdywgaW50IGgpOworICB2aXJ0dWFsIHZvaWQgdXBkYXRlUmVjdChJbWFnZSAqc3JjLCBpbnQgZHN0X3gsIGludCBkc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY194LCBpbnQgc3JjX3ksIGludCB3LCBpbnQgaCk7CisKKyAgLy8gUG9pbnRlciB0byBjb3JyZXNwb25kaW5nIFhJbWFnZSwgbWFkZSBwdWJsaWMgZm9yIGVmZmljaWVuY3kuCisgIC8vIE5PVEU6IGlmIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlbiBubyBtZXRob2RzIG90aGVyIHRoYW4gSW5pdCgpCisgIC8vICAgICAgIG1heSBiZSBjYWxsZWQuCisgIFhJbWFnZSogeGltOworCitwcm90ZWN0ZWQ6CisKKyAgdm9pZCBJbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgLy8gTGlrZSB1cGRhdGVSZWN0KCksIGJ1dCBkb2VzIG5vdCBjaGVjayBhcmd1bWVudHMuCisgIHZvaWQgY29weVBpeGVscyhYSW1hZ2UgKnNyYywKKyAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LAorICAgICAgICAgICAgICAgICAgaW50IHNyY194LCBpbnQgc3JjX3ksCisgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOworCisgIERpc3BsYXkgKmRweTsKKyAgYm9vbCB0cnVlQ29sb3I7CisKK307CisKKy8vCisvLyBTaG1JbWFnZSB1c2VzIE1JVC1TSE0gZXh0ZW5zaW9uIG9mIGFuIFggc2VydmVyIHRvIGdldCBpbWFnZSBkYXRhLgorLy8KKworI2lmZGVmIEhBVkVfTUlUU0hNCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+CisKK2NsYXNzIFNobUltYWdlIDogcHVibGljIEltYWdlIHsKKworcHVibGljOgorCisgIFNobUltYWdlKERpc3BsYXkgKmQpOworICBTaG1JbWFnZShEaXNwbGF5ICpkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2aXJ0dWFsIH5TaG1JbWFnZSgpOworCisgIHZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiU2htSW1hZ2UiOworICB9CisgIHZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NEZXNjKCkgY29uc3QgeworICAgIHJldHVybiAic2hhcmVkIG1lbW9yeSBpbWFnZSI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2V0KFdpbmRvdyB3bmQsIGludCB4ID0gMCwgaW50IHkgPSAwKTsKKyAgdmlydHVhbCB2b2lkIGdldChXaW5kb3cgd25kLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7CisKK3Byb3RlY3RlZDoKKworICB2b2lkIEluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBYVmlzdWFsSW5mbyAqdmluZm8gPSBOVUxMKTsKKworICBYU2htU2VnbWVudEluZm8gKnNobWluZm87CisKK307CisKKy8vCisvLyBJcml4T3ZlcmxheVNobUltYWdlIHVzZXMgUmVhZERpc3BsYXkgZXh0ZW5zaW9uIG9mIGFuIFggc2VydmVyIHRvCisvLyBnZXQgdHJ1ZWNvbG9yIGltYWdlIGRhdGEsIHJlZ2FyZGxlc3Mgb2YgdGhlIGRlZmF1bHQgWCB2aXN1YWwgdHlwZS4gCisvLyBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgb24gSXJpeCBvbmx5LgorLy8KKworI2lmZGVmIEhBVkVfUkVBRERJU1BMQVkKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3JlYWRkaXNwbGF5Lmg+CisKK2NsYXNzIElyaXhPdmVybGF5U2htSW1hZ2UgOiBwdWJsaWMgU2htSW1hZ2UgeworCitwdWJsaWM6CisKKyAgSXJpeE92ZXJsYXlTaG1JbWFnZShEaXNwbGF5ICpkKTsKKyAgSXJpeE92ZXJsYXlTaG1JbWFnZShEaXNwbGF5ICpkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2aXJ0dWFsIH5Jcml4T3ZlcmxheVNobUltYWdlKCk7CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJJcml4T3ZlcmxheVNobUltYWdlIjsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzRGVzYygpIGNvbnN0IHsKKyAgICByZXR1cm4gIklSSVgtc3BlY2lmaWMgU0hNLWF3YXJlIG92ZXJsYXkgaW1hZ2UiOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdldChXaW5kb3cgd25kLCBpbnQgeCA9IDAsIGludCB5ID0gMCk7CisgIHZpcnR1YWwgdm9pZCBnZXQoV2luZG93IHduZCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOworCitwcm90ZWN0ZWQ6CisKKyAgdm9pZCBJbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgLy8gVGhpcyBtZXRob2Qgc2VhcmNoZXMgYXZhaWxhYmxlIFggdmlzdWFscyBmb3Igb25lIHRoYXQgbWF0Y2hlcworICAvLyBhY3R1YWwgcGl4ZWwgZm9ybWF0IHJldHVybmVkIGJ5IFhSZWFkRGlzcGxheSgpLiBSZXR1cm5zIHRydWUgb24KKyAgLy8gc3VjY2VzcywgZmFsc2UgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgdmlzdWFsLiBPbiBzdWNjZXNzLCB2aXN1YWwKKyAgLy8gaW5mb3JtYXRpb24gaXMgcGxhY2VkIGludG8gdGhlIHN0cnVjdHVyZSBwb2ludGVkIGJ5IHZpbmZvX3JldC4KKyAgYm9vbCBnZXRPdmVybGF5VmlzdWFsSW5mbyhYVmlzdWFsSW5mbyAqdmluZm9fcmV0KTsKKworICBTaG1SZWFkRGlzcGxheUJ1ZiAqcmVhZERpc3BsYXlCdWY7CisKK307CisKKyNlbmRpZiAvLyBIQVZFX1JFQURESVNQTEFZCisjZW5kaWYgLy8gSEFWRV9NSVRTSE0KKworLy8KKy8vIFNvbGFyaXNPdmVybGF5SW1hZ2UgdXNlcyBTVU5fT1ZMIGV4dGVuc2lvbiBvZiBhbiBYIHNlcnZlciB0byBnZXQKKy8vIHRydWVjb2xvciBpbWFnZSBkYXRhLCByZWdhcmRsZXNzIG9mIHRoZSBkZWZhdWx0IFggdmlzdWFsIHR5cGUuIFRoaXMKKy8vIG1ldGhvZCBpcyBhdmFpbGFibGUgb24gU29sYXJpcyBvbmx5LgorLy8KKworI2lmZGVmIEhBVkVfU1VOX09WTAorCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvdHJhbnNvdmwuaD4KKworY2xhc3MgU29sYXJpc092ZXJsYXlJbWFnZSA6IHB1YmxpYyBJbWFnZSB7CisKK3B1YmxpYzoKKworICBTb2xhcmlzT3ZlcmxheUltYWdlKERpc3BsYXkgKmQpOworICBTb2xhcmlzT3ZlcmxheUltYWdlKERpc3BsYXkgKmQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgIHZpcnR1YWwgflNvbGFyaXNPdmVybGF5SW1hZ2UoKTsKKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIlNvbGFyaXNPdmVybGF5SW1hZ2UiOworICB9CisgIHZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NEZXNjKCkgY29uc3QgeworICAgIHJldHVybiAiU29sYXJpcy1zcGVjaWZpYyBub24tU0hNIG92ZXJsYXkgaW1hZ2UiOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdldChXaW5kb3cgd25kLCBpbnQgeCA9IDAsIGludCB5ID0gMCk7CisgIHZpcnR1YWwgdm9pZCBnZXQoV2luZG93IHduZCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOworCitwcm90ZWN0ZWQ6CisKKyAgdm9pZCBJbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKK307CisKKyNlbmRpZiAvLyBIQVZFX1NVTl9PVkwKKworLy8KKy8vIEltYWdlRmFjdG9yeSBjbGFzcyBpcyB1c2VkIHRvIHByb2R1Y2UgaW5zdGFuY2VzIG9mIEltYWdlLWRlcml2ZWQKKy8vIG9iamVjdHMgdGhhdCBhcmUgbW9zdCBhcHByb3ByaWF0ZSBmb3IgY3VycmVudCBYIHNlcnZlciBhbmQgdXNlcgorLy8gc2V0dGluZ3MuCisvLworCitjbGFzcyBJbWFnZUZhY3RvcnkgeworCitwdWJsaWM6CisKKyAgSW1hZ2VGYWN0b3J5KGJvb2wgYWxsb3dTaG0sIGJvb2wgYWxsb3dPdmVybGF5KTsKKyAgdmlydHVhbCB+SW1hZ2VGYWN0b3J5KCk7CisKKyAgYm9vbCBpc1NobUFsbG93ZWQoKSAgICAgeyByZXR1cm4gbWF5VXNlU2htOyB9CisgIGJvb2wgaXNPdmVybGF5QWxsb3dlZCgpIHsgcmV0dXJuIG1heVVzZU92ZXJsYXk7IH0KKworICB2aXJ0dWFsIEltYWdlICpuZXdJbWFnZShEaXNwbGF5ICpkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCitwcm90ZWN0ZWQ6CisKKyAgYm9vbCBtYXlVc2VTaG07CisgIGJvb2wgbWF5VXNlT3ZlcmxheTsKKworfTsKKworI2VuZGlmIC8vIF9fSU1BR0VfSF9fCmRpZmYgLS1naXQgYS91bml4L3gwdm5jc2VydmVyL01ha2VmaWxlLmluIGIvdW5peC94MHZuY3NlcnZlci9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI5ZmVkCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94MHZuY3NlcnZlci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMwIEBACisKK1NSQ1MgPSBJbWFnZS5jeHggVGltZU1pbGxpcy5jeHggUG9sbGluZ1NjaGVkdWxlci5jeHggUG9sbGluZ01hbmFnZXIuY3h4IFwKKyAgICAgICBHZW9tZXRyeS5jeHggXAorICAgICAgIHgwdm5jc2VydmVyLmN4eCAuLi92bmNjb25maWdfdW5peC9RdWVyeUNvbm5lY3REaWFsb2cuY3h4CisKK09CSlMgPSAkKFNSQ1M6LmN4eD0ubykKKworcHJvZ3JhbSA9IHgwdm5jc2VydmVyCisKK0RFUF9MSUJTID0gLi4vcmZiL2xpYnJmYi5hIFwKKyAgICAgICAgICAgLi4vbmV0d29yay9saWJuZXR3b3JrLmEgXAorICAgICAgICAgICAuLi9yZHIvbGlicmRyLmEgXAorCSAgIC4uL3R4L2xpYnR4LmEKKworRVhUUkFfTElCUyA9IEBaTElCX0xJQkAgQEpQRUdfTElCQCBASU5FVF9MSUJAIEBYX1BSRV9MSUJTQCBAWF9MSUJTQCBcCisgICAgICAgICAgICAgQFhURVNUX0xJQkAgLWxYZXh0IC1sWDExIEBYX0VYVFJBX0xJQlNACisKKyMgWF9DRkxBR1MgYXJlIHJlYWxseSBDUFBGTEFHUworRElSX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS90eCAtSSQodG9wX3NyY2Rpcikvdm5jY29uZmlnX3VuaXggXAorICBAWFRFU1RfREVGSU5FQCBAUkVBRERJU1BMQVlfREVGSU5FQCBATUlUU0hNX0RFRklORUAgQFhfQ0ZMQUdTQAorCithbGw6OiAkKHByb2dyYW0pCisKKyQocHJvZ3JhbSk6ICQoT0JKUykgYnVpbGR0aW1lLm8gJChERVBfTElCUykKKwlybSAtZiAkKHByb2dyYW0pCisJJChDWFhMRCkgJChDWFhGTEFHUykgJChMREZMQUdTKSAtbyAkQCAkKE9CSlMpIGJ1aWxkdGltZS5vICQoREVQX0xJQlMpICQoTElCUykgJChFWFRSQV9MSUJTKQorCitidWlsZHRpbWUubzogJChPQkpTKSAkKERFUF9MSUJTKQorCisjIGZvbGxvd2VkIGJ5IGJvaWxlcnBsYXRlLm1rCmRpZmYgLS1naXQgYS91bml4L3gwdm5jc2VydmVyL1BvbGxpbmdNYW5hZ2VyLmN4eCBiL3VuaXgveDB2bmNzZXJ2ZXIvUG9sbGluZ01hbmFnZXIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjNlZDQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3gwdm5jc2VydmVyL1BvbGxpbmdNYW5hZ2VyLmN4eApAQCAtMCwwICsxLDYwMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworLy8KKy8vIFBvbGxpbmdNYW5hZ2VyLmN4eAorLy8KKworLy8gRklYTUU6IERvbid0IGNvbXBhcmUgcGl4ZWxzIGFscmVhZHkgbWFya2VkIGFzIGNoYW5nZWQuCisvLyBGSVhNRTogVXNlIEltYWdlOjpjb3B5UGl4ZWxzKCkgaW5zdGVhZCBvZiBJbWFnZTo6dXBkYXRlUmVjdCgpPworLy8gICAgICAgIEluIHRoYXQgY2FzZSwgbm90ZSB0aGUgZmFjdCB0aGF0IGFyZ3VtZW50cyBhcmUgbm90IGNoZWNrZWQuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvVk5DU2VydmVyLmg+CisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxyZmIvU2VydmVyQ29yZS5oPgorCisjaW5jbHVkZSA8eDB2bmNzZXJ2ZXIvUG9sbGluZ01hbmFnZXIuaD4KKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJQb2xsaW5nTWdyIik7CisKK0Jvb2xQYXJhbWV0ZXIgUG9sbGluZ01hbmFnZXI6OnBvbGxQb2ludGVyCisoIlBvbGxQb2ludGVyIiwKKyAiREVCVUc6IFBvbGwgYXJlYSB1bmRlciB0aGUgcG9pbnRlciB3aXRoIGhpZ2hlciBwcmlvcml0eSIsCisgdHJ1ZSk7CisKK0ludFBhcmFtZXRlciBQb2xsaW5nTWFuYWdlcjo6cG9sbGluZ1R5cGUKKygiUG9sbGluZ1R5cGUiLAorICJERUJVRzogU2VsZWN0IHBhcnRpY3VsYXIgcG9sbGluZyBhbGdvcml0aG0gKDAuLjMpIiwKKyAzKTsKKworY29uc3QgaW50IFBvbGxpbmdNYW5hZ2VyOjptX3BvbGxpbmdPcmRlclszMl0gPSB7CisgICAwLCAxNiwgIDgsIDI0LCAgNCwgMjAsIDEyLCAyOCwKKyAgMTAsIDI2LCAxOCwgIDIsIDIyLCAgNiwgMzAsIDE0LAorICAgMSwgMTcsICA5LCAyNSwgIDcsIDIzLCAxNSwgMzEsCisgIDE5LCAgMywgMjcsIDExLCAyOSwgMTMsICA1LCAyMQorfTsKKworLy8KKy8vIENvbnN0cnVjdG9yLgorLy8KKy8vIE5vdGUgdGhhdCBkcHkgYW5kIGltYWdlIHNob3VsZCByZW1haW4gdmFsaWQgZHVyaW5nIHRoZSBvYmplY3QKKy8vIGxpZmV0aW1lLCB3aGlsZSBmYWN0b3J5IGlzIHVzZWQgb25seSBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmLgorLy8KKworUG9sbGluZ01hbmFnZXI6OlBvbGxpbmdNYW5hZ2VyKERpc3BsYXkgKmRweSwgSW1hZ2UgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlRmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0TGVmdCwgaW50IG9mZnNldFRvcCkKKyAgOiBtX2RweShkcHkpLCBtX3NlcnZlcigwKSwgbV9pbWFnZShpbWFnZSksCisgICAgbV9vZmZzZXRMZWZ0KG9mZnNldExlZnQpLCBtX29mZnNldFRvcChvZmZzZXRUb3ApLAorICAgIG1fcG9pbnRlclBvc0tub3duKGZhbHNlKSwgbV9wb2xsaW5nU3RlcCgwKQoreworICAvLyBTYXZlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbiAoYW5kIHRoZSBpbWFnZSkuCisgIG1fd2lkdGggPSBtX2ltYWdlLT54aW0tPndpZHRoOworICBtX2hlaWdodCA9IG1faW1hZ2UtPnhpbS0+aGVpZ2h0OworCisgIC8vIENvbXB1dGUgd2lkdGggYW5kIGhlaWdodCBpbiAzMngzMiB0aWxlcy4KKyAgbV93aWR0aFRpbGVzID0gKG1fd2lkdGggKyAzMSkgLyAzMjsKKyAgbV9oZWlnaHRUaWxlcyA9IChtX2hlaWdodCArIDMxKSAvIDMyOworCisgIC8vIEdldCBpbml0aWFsIHNjcmVlbiBpbWFnZS4KKyAgbV9pbWFnZS0+Z2V0KERlZmF1bHRSb290V2luZG93KG1fZHB5KSwgbV9vZmZzZXRMZWZ0LCBtX29mZnNldFRvcCk7CisKKyAgLy8gQ3JlYXRlIGFkZGl0aW9uYWwgaW1hZ2VzIHVzZWQgaW4gcG9sbGluZyBhbGdvcml0aG1zLCB3YXJuIGlmCisgIC8vIHVuZGVybHlpbmcgY2xhc3MgbmFtZXMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBjbGFzcyBuYW1lIG9mIHRoZQorICAvLyBwcmltYXJ5IGltYWdlLgorICBtX3Jvd0ltYWdlID0gZmFjdG9yeS0+bmV3SW1hZ2UobV9kcHksIG1fd2lkdGgsIDEpOworICBtX3RpbGVJbWFnZSA9IGZhY3RvcnktPm5ld0ltYWdlKG1fZHB5LCAzMiwgMzIpOworICBtX2FyZWFJbWFnZSA9IGZhY3RvcnktPm5ld0ltYWdlKG1fZHB5LCAxMjgsIDEyOCk7CisgIGlmIChzdHJjbXAobV9pbWFnZS0+Y2xhc3NOYW1lKCksIG1fcm93SW1hZ2UtPmNsYXNzTmFtZSgpKSAhPSAwIHx8CisgICAgICBzdHJjbXAobV9pbWFnZS0+Y2xhc3NOYW1lKCksIG1fdGlsZUltYWdlLT5jbGFzc05hbWUoKSkgIT0gMCB8fAorICAgICAgc3RyY21wKG1faW1hZ2UtPmNsYXNzTmFtZSgpLCBtX2FyZWFJbWFnZS0+Y2xhc3NOYW1lKCkpICE9IDApIHsKKyAgICB2bG9nLmVycm9yKCJJbWFnZSB0eXBlcyBkbyBub3QgbWF0Y2ggKCVzLCAlcywgJXMpIiwKKyAgICAgICAgICAgICAgIG1fcm93SW1hZ2UtPmNsYXNzTmFtZSgpLAorICAgICAgICAgICAgICAgbV90aWxlSW1hZ2UtPmNsYXNzTmFtZSgpLAorICAgICAgICAgICAgICAgbV9hcmVhSW1hZ2UtPmNsYXNzTmFtZSgpKTsKKyAgfQorCisgIC8vIEZJWE1FOiBFeHRlbmQgdGhlIGNvbW1lbnQuCisgIC8vIENyZWF0ZSBhIG1hdHJpeCB3aXRoIG9uZSBieXRlIHBlciBlYWNoIDMyeDMyIHRpbGUuIEl0IHdpbGwgYmUKKyAgLy8gdXNlZCB0byBsaW1pdCB0aGUgcmF0ZSBvZiB1cGRhdGVzIG9uIGNvbnRpbnVvdXNseS1jaGFuZ2VkIHNjcmVlbgorICAvLyBhcmVhcyAobGlrZSB2aWRlbykuCisgIGludCBudW1UaWxlcyA9IG1fd2lkdGhUaWxlcyAqIG1faGVpZ2h0VGlsZXM7CisgIG1fc3RhdHVzTWF0cml4ID0gbmV3IGNoYXJbbnVtVGlsZXNdOworICBtZW1zZXQobV9zdGF0dXNNYXRyaXgsIDAsIG51bVRpbGVzKTsKKworICAvLyBGSVhNRTogRXh0ZW5kIHRoZSBjb21tZW50LgorICAvLyBDcmVhdGUgYSBtYXRyaXggd2l0aCBvbmUgYnl0ZSBwZXIgZWFjaCAzMngzMiB0aWxlLiBJdCB3aWxsIGJlCisgIC8vIHVzZWQgdG8gbGltaXQgdGhlIHJhdGUgb2YgdXBkYXRlcyBvbiBjb250aW51b3VzbHktY2hhbmdlZCBzY3JlZW4KKyAgLy8gYXJlYXMgKGxpa2UgdmlkZW8pLgorICBtX3JhdGVNYXRyaXggPSBuZXcgY2hhcltudW1UaWxlc107CisgIG1fdmlkZW9GbGFncyA9IG5ldyBjaGFyW251bVRpbGVzXTsKKyAgbV9jaGFuZ2VkRmxhZ3MgPSBuZXcgY2hhcltudW1UaWxlc107CisgIG1lbXNldChtX3JhdGVNYXRyaXgsIDAsIG51bVRpbGVzKTsKKyAgbWVtc2V0KG1fdmlkZW9GbGFncywgMCwgbnVtVGlsZXMpOworICBtZW1zZXQobV9jaGFuZ2VkRmxhZ3MsIDAsIG51bVRpbGVzKTsKK30KKworUG9sbGluZ01hbmFnZXI6On5Qb2xsaW5nTWFuYWdlcigpCit7CisgIGRlbGV0ZVtdIG1fY2hhbmdlZEZsYWdzOworICBkZWxldGVbXSBtX3ZpZGVvRmxhZ3M7CisgIGRlbGV0ZVtdIG1fcmF0ZU1hdHJpeDsKKworICBkZWxldGVbXSBtX3N0YXR1c01hdHJpeDsKKworICBkZWxldGUgbV9hcmVhSW1hZ2U7CisgIGRlbGV0ZSBtX3RpbGVJbWFnZTsKKyAgZGVsZXRlIG1fcm93SW1hZ2U7Cit9CisKKy8vCisvLyBSZWdpc3RlciBWTkNTZXJ2ZXIgb2JqZWN0LgorLy8KKwordm9pZCBQb2xsaW5nTWFuYWdlcjo6c2V0Vk5DU2VydmVyKFZOQ1NlcnZlciAqcykKK3sKKyAgbV9zZXJ2ZXIgPSBzOworfQorCisvLworLy8gVXBkYXRlIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvbiB3aGljaCBtYXkgYmUgdXNlZCBhcyBhIGhpbnQgZm9yCisvLyBwb2xsaW5nIGFsZ29yaXRobXMuCisvLworCit2b2lkIFBvbGxpbmdNYW5hZ2VyOjpzZXRQb2ludGVyUG9zKGNvbnN0IFBvaW50ICZwb3MpCit7CisgIG1fcG9pbnRlclBvc1RpbWUgPSB0aW1lKE5VTEwpOworICBtX3BvaW50ZXJQb3MgPSBwb3M7CisgIG1fcG9pbnRlclBvc0tub3duID0gdHJ1ZTsKK30KKworLy8KKy8vIEluZGljYXRlIHRoYXQgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uIGlzIHVua25vd24uCisvLworCit2b2lkIFBvbGxpbmdNYW5hZ2VyOjp1bnNldFBvaW50ZXJQb3MoKQoreworICBtX3BvaW50ZXJQb3NLbm93biA9IGZhbHNlOworfQorCisvLworLy8gREVCVUc6IE1lYXN1cmluZyB0aW1lIHNwZW50IGluIHRoZSBwb2xsKCkgZnVuY3Rpb24sCisvLyAgICAgICAgYXMgd2VsbCBhcyB0aW1lIGludGVydmFscyBiZXR3ZWVuIHBvbGwoKSBjYWxscy4KKy8vCisKKyNpZmRlZiBERUJVRwordm9pZCBQb2xsaW5nTWFuYWdlcjo6ZGVidWdCZWZvcmVQb2xsKCkKK3sKKyAgVGltZU1pbGxpcyB0aW1lTm93OworICBpbnQgZGlmZiA9IHRpbWVOb3cuZGlmZkZyb20obV90aW1lU2F2ZWQpOworICBmcHJpbnRmKHN0ZGVyciwgIlt3YWl0JTRkbXNdXHRbc3RlcCAlMmRdXHQiLCBkaWZmLCBtX3BvbGxpbmdTdGVwICUgMzIpOworICBtX3RpbWVTYXZlZCA9IHRpbWVOb3c7Cit9CisKK3ZvaWQgUG9sbGluZ01hbmFnZXI6OmRlYnVnQWZ0ZXJQb2xsKCkKK3sKKyAgVGltZU1pbGxpcyB0aW1lTm93OworICBpbnQgZGlmZiA9IHRpbWVOb3cuZGlmZkZyb20obV90aW1lU2F2ZWQpOworICBmcHJpbnRmKHN0ZGVyciwgIltwb2xsJTRkbXNdXG4iLCBkaWZmKTsKKyAgbV90aW1lU2F2ZWQgPSB0aW1lTm93OworfQorCisjZW5kaWYKKworLy8KKy8vIFNlYXJjaCBmb3IgY2hhbmdlZCByZWN0YW5nbGVzIG9uIHRoZSBzY3JlZW4uCisvLworCit2b2lkIFBvbGxpbmdNYW5hZ2VyOjpwb2xsKCkKK3sKKyNpZmRlZiBERUJVRworICBkZWJ1Z0JlZm9yZVBvbGwoKTsKKyNlbmRpZgorCisgIC8vIEZpcnN0IHN0ZXA6IGZ1bGwtc2NyZWVuIHBvbGxpbmcuCisKKyAgYm9vbCBjaGFuZ2VzMSA9IGZhbHNlOworCisgIHN3aXRjaCgoaW50KXBvbGxpbmdUeXBlKSB7CisgIGNhc2UgMDoKKyAgICBjaGFuZ2VzMSA9IHBvbGxfRHVtYigpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgY2hhbmdlczEgPSBwb2xsX1RyYWRpdGlvbmFsKCk7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBjaGFuZ2VzMSA9IHBvbGxfU2tpcEN5Y2xlcygpOworICAgIGJyZWFrOworLy9jYXNlIDM6CisgIGRlZmF1bHQ6CisgICAgY2hhbmdlczEgPSBwb2xsX0RldGVjdFZpZGVvKCk7CisgICAgYnJlYWs7CisgIH0KKworICAvLyBTZWNvbmQgc3RlcDogb3B0aW9uYWwgdGhvcm91Z2ggcG9sbGluZyBvZiB0aGUgYXJlYSBhcm91bmQgdGhlIHBvaW50ZXIuCisgIC8vIFdlIGRvIHRoYXQgb25seSBpZiB0aGUgcG9pbnRlciBwb3NpdGlvbiBpcyBrbm93biBhbmQgd2FzIHNldCByZWNlbnRseS4KKworICBib29sIGNoYW5nZXMyID0gZmFsc2U7CisgIGlmIChwb2xsUG9pbnRlcikgeworICAgIGlmIChtX3BvaW50ZXJQb3NLbm93biAmJiB0aW1lKE5VTEwpIC0gbV9wb2ludGVyUG9zVGltZSA+PSA1KSB7CisgICAgICB1bnNldFBvaW50ZXJQb3MoKTsKKyAgICB9CisgICAgaWYgKG1fcG9pbnRlclBvc0tub3duKSB7CisgICAgICBjaGFuZ2VzMiA9IHBvbGxQb2ludGVyQXJlYSgpOworICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZSBpZiBuZWVkZWQuCisKKyAgaWYgKGNoYW5nZXMxIHx8IGNoYW5nZXMyKQorICAgIG1fc2VydmVyLT50cnlVcGRhdGUoKTsKKworI2lmZGVmIERFQlVHCisgIGRlYnVnQWZ0ZXJQb2xsKCk7CisjZW5kaWYKK30KKworYm9vbCBQb2xsaW5nTWFuYWdlcjo6cG9sbF9EZXRlY3RWaWRlbygpCit7CisgIGlmICghbV9zZXJ2ZXIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IGludCBHUkFORF9TVEVQX0RJVklTT1IgPSA4OworICBjb25zdCBpbnQgVklERU9fVEhSRVNIT0xEXzAgPSAzOworICBjb25zdCBpbnQgVklERU9fVEhSRVNIT0xEXzEgPSA1OworCisgIGJvb2wgZ3JhbmRTdGVwID0gKG1fcG9sbGluZ1N0ZXAgJSBHUkFORF9TVEVQX0RJVklTT1IgPT0gMCk7CisKKyAgLy8gRklYTUU6IFNhdmUgc2hvcnRjdXRzIGluIG1lbWJlciB2YXJpYWJsZXM/CisgIGludCBzY2FuTGluZSA9IG1fcG9sbGluZ09yZGVyW21fcG9sbGluZ1N0ZXArKyAlIDMyXTsKKyAgaW50IGJ5dGVzUGVyUGl4ZWwgPSBtX2ltYWdlLT54aW0tPmJpdHNfcGVyX3BpeGVsIC8gODsKKyAgaW50IGJ5dGVzUGVyTGluZSA9IG1faW1hZ2UtPnhpbS0+Ynl0ZXNfcGVyX2xpbmU7CisKKyAgUmVjdCByZWN0OworICBpbnQgblRpbGVzQ2hhbmdlZCA9IDA7CisgIGludCBpZHggPSAwOworCisgIGZvciAoaW50IHkgPSAwOyB5ICogMzIgPCBtX2hlaWdodDsgeSsrKSB7CisgICAgaW50IHRpbGVfaCA9IChtX2hlaWdodCAtIHkgKiAzMiA+PSAzMikgPyAzMiA6IG1faGVpZ2h0IC0geSAqIDMyOworICAgIGlmIChzY2FuTGluZSA+PSB0aWxlX2gpCisgICAgICBicmVhazsKKyAgICBpbnQgc2Nhbl95ID0geSAqIDMyICsgc2NhbkxpbmU7CisgICAgZ2V0Um93KHNjYW5feSk7CisgICAgY2hhciAqcHRyX29sZCA9IG1faW1hZ2UtPnhpbS0+ZGF0YSArIHNjYW5feSAqIGJ5dGVzUGVyTGluZTsKKyAgICBjaGFyICpwdHJfbmV3ID0gbV9yb3dJbWFnZS0+eGltLT5kYXRhOworICAgIGZvciAoaW50IHggPSAwOyB4ICogMzIgPCBtX3dpZHRoOyB4KyspIHsKKyAgICAgIGludCB0aWxlX3cgPSAobV93aWR0aCAtIHggKiAzMiA+PSAzMikgPyAzMiA6IG1fd2lkdGggLSB4ICogMzI7CisgICAgICBpbnQgbkJ5dGVzID0gdGlsZV93ICogYnl0ZXNQZXJQaXhlbDsKKworICAgICAgY2hhciB3YXNDaGFuZ2VkID0gKG1lbWNtcChwdHJfb2xkLCBwdHJfbmV3LCBuQnl0ZXMpICE9IDApOworICAgICAgbV9yYXRlTWF0cml4W2lkeF0gKz0gd2FzQ2hhbmdlZDsKKworICAgICAgaWYgKGdyYW5kU3RlcCkgeworICAgICAgICBpZiAobV9yYXRlTWF0cml4W2lkeF0gPD0gVklERU9fVEhSRVNIT0xEXzApIHsKKyAgICAgICAgICBtX3ZpZGVvRmxhZ3NbaWR4XSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAobV9yYXRlTWF0cml4W2lkeF0gPj0gVklERU9fVEhSRVNIT0xEXzEpIHsKKyAgICAgICAgICBtX3ZpZGVvRmxhZ3NbaWR4XSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgbV9yYXRlTWF0cml4W2lkeF0gPSAwOworICAgICAgfQorCisgICAgICBtX2NoYW5nZWRGbGFnc1tpZHhdIHw9IHdhc0NoYW5nZWQ7CisgICAgICBpZiAoIG1fY2hhbmdlZEZsYWdzW2lkeF0gJiYgKCFtX3ZpZGVvRmxhZ3NbaWR4XSB8fCBncmFuZFN0ZXApICkgeworICAgICAgICBnZXRUaWxlMzIoeCwgeSwgdGlsZV93LCB0aWxlX2gpOworICAgICAgICBtX2ltYWdlLT51cGRhdGVSZWN0KG1fdGlsZUltYWdlLCB4ICogMzIsIHkgKiAzMik7CisgICAgICAgIHJlY3Quc2V0WFlXSCh4ICogMzIsIHkgKiAzMiwgdGlsZV93LCB0aWxlX2gpOworICAgICAgICBtX3NlcnZlci0+YWRkX2NoYW5nZWQocmVjdCk7CisgICAgICAgIG5UaWxlc0NoYW5nZWQrKzsKKyAgICAgICAgbV9jaGFuZ2VkRmxhZ3NbaWR4XSA9IDA7CisgICAgICB9CisKKyAgICAgIHB0cl9vbGQgKz0gbkJ5dGVzOworICAgICAgcHRyX25ldyArPSBuQnl0ZXM7CisgICAgICBpZHgrKzsKKyAgICB9CisgIH0KKworICBpZiAoZ3JhbmRTdGVwKQorICAgIGFkanVzdFZpZGVvQXJlYSgpOworCisgIHJldHVybiAoblRpbGVzQ2hhbmdlZCAhPSAwKTsKK30KKworYm9vbCBQb2xsaW5nTWFuYWdlcjo6cG9sbF9Ta2lwQ3ljbGVzKCkKK3sKKyAgaWYgKCFtX3NlcnZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZW51bSB7CisgICAgTk9UX0NIQU5HRUQsIENIQU5HRURfT05DRSwgQ0hBTkdFRF9BR0FJTgorICB9OworCisgIGJvb2wgZ3JhbmRTdGVwID0gKG1fcG9sbGluZ1N0ZXAgJSA4ID09IDApOworCisgIGludCBuVGlsZXNDaGFuZ2VkID0gMDsKKyAgaW50IHNjYW5MaW5lID0gbV9wb2xsaW5nT3JkZXJbbV9wb2xsaW5nU3RlcCsrICUgMzJdOworICBpbnQgYnl0ZXNQZXJQaXhlbCA9IG1faW1hZ2UtPnhpbS0+Yml0c19wZXJfcGl4ZWwgLyA4OworICBpbnQgYnl0ZXNQZXJMaW5lID0gbV9pbWFnZS0+eGltLT5ieXRlc19wZXJfbGluZTsKKyAgY2hhciAqcHN0YXR1cyA9IG1fc3RhdHVzTWF0cml4OworICBib29sIHdhc0NoYW5nZWQ7CisgIFJlY3QgcmVjdDsKKworICBmb3IgKGludCB5ID0gMDsgeSAqIDMyIDwgbV9oZWlnaHQ7IHkrKykgeworICAgIGludCB0aWxlX2ggPSAobV9oZWlnaHQgLSB5ICogMzIgPj0gMzIpID8gMzIgOiBtX2hlaWdodCAtIHkgKiAzMjsKKyAgICBpZiAoc2NhbkxpbmUgPj0gdGlsZV9oKQorICAgICAgc2NhbkxpbmUgJT0gdGlsZV9oOworICAgIGludCBzY2FuX3kgPSB5ICogMzIgKyBzY2FuTGluZTsKKyAgICBnZXRSb3coc2Nhbl95KTsKKyAgICBjaGFyICpwdHJfb2xkID0gbV9pbWFnZS0+eGltLT5kYXRhICsgc2Nhbl95ICogYnl0ZXNQZXJMaW5lOworICAgIGNoYXIgKnB0cl9uZXcgPSBtX3Jvd0ltYWdlLT54aW0tPmRhdGE7CisgICAgZm9yIChpbnQgeCA9IDA7IHggKiAzMiA8IG1fd2lkdGg7IHgrKykgeworICAgICAgaW50IHRpbGVfdyA9IChtX3dpZHRoIC0geCAqIDMyID49IDMyKSA/IDMyIDogbV93aWR0aCAtIHggKiAzMjsKKyAgICAgIGludCBuQnl0ZXMgPSB0aWxlX3cgKiBieXRlc1BlclBpeGVsOworCisgICAgICBpZiAoZ3JhbmRTdGVwIHx8ICpwc3RhdHVzICE9IENIQU5HRURfQUdBSU4pIHsKKyAgICAgICAgd2FzQ2hhbmdlZCA9ICgqcHN0YXR1cyA9PSBDSEFOR0VEX0FHQUlOKSA/CisgICAgICAgICAgdHJ1ZSA6IChtZW1jbXAocHRyX29sZCwgcHRyX25ldywgbkJ5dGVzKSAhPSAwKTsKKyAgICAgICAgaWYgKHdhc0NoYW5nZWQpIHsKKyAgICAgICAgICBpZiAoZ3JhbmRTdGVwIHx8ICpwc3RhdHVzID09IE5PVF9DSEFOR0VEKSB7CisgICAgICAgICAgICBnZXRUaWxlMzIoeCwgeSwgdGlsZV93LCB0aWxlX2gpOworICAgICAgICAgICAgbV9pbWFnZS0+dXBkYXRlUmVjdChtX3RpbGVJbWFnZSwgeCAqIDMyLCB5ICogMzIpOworICAgICAgICAgICAgcmVjdC5zZXRYWVdIKHggKiAzMiwgeSAqIDMyLCB0aWxlX3csIHRpbGVfaCk7CisgICAgICAgICAgICBtX3NlcnZlci0+YWRkX2NoYW5nZWQocmVjdCk7CisgICAgICAgICAgICBuVGlsZXNDaGFuZ2VkKys7CisgICAgICAgICAgICAqcHN0YXR1cyA9IENIQU5HRURfT05DRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnBzdGF0dXMgPSBDSEFOR0VEX0FHQUlOOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChncmFuZFN0ZXApIHsKKyAgICAgICAgICAqcHN0YXR1cyA9IE5PVF9DSEFOR0VEOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHB0cl9vbGQgKz0gbkJ5dGVzOworICAgICAgcHRyX25ldyArPSBuQnl0ZXM7CisgICAgICBwc3RhdHVzKys7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChuVGlsZXNDaGFuZ2VkICE9IDApOworfQorCitib29sIFBvbGxpbmdNYW5hZ2VyOjpwb2xsX1RyYWRpdGlvbmFsKCkKK3sKKyAgaWYgKCFtX3NlcnZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IG5UaWxlc0NoYW5nZWQgPSAwOworICBpbnQgc2NhbkxpbmUgPSBtX3BvbGxpbmdPcmRlclttX3BvbGxpbmdTdGVwKysgJSAzMl07CisgIGludCBieXRlc1BlclBpeGVsID0gbV9pbWFnZS0+eGltLT5iaXRzX3Blcl9waXhlbCAvIDg7CisgIGludCBieXRlc1BlckxpbmUgPSBtX2ltYWdlLT54aW0tPmJ5dGVzX3Blcl9saW5lOworICBSZWN0IHJlY3Q7CisKKyAgZm9yIChpbnQgeSA9IDA7IHkgKiAzMiA8IG1faGVpZ2h0OyB5KyspIHsKKyAgICBpbnQgdGlsZV9oID0gKG1faGVpZ2h0IC0geSAqIDMyID49IDMyKSA/IDMyIDogbV9oZWlnaHQgLSB5ICogMzI7CisgICAgaWYgKHNjYW5MaW5lID49IHRpbGVfaCkKKyAgICAgIGJyZWFrOworICAgIGludCBzY2FuX3kgPSB5ICogMzIgKyBzY2FuTGluZTsKKyAgICBnZXRSb3coc2Nhbl95KTsKKyAgICBjaGFyICpwdHJfb2xkID0gbV9pbWFnZS0+eGltLT5kYXRhICsgc2Nhbl95ICogYnl0ZXNQZXJMaW5lOworICAgIGNoYXIgKnB0cl9uZXcgPSBtX3Jvd0ltYWdlLT54aW0tPmRhdGE7CisgICAgZm9yIChpbnQgeCA9IDA7IHggKiAzMiA8IG1fd2lkdGg7IHgrKykgeworICAgICAgaW50IHRpbGVfdyA9IChtX3dpZHRoIC0geCAqIDMyID49IDMyKSA/IDMyIDogbV93aWR0aCAtIHggKiAzMjsKKyAgICAgIGludCBuQnl0ZXMgPSB0aWxlX3cgKiBieXRlc1BlclBpeGVsOworICAgICAgaWYgKG1lbWNtcChwdHJfb2xkLCBwdHJfbmV3LCBuQnl0ZXMpKSB7CisgICAgICAgIGdldFRpbGUzMih4LCB5LCB0aWxlX3csIHRpbGVfaCk7CisgICAgICAgIG1faW1hZ2UtPnVwZGF0ZVJlY3QobV90aWxlSW1hZ2UsIHggKiAzMiwgeSAqIDMyKTsKKyAgICAgICAgcmVjdC5zZXRYWVdIKHggKiAzMiwgeSAqIDMyLCB0aWxlX3csIHRpbGVfaCk7CisgICAgICAgIG1fc2VydmVyLT5hZGRfY2hhbmdlZChyZWN0KTsKKyAgICAgICAgblRpbGVzQ2hhbmdlZCsrOworICAgICAgfQorICAgICAgcHRyX29sZCArPSBuQnl0ZXM7CisgICAgICBwdHJfbmV3ICs9IG5CeXRlczsKKyAgICB9CisgIH0KKworICByZXR1cm4gKG5UaWxlc0NoYW5nZWQgIT0gMCk7Cit9CisKKy8vCisvLyBTaW1wbGVzdCBwb2xsaW5nIG1ldGhvZCwgZnJvbSB0aGUgb3JpZ2luYWwgeDB2bmNzZXJ2ZXIgb2YgVk5DNC4KKy8vCisKK2Jvb2wgUG9sbGluZ01hbmFnZXI6OnBvbGxfRHVtYigpCit7CisgIGlmICghbV9zZXJ2ZXIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGdldFNjcmVlbigpOworICBSZWN0IHJlY3QoMCwgMCwgbV93aWR0aCwgbV9oZWlnaHQpOworICBtX3NlcnZlci0+YWRkX2NoYW5nZWQocmVjdCk7CisKKyAgLy8gUmVwb3J0IHRoYXQgc29tZSBjaGFuZ2VzIGhhdmUgYmVlbiBkZXRlY3RlZC4KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vCisvLyBDb21wdXRlIGNvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUgYXJvdW5kIHRoZSBwb2ludGVyLgorLy8KKy8vIEFTU1VNRVM6IChtX3BvaW50ZXJQb3NLbm93biAhPSBmYWxzZSkKKy8vCisKK3ZvaWQgUG9sbGluZ01hbmFnZXI6OmNvbXB1dGVQb2ludGVyQXJlYShSZWN0ICpyKQoreworICBpbnQgeCA9IG1fcG9pbnRlclBvcy54IC0gNjQ7CisgIGludCB5ID0gbV9wb2ludGVyUG9zLnkgLSA2NDsKKyAgaW50IHcgPSAxMjg7CisgIGludCBoID0gMTI4OworICBpZiAoeCA8IDApIHsKKyAgICB3ICs9IHg7IHggPSAwOworICB9CisgIGlmICh4ICsgdyA+IG1fd2lkdGgpIHsKKyAgICB3ID0gbV93aWR0aCAtIHg7CisgIH0KKyAgaWYgKHkgPCAwKSB7CisgICAgaCArPSB5OyB5ID0gMDsKKyAgfQorICBpZiAoeSArIGggPiBtX2hlaWdodCkgeworICAgIGggPSBtX2hlaWdodCAtIHk7CisgIH0KKworICByLT5zZXRYWVdIKHgsIHksIHcsIGgpOworfQorCisvLworLy8gUG9sbCB0aGUgYXJlYSB1bmRlciBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24uIEVhY2ggcGl4ZWwgb2YgdGhlCisvLyBhcmVhIHNob3VsZCBiZSBjb21wYXJlZC4gVXNpbmcgc3VjaCBwb2xsaW5nIG9wdGlvbiBnaXZlcyBoaWdoZXIKKy8vIHByaW9yaXR5IHRvIHNjcmVlbiBhcmVhIHVuZGVyIHRoZSBwb2ludGVyLgorLy8KKy8vIEFTU1VNRVM6IChtX3NlcnZlciAhPSBOVUxMICYmIG1fcG9pbnRlclBvc0tub3duICE9IGZhbHNlKQorLy8KKworYm9vbCBQb2xsaW5nTWFuYWdlcjo6cG9sbFBvaW50ZXJBcmVhKCkKK3sKKyAgUmVjdCByOworICBjb21wdXRlUG9pbnRlckFyZWEoJnIpOworCisgIC8vIFNob3J0Y3V0cyBmb3IgY29vcmRpbmF0ZXMuCisgIGludCB4ID0gci50bC54LCB5ID0gci50bC55OworICBpbnQgdyA9IHIud2lkdGgoKSwgaCA9IHIuaGVpZ2h0KCk7CisKKyAgLy8gR2V0IG5ldyBwaXhlbHMuCisgIGdldEFyZWExMjgoeCwgeSwgdywgaCk7CisKKyAgLy8gTm93LCB0cnkgdG8gbWluaW1pemUgdGhlIHJlY3RhbmdsZSBieSBjdXR0aW5nIG91dCB1bmNoYW5nZWQKKyAgLy8gYm9yZGVycyAoYXQgdG9wIGFuZCBib3R0b20pLgorICAvLworICAvLyBGSVhNRTogUGVyaGFwcyB3ZSBzaG91bGQgd29yayBvbiAzMngzMiB0aWxlcyAocHJvcGVybHkgYWxpZ25lZCkKKyAgLy8gICAgICAgIHRvIHByb2R1Y2UgYSByZWdpb24gaW5zdGVhZCBvZiBhIHJlY3RhbmdsZS4gSWYgdGhlcmUgd291bGQKKyAgLy8gICAgICAgIGJlIGp1c3Qgb25lIHVuaXZlcnNhbCBwb2xsaW5nIGFsZ29yaXRobSwgaXQgY291bGQgYmUKKyAgLy8gICAgICAgIGJldHRlciB0byBpbnRlZ3JhdGUgcG9pbnRlciBhcmVhIHBvbGxpbmcgaW50byB0aGF0CisgIC8vICAgICAgICBhbGdvcml0aG0sIGluc3RlYWQgb2YgYSBzZXBhcmF0ZSBwb2xsUG9pbnRlckFyZWEoKQorICAvLyAgICAgICAgZnVuY3Rpb24uCisKKyAgLy8gU2hvcnRjdXRzLgorICBpbnQgYnl0ZXNQZXJQaXhlbCA9IG1faW1hZ2UtPnhpbS0+Yml0c19wZXJfcGl4ZWwgLyA4OworICBpbnQgb2xkQnl0ZXNQZXJMaW5lID0gbV9pbWFnZS0+eGltLT5ieXRlc19wZXJfbGluZTsKKyAgaW50IG5ld0J5dGVzUGVyTGluZSA9IG1fYXJlYUltYWdlLT54aW0tPmJ5dGVzX3Blcl9saW5lOworICBjaGFyICpvbGRQdHIgPSBtX2ltYWdlLT54aW0tPmRhdGEgKyB5ICogb2xkQnl0ZXNQZXJMaW5lICsgeCAqIGJ5dGVzUGVyUGl4ZWw7CisgIGNoYXIgKm5ld1B0ciA9IG1fYXJlYUltYWdlLT54aW0tPmRhdGE7CisKKyAgLy8gQ2hlY2sgYW5kIGN1dCBvdXQgdW5jaGFuZ2VkIHJvd3MgYXQgdGhlIHRvcC4KKyAgaW50IHR5OworICBmb3IgKHR5ID0gMDsgdHkgPCBoOyB0eSsrKSB7CisgICAgaWYgKG1lbWNtcChvbGRQdHIsIG5ld1B0ciwgdyAqIGJ5dGVzUGVyUGl4ZWwpICE9IDApCisgICAgICBicmVhazsKKyAgICBvbGRQdHIgKz0gb2xkQnl0ZXNQZXJMaW5lOworICAgIG5ld1B0ciArPSBuZXdCeXRlc1BlckxpbmU7CisgIH0KKyAgaWYgKHR5ID09IGgpIHsKKyAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlcyBhdCBhbGwKKyAgfQorICB5ICs9IHR5OyBoIC09IHR5OworCisgIC8vIENoZWNrIGFuZCBjdXQgb3V0IHVuY2hhbmdlZCByb3dzIGF0IHRoZSBib3R0b20uCisgIG9sZFB0ciA9IG1faW1hZ2UtPnhpbS0+ZGF0YSArICh5K2gtMSkgKiBvbGRCeXRlc1BlckxpbmUgKyB4ICogYnl0ZXNQZXJQaXhlbDsKKyAgbmV3UHRyID0gbV9hcmVhSW1hZ2UtPnhpbS0+ZGF0YSArICh0eStoLTEpICogbmV3Qnl0ZXNQZXJMaW5lOworICBpbnQgYnk7CisgIGZvciAoYnkgPSAwOyBieSA8IGggLSAxOyBieSsrKSB7CisgICAgaWYgKG1lbWNtcChvbGRQdHIsIG5ld1B0ciwgdyAqIGJ5dGVzUGVyUGl4ZWwpICE9IDApCisgICAgICBicmVhazsKKyAgICBvbGRQdHIgLT0gb2xkQnl0ZXNQZXJMaW5lOworICAgIG5ld1B0ciAtPSBuZXdCeXRlc1BlckxpbmU7CisgIH0KKyAgaCAtPSBieTsKKworICAvLyBDb3B5IHBpeGVscy4KKyAgbV9pbWFnZS0+dXBkYXRlUmVjdChtX2FyZWFJbWFnZSwgeCwgeSwgMCwgdHksIHcsIGgpOworCisgIC8vIFJlcG9ydCB1cGRhdGVzIHRvIHRoZSBzZXJ2ZXIuCisgIFJlY3QgcmVjdCh4LCB5LCB4K3csIHkraCk7CisgIG1fc2VydmVyLT5hZGRfY2hhbmdlZChyZWN0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vCisvLyBNYWtlIHZpZGVvIGFyZWEgcGF0dGVybiBtb3JlIHJlZ3VsYXIuCisvLworLy8gRklYTUU6IFJlcGxhY2UgdGhlIGFib3ZlIHdpdGggYSBub3JtYWwgY29tbWVudC4KKy8vIEZJWE1FOiBJcyB0aGUgZnVuY3Rpb24gZWZmaWNpZW50IGVub3VnaD8KKy8vCisKK3ZvaWQgUG9sbGluZ01hbmFnZXI6OmFkanVzdFZpZGVvQXJlYSgpCit7CisgIGNoYXIgbmV3RmxhZ3NbbV93aWR0aFRpbGVzICogbV9oZWlnaHRUaWxlc107CisgIGNoYXIgKnB0ciA9IG5ld0ZsYWdzOworICBpbnQgeCwgeTsKKworICAvLyBERUJVRzoKKyAgLy8gaW50IG5WaWRlb1RpbGVzID0gMDsKKworICBmb3IgKHkgPSAwOyB5IDwgbV9oZWlnaHRUaWxlczsgeSsrKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IG1fd2lkdGhUaWxlczsgeCsrKSB7CisKKyAgICAgIC8vIERFQlVHOgorICAgICAgLy8gblZpZGVvVGlsZXMgKz0gbV92aWRlb0ZsYWdzW3kgKiBtX3dpZHRoVGlsZXMgKyB4XTsKKworICAgICAgaW50IHdlaWdodGVkU3VtID0gMCwgbjsKKyAgICAgIGlmICh5ID4gMCAmJiB4ID4gMCkgeworICAgICAgICBuID0gKG1fdmlkZW9GbGFnc1sgeSAgICAqIG1fd2lkdGhUaWxlcyArICh4LTEpXSArCisgICAgICAgICAgICAgbV92aWRlb0ZsYWdzWyh5LTEpICogbV93aWR0aFRpbGVzICsgKHgtMSldICsKKyAgICAgICAgICAgICBtX3ZpZGVvRmxhZ3NbKHktMSkgKiBtX3dpZHRoVGlsZXMgKyAgeCAgIF0pOworICAgICAgICBpZiAobiA9PSAzKSB7CisgICAgICAgICAgKnB0cisrID0gMTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB3ZWlnaHRlZFN1bSArPSBuOworICAgICAgfQorICAgICAgaWYgKHkgPiAwICYmIHggPCBtX3dpZHRoVGlsZXMgLSAxKSB7CisgICAgICAgIG4gPSAobV92aWRlb0ZsYWdzWyB5ICAgICogbV93aWR0aFRpbGVzICsgKHgrMSldICsKKyAgICAgICAgICAgICBtX3ZpZGVvRmxhZ3NbKHktMSkgKiBtX3dpZHRoVGlsZXMgKyAoeCsxKV0gKworICAgICAgICAgICAgIG1fdmlkZW9GbGFnc1soeS0xKSAqIG1fd2lkdGhUaWxlcyArICB4ICAgXSk7CisgICAgICAgIGlmIChuID09IDMpIHsKKyAgICAgICAgICAqcHRyKysgPSAxOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHdlaWdodGVkU3VtICs9IG47CisgICAgICB9CisgICAgICBpZiAoeSA8IG1faGVpZ2h0VGlsZXMgLSAxICYmIHggPiAwKSB7CisgICAgICAgIG4gPSAobV92aWRlb0ZsYWdzWyB5ICAgICogbV93aWR0aFRpbGVzICsgKHgtMSldICsKKyAgICAgICAgICAgICBtX3ZpZGVvRmxhZ3NbKHkrMSkgKiBtX3dpZHRoVGlsZXMgKyAoeC0xKV0gKworICAgICAgICAgICAgIG1fdmlkZW9GbGFnc1soeSsxKSAqIG1fd2lkdGhUaWxlcyArICB4ICAgXSk7CisgICAgICAgIGlmIChuID09IDMpIHsKKyAgICAgICAgICAqcHRyKysgPSAxOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHdlaWdodGVkU3VtICs9IG47CisgICAgICB9CisgICAgICBpZiAoeSA8IG1faGVpZ2h0VGlsZXMgLSAxICYmIHggPCBtX3dpZHRoVGlsZXMgLSAxKSB7CisgICAgICAgIG4gPSAobV92aWRlb0ZsYWdzWyB5ICAgICogbV93aWR0aFRpbGVzICsgKHgrMSldICsKKyAgICAgICAgICAgICBtX3ZpZGVvRmxhZ3NbKHkrMSkgKiBtX3dpZHRoVGlsZXMgKyAoeCsxKV0gKworICAgICAgICAgICAgIG1fdmlkZW9GbGFnc1soeSsxKSAqIG1fd2lkdGhUaWxlcyArICB4ICAgXSk7CisgICAgICAgIGlmIChuID09IDMpIHsKKyAgICAgICAgICAqcHRyKysgPSAxOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHdlaWdodGVkU3VtICs9IG47CisgICAgICB9CisgICAgICAqcHRyKysgPSAod2VpZ2h0ZWRTdW0gPD0gMykgPyAwIDogbV92aWRlb0ZsYWdzW3kgKiBtX3dpZHRoVGlsZXMgKyB4XTsKKyAgICB9CisgIH0KKworICAvKgorICAvLy8gREVCVUc6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpZiAoblZpZGVvVGlsZXMpIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgbV9oZWlnaHRUaWxlczsgeSsrKSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgbV93aWR0aFRpbGVzOyB4KyspIHsKKyAgICAgICAgcHJpbnRmKCIlYyIsIG1fdmlkZW9GbGFnc1t5ICogbV93aWR0aFRpbGVzICsgeF0gPyAnQCcgOiAnOicpOworICAgICAgfQorICAgICAgcHJpbnRmKCIgICAgICAgICIpOworICAgICAgZm9yICh4ID0gMDsgeCA8IG1fd2lkdGhUaWxlczsgeCsrKSB7CisgICAgICAgIHByaW50ZigiJWMiLCBuZXdGbGFnc1t5ICogbV93aWR0aFRpbGVzICsgeF0gPyAnQCcgOiAnOicpOworICAgICAgfQorICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKi8KKworICBtZW1jcHkobV92aWRlb0ZsYWdzLCBuZXdGbGFncywgbV93aWR0aFRpbGVzICogbV9oZWlnaHRUaWxlcyk7Cit9CmRpZmYgLS1naXQgYS91bml4L3gwdm5jc2VydmVyL1BvbGxpbmdNYW5hZ2VyLmggYi91bml4L3gwdm5jc2VydmVyL1BvbGxpbmdNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlZWY1MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveDB2bmNzZXJ2ZXIvUG9sbGluZ01hbmFnZXIuaApAQCAtMCwwICsxLDE0OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gUG9sbGluZ01hbmFnZXIuaAorLy8KKworI2lmbmRlZiBfX1BPTExJTkdNQU5BR0VSX0hfXworI2RlZmluZSBfX1BPTExJTkdNQU5BR0VSX0hfXworCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxyZmIvVk5DU2VydmVyLmg+CisKKyNpbmNsdWRlIDx4MHZuY3NlcnZlci9JbWFnZS5oPgorCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDx4MHZuY3NlcnZlci9UaW1lTWlsbGlzLmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworY2xhc3MgUG9sbGluZ01hbmFnZXIgeworCitwdWJsaWM6CisKKyAgUG9sbGluZ01hbmFnZXIoRGlzcGxheSAqZHB5LCBJbWFnZSAqaW1hZ2UsIEltYWdlRmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgaW50IG9mZnNldExlZnQgPSAwLCBpbnQgb2Zmc2V0VG9wID0gMCk7CisgIHZpcnR1YWwgflBvbGxpbmdNYW5hZ2VyKCk7CisKKyAgdm9pZCBzZXRWTkNTZXJ2ZXIoVk5DU2VydmVyICpzKTsKKworICB2b2lkIHNldFBvaW50ZXJQb3MoY29uc3QgUG9pbnQgJnBvcyk7CisgIHZvaWQgdW5zZXRQb2ludGVyUG9zKCk7CisKKyAgdm9pZCBwb2xsKCk7CisKKyAgLy8gQ29uZmlndXJhYmxlIHBhcmFtZXRlcnMuCisgIHN0YXRpYyBCb29sUGFyYW1ldGVyIHBvbGxQb2ludGVyOworICBzdGF0aWMgSW50UGFyYW1ldGVyIHBvbGxpbmdUeXBlOworCitwcm90ZWN0ZWQ6CisKKyAgLy8KKyAgLy8gSW1wbGVtZW50YXRpb25zIG9mIGRpZmZlcmVudCBwb2xsaW5nIGFsZ29yaXRobXMuCisgIC8vIFJldHVybiB2YWx1ZSBvZiB0cnVlIHJlcG9ydHMgdGhhdCBzb21lIGNoYW5nZXMgd2VyZSBkZXRlY3RlZC4KKyAgLy8KKyAgYm9vbCBwb2xsX0RldGVjdFZpZGVvKCk7CisgIGJvb2wgcG9sbF9Ta2lwQ3ljbGVzKCk7CisgIGJvb2wgcG9sbF9UcmFkaXRpb25hbCgpOworICBib29sIHBvbGxfRHVtYigpOworCisgIC8vIFNlcGFyYXRlIHBvbGxpbmcgZm9yIHRoZSBhcmVhIGFyb3VuZCBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24uCisgIHZvaWQgY29tcHV0ZVBvaW50ZXJBcmVhKFJlY3QgKnIpOworICBib29sIHBvbGxQb2ludGVyQXJlYSgpOworCisgIERpc3BsYXkgKm1fZHB5OworICBWTkNTZXJ2ZXIgKm1fc2VydmVyOworCisgIEltYWdlICptX2ltYWdlOworICBpbnQgbV9vZmZzZXRMZWZ0OworICBpbnQgbV9vZmZzZXRUb3A7CisgIGludCBtX3dpZHRoOworICBpbnQgbV9oZWlnaHQ7CisgIGludCBtX3dpZHRoVGlsZXM7CisgIGludCBtX2hlaWdodFRpbGVzOworCisgIC8vIFRyYWNraW5nIHBvaW50ZXIgcG9zaXRpb24gZm9yIHBvbGxpbmcgaW1wcm92ZW1lbnRzLgorICBib29sIG1fcG9pbnRlclBvc0tub3duOworICBQb2ludCBtX3BvaW50ZXJQb3M7CisgIHRpbWVfdCBtX3BvaW50ZXJQb3NUaW1lOworCitwcml2YXRlOgorCisgIGlubGluZSB2b2lkIGdldFNjcmVlbigpIHsKKyAgICBtX2ltYWdlLT5nZXQoRGVmYXVsdFJvb3RXaW5kb3cobV9kcHkpLCBtX29mZnNldExlZnQsIG1fb2Zmc2V0VG9wKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGdldFJvdyhpbnQgeSkgeworICAgIG1fcm93SW1hZ2UtPmdldChEZWZhdWx0Um9vdFdpbmRvdyhtX2RweSksIG1fb2Zmc2V0TGVmdCwgbV9vZmZzZXRUb3AgKyB5KTsKKyAgfQorCisgIGlubGluZSB2b2lkIGdldFRpbGUzMihpbnQgdHgsIGludCB0eSwgaW50IHcsIGludCBoKSB7CisgICAgaWYgKHcgPT0gMzIgJiYgaCA9PSAzMikgeworICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIGdldCgpIG1heSBiZSBiZXR0ZXIgb3B0aW1pemVkLgorICAgICAgbV90aWxlSW1hZ2UtPmdldChEZWZhdWx0Um9vdFdpbmRvdyhtX2RweSksCisgICAgICAgICAgICAgICAgICAgICAgIG1fb2Zmc2V0TGVmdCArIHR4ICogMzIsIG1fb2Zmc2V0VG9wICsgdHkgKiAzMik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEdlbmVyaWMgdmVyc2lvbiBvZiBnZXQoKSBmb3IgYXJiaXRyYXJ5IHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICBtX3RpbGVJbWFnZS0+Z2V0KERlZmF1bHRSb290V2luZG93KG1fZHB5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbV9vZmZzZXRMZWZ0ICsgdHggKiAzMiwgbV9vZmZzZXRUb3AgKyB0eSAqIDMyLCB3LCBoKTsKKyAgICB9CisgIH0KKworICBpbmxpbmUgdm9pZCBnZXRBcmVhMTI4KGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7CisgICAgaWYgKHcgPT0gMTI4ICYmIGggPT0gMTI4KSB7CisgICAgICAvLyBUaGlzIHZlcnNpb24gb2YgZ2V0KCkgbWF5IGJlIGJldHRlciBvcHRpbWl6ZWQuCisgICAgICBtX2FyZWFJbWFnZS0+Z2V0KERlZmF1bHRSb290V2luZG93KG1fZHB5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbV9vZmZzZXRMZWZ0ICsgeCwgbV9vZmZzZXRUb3AgKyB5KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gR2VuZXJpYyB2ZXJzaW9uIG9mIGdldCgpIGZvciBhcmJpdHJhcnkgd2lkdGggYW5kIGhlaWdodC4KKyAgICAgIG1fYXJlYUltYWdlLT5nZXQoRGVmYXVsdFJvb3RXaW5kb3cobV9kcHkpLAorICAgICAgICAgICAgICAgICAgICAgICBtX29mZnNldExlZnQgKyB4LCBtX29mZnNldFRvcCArIHksIHcsIGgpOworICAgIH0KKyAgfQorCisgIHZvaWQgYWRqdXN0VmlkZW9BcmVhKCk7CisKKyAgLy8gQWRkaXRpb25hbCBpbWFnZXMgdXNlZCBpbiBwb2xsaW5nIGFsZ29yaXRobXMuCisgIEltYWdlICptX3Jvd0ltYWdlOyAgICAgICAgICAgIC8vIE9uZSByb3cgb2YgdGhlIGZyYW1lYnVmZmVyCisgIEltYWdlICptX3RpbGVJbWFnZTsgICAgICAgICAgIC8vIE9uZSB0aWxlICgzMngzMiBvciBsZXNzKQorICBJbWFnZSAqbV9hcmVhSW1hZ2U7ICAgICAgICAgICAvLyBBcmVhIGFyb3VuZCB0aGUgcG9pbnRlciAodXAgdG8gMTI4eDEyOCkKKworICBjaGFyICptX3N0YXR1c01hdHJpeDsKKworICBjaGFyICptX3JhdGVNYXRyaXg7CisgIGNoYXIgKm1fdmlkZW9GbGFnczsKKyAgY2hhciAqbV9jaGFuZ2VkRmxhZ3M7CisKKyAgdW5zaWduZWQgaW50IG1fcG9sbGluZ1N0ZXA7CisgIHN0YXRpYyBjb25zdCBpbnQgbV9wb2xsaW5nT3JkZXJbXTsKKworI2lmZGVmIERFQlVHCitwcml2YXRlOgorCisgIHZvaWQgZGVidWdCZWZvcmVQb2xsKCk7CisgIHZvaWQgZGVidWdBZnRlclBvbGwoKTsKKworICBUaW1lTWlsbGlzIG1fdGltZVNhdmVkOworI2VuZGlmCisKK307CisKKyNlbmRpZiAvLyBfX1BPTExJTkdNQU5BR0VSX0hfXwpkaWZmIC0tZ2l0IGEvdW5peC94MHZuY3NlcnZlci9Qb2xsaW5nU2NoZWR1bGVyLmN4eCBiL3VuaXgveDB2bmNzZXJ2ZXIvUG9sbGluZ1NjaGVkdWxlci5jeHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkOGQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveDB2bmNzZXJ2ZXIvUG9sbGluZ1NjaGVkdWxlci5jeHgKQEAgLTAsMCArMSwyMTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNiBDb25zdGFudGluIEthcGxpbnNreS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8vCisvLyBQb2xsaW5nU2NoZWR1bGVyIGNsYXNzIGltcGxlbWVudGF0aW9uLgorLy8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx4MHZuY3NlcnZlci9Qb2xsaW5nU2NoZWR1bGVyLmg+CisKK1BvbGxpbmdTY2hlZHVsZXI6OlBvbGxpbmdTY2hlZHVsZXIoaW50IGludGVydmFsLCBpbnQgbWF4bG9hZCkKK3sKKyAgc2V0UGFyYW1ldGVycyhpbnRlcnZhbCwgbWF4bG9hZCk7CisgIHJlc2V0KCk7Cit9CisKK3ZvaWQgUG9sbGluZ1NjaGVkdWxlcjo6c2V0UGFyYW1ldGVycyhpbnQgaW50ZXJ2YWwsIGludCBtYXhsb2FkKQoreworICBtX2ludGVydmFsID0gaW50ZXJ2YWw7CisgIG1fbWF4bG9hZCA9IG1heGxvYWQ7CisKKyAgaWYgKG1faW50ZXJ2YWwgPCAwKSB7CisgICAgbV9pbnRlcnZhbCA9IDA7CisgIH0KKyAgaWYgKG1fbWF4bG9hZCA8IDEpIHsKKyAgICBtX21heGxvYWQgPSAxOworICB9IGVsc2UgaWYgKG1fbWF4bG9hZCA+IDEwMCkgeworICAgIG1fbWF4bG9hZCA9IDEwMDsKKyAgfQorfQorCit2b2lkIFBvbGxpbmdTY2hlZHVsZXI6OnJlc2V0KCkKK3sKKyAgbV9pbml0aWFsU3RhdGUgPSB0cnVlOworfQorCit2b2lkIFBvbGxpbmdTY2hlZHVsZXI6Om5ld1Bhc3MoKQoreworICBUaW1lTWlsbGlzIHRpbWVOb3c7CisKKyAgaWYgKG1faW5pdGlhbFN0YXRlKSB7CisKKyAgICAvLyBGaXJzdCBwb2xsaW5nIHBhc3M6IGluaXRpYWxpemUgc3RhdGlzdGljcy4KKyAgICBtX2luaXRpYWxTdGF0ZSA9IGZhbHNlOworICAgIG1fcmF0ZWREdXJhdGlvbiA9IDA7CisgICAgbV9zbGVlcGluZyA9IDA7CisgICAgbWVtc2V0KG1fZXJyb3JzLCAwLCBzaXplb2YobV9lcnJvcnMpKTsKKyAgICBtX2Vycm9yU3VtID0gMDsKKyAgICBtX2Vycm9yQWJzU3VtID0gMDsKKyAgICBtZW1zZXQobV9kdXJhdGlvbnMsIDAsIHNpemVvZihtX2R1cmF0aW9ucykpOworICAgIG1fZHVyYXRpb25TdW0gPSAwOworICAgIG1lbXNldChtX3NsZXB0LCAwLCBzaXplb2YobV9zbGVwdCkpOworICAgIG1fc2xlcHRTdW0gPSAwOworICAgIG1faWR4ID0gMDsKKyAgICBtX2NvdW50ID0gMDsKKworICB9IGVsc2UgeworCisgICAgLy8gU3RvcCBzbGVlcGluZyBpZiBub3QgeWV0LgorICAgIGlmIChtX3NsZWVwaW5nKQorICAgICAgc2xlZXBGaW5pc2hlZCgpOworCisgICAgLy8gVXBkYXRlIHN0YXRpc3RpY3Mgb24gc2xlZXBpbmcgdGltZSBhbmQgdG90YWwgcGFzcyBkdXJhdGlvbi4KKyAgICBpbnQgZHVyYXRpb24gPSB0aW1lTm93LmRpZmZGcm9tKG1fcGFzc1N0YXJ0ZWQpOworCisgICAgaW50IG9sZGVzdCA9IG1fZHVyYXRpb25zW21faWR4XTsKKyAgICBtX2R1cmF0aW9uc1ttX2lkeF0gPSBkdXJhdGlvbjsKKyAgICBtX2R1cmF0aW9uU3VtID0gbV9kdXJhdGlvblN1bSAtIG9sZGVzdCArIGR1cmF0aW9uOworCisgICAgb2xkZXN0ID0gbV9zbGVwdFttX2lkeF07CisgICAgbV9zbGVwdFttX2lkeF0gPSBtX3NsZXB0VGhpc1Bhc3M7CisgICAgbV9zbGVwdFN1bSA9IG1fc2xlcHRTdW0gLSBvbGRlc3QgKyBtX3NsZXB0VGhpc1Bhc3M7CisKKyAgICAvLyBDb21wdXRlIGFuZCBzYXZlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsIGFuZCBwbGFubmVkIHRpbWUuCisgICAgaW50IG5ld0Vycm9yID0gZHVyYXRpb24gLSBtX2ludGVydmFsOworICAgIG9sZGVzdCA9IG1fZXJyb3JzW21faWR4XTsKKyAgICBtX2Vycm9yc1ttX2lkeF0gPSBuZXdFcnJvcjsKKyAgICBtX2Vycm9yU3VtID0gbV9lcnJvclN1bSAtIG9sZGVzdCArIG5ld0Vycm9yOworICAgIG1fZXJyb3JBYnNTdW0gPSBtX2Vycm9yQWJzU3VtIC0gYWJzKG9sZGVzdCkgKyBhYnMobmV3RXJyb3IpOworCisgICAgLy8KKyAgICAvLyBCZWxvdyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydC4KKyAgICAvLyBDb21wdXRlIGRlc2lyZWQgZHVyYXRpb24gb2YgdGhlIHVwY29taW5nIHBvbGxpbmcgcGFzcy4KKyAgICAvLworCisgICAgLy8gRXN0aW1hdGlvbiBiYXNlZCBvbiBrZWVwaW5nIHVwIGNvbnN0YW50IGludGVydmFsLgorICAgIG1fcmF0ZWREdXJhdGlvbiA9IG1faW50ZXJ2YWwgLSBtX2Vycm9yU3VtIC8gMjsKKworICAgIC8vIEVzdGltYXRpb25zIGJhc2VkIG9uIGtlZXBpbmcgdXAgZGVzaXJlZCBDUFUgbG9hZC4KKyAgICBpbnQgb3B0aW1hbExvYWREdXJhdGlvbjEgPSAwOworICAgIGludCBvcHRpbWFsTG9hZER1cmF0aW9uOCA9IDA7CisgICAgaW50IG9wdGltYWxMb2FkRHVyYXRpb24gPSAwOworCisgICAgaWYgKG1fY291bnQgPiA0KSB7CisgICAgICAvLyBFc3RpbWF0aW9uIDEgKHVzZSBwcmV2aW91cyBwYXNzIHN0YXRpc3RpY3MpLgorICAgICAgb3B0aW1hbExvYWREdXJhdGlvbjEgPQorICAgICAgICAoKGR1cmF0aW9uIC0gbV9zbGVwdFRoaXNQYXNzKSAqIDEwMCArIG1fbWF4bG9hZC8yKSAvIG1fbWF4bG9hZDsKKworICAgICAgaWYgKG1fY291bnQgPiAxNikgeworICAgICAgICAvLyBFc3RpbWF0aW9uIDIgKHVzZSBoaXN0b3J5IG9mIDggcHJldmlvdXMgcGFzc2VzKS4KKyAgICAgICAgb3B0aW1hbExvYWREdXJhdGlvbjggPQorICAgICAgICAgICgobV9kdXJhdGlvblN1bSAtIG1fc2xlcHRTdW0pICogOTAwICsgbV9tYXhsb2FkKjQpIC8gKG1fbWF4bG9hZCo4KQorICAgICAgICAgIC0gbV9kdXJhdGlvblN1bTsKKyAgICAgICAgLy8gTWl4IHRoZSBhYm92ZSB0d28gZ2l2aW5nIG1vcmUgcHJpb3JpdHkgdG8gdGhlIGZpcnN0LgorICAgICAgICBvcHRpbWFsTG9hZER1cmF0aW9uID0KKyAgICAgICAgICAoMiAqIG9wdGltYWxMb2FkRHVyYXRpb24xICsgb3B0aW1hbExvYWREdXJhdGlvbjgpIC8gMzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9wdGltYWxMb2FkRHVyYXRpb24gPSBvcHRpbWFsTG9hZER1cmF0aW9uMTsKKyAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAiPGVzdCAlM2QsJTNkLCVkPlx0IiwKKyAgICAgICAgICAgIG1fcmF0ZWREdXJhdGlvbiwgb3B0aW1hbExvYWREdXJhdGlvbjEsIG9wdGltYWxMb2FkRHVyYXRpb244KTsKKyNlbmRpZgorCisgICAgLy8gQ2hvb3NlIGZpbmFsIGVzdGltYXRpb24uCisgICAgaWYgKG1fcmF0ZWREdXJhdGlvbiA8IG9wdGltYWxMb2FkRHVyYXRpb24pIHsKKyAgICAgIG1fcmF0ZWREdXJhdGlvbiA9IG9wdGltYWxMb2FkRHVyYXRpb247CisgICAgfQorICAgIGlmIChtX3JhdGVkRHVyYXRpb24gPCAwKSB7CisgICAgICBtX3JhdGVkRHVyYXRpb24gPSAwOworICAgIH0gZWxzZSBpZiAobV9yYXRlZER1cmF0aW9uID4gNTAwICYmIG1faW50ZXJ2YWwgPD0gMTAwKSB7CisgICAgICBtX3JhdGVkRHVyYXRpb24gPSA1MDA7CisgICAgfSBlbHNlIGlmIChtX3JhdGVkRHVyYXRpb24gPiAxMDAwKSB7CisgICAgICBtX3JhdGVkRHVyYXRpb24gPSAxMDAwOworICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICI8ZmluYWwgZXN0ICUzZD5cdCIsIG1fcmF0ZWREdXJhdGlvbik7CisjZW5kaWYKKworICAgIC8vIFVwZGF0ZSByaW5nIGJ1ZmZlciBpbmRleGVyICg4IGVsZW1lbnRzIHBlciBlYWNoIGFycmF5cykuCisgICAgbV9pZHggPSAobV9pZHggKyAxKSAmIDc7CisKKyAgICAvLyBVcGRhdGUgcGFzcyBjb3VudGVyLgorICAgIG1fY291bnQrKzsKKworICB9CisKKyAgbV9wYXNzU3RhcnRlZCA9IHRpbWVOb3c7CisgIG1fc2xlcHRUaGlzUGFzcyA9IDA7Cit9CisKK3ZvaWQgUG9sbGluZ1NjaGVkdWxlcjo6c2xlZXBTdGFydGVkKCkKK3sKKyAgaWYgKG1faW5pdGlhbFN0YXRlIHx8IG1fc2xlZXBpbmcpCisgICAgcmV0dXJuOworCisgIG1fc2xlZXBTdGFydGVkLnVwZGF0ZSgpOworCisgIG1fc2xlZXBpbmcgPSB0cnVlOworfQorCit2b2lkIFBvbGxpbmdTY2hlZHVsZXI6OnNsZWVwRmluaXNoZWQoKQoreworICBpZiAobV9pbml0aWFsU3RhdGUgfHwgIW1fc2xlZXBpbmcpCisgICAgcmV0dXJuOworCisgIFRpbWVNaWxsaXMgdGltZU5vdzsKKyAgbV9zbGVwdFRoaXNQYXNzICs9IHRpbWVOb3cuZGlmZkZyb20obV9zbGVlcFN0YXJ0ZWQpOworCisgIG1fc2xlZXBpbmcgPSBmYWxzZTsKK30KKworaW50IFBvbGxpbmdTY2hlZHVsZXI6Om1pbGxpc1JlbWFpbmluZygpIGNvbnN0Cit7CisgIGlmIChtX2luaXRpYWxTdGF0ZSkKKyAgICByZXR1cm4gMDsKKworICBUaW1lTWlsbGlzIHRpbWVOb3c7CisgIGludCBlbGFwc2VkID0gdGltZU5vdy5kaWZmRnJvbShtX3Bhc3NTdGFydGVkKTsKKworICBpZiAoZWxhcHNlZCA+IG1fcmF0ZWREdXJhdGlvbikKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gKG1fcmF0ZWREdXJhdGlvbiAtIGVsYXBzZWQpOworfQorCitib29sIFBvbGxpbmdTY2hlZHVsZXI6Omdvb2RUaW1lVG9Qb2xsKCkgY29uc3QKK3sKKyAgaWYgKG1faW5pdGlhbFN0YXRlKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIEF2ZXJhZ2UgZXJyb3IgKHBlciA4IGVsZW1lbnRzIGluIHRoZSByaW5nIGJ1ZmZlcikuCisgIGludCBlcnJvckF2ZyA9IChtX2Vycm9yQWJzU3VtICsgNCkgLyA4OworCisgIC8vIEl0J3Mgb2sgdG8gcG9sbCBlYXJsaWVyIGlmIG5ldyBlcnJvciBpcyBubyBtb3JlIHRoYW4gaGFsZi1hdmVyYWdlLgorICByZXR1cm4gKG1pbGxpc1JlbWFpbmluZygpIDw9IGVycm9yQXZnIC8gMik7Cit9CmRpZmYgLS1naXQgYS91bml4L3gwdm5jc2VydmVyL1BvbGxpbmdTY2hlZHVsZXIuaCBiL3VuaXgveDB2bmNzZXJ2ZXIvUG9sbGluZ1NjaGVkdWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlM2U1YmUKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3gwdm5jc2VydmVyL1BvbGxpbmdTY2hlZHVsZXIuaApAQCAtMCwwICsxLDk4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gUG9sbGluZ1NjaGVkdWxlciBjbGFzcy4gSXQgaXMgdXNlZCBmb3IgZGVjaWRpbmcgd2hlbiB0byBzdGFydCBuZXcKKy8vIHBvbGxpbmcgcGFzcywgYW5kIGhvdyBtdWNoIHRpbWUgaXQgaXMgb2sgdG8gc2xlZXAgYmVmb3JlIHN0YXJ0aW5nLiAKKy8vIFBvbGxpbmdTY2hlZHVsZXIgaXMgZ2l2ZW4gYSBkZXNpcmVkIHBvbGxpbmcgaW50ZXJ2YWwsIGJ1dCBpdCBjYW4KKy8vIGFkZCB0aW1lIGJldHdlZW4gcG9sbGluZyBwYXNzZXMgaWYgbmVlZGVkIGZvciBzYXRpc2Z5aW5nIHByb2Nlc3NvcgorLy8gdXNhZ2UgbGltaXRhdGlvbi4KKy8vCisKKyNpZm5kZWYgX19QT0xMSU5HU0NIRURVTEVSX0hfXworI2RlZmluZSBfX1BPTExJTkdTQ0hFRFVMRVJfSF9fCisKKyNpbmNsdWRlIDx4MHZuY3NlcnZlci9UaW1lTWlsbGlzLmg+CisKK2NsYXNzIFBvbGxpbmdTY2hlZHVsZXIgeworCitwdWJsaWM6CisKKyAgUG9sbGluZ1NjaGVkdWxlcihpbnQgaW50ZXJ2YWwsIGludCBtYXhsb2FkID0gNTApOworCisgIC8vIFNldCBwb2xsaW5nIHBhcmFtZXRlcnMuCisgIHZvaWQgc2V0UGFyYW1ldGVycyhpbnQgaW50ZXJ2YWwsIGludCBtYXhsb2FkID0gNTApOworCisgIC8vIFJlc2V0IHRoZSBvYmplY3QgaW50byB0aGUgaW5pdGlhbCBzdGF0ZSAobm8gcG9sbGluZyBwZXJmb3JtZWQpLgorICB2b2lkIHJlc2V0KCk7CisKKyAgLy8gVGVsbCB0aGUgc2NoZWR1bGVyIHRoYXQgbmV3IHBvbGxpbmcgcGFzcyBpcyBqdXN0IGJlaW5nIHN0YXJ0ZWQuCisgIHZvaWQgbmV3UGFzcygpOworCisgIC8vIEluZm9ybSB0aGUgc2NoZWR1bGVyIGFib3V0IHRpbWVzIHdoZW4gd2Ugc2xlZXAuCisgIHZvaWQgc2xlZXBTdGFydGVkKCk7CisgIHZvaWQgc2xlZXBGaW5pc2hlZCgpOworCisgIC8vIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRpbWUgcmVtYWluaW5nIGJlZm9yZSBuZXcgcG9sbGluZyBwYXNzLgorICBpbnQgbWlsbGlzUmVtYWluaW5nKCkgY29uc3Q7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiB0ZWxscyBpZiBpdCdzIG9rIHRvIHN0YXJ0IHBvbGxpbmcgcGFzcyByaWdodCBub3cuCisgIGJvb2wgZ29vZFRpbWVUb1BvbGwoKSBjb25zdDsKKworcHJvdGVjdGVkOgorCisgIC8vIFBhcmFtZXRlcnMuCisgIGludCBtX2ludGVydmFsOworICBpbnQgbV9tYXhsb2FkOworCisgIC8vIFRoaXMgYm9vbGVhbiBmbGFnIGlzIHRydWUgd2hlbiB3ZSBkbyBub3QgcG9sbCB0aGUgc2NyZWVuLgorICBib29sIG1faW5pdGlhbFN0YXRlOworCisgIC8vIFRpbWUgc3RhbXAgc2F2ZWQgb24gc3RhcnRpbmcgY3VycmVudCBwb2xsaW5nIHBhc3MuCisgIFRpbWVNaWxsaXMgbV9wYXNzU3RhcnRlZDsKKworICAvLyBEZXNpcmVkIGR1cmF0aW9uIG9mIGN1cnJlbnQgcG9sbGluZyBwYXNzLgorICBpbnQgbV9yYXRlZER1cmF0aW9uOworCisgIC8vIFRoZXNlIGFyZSBmb3IgbWVhc3VyaW5nIHNsZWVwIHRpbWUgaW4gY3VycmVudCBwYXNzLgorICBUaW1lTWlsbGlzIG1fc2xlZXBTdGFydGVkOworICBib29sIG1fc2xlZXBpbmc7CisgIGludCBtX3NsZXB0VGhpc1Bhc3M7CisKKyAgLy8gUmluZyBidWZmZXIgZm9yIHRyYWNraW5nIHBhc3QgdGltaW5nIGVycm9ycy4KKyAgaW50IG1fZXJyb3JzWzhdOworICBpbnQgbV9lcnJvclN1bTsKKyAgaW50IG1fZXJyb3JBYnNTdW07CisKKyAgLy8gUmluZyBidWZmZXIgZm9yIHRyYWNraW5nIHRvdGFsIHBhc3MgZHVyYXRpb25zICh3b3JrICsgc2xlZXApLgorICBpbnQgbV9kdXJhdGlvbnNbOF07CisgIGludCBtX2R1cmF0aW9uU3VtOworCisgIC8vIFJpbmcgYnVmZmVyIGZvciB0cmFja2luZyBwYXN0IHNsZWVwIHRpbWVzLgorICBpbnQgbV9zbGVwdFs4XTsKKyAgaW50IG1fc2xlcHRTdW07CisKKyAgLy8gSW5kZXhlciBmb3IgYWxsIHJpbmcgYnVmZmVycy4KKyAgaW50IG1faWR4OworCisgIC8vIFBhc3MgY291bnRlci4KKyAgaW50IG1fY291bnQ7Cit9OworCisjZW5kaWYgLy8gX19QT0xMSU5HU0NIRURVTEVSX0hfXworCmRpZmYgLS1naXQgYS91bml4L3gwdm5jc2VydmVyL1RpbWVNaWxsaXMuY3h4IGIvdW5peC94MHZuY3NlcnZlci9UaW1lTWlsbGlzLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTljMDQzCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94MHZuY3NlcnZlci9UaW1lTWlsbGlzLmN4eApAQCAtMCwwICsxLDQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ29uc3RhbnRpbiBLYXBsaW5za3kuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisvLworLy8gVGltZU1pbGxpcy5jeHgKKy8vCisKKyNpbmNsdWRlIDx4MHZuY3NlcnZlci9UaW1lTWlsbGlzLmg+CisKKy8vIFhYWCBMeW54L09TIDIuMzogZ2V0IHByb3RvIGZvciBnZXR0aW1lb2ZkYXkoKQorI2lmZGVmIEx5bngKKyNpbmNsdWRlIDxzeXMvcHJvdG8uaD4KKyNlbmRpZgorCitUaW1lTWlsbGlzOjpUaW1lTWlsbGlzKCkKK3sKKyAgdXBkYXRlKCk7Cit9CisKK2Jvb2wgVGltZU1pbGxpczo6dXBkYXRlKCkKK3sKKyAgc3RydWN0IHRpbWV6b25lIHR6OworICByZXR1cm4gKGdldHRpbWVvZmRheSgmbV90aW1ldmFsLCAmdHopID09IDApOworfQorCitpbnQgVGltZU1pbGxpczo6ZGlmZkZyb20oY29uc3QgVGltZU1pbGxpcyAmb2xkZXIpIGNvbnN0Cit7CisgIGludCBkaWZmID0gKGludCkKKyAgICAoKG1fdGltZXZhbC50dl91c2VjIC0gb2xkZXIubV90aW1ldmFsLnR2X3VzZWMgKyA1MDApIC8gMTAwMCArCisgICAgIChtX3RpbWV2YWwudHZfc2VjIC0gb2xkZXIubV90aW1ldmFsLnR2X3NlYykgKiAxMDAwKTsKKworICByZXR1cm4gZGlmZjsKK30KKwpkaWZmIC0tZ2l0IGEvdW5peC94MHZuY3NlcnZlci9UaW1lTWlsbGlzLmggYi91bml4L3gwdm5jc2VydmVyL1RpbWVNaWxsaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzlkYjEyCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94MHZuY3NlcnZlci9UaW1lTWlsbGlzLmgKQEAgLTAsMCArMSw0NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8KKy8vIFRpbWVNaWxsaXMuaAorLy8KKworI2lmbmRlZiBfX1RJTUVNSUxMSVNfSF9fCisjZGVmaW5lIF9fVElNRU1JTExJU19IX18KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK2NsYXNzIFRpbWVNaWxsaXMgeworCitwdWJsaWM6CisKKyAgVGltZU1pbGxpcygpOworCisgIC8vIFNldCB0aGlzIG9iamVjdCB0byBjdXJyZW50IHRpbWUsIHJldHVybnMgdHJ1ZSBvbiBzdWNlc3MuCisgIGJvb2wgdXBkYXRlKCk7CisKKyAgLy8gUmV0dXJuIGRpZmZlcmVuY2UgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gdHdvIHRpbWUgcG9pbnRzLgorICBpbnQgZGlmZkZyb20oY29uc3QgVGltZU1pbGxpcyAmb2xkZXIpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgc3RydWN0IHRpbWV2YWwgbV90aW1ldmFsOworCit9OworCisjZW5kaWYgLy8gX19USU1FTUlMTElTX0hfXworCmRpZmYgLS1naXQgYS91bml4L3gwdm5jc2VydmVyL2J1aWxkdGltZS5jIGIvdW5peC94MHZuY3NlcnZlci9idWlsZHRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTYwMzFjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94MHZuY3NlcnZlci9idWlsZHRpbWUuYwpAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCitjaGFyIGJ1aWxkdGltZVtdID0gX19EQVRFX18gIiAiIF9fVElNRV9fOwpkaWZmIC0tZ2l0IGEvdW5peC94MHZuY3NlcnZlci94MHZuY3NlcnZlci5jeHggYi91bml4L3gwdm5jc2VydmVyL3gwdm5jc2VydmVyLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQ4M2JmCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94MHZuY3NlcnZlci94MHZuY3NlcnZlci5jeHgKQEAgLTAsMCArMSw1ODAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IENvbnN0YW50aW4gS2FwbGluc2t5LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworLy8gRklYTUU6IENoZWNrIGNhc2VzIHdoZW4gc2NyZWVuIHdpZHRoL2hlaWdodCBpcyBub3QgYSBtdWx0aXBseSBvZiAzMi4KKy8vICAgICAgICBlLmcuIDgwMHg2MDAuCisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHJmYi9Mb2dnZXJfc3RkaW8uaD4KKyNpbmNsdWRlIDxyZmIvTG9nV3JpdGVyLmg+CisjaW5jbHVkZSA8cmZiL1ZOQ1NlcnZlclNULmg+CisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxyZmIvU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkLmg+CisjaW5jbHVkZSA8cmZiL1RpbWVyLmg+CisjaW5jbHVkZSA8bmV0d29yay9UY3BTb2NrZXQuaD4KKyNpbmNsdWRlIDx0eC9UWFdpbmRvdy5oPgorCisjaW5jbHVkZSA8dm5jY29uZmlnX3VuaXgvUXVlcnlDb25uZWN0RGlhbG9nLmg+CisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxYMTEvWC5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjaWZkZWYgSEFWRV9YVEVTVAorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hUZXN0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHgwdm5jc2VydmVyL0dlb21ldHJ5Lmg+CisjaW5jbHVkZSA8eDB2bmNzZXJ2ZXIvSW1hZ2UuaD4KKyNpbmNsdWRlIDx4MHZuY3NlcnZlci9Qb2xsaW5nTWFuYWdlci5oPgorI2luY2x1ZGUgPHgwdm5jc2VydmVyL1BvbGxpbmdTY2hlZHVsZXIuaD4KKworLy8gWFhYIEx5bngvT1MgMi4zOiBwcm90b3MgZm9yIHNlbGVjdCgpLCBiemVybygpCisjaWZkZWYgTHlueAorI2luY2x1ZGUgPHN5cy9wcm90by5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSByZmI7Cit1c2luZyBuYW1lc3BhY2UgbmV0d29yazsKKworc3RhdGljIExvZ1dyaXRlciB2bG9nKCJNYWluIik7CisKK0ludFBhcmFtZXRlciBwb2xsaW5nQ3ljbGUoIlBvbGxpbmdDeWNsZSIsICJNaWxsaXNlY29uZHMgcGVyIG9uZSBwb2xsaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImN5Y2xlOyBhY3R1YWwgaW50ZXJ2YWwgbWF5IGJlIGR5bmFtaWNhbGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFkanVzdGVkIHRvIHNhdGlzZnkgTWF4UHJvY2Vzc29yVXNhZ2Ugc2V0dGluZyIsIDMwKTsKK0ludFBhcmFtZXRlciBtYXhQcm9jZXNzb3JVc2FnZSgiTWF4UHJvY2Vzc29yVXNhZ2UiLCAiTWF4aW11bSBwZXJjZW50YWdlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1BVIHRpbWUgdG8gYmUgY29uc3VtZWQiLCAzNSk7CitCb29sUGFyYW1ldGVyIHVzZVNobSgiVXNlU0hNIiwgIlVzZSBNSVQtU0hNIGV4dGVuc2lvbiBpZiBhdmFpbGFibGUiLCB0cnVlKTsKK0Jvb2xQYXJhbWV0ZXIgdXNlT3ZlcmxheSgiT3ZlcmxheU1vZGUiLCAiVXNlIG92ZXJsYXkgbW9kZSB1bmRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIklSSVggb3IgU29sYXJpcyIsIHRydWUpOworU3RyaW5nUGFyYW1ldGVyIGRpc3BsYXluYW1lKCJkaXNwbGF5IiwgIlRoZSBYIGRpc3BsYXkiLCAiIik7CitJbnRQYXJhbWV0ZXIgcmZicG9ydCgicmZicG9ydCIsICJUQ1AgcG9ydCB0byBsaXN0ZW4gZm9yIFJGQiBwcm90b2NvbCIsNTkwMCk7CitJbnRQYXJhbWV0ZXIgcXVlcnlDb25uZWN0VGltZW91dCgiUXVlcnlDb25uZWN0VGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIHNlY29uZHMgdG8gc2hvdyB0aGUgQWNjZXB0IENvbm5lY3Rpb24gZGlhbG9nIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVqZWN0aW5nIHRoZSBjb25uZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKK1N0cmluZ1BhcmFtZXRlciBob3N0c0ZpbGUoIkhvc3RzRmlsZSIsICJGaWxlIHdpdGggSVAgYWNjZXNzIGNvbnRyb2wgcnVsZXMiLCAiIik7CisKKy8vCisvLyBBbGxvdyB0aGUgbWFpbiBsb29wIHRlcm1pbmF0ZSBpdHNlbGYgZ3JhY2VmdWxseSBvbiByZWNlaXZpbmcgYSBzaWduYWwuCisvLworCitzdGF0aWMgYm9vbCBjYXVnaHRTaWduYWwgPSBmYWxzZTsKKworc3RhdGljIHZvaWQgQ2xlYW51cFNpZ25hbEhhbmRsZXIoaW50IHNpZykKK3sKKyAgY2F1Z2h0U2lnbmFsID0gdHJ1ZTsKK30KKworCitjbGFzcyBRdWVyeUNvbm5IYW5kbGVyIDogcHVibGljIFZOQ1NlcnZlclNUOjpRdWVyeUNvbm5lY3Rpb25IYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBRdWVyeVJlc3VsdENhbGxiYWNrIHsKK3B1YmxpYzoKKyAgUXVlcnlDb25uSGFuZGxlcihEaXNwbGF5KiBkcHksIFZOQ1NlcnZlclNUKiB2cykKKyAgICA6IGRpc3BsYXkoZHB5KSwgc2VydmVyKHZzKSwgcXVlcnlDb25uZWN0RGlhbG9nKDApLCBxdWVyeUNvbm5lY3RTb2NrKDApIHt9CisgIH5RdWVyeUNvbm5IYW5kbGVyKCkgeyBkZWxldGUgcXVlcnlDb25uZWN0RGlhbG9nOyB9CisKKyAgLy8gLT0tIFZOQ1NlcnZlclNUOjpRdWVyeUNvbm5lY3Rpb25IYW5kbGVyIGludGVyZmFjZQorICB2aXJ0dWFsIFZOQ1NlcnZlclNUOjpxdWVyeVJlc3VsdCBxdWVyeUNvbm5lY3Rpb24obmV0d29yazo6U29ja2V0KiBzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogcmVhc29uKSB7CisgICAgaWYgKHF1ZXJ5Q29ubmVjdFNvY2spIHsKKyAgICAgICpyZWFzb24gPSBzdHJEdXAoIkFub3RoZXIgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgcXVlcmllZC4iKTsKKyAgICAgIHJldHVybiBWTkNTZXJ2ZXJTVDo6UkVKRUNUOworICAgIH0KKyAgICBpZiAoIXVzZXJOYW1lKSB1c2VyTmFtZSA9ICIoYW5vbnltb3VzKSI7CisgICAgcXVlcnlDb25uZWN0U29jayA9IHNvY2s7CisgICAgQ2hhckFycmF5IGFkZHJlc3Moc29jay0+Z2V0UGVlckFkZHJlc3MoKSk7CisgICAgZGVsZXRlIHF1ZXJ5Q29ubmVjdERpYWxvZzsKKyAgICBxdWVyeUNvbm5lY3REaWFsb2cgPSBuZXcgUXVlcnlDb25uZWN0RGlhbG9nKGRpc3BsYXksIGFkZHJlc3MuYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsIHF1ZXJ5Q29ubmVjdFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICBxdWVyeUNvbm5lY3REaWFsb2ctPm1hcCgpOworICAgIHJldHVybiBWTkNTZXJ2ZXJTVDo6UEVORElORzsKKyAgfQorCisgIC8vIC09LSBRdWVyeVJlc3VsdENhbGxiYWNrIGludGVyZmFjZQorICB2aXJ0dWFsIHZvaWQgcXVlcnlBcHByb3ZlZCgpIHsKKyAgICBzZXJ2ZXItPmFwcHJvdmVDb25uZWN0aW9uKHF1ZXJ5Q29ubmVjdFNvY2ssIHRydWUsIDApOworICAgIHF1ZXJ5Q29ubmVjdFNvY2sgPSAwOworICB9CisgIHZpcnR1YWwgdm9pZCBxdWVyeVJlamVjdGVkKCkgeworICAgIHNlcnZlci0+YXBwcm92ZUNvbm5lY3Rpb24ocXVlcnlDb25uZWN0U29jaywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiByZWplY3RlZCBieSBsb2NhbCB1c2VyIik7CisgICAgcXVlcnlDb25uZWN0U29jayA9IDA7CisgIH0KK3ByaXZhdGU6CisgIERpc3BsYXkqIGRpc3BsYXk7CisgIFZOQ1NlcnZlclNUKiBzZXJ2ZXI7CisgIFF1ZXJ5Q29ubmVjdERpYWxvZyogcXVlcnlDb25uZWN0RGlhbG9nOworICBuZXR3b3JrOjpTb2NrZXQqIHF1ZXJ5Q29ubmVjdFNvY2s7Cit9OworCisKKy8vCisvLyBYUGl4ZWxCdWZmZXIgaXMgYSBtb2RpZmljYXRpb24gb2YgRnVsbEZyYW1lUGl4ZWxCdWZmZXIgdGhhdCBkb2VzCisvLyBub3QgYWx3YXlzIHJldHVybiBidWZmZXIgd2lkdGggaW4gZ2V0U3RyaWRlKCkuCisvLworCitjbGFzcyBYUGl4ZWxCdWZmZXIgOiBwdWJsaWMgRnVsbEZyYW1lUGl4ZWxCdWZmZXIKK3sKK3B1YmxpYzoKKyAgWFBpeGVsQnVmZmVyKGNvbnN0IFBpeGVsRm9ybWF0JiBwZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgcmRyOjpVOCogZGF0YV8sIENvbG91ck1hcCogY20sIGludCBzdHJpZGVfKSA6CisgICAgRnVsbEZyYW1lUGl4ZWxCdWZmZXIocGYsIHdpZHRoLCBoZWlnaHQsIGRhdGFfLCBjbSksIHN0cmlkZShzdHJpZGVfKQorICB7CisgIH0KKworICB2aXJ0dWFsIGludCBnZXRTdHJpZGUoKSBjb25zdCB7IHJldHVybiBzdHJpZGU7IH0KKworcHJvdGVjdGVkOgorICBpbnQgc3RyaWRlOworfTsKKworCitjbGFzcyBYRGVza3RvcCA6IHB1YmxpYyBTRGVza3RvcCwgcHVibGljIENvbG91ck1hcAoreworcHVibGljOgorICBYRGVza3RvcChEaXNwbGF5KiBkcHlfLCBHZW9tZXRyeSAqZ2VvbWV0cnlfKQorICAgIDogZHB5KGRweV8pLCBnZW9tZXRyeShnZW9tZXRyeV8pLCBwYigwKSwgc2VydmVyKDApLCBpbWFnZSgwKSwgcG9sbG1ncigwKSwKKyAgICAgIG9sZEJ1dHRvbk1hc2soMCksIGhhdmVYdGVzdChmYWxzZSksIG1heEJ1dHRvbnMoMCksIHJ1bm5pbmcoZmFsc2UpCisgIHsKKyNpZmRlZiBIQVZFX1hURVNUCisgICAgaW50IHh0ZXN0RXZlbnRCYXNlOworICAgIGludCB4dGVzdEVycm9yQmFzZTsKKyAgICBpbnQgbWFqb3IsIG1pbm9yOworCisgICAgaWYgKFhUZXN0UXVlcnlFeHRlbnNpb24oZHB5LCAmeHRlc3RFdmVudEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0ZXN0RXJyb3JCYXNlLCAmbWFqb3IsICZtaW5vcikpIHsKKyAgICAgIFhUZXN0R3JhYkNvbnRyb2woZHB5LCBUcnVlKTsKKyAgICAgIHZsb2cuaW5mbygiWFRlc3QgZXh0ZW5zaW9uIHByZXNlbnQgLSB2ZXJzaW9uICVkLiVkIixtYWpvcixtaW5vcik7CisgICAgICBoYXZlWHRlc3QgPSB0cnVlOworICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgIHZsb2cuaW5mbygiWFRlc3QgZXh0ZW5zaW9uIG5vdCBwcmVzZW50Iik7CisgICAgICB2bG9nLmluZm8oIlVuYWJsZSB0byBpbmplY3QgZXZlbnRzIG9yIGRpc3BsYXkgd2hpbGUgc2VydmVyIGlzIGdyYWJiZWQiKTsKKyNpZmRlZiBIQVZFX1hURVNUCisgICAgfQorI2VuZGlmCisKKyAgfQorICB2aXJ0dWFsIH5YRGVza3RvcCgpIHsKKyAgICBzdG9wKCk7CisgIH0KKworICAvLyAtPS0gU0Rlc2t0b3AgaW50ZXJmYWNlCisKKyAgdmlydHVhbCB2b2lkIHN0YXJ0KFZOQ1NlcnZlciogdnMpIHsKKworICAgIC8vIERldGVybWluZSBhY3R1YWwgbnVtYmVyIG9mIGJ1dHRvbnMgb2YgdGhlIFggcG9pbnRlciBkZXZpY2UuCisgICAgdW5zaWduZWQgY2hhciBidG5NYXBbOF07CisgICAgaW50IG51bUJ1dHRvbnMgPSBYR2V0UG9pbnRlck1hcHBpbmcoZHB5LCBidG5NYXAsIDgpOworICAgIG1heEJ1dHRvbnMgPSAobnVtQnV0dG9ucyA+IDgpID8gOCA6IG51bUJ1dHRvbnM7CisgICAgdmxvZy5pbmZvKCJFbmFibGluZyAlZCBidXR0b24lcyBvZiBYIHBvaW50ZXIgZGV2aWNlIiwKKyAgICAgICAgICAgICAgbWF4QnV0dG9ucywgKG1heEJ1dHRvbnMgIT0gMSkgPyAicyIgOiAiIik7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2UgZm9yIG1haW50YWluaW5nIGZyYW1lYnVmZmVyIGRhdGEuCisgICAgSW1hZ2VGYWN0b3J5IGZhY3RvcnkoKGJvb2wpdXNlU2htLCAoYm9vbCl1c2VPdmVybGF5KTsKKyAgICBpbWFnZSA9IGZhY3RvcnkubmV3SW1hZ2UoZHB5LCBnZW9tZXRyeS0+d2lkdGgoKSwgZ2VvbWV0cnktPmhlaWdodCgpKTsKKyAgICB2bG9nLmluZm8oIkFsbG9jYXRlZCAlcyIsIGltYWdlLT5jbGFzc0Rlc2MoKSk7CisKKyAgICAvLyBDcmVhdGUgcG9sbGluZyBtYW5hZ2VyIG9iamVjdC4gSXQgd2lsbCB0cmFjayBzY3JlZW4gY2hhbmdlcyBhbmQKKyAgICAvLyBrZWVwIHBpeGVscyBvZiB0aGUgYGltYWdlJyBvYmplY3QgdXAgdG8gZGF0ZS4KKyAgICBwb2xsbWdyID0gbmV3IFBvbGxpbmdNYW5hZ2VyKGRweSwgaW1hZ2UsICZmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnktPm9mZnNldExlZnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LT5vZmZzZXRUb3AoKSk7CisgICAgcG9sbG1nci0+c2V0Vk5DU2VydmVyKHZzKTsKKworICAgIHBmLmJwcCA9IGltYWdlLT54aW0tPmJpdHNfcGVyX3BpeGVsOworICAgIHBmLmRlcHRoID0gaW1hZ2UtPnhpbS0+ZGVwdGg7CisgICAgcGYuYmlnRW5kaWFuID0gKGltYWdlLT54aW0tPmJ5dGVfb3JkZXIgPT0gTVNCRmlyc3QpOworICAgIHBmLnRydWVDb2xvdXIgPSBpbWFnZS0+aXNUcnVlQ29sb3IoKTsKKyAgICBwZi5yZWRTaGlmdCAgID0gZmZzKGltYWdlLT54aW0tPnJlZF9tYXNrKSAtIDE7CisgICAgcGYuZ3JlZW5TaGlmdCA9IGZmcyhpbWFnZS0+eGltLT5ncmVlbl9tYXNrKSAtIDE7CisgICAgcGYuYmx1ZVNoaWZ0ICA9IGZmcyhpbWFnZS0+eGltLT5ibHVlX21hc2spIC0gMTsKKyAgICBwZi5yZWRNYXggICAgID0gaW1hZ2UtPnhpbS0+cmVkX21hc2sgICA+PiBwZi5yZWRTaGlmdDsKKyAgICBwZi5ncmVlbk1heCAgID0gaW1hZ2UtPnhpbS0+Z3JlZW5fbWFzayA+PiBwZi5ncmVlblNoaWZ0OworICAgIHBmLmJsdWVNYXggICAgPSBpbWFnZS0+eGltLT5ibHVlX21hc2sgID4+IHBmLmJsdWVTaGlmdDsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiBhIHJvdywgd2l0aCBwYWRkaW5nIGluY2x1ZGVkLgorICAgIGludCBzdHJpZGUgPSBpbWFnZS0+eGltLT5ieXRlc19wZXJfbGluZSAqIDggLyBpbWFnZS0+eGltLT5iaXRzX3Blcl9waXhlbDsKKworICAgIC8vIFByb3ZpZGUgcGl4ZWwgYnVmZmVyIHRvIHRoZSBzZXJ2ZXIgb2JqZWN0LgorICAgIHBiID0gbmV3IFhQaXhlbEJ1ZmZlcihwZiwgZ2VvbWV0cnktPndpZHRoKCksIGdlb21ldHJ5LT5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJkcjo6VTgqKWltYWdlLT54aW0tPmRhdGEsIHRoaXMsIHN0cmlkZSk7CisgICAgc2VydmVyID0gdnM7CisgICAgc2VydmVyLT5zZXRQaXhlbEJ1ZmZlcihwYik7CisKKyAgICBydW5uaW5nID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBzdG9wKCkgeworICAgIHJ1bm5pbmcgPSBmYWxzZTsKKworICAgIGRlbGV0ZSBwYjsKKyAgICBkZWxldGUgcG9sbG1ncjsKKyAgICBkZWxldGUgaW1hZ2U7CisKKyAgICBwYiA9IDA7CisgICAgcG9sbG1nciA9IDA7CisgICAgaW1hZ2UgPSAwOworICB9CisKKyAgaW5saW5lIGJvb2wgaXNSdW5uaW5nKCkgeworICAgIHJldHVybiBydW5uaW5nOworICB9CisKKyAgaW5saW5lIHZvaWQgcG9sbCgpIHsKKyAgICBpZiAocG9sbG1ncikKKyAgICAgIHBvbGxtZ3ItPnBvbGwoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBwb2ludGVyRXZlbnQoY29uc3QgUG9pbnQmIHBvcywgaW50IGJ1dHRvbk1hc2spIHsKKyAgICBwb2xsbWdyLT5zZXRQb2ludGVyUG9zKHBvcyk7CisjaWZkZWYgSEFWRV9YVEVTVAorICAgIGlmICghaGF2ZVh0ZXN0KSByZXR1cm47CisgICAgWFRlc3RGYWtlTW90aW9uRXZlbnQoZHB5LCBEZWZhdWx0U2NyZWVuKGRweSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnktPm9mZnNldExlZnQoKSArIHBvcy54LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LT5vZmZzZXRUb3AoKSArIHBvcy55LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lKTsKKyAgICBpZiAoYnV0dG9uTWFzayAhPSBvbGRCdXR0b25NYXNrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEJ1dHRvbnM7IGkrKykgeworCWlmICgoYnV0dG9uTWFzayBeIG9sZEJ1dHRvbk1hc2spICYgKDE8PGkpKSB7CisgICAgICAgICAgaWYgKGJ1dHRvbk1hc2sgJiAoMTw8aSkpIHsKKyAgICAgICAgICAgIFhUZXN0RmFrZUJ1dHRvbkV2ZW50KGRweSwgaSsxLCBUcnVlLCBDdXJyZW50VGltZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFhUZXN0RmFrZUJ1dHRvbkV2ZW50KGRweSwgaSsxLCBGYWxzZSwgQ3VycmVudFRpbWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBvbGRCdXR0b25NYXNrID0gYnV0dG9uTWFzazsKKyNlbmRpZgorICB9CisKKyAgdmlydHVhbCB2b2lkIGtleUV2ZW50KHJkcjo6VTMyIGtleSwgYm9vbCBkb3duKSB7CisjaWZkZWYgSEFWRV9YVEVTVAorICAgIGlmICghaGF2ZVh0ZXN0KSByZXR1cm47CisgICAgaW50IGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRweSwga2V5KTsKKyAgICBpZiAoa2V5Y29kZSkKKyAgICAgIFhUZXN0RmFrZUtleUV2ZW50KGRweSwga2V5Y29kZSwgZG93biwgQ3VycmVudFRpbWUpOworI2VuZGlmCisgIH0KKworICB2aXJ0dWFsIHZvaWQgY2xpZW50Q3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pIHsKKyAgfQorCisgIHZpcnR1YWwgUG9pbnQgZ2V0RmJTaXplKCkgeworICAgIHJldHVybiBQb2ludChwYi0+d2lkdGgoKSwgcGItPmhlaWdodCgpKTsKKyAgfQorCisgIC8vIC09LSBDb2xvdXJNYXAgY2FsbGJhY2tzCisgIHZpcnR1YWwgdm9pZCBsb29rdXAoaW50IGluZGV4LCBpbnQqIHIsIGludCogZywgaW50KiBiKSB7CisgICAgWENvbG9yIHhjOworICAgIHhjLnBpeGVsID0gaW5kZXg7CisgICAgaWYgKGluZGV4IDwgRGlzcGxheUNlbGxzKGRweSxEZWZhdWx0U2NyZWVuKGRweSkpKSB7CisgICAgICBYUXVlcnlDb2xvcihkcHksIERlZmF1bHRDb2xvcm1hcChkcHksRGVmYXVsdFNjcmVlbihkcHkpKSwgJnhjKTsKKyAgICB9IGVsc2UgeworICAgICAgeGMucmVkID0geGMuZ3JlZW4gPSB4Yy5ibHVlID0gMDsKKyAgICB9CisgICAgKnIgPSB4Yy5yZWQ7CisgICAgKmcgPSB4Yy5ncmVlbjsKKyAgICAqYiA9IHhjLmJsdWU7CisgIH0KKworcHJvdGVjdGVkOgorICBEaXNwbGF5KiBkcHk7CisgIEdlb21ldHJ5KiBnZW9tZXRyeTsKKyAgUGl4ZWxGb3JtYXQgcGY7CisgIFBpeGVsQnVmZmVyKiBwYjsKKyAgVk5DU2VydmVyKiBzZXJ2ZXI7CisgIEltYWdlKiBpbWFnZTsKKyAgUG9sbGluZ01hbmFnZXIqIHBvbGxtZ3I7CisgIGludCBvbGRCdXR0b25NYXNrOworICBib29sIGhhdmVYdGVzdDsKKyAgaW50IG1heEJ1dHRvbnM7CisgIGJvb2wgcnVubmluZzsKK307CisKKworY2xhc3MgRmlsZVRjcEZpbHRlciA6IHB1YmxpYyBUY3BGaWx0ZXIKK3sKKworcHVibGljOgorCisgIEZpbGVUY3BGaWx0ZXIoY29uc3QgY2hhciAqZm5hbWUpCisgICAgOiBUY3BGaWx0ZXIoIi0iKSwgZmlsZU5hbWUoTlVMTCksIGxhc3RNb2RUaW1lKDApCisgIHsKKyAgICBpZiAoZm5hbWUgIT0gTlVMTCkKKyAgICAgIGZpbGVOYW1lID0gc3RyZHVwKChjaGFyICopZm5hbWUpOworICB9CisKKyAgdmlydHVhbCB+RmlsZVRjcEZpbHRlcigpCisgIHsKKyAgICBpZiAoZmlsZU5hbWUgIT0gTlVMTCkKKyAgICAgIGZyZWUoZmlsZU5hbWUpOworICB9CisKKyAgdmlydHVhbCBib29sIHZlcmlmeUNvbm5lY3Rpb24oU29ja2V0KiBzKQorICB7CisgICAgaWYgKCFyZWxvYWRSdWxlcygpKSB7CisgICAgICB2bG9nLmVycm9yKCJDb3VsZCBub3QgcmVhZCBJUCBmaWx0ZXJpbmcgcnVsZXM6IHJlamVjdGluZyBhbGwgY2xpZW50cyIpOworICAgICAgZmlsdGVyLmNsZWFyKCk7CisgICAgICBmaWx0ZXIucHVzaF9iYWNrKHBhcnNlUGF0dGVybigiLSIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gVGNwRmlsdGVyOjp2ZXJpZnlDb25uZWN0aW9uKHMpOworICB9CisKK3Byb3RlY3RlZDoKKworICBib29sIHJlbG9hZFJ1bGVzKCkKKyAgeworICAgIGlmIChmaWxlTmFtZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBpZiAoc3RhdChmaWxlTmFtZSwgJnN0KSAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0LnN0X210aW1lICE9IGxhc3RNb2RUaW1lKSB7CisgICAgICAvLyBBY3R1YWxseSByZWxvYWQgb25seSBpZiB0aGUgZmlsZSB3YXMgbW9kaWZpZWQKKyAgICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZU5hbWUsICJyIik7CisgICAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBSZW1vdmUgYWxsIHRoZSBydWxlcyBmcm9tIHRoZSBwYXJlbnQgY2xhc3MKKyAgICAgIGZpbHRlci5jbGVhcigpOworCisgICAgICAvLyBQYXJzZSB0aGUgZmlsZSBjb250ZW50cyBhZGRpbmcgcnVsZXMgdG8gdGhlIHBhcmVudCBjbGFzcworICAgICAgY2hhciBidWZbMzJdOworICAgICAgd2hpbGUgKHJlYWRMaW5lKGJ1ZiwgMzIsIGZwKSkgeworICAgICAgICBpZiAoYnVmWzBdICYmIHN0cmNocigiKy0/IiwgYnVmWzBdKSkgeworICAgICAgICAgIGZpbHRlci5wdXNoX2JhY2socGFyc2VQYXR0ZXJuKGJ1ZikpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBsYXN0TW9kVGltZSA9IHN0LnN0X210aW1lOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisKKyAgY2hhciAqZmlsZU5hbWU7CisgIHRpbWVfdCBsYXN0TW9kVGltZTsKKworcHJpdmF0ZToKKworICAvLworICAvLyBOT1RFOiB3ZSBzaWxlbnRseSB0cnVuY2F0ZSBsb25nIGxpbmVzIGluIHRoaXMgZnVuY3Rpb24uCisgIC8vCisKKyAgYm9vbCByZWFkTGluZShjaGFyICpidWYsIGludCBidWZTaXplLCBGSUxFICpmcCkKKyAgeworICAgIGlmIChmcCA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMIHx8IGJ1ZlNpemUgPT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChmZ2V0cyhidWYsIGJ1ZlNpemUsIGZwKSA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2hhciAqcHRyID0gc3RyY2hyKGJ1ZiwgJ1xuJyk7CisgICAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgICAqcHRyID0gJ1wwJzsgICAgICAgICAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIGF0IHRoZSBlbmQKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFmZW9mKGZwKSkgeworICAgICAgICBpbnQgYzsKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgcmVzdCBvZiBhIGxvbmcgbGluZQorICAgICAgICAgIGMgPSBnZXRjKGZwKTsKKyAgICAgICAgfSB3aGlsZSAoYyAhPSAnXG4nICYmIGMgIT0gRU9GKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworfTsKKworY2hhciogcHJvZ3JhbU5hbWU7CisKK3N0YXRpYyB2b2lkIHVzYWdlKCkKK3sKKyAgZnByaW50ZihzdGRlcnIsICJcbnVzYWdlOiAlcyBbPHBhcmFtZXRlcnM+XVxuIiwgcHJvZ3JhbU5hbWUpOworICBmcHJpbnRmKHN0ZGVyciwiXG4iCisgICAgICAgICAgIlBhcmFtZXRlcnMgY2FuIGJlIHR1cm5lZCBvbiB3aXRoIC08cGFyYW0+IG9yIG9mZiB3aXRoIC08cGFyYW0+PTBcbiIKKyAgICAgICAgICAiUGFyYW1ldGVycyB3aGljaCB0YWtlIGEgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBhcyAiCisgICAgICAgICAgIi08cGFyYW0+IDx2YWx1ZT5cbiIKKyAgICAgICAgICAiT3RoZXIgdmFsaWQgZm9ybXMgYXJlIDxwYXJhbT49PHZhbHVlPiAtPHBhcmFtPj08dmFsdWU+ICIKKyAgICAgICAgICAiLS08cGFyYW0+PTx2YWx1ZT5cbiIKKyAgICAgICAgICAiUGFyYW1ldGVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLiAgVGhlIHBhcmFtZXRlcnMgYXJlOlxuXG4iKTsKKyAgQ29uZmlndXJhdGlvbjo6bGlzdFBhcmFtcyg3OSwgMTQpOworICBleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGluaXRTdGRJT0xvZ2dlcnMoKTsKKyAgTG9nV3JpdGVyOjpzZXRMb2dQYXJhbXMoIio6c3RkZXJyOjMwIik7CisKKyAgcHJvZ3JhbU5hbWUgPSBhcmd2WzBdOworICBEaXNwbGF5KiBkcHk7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoQ29uZmlndXJhdGlvbjo6c2V0UGFyYW0oYXJndltpXSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeworICAgICAgaWYgKGkrMSA8IGFyZ2MpIHsKKyAgICAgICAgaWYgKENvbmZpZ3VyYXRpb246OnNldFBhcmFtKCZhcmd2W2ldWzFdLCBhcmd2W2krMV0pKSB7CisgICAgICAgICAgaSsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICB1c2FnZSgpOworICAgIH0KKworICAgIHVzYWdlKCk7CisgIH0KKworICBDaGFyQXJyYXkgZHB5U3RyKGRpc3BsYXluYW1lLmdldERhdGEoKSk7CisgIGlmICghKGRweSA9IFhPcGVuRGlzcGxheShkcHlTdHIuYnVmWzBdID8gZHB5U3RyLmJ1ZiA6IDApKSkgeworICAgIGZwcmludGYoc3RkZXJyLCIlczogdW5hYmxlIHRvIG9wZW4gZGlzcGxheSBcIiVzXCJcclxuIiwKKyAgICAgICAgICAgIHByb2dyYW1OYW1lLCBYRGlzcGxheU5hbWUoZGlzcGxheW5hbWUuZ2V0RGF0YSgpKSk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHNpZ25hbChTSUdIVVAsIENsZWFudXBTaWduYWxIYW5kbGVyKTsKKyAgc2lnbmFsKFNJR0lOVCwgQ2xlYW51cFNpZ25hbEhhbmRsZXIpOworICBzaWduYWwoU0lHVEVSTSwgQ2xlYW51cFNpZ25hbEhhbmRsZXIpOworCisgIHRyeSB7CisgICAgVFhXaW5kb3c6OmluaXQoZHB5LCJ4MHZuY3NlcnZlciIpOworICAgIEdlb21ldHJ5IGdlbyhEaXNwbGF5V2lkdGgoZHB5LCBEZWZhdWx0U2NyZWVuKGRweSkpLAorICAgICAgICAgICAgICAgICBEaXNwbGF5SGVpZ2h0KGRweSwgRGVmYXVsdFNjcmVlbihkcHkpKSk7CisgICAgWERlc2t0b3AgZGVza3RvcChkcHksICZnZW8pOworICAgIFZOQ1NlcnZlclNUIHNlcnZlcigieDB2bmNzZXJ2ZXIiLCAmZGVza3RvcCk7CisgICAgUXVlcnlDb25uSGFuZGxlciBxY0hhbmRsZXIoZHB5LCAmc2VydmVyKTsKKyAgICBzZXJ2ZXIuc2V0UXVlcnlDb25uZWN0aW9uSGFuZGxlcigmcWNIYW5kbGVyKTsKKworICAgIFRjcExpc3RlbmVyIGxpc3RlbmVyKChpbnQpcmZicG9ydCk7CisgICAgdmxvZy5pbmZvKCJMaXN0ZW5pbmcgb24gcG9ydCAlZCIsIChpbnQpcmZicG9ydCk7CisKKyAgICBGaWxlVGNwRmlsdGVyIGZpbGVUY3BGaWx0ZXIoaG9zdHNGaWxlLmdldERhdGEoKSk7CisgICAgaWYgKHN0cmxlbihob3N0c0ZpbGUuZ2V0RGF0YSgpKSAhPSAwKQorICAgICAgbGlzdGVuZXIuc2V0RmlsdGVyKCZmaWxlVGNwRmlsdGVyKTsKKworICAgIFBvbGxpbmdTY2hlZHVsZXIgc2NoZWQoKGludClwb2xsaW5nQ3ljbGUsIChpbnQpbWF4UHJvY2Vzc29yVXNhZ2UpOworCisgICAgd2hpbGUgKCFjYXVnaHRTaWduYWwpIHsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgZmRfc2V0IHJmZHM7CisgICAgICBzdGQ6Omxpc3Q8U29ja2V0Kj4gc29ja2V0czsKKyAgICAgIHN0ZDo6bGlzdDxTb2NrZXQqPjo6aXRlcmF0b3IgaTsKKworICAgICAgLy8gUHJvY2VzcyBhbnkgaW5jb21pbmcgWCBldmVudHMKKyAgICAgIFRYV2luZG93OjpoYW5kbGVYRXZlbnRzKGRweSk7CisKKyAgICAgIEZEX1pFUk8oJnJmZHMpOworICAgICAgRkRfU0VUKGxpc3RlbmVyLmdldEZkKCksICZyZmRzKTsKKyAgICAgIHNlcnZlci5nZXRTb2NrZXRzKCZzb2NrZXRzKTsKKyAgICAgIGludCBjbGllbnRzX2Nvbm5lY3RlZCA9IDA7CisgICAgICBmb3IgKGkgPSBzb2NrZXRzLmJlZ2luKCk7IGkgIT0gc29ja2V0cy5lbmQoKTsgaSsrKSB7CisgICAgICAgIGlmICgoKmkpLT5pc1NodXRkb3duKCkpIHsKKyAgICAgICAgICBzZXJ2ZXIucmVtb3ZlU29ja2V0KCppKTsKKyAgICAgICAgICBkZWxldGUgKCppKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGRF9TRVQoKCppKS0+Z2V0RmQoKSwgJnJmZHMpOworICAgICAgICAgIGNsaWVudHNfY29ubmVjdGVkKys7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNsaWVudHNfY29ubmVjdGVkKSB7CisgICAgICAgIGludCB3YWl0X21zID0gc2NoZWQubWlsbGlzUmVtYWluaW5nKCk7CisgICAgICAgIGlmICh3YWl0X21zID4gNTAwKSB7CisgICAgICAgICAgd2FpdF9tcyA9IDUwMDsKKyAgICAgICAgfQorICAgICAgICB0di50dl91c2VjID0gd2FpdF9tcyAqIDEwMDA7CisjaWZkZWYgREVCVUcKKyAgICAgICAgLy8gZnByaW50ZihzdGRlcnIsICJbJWRdXHQiLCB3YWl0X21zKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2NoZWQucmVzZXQoKTsKKyAgICAgICAgdHYudHZfdXNlYyA9IDEwMDAwMDsKKyAgICAgIH0KKyAgICAgIHR2LnR2X3NlYyA9IDA7CisKKyAgICAgIC8vIERvIHRoZSB3YWl0Li4uCisgICAgICBzY2hlZC5zbGVlcFN0YXJ0ZWQoKTsKKyAgICAgIGludCBuID0gc2VsZWN0KEZEX1NFVFNJWkUsICZyZmRzLCAwLCAwLCAmdHYpOworICAgICAgc2NoZWQuc2xlZXBGaW5pc2hlZCgpOworCisgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgdmxvZy5kZWJ1ZygiSW50ZXJydXB0ZWQgc2VsZWN0KCkgc3lzdGVtIGNhbGwiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyByZHI6OlN5c3RlbUV4Y2VwdGlvbigic2VsZWN0IiwgZXJybm8pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEFjY2VwdCBuZXcgVk5DIGNvbm5lY3Rpb25zCisgICAgICBpZiAoRkRfSVNTRVQobGlzdGVuZXIuZ2V0RmQoKSwgJnJmZHMpKSB7CisgICAgICAgIFNvY2tldCogc29jayA9IGxpc3RlbmVyLmFjY2VwdCgpOworICAgICAgICBpZiAoc29jaykgeworICAgICAgICAgIHNlcnZlci5hZGRTb2NrZXQoc29jayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmxvZy5zdGF0dXMoIkNsaWVudCBjb25uZWN0aW9uIHJlamVjdGVkIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgVGltZXI6OmNoZWNrVGltZW91dHMoKTsKKyAgICAgIHNlcnZlci5jaGVja1RpbWVvdXRzKCk7CisKKyAgICAgIC8vIENsaWVudCBsaXN0IGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkLgorICAgICAgc2VydmVyLmdldFNvY2tldHMoJnNvY2tldHMpOworCisgICAgICAvLyBOb3RoaW5nIG1vcmUgdG8gZG8gaWYgdGhlcmUgYXJlIG5vIGNsaWVudCBjb25uZWN0aW9ucy4KKyAgICAgIGlmIChzb2NrZXRzLmVtcHR5KCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBQcm9jZXNzIGV2ZW50cyBvbiBleGlzdGluZyBWTkMgY29ubmVjdGlvbnMKKyAgICAgIGZvciAoaSA9IHNvY2tldHMuYmVnaW4oKTsgaSAhPSBzb2NrZXRzLmVuZCgpOyBpKyspIHsKKyAgICAgICAgaWYgKEZEX0lTU0VUKCgqaSktPmdldEZkKCksICZyZmRzKSkKKyAgICAgICAgICBzZXJ2ZXIucHJvY2Vzc1NvY2tldEV2ZW50KCppKTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlc2t0b3AuaXNSdW5uaW5nKCkgJiYgc2NoZWQuZ29vZFRpbWVUb1BvbGwoKSkgeworICAgICAgICBzY2hlZC5uZXdQYXNzKCk7CisgICAgICAgIGRlc2t0b3AucG9sbCgpOworICAgICAgfQorICAgIH0KKworICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiAmZSkgeworICAgIHZsb2cuZXJyb3IoZS5zdHIoKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB2bG9nLmluZm8oIlRlcm1pbmF0ZWQiKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91bml4L3gwdm5jc2VydmVyL3gwdm5jc2VydmVyLm1hbiBiL3VuaXgveDB2bmNzZXJ2ZXIveDB2bmNzZXJ2ZXIubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOWJhOTQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3gwdm5jc2VydmVyL3gwdm5jc2VydmVyLm1hbgpAQCAtMCwwICsxLDMzIEBACisuVEggeDB2bmNzZXJ2ZXIgMSAiMTcgQXByIDIwMDYiICJUaWdodFZOQyIgIlZpcnR1YWwgTmV0d29yayBDb21wdXRpbmciCisuU0ggTkFNRQoreDB2bmNzZXJ2ZXIgXC0gVk5DIHNlcnZlciB3aGljaCBjb250aW51b3VzbHkgcG9sbHMgYW4gWCBkaXNwbGF5CisuU0ggU1lOT1BTSVMKKy5CIHgwdm5jc2VydmVyCitbXGZJcGFyYW1ldGVyc1xmUF0KKy5TSCBERVNDUklQVElPTgorLkIgeDB2bmNzZXJ2ZXIKK2lzIGEgVk5DIHNlcnZlciB3aGljaCBjb250aW51b3VzbHkgcG9sbHMgYW55IFggZGlzcGxheSwgYWxsb3dpbmcgaXQgdG8gYmUKK2NvbnRyb2xsZWQgdmlhIFZOQy4gIEhvdyB1c2FibGUgaXQgd2lsbCBiZSBkZXBlbmRzIGEgbG90IG9uIHRoZSBtYWNoaW5lIGl0J3MKK3J1bm5pbmcgb24sIGFuZCB3aGF0IHlvdSdyZSBleHBlY3RpbmcuICBJdCB3b24ndCBiZSBhcyBmYXN0IGFzIFh2bmMgb3IgYSBuYXRpdmUKK1ggc2VydmVyIHdpdGggVk5DIHN1cHBvcnQgY29tcGlsZWQgaW4sIGJ1dCBpbiBtYW55IGNhc2VzIGl0IGlzIHRoZSBiZXN0IG9wdGlvbgorc2luY2UgaXQgaXMganVzdCBhbiBvcmRpbmFyeSBYIGFwcGxpY2F0aW9uIHJlcXVpcmluZyBubyBzcGVjaWFsIGluc3RhbGxhdGlvbi4KKworSXQgaGFzIG1hbnkgb2YgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBYdm5jLiAgUnVubmluZyBcZkJ4MHZuY3NlcnZlciAtaFxmUCB3aWxsCitnaXZlIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIHdpdGggZGVzY3JpcHRpb25zLiAgTm90ZSB0aGF0IHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkKK3NwZWNpZnkgYW4gYXBwcm9wcmlhdGUgcGFzc3dvcmQgZmlsZSB1c2luZyB0aGUgUGFzc3dvcmRGaWxlIHBhcmFtZXRlci4KKworLlNIIFNFRSBBTFNPCisuQlIgWHZuYyAoMSkKKy5CUiB2bmNwYXNzd2QgKDEpLAorLkJSIHZuY3ZpZXdlciAoMSksCisuQlIgdm5jc2VydmVyICgxKSwKKy5icgoraHR0cDovL3d3dy50aWdodHZuYy5jb20KKworLlNIIEFVVEhPUgorVHJpc3RhbiBSaWNoYXJkc29uLCBSZWFsVk5DIEx0ZC4KKworVk5DIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSB0aGUgUmVhbFZOQyB0ZWFtIHdoaWxlIGF0IE9saXZldHRpCitSZXNlYXJjaCBMdGQgLyBBVCZUIExhYm9yYXRvcmllcyBDYW1icmlkZ2UuICBUaWdodFZOQyBhZGRpdGlvbnMgd2FzCitpbXBsZW1lbnRlZCBieSBDb25zdGFudGluIEthcGxpbnNreS4gTWFueSBvdGhlciBwZW9wbGUgcGFydGljaXBhdGVkIGluCitkZXZlbG9wbWVudCwgdGVzdGluZyBhbmQgc3VwcG9ydC4KZGlmZiAtLWdpdCBhL3VuaXgveGMucGF0Y2ggYi91bml4L3hjLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTI3YjkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3hjLnBhdGNoCkBAIC0wLDAgKzEsNjcgQEAKK2RpZmYgLWJjciB4Yy5vcmcvcHJvZ3JhbXMvWHNlcnZlci9JbWFrZWZpbGUgeGMvcHJvZ3JhbXMvWHNlcnZlci9JbWFrZWZpbGUKKyoqKiB4Yy5vcmcvcHJvZ3JhbXMvWHNlcnZlci9JbWFrZWZpbGUJMjAwNC0xMi0xNSAyMDoyMjo1My4wMDAwMDAwMDAgKzAxMDAKKy0tLSB4Yy9wcm9ncmFtcy9Yc2VydmVyL0ltYWtlZmlsZQkyMDA1LTAyLTE0IDE0OjIzOjIxLjAwMDAwMDAwMCArMDEwMAorKioqKioqKioqKioqKioqCisqKiogMTI4LDEzNCAqKioqCisgICAgICAgICBMSUJSRUdFWCA9IFJlZ2V4TGlicmFyeQorICAKKyAgI2lmIERvTG9hZGFibGVTZXJ2ZXIKKyEgICAgIExJQkNXUkFQUEVSID0gb3MvbGliY3dyYXBwZXIubworICAjZW5kaWYKKyAgCisgICNpZiBCdWlsZFhwcmludAorLS0tIDEyOCwxMzQgLS0tLQorICAgICAgICAgTElCUkVHRVggPSBSZWdleExpYnJhcnkKKyAgCisgICNpZiBEb0xvYWRhYmxlU2VydmVyCishICAgICBMSUJDV1JBUFBFUiA9IG9zL2xpYmN3cmFwcGVyLm8gb3MvbGlib3MuYQorICAjZW5kaWYKKyAgCisgICNpZiBCdWlsZFhwcmludAorKioqKioqKioqKioqKioqCisqKiogNDE0LDQxOSAqKioqCistLS0gNDE0LDQzMCAtLS0tCisgICNkZWZpbmUgU2VydmVyVG9JbnN0YWxsIFhzdW4KKyAgI2VuZGlmCisgICNlbmRpZiAvKiBYc3VuU2VydmVyICovCisrIFhDT01NCisrIFhDT01NIFggVk5DIHNlcnZlcgorKyBYQ09NTQorKyBGQlNVQkRJUiA9IGZiCisrIFhWTkNERFhESVIgPSB2bmMvWHZuYworKyBYVk5DRElSUyA9ICQoU1RERElSUykgJChGQlNVQkRJUikgbWlleHQvZGFtYWdlICQoWFZOQ0REWERJUikgJChERVBESVJTKQorKyBYVk5DTElCUyA9IFByZUZiTGlicyB2bmMvWHZuYy9MaWJyYXJ5VGFyZ2V0TmFtZSh4dm5jKSBGYlBvc3RGYkxpYnMKKysgWFZOQ09CSlMgPSAkKFhWTkNERFhESVIpL3N0dWJzLm8gJChYVk5DRERYRElSKS9taWluaXRleHQubworKyBYVk5DU1lTTElCUyA9ICQoRk9OVExJQlMpICQoU1lTTElCUykKKysgU2VydmVyVGFyZ2V0KFh2bmMsJChYVk5DRElSUyksJChYVk5DT0JKUyksIFwKKysgCSQoTElCQ1dSQVBQRVIpICQoWFZOQ0xJQlMpICQoTE9BREFCTEVFWFRTKSwkKFhWTkNTWVNMSUJTKSkKKyAgCisgIAorICAjaWYgZGVmaW5lZChYc3VuMjRTZXJ2ZXIpICYmIFhzdW4yNFNlcnZlcgorZGlmZiAtYmNyIHhjLm9yZy9wcm9ncmFtcy9Yc2VydmVyL21pL21paW5pdGV4dC5jIHhjL3Byb2dyYW1zL1hzZXJ2ZXIvbWkvbWlpbml0ZXh0LmMKKyoqKiB4Yy5vcmcvcHJvZ3JhbXMvWHNlcnZlci9taS9taWluaXRleHQuYwkyMDA0LTEyLTEzIDA2OjQ4OjQxLjAwMDAwMDAwMCArMDEwMAorLS0tIHhjL3Byb2dyYW1zL1hzZXJ2ZXIvbWkvbWlpbml0ZXh0LmMJMjAwNS0wMi0xMSAxNjo0NzozNC4wMDAwMDAwMDAgKzAxMDAKKyoqKioqKioqKioqKioqKgorKioqIDI4NiwyOTEgKioqKgorLS0tIDI4NiwyOTQgLS0tLQorICAjaWZkZWYgTUlUTUlTQworICBleHRlcm4gdm9pZCBNSVRNaXNjRXh0ZW5zaW9uSW5pdChJTklUQVJHUyk7CisgICNlbmRpZgorKyAjaWZkZWYgVk5DRVhUCisrIGV4dGVybiB2b2lkIHZuY0V4dGVuc2lvbkluaXQoSU5JVEFSR1MpOworKyAjZW5kaWYKKyAgI2lmZGVmIFhJRExFCisgIGV4dGVybiB2b2lkIFhJZGxlRXh0ZW5zaW9uSW5pdChJTklUQVJHUyk7CisgICNlbmRpZgorKioqKioqKioqKioqKioqCisqKiogNTg3LDU5MiAqKioqCistLS0gNTkwLDU5OCAtLS0tCisgICNpZmRlZiBNSVRNSVNDCisgICAgICBpZiAoIW5vTUlUTWlzY0V4dGVuc2lvbikgTUlUTWlzY0V4dGVuc2lvbkluaXQoKTsKKyAgI2VuZGlmCisrICNpZmRlZiBWTkNFWFQKKysgICAgIHZuY0V4dGVuc2lvbkluaXQoKTsKKysgI2VuZGlmCisgICNpZmRlZiBYSURMRQorICAgICAgaWYgKCFub1hJZGxlRXh0ZW5zaW9uKSBYSWRsZUV4dGVuc2lvbkluaXQoKTsKKyAgI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3hjL2NvbmZpZy9jZi9ob3N0LmRlZiBiL3VuaXgveGMvY29uZmlnL2NmL2hvc3QuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTg5YWYKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3hjL2NvbmZpZy9jZi9ob3N0LmRlZgpAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8dm5jLmRlZj4KZGlmZiAtLWdpdCBhL3VuaXgveGMvY29uZmlnL2NmL3ZuYy5kZWYgYi91bml4L3hjL2NvbmZpZy9jZi92bmMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzNmNGQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3hjL2NvbmZpZy9jZi92bmMuZGVmCkBAIC0wLDAgKzEsMzYgQEAKKyNkZWZpbmUgQnVpbGRTZXJ2ZXJzT25seSBZRVMKKyNkZWZpbmUgQnVpbGRGb250cyBOTworI2RlZmluZSBCdWlsZENsaWVudHMgTk8KKyNkZWZpbmUgQnVpbGREb2NzIE5PCisjZGVmaW5lIEJ1aWxkUGV4RXh0IE5PCisjZGVmaW5lIEJ1aWxkTmxzIE5PCisjZGVmaW5lIEJ1aWxkWElFIE5PCisjZGVmaW5lIEJ1aWxkR2x4RXh0IFlFUworI2RlZmluZSBHbHhCdWlsdEluWE1lc2EgWUVTCisjZGVmaW5lIFhuZXN0U2VydmVyIFlFUworI2RlZmluZSBYRjg2U2VydmVyIE5PCisjZGVmaW5lIFhwcnRTZXJ2ZXIgTk8KKyNkZWZpbmUgQnVpbGRYRnJlZTg2Q29uZmlnVG9vbHMgTk8KKworI2lmZGVmIFN1bkFyY2hpdGVjdHVyZQorI2RlZmluZSBQcm9qZWN0Um9vdCAvdXNyL29wZW53aW4KKyNkZWZpbmUgSGFzR2NjMyBZRVMKKyNlbmRpZgorCisjZGVmaW5lIEhhc0ZyZWV0eXBlMiBOTworI2RlZmluZSBCdWlsZFZOQ0V4dCBZRVMKKyNkZWZpbmUgVk5DRXh0RGVmaW5lcyAtRFZOQ0VYVAorI2RlZmluZSBTaXRlRXh0ZW5zaW9uRGVmaW5lcyBWTkNFeHREZWZpbmVzCisjZGVmaW5lIFNpdGVFeHRlbnNpb25EaXJzIHZuYworCisjZGVmaW5lIFZuY0V4dExpYnMgJChUT1ApLy4uL3JmYi9saWJyZmIuYSBcCisgICAgICAgICAgICAgICAgICAgJChUT1ApLy4uL1hyZWdpb24vbGliWHJlZ2lvbi5hIFwKKyAgICAgICAgICAgICAgICAgICAkKFRPUCkvLi4vbmV0d29yay9saWJuZXR3b3JrLmEgXAorICAgICAgICAgICAgICAgICAgICQoVE9QKS8uLi9yZHIvbGlicmRyLmEgXAorICAgICAgICAgICAgICAgICAgICQoVE9QKS8uLi9qcGVnL2J1aWxkL2xpYmpwZWcuYQorCisjZGVmaW5lIFNpdGVFeHRlbnNpb25MaWJzIHZuYy9MaWJyYXJ5VGFyZ2V0TmFtZSh2bmMpIFZuY0V4dExpYnMKKworI2RlZmluZQlTZXJ2ZXJUYXJnZXQoc2VydmVyLHN1YmRpcnMsb2JqZWN0cyxsaWJzLHN5c2xpYnMpCQlAQFwKK0NDTElOSyA9ICQoQ1hYRU5WU0VUVVApICQoQ1hYKSBAQFwKK1NlcnZlclRhcmdldFdpdGhGbGFncyhzZXJ2ZXIsc3ViZGlycyxvYmplY3RzLGxpYnMsc3lzbGlicywkKF9OT09QXykpCmRpZmYgLS1naXQgYS91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvWHZuYy5tYW4gYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvWHZuYy5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4YmM5MwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci9Ydm5jLm1hbgpAQCAtMCwwICsxLDI4NCBAQAorLlRIIFh2bmMgMSAiMTcgQXByIDIwMDYiICJUaWdodFZOQyIgIlZpcnR1YWwgTmV0d29yayBDb21wdXRpbmciCisuU0ggTkFNRQorWHZuYyBcLSB0aGUgWCBWTkMgc2VydmVyIAorLlNIIFNZTk9QU0lTCisuQiBYdm5jCisuUkkgWyBvcHRpb25zIF0gCisuUkkgOiBkaXNwbGF5IworLlNIIERFU0NSSVBUSU9OCisuQiBYdm5jCitpcyB0aGUgWCBWTkMgKFZpcnR1YWwgTmV0d29yayBDb21wdXRpbmcpIHNlcnZlci4gIEl0IGlzIGJhc2VkIG9uIGEgc3RhbmRhcmQgWAorc2VydmVyLCBidXQgaXQgaGFzIGEgInZpcnR1YWwiIHNjcmVlbiByYXRoZXIgdGhhbiBhIHBoeXNpY2FsIG9uZS4gIFgKK2FwcGxpY2F0aW9ucyBkaXNwbGF5IHRoZW1zZWx2ZXMgb24gaXQgYXMgaWYgaXQgd2VyZSBhIG5vcm1hbCBYIGRpc3BsYXksIGJ1dAordGhleSBjYW4gb25seSBiZSBhY2Nlc3NlZCB2aWEgYSBWTkMgdmlld2VyIC0gc2VlIFxmQnZuY3ZpZXdlclxmUCgxKS4KKworU28gWHZuYyBpcyByZWFsbHkgdHdvIHNlcnZlcnMgaW4gb25lLiBUbyB0aGUgYXBwbGljYXRpb25zIGl0IGlzIGFuIFggc2VydmVyLAorYW5kIHRvIHRoZSByZW1vdGUgVk5DIHVzZXJzIGl0IGlzIGEgVk5DIHNlcnZlci4gQnkgY29udmVudGlvbiB3ZSBoYXZlIGFycmFuZ2VkCit0aGF0IHRoZSBWTkMgc2VydmVyIGRpc3BsYXkgbnVtYmVyIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIFggc2VydmVyIGRpc3BsYXkKK251bWJlciwgd2hpY2ggbWVhbnMgeW91IGNhbiB1c2UgZWcuIHNub29weToyIHRvIHJlZmVyIHRvIGRpc3BsYXkgMiBvbiBtYWNoaW5lCisic25vb3B5IiBpbiBib3RoIHRoZSBYIHdvcmxkIGFuZCB0aGUgVk5DIHdvcmxkLgorCitUaGUgYmVzdCB3YXkgb2Ygc3RhcnRpbmcgXGZCWHZuY1xmUCBpcyB2aWEgdGhlIFxmQnZuY3NlcnZlclxmUCBzY3JpcHQuICBUaGlzCitzZXRzIHVwIHRoZSBlbnZpcm9ubWVudCBhcHByb3ByaWF0ZWx5IGFuZCBydW5zIHNvbWUgWCBhcHBsaWNhdGlvbnMgdG8gZ2V0IHlvdQorZ29pbmcuICBTZWUgdGhlIG1hbnVhbCBwYWdlIGZvciBcZkJ2bmNzZXJ2ZXJcZlAoMSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKy5TSCBPUFRJT05TCisuQiBYdm5jCit0YWtlcyBsb3RzIG9mIG9wdGlvbnMgLSBydW5uaW5nIFxmQlh2bmMgLWhlbHBcZlAgZ2l2ZXMgYSBsaXN0LiAgTWFueSBvZiB0aGVzZQorYXJlIHN0YW5kYXJkIFggc2VydmVyIG9wdGlvbnMsIHdoaWNoIGFyZSBkZXNjcmliZWQgaW4gdGhlIFxmQlhzZXJ2ZXJcZlAoMSkKK21hbnVhbCBwYWdlLiAgSW4gYWRkaXRpb24gdG8gb3B0aW9ucyB3aGljaCBjYW4gb25seSBiZSBzZXQgdmlhIHRoZQorY29tbWFuZC1saW5lLCB0aGVyZSBhcmUgYWxzbyAicGFyYW1ldGVycyIgd2hpY2ggY2FuIGJlIHNldCBib3RoIHZpYSB0aGUKK2NvbW1hbmQtbGluZSBhbmQgdGhyb3VnaCB0aGUgXGZCdm5jY29uZmlnXGZQKDEpIHByb2dyYW0uCisKKy5UUAorLkIgXC1nZW9tZXRyeSBcZkl3aWR0aFxmUHhcZkloZWlnaHRcZlAKK1NwZWNpZnkgdGhlIHNpemUgb2YgdGhlIGRlc2t0b3AgdG8gYmUgY3JlYXRlZC4gRGVmYXVsdCBpcyAxMDI0eDc2OC4KKworLlRQCisuQiBcLWRlcHRoIFxmSWRlcHRoXGZQCitTcGVjaWZ5IHRoZSBwaXhlbCBkZXB0aCBpbiBiaXRzIG9mIHRoZSBkZXNrdG9wIHRvIGJlIGNyZWF0ZWQuIERlZmF1bHQgaXMgMTYsCitvdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIDgsIDE1LCBhbmQgMjQgLSBhbnl0aGluZyBlbHNlIGlzIGxpa2VseSB0byBjYXVzZQorc3RyYW5nZSBiZWhhdmlvdXIgYnkgYXBwbGljYXRpb25zLgorCisuVFAKKy5CIFwtcGl4ZWxmb3JtYXQgXGZJZm9ybWF0XGZQCitTcGVjaWZ5IHBpeGVsIGZvcm1hdCBmb3Igc2VydmVyIHRvIHVzZSAoQkdSbm5uIG9yIFJHQm5ubikuICBUaGUgZGVmYXVsdCBmb3IKK2RlcHRoIDggaXMgQkdSMjMzIChtZWFuaW5nIHRoZSBtb3N0IHNpZ25pZmljYW50IHR3byBiaXRzIHJlcHJlc2VudCBibHVlLCB0aGUKK25leHQgdGhyZWUgZ3JlZW4sIGFuZCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgdGhyZWUgcmVwcmVzZW50IHJlZCksIHRoZSBkZWZhdWx0Citmb3IgZGVwdGggMTYgaXMgUkdCNTY1IGFuZCBmb3IgZGVwdGggMjQgaXMgUkdCODg4LgorCisuVFAKKy5CIFwtY2MgMworQXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIGRlZmF1bHQgVHJ1ZUNvbG9yIHZpc3VhbCwgdGhpcyBhbGxvd3MgeW91IHRvIHJ1biBhbgorWHZuYyBzZXJ2ZXIgd2l0aCBhIFBzZXVkb0NvbG9yIHZpc3VhbCAoaS5lLiBvbmUgd2hpY2ggdXNlcyBhIGNvbG9yIG1hcCBvcgorcGFsZXR0ZSksIHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIHJ1bm5pbmcgc29tZSBvbGQgWCBhcHBsaWNhdGlvbnMgd2hpY2ggb25seQord29yayBvbiBzdWNoIGEgZGlzcGxheS4gIFZhbHVlcyBvdGhlciB0aGFuIDMgKFBzZXVkb0NvbG9yKSBhbmQgNCAoVHJ1ZUNvbG9yKQorZm9yIHRoZSBcLWNjIG9wdGlvbiBtYXkgcmVzdWx0IGluIHN0cmFuZ2UgYmVoYXZpb3VyLCBhbmQgUHNldWRvQ29sb3IgZGVza3RvcHMKK211c3QgYmUgOCBiaXRzIGRlZXAgKGkuZS4gXGZCLWRlcHRoIDhcZlApLgorCisuVFAKKy5CIFwtaW5ldGQgCitUaGlzIHNpZ25pZmljYW50bHkgY2hhbmdlcyBYdm5jJ3MgYmVoYXZpb3VyIHNvIHRoYXQgaXQgY2FuIGJlIGxhdW5jaGVkIGZyb20KK2luZXRkLiAgU2VlIHRoZSBzZWN0aW9uIGJlbG93IG9uIHVzYWdlIHdpdGggaW5ldGQuCisKKy5UUAorLkIgXC1oZWxwCitMaXN0IGFsbCB0aGUgb3B0aW9ucyBhbmQgcGFyYW1ldGVycworCisuU0ggUEFSQU1FVEVSUworVk5DIHBhcmFtZXRlcnMgY2FuIGJlIHNldCBib3RoIHZpYSB0aGUgY29tbWFuZC1saW5lIGFuZCB0aHJvdWdoIHRoZQorXGZCdm5jY29uZmlnXGZQKDEpIHByb2dyYW0sIGFuZCB3aXRoIGEgVk5DLWVuYWJsZWQgWEZyZWU4NiBzZXJ2ZXIgdmlhIE9wdGlvbnMKK2VudHJpZXMgaW4gdGhlIFhGODZDb25maWcgZmlsZS4KKworUGFyYW1ldGVycyBjYW4gYmUgdHVybmVkIG9uIHdpdGggLVxmSXBhcmFtXGZQIG9yIG9mZiB3aXRoCistXGZJcGFyYW1cZlA9MC4gIFBhcmFtZXRlcnMgd2hpY2ggdGFrZSBhIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgYXMKKy1cZklwYXJhbVxmUCBcZkl2YWx1ZVxmUC4gIE90aGVyIHZhbGlkIGZvcm1zIGFyZSBcZklwYXJhbVxmUFxmQj1cZlBcZkl2YWx1ZVxmUAorLVxmSXBhcmFtXGZQPVxmSXZhbHVlXGZQIC0tXGZJcGFyYW1cZlA9XGZJdmFsdWVcZlAuICBQYXJhbWV0ZXIgbmFtZXMgYXJlCitjYXNlLWluc2Vuc2l0aXZlLgorCisuVFAKKy5CIFwtZGVza3RvcCBcZklkZXNrdG9wLW5hbWVcZlAKK0VhY2ggZGVza3RvcCBoYXMgYSBuYW1lIHdoaWNoIG1heSBiZSBkaXNwbGF5ZWQgYnkgdGhlIHZpZXdlci4gSXQgZGVmYXVsdHMgdG8KKyJ4MTEiLgorCisuVFAKKy5CIFwtcmZicG9ydCBcZklwb3J0XGZQCitTcGVjaWZpZXMgdGhlIFRDUCBwb3J0IG9uIHdoaWNoIFh2bmMgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgZnJvbSB2aWV3ZXJzICh0aGUKK3Byb3RvY29sIHVzZWQgaW4gVk5DIGlzIGNhbGxlZCBSRkIgLSAicmVtb3RlIGZyYW1lYnVmZmVyIikuICBUaGUgZGVmYXVsdCBpcworNTkwMCBwbHVzIHRoZSBkaXNwbGF5IG51bWJlci4KKworLlRQCisuQiBcLXJmYndhaXQgXGZJdGltZVxmUCwgXC1DbGllbnRXYWl0VGltZU1pbGxpcyBcZkl0aW1lXGZQCisKK1RpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGEgdmlld2VyIHdoaWNoIGlzIGJsb2NraW5nIFh2bmMuICBUaGlzIGlzCituZWNlc3NhcnkgYmVjYXVzZSBYdm5jIGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgc29tZXRpbWVzIGJsb2NrcyB1bnRpbCB0aGUgdmlld2VyCitoYXMgZmluaXNoZWQgc2VuZGluZyBvciByZWNlaXZpbmcgYSBtZXNzYWdlIC0gbm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbWVhbiBhbgordXBkYXRlIHdpbGwgYmUgYWJvcnRlZCBhZnRlciB0aGlzIHRpbWUuICBEZWZhdWx0IGlzIDIwMDAwICgyMCBzZWNvbmRzKS4KKworLlRQCisuQiBcLWh0dHBkIFxmSWRpcmVjdG9yeVxmUAorUnVuIGEgbWluaS1IVFRQIHNlcnZlciB3aGljaCBzZXJ2ZXMgZmlsZXMgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5LiAgTm9ybWFsbHkKK3RoZSBkaXJlY3Rvcnkgd2lsbCBjb250YWluIHRoZSBjbGFzc2VzIGZvciB0aGUgSmF2YSB2aWV3ZXIuICBJbiBhZGRpdGlvbiwgZmlsZXMKK3dpdGggYSAudm5jIGV4dGVuc2lvbiB3aWxsIGhhdmUgY2VydGFpbiBzdWJzdGl0dXRpb25zIG1hZGUgc28gdGhhdCBhIHNpbmdsZQoraW5zdGFsbGF0aW9uIG9mIHRoZSBKYXZhIFZOQyB2aWV3ZXIgY2FuIGJlIHNlcnZlZCBieSBzZXBhcmF0ZSBpbnN0YW5jZXMgb2YKK1h2bmMuCisKKy5UUAorLkIgXC1odHRwUG9ydCBcZklwb3J0XGZQCitTcGVjaWZpZXMgdGhlIHBvcnQgb24gd2hpY2ggdGhlIG1pbmktSFRUUCBzZXJ2ZXIgcnVucy4gIERlZmF1bHQgaXMgNTgwMCBwbHVzCit0aGUgZGlzcGxheSBudW1iZXIuCisKKy5UUAorLkIgXC1yZmJhdXRoIFxmSXBhc3N3ZC1maWxlXGZQLCBcLVBhc3N3b3JkRmlsZSBcZklwYXNzd2QtZmlsZVxmUAorU3BlY2lmaWVzIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHBhc3N3b3JkIHVzZWQgdG8gYXV0aGVudGljYXRlIHZpZXdlcnMuICBUaGUKK2ZpbGUgaXMgYWNjZXNzZWQgZWFjaCB0aW1lIGEgY29ubmVjdGlvbiBjb21lcyBpbiwgc28gaXQgY2FuIGJlIGNoYW5nZWQgb24gdGhlCitmbHkgdmlhIFxmQnZuY3Bhc3N3ZFxmUCgxKS4KKworLlRQCisuQiBcLWRlZmVyVXBkYXRlIFxmSXRpbWVcZlAKK1h2bmMgdXNlcyBhICJkZWZlcnJlZCB1cGRhdGUiIG1lY2hhbmlzbSB3aGljaCBlbmhhbmNlcyBwZXJmb3JtYW5jZSBpbiBtYW55CitjYXNlcy4gQWZ0ZXIgYW55IGNoYW5nZSB0byB0aGUgZnJhbWVidWZmZXIsIFh2bmMgd2FpdHMgZm9yIHRoaXMgbnVtYmVyIG9mCittaWxsaXNlY29uZHMgKGRlZmF1bHQgNDApIGJlZm9yZSBzZW5kaW5nIGFuIHVwZGF0ZSB0byBhbnkgd2FpdGluZyBjbGllbnRzLiBUaGlzCittZWFucyB0aGF0IG1vcmUgY2hhbmdlcyB0ZW5kIHRvIGdldCBjb2FsZXNjZWQgdG9nZXRoZXIgaW4gYSBzaW5nbGUKK3VwZGF0ZS4gU2V0dGluZyBpdCB0byAwIHJlc3VsdHMgaW4gdGhlIHNhbWUgYmVoYXZpb3VyIGFzIGVhcmxpZXIgdmVyc2lvbnMgb2YKK1h2bmMsIHdoZXJlIHRoZSBmaXJzdCBjaGFuZ2UgdG8gdGhlIGZyYW1lYnVmZmVyIGNhdXNlcyBhbiBpbW1lZGlhdGUgdXBkYXRlIHRvCithbnkgd2FpdGluZyBjbGllbnRzLgorCisuVFAKKy5CIFwtU2VuZEN1dFRleHQKK1NlbmQgY2xpcGJvYXJkIGNoYW5nZXMgdG8gY2xpZW50cyAoZGVmYXVsdCBpcyBvbikuICBOb3RlIHRoYXQgeW91IG11c3QgYWxzbyBydW4KK1xmQnZuY2NvbmZpZ1xmUCgxKSB0byBnZXQgdGhlIGNsaXBib2FyZCB0byB3b3JrLgorCisuVFAKKy5CIFwtQWNjZXB0Q3V0VGV4dAorQWNjZXB0IGNsaXBib2FyZCB1cGRhdGVzIGZyb20gY2xpZW50cyAoZGVmYXVsdCBpcyBvbikuICBOb3RlIHRoYXQgeW91IG11c3QgYWxzbworcnVuIFxmQnZuY2NvbmZpZ1xmUCgxKSB0byBnZXQgdGhlIGNsaXBib2FyZCB0byB3b3JrLgorCisuVFAKKy5CIFwtQWNjZXB0UG9pbnRlckV2ZW50cworQWNjZXB0IHBvaW50ZXIgcHJlc3MgYW5kIHJlbGVhc2UgZXZlbnRzIGZyb20gY2xpZW50cyAoZGVmYXVsdCBpcyBvbikuCisKKy5UUAorLkIgXC1BY2NlcHRLZXlFdmVudHMKK0FjY2VwdCBrZXkgcHJlc3MgYW5kIHJlbGVhc2UgZXZlbnRzIGZyb20gY2xpZW50cyAoZGVmYXVsdCBpcyBvbikuCisKKy5UUAorLkIgXC1EaXNjb25uZWN0Q2xpZW50cworRGlzY29ubmVjdCBleGlzdGluZyBjbGllbnRzIGlmIGFuIGluY29taW5nIGNvbm5lY3Rpb24gaXMgbm9uLXNoYXJlZCAoZGVmYXVsdCBpcworb24pLiBJZiBcZkJEaXNjb25uZWN0Q2xpZW50c1xmUCBpcyBmYWxzZSwgdGhlbiBhIG5ldyBub24tc2hhcmVkIGNvbm5lY3Rpb24gd2lsbAorYmUgcmVmdXNlZCB3aGlsZSB0aGVyZSBpcyBhIGNsaWVudCBhY3RpdmUuICBXaGVuIGNvbWJpbmVkIHdpdGgKK1xmQk5ldmVyU2hhcmVkXGZQIHRoaXMgbWVhbnMgb25seSBvbmUgY2xpZW50IGlzIGFsbG93ZWQgYXQgYSB0aW1lLgorCisuVFAKKy5CIFwtTmV2ZXJTaGFyZWQKK05ldmVyIHRyZWF0IGluY29taW5nIGNvbm5lY3Rpb25zIGFzIHNoYXJlZCwgcmVnYXJkbGVzcyBvZiB0aGUgY2xpZW50LXNwZWNpZmllZAorc2V0dGluZyAoZGVmYXVsdCBpcyBvZmYpLgorCisuVFAKKy5CIFwtQWx3YXlzU2hhcmVkCitBbHdheXMgdHJlYXQgaW5jb21pbmcgY29ubmVjdGlvbnMgYXMgc2hhcmVkLCByZWdhcmRsZXNzIG9mIHRoZSBjbGllbnQtc3BlY2lmaWVkCitzZXR0aW5nIChkZWZhdWx0IGlzIG9mZikuCisKKy5UUAorLkIgXC1Qcm90b2NvbDMuMworQWx3YXlzIHVzZSBwcm90b2NvbCB2ZXJzaW9uIDMuMyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBiYWRseS1iZWhhdmVkCitjbGllbnRzIChkZWZhdWx0IGlzIG9mZikuCisKKy5UUAorLkIgXC1Db21wYXJlRkIKK1BlcmZvcm0gcGl4ZWwgY29tcGFyaXNvbiBvbiBmcmFtZWJ1ZmZlciB0byByZWR1Y2UgdW5uZWNlc3NhcnkgdXBkYXRlcyAoZGVmYXVsdAoraXMgb24pLgorCisuVFAKKy5CIFwtU2VjdXJpdHlUeXBlcyBcZklzZWMtdHlwZXNcZlAKK1NwZWNpZnkgd2hpY2ggc2VjdXJpdHkgc2NoZW1lcyB0byB1c2Ugc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEF0IHByZXNlbnQgb25seQorIk5vbmUiIGFuZCAiVm5jQXV0aCIgYXJlIHN1cHBvcnRlZC4gIFRoZSBkZWZhdWx0IGlzICJWbmNBdXRoIiAtIG5vdGUgdGhhdCBpZgoreW91IHdhbnQgYSBzZXJ2ZXIgd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBhIHBhc3N3b3JkLCB5b3UgbXVzdCBzZXQgdGhpcworcGFyYW1ldGVyIHRvICJOb25lIi4KKworLlRQCisuQiBcLUlkbGVUaW1lb3V0IFxmSXNlY29uZHNcZlAKK1RoZSBudW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB3aGljaCBhbiBpZGxlIFZOQyBjb25uZWN0aW9uIHdpbGwgYmUgZHJvcHBlZAorKGRlZmF1bHQgaXMgMCwgd2hpY2ggbWVhbnMgdGhhdCBpZGxlIGNvbm5lY3Rpb25zIHdpbGwgbmV2ZXIgYmUgZHJvcHBlZCkuCisKKy5UUAorLkIgXC1RdWVyeUNvbm5lY3QKK1Byb21wdHMgdGhlIHVzZXIgb2YgdGhlIGRlc2t0b3AgdG8gZXhwbGljaXRseSBhY2NlcHQgb3IgcmVqZWN0IGluY29taW5nCitjb25uZWN0aW9ucy4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlbiB1c2luZyB0aGUgdm5jLnNvIG1vZHVsZSBvcgorXGZCeDB2bmNzZXJ2ZXJcZlAoMSkgcHJvZ3JhbSB0byBhY2Nlc3MgYW4gZXhpc3RpbmcgWCBkZXNrdG9wIHZpYSBWTkMuCisKK1RoZSBcZkJ2bmNjb25maWdcZlAoMSkgcHJvZ3JhbSBtdXN0IGJlIHJ1bm5pbmcgb24gdGhlIGRlc2t0b3AgaW4gb3JkZXIgZm9yCitRdWVyeUNvbm5lY3QgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBcZkJ2bmMuc29cZlAoMSkgbW9kdWxlIG9yCitcZkJYdm5jXGZQKDEpIHByb2dyYW0uICBUaGUgXGZCeDB2bmNzZXJ2ZXJcZlAoMSkgcHJvZ3JhbSBkb2VzIG5vdCByZXF1aXJlCitcZkJ2bmNjb25maWdcZlAoMSkgdG8gYmUgcnVubmluZy4KKworLlRQCisuQiBcLWxvY2FsaG9zdAorT25seSBhbGxvdyBjb25uZWN0aW9ucyBmcm9tIHRoZSBzYW1lIG1hY2hpbmUuIFVzZWZ1bCBpZiB5b3UgdXNlIFNTSCBhbmQgd2FudCB0bworc3RvcCBub24tU1NIIGNvbm5lY3Rpb25zIGZyb20gYW55IG90aGVyIGhvc3RzLiBTZWUgdGhlIGd1aWRlIHRvIHVzaW5nIFZOQyB3aXRoCitTU0ggb24gdGhlIHdlYiBzaXRlLgorCisuVFAKKy5CIFwtbG9nIFxmSWxvZ25hbWVcZlA6XGZJZGVzdFxmUDpcZklsZXZlbFxmUAorQ29uZmlndXJlcyB0aGUgZGVidWcgbG9nIHNldHRpbmdzLiAgXGZJZGVzdFxmUCBjYW4gY3VycmVudGx5IGJlIFxmQnN0ZGVyclxmUCBvcgorXGZCc3Rkb3V0XGZQLCBhbmQgXGZJbGV2ZWxcZlAgaXMgYmV0d2VlbiAwIGFuZCAxMDAsIDEwMCBtZWFuaW5nIG1vc3QgdmVyYm9zZQorb3V0cHV0LiAgXGZJbG9nbmFtZVxmUCBpcyB1c3VhbGx5IFxmQipcZlAgbWVhbmluZyBhbGwsIGJ1dCB5b3UgY2FuIHRhcmdldCBhCitzcGVjaWZpYyBzb3VyY2UgZmlsZSBpZiB5b3Uga25vdyB0aGUgbmFtZSBvZiBpdHMgIkxvZ1dyaXRlciIuICBEZWZhdWx0IGlzCitcZkIqOnN0ZGVycjozMFxmUC4KKworLlRQCisuQiBcLVJlbWFwS2V5cyBcZkltYXBwaW5nCitTZXRzIHVwIGEga2V5Ym9hcmQgbWFwcGluZy4KKy5JIG1hcHBpbmcKK2lzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyBvZiBjaGFyYWN0ZXIgbWFwcGluZ3MsIGVhY2ggb2YgdGhlIGZvcm0KKy5JUiBjaGFyIC0+IGNoYXIgLAorb3IKKy5JUiBjaGFyIDw+IGNoYXIgLAord2hlcmUKKy5JIGNoYXIKK2lzIGEgaGV4YWRlY2ltYWwga2V5c3ltLiBGb3IgZXhhbXBsZSwgdG8gZXhjaGFuZ2UgdGhlICIgYW5kIEAgc3ltYm9scyB5b3Ugd291bGQgc3BlY2lmeSB0aGUgZm9sbG93aW5nOgorLklQICIiIDEwCitSZW1hcEtleXM9MHgyMjw+MHg0MAorCisuU0ggVVNBR0UgV0lUSCBJTkVURAorQnkgY29uZmlndXJpbmcgdGhlIFxmQmluZXRkXGZQKDEpIHNlcnZpY2UgYXBwcm9wcmlhdGVseSwgWHZuYyBjYW4gYmUgbGF1bmNoZWQKK29uIGRlbWFuZCB3aGVuIGEgY29ubmVjdGlvbiBjb21lcyBpbiwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGJlIHN0YXJ0ZWQKK21hbnVhbGx5LiAgV2hlbiBnaXZlbiB0aGUgXGZCLWluZXRkXGZQIG9wdGlvbiwgaW5zdGVhZCBvZiBsaXN0ZW5pbmcgZm9yIFRDUAorY29ubmVjdGlvbnMgb24gYSBnaXZlbiBwb3J0IGl0IHVzZXMgaXRzIHN0YW5kYXJkIGlucHV0IGFuZCBzdGFuZGFyZCBvdXRwdXQuCitUaGVyZSBhcmUgdHdvIG1vZGVzIGNvbnRyb2xsZWQgYnkgdGhlIHdhaXQvbm93YWl0IGVudHJ5IGluIHRoZSBpbmV0ZC5jb25mIGZpbGUuCisKK0luIHRoZSBub3dhaXQgbW9kZSwgWHZuYyB1c2VzIGl0cyBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IGRpcmVjdGx5IGFzIHRoZQorY29ubmVjdGlvbiB0byBhIHZpZXdlci4gIEl0IG5ldmVyIGhhcyBhIGxpc3RlbmluZyBzb2NrZXQsIHNvIGNhbm5vdCBhY2NlcHQKK2Z1cnRoZXIgY29ubmVjdGlvbnMgZnJvbSB2aWV3ZXJzIChpdCBjYW4gaG93ZXZlciBjb25uZWN0IG91dCB0byBsaXN0ZW5pbmcKK3ZpZXdlcnMgYnkgdXNlIG9mIHRoZSB2bmNjb25maWcgcHJvZ3JhbSkuICBGdXJ0aGVyIHZpZXdlciBjb25uZWN0aW9ucyB0byB0aGUKK3NhbWUgVENQIHBvcnQgcmVzdWx0IGluIGluZXRkIHNwYXduaW5nIG9mZiBhIG5ldyBYdm5jIHRvIGRlYWwgd2l0aCBlYWNoCitjb25uZWN0aW9uLiAgV2hlbiB0aGUgY29ubmVjdGlvbiB0byB0aGUgdmlld2VyIGRpZXMsIHRoZSBYdm5jIGFuZCBhbnkKK2Fzc29jaWF0ZWQgWCBjbGllbnRzIGRpZS4gIFRoaXMgYmVoYXZpb3VyIGlzIG1vc3QgdXNlZnVsIHdoZW4gY29tYmluZWQgd2l0aCB0aGUKK1hETUNQIG9wdGlvbnMgLXF1ZXJ5IGFuZCAtb25jZS4gIEFuIHR5cGljYWwgZXhhbXBsZSBpbiBpbmV0ZC5jb25mIG1pZ2h0IGJlIChhbGwKK29uIG9uZSBsaW5lKToKKworNTk1MCAgIHN0cmVhbSAgIHRjcCBub3dhaXQgbm9ib2R5ICAvdXNyL2xvY2FsL2Jpbi9Ydm5jIFh2bmMgLWluZXRkIC1xdWVyeQorbG9jYWxob3N0IC1vbmNlIHNlY3VyaXR5dHlwZXM9bm9uZQorCitJbiB0aGlzIGV4YW1wbGUgYSB2aWV3ZXIgY29ubmVjdGlvbiB0byA6NTAgd2lsbCByZXN1bHQgaW4gYSBuZXcgWHZuYyBmb3IgdGhhdAorY29ubmVjdGlvbiB3aGljaCBzaG91bGQgZGlzcGxheSB0aGUgc3RhbmRhcmQgWERNIGxvZ2luIHNjcmVlbiBvbiB0aGF0IG1hY2hpbmUuCitCZWNhdXNlIHRoZSB1c2VyIG5lZWRzIHRvIGxvZ2luIHZpYSBYRE0sIGl0IGlzIHVzdWFsbHkgT0sgdG8gYWNjZXB0IGNvbm5lY3Rpb25zCit3aXRob3V0IGEgVk5DIHBhc3N3b3JkIGluIHRoaXMgY2FzZS4KKworSW4gdGhlIHdhaXQgbW9kZSwgd2hlbiB0aGUgZmlyc3QgY29ubmVjdGlvbiBjb21lcyBpbiwgaW5ldGQgZ2l2ZXMgdGhlIGxpc3RlbmluZworc29ja2V0IHRvIFh2bmMuICBUaGlzIG1lYW5zIHRoYXQgZm9yIGEgZ2l2ZW4gVENQIHBvcnQsIHRoZXJlIGlzIG9ubHkgZXZlciBvbmUKK1h2bmMgYXQgYSB0aW1lLiAgRnVydGhlciB2aWV3ZXIgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgcG9ydCBhcmUgYWNjZXB0ZWQgYnkKK3RoZSBzYW1lIFh2bmMgaW4gdGhlIG5vcm1hbCB3YXkuICBFdmVuIHdoZW4gdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24gaXMgYnJva2VuLAordGhlIFh2bmMgd2lsbCBjb250aW51ZSB0byBydW4uICBJZiB0aGlzIGlzIHVzZWQgd2l0aCB0aGUgWERNQ1Agb3B0aW9ucyAtcXVlcnkKK2FuZCAtb25jZSwgdGhlIFh2bmMgYW5kIGFzc29jaWF0ZWQgWCBjbGllbnRzIHdpbGwgZGllIHdoZW4gdGhlIHVzZXIgbG9ncyBvdXQgb2YKK3RoZSBYIHNlc3Npb24gaW4gdGhlIG5vcm1hbCB3YXkuICBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIGEgVk5DIHBhc3N3b3JkIGluIHRoaXMKK2Nhc2UuICBBIHR5cGljYWwgZW50cnkgaW4gaW5ldGQuY29uZiBtaWdodCBiZToKKworNTk1MSAgIHN0cmVhbSAgIHRjcCB3YWl0ICAgamFtZXMgICAgIC91c3IvbG9jYWwvYmluL1h2bmMgWHZuYyAtaW5ldGQgLXF1ZXJ5IGxvY2FsaG9zdCAtb25jZSBwYXNzd29yZEZpbGU9L2hvbWUvamFtZXMvLnZuYy9wYXNzd2QKKworSW4gZmFjdCB0eXBpY2FsbHksIHlvdSB3b3VsZCBoYXZlIG9uZSBlbnRyeSBmb3IgZWFjaCB1c2VyIHdobyB1c2VzIFZOQworcmVndWxhcmx5LCBlYWNoIG9mIHdob20gaGFzIHRoZWlyIG93biBkZWRpY2F0ZWQgVENQIHBvcnQgd2hpY2ggdGhleSB1c2UuICBJbgordGhpcyBleGFtcGxlLCB3aGVuIHVzZXIgImphbWVzIiBjb25uZWN0cyB0byA6NTEsIGhlIGVudGVycyBoaXMgVk5DIHBhc3N3b3JkLAordGhlbiBnZXRzIHRoZSBYRE0gbG9naW4gc2NyZWVuIHdoZXJlIGhlIGxvZ3MgaW4gaW4gdGhlIG5vcm1hbCB3YXkuICBIb3dldmVyLAordW5saWtlIHRoZSBwcmV2aW91cyBleGFtcGxlLCBpZiBoZSBkaXNjb25uZWN0cywgdGhlIHNlc3Npb24gcmVtYWlucyBwZXJzaXN0ZW50LAorYW5kIHdoZW4gaGUgcmVjb25uZWN0cyBoZSB3aWxsIGdldCB0aGUgc2FtZSBzZXNzaW9uIGJhY2sgYWdhaW4uICBXaGVuIGhlIGxvZ3MKK291dCBvZiB0aGUgWCBzZXNzaW9uLCB0aGUgWHZuYyB3aWxsIGRpZSwgYnV0IG9mIGNvdXJzZSBhIG5ldyBvbmUgd2lsbCBiZQorY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHRoZSBuZXh0IHRpbWUgaGUgY29ubmVjdHMuCisKKy5TSCBTRUUgQUxTTworLkJSIHZuY2NvbmZpZyAoMSksCisuQlIgdm5jcGFzc3dkICgxKSwKKy5CUiB2bmNzZXJ2ZXIgKDEpLAorLkJSIHZuY3ZpZXdlciAoMSksCisuQlIgWHNlcnZlciAoMSksCisuQlIgaW5ldGQgKDEpCisuYnIKK2h0dHA6Ly93d3cudGlnaHR2bmMuY29tCisKKy5TSCBBVVRIT1IKK1RyaXN0YW4gUmljaGFyZHNvbiwgUmVhbFZOQyBMdGQuCisKK1ZOQyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgdGhlIFJlYWxWTkMgdGVhbSB3aGlsZSBhdCBPbGl2ZXR0aQorUmVzZWFyY2ggTHRkIC8gQVQmVCBMYWJvcmF0b3JpZXMgQ2FtYnJpZGdlLiAgVGlnaHRWTkMgYWRkaXRpb25zIHdhcworaW1wbGVtZW50ZWQgYnkgQ29uc3RhbnRpbiBLYXBsaW5za3kuIE1hbnkgb3RoZXIgcGVvcGxlIHBhcnRpY2lwYXRlZCBpbgorZGV2ZWxvcG1lbnQsIHRlc3RpbmcgYW5kIHN1cHBvcnQuCmRpZmYgLS1naXQgYS91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL0ltYWtlZmlsZSBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvSW1ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODEzMmQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL0ltYWtlZmlsZQpAQCAtMCwwICsxLDQ0IEBACitYQ09NTSBDREVCVUdGTEFHUyA9IC1nCitYQ09NTSBDWFhERUJVR0ZMQUdTID0gLWcKKworICAgICAgIFZOQ1RPUCA9ICQoVE9QKS8uLgorICAgVk5DSU5DTFVERSA9IC1JJChWTkNUT1ApIC1JJChWTkNUT1ApL3ZuY2NvbmZpZ191bml4CisKKyNkZWZpbmUgQ3BsdXNwbHVzU291cmNlCisKKyNpZiBEb0xvYWRhYmxlU2VydmVyCisjZGVmaW5lIElIYXZlU3ViZGlycworI2VuZGlmCisKKyNpbmNsdWRlIDxTZXJ2ZXIudG1wbD4KKworI2lmIERvTG9hZGFibGVTZXJ2ZXIKKyAgICAgICBNT0RVTEVfU1VCRElSUyA9IG1vZHVsZQorI2VuZGlmCisgICAgICAgICBTUkNTID0gdm5jRXh0SW5pdC5jYyB2bmNIb29rcy5jYyBYc2VydmVyRGVza3RvcC5jYworICAgICAgICAgT0JKUyA9IHZuY0V4dEluaXQubyB2bmNIb29rcy5vIFhzZXJ2ZXJEZXNrdG9wLm8KKyAgICAgSU5DTFVERVMgPSAtSS4uL2luY2x1ZGUgLUkkKEVYVElOQ1NSQykgLUkkKFhJTkNMVURFU1JDKSAtSSQoRk9OVElOQ1NSQykgXAorICAgICAgICAgICAgICAgIC1JLi4vcmVuZGVyICQoVk5DSU5DTFVERSkKKyNpZiBkZWZpbmVkKFhGcmVlODZWZXJzaW9uKSAmJiBYRnJlZTg2VmVyc2lvbiA+PSA0MDAwCisgICBWTkNERUZJTkVTID0gLURHQ19IQVNfQ09NUE9TSVRFX0NMSVAKKyNlbmRpZgorI2lmIGRlZmluZWQoUHJvamVjdFgpICYmIChQcm9qZWN0WCA+PSA2MDQpCisgICBWTkNERUZJTkVTID0gLURHQ19IQVNfQ09NUE9TSVRFX0NMSVAKKyNlbmRpZgorICAgICAgREVGSU5FUyA9ICQoU1REX0RFRklORVMpICQoVk5DREVGSU5FUykgLVVYRnJlZTg2TE9BREVSCisKKyNkZWZpbmUgSUhhdmVTdWJkaXJzCitTVUJESVJTID0gWHZuYyAkKE1PRFVMRV9TVUJESVJTKQorCitOb3JtYWxMaWJyYXJ5VGFyZ2V0KHZuYywkKE9CSlMpKQorTGludExpYnJhcnlUYXJnZXQodm5jLCQoU1JDUykpCitOb3JtYWxMaW50VGFyZ2V0KCQoU1JDUykpCisKK05vcm1hbExpYnJhcnlPYmplY3RSdWxlKCkKK05vcm1hbENwbHVzcGx1c09iamVjdFJ1bGUoKQorCisKK01ha2VTdWJkaXJzKCQoU1VCRElSUykpCitEZXBlbmRTdWJkaXJzKCQoU1VCRElSUykpCisKK0RlcGVuZFRhcmdldCgpCmRpZmYgLS1naXQgYS91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL1JlZ2lvbkhlbHBlci5oIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9SZWdpb25IZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRjODlmCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9SZWdpb25IZWxwZXIuaApAQCAtMCwwICsxLDg0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fUkVHSU9OSEVMUEVSX0hfXworI2RlZmluZSBfX1JFR0lPTkhFTFBFUl9IX18KKworLy8gUmVnaW9uSGVscGVyIGlzIGEgY2xhc3Mgd2hpY2ggaGVscHMgaW4gdXNpbmcgWCBzZXJ2ZXIgcmVnaW9ucyBieQorLy8gYXV0b21hdGljYWxseSBmcmVlaW5nIHRoZW0gaW4gdGhlIGRlc3RydWN0b3IuICBJdCBhbHNvIGZpeGVzIGEgcHJvYmxlbSB3aXRoCisvLyBSRUdJT05fSU5JVCB3aGVuIGdpdmVuIGFuIGVtcHR5IHJlY3RhbmdsZS4KKworLy8gUkVHSU9OX05VTEwgd2FzIGludHJvZHVjZWQgaW4gdGhlIFhvcmcgdHJlZSBhcyB0aGUgd2F5IHRvIGluaXRpYWxpc2UgYW4KKy8vIGVtcHR5IHJlZ2lvbi4gIElmIGl0J3Mgbm90IGFscmVhZHkgZGVmaW5lZCBkbyBpdCB0aGUgb2xkIHdheS4gIE5vdGUgdGhhdCB0aGUKKy8vIG9sZCB3YXkgY2F1c2VzIGEgc2VnZmF1bHQgaW4gdGhlIG5ldyB0cmVlLi4uCisjaWZuZGVmIFJFR0lPTl9OVUxMCisjZGVmaW5lIFJFR0lPTl9OVUxMKHBTY3JlZW4scFJlZykgUkVHSU9OX0lOSVQocFNjcmVlbixwUmVnLE51bGxCb3gsMCkKKyNlbmRpZgorCitjbGFzcyBSZWdpb25IZWxwZXIgeworcHVibGljOgorCisgIC8vIGNvbnN0cnVjdG9yIGZyb20gYSBzaW5nbGUgcmVjdAorICBSZWdpb25IZWxwZXIoU2NyZWVuUHRyIHBTY3JlZW5fLCBCb3hQdHIgcmVjdCwgaW50IHNpemUpCisgICAgOiBwU2NyZWVuKHBTY3JlZW5fKSwgcmVnKDApCisgIHsKKyAgICBpbml0KHJlY3QsIHNpemUpOworICB9CisKKyAgLy8gY29uc3RydWN0b3IgZnJvbSBhbiBleGlzdGluZyBYIHNlcnZlciByZWdpb24KKyAgUmVnaW9uSGVscGVyKFNjcmVlblB0ciBwU2NyZWVuXywgUmVnaW9uUHRyIHBSZWdpb24pCisgICAgOiBwU2NyZWVuKHBTY3JlZW5fKSwgcmVnKCZyZWdSZWMpCisgIHsKKyAgICBSRUdJT05fTlVMTChwU2NyZWVuLCByZWcpOworICAgIFJFR0lPTl9DT1BZKHBTY3JlZW4sIHJlZywgcFJlZ2lvbik7CisgIH0KKworICAvLyBjb25zdHJ1Y3RvciBmcm9tIGFuIGFycmF5IG9mIHJlY3RhbmdsZXMKKyAgUmVnaW9uSGVscGVyKFNjcmVlblB0ciBwU2NyZWVuXywgaW50IG5yZWN0cywgeFJlY3RhbmdsZVB0ciByZWN0cywKKyAgICAgICAgICAgICAgIGludCBjdHlwZT1DVF9OT05FKQorICAgIDogcFNjcmVlbihwU2NyZWVuXykKKyAgeworICAgIHJlZyA9IFJFQ1RTX1RPX1JFR0lPTihwU2NyZWVuLCBucmVjdHMsIHJlY3RzLCBjdHlwZSk7CisgIH0KKworICAvLyBjb25zdHJ1Y3RvciBmb3IgY2FsbGluZyBpbml0KCkgbGF0ZXIKKyAgUmVnaW9uSGVscGVyKFNjcmVlblB0ciBwU2NyZWVuXykgOiBwU2NyZWVuKHBTY3JlZW5fKSwgcmVnKDApIHsKKyAgfQorCisgIHZvaWQgaW5pdChCb3hQdHIgcmVjdCwgaW50IHNpemUpIHsKKyAgICByZWcgPSAmcmVnUmVjOworICAgIGlmICghcmVjdCB8fCAocmVjdCAmJiAocmVjdC0+eDIgPT0gcmVjdC0+eDEgfHwgcmVjdC0+eTIgPT0gcmVjdC0+eTEpKSkgeworICAgICAgUkVHSU9OX05VTEwocFNjcmVlbiwgcmVnKTsKKyAgICB9IGVsc2UgeworICAgICAgUkVHSU9OX0lOSVQocFNjcmVlbiwgcmVnLCByZWN0LCBzaXplKTsKKyAgICB9CisgIH0KKworICAvLyBkZXN0cnVjdG9yIGZyZWVzIGFzIGFwcHJvcHJpYXRlCisgIH5SZWdpb25IZWxwZXIoKSB7CisgICAgaWYgKHJlZyA9PSAmcmVnUmVjKSB7CisgICAgICBSRUdJT05fVU5JTklUKHBTY3JlZW4sIHJlZyk7CisgICAgfSBlbHNlIGlmIChyZWcpIHsKKyAgICAgIFJFR0lPTl9ERVNUUk9ZKHBTY3JlZW4sIHJlZyk7CisgICAgfQorICB9CisgIFNjcmVlblB0ciBwU2NyZWVuOworICBSZWdpb25SZWMgcmVnUmVjOworICBSZWdpb25QdHIgcmVnOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL1hzZXJ2ZXJEZXNrdG9wLmNjIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Yc2VydmVyRGVza3RvcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVlYTBmCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Yc2VydmVyRGVza3RvcC5jYwpAQCAtMCwwICsxLDExNDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBYc2VydmVyRGVza3RvcC5jeHgKKy8vCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxuZXR3b3JrL1RjcFNvY2tldC5oPgorI2luY2x1ZGUgPHJmYi9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxyZmIvVk5DU2VydmVyU1QuaD4KKyNpbmNsdWRlIDxyZmIvSFRUUFNlcnZlci5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxyZmIvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgIlhzZXJ2ZXJEZXNrdG9wLmgiCisjaW5jbHVkZSAidm5jRXh0SW5pdC5oIgorCitleHRlcm4gIkMiIHsKKyNkZWZpbmUgcHVibGljIGNfcHVibGljCisjZGVmaW5lIGNsYXNzIGNfY2xhc3MKKworICAvLyB3aW5kb3dUYWJsZSBpcyBpbiBnbG9iYWxzLmggaW4gWEZyZWUgNCwgYnV0IG5vdCBpbiBYRnJlZSAzIHVuZm9ydHVuYXRlbHkKK2V4dGVybiBXaW5kb3dQdHIgKldpbmRvd1RhYmxlOworZXh0ZXJuIGNoYXIgKmRpc3BsYXk7CisKKyNpbmNsdWRlICJpbnB1dHN0ci5oIgorI2luY2x1ZGUgInNlcnZlcm1kLmgiCisjaW5jbHVkZSAiY29sb3JtYXBzdC5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCisjaW5jbHVkZSAiY3Vyc29yc3RyLmgiCisjaW5jbHVkZSAid2luZG93c3RyLmgiCisjZGVmaW5lIFhLX0NZUklMTElDCisjaW5jbHVkZSAia2V5c3ltLmgiCisjdW5kZWYgcHVibGljCisjdW5kZWYgY2xhc3MKK30KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKK3VzaW5nIG5hbWVzcGFjZSBuZXR3b3JrOworCitzdGF0aWMgTG9nV3JpdGVyIHZsb2coIlhzZXJ2ZXJEZXNrdG9wIik7CisKK3JmYjo6SW50UGFyYW1ldGVyIGRlZmVyVXBkYXRlVGltZSgiRGVmZXJVcGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBkZWZlciB1cGRhdGVzIiw0MCk7CisKK3JmYjo6Qm9vbFBhcmFtZXRlciBhbHdheXNTZXREZWZlclVwZGF0ZVRpbWVyKCJBbHdheXNTZXREZWZlclVwZGF0ZVRpbWVyIiwKKyAgICAgICAgICAgICAgICAgICJBbHdheXMgcmVzZXQgdGhlIGRlZmVyIHVwZGF0ZSB0aW1lciBvbiBldmVyeSBjaGFuZ2UiLGZhbHNlKTsKKworSW50UGFyYW1ldGVyIHF1ZXJ5Q29ubmVjdFRpbWVvdXQoIlF1ZXJ5Q29ubmVjdFRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBzZWNvbmRzIHRvIHNob3cgdGhlIEFjY2VwdCBDb25uZWN0aW9uIGRpYWxvZyBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlamVjdGluZyB0aGUgY29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCk7CisKK3N0YXRpYyBLZXlDb2RlIEtleXN5bVRvS2V5Y29kZShLZXlTeW1zUHRyIGtleW1hcCwgS2V5U3ltIGtzLCBpbnQqIGNvbCk7CisKK3N0YXRpYyByZHI6OlU4IHJldmVyc2VCaXRzW10gPSB7CisgIDB4MDAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4MjAsIDB4YTAsIDB4NjAsIDB4ZTAsIDB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsCisgIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsIDB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsCisgIDB4MTgsIDB4OTgsIDB4NTgsIDB4ZDgsIDB4MzgsIDB4YjgsIDB4NzgsIDB4ZjgsIDB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsCisgIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsIDB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsCisgIDB4MGMsIDB4OGMsIDB4NGMsIDB4Y2MsIDB4MmMsIDB4YWMsIDB4NmMsIDB4ZWMsIDB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsCisgIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsIDB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsCisgIDB4MTIsIDB4OTIsIDB4NTIsIDB4ZDIsIDB4MzIsIDB4YjIsIDB4NzIsIDB4ZjIsIDB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsCisgIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsIDB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsCisgIDB4MDYsIDB4ODYsIDB4NDYsIDB4YzYsIDB4MjYsIDB4YTYsIDB4NjYsIDB4ZTYsIDB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsCisgIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsIDB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsCisgIDB4MWUsIDB4OWUsIDB4NWUsIDB4ZGUsIDB4M2UsIDB4YmUsIDB4N2UsIDB4ZmUsIDB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsCisgIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsIDB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsCisgIDB4MDksIDB4ODksIDB4NDksIDB4YzksIDB4MjksIDB4YTksIDB4NjksIDB4ZTksIDB4MTksIDB4OTksIDB4NTksIDB4ZDksCisgIDB4MzksIDB4YjksIDB4NzksIDB4ZjksIDB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsCisgIDB4MTUsIDB4OTUsIDB4NTUsIDB4ZDUsIDB4MzUsIDB4YjUsIDB4NzUsIDB4ZjUsIDB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsCisgIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsIDB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsCisgIDB4MDMsIDB4ODMsIDB4NDMsIDB4YzMsIDB4MjMsIDB4YTMsIDB4NjMsIDB4ZTMsIDB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsCisgIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsIDB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsCisgIDB4MWIsIDB4OWIsIDB4NWIsIDB4ZGIsIDB4M2IsIDB4YmIsIDB4N2IsIDB4ZmIsIDB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsCisgIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsIDB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsCisgIDB4MGYsIDB4OGYsIDB4NGYsIDB4Y2YsIDB4MmYsIDB4YWYsIDB4NmYsIDB4ZWYsIDB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsCisgIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmYKK307CisKKworY2xhc3MgRmlsZUhUVFBTZXJ2ZXIgOiBwdWJsaWMgcmZiOjpIVFRQU2VydmVyIHsKK3B1YmxpYzoKKyAgRmlsZUhUVFBTZXJ2ZXIoWHNlcnZlckRlc2t0b3AqIGQpIDogZGVza3RvcChkKSB7fQorICB2aXJ0dWFsIH5GaWxlSFRUUFNlcnZlcigpIHt9CisKKyAgdmlydHVhbCByZHI6OkluU3RyZWFtKiBnZXRGaWxlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqKiBjb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29udGVudExlbmd0aCwgdGltZV90KiBsYXN0TW9kaWZpZWQpCisgIHsKKyAgICBpZiAobmFtZVswXSAhPSAnLycgfHwgc3Ryc3RyKG5hbWUsICIuLiIpICE9IDApIHsKKyAgICAgIHZsb2cuaW5mbygiaHR0cCByZXF1ZXN0IHdhcyBmb3IgaW52YWxpZCBmaWxlIG5hbWUiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzdHJjbXAobmFtZSwgIi8iKSA9PSAwKSBuYW1lID0gIi9pbmRleC52bmMiOworCisgICAgQ2hhckFycmF5IGh0dHBEaXJTdHIoaHR0cERpci5nZXREYXRhKCkpOworICAgIENoYXJBcnJheSBmbmFtZShzdHJsZW4oaHR0cERpclN0ci5idWYpK3N0cmxlbihuYW1lKSsxKTsKKyAgICBzcHJpbnRmKGZuYW1lLmJ1ZiwgIiVzJXMiLCBodHRwRGlyU3RyLmJ1ZiwgbmFtZSk7CisgICAgaW50IGZkID0gb3BlbihmbmFtZS5idWYsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gMDsKKyAgICByZHI6OkluU3RyZWFtKiBpcyA9IG5ldyByZHI6OkZkSW5TdHJlYW0oZmQsIC0xLCAwLCB0cnVlKTsKKyAgICAqY29udGVudFR5cGUgPSBndWVzc0NvbnRlbnRUeXBlKG5hbWUsICpjb250ZW50VHlwZSk7CisgICAgaWYgKHN0cmxlbihuYW1lKSA+IDQgJiYgc3RyY2FzZWNtcCgmbmFtZVtzdHJsZW4obmFtZSktNF0sICIudm5jIikgPT0gMCkgeworICAgICAgaXMgPSBuZXcgcmRyOjpTdWJzdGl0dXRpbmdJblN0cmVhbShpcywgZGVza3RvcCwgMjApOworICAgICAgKmNvbnRlbnRUeXBlID0gInRleHQvaHRtbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBzdGF0IHN0OworICAgICAgaWYgKGZzdGF0KGZkLCAmc3QpID09IDApIHsKKyAgICAgICAgKmNvbnRlbnRMZW5ndGggPSBzdC5zdF9zaXplOworICAgICAgICAqbGFzdE1vZGlmaWVkID0gc3Quc3RfbXRpbWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpczsKKyAgfQorCisgIFhzZXJ2ZXJEZXNrdG9wKiBkZXNrdG9wOworfTsKKworCitYc2VydmVyRGVza3RvcDo6WHNlcnZlckRlc2t0b3AoU2NyZWVuUHRyIHBTY3JlZW5fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcms6OlRjcExpc3RlbmVyKiBsaXN0ZW5lcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yazo6VGNwTGlzdGVuZXIqIGh0dHBMaXN0ZW5lcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZmJwdHIpCisgIDogcFNjcmVlbihwU2NyZWVuXyksIGRlZmVycmVkVXBkYXRlVGltZXIoMCksIGR1bW15VGltZXIoMCksCisgICAgc2VydmVyKDApLCBodHRwU2VydmVyKDApLAorICAgIGxpc3RlbmVyKGxpc3RlbmVyXyksIGh0dHBMaXN0ZW5lcihodHRwTGlzdGVuZXJfKSwKKyAgICBjbWFwKDApLCBkZWZlcnJlZFVwZGF0ZVRpbWVyU2V0KGZhbHNlKSwKKyAgICBncmFiYmluZyhmYWxzZSksIGlnbm9yZUhvb2tzXyhmYWxzZSksIGRpcmVjdEZicHRyKGZicHRyICE9IDApLAorICAgIG9sZEJ1dHRvbk1hc2soMCksCisgICAgcXVlcnlDb25uZWN0SWQoMCkKK3sKKyAgaW50IGk7CisgIGZvcm1hdC5kZXB0aCA9IHBTY3JlZW4tPnJvb3REZXB0aDsKKyAgZm9yIChpID0gMDsgaSA8IHNjcmVlbkluZm8ubnVtUGl4bWFwRm9ybWF0czsgaSsrKSB7CisgICAgaWYgKHNjcmVlbkluZm8uZm9ybWF0c1tpXS5kZXB0aCA9PSBmb3JtYXQuZGVwdGgpIHsKKyAgICAgIGZvcm1hdC5icHAgPSBzY3JlZW5JbmZvLmZvcm1hdHNbaV0uYml0c1BlclBpeGVsOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChpID09IHNjcmVlbkluZm8ubnVtUGl4bWFwRm9ybWF0cykgeworICAgIGZwcmludGYoc3RkZXJyLCJubyBwaXhtYXAgZm9ybWF0IGZvciByb290IGRlcHRoPz8/XG4iKTsKKyAgICBhYm9ydCgpOworICB9CisgIGZvcm1hdC5iaWdFbmRpYW4gPSAoc2NyZWVuSW5mby5pbWFnZUJ5dGVPcmRlciA9PSBNU0JGaXJzdCk7CisKKyAgVmlzdWFsUHRyIHZpczsKKyAgZm9yIChpID0gMDsgaSA8IHBTY3JlZW4tPm51bVZpc3VhbHM7IGkrKykgeworICAgIGlmIChwU2NyZWVuLT52aXN1YWxzW2ldLnZpZCA9PSBwU2NyZWVuLT5yb290VmlzdWFsKSB7CisgICAgICB2aXMgPSAmcFNjcmVlbi0+dmlzdWFsc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoaSA9PSBwU2NyZWVuLT5udW1WaXN1YWxzKSB7CisgICAgZnByaW50ZihzdGRlcnIsIm5vIHZpc3VhbCByZWMgZm9yIHJvb3QgdmlzdWFsPz8/XG4iKTsKKyAgICBhYm9ydCgpOworICB9CisgIGZvcm1hdC50cnVlQ29sb3VyID0gKHZpcy0+Y19jbGFzcyA9PSBUcnVlQ29sb3IpOworICBpZiAoIWZvcm1hdC50cnVlQ29sb3VyICYmIGZvcm1hdC5icHAgIT0gOCkKKyAgICB0aHJvdyByZmI6OkV4Y2VwdGlvbigiWCBzZXJ2ZXIgdXNlcyB1bnN1cHBvcnRlZCB2aXN1YWwiKTsKKyAgZm9ybWF0LnJlZFNoaWZ0ICAgPSBmZnModmlzLT5yZWRNYXNrKSAtIDE7CisgIGZvcm1hdC5ncmVlblNoaWZ0ID0gZmZzKHZpcy0+Z3JlZW5NYXNrKSAtIDE7CisgIGZvcm1hdC5ibHVlU2hpZnQgID0gZmZzKHZpcy0+Ymx1ZU1hc2spIC0gMTsKKyAgZm9ybWF0LnJlZE1heCAgICAgPSB2aXMtPnJlZE1hc2sgICA+PiBmb3JtYXQucmVkU2hpZnQ7CisgIGZvcm1hdC5ncmVlbk1heCAgID0gdmlzLT5ncmVlbk1hc2sgPj4gZm9ybWF0LmdyZWVuU2hpZnQ7CisgIGZvcm1hdC5ibHVlTWF4ICAgID0gdmlzLT5ibHVlTWFzayAgPj4gZm9ybWF0LmJsdWVTaGlmdDsKKworICB3aWR0aF8gPSBwU2NyZWVuLT53aWR0aDsKKyAgaGVpZ2h0XyA9IHBTY3JlZW4tPmhlaWdodDsKKyAgaWYgKGZicHRyKQorICAgIGRhdGEgPSAocmRyOjpVOCopZmJwdHI7CisgIGVsc2UKKyAgICBkYXRhID0gbmV3IHJkcjo6VThbcFNjcmVlbi0+d2lkdGggKiBwU2NyZWVuLT5oZWlnaHQgKiAoZm9ybWF0LmJwcC84KV07CisgIGNvbG91cm1hcCA9IHRoaXM7CisKKyAgc2VydmVyUmVzZXQocFNjcmVlbik7CisKKyAgc2VydmVyID0gbmV3IFZOQ1NlcnZlclNUKG5hbWUsIHRoaXMpOworICBzZXJ2ZXItPnNldFBpeGVsQnVmZmVyKHRoaXMpOworICBzZXJ2ZXItPnNldFF1ZXJ5Q29ubmVjdGlvbkhhbmRsZXIodGhpcyk7CisKKyAgaWYgKGh0dHBMaXN0ZW5lcikKKyAgICBodHRwU2VydmVyID0gbmV3IEZpbGVIVFRQU2VydmVyKHRoaXMpOworfQorCitYc2VydmVyRGVza3RvcDo6flhzZXJ2ZXJEZXNrdG9wKCkKK3sKKyAgaWYgKCFkaXJlY3RGYnB0cikKKyAgICBkZWxldGUgW10gZGF0YTsKKyAgVGltZXJGcmVlKGRlZmVycmVkVXBkYXRlVGltZXIpOworICBUaW1lckZyZWUoZHVtbXlUaW1lcik7CisgIGRlbGV0ZSBodHRwU2VydmVyOworICBkZWxldGUgc2VydmVyOworfQorCit2b2lkIFhzZXJ2ZXJEZXNrdG9wOjpzZXJ2ZXJSZXNldChTY3JlZW5QdHIgcFNjcmVlbl8pCit7CisgIHBTY3JlZW4gPSBwU2NyZWVuXzsKKyAgWElEKiBpZHMgPSBuZXcgWElEW3BTY3JlZW4tPm1heEluc3RhbGxlZENtYXBzXTsKKyAgaW50IG5tYXBzID0gKCpwU2NyZWVuLT5MaXN0SW5zdGFsbGVkQ29sb3JtYXBzKShwU2NyZWVuLCBpZHMpOworICBjbWFwID0gKENvbG9ybWFwUHRyKUxvb2t1cElEQnlUeXBlKGlkc1swXSwgUlRfQ09MT1JNQVApOworICBkZWxldGUgW10gaWRzOworfQorCitjaGFyKiBYc2VydmVyRGVza3RvcDo6c3Vic3RpdHV0ZShjb25zdCBjaGFyKiB2YXJOYW1lKQoreworICBpZiAoc3RyY21wKHZhck5hbWUsICIkJCIpID09IDApIHsKKyAgICByZXR1cm4gcmZiOjpzdHJEdXAoIiQiKTsKKyAgfQorICBpZiAoc3RyY21wKHZhck5hbWUsICIkUE9SVCIpID09IDApIHsKKyAgICBjaGFyKiBzdHIgPSBuZXcgY2hhclsxMF07CisgICAgc3ByaW50ZihzdHIsICIlZCIsIGxpc3RlbmVyID8gbGlzdGVuZXItPmdldE15UG9ydCgpIDogMCk7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorICBpZiAoc3RyY21wKHZhck5hbWUsICIkV0lEVEgiKSA9PSAwKSB7CisgICAgY2hhciogc3RyID0gbmV3IGNoYXJbMTBdOworICAgIHNwcmludGYoc3RyLCAiJWQiLCB3aWR0aCgpKTsKKyAgICByZXR1cm4gc3RyOworICB9CisgIGlmIChzdHJjbXAodmFyTmFtZSwgIiRIRUlHSFQiKSA9PSAwKSB7CisgICAgY2hhciogc3RyID0gbmV3IGNoYXJbMTBdOworICAgIHNwcmludGYoc3RyLCAiJWQiLCBoZWlnaHQoKSk7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorICBpZiAoc3RyY21wKHZhck5hbWUsICIkQVBQTEVUV0lEVEgiKSA9PSAwKSB7CisgICAgY2hhciogc3RyID0gbmV3IGNoYXJbMTBdOworICAgIHNwcmludGYoc3RyLCAiJWQiLCB3aWR0aCgpKTsKKyAgICByZXR1cm4gc3RyOworICB9CisgIGlmIChzdHJjbXAodmFyTmFtZSwgIiRBUFBMRVRIRUlHSFQiKSA9PSAwKSB7CisgICAgY2hhciogc3RyID0gbmV3IGNoYXJbMTBdOworICAgIHNwcmludGYoc3RyLCAiJWQiLCBoZWlnaHQoKSArIDMyKTsKKyAgICByZXR1cm4gc3RyOworICB9CisgIGlmIChzdHJjbXAodmFyTmFtZSwgIiRERVNLVE9QIikgPT0gMCkgeworICAgIHJldHVybiByZmI6OnN0ckR1cChzZXJ2ZXItPmdldE5hbWUoKSk7CisgIH0KKyAgaWYgKHN0cmNtcCh2YXJOYW1lLCAiJERJU1BMQVkiKSA9PSAwKSB7CisgICAgc3RydWN0IHV0c25hbWUgdXRzOworICAgIHVuYW1lKCZ1dHMpOworICAgIGNoYXIqIHN0ciA9IG5ldyBjaGFyWzI1Nl07CisgICAgc3RybmNhdChzdHIsIHV0cy5ub2RlbmFtZSwgMjQwKTsKKyAgICBzdHJjYXQoc3RyLCAiOiIpOworICAgIHN0cm5jYXQoc3RyLCBkaXNwbGF5LCAxMCk7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorICBpZiAoc3RyY21wKHZhck5hbWUsICIkVVNFUiIpID09IDApIHsKKyAgICBzdHJ1Y3QgcGFzc3dkKiB1c2VyID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworICAgIHJldHVybiByZmI6OnN0ckR1cCh1c2VyID8gdXNlci0+cHdfbmFtZSA6ICI/Iik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3JmYjo6Vk5DU2VydmVyU1Q6OnF1ZXJ5UmVzdWx0CitYc2VydmVyRGVza3RvcDo6cXVlcnlDb25uZWN0aW9uKG5ldHdvcms6OlNvY2tldCogc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiByZWFzb24pIHsKKyAgaWYgKHF1ZXJ5Q29ubmVjdElkKSB7CisgICAgKnJlYXNvbiA9IHN0ckR1cCgiQW5vdGhlciBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBxdWVyaWVkLiIpOworICAgIHJldHVybiByZmI6OlZOQ1NlcnZlclNUOjpSRUpFQ1Q7CisgIH0KKyAgcXVlcnlDb25uZWN0QWRkcmVzcy5yZXBsYWNlQnVmKHNvY2stPmdldFBlZXJBZGRyZXNzKCkpOworICBpZiAoIXVzZXJOYW1lKQorICAgIHVzZXJOYW1lID0gIihhbm9ueW1vdXMpIjsKKyAgcXVlcnlDb25uZWN0VXNlcm5hbWUucmVwbGFjZUJ1ZihzdHJEdXAodXNlck5hbWUpKTsKKyAgcXVlcnlDb25uZWN0SWQgPSBzb2NrOworICB2bmNRdWVyeUNvbm5lY3QodGhpcywgc29jayk7CisgIHJldHVybiByZmI6OlZOQ1NlcnZlclNUOjpQRU5ESU5HOworfQorCisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OnNldENvbG9ybWFwKENvbG9ybWFwUHRyIGNtYXBfKQoreworICBpZiAoY21hcCAhPSBjbWFwXykgeworICAgIGNtYXAgPSBjbWFwXzsKKyAgICBzZXRDb2xvdXJNYXBFbnRyaWVzKDAsIDApOworICB9Cit9CisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OnNldENvbG91ck1hcEVudHJpZXMoQ29sb3JtYXBQdHIgcENvbG9ybWFwLCBpbnQgbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeENvbG9ySXRlbSogcGRlZikKK3sKKyAgaWYgKGNtYXAgIT0gcENvbG9ybWFwIHx8IG5kZWYgPD0gMCkgcmV0dXJuOworCisgIGludCBmaXJzdCA9IHBkZWZbMF0ucGl4ZWw7CisgIGludCBuID0gMTsKKworICBmb3IgKGludCBpID0gMTsgaSA8IG5kZWY7IGkrKykgeworICAgIGlmIChmaXJzdCArIG4gPT0gcGRlZltpXS5waXhlbCkgeworICAgICAgbisrOworICAgIH0gZWxzZSB7CisgICAgICBzZXRDb2xvdXJNYXBFbnRyaWVzKGZpcnN0LCBuKTsKKyAgICAgIGZpcnN0ID0gcGRlZltpXS5waXhlbDsKKyAgICAgIG4gPSAxOworICAgIH0KKyAgfQorICBzZXRDb2xvdXJNYXBFbnRyaWVzKGZpcnN0LCBuKTsKK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6c2V0Q29sb3VyTWFwRW50cmllcyhpbnQgZmlyc3RDb2xvdXIsIGludCBuQ29sb3VycykKK3sKKyAgdHJ5IHsKKyAgICBzZXJ2ZXItPnNldENvbG91ck1hcEVudHJpZXMoZmlyc3RDb2xvdXIsIG5Db2xvdXJzKTsKKyAgfSBjYXRjaCAocmRyOjpFeGNlcHRpb24mIGUpIHsKKyAgICB2bG9nLmVycm9yKCJYc2VydmVyRGVza3RvcDo6c2V0Q29sb3VyTWFwRW50cmllczogJXMiLGUuc3RyKCkpOworICB9Cit9CisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OmJlbGwoKQoreworICBzZXJ2ZXItPmJlbGwoKTsKK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6c2VydmVyQ3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisgIHRyeSB7CisgICAgc2VydmVyLT5zZXJ2ZXJDdXRUZXh0KHN0ciwgbGVuKTsKKyAgfSBjYXRjaCAocmRyOjpFeGNlcHRpb24mIGUpIHsKKyAgICB2bG9nLmVycm9yKCJYc2VydmVyRGVza3RvcDo6c2VydmVyQ3V0VGV4dDogJXMiLGUuc3RyKCkpOworICB9Cit9CisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OnNldEN1cnNvcihDdXJzb3JQdHIgY3Vyc29yKQoreworICB0cnkgeworICAgIGludCB3ID0gY3Vyc29yLT5iaXRzLT53aWR0aDsKKyAgICBpbnQgaCA9IGN1cnNvci0+Yml0cy0+aGVpZ2h0OworICAgIHJkcjo6VTgqIGN1cnNvckRhdGEgPSBuZXcgcmRyOjpVOFt3ICogaCAqIChnZXRQRigpLmJwcCAvIDgpXTsKKworICAgIHhDb2xvckl0ZW0gZmcsIGJnOworICAgIGZnLnJlZCAgID0gY3Vyc29yLT5mb3JlUmVkOworICAgIGZnLmdyZWVuID0gY3Vyc29yLT5mb3JlR3JlZW47CisgICAgZmcuYmx1ZSAgPSBjdXJzb3ItPmZvcmVCbHVlOworICAgIEZha2VBbGxvY0NvbG9yKGNtYXAsICZmZyk7CisgICAgYmcucmVkICAgPSBjdXJzb3ItPmJhY2tSZWQ7CisgICAgYmcuZ3JlZW4gPSBjdXJzb3ItPmJhY2tHcmVlbjsKKyAgICBiZy5ibHVlICA9IGN1cnNvci0+YmFja0JsdWU7CisgICAgRmFrZUFsbG9jQ29sb3IoY21hcCwgJmJnKTsKKyAgICBGYWtlRnJlZUNvbG9yKGNtYXAsIGZnLnBpeGVsKTsKKyAgICBGYWtlRnJlZUNvbG9yKGNtYXAsIGJnLnBpeGVsKTsKKworICAgIGludCB4TWFza0J5dGVzUGVyUm93ID0gQml0bWFwQnl0ZVBhZCh3KTsKKworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBpbnQgYnl0ZSA9IHkgKiB4TWFza0J5dGVzUGVyUm93ICsgeCAvIDg7CisjaWYgKEJJVE1BUF9CSVRfT1JERVIgPT0gTVNCRmlyc3QpCisgICAgICAgIGludCBiaXQgPSA3IC0geCAlIDg7CisjZWxzZQorICAgICAgICBpbnQgYml0ID0geCAlIDg7CisjZW5kaWYKKyAgICAgICAgc3dpdGNoIChnZXRQRigpLmJwcCkgeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgKChyZHI6OlU4KiljdXJzb3JEYXRhKVt5ICogdyArIHhdCisgICAgICAgICAgICA9IChjdXJzb3ItPmJpdHMtPnNvdXJjZVtieXRlXSAmICgxIDw8IGJpdCkpID8gZmcucGl4ZWwgOiBiZy5waXhlbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAoKHJkcjo6VTE2KiljdXJzb3JEYXRhKVt5ICogdyArIHhdCisgICAgICAgICAgICA9IChjdXJzb3ItPmJpdHMtPnNvdXJjZVtieXRlXSAmICgxIDw8IGJpdCkpID8gZmcucGl4ZWwgOiBiZy5waXhlbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAoKHJkcjo6VTMyKiljdXJzb3JEYXRhKVt5ICogdyArIHhdCisgICAgICAgICAgICA9IChjdXJzb3ItPmJpdHMtPnNvdXJjZVtieXRlXSAmICgxIDw8IGJpdCkpID8gZmcucGl4ZWwgOiBiZy5waXhlbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGludCByZmJNYXNrQnl0ZXNQZXJSb3cgPSAodyArIDcpIC8gODsKKworICAgIHJkcjo6VTgqIGN1cnNvck1hc2sgPSBuZXcgcmRyOjpVOFtyZmJNYXNrQnl0ZXNQZXJSb3cgKiBoXTsKKworICAgIGZvciAoaW50IGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJmYk1hc2tCeXRlc1BlclJvdzsgaSsrKQorI2lmIChCSVRNQVBfQklUX09SREVSID09IE1TQkZpcnN0KQorICAgICAgICBjdXJzb3JNYXNrW2ogKiByZmJNYXNrQnl0ZXNQZXJSb3cgKyBpXQorICAgICAgICAgID0gY3Vyc29yLT5iaXRzLT5tYXNrW2ogKiB4TWFza0J5dGVzUGVyUm93ICsgaV07CisjZWxzZQorICAgICAgICBjdXJzb3JNYXNrW2ogKiByZmJNYXNrQnl0ZXNQZXJSb3cgKyBpXQorICAgICAgICAgID0gcmV2ZXJzZUJpdHNbY3Vyc29yLT5iaXRzLT5tYXNrW2ogKiB4TWFza0J5dGVzUGVyUm93ICsgaV1dOworI2VuZGlmCisgICAgfQorCisgICAgc2VydmVyLT5zZXRDdXJzb3IoY3Vyc29yLT5iaXRzLT53aWR0aCwgY3Vyc29yLT5iaXRzLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgUG9pbnQoY3Vyc29yLT5iaXRzLT54aG90LCBjdXJzb3ItPmJpdHMtPnlob3QpLAorICAgICAgICAgICAgICAgICAgICAgIGN1cnNvckRhdGEsIGN1cnNvck1hc2spOworICAgIHNlcnZlci0+dHJ5VXBkYXRlKCk7CisgICAgZGVsZXRlIFtdIGN1cnNvckRhdGE7CisgICAgZGVsZXRlIFtdIGN1cnNvck1hc2s7CisgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgdmxvZy5lcnJvcigiWHNlcnZlckRlc2t0b3A6OnNldEN1cnNvcjogJXMiLGUuc3RyKCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50UmVnaW9uKFJlZ2lvblB0ciByZWcpCit7CisgIGludCBucmVjdHMgPSBSRUdJT05fTlVNX1JFQ1RTKHJlZyk7CisKKyAgZnByaW50ZihzdGRlcnIsIlJlZ2lvbiBudW0gcmVjdHMgJTJkIGV4dGVudHMgJTNkLCUzZCAlM2R4JTNkXG4iLG5yZWN0cywKKyAgICAgICAgICAoUkVHSU9OX0VYVEVOVFMocFNjcmVlbixyZWcpKS0+eDEsCisgICAgICAgICAgKFJFR0lPTl9FWFRFTlRTKHBTY3JlZW4scmVnKSktPnkxLAorICAgICAgICAgIChSRUdJT05fRVhURU5UUyhwU2NyZWVuLHJlZykpLT54Mi0oUkVHSU9OX0VYVEVOVFMocFNjcmVlbixyZWcpKS0+eDEsCisgICAgICAgICAgKFJFR0lPTl9FWFRFTlRTKHBTY3JlZW4scmVnKSktPnkyLShSRUdJT05fRVhURU5UUyhwU2NyZWVuLHJlZykpLT55MSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBucmVjdHM7IGkrKykgeworICAgIGZwcmludGYoc3RkZXJyLCIgICAgcmVjdCAlM2QsJTNkICUzZHglM2RcbiIsCisgICAgICAgICAgICBSRUdJT05fUkVDVFMocmVnKVtpXS54MSwKKyAgICAgICAgICAgIFJFR0lPTl9SRUNUUyhyZWcpW2ldLnkxLAorICAgICAgICAgICAgUkVHSU9OX1JFQ1RTKHJlZylbaV0ueDItUkVHSU9OX1JFQ1RTKHJlZylbaV0ueDEsCisgICAgICAgICAgICBSRUdJT05fUkVDVFMocmVnKVtpXS55Mi1SRUdJT05fUkVDVFMocmVnKVtpXS55MSk7CisgIH0KK30KKworQ0FSRDMyIFhzZXJ2ZXJEZXNrdG9wOjpkZWZlcnJlZFVwZGF0ZVRpbWVyQ2FsbGJhY2soT3NUaW1lclB0ciB0aW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUkQzMiBub3csIHBvaW50ZXIgYXJnKQoreworICBYc2VydmVyRGVza3RvcCogZGVza3RvcCA9IChYc2VydmVyRGVza3RvcCopYXJnOworICBkZXNrdG9wLT5kZWZlcnJlZFVwZGF0ZVRpbWVyU2V0ID0gZmFsc2U7CisgIHRyeSB7CisgICAgZGVza3RvcC0+c2VydmVyLT50cnlVcGRhdGUoKTsKKyAgfSBjYXRjaCAocmRyOjpFeGNlcHRpb24mIGUpIHsKKyAgICB2bG9nLmVycm9yKCJYc2VydmVyRGVza3RvcDo6ZGVmZXJyZWRVcGRhdGVUaW1lckNhbGxiYWNrOiAlcyIsZS5zdHIoKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OmRlZmVyVXBkYXRlKCkKK3sKKyAgaWYgKGRlZmVyVXBkYXRlVGltZSAhPSAwKSB7CisgICAgaWYgKCFkZWZlcnJlZFVwZGF0ZVRpbWVyU2V0IHx8IGFsd2F5c1NldERlZmVyVXBkYXRlVGltZXIpIHsKKyAgICAgIGRlZmVycmVkVXBkYXRlVGltZXJTZXQgPSB0cnVlOworICAgICAgZGVmZXJyZWRVcGRhdGVUaW1lciA9IFRpbWVyU2V0KGRlZmVycmVkVXBkYXRlVGltZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJVcGRhdGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkVXBkYXRlVGltZXJDYWxsYmFjaywgdGhpcyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHNlcnZlci0+dHJ5VXBkYXRlKCk7CisgIH0KK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6YWRkX2NoYW5nZWQoUmVnaW9uUHRyIHJlZykKK3sKKyAgaWYgKGlnbm9yZUhvb2tzXykgcmV0dXJuOworICBpZiAoZ3JhYmJpbmcpIHJldHVybjsKKyAgdHJ5IHsKKyAgICByZmI6OlJlZ2lvbiByZmJSZWc7CisgICAgcmZiUmVnLnNldEV4dGVudHNBbmRPcmRlcmVkUmVjdHMoKFNob3J0UmVjdCopUkVHSU9OX0VYVEVOVFMocFNjcmVlbiwgcmVnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdJT05fTlVNX1JFQ1RTKHJlZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNob3J0UmVjdCopUkVHSU9OX1JFQ1RTKHJlZykpOworICAgIHNlcnZlci0+YWRkX2NoYW5nZWQocmZiUmVnKTsKKyAgICBkZWZlclVwZGF0ZSgpOworICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiYgZSkgeworICAgIHZsb2cuZXJyb3IoIlhzZXJ2ZXJEZXNrdG9wOjphZGRfY2hhbmdlZDogJXMiLGUuc3RyKCkpOworICB9Cit9CisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OmFkZF9jb3BpZWQoUmVnaW9uUHRyIGRzdCwgaW50IGR4LCBpbnQgZHkpCit7CisgIGlmIChpZ25vcmVIb29rc18pIHJldHVybjsKKyAgaWYgKGdyYWJiaW5nKSByZXR1cm47CisgIHRyeSB7CisgICAgcmZiOjpSZWdpb24gcmZiUmVnOworICAgIHJmYlJlZy5zZXRFeHRlbnRzQW5kT3JkZXJlZFJlY3RzKChTaG9ydFJlY3QqKVJFR0lPTl9FWFRFTlRTKHBTY3JlZW4sIGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHSU9OX05VTV9SRUNUUyhkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTaG9ydFJlY3QqKVJFR0lPTl9SRUNUUyhkc3QpKTsKKyAgICBzZXJ2ZXItPmFkZF9jb3BpZWQocmZiUmVnLCByZmI6OlBvaW50KGR4LCBkeSkpOworICAgIGRlZmVyVXBkYXRlKCk7CisgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgdmxvZy5lcnJvcigiWHNlcnZlckRlc2t0b3A6OmFkZF9jb3BpZWQ6ICVzIixlLnN0cigpKTsKKyAgfQorfQorCit2b2lkIFhzZXJ2ZXJEZXNrdG9wOjpwb3NpdGlvbkN1cnNvcigpCit7CisgIGlmICghY3Vyc29yUG9zLmVxdWFscyhvbGRDdXJzb3JQb3MpKSB7CisgICAgb2xkQ3Vyc29yUG9zID0gY3Vyc29yUG9zOworICAgICgqcFNjcmVlbi0+U2V0Q3Vyc29yUG9zaXRpb24pIChwU2NyZWVuLCBjdXJzb3JQb3MueCwgY3Vyc29yUG9zLnksIEZBTFNFKTsKKyAgICBzZXJ2ZXItPnNldEN1cnNvclBvcyhjdXJzb3JQb3MpOworICAgIHNlcnZlci0+dHJ5VXBkYXRlKCk7CisgIH0KK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6YmxvY2tIYW5kbGVyKGZkX3NldCogZmRzKQoreworICB0cnkgeworICAgIFNjcmVlblB0ciBzY3JlZW5XaXRoQ3Vyc29yID0gR2V0Q3VycmVudFJvb3RXaW5kb3coKS0+ZHJhd2FibGUucFNjcmVlbjsKKyAgICBpZiAoc2NyZWVuV2l0aEN1cnNvciA9PSBwU2NyZWVuKSB7CisgICAgICBpbnQgeCwgeTsKKyAgICAgIEdldFNwcml0ZVBvc2l0aW9uKCZ4LCAmeSk7CisgICAgICBpZiAoeCAhPSBjdXJzb3JQb3MueCB8fCB5ICE9IGN1cnNvclBvcy55KSB7CisgICAgICAgIGN1cnNvclBvcyA9IG9sZEN1cnNvclBvcyA9IFBvaW50KHgsIHkpOworICAgICAgICBzZXJ2ZXItPnNldEN1cnNvclBvcyhjdXJzb3JQb3MpOworICAgICAgICBzZXJ2ZXItPnRyeVVwZGF0ZSgpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChsaXN0ZW5lcikKKyAgICAgIEZEX1NFVChsaXN0ZW5lci0+Z2V0RmQoKSwgZmRzKTsKKyAgICBpZiAoaHR0cExpc3RlbmVyKQorICAgICAgRkRfU0VUKGh0dHBMaXN0ZW5lci0+Z2V0RmQoKSwgZmRzKTsKKworICAgIHN0ZDo6bGlzdDxTb2NrZXQqPiBzb2NrZXRzOworICAgIHNlcnZlci0+Z2V0U29ja2V0cygmc29ja2V0cyk7CisgICAgc3RkOjpsaXN0PFNvY2tldCo+OjppdGVyYXRvciBpOworICAgIGZvciAoaSA9IHNvY2tldHMuYmVnaW4oKTsgaSAhPSBzb2NrZXRzLmVuZCgpOyBpKyspIHsKKyAgICAgIGludCBmZCA9ICgqaSktPmdldEZkKCk7CisgICAgICBpZiAoKCppKS0+aXNTaHV0ZG93bigpKSB7CisgICAgICAgIHZsb2cuZGVidWcoImNsaWVudCBnb25lLCBzb2NrICVkIixmZCk7CisgICAgICAgIHNlcnZlci0+cmVtb3ZlU29ja2V0KCppKTsKKyAgICAgICAgdm5jQ2xpZW50R29uZShmZCk7CisgICAgICAgIGRlbGV0ZSAoKmkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRkRfU0VUKGZkLCBmZHMpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaHR0cFNlcnZlcikgeworICAgICAgaHR0cFNlcnZlci0+Z2V0U29ja2V0cygmc29ja2V0cyk7CisgICAgICBmb3IgKGkgPSBzb2NrZXRzLmJlZ2luKCk7IGkgIT0gc29ja2V0cy5lbmQoKTsgaSsrKSB7CisgICAgICAgIGludCBmZCA9ICgqaSktPmdldEZkKCk7CisgICAgICAgIGlmICgoKmkpLT5pc1NodXRkb3duKCkpIHsKKyAgICAgICAgICB2bG9nLmRlYnVnKCJodHRwIGNsaWVudCBnb25lLCBzb2NrICVkIixmZCk7CisgICAgICAgICAgaHR0cFNlcnZlci0+cmVtb3ZlU29ja2V0KCppKTsKKyAgICAgICAgICBkZWxldGUgKCppKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGRF9TRVQoZmQsIGZkcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgdmxvZy5lcnJvcigiWHNlcnZlckRlc2t0b3A6OmJsb2NrSGFuZGxlcjogJXMiLGUuc3RyKCkpOworICB9Cit9CisKK3N0YXRpYyBDQVJEMzIgZHVtbXlUaW1lckNhbGxiYWNrKE9zVGltZXJQdHIgdGltZXIsIENBUkQzMiBub3csIHBvaW50ZXIgYXJnKSB7CisgIHJldHVybiAwOworfQorCit2b2lkIFhzZXJ2ZXJEZXNrdG9wOjp3YWtldXBIYW5kbGVyKGZkX3NldCogZmRzLCBpbnQgbmZkcykKK3sKKyAgdHJ5IHsKKyAgICBpZiAobmZkcyA+PSAxKSB7CisKKyAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBpZiAoRkRfSVNTRVQobGlzdGVuZXItPmdldEZkKCksIGZkcykpIHsKKyAgICAgICAgICBGRF9DTFIobGlzdGVuZXItPmdldEZkKCksIGZkcyk7CisgICAgICAgICAgU29ja2V0KiBzb2NrID0gbGlzdGVuZXItPmFjY2VwdCgpOworICAgICAgICAgIHNlcnZlci0+YWRkU29ja2V0KHNvY2spOworICAgICAgICAgIHZsb2cuZGVidWcoIm5ldyBjbGllbnQsIHNvY2sgJWQiLHNvY2stPmdldEZkKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChodHRwTGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKEZEX0lTU0VUKGh0dHBMaXN0ZW5lci0+Z2V0RmQoKSwgZmRzKSkgeworICAgICAgICAgIEZEX0NMUihodHRwTGlzdGVuZXItPmdldEZkKCksIGZkcyk7CisgICAgICAgICAgU29ja2V0KiBzb2NrID0gaHR0cExpc3RlbmVyLT5hY2NlcHQoKTsKKyAgICAgICAgICBodHRwU2VydmVyLT5hZGRTb2NrZXQoc29jayk7CisgICAgICAgICAgdmxvZy5kZWJ1ZygibmV3IGh0dHAgY2xpZW50LCBzb2NrICVkIixzb2NrLT5nZXRGZCgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzdGQ6Omxpc3Q8U29ja2V0Kj4gc29ja2V0czsKKyAgICAgIHNlcnZlci0+Z2V0U29ja2V0cygmc29ja2V0cyk7CisgICAgICBzdGQ6Omxpc3Q8U29ja2V0Kj46Oml0ZXJhdG9yIGk7CisgICAgICBmb3IgKGkgPSBzb2NrZXRzLmJlZ2luKCk7IGkgIT0gc29ja2V0cy5lbmQoKTsgaSsrKSB7CisgICAgICAgIGludCBmZCA9ICgqaSktPmdldEZkKCk7CisgICAgICAgIGlmIChGRF9JU1NFVChmZCwgZmRzKSkgeworICAgICAgICAgIEZEX0NMUihmZCwgZmRzKTsKKyAgICAgICAgICBzZXJ2ZXItPnByb2Nlc3NTb2NrZXRFdmVudCgqaSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGh0dHBTZXJ2ZXIpIHsKKyAgICAgICAgaHR0cFNlcnZlci0+Z2V0U29ja2V0cygmc29ja2V0cyk7CisgICAgICAgIGZvciAoaSA9IHNvY2tldHMuYmVnaW4oKTsgaSAhPSBzb2NrZXRzLmVuZCgpOyBpKyspIHsKKyAgICAgICAgICBpbnQgZmQgPSAoKmkpLT5nZXRGZCgpOworICAgICAgICAgIGlmIChGRF9JU1NFVChmZCwgZmRzKSkgeworICAgICAgICAgICAgRkRfQ0xSKGZkLCBmZHMpOworICAgICAgICAgICAgaHR0cFNlcnZlci0+cHJvY2Vzc1NvY2tldEV2ZW50KCppKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcG9zaXRpb25DdXJzb3IoKTsKKyAgICB9CisKKyAgICBpbnQgdGltZW91dCA9IHNlcnZlci0+Y2hlY2tUaW1lb3V0cygpOworICAgIGlmICh0aW1lb3V0ID4gMCkgeworICAgICAgLy8gc2V0IGEgZHVtbXkgdGltZXIganVzdCBzbyB3ZSBhcmUgZ3VhcmFudGVlZCBiZSBjYWxsZWQgYWdhaW4gbmV4dCB0aW1lLgorICAgICAgZHVtbXlUaW1lciA9IFRpbWVyU2V0KGR1bW15VGltZXIsIDAsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlUaW1lckNhbGxiYWNrLCAwKTsKKyAgICB9CisKKyAgfSBjYXRjaCAocmRyOjpFeGNlcHRpb24mIGUpIHsKKyAgICB2bG9nLmVycm9yKCJYc2VydmVyRGVza3RvcDo6d2FrZXVwSGFuZGxlcjogJXMiLGUuc3RyKCkpOworICB9Cit9CisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OmFkZENsaWVudChTb2NrZXQqIHNvY2ssIGJvb2wgcmV2ZXJzZSkKK3sKKyAgdmxvZy5kZWJ1ZygibmV3IGNsaWVudCwgc29jayAlZCByZXZlcnNlICVkIixzb2NrLT5nZXRGZCgpLHJldmVyc2UpOworICBzZXJ2ZXItPmFkZFNvY2tldChzb2NrLCByZXZlcnNlKTsKK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6ZGlzY29ubmVjdENsaWVudHMoKQoreworICB2bG9nLmRlYnVnKCJkaXNjb25uZWN0aW5nIGFsbCBjbGllbnRzIik7CisgIHJldHVybiBzZXJ2ZXItPmNsb3NlQ2xpZW50cygiRGlzY29ubmVjdGlvbiBmcm9tIHNlcnZlciBlbmQiKTsKK30KKworCitpbnQgWHNlcnZlckRlc2t0b3A6OmdldFF1ZXJ5VGltZW91dCh2b2lkKiBvcGFxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHVzZXJuYW1lKQoreworICBpZiAob3BhcXVlSWQgJiYgcXVlcnlDb25uZWN0SWQgPT0gb3BhcXVlSWQpIHsKKyAgICB2bG9nLmluZm8oImFkZHJlc3M9JXMsIHVzZXJuYW1lPSVzLCB0aW1lb3V0PSVkIiwKKyAgICAgICAgICAgICAgcXVlcnlDb25uZWN0QWRkcmVzcy5idWYsIHF1ZXJ5Q29ubmVjdFVzZXJuYW1lLmJ1ZiwKKyAgICAgICAgICAgICAgKGludClxdWVyeUNvbm5lY3RUaW1lb3V0KTsKKyAgICBpZiAoYWRkcmVzcykgKmFkZHJlc3MgPSBxdWVyeUNvbm5lY3RBZGRyZXNzLmJ1ZjsKKyAgICBpZiAodXNlcm5hbWUpICp1c2VybmFtZSA9IHF1ZXJ5Q29ubmVjdFVzZXJuYW1lLmJ1ZjsKKyAgICByZXR1cm4gcXVlcnlDb25uZWN0VGltZW91dDsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6YXBwcm92ZUNvbm5lY3Rpb24odm9pZCogb3BhcXVlSWQsIGJvb2wgYWNjZXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVqZWN0TXNnKQoreworICBpZiAocXVlcnlDb25uZWN0SWQgPT0gb3BhcXVlSWQpIHsKKyAgICBzZXJ2ZXItPmFwcHJvdmVDb25uZWN0aW9uKChuZXR3b3JrOjpTb2NrZXQqKW9wYXF1ZUlkLCBhY2NlcHQsIHJlamVjdE1zZyk7CisgICAgcXVlcnlDb25uZWN0SWQgPSAwOworICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFNEZXNrdG9wIGNhbGxiYWNrcworCisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OnBvaW50ZXJFdmVudChjb25zdCBQb2ludCYgcG9zLCBpbnQgYnV0dG9uTWFzaykKK3sKKyAgeEV2ZW50IGV2OworICBEZXZpY2VQdHIgZGV2ID0gTG9va3VwUG9pbnRlckRldmljZSgpOworCisgIC8vIFNldEN1cnNvclBvc2l0aW9uIHNlZW1zIHRvIGJlIHZlcnkgZXhwZW5zaXZlIChhdCBsZWFzdCBvbiBYRnJlZTg2IDMuMy42CisgIC8vIGZvciBTMyksIHNvIHdlIGRlbGF5IGNhbGxpbmcgaXQgdW50aWwgcG9zaXRpb25DdXJzb3IoKSBpcyBjYWxsZWQgYXQgdGhlCisgIC8vIGVuZCBvZiBwcm9jZXNzaW5nIGEgbG9hZCBvZiBSRkIuCisgIC8vKCpwU2NyZWVuLT5TZXRDdXJzb3JQb3NpdGlvbikgKHBTY3JlZW4sIHBvcy54LCBwb3MueSwgRkFMU0UpOworCisgIE5ld0N1cnJlbnRTY3JlZW4ocFNjcmVlbiwgcG9zLngsIHBvcy55KTsKKworICBldi51LnUudHlwZSA9IE1vdGlvbk5vdGlmeTsKKyAgZXYudS51LmRldGFpbCA9IDA7CisgIGV2LnUua2V5QnV0dG9uUG9pbnRlci5yb290WCA9IHBvcy54OworICBldi51LmtleUJ1dHRvblBvaW50ZXIucm9vdFkgPSBwb3MueTsKKyAgZXYudS5rZXlCdXR0b25Qb2ludGVyLnRpbWUgPSBHZXRUaW1lSW5NaWxsaXMoKTsKKworICBpZiAoIXBvcy5lcXVhbHMoY3Vyc29yUG9zKSkKKyAgICAoKmRldi0+cHJvY2Vzc0lucHV0UHJvYykoJmV2LCAoRGV2aWNlSW50UHRyKWRldiwgMSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBpZiAoKGJ1dHRvbk1hc2sgXiBvbGRCdXR0b25NYXNrKSAmICgxPDxpKSkgeworICAgICAgLy8gRG8gbm90IHVzZSB0aGUgcG9pbnRlciBtYXBwaW5nLiBUcmVhdCBWTkMgYnV0dG9ucyBhcyBsb2dpY2FsCisgICAgICAvLyBidXR0b25zLgorICAgICAgZXYudS51LmRldGFpbCA9IGkgKyAxOworICAgICAgZXYudS51LnR5cGUgPSAoYnV0dG9uTWFzayAmICgxPDxpKSkgPyBCdXR0b25QcmVzcyA6IEJ1dHRvblJlbGVhc2U7CisgICAgICAoKmRldi0+cHJvY2Vzc0lucHV0UHJvYykoJmV2LCAoRGV2aWNlSW50UHRyKWRldiwgMSk7CisgICAgfQorICB9CisKKyAgY3Vyc29yUG9zID0gcG9zOworICBvbGRCdXR0b25NYXNrID0gYnV0dG9uTWFzazsKK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6Y2xpZW50Q3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisgIHZuY0NsaWVudEN1dFRleHQoc3RyLCBsZW4pOworfQorCit2b2lkIFhzZXJ2ZXJEZXNrdG9wOjpncmFiUmVnaW9uKGNvbnN0IHJmYjo6UmVnaW9uJiByZWdpb24pCit7CisgIGlmIChkaXJlY3RGYnB0cikgcmV0dXJuOworICBpZiAoIXBTY3JlZW4tPkdldEltYWdlKSB7CisgICAgdmxvZy5lcnJvcigiVk5DIGVycm9yOiBwU2NyZWVuLT5HZXRJbWFnZSA9PSAwIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ3JhYmJpbmcgPSB0cnVlOworCisgIGludCBieXRlc1BlclBpeGVsID0gZm9ybWF0LmJwcC84OworICBpbnQgYnl0ZXNQZXJSb3cgPSBwU2NyZWVuLT53aWR0aCAqIGJ5dGVzUGVyUGl4ZWw7CisKKyAgc3RkOjp2ZWN0b3I8cmZiOjpSZWN0PiByZWN0czsKKyAgc3RkOjp2ZWN0b3I8cmZiOjpSZWN0Pjo6aXRlcmF0b3IgaTsKKyAgcmVnaW9uLmdldF9yZWN0cygmcmVjdHMpOworICBmb3IgKGkgPSByZWN0cy5iZWdpbigpOyBpICE9IHJlY3RzLmVuZCgpOyBpKyspIHsKKyAgICBmb3IgKGludCB5ID0gaS0+dGwueTsgeSA8IGktPmJyLnk7IHkrKykgeworICAgICAgKCpwU2NyZWVuLT5HZXRJbWFnZSkgKChEcmF3YWJsZVB0cilXaW5kb3dUYWJsZVtwU2NyZWVuLT5teU51bV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0+dGwueCwgeSwgaS0+d2lkdGgoKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUGl4bWFwLCAodW5zaWduZWQgbG9uZyl+MEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyKilkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeSAqIGJ5dGVzUGVyUm93ICsgaS0+dGwueCAqIGJ5dGVzUGVyUGl4ZWwpKTsKKyAgICB9CisgIH0KKyAgZ3JhYmJpbmcgPSBmYWxzZTsKK30KKwordm9pZCBYc2VydmVyRGVza3RvcDo6bG9va3VwKGludCBpbmRleCwgaW50KiByLCBpbnQqIGcsIGludCogYikKK3sKKyAgaWYgKChjbWFwLT5jX2NsYXNzIHwgRHluYW1pY0NsYXNzKSA9PSBEaXJlY3RDb2xvcikgeworICAgIFZpc3VhbFB0ciB2ID0gY21hcC0+cFZpc3VhbDsKKyAgICAqciA9IGNtYXAtPnJlZCAgWyhpbmRleCAmIHYtPnJlZE1hc2sgICkgPj4gdi0+b2Zmc2V0UmVkICBdLmNvLmxvY2FsLnJlZDsKKyAgICAqZyA9IGNtYXAtPmdyZWVuWyhpbmRleCAmIHYtPmdyZWVuTWFzaykgPj4gdi0+b2Zmc2V0R3JlZW5dLmNvLmxvY2FsLmdyZWVuOworICAgICpiID0gY21hcC0+Ymx1ZSBbKGluZGV4ICYgdi0+Ymx1ZU1hc2sgKSA+PiB2LT5vZmZzZXRCbHVlIF0uY28ubG9jYWwuYmx1ZTsKKyAgfSBlbHNlIHsKKyAgICBFbnRyeVB0ciBwZW50OworICAgIHBlbnQgPSAoRW50cnlQdHIpJmNtYXAtPnJlZFtpbmRleF07CisgICAgaWYgKHBlbnQtPmZTaGFyZWQpIHsKKyAgICAgICpyID0gcGVudC0+Y28uc2hjby5yZWQtPmNvbG9yOworICAgICAgKmcgPSBwZW50LT5jby5zaGNvLmdyZWVuLT5jb2xvcjsKKyAgICAgICpiID0gcGVudC0+Y28uc2hjby5ibHVlLT5jb2xvcjsKKyAgICB9IGVsc2UgeworICAgICAgKnIgPSBwZW50LT5jby5sb2NhbC5yZWQ7CisgICAgICAqZyA9IHBlbnQtPmNvLmxvY2FsLmdyZWVuOworICAgICAgKmIgPSBwZW50LT5jby5sb2NhbC5ibHVlOworICAgIH0KKyAgfQorfQorCisvLworLy8gS2V5Ym9hcmQgaGFuZGxpbmcKKy8vCisKKyNkZWZpbmUgSVNfUFJFU1NFRChrZXljLCBrZXljb2RlKSBcCisgICgoa2V5YyktPmRvd25bKGtleWNvZGUpID4+IDNdICYgKDEgPDwgKChrZXljb2RlKSAmIDcpKSkKKworLy8gTW9kaWZpZXJTdGF0ZSBpcyBhIGNsYXNzIHdoaWNoIGhlbHBzIHNpbXBsaWZ5IGdlbmVyYXRpbmcgYSAiZmFrZSIgcHJlc3MKKy8vIG9yIHJlbGVhc2Ugb2Ygc2hpZnQsIGN0cmwsIGFsdCwgZXRjLiAgQW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGlzIGNyZWF0ZWQKKy8vIGZvciBldmVyeSBtb2RpZmllciB3aGljaCBtYXkgbmVlZCB0byBiZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiAgVGhlbiBlaXRoZXIKKy8vIHByZXNzKCkgb3IgcmVsZWFzZSgpIG1heSBiZSBjYWxsZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcga2V5cworLy8gYXJlIGluIHRoZSByaWdodCBzdGF0ZS4gIFRoZSBkZXN0cnVjdG9yIG9mIHRoZSBjbGFzcyBhdXRvbWF0aWNhbGx5IHJldmVydHMKKy8vIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS4gIEVhY2ggbW9kaWZpZXIgbWF5IGhhdmUgbXVsdGlwbGUga2V5cyBhc3NvY2lhdGVkIHdpdGgKKy8vIGl0LCBzbyBpbiB0aGUgY2FzZSBvZiBhIGZha2UgcmVsZWFzZSwgdGhpcyBtYXkgaW52b2x2ZSByZWxlYXNpbmcgbW9yZSB0aGFuCisvLyBvbmUga2V5LgorCitjbGFzcyBNb2RpZmllclN0YXRlIHsKK3B1YmxpYzoKKyAgTW9kaWZpZXJTdGF0ZShEZXZpY2VJbnRQdHIgZGV2XywgaW50IG1vZEluZGV4XykKKyAgICA6IGRldihkZXZfKSwgbW9kSW5kZXgobW9kSW5kZXhfKSwgbktleXMoMCksIGtleXMoMCksIHByZXNzZWQoZmFsc2UpCisgIHsKKyAgfQorICB+TW9kaWZpZXJTdGF0ZSgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5LZXlzOyBpKyspCisgICAgICBnZW5lcmF0ZVhLZXlFdmVudChrZXlzW2ldLCAhcHJlc3NlZCk7CisgICAgZGVsZXRlIFtdIGtleXM7CisgIH0KKyAgdm9pZCBwcmVzcygpIHsKKyAgICBLZXlDbGFzc1B0ciBrZXljID0gZGV2LT5rZXk7CisgICAgaWYgKCEoa2V5Yy0+c3RhdGUgJiAoMTw8bW9kSW5kZXgpKSkgeworICAgICAgdGVtcEtleUV2ZW50KGtleWMtPm1vZGlmaWVyS2V5TWFwW21vZEluZGV4ICoga2V5Yy0+bWF4S2V5c1Blck1vZGlmaWVyXSwKKyAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgIHByZXNzZWQgPSB0cnVlOworICAgIH0KKyAgfQorICB2b2lkIHJlbGVhc2UoKSB7CisgICAgS2V5Q2xhc3NQdHIga2V5YyA9IGRldi0+a2V5OworICAgIGlmIChrZXljLT5zdGF0ZSAmICgxPDxtb2RJbmRleCkpIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwga2V5Yy0+bWF4S2V5c1Blck1vZGlmaWVyOyBrKyspIHsKKyAgICAgICAgaW50IGtleWNvZGUKKyAgICAgICAgICA9IGtleWMtPm1vZGlmaWVyS2V5TWFwW21vZEluZGV4ICoga2V5Yy0+bWF4S2V5c1Blck1vZGlmaWVyICsga107CisgICAgICAgIGlmIChrZXljb2RlICYmIElTX1BSRVNTRUQoa2V5Yywga2V5Y29kZSkpCisgICAgICAgICAgdGVtcEtleUV2ZW50KGtleWNvZGUsIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK3ByaXZhdGU6CisgIHZvaWQgdGVtcEtleUV2ZW50KGludCBrZXljb2RlLCBib29sIGRvd24pIHsKKyAgICBpZiAoa2V5Y29kZSkgeworICAgICAgaWYgKCFrZXlzKSBrZXlzID0gbmV3IGludFtkZXYtPmtleS0+bWF4S2V5c1Blck1vZGlmaWVyXTsKKyAgICAgIGtleXNbbktleXMrK10gPSBrZXljb2RlOworICAgICAgZ2VuZXJhdGVYS2V5RXZlbnQoa2V5Y29kZSwgZG93bik7CisgICAgfQorICB9CisgIHZvaWQgZ2VuZXJhdGVYS2V5RXZlbnQoaW50IGtleWNvZGUsIGJvb2wgZG93bikgeworICAgIHhFdmVudCBldjsKKyAgICBldi51LnUudHlwZSA9IGRvd24gPyBLZXlQcmVzcyA6IEtleVJlbGVhc2U7CisgICAgZXYudS51LmRldGFpbCA9IGtleWNvZGU7CisgICAgZXYudS5rZXlCdXR0b25Qb2ludGVyLnRpbWUgPSBHZXRUaW1lSW5NaWxsaXMoKTsKKyAgICAoKmRldi0+Y19wdWJsaWMucHJvY2Vzc0lucHV0UHJvYykoJmV2LCBkZXYsIDEpOworICAgIHZsb2cuZGVidWcoImZha2Uga2V5Y29kZSAlZCAlcyIsIGtleWNvZGUsIGRvd24gPyAiZG93biIgOiAidXAiKTsKKyAgfQorICBEZXZpY2VJbnRQdHIgZGV2OworICBpbnQgbW9kSW5kZXg7CisgIGludCBuS2V5czsKKyAgaW50KiBrZXlzOworICBib29sIHByZXNzZWQ7Cit9OworCisKKy8vIGFsdEtleXN5bSBpcyBhIHRhYmxlIG9mIGFsdGVybmF0aXZlIGtleXN5bXMgd2hpY2ggaGF2ZSB0aGUgc2FtZSBtZWFuaW5nLgorCitzdHJ1Y3QgYWx0S2V5c3ltX3QgeworICBLZXlTeW0gYSwgYjsKK307CisKK2FsdEtleXN5bV90IGFsdEtleXN5bVtdID0geworICB7IFhLX1NoaWZ0X0wsICAgICAgICBYS19TaGlmdF9SIH0sCisgIHsgWEtfQ29udHJvbF9MLCAgICAgIFhLX0NvbnRyb2xfUiB9LAorICB7IFhLX01ldGFfTCwgICAgICAgICBYS19NZXRhX1IgfSwKKyAgeyBYS19BbHRfTCwgICAgICAgICAgWEtfQWx0X1IgfSwKKyAgeyBYS19TdXBlcl9MLCAgICAgICAgWEtfU3VwZXJfUiB9LAorICB7IFhLX0h5cGVyX0wsICAgICAgICBYS19IeXBlcl9SIH0sCisgIHsgWEtfS1BfU3BhY2UsICAgICAgIFhLX3NwYWNlIH0sCisgIHsgWEtfS1BfVGFiLCAgICAgICAgIFhLX1RhYiB9LAorICB7IFhLX0tQX0VudGVyLCAgICAgICBYS19SZXR1cm4gfSwKKyAgeyBYS19LUF9GMSwgICAgICAgICAgWEtfRjEgfSwKKyAgeyBYS19LUF9GMiwgICAgICAgICAgWEtfRjIgfSwKKyAgeyBYS19LUF9GMywgICAgICAgICAgWEtfRjMgfSwKKyAgeyBYS19LUF9GNCwgICAgICAgICAgWEtfRjQgfSwKKyAgeyBYS19LUF9Ib21lLCAgICAgICAgWEtfSG9tZSB9LAorICB7IFhLX0tQX0xlZnQsICAgICAgICBYS19MZWZ0IH0sCisgIHsgWEtfS1BfVXAsICAgICAgICAgIFhLX1VwIH0sCisgIHsgWEtfS1BfUmlnaHQsICAgICAgIFhLX1JpZ2h0IH0sCisgIHsgWEtfS1BfRG93biwgICAgICAgIFhLX0Rvd24gfSwKKyAgeyBYS19LUF9QYWdlX1VwLCAgICAgWEtfUGFnZV9VcCB9LAorICB7IFhLX0tQX1BhZ2VfRG93biwgICBYS19QYWdlX0Rvd24gfSwKKyAgeyBYS19LUF9FbmQsICAgICAgICAgWEtfRW5kIH0sCisgIHsgWEtfS1BfQmVnaW4sICAgICAgIFhLX0JlZ2luIH0sCisgIHsgWEtfS1BfSW5zZXJ0LCAgICAgIFhLX0luc2VydCB9LAorICB7IFhLX0tQX0RlbGV0ZSwgICAgICBYS19EZWxldGUgfSwKKyAgeyBYS19LUF9FcXVhbCwgICAgICAgWEtfZXF1YWwgfSwKKyAgeyBYS19LUF9NdWx0aXBseSwgICAgWEtfYXN0ZXJpc2sgfSwKKyAgeyBYS19LUF9BZGQsICAgICAgICAgWEtfcGx1cyB9LAorICB7IFhLX0tQX1NlcGFyYXRvciwgICBYS19jb21tYSB9LAorICB7IFhLX0tQX1N1YnRyYWN0LCAgICBYS19taW51cyB9LAorICB7IFhLX0tQX0RlY2ltYWwsICAgICBYS19wZXJpb2QgfSwKKyAgeyBYS19LUF9EaXZpZGUsICAgICAgWEtfc2xhc2ggfSwKKyAgeyBYS19LUF8wLCAgICAgICAgICAgWEtfMCB9LAorICB7IFhLX0tQXzEsICAgICAgICAgICBYS18xIH0sCisgIHsgWEtfS1BfMiwgICAgICAgICAgIFhLXzIgfSwKKyAgeyBYS19LUF8zLCAgICAgICAgICAgWEtfMyB9LAorICB7IFhLX0tQXzQsICAgICAgICAgICBYS180IH0sCisgIHsgWEtfS1BfNSwgICAgICAgICAgIFhLXzUgfSwKKyAgeyBYS19LUF82LCAgICAgICAgICAgWEtfNiB9LAorICB7IFhLX0tQXzcsICAgICAgICAgICBYS183IH0sCisgIHsgWEtfS1BfOCwgICAgICAgICAgIFhLXzggfSwKKyAgeyBYS19LUF85LCAgICAgICAgICAgWEtfOSB9LAorfTsKKworLy8ga2V5RXZlbnQoKSAtIHdvcmsgb3V0IHRoZSBiZXN0IGtleWNvZGUgY29ycmVzcG9uZGluZyB0byB0aGUga2V5c3ltIHNlbnQgYnkKKy8vIHRoZSB2aWV3ZXIuICBUaGlzIGlzIG5vbi10cml2aWFsIGJlY2F1c2Ugd2UgY2FuJ3QgYXNzdW1lIG11Y2ggYWJvdXQgdGhlCisvLyBsb2NhbCBrZXlib2FyZCBsYXlvdXQuICBXZSBtdXN0IGFsc28gZmluZCBvdXQgd2hpY2ggY29sdW1uIG9mIHRoZSBrZXlib2FyZAorLy8gbWFwcGluZyB0aGUga2V5c3ltIGlzIGluLCBhbmQgYWx0ZXIgdGhlIHNoaWZ0IHN0YXRlIGFwcHJvcHJpYXRlbHkuICBDb2x1bW4gMAorLy8gbWVhbnMgYm90aCBzaGlmdCBhbmQgIm1vZGVfc3dpdGNoIiAoQWx0R3IpIG11c3QgYmUgcmVsZWFzZWQsIGNvbHVtbiAxIG1lYW5zCisvLyBzaGlmdCBtdXN0IGJlIHByZXNzZWQgYW5kIG1vZGVfc3dpdGNoIHJlbGVhc2VkLCBjb2x1bW4gMiBtZWFucyBzaGlmdCBtdXN0IGJlCisvLyByZWxlYXNlZCBhbmQgbW9kZV9zd2l0Y2ggcHJlc3NlZCwgYW5kIGNvbHVtbiAzIG1lYW5zIGJvdGggc2hpZnQgYW5kCisvLyBtb2RlX3N3aXRjaCBtdXN0IGJlIHByZXNzZWQuCisKK3ZvaWQgWHNlcnZlckRlc2t0b3A6OmtleUV2ZW50KHJkcjo6VTMyIGtleXN5bSwgYm9vbCBkb3duKQoreworICBpZiAoa2V5c3ltID09IFhLX0NhcHNfTG9jaykgeworICAgIHZsb2cuZGVidWcoIklnbm9yaW5nIGNhcHMgbG9jayIpOworICAgIHJldHVybjsKKyAgfQorICBEZXZpY2VJbnRQdHIgZGV2ID0gKERldmljZUludFB0cilMb29rdXBLZXlib2FyZERldmljZSgpOworICBLZXlDbGFzc1B0ciBrZXljID0gZGV2LT5rZXk7CisgIEtleVN5bXNQdHIga2V5bWFwID0gJmtleWMtPmN1cktleVN5bXM7CisKKyAgLy8gZmluZCB3aGljaCBtb2RpZmllciBNb2RlX3N3aXRjaCBpcyBvbi4KKyAgaW50IG1vZGVTd2l0Y2hNYXBJbmRleCA9IDA7CisgIGZvciAoaW50IGkgPSAzOyBpIDwgODsgaSsrKSB7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBrZXljLT5tYXhLZXlzUGVyTW9kaWZpZXI7IGsrKykgeworICAgICAgaW50IGtleWNvZGUgPSBrZXljLT5tb2RpZmllcktleU1hcFtpICoga2V5Yy0+bWF4S2V5c1Blck1vZGlmaWVyICsga107CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtleW1hcC0+bWFwV2lkdGg7IGorKykgeworICAgICAgICBpZiAoa2V5Y29kZSAhPSAwICYmCisgICAgICAgICAgICBrZXltYXAtPm1hcFsoa2V5Y29kZSAtIGtleW1hcC0+bWluS2V5Q29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICoga2V5bWFwLT5tYXBXaWR0aCArIGpdID09IFhLX01vZGVfc3dpdGNoKQorICAgICAgICB7CisgICAgICAgICAgbW9kZVN3aXRjaE1hcEluZGV4ID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGludCBjb2wgPSAwOworICBpZiAoa2V5Yy0+c3RhdGUgJiAoMTw8U2hpZnRNYXBJbmRleCkpIGNvbCB8PSAxOworICBpZiAobW9kZVN3aXRjaE1hcEluZGV4ICYmIChrZXljLT5zdGF0ZSAmICgxPDxtb2RlU3dpdGNoTWFwSW5kZXgpKSkgY29sIHw9IDI7CisKKyAgaW50IGtjID0gS2V5c3ltVG9LZXljb2RlKGtleW1hcCwga2V5c3ltLCAmY29sKTsKKworICAvLyBTb3J0IG91dCB0aGUgInNoaWZ0ZWQgVGFiIiBtZXNzLiAgSWYgd2UgYXJlIHNlbnQgYSBzaGlmdGVkIFRhYiwgZ2VuZXJhdGUgYQorICAvLyBsb2NhbCBzaGlmdGVkIFRhYiByZWdhcmRsZXNzIG9mIHdoYXQgdGhlICJzaGlmdGVkIFRhYiIga2V5c3ltIGlzIG9uIHRoZQorICAvLyBsb2NhbCBrZXlib2FyZCAoaXQgbWlnaHQgYmUgVGFiLCBJU09fTGVmdF9UYWIgb3IgSFAncyBwcml2YXRlIEJhY2tUYWIKKyAgLy8ga2V5c3ltLCBhbmQgcXVpdGUgcG9zc2libHkgc29tZSBvdGhlcnMgdG9vKS4gIFdlIG5ldmVyIGdldCBJU09fTGVmdF9UYWIKKyAgLy8gaGVyZSBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIHRyYW5zbGF0ZWQgaW4gVk5DU0Nvbm5lY3Rpb25TVC4KKyAgaWYgKGtleXN5bSA9PSBYS19UYWIgJiYgKGtleWMtPnN0YXRlICYgKDE8PFNoaWZ0TWFwSW5kZXgpKSkKKyAgICBjb2wgfD0gMTsKKworICBpZiAoa2MgPT0gMCkgeworICAgIC8vIE5vdCBhIGRpcmVjdCBtYXRjaCBpbiB0aGUgbG9jYWwga2V5Ym9hcmQgbWFwcGluZy4gIENoZWNrIGZvciBhbHRlcm5hdGl2ZQorICAgIC8vIGtleXN5bXMgd2l0aCB0aGUgc2FtZSBtZWFuaW5nLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGFsdEtleXN5bSkgLyBzaXplb2YoYWx0S2V5c3ltX3QpOyBpKyspIHsKKyAgICAgIGlmIChrZXlzeW0gPT0gYWx0S2V5c3ltW2ldLmEpCisgICAgICAgIGtjID0gS2V5c3ltVG9LZXljb2RlKGtleW1hcCwgYWx0S2V5c3ltW2ldLmIsICZjb2wpOworICAgICAgZWxzZSBpZiAoa2V5c3ltID09IGFsdEtleXN5bVtpXS5iKQorICAgICAgICBrYyA9IEtleXN5bVRvS2V5Y29kZShrZXltYXAsIGFsdEtleXN5bVtpXS5hLCAmY29sKTsKKyAgICAgIGlmIChrYykgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGtjID09IDApIHsKKyAgICAvLyBMYXN0IHJlc29ydCAtIGR5bmFtaWNhbGx5IGFkZCBhIG5ldyBrZXkgdG8gdGhlIGtleWJvYXJkIG1hcHBpbmcuCisgICAgZm9yIChrYyA9IGtleW1hcC0+bWF4S2V5Q29kZTsga2MgPj0ga2V5bWFwLT5taW5LZXlDb2RlOyBrYy0tKSB7CisgICAgICBpZiAoIWtleW1hcC0+bWFwWyhrYyAtIGtleW1hcC0+bWluS2V5Q29kZSkgKiBrZXltYXAtPm1hcFdpZHRoXSkgeworICAgICAgICBrZXltYXAtPm1hcFsoa2MgLSBrZXltYXAtPm1pbktleUNvZGUpICoga2V5bWFwLT5tYXBXaWR0aF0gPSBrZXlzeW07CisgICAgICAgIGNvbCA9IDA7CisgICAgICAgIFNlbmRNYXBwaW5nTm90aWZ5KE1hcHBpbmdLZXlib2FyZCwga2MsIDEsIHNlcnZlckNsaWVudCk7CisgICAgICAgIHZsb2cuaW5mbygiQWRkZWQgdW5rbm93biBrZXlzeW0gMHgleCB0byBrZXljb2RlICVkIixrZXlzeW0sa2MpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGtjIDwga2V5bWFwLT5taW5LZXlDb2RlKSB7CisgICAgICB2bG9nLmluZm8oIktleWJvYXJkIG1hcHBpbmcgZnVsbCAtIGlnbm9yaW5nIHVua25vd24ga2V5c3ltIDB4JXgiLGtleXN5bSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gU2VlIGlmIGl0J3MgYSBtb2RpZmllciBrZXkuICBJZiBzbywgdGhlbiBkb24ndCBkbyBhbnkgYXV0by1yZXBlYXQsIGJlY2F1c2UKKyAgLy8gdGhlIFggc2VydmVyIHdpbGwgdHJhbnNsYXRlIGVhY2ggcHJlc3MgaW50byBhIHJlbGVhc2UgZm9sbG93ZWQgYnkgYSBwcmVzcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IGtleWMtPm1heEtleXNQZXJNb2RpZmllcjsgaysrKSB7CisgICAgICBpZiAoa2MgPT0ga2V5Yy0+bW9kaWZpZXJLZXlNYXBbaSAqIGtleWMtPm1heEtleXNQZXJNb2RpZmllciArIGtdICYmCisgICAgICAgICAgSVNfUFJFU1NFRChrZXljLGtjKSAmJiBkb3duKQorICAgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgTW9kaWZpZXJTdGF0ZSBzaGlmdChkZXYsIFNoaWZ0TWFwSW5kZXgpOworICBNb2RpZmllclN0YXRlIG1vZGVTd2l0Y2goZGV2LCBtb2RlU3dpdGNoTWFwSW5kZXgpOworICBpZiAoZG93bikgeworICAgIGlmIChjb2wgJiAxKQorICAgICAgc2hpZnQucHJlc3MoKTsKKyAgICBlbHNlCisgICAgICBzaGlmdC5yZWxlYXNlKCk7CisgICAgaWYgKG1vZGVTd2l0Y2hNYXBJbmRleCkgeworICAgICAgaWYgKGNvbCAmIDIpCisgICAgICAgIG1vZGVTd2l0Y2gucHJlc3MoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbW9kZVN3aXRjaC5yZWxlYXNlKCk7CisgICAgfQorICB9CisgIHZsb2cuZGVidWcoImtleWNvZGUgJWQgJXMiLCBrYywgZG93biA/ICJkb3duIiA6ICJ1cCIpOworICB4RXZlbnQgZXY7CisgIGV2LnUudS50eXBlID0gZG93biA/IEtleVByZXNzIDogS2V5UmVsZWFzZTsKKyAgZXYudS51LmRldGFpbCA9IGtjOworICBldi51LmtleUJ1dHRvblBvaW50ZXIudGltZSA9IEdldFRpbWVJbk1pbGxpcygpOworICAoKmRldi0+Y19wdWJsaWMucHJvY2Vzc0lucHV0UHJvYykoJmV2LCBkZXYsIDEpOworfQorCisKK3ZvaWQgWENvbnZlcnRDYXNlKEtleVN5bSBzeW0sIEtleVN5bSAqbG93ZXIsIEtleVN5bSAqdXBwZXIpCit7CisgICAgKmxvd2VyID0gc3ltOworICAgICp1cHBlciA9IHN5bTsKKyAgICBzd2l0Y2goc3ltID4+IDgpIHsKKyAgICBjYXNlIDA6IC8qIExhdGluIDEgKi8KKwlpZiAoKHN5bSA+PSBYS19BKSAmJiAoc3ltIDw9IFhLX1opKQorCSAgICAqbG93ZXIgKz0gKFhLX2EgLSBYS19BKTsKKwllbHNlIGlmICgoc3ltID49IFhLX2EpICYmIChzeW0gPD0gWEtfeikpCisJICAgICp1cHBlciAtPSAoWEtfYSAtIFhLX0EpOworCWVsc2UgaWYgKChzeW0gPj0gWEtfQWdyYXZlKSAmJiAoc3ltIDw9IFhLX09kaWFlcmVzaXMpKQorCSAgICAqbG93ZXIgKz0gKFhLX2FncmF2ZSAtIFhLX0FncmF2ZSk7CisJZWxzZSBpZiAoKHN5bSA+PSBYS19hZ3JhdmUpICYmIChzeW0gPD0gWEtfb2RpYWVyZXNpcykpCisJICAgICp1cHBlciAtPSAoWEtfYWdyYXZlIC0gWEtfQWdyYXZlKTsKKwllbHNlIGlmICgoc3ltID49IFhLX09vYmxpcXVlKSAmJiAoc3ltIDw9IFhLX1Rob3JuKSkKKwkgICAgKmxvd2VyICs9IChYS19vc2xhc2ggLSBYS19Pb2JsaXF1ZSk7CisJZWxzZSBpZiAoKHN5bSA+PSBYS19vc2xhc2gpICYmIChzeW0gPD0gWEtfdGhvcm4pKQorCSAgICAqdXBwZXIgLT0gKFhLX29zbGFzaCAtIFhLX09vYmxpcXVlKTsKKwlicmVhazsKKyAgICBjYXNlIDE6IC8qIExhdGluIDIgKi8KKwkvKiBBc3N1bWUgdGhlIEtleVN5bSBpcyBhIGxlZ2FsIHZhbHVlIChpZ25vcmUgZGlzY29udGludWl0aWVzKSAqLworCWlmIChzeW0gPT0gWEtfQW9nb25laykKKwkgICAgKmxvd2VyID0gWEtfYW9nb25lazsKKwllbHNlIGlmIChzeW0gPj0gWEtfTHN0cm9rZSAmJiBzeW0gPD0gWEtfU2FjdXRlKQorCSAgICAqbG93ZXIgKz0gKFhLX2xzdHJva2UgLSBYS19Mc3Ryb2tlKTsKKwllbHNlIGlmIChzeW0gPj0gWEtfU2Nhcm9uICYmIHN5bSA8PSBYS19aYWN1dGUpCisJICAgICpsb3dlciArPSAoWEtfc2Nhcm9uIC0gWEtfU2Nhcm9uKTsKKwllbHNlIGlmIChzeW0gPj0gWEtfWmNhcm9uICYmIHN5bSA8PSBYS19aYWJvdmVkb3QpCisJICAgICpsb3dlciArPSAoWEtfemNhcm9uIC0gWEtfWmNhcm9uKTsKKwllbHNlIGlmIChzeW0gPT0gWEtfYW9nb25laykKKwkgICAgKnVwcGVyID0gWEtfQW9nb25lazsKKwllbHNlIGlmIChzeW0gPj0gWEtfbHN0cm9rZSAmJiBzeW0gPD0gWEtfc2FjdXRlKQorCSAgICAqdXBwZXIgLT0gKFhLX2xzdHJva2UgLSBYS19Mc3Ryb2tlKTsKKwllbHNlIGlmIChzeW0gPj0gWEtfc2Nhcm9uICYmIHN5bSA8PSBYS196YWN1dGUpCisJICAgICp1cHBlciAtPSAoWEtfc2Nhcm9uIC0gWEtfU2Nhcm9uKTsKKwllbHNlIGlmIChzeW0gPj0gWEtfemNhcm9uICYmIHN5bSA8PSBYS196YWJvdmVkb3QpCisJICAgICp1cHBlciAtPSAoWEtfemNhcm9uIC0gWEtfWmNhcm9uKTsKKwllbHNlIGlmIChzeW0gPj0gWEtfUmFjdXRlICYmIHN5bSA8PSBYS19UY2VkaWxsYSkKKwkgICAgKmxvd2VyICs9IChYS19yYWN1dGUgLSBYS19SYWN1dGUpOworCWVsc2UgaWYgKHN5bSA+PSBYS19yYWN1dGUgJiYgc3ltIDw9IFhLX3RjZWRpbGxhKQorCSAgICAqdXBwZXIgLT0gKFhLX3JhY3V0ZSAtIFhLX1JhY3V0ZSk7CisJYnJlYWs7CisgICAgY2FzZSAyOiAvKiBMYXRpbiAzICovCisJLyogQXNzdW1lIHRoZSBLZXlTeW0gaXMgYSBsZWdhbCB2YWx1ZSAoaWdub3JlIGRpc2NvbnRpbnVpdGllcykgKi8KKwlpZiAoc3ltID49IFhLX0hzdHJva2UgJiYgc3ltIDw9IFhLX0hjaXJjdW1mbGV4KQorCSAgICAqbG93ZXIgKz0gKFhLX2hzdHJva2UgLSBYS19Ic3Ryb2tlKTsKKwllbHNlIGlmIChzeW0gPj0gWEtfR2JyZXZlICYmIHN5bSA8PSBYS19KY2lyY3VtZmxleCkKKwkgICAgKmxvd2VyICs9IChYS19nYnJldmUgLSBYS19HYnJldmUpOworCWVsc2UgaWYgKHN5bSA+PSBYS19oc3Ryb2tlICYmIHN5bSA8PSBYS19oY2lyY3VtZmxleCkKKwkgICAgKnVwcGVyIC09IChYS19oc3Ryb2tlIC0gWEtfSHN0cm9rZSk7CisJZWxzZSBpZiAoc3ltID49IFhLX2dicmV2ZSAmJiBzeW0gPD0gWEtfamNpcmN1bWZsZXgpCisJICAgICp1cHBlciAtPSAoWEtfZ2JyZXZlIC0gWEtfR2JyZXZlKTsKKwllbHNlIGlmIChzeW0gPj0gWEtfQ2Fib3ZlZG90ICYmIHN5bSA8PSBYS19TY2lyY3VtZmxleCkKKwkgICAgKmxvd2VyICs9IChYS19jYWJvdmVkb3QgLSBYS19DYWJvdmVkb3QpOworCWVsc2UgaWYgKHN5bSA+PSBYS19jYWJvdmVkb3QgJiYgc3ltIDw9IFhLX3NjaXJjdW1mbGV4KQorCSAgICAqdXBwZXIgLT0gKFhLX2NhYm92ZWRvdCAtIFhLX0NhYm92ZWRvdCk7CisJYnJlYWs7CisgICAgY2FzZSAzOiAvKiBMYXRpbiA0ICovCisJLyogQXNzdW1lIHRoZSBLZXlTeW0gaXMgYSBsZWdhbCB2YWx1ZSAoaWdub3JlIGRpc2NvbnRpbnVpdGllcykgKi8KKwlpZiAoc3ltID49IFhLX1JjZWRpbGxhICYmIHN5bSA8PSBYS19Uc2xhc2gpCisJICAgICpsb3dlciArPSAoWEtfcmNlZGlsbGEgLSBYS19SY2VkaWxsYSk7CisJZWxzZSBpZiAoc3ltID49IFhLX3JjZWRpbGxhICYmIHN5bSA8PSBYS190c2xhc2gpCisJICAgICp1cHBlciAtPSAoWEtfcmNlZGlsbGEgLSBYS19SY2VkaWxsYSk7CisJZWxzZSBpZiAoc3ltID09IFhLX0VORykKKwkgICAgKmxvd2VyID0gWEtfZW5nOworCWVsc2UgaWYgKHN5bSA9PSBYS19lbmcpCisJICAgICp1cHBlciA9IFhLX0VORzsKKwllbHNlIGlmIChzeW0gPj0gWEtfQW1hY3JvbiAmJiBzeW0gPD0gWEtfVW1hY3JvbikKKwkgICAgKmxvd2VyICs9IChYS19hbWFjcm9uIC0gWEtfQW1hY3Jvbik7CisJZWxzZSBpZiAoc3ltID49IFhLX2FtYWNyb24gJiYgc3ltIDw9IFhLX3VtYWNyb24pCisJICAgICp1cHBlciAtPSAoWEtfYW1hY3JvbiAtIFhLX0FtYWNyb24pOworCWJyZWFrOworICAgIGNhc2UgNjogLyogQ3lyaWxsaWMgKi8KKwkvKiBBc3N1bWUgdGhlIEtleVN5bSBpcyBhIGxlZ2FsIHZhbHVlIChpZ25vcmUgZGlzY29udGludWl0aWVzKSAqLworCWlmIChzeW0gPj0gWEtfU2VyYmlhbl9ESkUgJiYgc3ltIDw9IFhLX1NlcmJpYW5fRFpFKQorCSAgICAqbG93ZXIgLT0gKFhLX1NlcmJpYW5fREpFIC0gWEtfU2VyYmlhbl9kamUpOworCWVsc2UgaWYgKHN5bSA+PSBYS19TZXJiaWFuX2RqZSAmJiBzeW0gPD0gWEtfU2VyYmlhbl9kemUpCisJICAgICp1cHBlciArPSAoWEtfU2VyYmlhbl9ESkUgLSBYS19TZXJiaWFuX2RqZSk7CisJZWxzZSBpZiAoc3ltID49IFhLX0N5cmlsbGljX1lVICYmIHN5bSA8PSBYS19DeXJpbGxpY19IQVJEU0lHTikKKwkgICAgKmxvd2VyIC09IChYS19DeXJpbGxpY19ZVSAtIFhLX0N5cmlsbGljX3l1KTsKKwllbHNlIGlmIChzeW0gPj0gWEtfQ3lyaWxsaWNfeXUgJiYgc3ltIDw9IFhLX0N5cmlsbGljX2hhcmRzaWduKQorCSAgICAqdXBwZXIgKz0gKFhLX0N5cmlsbGljX1lVIC0gWEtfQ3lyaWxsaWNfeXUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6IC8qIEdyZWVrICovCisJLyogQXNzdW1lIHRoZSBLZXlTeW0gaXMgYSBsZWdhbCB2YWx1ZSAoaWdub3JlIGRpc2NvbnRpbnVpdGllcykgKi8KKwlpZiAoc3ltID49IFhLX0dyZWVrX0FMUEhBYWNjZW50ICYmIHN5bSA8PSBYS19HcmVla19PTUVHQWFjY2VudCkKKwkgICAgKmxvd2VyICs9IChYS19HcmVla19hbHBoYWFjY2VudCAtIFhLX0dyZWVrX0FMUEhBYWNjZW50KTsKKwllbHNlIGlmIChzeW0gPj0gWEtfR3JlZWtfYWxwaGFhY2NlbnQgJiYgc3ltIDw9IFhLX0dyZWVrX29tZWdhYWNjZW50ICYmCisJCSBzeW0gIT0gWEtfR3JlZWtfaW90YWFjY2VudGRpZXJlc2lzICYmCisJCSBzeW0gIT0gWEtfR3JlZWtfdXBzaWxvbmFjY2VudGRpZXJlc2lzKQorCSAgICAqdXBwZXIgLT0gKFhLX0dyZWVrX2FscGhhYWNjZW50IC0gWEtfR3JlZWtfQUxQSEFhY2NlbnQpOworCWVsc2UgaWYgKHN5bSA+PSBYS19HcmVla19BTFBIQSAmJiBzeW0gPD0gWEtfR3JlZWtfT01FR0EpCisJICAgICpsb3dlciArPSAoWEtfR3JlZWtfYWxwaGEgLSBYS19HcmVla19BTFBIQSk7CisJZWxzZSBpZiAoc3ltID49IFhLX0dyZWVrX2FscGhhICYmIHN5bSA8PSBYS19HcmVla19vbWVnYSAmJgorCQkgc3ltICE9IFhLX0dyZWVrX2ZpbmFsc21hbGxzaWdtYSkKKwkgICAgKnVwcGVyIC09IChYS19HcmVla19hbHBoYSAtIFhLX0dyZWVrX0FMUEhBKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgS2V5U3ltIEtleUNvZGV0b0tleVN5bShLZXlTeW1zUHRyIGtleW1hcCwgaW50IGtleWNvZGUsIGludCBjb2wpCit7CisgIHJlZ2lzdGVyIGludCBwZXIgPSBrZXltYXAtPm1hcFdpZHRoOworICByZWdpc3RlciBLZXlTeW0gKnN5bXM7CisgIEtleVN5bSBsc3ltLCB1c3ltOworCisgIGlmICgoY29sIDwgMCkgfHwgKChjb2wgPj0gcGVyKSAmJiAoY29sID4gMykpIHx8CisgICAgICAoa2V5Y29kZSA8IGtleW1hcC0+bWluS2V5Q29kZSkgfHwgKGtleWNvZGUgPiBrZXltYXAtPm1heEtleUNvZGUpKQorICAgIHJldHVybiBOb1N5bWJvbDsKKworICBzeW1zID0gJmtleW1hcC0+bWFwWyhrZXljb2RlIC0ga2V5bWFwLT5taW5LZXlDb2RlKSAqIHBlcl07CisgIGlmIChjb2wgPCA0KSB7CisgICAgaWYgKGNvbCA+IDEpIHsKKyAgICAgIHdoaWxlICgocGVyID4gMikgJiYgKHN5bXNbcGVyIC0gMV0gPT0gTm9TeW1ib2wpKQorICAgICAgICBwZXItLTsKKyAgICAgIGlmIChwZXIgPCAzKQorICAgICAgICBjb2wgLT0gMjsKKyAgICB9CisgICAgaWYgKChwZXIgPD0gKGNvbHwxKSkgfHwgKHN5bXNbY29sfDFdID09IE5vU3ltYm9sKSkgeworICAgICAgWENvbnZlcnRDYXNlKHN5bXNbY29sJn4xXSwgJmxzeW0sICZ1c3ltKTsKKyAgICAgIGlmICghKGNvbCAmIDEpKQorICAgICAgICByZXR1cm4gbHN5bTsKKyAgICAgIC8vIEknbSBjb21tZW50aW5nIG91dCB0aGlzIGxvZ2ljIGJlY2F1c2UgaXQncyBpbmNvcnJlY3QgZXZlbiB0aG91Z2ggaXQKKyAgICAgIC8vIHdhcyBjb3BpZWQgZnJvbSB0aGUgWGxpYiBzb3VyY2VzLiAgVGhlIFggcHJvdG9jb2wgYm9vayBxdWl0ZSBjbGVhcmx5CisgICAgICAvLyBzdGF0ZXMgdGhhdCB3aGVyZSBhIGdyb3VwIGNvbnNpc3RzIG9mIGVsZW1lbnQgMSBiZWluZyBhIG5vbi1hbHBoYWJldGljCisgICAgICAvLyBrZXlzeW0gYW5kIGVsZW1lbnQgMiBiZWluZyBOb1N5bWJvbCB0aGF0IHlvdSB0cmVhdCB0aGUgc2Vjb25kIGVsZW1lbnQKKyAgICAgIC8vIGFzIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBmaXJzdC4gIFRoaXMgYWxzbyB0YWxsaWVzIHdpdGggdGhlIGJlaGF2aW91cgorICAgICAgLy8gcHJvZHVjZWQgYnkgdGhlIGluc3RhbGxlZCBYbGliIG9uIG15IGxpbnV4IGJveCAoSSBiZWxpZXZlIHRoaXMgaXMKKyAgICAgIC8vIGJlY2F1c2UgaXQgdXNlcyBzb21lIFhLQiBjb2RlIHJhdGhlciB0aGFuIHRoZSBvcmlnaW5hbCBYbGliIGNvZGUgLQorICAgICAgLy8gY29tcGFyZSBYS0JCaW5kLmMgd2l0aCBLZXlCaW5kLmMgaW4gbGliL1gxMSkuCisgICAgICAvLyBlbHNlIGlmICh1c3ltID09IGxzeW0pCisgICAgICAvLyAgIHJldHVybiBOb1N5bWJvbDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHVzeW07CisgICAgfQorICB9CisgIHJldHVybiBzeW1zW2NvbF07Cit9CisKKy8vIEtleXN5bVRvS2V5Y29kZSgpIC0gZmluZCB0aGUga2V5Y29kZSBhbmQgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisvLyBrZXlzeW0uICBUaGUgdmFsdWUgb2YgY29sIHBhc3NlZCBpbiBzaG91bGQgYmUgdGhlIGNvbHVtbiBkZXRlcm1pbmVkIGZyb20gdGhlCisvLyBjdXJyZW50IHNoaWZ0IHN0YXRlLiAgSWYgdGhlIGtleXN5bSBjYW4gYmUgZm91bmQgaW4gdGhhdCBjb2x1bW4gd2UgcHJlZmVyCisvLyB0aGF0IHRvIGZpbmRpbmcgaXQgaW4gYSBkaWZmZXJlbnQgY29sdW1uICh3aGljaCB3b3VsZCByZXF1aXJlIGZha2UgZXZlbnRzIHRvCisvLyBhbHRlciB0aGUgc2hpZnQgc3RhdGUpLgorCitzdGF0aWMgS2V5Q29kZSBLZXlzeW1Ub0tleWNvZGUoS2V5U3ltc1B0ciBrZXltYXAsIEtleVN5bSBrcywgaW50KiBjb2wpCit7CisgIHJlZ2lzdGVyIGludCBpLCBqOworCisgIGogPSAqY29sOworICBmb3IgKGkgPSBrZXltYXAtPm1pbktleUNvZGU7IGkgPD0ga2V5bWFwLT5tYXhLZXlDb2RlOyBpKyspIHsKKyAgICBpZiAoS2V5Q29kZXRvS2V5U3ltKGtleW1hcCwgaSwgaikgPT0ga3MpCisgICAgICByZXR1cm4gaTsKKyAgfQorCisgIGZvciAoaiA9IDA7IGogPCBrZXltYXAtPm1hcFdpZHRoOyBqKyspIHsKKyAgICBmb3IgKGkgPSBrZXltYXAtPm1pbktleUNvZGU7IGkgPD0ga2V5bWFwLT5tYXhLZXlDb2RlOyBpKyspIHsKKyAgICAgIGlmIChLZXlDb2RldG9LZXlTeW0oa2V5bWFwLCBpLCBqKSA9PSBrcykgeworICAgICAgICAqY29sID0gajsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Yc2VydmVyRGVza3RvcC5oIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Yc2VydmVyRGVza3RvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGFjYzIKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL1hzZXJ2ZXJEZXNrdG9wLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKy8vCisvLyBYc2VydmVyRGVza3RvcC5oCisvLworCisjaWZuZGVmIF9fWFNFUlZFUkRFU0tUT1BfSF9fCisjZGVmaW5lIF9fWFNFUlZFUkRFU0tUT1BfSF9fCisKKyNpbmNsdWRlIDxyZmIvU0Rlc2t0b3AuaD4KKyNpbmNsdWRlIDxyZmIvSFRUUFNlcnZlci5oPgorI2luY2x1ZGUgPHJmYi9QaXhlbEJ1ZmZlci5oPgorI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8cmZiL1ZOQ1NlcnZlclNULmg+CisjaW5jbHVkZSA8cmRyL1N1YnN0aXR1dGluZ0luU3RyZWFtLmg+CisKK2V4dGVybiAiQyIgeworI2RlZmluZSBjbGFzcyBjX2NsYXNzOworI2luY2x1ZGUgPHNjcm5pbnRzdHIuaD4KKyNpbmNsdWRlIDxvcy5oPgorI3VuZGVmIGNsYXNzCit9CisKK25hbWVzcGFjZSByZmIgeworICBjbGFzcyBWTkNTZXJ2ZXJTVDsKK30KKworbmFtZXNwYWNlIG5ldHdvcmsgeyBjbGFzcyBUY3BMaXN0ZW5lcjsgY2xhc3MgU29ja2V0OyB9CisKK2NsYXNzIFhzZXJ2ZXJEZXNrdG9wIDogcHVibGljIHJmYjo6U0Rlc2t0b3AsIHB1YmxpYyByZmI6OkZ1bGxGcmFtZVBpeGVsQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgcmZiOjpDb2xvdXJNYXAsIHB1YmxpYyByZHI6OlN1YnN0aXR1dG9yLAorICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgcmZiOjpWTkNTZXJ2ZXJTVDo6UXVlcnlDb25uZWN0aW9uSGFuZGxlciB7CitwdWJsaWM6CisKKyAgWHNlcnZlckRlc2t0b3AoU2NyZWVuUHRyIHBTY3JlZW4sIG5ldHdvcms6OlRjcExpc3RlbmVyKiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgbmV0d29yazo6VGNwTGlzdGVuZXIqIGh0dHBMaXN0ZW5lcl8sCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGZicHRyKTsKKyAgdmlydHVhbCB+WHNlcnZlckRlc2t0b3AoKTsKKworICAvLyBtZXRob2RzIGNhbGxlZCBmcm9tIFggc2VydmVyIGNvZGUKKyAgdm9pZCBzZXJ2ZXJSZXNldChTY3JlZW5QdHIgcFNjcmVlbik7CisgIHZvaWQgc2V0Q29sb3JtYXAoQ29sb3JtYXBQdHIgY21hcCk7CisgIHZvaWQgc2V0Q29sb3VyTWFwRW50cmllcyhDb2xvcm1hcFB0ciBwQ29sb3JtYXAsIGludCBuZGVmLCB4Q29sb3JJdGVtKiBwZGVmKTsKKyAgdm9pZCBiZWxsKCk7CisgIHZvaWQgc2VydmVyQ3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pOworICB2b2lkIHNldEN1cnNvcihDdXJzb3JQdHIgY3Vyc29yKTsKKyAgdm9pZCBhZGRfY2hhbmdlZChSZWdpb25QdHIgcmVnKTsKKyAgdm9pZCBhZGRfY29waWVkKFJlZ2lvblB0ciBkc3QsIGludCBkeCwgaW50IGR5KTsKKyAgdm9pZCBwb3NpdGlvbkN1cnNvcigpOworICB2b2lkIGlnbm9yZUhvb2tzKGJvb2wgYikgeyBpZ25vcmVIb29rc18gPSBiOyB9CisgIHZvaWQgYmxvY2tIYW5kbGVyKGZkX3NldCogZmRzKTsKKyAgdm9pZCB3YWtldXBIYW5kbGVyKGZkX3NldCogZmRzLCBpbnQgbmZkcyk7CisgIHZvaWQgYWRkQ2xpZW50KG5ldHdvcms6OlNvY2tldCogc29jaywgYm9vbCByZXZlcnNlKTsKKyAgdm9pZCBkaXNjb25uZWN0Q2xpZW50cygpOworCisgIC8vIFF1ZXJ5Q29ubmVjdCBtZXRob2RzIGNhbGxlZCBmcm9tIFggc2VydmVyIGNvZGUKKyAgLy8gZ2V0UXVlcnlUaW1lb3V0KCkKKyAgLy8gICBSZXR1cm5zIHRoZSB0aW1lb3V0IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKKyAgLy8gICBjb25uZWN0aW9uLCBpZGVudGlmaWVkIGJ5IGFuIG9wYXF1ZSBJZCBwYXNzZWQgdG8gdGhlCisgIC8vICAgWCBjb2RlIGVhcmxpZXIuICBBbHNvIG9wdGlvbmFsbHkgZ2V0cyB0aGUgYWRkcmVzcyBhbmQKKyAgLy8gICBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGNvbm5lY3Rpb24uCisgIC8vICAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJZCBpcyBub3QgcmVjb2duaXNlZC4KKyAgaW50IGdldFF1ZXJ5VGltZW91dCh2b2lkKiBvcGFxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogYWRkcmVzcz0wLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiB1c2VybmFtZT0wKTsKKworICAvLyBhcHByb3ZlQ29ubmVjdGlvbigpCisgIC8vICAgVXNlZCBieSBYIHNlcnZlciBjb2RlIHRvIHN1cHBseSB0aGUgcmVzdWx0IG9mIGEgcXVlcnkuCisgIHZvaWQgYXBwcm92ZUNvbm5lY3Rpb24odm9pZCogb3BhcXVlSWQsIGJvb2wgYWNjZXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJlamVjdE1zZz0wKTsKKworICAvLyByZmI6OlNEZXNrdG9wIGNhbGxiYWNrcworICB2aXJ0dWFsIHZvaWQgcG9pbnRlckV2ZW50KGNvbnN0IHJmYjo6UG9pbnQmIHBvcywgaW50IGJ1dHRvbk1hc2spOworICB2aXJ0dWFsIHZvaWQga2V5RXZlbnQocmRyOjpVMzIga2V5LCBib29sIGRvd24pOworICB2aXJ0dWFsIHZvaWQgY2xpZW50Q3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pOworICB2aXJ0dWFsIHJmYjo6UG9pbnQgZ2V0RmJTaXplKCkgeyByZXR1cm4gcmZiOjpQb2ludCh3aWR0aCgpLCBoZWlnaHQoKSk7IH0KKworICAvLyByZmI6OlBpeGVsQnVmZmVyIGNhbGxiYWNrcworICB2aXJ0dWFsIHZvaWQgZ3JhYlJlZ2lvbihjb25zdCByZmI6OlJlZ2lvbiYgcik7CisKKyAgLy8gcmZiOjpDb2xvdXJNYXAgY2FsbGJhY2tzCisgIHZpcnR1YWwgdm9pZCBsb29rdXAoaW50IGluZGV4LCBpbnQqIHIsIGludCogZywgaW50KiBiKTsKKworICAvLyByZHI6OlN1YnN0aXR1dG9yIGNhbGxiYWNrCisgIHZpcnR1YWwgY2hhciogc3Vic3RpdHV0ZShjb25zdCBjaGFyKiB2YXJOYW1lKTsKKworICAvLyByZmI6OlZOQ1NlcnZlclNUOjpRdWVyeUNvbm5lY3Rpb25IYW5kbGVyIGNhbGxiYWNrCisgIHZpcnR1YWwgcmZiOjpWTkNTZXJ2ZXJTVDo6cXVlcnlSZXN1bHQgcXVlcnlDb25uZWN0aW9uKG5ldHdvcms6OlNvY2tldCogc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiByZWFzb24pOworCitwcml2YXRlOgorICB2b2lkIHNldENvbG91ck1hcEVudHJpZXMoaW50IGZpcnN0Q29sb3VyLCBpbnQgbkNvbG91cnMpOworICBzdGF0aWMgQ0FSRDMyIGRlZmVycmVkVXBkYXRlVGltZXJDYWxsYmFjayhPc1RpbWVyUHRyIHRpbWVyLCBDQVJEMzIgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIGFyZyk7CisgIHZvaWQgZGVmZXJVcGRhdGUoKTsKKyAgU2NyZWVuUHRyIHBTY3JlZW47CisgIE9zVGltZXJQdHIgZGVmZXJyZWRVcGRhdGVUaW1lciwgZHVtbXlUaW1lcjsKKyAgcmZiOjpWTkNTZXJ2ZXJTVCogc2VydmVyOworICByZmI6OkhUVFBTZXJ2ZXIqIGh0dHBTZXJ2ZXI7CisgIG5ldHdvcms6OlRjcExpc3RlbmVyKiBsaXN0ZW5lcjsKKyAgbmV0d29yazo6VGNwTGlzdGVuZXIqIGh0dHBMaXN0ZW5lcjsKKyAgQ29sb3JtYXBQdHIgY21hcDsKKyAgYm9vbCBkZWZlcnJlZFVwZGF0ZVRpbWVyU2V0OworICBib29sIGdyYWJiaW5nOworICBib29sIGlnbm9yZUhvb2tzXzsKKyAgYm9vbCBkaXJlY3RGYnB0cjsKKyAgaW50IG9sZEJ1dHRvbk1hc2s7CisgIHJmYjo6UG9pbnQgY3Vyc29yUG9zLCBvbGRDdXJzb3JQb3M7CisKKyAgdm9pZCogcXVlcnlDb25uZWN0SWQ7CisgIHJmYjo6Q2hhckFycmF5IHF1ZXJ5Q29ubmVjdEFkZHJlc3M7CisgIHJmYjo6Q2hhckFycmF5IHF1ZXJ5Q29ubmVjdFVzZXJuYW1lOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Ydm5jL0ltYWtlZmlsZSBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvWHZuYy9JbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ODVhZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvWHZuYy9JbWFrZWZpbGUKQEAgLTAsMCArMSw5NSBAQAorCisgICAgICAgVk5DVE9QID0gJChUT1ApLy4uCisgICAgICBWTkNMSUJTID0gVm5jRXh0TGlicworICAgVk5DSU5DTFVERSA9IC1JJChWTkNUT1ApIC1JJChWTkNUT1ApL3ZuY2NvbmZpZ191bml4CisKKyNpZiBkZWZpbmVkKFhGcmVlODZWZXJzaW9uKSAmJiBYRnJlZTg2VmVyc2lvbiA8IDQwMDAKKyAgIFZOQ0RFRklORVMgPSAtRE5PX0lOSVRfQkFDS0lOR19TVE9SRQorI2VuZGlmCisKKyNkZWZpbmUgQ3BsdXNwbHVzU291cmNlCisKKyNpbmNsdWRlIDxTZXJ2ZXIudG1wbD4KKworI2lmIEhhc1NobQorU0hNREVGID0gLURIQVNfU0hNCisjZW5kaWYKKworWENPTU0gYWRkIG1vcmUgYXJjaGl0ZWN0dXJlcyBoZXJlIGFzIHdlIGRpc2NvdmVyIHRoZW0KKyNpZiBkZWZpbmVkKEhQQXJjaGl0ZWN0dXJlKSB8fCBcCisgICAgKGRlZmluZWQoU3BhcmNBcmNoaXRlY3R1cmUpICYmICFkZWZpbmVkKEx5bnhPU0FyY2hpdGVjdHVyZSkpIHx8IFwKKyAgICBTeXN0ZW1WNCB8fCBcCisgICAgZGVmaW5lZChPU0YxQXJjaGl0ZWN0dXJlKSB8fCBcCisgICAgZGVmaW5lZChpMzg2QnNkQXJjaGl0ZWN0dXJlKSB8fCBcCisgICAgZGVmaW5lZChMaW51eEFyY2hpdGVjdHVyZSkgfHwgXAorICAgIGRlZmluZWQoRGFyd2luQXJjaGl0ZWN0dXJlKQorTU1BUERFRiA9IC1ESEFTX01NQVAKKyNlbmRpZgorCisjaWZkZWYgWFZlbmRvclN0cmluZworVkVORE9SU1RSSU5HID0gWFZlbmRvclN0cmluZworI2Vsc2UKK1ZFTkRPUlNUUklORyA9ICJ1bmtub3duIgorI2VuZGlmCisKKyNpZmRlZiBYVmVuZG9yUmVsZWFzZQorVkVORE9SUkVMRUFTRSA9IFhWZW5kb3JSZWxlYXNlCisjZWxzZQorVkVORE9SUkVMRUFTRSA9IDAKKyNlbmRpZgorCisgICBWRU5ET1JfU1RSSU5HID0gLURWRU5ET1JfU1RSSU5HPVwiJChWRU5ET1JTVFJJTkcpXCIKKyAgIFZFTkRPUl9SRUxFQVNFID0gLURWRU5ET1JfUkVMRUFTRT0iJChWRU5ET1JSRUxFQVNFKSIKKworI2lmZGVmIE9TMkFyY2hpdGVjdHVyZQorU1JDUzEgPSBvczJfc3R1YnMuYworT0JKUzEgPSBvczJfc3R1YnMubworI2VuZGlmCisKK0ZCSU5DTFVERSA9IC1JLi4vLi4vZmIKKworU1JDU0EgPQl4dm5jLmNjIHN0dWJzLmMgJChTUkNTMSkgbWlpbml0ZXh0LmMgJChTUkNTMikKKworT0JKU0EgPQl4dm5jLm8gc3R1YnMubyAkKE9CSlMxKSBtaWluaXRleHQubyAkKE9CSlMyKQorCitJTkNMVURFUyA9IC1JLiAtSS4uIC1JJChYQlVJTERJTkNESVIpIC1JJChGT05USU5DU1JDKSBcCisgICAgICAgICAgICQoRkJJTkNMVURFKSAtSS4uLy4uL21mYiAtSS4uLy4uL21pIC1JLi4vLi4vaW5jbHVkZSAtSS4uLy4uL29zICBcCisgICAgICAgICAgIC1JJChFWFRJTkNTUkMpIC1JJChYSU5DTFVERVNSQykgIC1JJChTRVJWRVJTUkMpL3JlbmRlciAkKFZOQ0lOQ0xVREUpCisKK0RFRklORVMgPSAkKE9TX0RFRklORVMpICQoU0hNREVGKSAkKE1NQVBERUYpICQoRkJfREVGSU5FUykgXAorICAgICAgICAgICQoVkVORE9SX1NUUklORykgJChWRU5ET1JfUkVMRUFTRSkgJChTVERfREVGSU5FUykgU2VydmVyT1NEZWZpbmVzIFwKKyAgICAgICAgICAkKFZOQ0RFRklORVMpIC1VWEZyZWU4NkxPQURFUgorCisjaWZkZWYgWEZyZWU4NlZlcnNpb24KKy8qIAorICogTWFrZSBzdXJlIFhJTlBVVCwgWEY4NlZpZFR1bmUsIGV0YyBhcmVudCBkZWZpbmVkIGZvciB0aGUgbWlpbml0ZXh0Lm8gCisgKiB1c2VkIGJ5IFh2bmMgCisgKi8KK0VYVF9ERUZJTkVTID0gRXh0ZW5zaW9uRGVmaW5lcyAtVVhGODZWSURNT0RFIC1VWEZyZWVYREdBIC1VWEY4Nk1JU0MKKyNlbmRpZgorCisKK1NSQ1MgPQkkKFNSQ1NBKSAkKFNSQ1NCKSAkKFNSQ1NDKQorT0JKUyA9CSQoT0JKU0EpICQoT0JKU0IpICQoT0JKU0MpCisKK05vcm1hbExpYnJhcnlPYmplY3RSdWxlKCkKK05vcm1hbExpYnJhcnlUYXJnZXQoeHZuYywkKE9CSlMpIGJ1aWxkdGltZS5vKQorCisjaWZkZWYgT1MyQXJjaGl0ZWN0dXJlCitMaW5rU291cmNlRmlsZShvczJfc3R1YnMuYywuLi94ZnJlZTg2L29zLXN1cHBvcnQvb3MyKQorU3BlY2lhbENPYmplY3RSdWxlKG9zMl9zdHVicywkKElDT05GSUdGSUxFUyksLURPUzJOVUxMU0VMRUNUKQorI2VuZGlmCisKKyNpZmRlZiBIYXNHY2MKK05PX09QRVJBVE9SX05BTUVTID0gLWZuby1vcGVyYXRvci1uYW1lcworI2VuZGlmCitMaW5rU291cmNlRmlsZShzdHVicy5jLC4uLy4uL1hpKQorU3BlY2lhbENwbHVzcGx1c09iamVjdFJ1bGUoeHZuYywkKElDT05GSUdGSUxFUykgeHZuYywkKEVYVF9ERUZJTkVTKSAkKE5PX09QRVJBVE9SX05BTUVTKSkKKworTGlua1NvdXJjZUZpbGUobWlpbml0ZXh0LmMsJChTRVJWRVJTUkMpL21pKQorU3BlY2lhbENPYmplY3RSdWxlKG1paW5pdGV4dCwkKElDT05GSUdGSUxFUyksJChFWFRfREVGSU5FUykgJChQQU5fREVGSU5FUykgLUROT19NT0RVTEVfRVhUUyAkKEVYVF9NT0RVTEVfREVGSU5FUykgLVVYRnJlZTg2TE9BREVSKQorCisvKiBJbnN0YWxsTWFuUGFnZShYdmZiLCQoTUFORElSKSkgKi8KK0RlcGVuZFRhcmdldCgpCisKK2J1aWxkdGltZS5vOiAkKE9CSlMpIC4uL0xpYnJhcnlUYXJnZXROYW1lKHZuYykgJChWTkNMSUJTKQpkaWZmIC0tZ2l0IGEvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Ydm5jL2J1aWxkdGltZS5jIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Ydm5jL2J1aWxkdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGMzNjkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL1h2bmMvYnVpbGR0aW1lLmMKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworY2hhciBidWlsZHRpbWVbXSA9IF9fREFURV9fICIgIiBfX1RJTUVfXzsKZGlmZiAtLWdpdCBhL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvWHZuYy94dm5jLmNjIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy9Ydm5jL3h2bmMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNzNlNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvWHZuYy94dm5jLmNjCkBAIC0wLDAgKzEsMTQ3NSBAQAorLyogQ29weXJpZ2h0IChjKSAxOTkzICBYIENvbnNvcnRpdW0KKyAgIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBYIENvbnNvcnRpdW0gc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gdGhlIFggQ29uc29ydGl1bS4KKworKi8KKworI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8cmZiL0xvZ2dlcl9zdGRpby5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxuZXR3b3JrL1RjcFNvY2tldC5oPgorI2luY2x1ZGUgInZuY0V4dEluaXQuaCIKKworZXh0ZXJuICJDIiB7CisjZGVmaW5lIGNsYXNzIGNfY2xhc3MKKyNkZWZpbmUgcHVibGljIGNfcHVibGljCisjZGVmaW5lIHhvciBjX3hvcgorI2RlZmluZSBhbmQgY19hbmQKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPFgxMS9Yd2luc29jay5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJYMTEvWC5oIgorI2RlZmluZSBORUVEX0VWRU5UUworI2luY2x1ZGUgIlgxMS9YcHJvdG8uaCIKKyNpbmNsdWRlICJYMTEvWG9zLmgiCisjaW5jbHVkZSAic2NybmludHN0ci5oIgorI2luY2x1ZGUgInNlcnZlcm1kLmgiCisjaW5jbHVkZSAiZmIuaCIKKyNpbmNsdWRlICJtaS5oIgorI2luY2x1ZGUgIm1pYnN0b3JlLmgiCisjaW5jbHVkZSAiY29sb3JtYXBzdC5oIgorI2luY2x1ZGUgImdjc3RydWN0LmgiCisjaW5jbHVkZSAiaW5wdXQuaCIKKyNpbmNsdWRlICJtaXBvaW50ZXIuaCIKKyNkZWZpbmUgbmV3IE5ldworI2luY2x1ZGUgIm1pY21hcC5oIgorI3VuZGVmIG5ldworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBU19NTUFQCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpZm5kZWYgTUFQX0ZJTEUKKyNkZWZpbmUgTUFQX0ZJTEUgMAorI2VuZGlmCisjZW5kaWYgLyogSEFTX01NQVAgKi8KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxYMTEvWFdERmlsZS5oPgorI2lmZGVmIEhBU19TSE0KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorI2VuZGlmIC8qIEhBU19TSE0gKi8KKyNpbmNsdWRlICJkaXguaCIKKyNpbmNsdWRlICJtaWxpbmUuaCIKKyNpbmNsdWRlICJpbnB1dHN0ci5oIgorI2luY2x1ZGUgImtleXN5bS5oIgorICBleHRlcm4gaW50IGRlZmF1bHRDb2xvclZpc3VhbENsYXNzOworICBleHRlcm4gY2hhciBidWlsZHRpbWVbXTsKKyN1bmRlZiBjbGFzcworI3VuZGVmIHB1YmxpYworI3VuZGVmIHhvcgorI3VuZGVmIGFuZAorfQorCisjZGVmaW5lIFhWTkNWRVJTSU9OICJGcmVlIEVkaXRpb24gNC4xLjEiCisjZGVmaW5lIFhWTkNDT1BZUklHSFQgKCJDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC5cbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAiU2VlIGh0dHA6Ly93d3cucmVhbHZuYy5jb20gZm9yIGluZm9ybWF0aW9uIG9uIFZOQy5cbiIpCisKKworZXh0ZXJuIGNoYXIgKmRpc3BsYXk7CitleHRlcm4gaW50IG1vbml0b3JSZXNvbHV0aW9uOworCisjZGVmaW5lIFZGQl9ERUZBVUxUX1dJRFRIICAxMDI0CisjZGVmaW5lIFZGQl9ERUZBVUxUX0hFSUdIVCA3NjgKKyNkZWZpbmUgVkZCX0RFRkFVTFRfREVQVEggIDE2CisjZGVmaW5lIFZGQl9ERUZBVUxUX1dISVRFUElYRUwgMHhmZmZmCisjZGVmaW5lIFZGQl9ERUZBVUxUX0JMQUNLUElYRUwgMAorI2RlZmluZSBWRkJfREVGQVVMVF9MSU5FQklBUyAwCisjZGVmaW5lIFhXRF9XSU5ET1dfTkFNRV9MRU4gNjAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgc2NybnVtOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgcGFkZGVkQnl0ZXNXaWR0aDsKKyAgICBpbnQgcGFkZGVkV2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgZGVwdGg7CisgICAgaW50IGJpdHNQZXJQaXhlbDsKKyAgICBpbnQgc2l6ZUluQnl0ZXM7CisgICAgaW50IG5jb2xvcnM7CisgICAgY2hhciAqcGZiTWVtb3J5OworICAgIFhXRENvbG9yICpwWFdEQ21hcDsKKyAgICBYV0RGaWxlSGVhZGVyICpwWFdESGVhZGVyOworICAgIFBpeGVsIGJsYWNrUGl4ZWw7CisgICAgUGl4ZWwgd2hpdGVQaXhlbDsKKyAgICB1bnNpZ25lZCBpbnQgbGluZUJpYXM7CisgICAgQ2xvc2VTY3JlZW5Qcm9jUHRyIGNsb3NlU2NyZWVuOworCisjaWZkZWYgSEFTX01NQVAKKyAgICBpbnQgbW1hcF9mZDsKKyAgICBjaGFyIG1tYXBfZmlsZVtNQVhQQVRITEVOXTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1NITQorICAgIGludCBzaG1pZDsKKyNlbmRpZgorCisgICAgQm9vbCBwaXhlbEZvcm1hdERlZmluZWQ7CisgICAgQm9vbCByZ2JOb3RCZ3I7CisgICAgaW50IHJlZEJpdHMsIGdyZWVuQml0cywgYmx1ZUJpdHM7CisKK30gdmZiU2NyZWVuSW5mbywgKnZmYlNjcmVlbkluZm9QdHI7CisKK3N0YXRpYyBpbnQgdmZiTnVtU2NyZWVuczsKK3N0YXRpYyB2ZmJTY3JlZW5JbmZvIHZmYlNjcmVlbnNbTUFYU0NSRUVOU107CitzdGF0aWMgQm9vbCB2ZmJQaXhtYXBEZXB0aHNbMzNdOworI2lmZGVmIEhBU19NTUFQCitzdGF0aWMgY2hhciAqcGZiZGlyID0gTlVMTDsKKyNlbmRpZgordHlwZWRlZiBlbnVtIHsgTk9STUFMX01FTU9SWV9GQiwgU0hBUkVEX01FTU9SWV9GQiwgTU1BUFBFRF9GSUxFX0ZCIH0gZmJNZW1UeXBlOworc3RhdGljIGZiTWVtVHlwZSBmYm1lbXR5cGUgPSBOT1JNQUxfTUVNT1JZX0ZCOworc3RhdGljIGNoYXIgbmVlZHN3YXAgPSAwOworc3RhdGljIGludCBsYXN0U2NyZWVuID0gLTE7CitzdGF0aWMgQm9vbCBSZW5kZXIgPSBUUlVFOworCitzdGF0aWMgYm9vbCBkaXNwbGF5U3BlY2lmaWVkID0gZmFsc2U7CitzdGF0aWMgYm9vbCB3ZWxsS25vd25Tb2NrZXRzQ3JlYXRlZCA9IGZhbHNlOworc3RhdGljIGNoYXIgZGlzcGxheU51bVN0clsxNl07CisKKyNkZWZpbmUgc3dhcGNvcHkxNihfZHN0LCBfc3JjKSBcCisgICAgaWYgKG5lZWRzd2FwKSB7IENBUkQxNiBfcyA9IF9zcmM7IGNwc3dhcHMoX3MsIF9kc3QpOyB9IFwKKyAgICBlbHNlIF9kc3QgPSBfc3JjOworCisjZGVmaW5lIHN3YXBjb3B5MzIoX2RzdCwgX3NyYykgXAorICAgIGlmIChuZWVkc3dhcCkgeyBDQVJEMzIgX3MgPSBfc3JjOyBjcHN3YXBsKF9zLCBfZHN0KTsgfSBcCisgICAgZWxzZSBfZHN0ID0gX3NyYzsKKworCitzdGF0aWMgdm9pZAordmZiSW5pdGlhbGl6ZVBpeG1hcERlcHRocyh2b2lkKQoreworICAgIGludCBpOworICAgIHZmYlBpeG1hcERlcHRoc1sxXSA9IFRSVUU7IC8qIGFsd2F5cyBuZWVkIGJpdG1hcHMgKi8KKyAgICBmb3IgKGkgPSAyOyBpIDw9IDMyOyBpKyspCisJdmZiUGl4bWFwRGVwdGhzW2ldID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCit2ZmJJbml0aWFsaXplRGVmYXVsdFNjcmVlbnModm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhTQ1JFRU5TOyBpKyspCisgICAgeworCXZmYlNjcmVlbnNbaV0uc2NybnVtID0gaTsKKwl2ZmJTY3JlZW5zW2ldLndpZHRoICA9IFZGQl9ERUZBVUxUX1dJRFRIOworCXZmYlNjcmVlbnNbaV0uaGVpZ2h0ID0gVkZCX0RFRkFVTFRfSEVJR0hUOworCXZmYlNjcmVlbnNbaV0uZGVwdGggID0gVkZCX0RFRkFVTFRfREVQVEg7CisJdmZiU2NyZWVuc1tpXS5ibGFja1BpeGVsID0gVkZCX0RFRkFVTFRfQkxBQ0tQSVhFTDsKKwl2ZmJTY3JlZW5zW2ldLndoaXRlUGl4ZWwgPSBWRkJfREVGQVVMVF9XSElURVBJWEVMOworCXZmYlNjcmVlbnNbaV0ubGluZUJpYXMgPSBWRkJfREVGQVVMVF9MSU5FQklBUzsKKwl2ZmJTY3JlZW5zW2ldLnBpeGVsRm9ybWF0RGVmaW5lZCA9IEZBTFNFOworCXZmYlNjcmVlbnNbaV0ucGZiTWVtb3J5ID0gTlVMTDsKKyAgICB9CisgICAgdmZiTnVtU2NyZWVucyA9IDE7Cit9CisKK3N0YXRpYyBpbnQKK3ZmYkJpdHNQZXJQaXhlbChpbnQgZGVwdGgpCit7CisgICAgaWYgKGRlcHRoID09IDEpIHJldHVybiAxOworICAgIGVsc2UgaWYgKGRlcHRoIDw9IDgpIHJldHVybiA4OworICAgIGVsc2UgaWYgKGRlcHRoIDw9IDE2KSByZXR1cm4gMTY7CisgICAgZWxzZSByZXR1cm4gMzI7Cit9CisKKworZXh0ZXJuICJDIiB7CisKKyAgLyogZGR4SW5pdEdsb2JhbHMgLSBjYWxsZWQgYnkgfEluaXRHbG9iYWxzfCBmcm9tIG9zL3V0aWwuYyBpbiBYT3JnICovCisgIHZvaWQgZGR4SW5pdEdsb2JhbHModm9pZCkKKyAgeworICB9CisKKyAgdm9pZCBkZHhHaXZlVXAoKQorICB7CisgICAgaW50IGk7CisKKyAgICAvKiBjbGVhbiB1cCB0aGUgZnJhbWVidWZmZXJzICovCisKKyAgICBzd2l0Y2ggKGZibWVtdHlwZSkKKyAgICB7CisjaWZkZWYgSEFTX01NQVAKKyAgICBjYXNlIE1NQVBQRURfRklMRV9GQjogCisJZm9yIChpID0gMDsgaSA8IHZmYk51bVNjcmVlbnM7IGkrKykKKwl7CisJICAgIGlmICgtMSA9PSB1bmxpbmsodmZiU2NyZWVuc1tpXS5tbWFwX2ZpbGUpKQorCSAgICB7CisJCXBlcnJvcigidW5saW5rIik7CisJCUVycm9yRigidW5saW5rICVzIGZhaWxlZCwgZXJybm8gJWQiLAorCQkgICAgICAgdmZiU2NyZWVuc1tpXS5tbWFwX2ZpbGUsIGVycm5vKTsKKwkgICAgfQorCX0KKwlicmVhazsKKyNlbHNlIC8qIEhBU19NTUFQICovCisgICAgY2FzZSBNTUFQUEVEX0ZJTEVfRkI6CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEhBU19NTUFQICovCisJCisjaWZkZWYgSEFTX1NITQorICAgIGNhc2UgU0hBUkVEX01FTU9SWV9GQjoKKwlmb3IgKGkgPSAwOyBpIDwgdmZiTnVtU2NyZWVuczsgaSsrKQorCXsKKwkgICAgaWYgKC0xID09IHNobWR0KChjaGFyICopdmZiU2NyZWVuc1tpXS5wWFdESGVhZGVyKSkKKwkgICAgeworCQlwZXJyb3IoInNobWR0Iik7CisJCUVycm9yRigic2htZHQgZmFpbGVkLCBlcnJubyAlZCIsIGVycm5vKTsKKwkgICAgfQorCX0KKwlicmVhazsKKyNlbHNlIC8qIEhBU19TSE0gKi8KKyAgICBjYXNlIFNIQVJFRF9NRU1PUllfRkI6CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEhBU19TSE0gKi8KKwkKKyAgICBjYXNlIE5PUk1BTF9NRU1PUllfRkI6CisJZm9yIChpID0gMDsgaSA8IHZmYk51bVNjcmVlbnM7IGkrKykKKwl7CisJICAgIFhmcmVlKHZmYlNjcmVlbnNbaV0ucFhXREhlYWRlcik7CisJfQorCWJyZWFrOworICAgIH0KK30KKwordm9pZAorQWJvcnRERFgoKQoreworICAgIGRkeEdpdmVVcCgpOworfQorCisjaWZkZWYgX19EQVJXSU5fXwordm9pZAorRGFyd2luSGFuZGxlR1VJKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7Cit9CisKK3ZvaWQgR2x4RXh0ZW5zaW9uSW5pdCgpOwordm9pZCBHbHhXcmFwSW5pdFZpc3VhbHModm9pZCAqcHJvY1B0cik7CisKK3ZvaWQKK0RhcndpbkdseEV4dGVuc2lvbkluaXQoKQoreworICAgIEdseEV4dGVuc2lvbkluaXQoKTsKK30KKwordm9pZAorRGFyd2luR2x4V3JhcEluaXRWaXN1YWxzKAorICAgIHZvaWQgKnByb2NQdHIpCit7CisgICAgR2x4V3JhcEluaXRWaXN1YWxzKHByb2NQdHIpOworfQorI2VuZGlmCisKK3ZvaWQKK09zVmVuZG9ySW5pdCgpCit7Cit9CisKK3ZvaWQKK09zVmVuZG9yRmF0YWxFcnJvcigpCit7Cit9CisKK3ZvaWQgZGR4QmVmb3JlUmVzZXQodm9pZCkKK3sKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgCitkZHhVc2VNc2coKQoreworICAgIEVycm9yRigiXG5Ydm5jICVzIC0gYnVpbHQgJXNcbiVzIiwgWFZOQ1ZFUlNJT04sIGJ1aWxkdGltZSwgWFZOQ0NPUFlSSUdIVCk7CisgICAgRXJyb3JGKCJVbmRlcmx5aW5nIFggc2VydmVyIHJlbGVhc2UgJWQsICVzXG5cbiIsIFZFTkRPUl9SRUxFQVNFLAorICAgICAgICAgICBWRU5ET1JfU1RSSU5HKTsKKyAgICBFcnJvckYoIi1zY3JlZW4gc2NybiBXeEh4RCAgICAgc2V0IHNjcmVlbidzIHdpZHRoLCBoZWlnaHQsIGRlcHRoXG4iKTsKKyAgICBFcnJvckYoIi1waXhkZXB0aHMgbGlzdC1vZi1pbnQgc3VwcG9ydCBnaXZlbiBwaXhtYXAgZGVwdGhzXG4iKTsKKyNpZmRlZiBSRU5ERVIKKyAgICBFcnJvckYoIisvLXJlbmRlcgkJICAgdHVybiBvbi9vZmYgUkVOREVSIGV4dGVuc2lvbiBzdXBwb3J0IgorCSAgICIoZGVmYXVsdCBvbilcbiIpOworI2VuZGlmCisgICAgRXJyb3JGKCItbGluZWJpYXMgbiAgICAgICAgICAgIGFkanVzdCB0aGluIGxpbmUgcGl4ZWxpemF0aW9uXG4iKTsKKyAgICBFcnJvckYoIi1ibGFja3BpeGVsIG4gICAgICAgICAgcGl4ZWwgdmFsdWUgZm9yIGJsYWNrXG4iKTsKKyAgICBFcnJvckYoIi13aGl0ZXBpeGVsIG4gICAgICAgICAgcGl4ZWwgdmFsdWUgZm9yIHdoaXRlXG4iKTsKKworI2lmZGVmIEhBU19NTUFQCisgICAgRXJyb3JGKCItZmJkaXIgZGlyZWN0b3J5ICAgICAgIHB1dCBmcmFtZWJ1ZmZlcnMgaW4gbW1hcCdlZCBmaWxlcyBpbiBkaXJlY3RvcnlcbiIpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfU0hNCisgICAgRXJyb3JGKCItc2htZW0gICAgICAgICAgICAgICAgIHB1dCBmcmFtZWJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeVxuIik7CisjZW5kaWYKKworICAgIEVycm9yRigiLWdlb21ldHJ5IFd4SCAgICAgICAgICBzZXQgc2NyZWVuIDAncyB3aWR0aCwgaGVpZ2h0XG4iKTsKKyAgICBFcnJvckYoIi1kZXB0aCBEICAgICAgICAgICAgICAgc2V0IHNjcmVlbiAwJ3MgZGVwdGhcbiIpOworICAgIEVycm9yRigiLXBpeGVsZm9ybWF0IGZtdCAgICAgICBzZXQgcGl4ZWwgZm9ybWF0IChyZ2JOTk4gb3IgYmdyTk5OKVxuIik7CisgICAgRXJyb3JGKCItaW5ldGQgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGxhdW5jaGVkIGZyb20gaW5ldGRcbiIpOworICAgIEVycm9yRigiXG5WTkMgcGFyYW1ldGVyczpcbiIpOworCisgICAgZnByaW50ZihzdGRlcnIsIlxuIgorICAgICAgICAgICAgIlBhcmFtZXRlcnMgY2FuIGJlIHR1cm5lZCBvbiB3aXRoIC08cGFyYW0+IG9yIG9mZiB3aXRoIC08cGFyYW0+PTBcbiIKKyAgICAgICAgICAgICJQYXJhbWV0ZXJzIHdoaWNoIHRha2UgYSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGFzICIKKyAgICAgICAgICAgICItPHBhcmFtPiA8dmFsdWU+XG4iCisgICAgICAgICAgICAiT3RoZXIgdmFsaWQgZm9ybXMgYXJlIDxwYXJhbT49PHZhbHVlPiAtPHBhcmFtPj08dmFsdWU+ICIKKyAgICAgICAgICAgICItLTxwYXJhbT49PHZhbHVlPlxuIgorICAgICAgICAgICAgIlBhcmFtZXRlciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4gIFRoZSBwYXJhbWV0ZXJzIGFyZTpcblxuIik7CisgICAgcmZiOjpDb25maWd1cmF0aW9uOjpsaXN0UGFyYW1zKDc5LCAxNCk7CisgIH0KK30KKworLyogZGR4SW5pdEdsb2JhbHMgLSBjYWxsZWQgYnkgfEluaXRHbG9iYWxzfCBmcm9tIG9zL3V0aWwuYyAqLwordm9pZCBkZHhJbml0R2xvYmFscyh2b2lkKQoreworfQorCitzdGF0aWMgCitib29sIGRpc3BsYXlOdW1GcmVlKGludCBudW0pCit7CisgICAgdHJ5IHsKKwluZXR3b3JrOjpUY3BMaXN0ZW5lciBsKDYwMDArbnVtKTsKKyAgICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiYgZSkgeworCXJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2hhciBmaWxlWzI1Nl07CisgICAgc3ByaW50ZihmaWxlLCAiL3RtcC8uWCVkLWxvY2siLCBudW0pOworICAgIGlmIChhY2Nlc3MoZmlsZSwgRl9PSykgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHNwcmludGYoZmlsZSwgIi90bXAvLlgxMS11bml4L1glZCIsIG51bSk7CisgICAgaWYgKGFjY2VzcyhmaWxlLCBGX09LKSA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgc3ByaW50ZihmaWxlLCAiL3Vzci9zcG9vbC9zb2NrZXRzL1gxMS8lZCIsIG51bSk7CisgICAgaWYgKGFjY2VzcyhmaWxlLCBGX09LKSA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCAKK2RkeFByb2Nlc3NBcmd1bWVudChpbnQgYXJnYywgY2hhciAqYXJndltdLCBpbnQgaSkKK3sKKyAgICBzdGF0aWMgQm9vbCBmaXJzdFRpbWUgPSBUUlVFOworCisgICAgaWYgKGZpcnN0VGltZSkKKyAgICB7CisJdmZiSW5pdGlhbGl6ZURlZmF1bHRTY3JlZW5zKCk7CisJdmZiSW5pdGlhbGl6ZVBpeG1hcERlcHRocygpOworCWZpcnN0VGltZSA9IEZBTFNFOworCXJmYjo6aW5pdFN0ZElPTG9nZ2VycygpOworCXJmYjo6TG9nV3JpdGVyOjpzZXRMb2dQYXJhbXMoIio6c3RkZXJyOjMwIik7CisgICAgfQorCisgICAgaWYgKGFyZ3ZbaV1bMF0gPT0gICc6JykKKwlkaXNwbGF5U3BlY2lmaWVkID0gdHJ1ZTsKKworICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItc2NyZWVuIikgPT0gMCkJLyogLXNjcmVlbiBuIFd4SHhEICovCisgICAgeworCWludCBzY3JlZW5OdW07CisJaWYgKGkgKyAyID49IGFyZ2MpIFVzZU1zZygpOworCXNjcmVlbk51bSA9IGF0b2koYXJndltpKzFdKTsKKwlpZiAoc2NyZWVuTnVtIDwgMCB8fCBzY3JlZW5OdW0gPj0gTUFYU0NSRUVOUykKKwl7CisJICAgIEVycm9yRigiSW52YWxpZCBzY3JlZW4gbnVtYmVyICVkXG4iLCBzY3JlZW5OdW0pOworCSAgICBVc2VNc2coKTsKKwl9CisJaWYgKDMgIT0gc3NjYW5mKGFyZ3ZbaSsyXSwgIiVkeCVkeCVkIiwKKwkJCSZ2ZmJTY3JlZW5zW3NjcmVlbk51bV0ud2lkdGgsCisJCQkmdmZiU2NyZWVuc1tzY3JlZW5OdW1dLmhlaWdodCwKKwkJCSZ2ZmJTY3JlZW5zW3NjcmVlbk51bV0uZGVwdGgpKQorCXsKKwkgICAgRXJyb3JGKCJJbnZhbGlkIHNjcmVlbiBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2W2krMl0pOworCSAgICBVc2VNc2coKTsKKwl9CisKKwlpZiAoc2NyZWVuTnVtID49IHZmYk51bVNjcmVlbnMpCisJICAgIHZmYk51bVNjcmVlbnMgPSBzY3JlZW5OdW0gKyAxOworCWxhc3RTY3JlZW4gPSBzY3JlZW5OdW07CisJcmV0dXJuIDM7CisgICAgfQorCisgICAgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1waXhkZXB0aHMiKSA9PSAwKQkvKiAtcGl4ZGVwdGhzIGxpc3Qtb2YtZGVwdGggKi8KKyAgICB7CisJaW50IGRlcHRoLCByZXQgPSAxOworCisJaWYgKCsraSA+PSBhcmdjKSBVc2VNc2coKTsKKwl3aGlsZSAoKGkgPCBhcmdjKSAmJiAoZGVwdGggPSBhdG9pKGFyZ3ZbaSsrXSkpICE9IDApCisJeworCSAgICBpZiAoZGVwdGggPCAwIHx8IGRlcHRoID4gMzIpCisJICAgIHsKKwkJRXJyb3JGKCJJbnZhbGlkIHBpeG1hcCBkZXB0aCAlZFxuIiwgZGVwdGgpOworCQlVc2VNc2coKTsKKwkgICAgfQorCSAgICB2ZmJQaXhtYXBEZXB0aHNbZGVwdGhdID0gVFJVRTsKKwkgICAgcmV0Kys7CisJfQorCXJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICIrcmVuZGVyIikgPT0gMCkJLyogK3JlbmRlciAqLworICAgIHsKKwlSZW5kZXIgPSBUUlVFOworCXJldHVybiAxOworICAgIH0KKyAgCisgICAgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1yZW5kZXIiKSA9PSAwKQkvKiAtcmVuZGVyICovCisgICAgeworCVJlbmRlciA9IEZBTFNFOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItYmxhY2twaXhlbCIpID09IDApCS8qIC1ibGFja3BpeGVsIG4gKi8KKyAgICB7CisJUGl4ZWwgcGl4OworCWlmICgrK2kgPj0gYXJnYykgVXNlTXNnKCk7CisJcGl4ID0gYXRvaShhcmd2W2ldKTsKKwlpZiAoLTEgPT0gbGFzdFNjcmVlbikKKwl7CisJICAgIGludCBpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYU0NSRUVOUzsgaSsrKQorCSAgICB7CisJCXZmYlNjcmVlbnNbaV0uYmxhY2tQaXhlbCA9IHBpeDsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICB2ZmJTY3JlZW5zW2xhc3RTY3JlZW5dLmJsYWNrUGl4ZWwgPSBwaXg7CisJfQorCXJldHVybiAyOworICAgIH0KKworICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItd2hpdGVwaXhlbCIpID09IDApCS8qIC13aGl0ZXBpeGVsIG4gKi8KKyAgICB7CisJUGl4ZWwgcGl4OworCWlmICgrK2kgPj0gYXJnYykgVXNlTXNnKCk7CisJcGl4ID0gYXRvaShhcmd2W2ldKTsKKwlpZiAoLTEgPT0gbGFzdFNjcmVlbikKKwl7CisJICAgIGludCBpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYU0NSRUVOUzsgaSsrKQorCSAgICB7CisJCXZmYlNjcmVlbnNbaV0ud2hpdGVQaXhlbCA9IHBpeDsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICB2ZmJTY3JlZW5zW2xhc3RTY3JlZW5dLndoaXRlUGl4ZWwgPSBwaXg7CisJfQorCXJldHVybiAyOworICAgIH0KKyAgICAKKyAgICBpZiAoc3RyY21wIChhcmd2W2ldLCAiLWxpbmViaWFzIikgPT0gMCkJLyogLWxpbmViaWFzIG4gKi8KKyAgICB7CisJdW5zaWduZWQgaW50IGxpbmViaWFzOworCWlmICgrK2kgPj0gYXJnYykgVXNlTXNnKCk7CisJbGluZWJpYXMgPSBhdG9pKGFyZ3ZbaV0pOworCWlmICgtMSA9PSBsYXN0U2NyZWVuKQorCXsKKwkgICAgaW50IGk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBNQVhTQ1JFRU5TOyBpKyspCisJICAgIHsKKwkJdmZiU2NyZWVuc1tpXS5saW5lQmlhcyA9IGxpbmViaWFzOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIHZmYlNjcmVlbnNbbGFzdFNjcmVlbl0ubGluZUJpYXMgPSBsaW5lYmlhczsKKwl9CisJcmV0dXJuIDI7CisgICAgfQorCisjaWZkZWYgSEFTX01NQVAKKyAgICBpZiAoc3RyY21wIChhcmd2W2ldLCAiLWZiZGlyIikgPT0gMCkJLyogLWZiZGlyIGRpcmVjdG9yeSAqLworICAgIHsKKwlpZiAoKytpID49IGFyZ2MpIFVzZU1zZygpOworCXBmYmRpciA9IGFyZ3ZbaV07CisJZmJtZW10eXBlID0gTU1BUFBFRF9GSUxFX0ZCOworCXJldHVybiAyOworICAgIH0KKyNlbmRpZiAvKiBIQVNfTU1BUCAqLworCisjaWZkZWYgSEFTX1NITQorICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItc2htZW0iKSA9PSAwKQkvKiAtc2htZW0gKi8KKyAgICB7CisJZmJtZW10eXBlID0gU0hBUkVEX01FTU9SWV9GQjsKKwlyZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItZ2VvbWV0cnkiKSA9PSAwKQorICAgIHsKKwlpZiAoKytpID49IGFyZ2MpIFVzZU1zZygpOworCWlmIChzc2NhbmYoYXJndltpXSwiJWR4JWQiLCZ2ZmJTY3JlZW5zWzBdLndpZHRoLAorCQkgICAmdmZiU2NyZWVuc1swXS5oZWlnaHQpICE9IDIpIHsKKwkgICAgRXJyb3JGKCJJbnZhbGlkIGdlb21ldHJ5ICVzXG4iLCBhcmd2W2ldKTsKKwkgICAgVXNlTXNnKCk7CisJfQorCXJldHVybiAyOworICAgIH0KKyAgICAKKyAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItZGVwdGgiKSA9PSAwKQorICAgIHsKKwlpZiAoKytpID49IGFyZ2MpIFVzZU1zZygpOworCXZmYlNjcmVlbnNbMF0uZGVwdGggPSBhdG9pKGFyZ3ZbaV0pOworCXJldHVybiAyOworICAgIH0KKworICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1waXhlbGZvcm1hdCIpID09IDApCisgICAgeworCWNoYXIgcmdiYmdyWzRdOworCWludCBiaXRzMSwgYml0czIsIGJpdHMzOworCWlmICgrK2kgPj0gYXJnYykgVXNlTXNnKCk7CisJaWYgKHNzY2FuZihhcmd2W2ldLCAiJTNzJTFkJTFkJTFkIiwgcmdiYmdyLCZiaXRzMSwmYml0czIsJmJpdHMzKSA8IDQpIHsKKwkgICAgRXJyb3JGKCJJbnZhbGlkIHBpeGVsIGZvcm1hdCAlc1xuIiwgYXJndltpXSk7CisJICAgIFVzZU1zZygpOworCX0KKworI2RlZmluZSBTRVRfUElYRUxfRk9STUFUKHZmYlNjcmVlbikgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHZmYlNjcmVlbikucGl4ZWxGb3JtYXREZWZpbmVkID0gVFJVRTsgICAgICAgICAgICAgIFwKKyAgICAodmZiU2NyZWVuKS5kZXB0aCA9IGJpdHMxICsgYml0czIgKyBiaXRzMzsgICAgICAgICAgXAorICAgICh2ZmJTY3JlZW4pLmdyZWVuQml0cyA9IGJpdHMyOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0cmNhc2VjbXAocmdiYmdyLCAiYmdyIikgPT0gMCkgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZmYlNjcmVlbikucmdiTm90QmdyID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmZiU2NyZWVuKS5yZWRCaXRzID0gYml0czM7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2ZmJTY3JlZW4pLmJsdWVCaXRzID0gYml0czE7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAocmdiYmdyLCAicmdiIikgPT0gMCkgeyAgICAgICAgXAorICAgICAgICAodmZiU2NyZWVuKS5yZ2JOb3RCZ3IgPSBUUlVFOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2ZmJTY3JlZW4pLnJlZEJpdHMgPSBiaXRzMTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZmYlNjcmVlbikuYmx1ZUJpdHMgPSBiaXRzMzsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVycm9yRigiSW52YWxpZCBwaXhlbCBmb3JtYXQgJXNcbiIsIGFyZ3ZbaV0pOyAgIFwKKyAgICAgICAgVXNlTXNnKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCWlmICgtMSA9PSBsYXN0U2NyZWVuKQorCXsKKwkgICAgaW50IGk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBNQVhTQ1JFRU5TOyBpKyspCisJICAgIHsKKwkJU0VUX1BJWEVMX0ZPUk1BVCh2ZmJTY3JlZW5zW2ldKTsKKwkgICAgfQorCX0KKwllbHNlCisJeworCSAgICBTRVRfUElYRUxfRk9STUFUKHZmYlNjcmVlbnNbbGFzdFNjcmVlbl0pOworCX0KKworCXJldHVybiAyOworICAgIH0KKworICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1pbmV0ZCIpID09IDApCisgICAgeworCWR1cDIoMCwzKTsKKwl2bmNJbmV0ZFNvY2sgPSAzOworCWNsb3NlKDIpOworCQorCWlmICghZGlzcGxheVNwZWNpZmllZCkgeworCSAgICBpbnQgcG9ydCA9IG5ldHdvcms6OlRjcFNvY2tldDo6Z2V0U29ja1BvcnQodm5jSW5ldGRTb2NrKTsKKwkgICAgaW50IGRpc3BsYXlOdW0gPSBwb3J0IC0gNTkwMDsKKwkgICAgaWYgKGRpc3BsYXlOdW0gPCAwIHx8IGRpc3BsYXlOdW0gPiA5OSB8fCAhZGlzcGxheU51bUZyZWUoZGlzcGxheU51bSkpIHsKKwkJZm9yIChkaXNwbGF5TnVtID0gMTsgZGlzcGxheU51bSA8IDEwMDsgZGlzcGxheU51bSsrKQorCQkgICAgaWYgKGRpc3BsYXlOdW1GcmVlKGRpc3BsYXlOdW0pKSBicmVhazsKKwkJCisJCWlmIChkaXNwbGF5TnVtID09IDEwMCkKKwkJICAgIEZhdGFsRXJyb3IoIlh2bmMgZXJyb3I6IG5vIGZyZWUgZGlzcGxheSBudW1iZXIgZm9yIC1pbmV0ZCIpOworCSAgICB9CisJICAgIAorCSAgICBkaXNwbGF5ID0gZGlzcGxheU51bVN0cjsKKwkgICAgc3ByaW50ZihkaXNwbGF5TnVtU3RyLCAiJWQiLCBkaXNwbGF5TnVtKTsKKwl9CisJCisJcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIGlmIChyZmI6OkNvbmZpZ3VyYXRpb246OnNldFBhcmFtKGFyZ3ZbaV0pKQorCXJldHVybiAxOworICAgIAorICAgIGlmIChhcmd2W2ldWzBdID09ICctJyAmJiBpKzEgPCBhcmdjKSB7CisJaWYgKHJmYjo6Q29uZmlndXJhdGlvbjo6c2V0UGFyYW0oJmFyZ3ZbaV1bMV0sIGFyZ3ZbaSsxXSkpCisJICAgIHJldHVybiAyOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIEREWFRJTUUgLyogZnJvbSBTZXJ2ZXJPU0RlZmluZXMgKi8KK0NBUkQzMgorR2V0VGltZUluTWlsbGlzKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCAgdHA7CisKKyAgICBYX0dFVFRJTUVPRkRBWSgmdHApOworICAgIHJldHVybih0cC50dl9zZWMgKiAxMDAwKSArICh0cC50dl91c2VjIC8gMTAwMCk7Cit9CisjZW5kaWYKKworc3RhdGljIENvbG9ybWFwUHRyIEluc3RhbGxlZE1hcHNbTUFYU0NSRUVOU107CisKK3N0YXRpYyBpbnQgCit2ZmJMaXN0SW5zdGFsbGVkQ29sb3JtYXBzKFNjcmVlblB0ciBwU2NyZWVuLCBDb2xvcm1hcCAqcG1hcHMpCit7CisgICAgLyogQnkgdGhlIHRpbWUgd2UgYXJlIHByb2Nlc3NpbmcgcmVxdWVzdHMsIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGVyZQorICAgICAqIGlzIGFsd2F5cyBhIGNvbG9ybWFwIGluc3RhbGxlZCAqLworICAgICpwbWFwcyA9IEluc3RhbGxlZE1hcHNbcFNjcmVlbi0+bXlOdW1dLT5taWQ7CisgICAgcmV0dXJuICgxKTsKK30KKworCitzdGF0aWMgdm9pZCAKK3ZmYkluc3RhbGxDb2xvcm1hcChDb2xvcm1hcFB0ciBwbWFwKQoreworICAgIGludCBpbmRleCA9IHBtYXAtPnBTY3JlZW4tPm15TnVtOworICAgIENvbG9ybWFwUHRyIG9sZHBtYXAgPSBJbnN0YWxsZWRNYXBzW2luZGV4XTsKKworICAgIGlmIChwbWFwICE9IG9sZHBtYXApCisgICAgeworCWludCBlbnRyaWVzOworCVhXREZpbGVIZWFkZXIgKnBYV0RIZWFkZXI7CisJWFdEQ29sb3IgKnBYV0RDbWFwOworCVZpc3VhbFB0ciBwVmlzdWFsOworCVBpeGVsICogICAgIHBwaXg7CisJeHJnYiAqICAgICAgcHJnYjsKKwl4Q29sb3JJdGVtICpkZWZzOworCWludCBpOworCisJaWYob2xkcG1hcCAhPSAoQ29sb3JtYXBQdHIpTm9uZSkKKwkgICAgV2Fsa1RyZWUocG1hcC0+cFNjcmVlbiwgVGVsbExvc3RNYXAsIChjaGFyICopJm9sZHBtYXAtPm1pZCk7CisJLyogSW5zdGFsbCBwbWFwICovCisJSW5zdGFsbGVkTWFwc1tpbmRleF0gPSBwbWFwOworCVdhbGtUcmVlKHBtYXAtPnBTY3JlZW4sIFRlbGxHYWluZWRNYXAsIChjaGFyICopJnBtYXAtPm1pZCk7CisKKwllbnRyaWVzID0gcG1hcC0+cFZpc3VhbC0+Q29sb3JtYXBFbnRyaWVzOworCXBYV0RIZWFkZXIgPSB2ZmJTY3JlZW5zW3BtYXAtPnBTY3JlZW4tPm15TnVtXS5wWFdESGVhZGVyOworCXBYV0RDbWFwID0gdmZiU2NyZWVuc1twbWFwLT5wU2NyZWVuLT5teU51bV0ucFhXRENtYXA7CisJcFZpc3VhbCA9IHBtYXAtPnBWaXN1YWw7CisKKwlzd2FwY29weTMyKHBYV0RIZWFkZXItPnZpc3VhbF9jbGFzcywgcFZpc3VhbC0+Y19jbGFzcyk7CisJc3dhcGNvcHkzMihwWFdESGVhZGVyLT5yZWRfbWFzaywgcFZpc3VhbC0+cmVkTWFzayk7CisJc3dhcGNvcHkzMihwWFdESGVhZGVyLT5ncmVlbl9tYXNrLCBwVmlzdWFsLT5ncmVlbk1hc2spOworCXN3YXBjb3B5MzIocFhXREhlYWRlci0+Ymx1ZV9tYXNrLCBwVmlzdWFsLT5ibHVlTWFzayk7CisJc3dhcGNvcHkzMihwWFdESGVhZGVyLT5iaXRzX3Blcl9yZ2IsIHBWaXN1YWwtPmJpdHNQZXJSR0JWYWx1ZSk7CisJc3dhcGNvcHkzMihwWFdESGVhZGVyLT5jb2xvcm1hcF9lbnRyaWVzLCBwVmlzdWFsLT5Db2xvcm1hcEVudHJpZXMpOworCisJcHBpeCA9IChQaXhlbCAqKUFMTE9DQVRFX0xPQ0FMKGVudHJpZXMgKiBzaXplb2YoUGl4ZWwpKTsKKwlwcmdiID0gKHhyZ2IgKilBTExPQ0FURV9MT0NBTChlbnRyaWVzICogc2l6ZW9mKHhyZ2IpKTsKKwlkZWZzID0gKHhDb2xvckl0ZW0gKilBTExPQ0FURV9MT0NBTChlbnRyaWVzICogc2l6ZW9mKHhDb2xvckl0ZW0pKTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspICBwcGl4W2ldID0gaTsKKwkvKiBYWFggdHJ1ZWNvbG9yICovCisJUXVlcnlDb2xvcnMocG1hcCwgZW50cmllcywgcHBpeCwgcHJnYik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7IC8qIGNvbnZlcnQgeHJnYnMgdG8geENvbG9ySXRlbXMgKi8KKwkgICAgZGVmc1tpXS5waXhlbCA9IHBwaXhbaV0gJiAweGZmOyAvKiBjaGFuZ2UgcGl4ZWwgdG8gaW5kZXggKi8KKwkgICAgZGVmc1tpXS5yZWQgPSBwcmdiW2ldLnJlZDsKKwkgICAgZGVmc1tpXS5ncmVlbiA9IHByZ2JbaV0uZ3JlZW47CisJICAgIGRlZnNbaV0uYmx1ZSA9IHByZ2JbaV0uYmx1ZTsKKwkgICAgZGVmc1tpXS5mbGFncyA9ICBEb1JlZHxEb0dyZWVufERvQmx1ZTsKKwl9CisJKCpwbWFwLT5wU2NyZWVuLT5TdG9yZUNvbG9ycykocG1hcCwgZW50cmllcywgZGVmcyk7CisJCisJREVBTExPQ0FURV9MT0NBTChwcGl4KTsKKwlERUFMTE9DQVRFX0xPQ0FMKHByZ2IpOworCURFQUxMT0NBVEVfTE9DQUwoZGVmcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordmZiVW5pbnN0YWxsQ29sb3JtYXAoQ29sb3JtYXBQdHIgcG1hcCkKK3sKKyAgICBDb2xvcm1hcFB0ciBjdXJwbWFwID0gSW5zdGFsbGVkTWFwc1twbWFwLT5wU2NyZWVuLT5teU51bV07CisKKyAgICBpZihwbWFwID09IGN1cnBtYXApCisgICAgeworCWlmIChwbWFwLT5taWQgIT0gcG1hcC0+cFNjcmVlbi0+ZGVmQ29sb3JtYXApCisJeworCSAgICBjdXJwbWFwID0gKENvbG9ybWFwUHRyKSBMb29rdXBJREJ5VHlwZShwbWFwLT5wU2NyZWVuLT5kZWZDb2xvcm1hcCwKKwkJCQkJCSAgIFJUX0NPTE9STUFQKTsKKwkgICAgKCpwbWFwLT5wU2NyZWVuLT5JbnN0YWxsQ29sb3JtYXApKGN1cnBtYXApOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit2ZmJTdG9yZUNvbG9ycyhDb2xvcm1hcFB0ciBwbWFwLCBpbnQgbmRlZiwgeENvbG9ySXRlbSAqcGRlZnMpCit7CisgICAgWFdEQ29sb3IgKnBYV0RDbWFwOworICAgIGludCBpOworCisgICAgaWYgKHBtYXAgIT0gSW5zdGFsbGVkTWFwc1twbWFwLT5wU2NyZWVuLT5teU51bV0pCisgICAgeworCXJldHVybjsKKyAgICB9CisKKyAgICBwWFdEQ21hcCA9IHZmYlNjcmVlbnNbcG1hcC0+cFNjcmVlbi0+bXlOdW1dLnBYV0RDbWFwOworCisgICAgaWYgKChwbWFwLT5wVmlzdWFsLT5jX2NsYXNzIHwgRHluYW1pY0NsYXNzKSA9PSBEaXJlY3RDb2xvcikKKyAgICB7CisJcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuZGVmOyBpKyspCisgICAgeworCWlmIChwZGVmc1tpXS5mbGFncyAmIERvUmVkKQorCXsKKwkgICAgc3dhcGNvcHkxNihwWFdEQ21hcFtwZGVmc1tpXS5waXhlbF0ucmVkLCBwZGVmc1tpXS5yZWQpOworCX0KKwlpZiAocGRlZnNbaV0uZmxhZ3MgJiBEb0dyZWVuKQorCXsKKwkgICAgc3dhcGNvcHkxNihwWFdEQ21hcFtwZGVmc1tpXS5waXhlbF0uZ3JlZW4sIHBkZWZzW2ldLmdyZWVuKTsKKwl9CisJaWYgKHBkZWZzW2ldLmZsYWdzICYgRG9CbHVlKQorCXsKKwkgICAgc3dhcGNvcHkxNihwWFdEQ21hcFtwZGVmc1tpXS5waXhlbF0uYmx1ZSwgcGRlZnNbaV0uYmx1ZSk7CisJfQorICAgIH0KK30KKworc3RhdGljIEJvb2wKK3ZmYlNhdmVTY3JlZW4oU2NyZWVuUHRyIHBTY3JlZW4sIGludCBvbikKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEhBU19NTUFQCisKKy8qIHRoaXMgZmx1c2hlcyBhbnkgY2hhbmdlcyB0byB0aGUgc2NyZWVucyBvdXQgdG8gdGhlIG1tYXBwZWQgZmlsZSAqLworc3RhdGljIHZvaWQKK3ZmYkJsb2NrSGFuZGxlcihwb2ludGVyIGJsb2NrRGF0YSwgT1NUaW1lUHRyIHBUaW1lb3V0LCBwb2ludGVyIHBSZWFkbWFzaykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB2ZmJOdW1TY3JlZW5zOyBpKyspCisgICAgeworI2lmZGVmIE1TX0FTWU5DCisJaWYgKC0xID09IG1zeW5jKChjYWRkcl90KXZmYlNjcmVlbnNbaV0ucFhXREhlYWRlciwKKwkJCShzaXplX3QpdmZiU2NyZWVuc1tpXS5zaXplSW5CeXRlcywgTVNfQVNZTkMpKQorI2Vsc2UKKwkvKiBzaWxseSBOZXRCU0QgYW5kIHdobyBlbHNlPyAqLworCWlmICgtMSA9PSBtc3luYygoY2FkZHJfdCl2ZmJTY3JlZW5zW2ldLnBYV0RIZWFkZXIsCisJCQkoc2l6ZV90KXZmYlNjcmVlbnNbaV0uc2l6ZUluQnl0ZXMpKQorI2VuZGlmCisJeworCSAgICBwZXJyb3IoIm1zeW5jIik7CisJICAgIEVycm9yRigibXN5bmMgZmFpbGVkLCBlcnJubyAlZCIsIGVycm5vKTsKKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit2ZmJXYWtldXBIYW5kbGVyKHBvaW50ZXIgYmxvY2tEYXRhLCBpbnQgcmVzdWx0LCBwb2ludGVyIHBSZWFkbWFzaykKK3sKK30KKworCitzdGF0aWMgdm9pZAordmZiQWxsb2NhdGVNbWFwcGVkRnJhbWVidWZmZXIodmZiU2NyZWVuSW5mb1B0ciBwdmZiKQoreworI2RlZmluZSBEVU1NWV9CVUZGRVJfU0laRSA2NTUzNgorICAgIGNoYXIgZHVtbXlCdWZmZXJbRFVNTVlfQlVGRkVSX1NJWkVdOworICAgIGludCBjdXJyZW50RmlsZVNpemUsIHdyaXRlVGhpc1RpbWU7CisKKyAgICBzcHJpbnRmKHB2ZmItPm1tYXBfZmlsZSwgIiVzL1h2ZmJfc2NyZWVuJWQiLCBwZmJkaXIsIHB2ZmItPnNjcm51bSk7CisgICAgaWYgKC0xID09IChwdmZiLT5tbWFwX2ZkID0gb3BlbihwdmZiLT5tbWFwX2ZpbGUsIE9fQ1JFQVR8T19SRFdSLCAwNjY2KSkpCisgICAgeworCXBlcnJvcigib3BlbiIpOworCUVycm9yRigib3BlbiAlcyBmYWlsZWQsIGVycm5vICVkIiwgcHZmYi0+bW1hcF9maWxlLCBlcnJubyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEV4dGVuZCB0aGUgZmlsZSB0byBiZSB0aGUgcHJvcGVyIHNpemUgKi8KKworICAgIGJ6ZXJvKGR1bW15QnVmZmVyLCBEVU1NWV9CVUZGRVJfU0laRSk7CisgICAgZm9yIChjdXJyZW50RmlsZVNpemUgPSAwOworCSBjdXJyZW50RmlsZVNpemUgPCBwdmZiLT5zaXplSW5CeXRlczsKKwkgY3VycmVudEZpbGVTaXplICs9IHdyaXRlVGhpc1RpbWUpCisgICAgeworCXdyaXRlVGhpc1RpbWUgPSBtaW4oRFVNTVlfQlVGRkVSX1NJWkUsCisJCQkgICAgcHZmYi0+c2l6ZUluQnl0ZXMgLSBjdXJyZW50RmlsZVNpemUpOworCWlmICgtMSA9PSB3cml0ZShwdmZiLT5tbWFwX2ZkLCBkdW1teUJ1ZmZlciwgd3JpdGVUaGlzVGltZSkpCisJeworCSAgICBwZXJyb3IoIndyaXRlIik7CisJICAgIEVycm9yRigid3JpdGUgJXMgZmFpbGVkLCBlcnJubyAlZCIsIHB2ZmItPm1tYXBfZmlsZSwgZXJybm8pOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIC8qIHRyeSB0byBtbWFwIHRoZSBmaWxlICovCisKKyAgICBwdmZiLT5wWFdESGVhZGVyID0gKFhXREZpbGVIZWFkZXIgKiltbWFwKChjYWRkcl90KU5VTEwsIHB2ZmItPnNpemVJbkJ5dGVzLAorCQkJCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwKKwkJCQkgICAgTUFQX0ZJTEV8TUFQX1NIQVJFRCwKKwkJCQkgICAgcHZmYi0+bW1hcF9mZCwgMCk7CisgICAgaWYgKC0xID09IChsb25nKXB2ZmItPnBYV0RIZWFkZXIpCisgICAgeworCXBlcnJvcigibW1hcCIpOworCUVycm9yRigibW1hcCAlcyBmYWlsZWQsIGVycm5vICVkIiwgcHZmYi0+bW1hcF9maWxlLCBlcnJubyk7CisJcHZmYi0+cFhXREhlYWRlciA9IE5VTEw7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICghUmVnaXN0ZXJCbG9ja0FuZFdha2V1cEhhbmRsZXJzKHZmYkJsb2NrSGFuZGxlciwgdmZiV2FrZXVwSGFuZGxlciwKKwkJCQkJTlVMTCkpCisgICAgeworCXB2ZmItPnBYV0RIZWFkZXIgPSBOVUxMOworICAgIH0KK30KKyNlbmRpZiAvKiBIQVNfTU1BUCAqLworCisKKyNpZmRlZiBIQVNfU0hNCitzdGF0aWMgdm9pZAordmZiQWxsb2NhdGVTaGFyZWRNZW1vcnlGcmFtZWJ1ZmZlcih2ZmJTY3JlZW5JbmZvUHRyIHB2ZmIpCit7CisgICAgLyogY3JlYXRlIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgKi8KKworICAgIHB2ZmItPnNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLCBwdmZiLT5zaXplSW5CeXRlcywgSVBDX0NSRUFUfDA3NzcpOworICAgIGlmIChwdmZiLT5zaG1pZCA8IDApCisgICAgeworCXBlcnJvcigic2htZ2V0Iik7CisJRXJyb3JGKCJzaG1nZXQgJWQgYnl0ZXMgZmFpbGVkLCBlcnJubyAlZCIsIHB2ZmItPnNpemVJbkJ5dGVzLCBlcnJubyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIHRyeSB0byBhdHRhY2ggaXQgKi8KKworICAgIHB2ZmItPnBYV0RIZWFkZXIgPSAoWFdERmlsZUhlYWRlciAqKXNobWF0KHB2ZmItPnNobWlkLCAwLCAwKTsKKyAgICBpZiAoLTEgPT0gKGxvbmcpcHZmYi0+cFhXREhlYWRlcikKKyAgICB7CisJcGVycm9yKCJzaG1hdCIpOworCUVycm9yRigic2htYXQgZmFpbGVkLCBlcnJubyAlZCIsIGVycm5vKTsKKwlwdmZiLT5wWFdESGVhZGVyID0gTlVMTDsgCisJcmV0dXJuOworICAgIH0KKworICAgIEVycm9yRigic2NyZWVuICVkIHNobWlkICVkXG4iLCBwdmZiLT5zY3JudW0sIHB2ZmItPnNobWlkKTsKK30KKyNlbmRpZiAvKiBIQVNfU0hNICovCisKKworc3RhdGljIGNoYXIgKgordmZiQWxsb2NhdGVGcmFtZWJ1ZmZlck1lbW9yeSh2ZmJTY3JlZW5JbmZvUHRyIHB2ZmIpCit7CisgICAgaWYgKHB2ZmItPnBmYk1lbW9yeSkgcmV0dXJuIHB2ZmItPnBmYk1lbW9yeTsgLyogYWxyZWFkeSBkb25lICovCisKKyAgICBwdmZiLT5zaXplSW5CeXRlcyA9IHB2ZmItPnBhZGRlZEJ5dGVzV2lkdGggKiBwdmZiLT5oZWlnaHQ7CisKKyAgICAvKiBDYWxjdWxhdGUgaG93IG1hbnkgZW50cmllcyBpbiBjb2xvcm1hcC4gIFRoaXMgaXMgcmF0aGVyIGJvZ3VzLCBiZWNhdXNlCisgICAgICogdGhlIHZpc3VhbHMgaGF2ZW4ndCBldmVuIGJlZW4gc2V0IHVwIHlldCwgYnV0IHdlIG5lZWQgdG8ga25vdyBiZWNhdXNlIHdlCisgICAgICogaGF2ZSB0byBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZmlsZSBmb3IgdGhlIGNvbG9ybWFwLiAgVGhlIG51bWJlciAxMAorICAgICAqIGJlbG93IGNvbWVzIGZyb20gdGhlIE1BWF9QU0VVRE9fREVQVEggZGVmaW5lIGluIGNmYmNtYXAuYy4KKyAgICAgKi8KKworICAgIGlmIChwdmZiLT5kZXB0aCA8PSAxMCkKKyAgICB7IC8qIHNpbmdsZSBpbmRleCBjb2xvcm1hcHMgKi8KKwlwdmZiLT5uY29sb3JzID0gMSA8PCBwdmZiLT5kZXB0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogZGVjb21wb3NlZCBjb2xvcm1hcHMgKi8KKwlpbnQgbnBsYW5lc19wZXJfY29sb3JfY29tcG9uZW50ID0gcHZmYi0+ZGVwdGggLyAzOworCWlmIChwdmZiLT5kZXB0aCAlIDMpIG5wbGFuZXNfcGVyX2NvbG9yX2NvbXBvbmVudCsrOworCXB2ZmItPm5jb2xvcnMgPSAxIDw8IG5wbGFuZXNfcGVyX2NvbG9yX2NvbXBvbmVudDsKKyAgICB9CisKKyAgICAvKiBhZGQgZXh0cmEgYnl0ZXMgZm9yIFhXREZpbGVIZWFkZXIsIHdpbmRvdyBuYW1lLCBhbmQgY29sb3JtYXAgKi8KKworICAgIHB2ZmItPnNpemVJbkJ5dGVzICs9IFNJWkVPRihYV0RoZWFkZXIpICsgWFdEX1dJTkRPV19OQU1FX0xFTiArCisJCSAgICBwdmZiLT5uY29sb3JzICogU0laRU9GKFhXRENvbG9yKTsKKworICAgIHB2ZmItPnBYV0RIZWFkZXIgPSBOVUxMOyAKKyAgICBzd2l0Y2ggKGZibWVtdHlwZSkKKyAgICB7CisjaWZkZWYgSEFTX01NQVAKKyAgICBjYXNlIE1NQVBQRURfRklMRV9GQjogIHZmYkFsbG9jYXRlTW1hcHBlZEZyYW1lYnVmZmVyKHB2ZmIpOyBicmVhazsKKyNlbHNlCisgICAgY2FzZSBNTUFQUEVEX0ZJTEVfRkI6IGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBIQVNfU0hNCisgICAgY2FzZSBTSEFSRURfTUVNT1JZX0ZCOiB2ZmJBbGxvY2F0ZVNoYXJlZE1lbW9yeUZyYW1lYnVmZmVyKHB2ZmIpOyBicmVhazsKKyNlbHNlCisgICAgY2FzZSBTSEFSRURfTUVNT1JZX0ZCOiBicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSBOT1JNQUxfTUVNT1JZX0ZCOgorCXB2ZmItPnBYV0RIZWFkZXIgPSAoWFdERmlsZUhlYWRlciAqKVhhbGxvYyhwdmZiLT5zaXplSW5CeXRlcyk7CisJYnJlYWs7CisgICAgfQorCisgICAgaWYgKHB2ZmItPnBYV0RIZWFkZXIpCisgICAgeworCXB2ZmItPnBYV0RDbWFwID0gKFhXRENvbG9yICopKChjaGFyICopcHZmYi0+cFhXREhlYWRlcgorCQkJCSsgU0laRU9GKFhXRGhlYWRlcikgKyBYV0RfV0lORE9XX05BTUVfTEVOKTsKKwlwdmZiLT5wZmJNZW1vcnkgPSAoY2hhciAqKShwdmZiLT5wWFdEQ21hcCArIHB2ZmItPm5jb2xvcnMpOworCisJcmV0dXJuIHB2ZmItPnBmYk1lbW9yeTsKKyAgICB9CisgICAgZWxzZQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAordmZiV3JpdGVYV0RGaWxlSGVhZGVyKFNjcmVlblB0ciBwU2NyZWVuKQoreworICAgIHZmYlNjcmVlbkluZm9QdHIgcHZmYiA9ICZ2ZmJTY3JlZW5zW3BTY3JlZW4tPm15TnVtXTsKKyAgICBYV0RGaWxlSGVhZGVyICpwWFdESGVhZGVyID0gcHZmYi0+cFhXREhlYWRlcjsKKyAgICBjaGFyIGhvc3RuYW1lW1hXRF9XSU5ET1dfTkFNRV9MRU5dOworICAgIHVuc2lnbmVkIGxvbmcgc3dhcHRlc3QgPSAxOworICAgIGludCBpOworCisgICAgbmVlZHN3YXAgPSAqKGNoYXIgKikgJnN3YXB0ZXN0OworCisgICAgcFhXREhlYWRlci0+aGVhZGVyX3NpemUgPSAoY2hhciAqKXB2ZmItPnBYV0RDbWFwIC0gKGNoYXIgKilwdmZiLT5wWFdESGVhZGVyOworICAgIHBYV0RIZWFkZXItPmZpbGVfdmVyc2lvbiA9IFhXRF9GSUxFX1ZFUlNJT047CisKKyAgICBwWFdESGVhZGVyLT5waXhtYXBfZm9ybWF0ID0gWlBpeG1hcDsKKyAgICBwWFdESGVhZGVyLT5waXhtYXBfZGVwdGggPSBwdmZiLT5kZXB0aDsKKyAgICBwWFdESGVhZGVyLT5waXhtYXBfaGVpZ2h0ID0gcFhXREhlYWRlci0+d2luZG93X2hlaWdodCA9IHB2ZmItPmhlaWdodDsKKyAgICBwWFdESGVhZGVyLT54b2Zmc2V0ID0gMDsKKyAgICBwWFdESGVhZGVyLT5ieXRlX29yZGVyID0gSU1BR0VfQllURV9PUkRFUjsKKyAgICBwWFdESGVhZGVyLT5iaXRtYXBfYml0X29yZGVyID0gQklUTUFQX0JJVF9PUkRFUjsKKyNpZm5kZWYgSU5URVJOQUxfVlNfRVhURVJOQUxfUEFERElORworICAgIHBYV0RIZWFkZXItPnBpeG1hcF93aWR0aCA9IHBYV0RIZWFkZXItPndpbmRvd193aWR0aCA9IHB2ZmItPndpZHRoOworICAgIHBYV0RIZWFkZXItPmJpdG1hcF91bml0ID0gQklUTUFQX1NDQU5MSU5FX1VOSVQ7CisgICAgcFhXREhlYWRlci0+Yml0bWFwX3BhZCA9IEJJVE1BUF9TQ0FOTElORV9QQUQ7CisjZWxzZQorICAgIHBYV0RIZWFkZXItPnBpeG1hcF93aWR0aCA9IHBYV0RIZWFkZXItPndpbmRvd193aWR0aCA9IHB2ZmItPnBhZGRlZFdpZHRoOworICAgIHBYV0RIZWFkZXItPmJpdG1hcF91bml0ID0gQklUTUFQX1NDQU5MSU5FX1VOSVRfUFJPVE87CisgICAgcFhXREhlYWRlci0+Yml0bWFwX3BhZCA9IEJJVE1BUF9TQ0FOTElORV9QQURfUFJPVE87CisjZW5kaWYKKyAgICBwWFdESGVhZGVyLT5iaXRzX3Blcl9waXhlbCA9IHB2ZmItPmJpdHNQZXJQaXhlbDsKKyAgICBwWFdESGVhZGVyLT5ieXRlc19wZXJfbGluZSA9IHB2ZmItPnBhZGRlZEJ5dGVzV2lkdGg7CisgICAgcFhXREhlYWRlci0+bmNvbG9ycyA9IHB2ZmItPm5jb2xvcnM7CisKKyAgICAvKiB2aXN1YWwgcmVsYXRlZCBmaWVsZHMgYXJlIHdyaXR0ZW4gd2hlbiBjb2xvcm1hcCBpcyBpbnN0YWxsZWQgKi8KKworICAgIHBYV0RIZWFkZXItPndpbmRvd194ID0gcFhXREhlYWRlci0+d2luZG93X3kgPSAwOworICAgIHBYV0RIZWFkZXItPndpbmRvd19iZHJ3aWR0aCA9IDA7CisKKyAgICAvKiB3cml0ZSB4d2QgIndpbmRvdyIgbmFtZTogWHZmYiBob3N0bmFtZTpzZXJ2ZXIuc2NyZWVuICovCisKKyAgICBpZiAoLTEgPT0gZ2V0aG9zdG5hbWUoaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSkpKQorCWhvc3RuYW1lWzBdID0gMDsKKyAgICBlbHNlCisJaG9zdG5hbWVbWFdEX1dJTkRPV19OQU1FX0xFTi0xXSA9IDA7CisgICAgc3ByaW50ZigoY2hhciAqKShwWFdESGVhZGVyKzEpLCAiWHZmYiAlczolcy4lZCIsIGhvc3RuYW1lLCBkaXNwbGF5LAorCSAgICBwU2NyZWVuLT5teU51bSk7CisKKyAgICAvKiB3cml0ZSBjb2xvcm1hcCBwaXhlbCBzbG90IHZhbHVlcyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IHB2ZmItPm5jb2xvcnM7IGkrKykKKyAgICB7CisJcHZmYi0+cFhXRENtYXBbaV0ucGl4ZWwgPSBpOworICAgIH0KKworICAgIC8qIGJ5dGUgc3dhcCB0byBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKworICAgIGlmIChuZWVkc3dhcCkKKyAgICB7CisJU3dhcExvbmdzKChDQVJEMzIgKilwWFdESGVhZGVyLCBTSVpFT0YoWFdEaGVhZGVyKS80KTsKKwlmb3IgKGkgPSAwOyBpIDwgcHZmYi0+bmNvbG9yczsgaSsrKQorCXsKKwkgICAgcmVnaXN0ZXIgY2hhciBuOworCSAgICBzd2FwbCgmcHZmYi0+cFhXRENtYXBbaV0ucGl4ZWwsIG4pOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIEJvb2wKK3ZmYkN1cnNvck9mZlNjcmVlbiAoU2NyZWVuUHRyICpwcFNjcmVlbiwgaW50ICp4LCBpbnQgKnkpCit7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAordmZiQ3Jvc3NTY3JlZW4gKFNjcmVlblB0ciBwU2NyZWVuLCBCb29sIGVudGVyaW5nKQoreworfQorCitzdGF0aWMgQm9vbCB2ZmJSZWFsaXplQ3Vyc29yKFNjcmVlblB0ciBwU2NyZWVuLCBDdXJzb3JQdHIgcEN1cnNvcikgeworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgQm9vbCB2ZmJVbnJlYWxpemVDdXJzb3IoU2NyZWVuUHRyIHBTY3JlZW4sIEN1cnNvclB0ciBwQ3Vyc29yKSB7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHZmYlNldEN1cnNvcihTY3JlZW5QdHIgcFNjcmVlbiwgQ3Vyc29yUHRyIHBDdXJzb3IsIGludCB4LCBpbnQgeSkgCit7Cit9CisKK3N0YXRpYyB2b2lkIHZmYk1vdmVDdXJzb3IoU2NyZWVuUHRyIHBTY3JlZW4sIGludCB4LCBpbnQgeSkgCit7Cit9CisKK3N0YXRpYyBtaVBvaW50ZXJTcHJpdGVGdW5jUmVjIHZmYlBvaW50ZXJTcHJpdGVGdW5jcyA9IHsKKyAgICB2ZmJSZWFsaXplQ3Vyc29yLAorICAgIHZmYlVucmVhbGl6ZUN1cnNvciwKKyAgICB2ZmJTZXRDdXJzb3IsCisgICAgdmZiTW92ZUN1cnNvcgorfTsKKworc3RhdGljIG1pUG9pbnRlclNjcmVlbkZ1bmNSZWMgdmZiUG9pbnRlckN1cnNvckZ1bmNzID0geworICAgIHZmYkN1cnNvck9mZlNjcmVlbiwKKyAgICB2ZmJDcm9zc1NjcmVlbiwKKyAgICBtaVBvaW50ZXJXYXJwQ3Vyc29yCit9OworCitzdGF0aWMgQm9vbAordmZiQ2xvc2VTY3JlZW4oaW50IGluZGV4LCBTY3JlZW5QdHIgcFNjcmVlbikKK3sKKyAgICB2ZmJTY3JlZW5JbmZvUHRyIHB2ZmIgPSAmdmZiU2NyZWVuc1tpbmRleF07CisgICAgaW50IGk7CisgCisgICAgcFNjcmVlbi0+Q2xvc2VTY3JlZW4gPSBwdmZiLT5jbG9zZVNjcmVlbjsKKworICAgIC8qCisgICAgICogWFhYIHByb2JhYmx5IGxvdHMgb2Ygc3R1ZmYgdG8gY2xlYW4uICBGb3Igbm93LAorICAgICAqIGNsZWFyIEluc3RhbGxlZE1hcHNbXSBzbyB0aGF0IHNlcnZlciByZXNldCB3b3JrcyBjb3JyZWN0bHkuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE1BWFNDUkVFTlM7IGkrKykKKwlJbnN0YWxsZWRNYXBzW2ldID0gTlVMTDsKKworICAgIHJldHVybiBwU2NyZWVuLT5DbG9zZVNjcmVlbihpbmRleCwgcFNjcmVlbik7Cit9CisKK3N0YXRpYyBCb29sCit2ZmJTY3JlZW5Jbml0KGludCBpbmRleCwgU2NyZWVuUHRyIHBTY3JlZW4sIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICB2ZmJTY3JlZW5JbmZvUHRyIHB2ZmIgPSAmdmZiU2NyZWVuc1tpbmRleF07CisgICAgaW50IGRwaSA9IDEwMDsKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKnBiaXRzOworCisgICAgaWYgKG1vbml0b3JSZXNvbHV0aW9uKSBkcGkgPSBtb25pdG9yUmVzb2x1dGlvbjsKKworICAgIHB2ZmItPnBhZGRlZEJ5dGVzV2lkdGggPSBQaXhtYXBCeXRlUGFkKHB2ZmItPndpZHRoLCBwdmZiLT5kZXB0aCk7CisgICAgcHZmYi0+Yml0c1BlclBpeGVsID0gdmZiQml0c1BlclBpeGVsKHB2ZmItPmRlcHRoKTsKKyAgICBwdmZiLT5wYWRkZWRXaWR0aCA9IHB2ZmItPnBhZGRlZEJ5dGVzV2lkdGggKiA4IC8gcHZmYi0+Yml0c1BlclBpeGVsOworICAgIHBiaXRzID0gdmZiQWxsb2NhdGVGcmFtZWJ1ZmZlck1lbW9yeShwdmZiKTsKKyAgICBpZiAoIXBiaXRzKSByZXR1cm4gRkFMU0U7CisgICAgdm5jRmJwdHJbaW5kZXhdID0gcGJpdHM7CisKKyAgICBkZWZhdWx0Q29sb3JWaXN1YWxDbGFzcworCT0gKHB2ZmItPmJpdHNQZXJQaXhlbCA+IDgpID8gVHJ1ZUNvbG9yIDogUHNldWRvQ29sb3I7CisKKyAgICByZXQgPSBmYlNjcmVlbkluaXQocFNjcmVlbiwgcGJpdHMsIHB2ZmItPndpZHRoLCBwdmZiLT5oZWlnaHQsCisJCSAgICAgICBkcGksIGRwaSwgcHZmYi0+cGFkZGVkV2lkdGgsIHB2ZmItPmJpdHNQZXJQaXhlbCk7CisgIAorI2lmZGVmIFJFTkRFUgorICAgIGlmIChyZXQgJiYgUmVuZGVyKSAKKwlmYlBpY3R1cmVJbml0IChwU2NyZWVuLCAwLCAwKTsKKyNlbmRpZgorCisgICAgaWYgKCFyZXQpIHJldHVybiBGQUxTRTsKKworICAgIC8qIG1pSW5pdGlhbGl6ZUJhY2tpbmdTdG9yZShwU2NyZWVuKTsgKi8KKworICAgIC8qCisgICAgICogQ2lyY3VtdmVudCB0aGUgYmFja2luZyBzdG9yZSB0aGF0IHdhcyBqdXN0IGluaXRpYWxpc2VkLiAgVGhpcyBhbW91bnRzCisgICAgICogdG8gYSB0cnVlbHkgYml6YXJyZSB3YXkgb2YgaW5pdGlhbGlzaW5nIFNhdmVEb29tZWRBcmVhcyBhbmQgZnJpZW5kcy4KKyAgICAgKi8KKworICAgIHBTY3JlZW4tPkluc3RhbGxDb2xvcm1hcCA9IHZmYkluc3RhbGxDb2xvcm1hcDsKKyAgICBwU2NyZWVuLT5Vbmluc3RhbGxDb2xvcm1hcCA9IHZmYlVuaW5zdGFsbENvbG9ybWFwOworICAgIHBTY3JlZW4tPkxpc3RJbnN0YWxsZWRDb2xvcm1hcHMgPSB2ZmJMaXN0SW5zdGFsbGVkQ29sb3JtYXBzOworCisgICAgcFNjcmVlbi0+U2F2ZVNjcmVlbiA9IHZmYlNhdmVTY3JlZW47CisgICAgcFNjcmVlbi0+U3RvcmVDb2xvcnMgPSB2ZmJTdG9yZUNvbG9yczsKKyAgICAKKyAgICBtaVBvaW50ZXJJbml0aWFsaXplKHBTY3JlZW4sICZ2ZmJQb2ludGVyU3ByaXRlRnVuY3MsICZ2ZmJQb2ludGVyQ3Vyc29yRnVuY3MsCisJCQlGQUxTRSk7CisgICAgCisgICAgdmZiV3JpdGVYV0RGaWxlSGVhZGVyKHBTY3JlZW4pOworCisgICAgcFNjcmVlbi0+YmxhY2tQaXhlbCA9IHB2ZmItPmJsYWNrUGl4ZWw7CisgICAgcFNjcmVlbi0+d2hpdGVQaXhlbCA9IHB2ZmItPndoaXRlUGl4ZWw7CisKKyAgICBpZiAoIXB2ZmItPnBpeGVsRm9ybWF0RGVmaW5lZCAmJiBwdmZiLT5kZXB0aCA9PSAxNikgeworCXB2ZmItPnBpeGVsRm9ybWF0RGVmaW5lZCA9IFRSVUU7CisJcHZmYi0+cmdiTm90QmdyID0gVFJVRTsKKwlwdmZiLT5ibHVlQml0cyA9IHB2ZmItPnJlZEJpdHMgPSA1OworCXB2ZmItPmdyZWVuQml0cyA9IDY7CisgICAgfQorICAgIAorICAgIGlmIChwdmZiLT5waXhlbEZvcm1hdERlZmluZWQpIHsKKwlWaXN1YWxQdHIgdmlzID0gcFNjcmVlbi0+dmlzdWFsczsKKwlmb3IgKGludCBpID0gMDsgaSA8IHBTY3JlZW4tPm51bVZpc3VhbHM7IGkrKykgeworCSAgICBpZiAocHZmYi0+cmdiTm90QmdyKSB7CisJCXZpcy0+b2Zmc2V0Qmx1ZSA9IDA7CisJCXZpcy0+Ymx1ZU1hc2sgPSAoMSA8PCBwdmZiLT5ibHVlQml0cykgLSAxOworCQl2aXMtPm9mZnNldEdyZWVuID0gcHZmYi0+Ymx1ZUJpdHM7CisJCXZpcy0+Z3JlZW5NYXNrID0gKCgxIDw8IHB2ZmItPmdyZWVuQml0cykgLSAxKSA8PCB2aXMtPm9mZnNldEdyZWVuOworCQl2aXMtPm9mZnNldFJlZCA9IHZpcy0+b2Zmc2V0R3JlZW4gKyBwdmZiLT5ncmVlbkJpdHM7CisJCXZpcy0+cmVkTWFzayA9ICgoMSA8PCBwdmZiLT5yZWRCaXRzKSAtIDEpIDw8IHZpcy0+b2Zmc2V0UmVkOworCSAgICB9IGVsc2UgeworCQl2aXMtPm9mZnNldFJlZCA9IDA7CisJCXZpcy0+cmVkTWFzayA9ICgxIDw8IHB2ZmItPnJlZEJpdHMpIC0gMTsKKwkJdmlzLT5vZmZzZXRHcmVlbiA9IHB2ZmItPnJlZEJpdHM7CisJCXZpcy0+Z3JlZW5NYXNrID0gKCgxIDw8IHB2ZmItPmdyZWVuQml0cykgLSAxKSA8PCB2aXMtPm9mZnNldEdyZWVuOworCQl2aXMtPm9mZnNldEJsdWUgPSB2aXMtPm9mZnNldEdyZWVuICsgcHZmYi0+Z3JlZW5CaXRzOworCQl2aXMtPmJsdWVNYXNrID0gKCgxIDw8IHB2ZmItPmJsdWVCaXRzKSAtIDEpIDw8IHZpcy0+b2Zmc2V0Qmx1ZTsKKwkgICAgfQorCSAgICB2aXMrKzsKKwl9CisgICAgfQorICAgIAorICAgIHJldCA9IGZiQ3JlYXRlRGVmQ29sb3JtYXAocFNjcmVlbik7CisKKyAgICBtaVNldFplcm9MaW5lQmlhcyhwU2NyZWVuLCBwdmZiLT5saW5lQmlhcyk7CisKKyAgICBwdmZiLT5jbG9zZVNjcmVlbiA9IHBTY3JlZW4tPkNsb3NlU2NyZWVuOworICAgIHBTY3JlZW4tPkNsb3NlU2NyZWVuID0gdmZiQ2xvc2VTY3JlZW47CisKKyNpZm5kZWYgTk9fSU5JVF9CQUNLSU5HX1NUT1JFCisgIG1pSW5pdGlhbGl6ZUJhY2tpbmdTdG9yZShwU2NyZWVuKTsKKyAgcFNjcmVlbi0+YmFja2luZ1N0b3JlU3VwcG9ydCA9IEFsd2F5czsKKyNlbmRpZgorCisgIHJldHVybiByZXQ7CisKK30gLyogZW5kIHZmYlNjcmVlbkluaXQgKi8KKworCitzdGF0aWMgdm9pZCB2ZmJDbGllbnRTdGF0ZUNoYW5nZShDYWxsYmFja0xpc3RQdHIqLCBwb2ludGVyLCBwb2ludGVyKSB7CisgIGRpc3BhdGNoRXhjZXB0aW9uICY9IH5ERV9SRVNFVDsKK30KKwordm9pZAorSW5pdE91dHB1dChTY3JlZW5JbmZvICpzY3JlZW5JbmZvLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEVycm9yRigiXG5Ydm5jICVzIC0gYnVpbHQgJXNcbiVzIiwgWFZOQ1ZFUlNJT04sIGJ1aWxkdGltZSwgWFZOQ0NPUFlSSUdIVCk7CisgIEVycm9yRigiVW5kZXJseWluZyBYIHNlcnZlciByZWxlYXNlICVkLCAlc1xuXG4iLCBWRU5ET1JfUkVMRUFTRSwKKyAgICAgICAgIFZFTkRPUl9TVFJJTkcpOworICAgIGludCBpOworICAgIGludCBOdW1Gb3JtYXRzID0gMDsKKworICAgIC8qIGluaXRpYWxpemUgcGl4bWFwIGZvcm1hdHMgKi8KKworICAgIC8qIG11c3QgaGF2ZSBhIHBpeG1hcCBkZXB0aCB0byBtYXRjaCBldmVyeSBzY3JlZW4gZGVwdGggKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgdmZiTnVtU2NyZWVuczsgaSsrKQorICAgIHsKKwl2ZmJQaXhtYXBEZXB0aHNbdmZiU2NyZWVuc1tpXS5kZXB0aF0gPSBUUlVFOworICAgIH0KKworICAgIC8qIFJFTkRFUiBuZWVkcyBhIGdvb2Qgc2V0IG9mIHBpeG1hcHMuICovCisgICAgaWYgKFJlbmRlcikgeworCXZmYlBpeG1hcERlcHRoc1sxXSA9IFRSVUU7CisJdmZiUGl4bWFwRGVwdGhzWzRdID0gVFJVRTsKKwl2ZmJQaXhtYXBEZXB0aHNbOF0gPSBUUlVFOworLyoJdmZiUGl4bWFwRGVwdGhzWzE1XSA9IFRSVUU7ICovCisJdmZiUGl4bWFwRGVwdGhzWzE2XSA9IFRSVUU7CisJdmZiUGl4bWFwRGVwdGhzWzI0XSA9IFRSVUU7CisJdmZiUGl4bWFwRGVwdGhzWzMyXSA9IFRSVUU7CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8PSAzMjsgaSsrKQorICAgIHsKKwlpZiAodmZiUGl4bWFwRGVwdGhzW2ldKQorCXsKKwkgICAgaWYgKE51bUZvcm1hdHMgPj0gTUFYRk9STUFUUykKKwkJRmF0YWxFcnJvciAoIk1BWEZPUk1BVFMgaXMgdG9vIHNtYWxsIGZvciB0aGlzIHNlcnZlclxuIik7CisJICAgIHNjcmVlbkluZm8tPmZvcm1hdHNbTnVtRm9ybWF0c10uZGVwdGggPSBpOworCSAgICBzY3JlZW5JbmZvLT5mb3JtYXRzW051bUZvcm1hdHNdLmJpdHNQZXJQaXhlbCA9IHZmYkJpdHNQZXJQaXhlbChpKTsKKwkgICAgc2NyZWVuSW5mby0+Zm9ybWF0c1tOdW1Gb3JtYXRzXS5zY2FubGluZVBhZCA9IEJJVE1BUF9TQ0FOTElORV9QQUQ7CisJICAgIE51bUZvcm1hdHMrKzsKKwl9CisgICAgfQorCisgICAgc2NyZWVuSW5mby0+aW1hZ2VCeXRlT3JkZXIgPSBJTUFHRV9CWVRFX09SREVSOworICAgIHNjcmVlbkluZm8tPmJpdG1hcFNjYW5saW5lVW5pdCA9IEJJVE1BUF9TQ0FOTElORV9VTklUOworICAgIHNjcmVlbkluZm8tPmJpdG1hcFNjYW5saW5lUGFkID0gQklUTUFQX1NDQU5MSU5FX1BBRDsKKyAgICBzY3JlZW5JbmZvLT5iaXRtYXBCaXRPcmRlciA9IEJJVE1BUF9CSVRfT1JERVI7CisgICAgc2NyZWVuSW5mby0+bnVtUGl4bWFwRm9ybWF0cyA9IE51bUZvcm1hdHM7CisKKyAgICAvKiBpbml0aWFsaXplIHNjcmVlbnMgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCB2ZmJOdW1TY3JlZW5zOyBpKyspCisgICAgeworCWlmICgtMSA9PSBBZGRTY3JlZW4odmZiU2NyZWVuSW5pdCwgYXJnYywgYXJndikpCisJeworCSAgICBGYXRhbEVycm9yKCJDb3VsZG4ndCBhZGQgc2NyZWVuICVkIiwgaSk7CisJfQorICAgIH0KKworICAgIGlmICghQWRkQ2FsbGJhY2soJkNsaWVudFN0YXRlQ2FsbGJhY2ssIHZmYkNsaWVudFN0YXRlQ2hhbmdlLCAwKSkgeworCUZhdGFsRXJyb3IoIkFkZENhbGxiYWNrIGZhaWxlZFxuIik7CisgICAgfQorfSAvKiBlbmQgSW5pdE91dHB1dCAqLworCisjaWZkZWYgRFBNU0V4dGVuc2lvbgorZXh0ZXJuICJDIiB7CisjaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICB2b2lkIERQTVNTZXQoQ0FSRDE2IGxldmVsKQorI2Vsc2UKKyAgICB2b2lkIERQTVNTZXQobGV2ZWwpCisgICAgQ0FSRDE2IGxldmVsOworI2VuZGlmCisgIHsKKyAgICByZXR1cm47CisgIH0KKworICBCb29sIERQTVNTdXBwb3J0ZWQoKQorICB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisjZW5kaWYKKworLyogdGhpcyBpcyBqdXN0IHRvIGdldCB0aGUgc2VydmVyIHRvIGxpbmsgb24gQUlYICovCisjaWZkZWYgQUlYVjMKK2ludCBTZWxlY3RXYWl0VGltZSA9IDEwMDAwOyAvKiB1c2VjICovCisjZW5kaWYKKworQm9vbCBMZWdhbE1vZGlmaWVyKHVuc2lnbmVkIGludCBrZXksIERldmljZVB0ciBwRGV2KQoreworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBQcm9jZXNzSW5wdXRFdmVudHMoKQoreworICBtaWVxUHJvY2Vzc0lucHV0RXZlbnRzKCk7CisgIG1pUG9pbnRlclVwZGF0ZSgpOworfQorCisvKiBGYWlybHkgc3RhbmRhcmQgVVMgUEMgS2V5Ym9hcmQgKi8KKworI2RlZmluZSBWRkJfTUlOX0tFWSA4CisjZGVmaW5lIFZGQl9NQVhfS0VZIDI1NQorI2RlZmluZSBWRkJfTUFQX0xFTiAoVkZCX01BWF9LRVkgLSBWRkJfTUlOX0tFWSArIDEpCisjZGVmaW5lIEtFWVNZTVNfUEVSX0tFWSAyCitLZXlTeW0ga2V5Ym9hcmRNYXBbVkZCX01BUF9MRU4gKiBLRVlTWU1TX1BFUl9LRVldID0geworICBOb1N5bWJvbCwgTm9TeW1ib2wsCisgIFhLX0VzY2FwZSwgTm9TeW1ib2wsCisgIFhLXzEsIFhLX2V4Y2xhbSwKKyAgWEtfMiwgWEtfYXQsCisgIFhLXzMsIFhLX251bWJlcnNpZ24sCisgIFhLXzQsIFhLX2RvbGxhciwKKyAgWEtfNSwgWEtfcGVyY2VudCwKKyAgWEtfNiwgWEtfYXNjaWljaXJjdW0sCisgIFhLXzcsIFhLX2FtcGVyc2FuZCwKKyAgWEtfOCwgWEtfYXN0ZXJpc2ssCisgIFhLXzksIFhLX3BhcmVubGVmdCwKKyAgWEtfMCwgWEtfcGFyZW5yaWdodCwKKyAgWEtfbWludXMsIFhLX3VuZGVyc2NvcmUsCisgIFhLX2VxdWFsLCBYS19wbHVzLAorICBYS19CYWNrU3BhY2UsIE5vU3ltYm9sLAorICBYS19UYWIsIE5vU3ltYm9sLAorICBYS19xLCBYS19RLAorICBYS193LCBYS19XLAorICBYS19lLCBYS19FLAorICBYS19yLCBYS19SLAorICBYS190LCBYS19ULAorICBYS195LCBYS19ZLAorICBYS191LCBYS19VLAorICBYS19pLCBYS19JLAorICBYS19vLCBYS19PLAorICBYS19wLCBYS19QLAorICBYS19icmFja2V0bGVmdCwgWEtfYnJhY2VsZWZ0LAorICBYS19icmFja2V0cmlnaHQsIFhLX2JyYWNlcmlnaHQsCisgIFhLX1JldHVybiwgTm9TeW1ib2wsCisgIFhLX0NvbnRyb2xfTCwgTm9TeW1ib2wsCisgIFhLX2EsIFhLX0EsCisgIFhLX3MsIFhLX1MsCisgIFhLX2QsIFhLX0QsCisgIFhLX2YsIFhLX0YsCisgIFhLX2csIFhLX0csCisgIFhLX2gsIFhLX0gsCisgIFhLX2osIFhLX0osCisgIFhLX2ssIFhLX0ssCisgIFhLX2wsIFhLX0wsCisgIFhLX3NlbWljb2xvbiwgWEtfY29sb24sCisgIFhLX2Fwb3N0cm9waGUsIFhLX3F1b3RlZGJsLAorICBYS19ncmF2ZSwgWEtfYXNjaWl0aWxkZSwKKyAgWEtfU2hpZnRfTCwgTm9TeW1ib2wsCisgIFhLX2JhY2tzbGFzaCwgWEtfYmFyLAorICBYS196LCBYS19aLAorICBYS194LCBYS19YLAorICBYS19jLCBYS19DLAorICBYS192LCBYS19WLAorICBYS19iLCBYS19CLAorICBYS19uLCBYS19OLAorICBYS19tLCBYS19NLAorICBYS19jb21tYSwgWEtfbGVzcywKKyAgWEtfcGVyaW9kLCBYS19ncmVhdGVyLAorICBYS19zbGFzaCwgWEtfcXVlc3Rpb24sCisgIFhLX1NoaWZ0X1IsIE5vU3ltYm9sLAorICBYS19LUF9NdWx0aXBseSwgTm9TeW1ib2wsCisgIFhLX0FsdF9MLCBYS19NZXRhX0wsCisgIFhLX3NwYWNlLCBOb1N5bWJvbCwKKyAgLypYS19DYXBzX0xvY2sqLyBOb1N5bWJvbCwgTm9TeW1ib2wsCisgIFhLX0YxLCBOb1N5bWJvbCwKKyAgWEtfRjIsIE5vU3ltYm9sLAorICBYS19GMywgTm9TeW1ib2wsCisgIFhLX0Y0LCBOb1N5bWJvbCwKKyAgWEtfRjUsIE5vU3ltYm9sLAorICBYS19GNiwgTm9TeW1ib2wsCisgIFhLX0Y3LCBOb1N5bWJvbCwKKyAgWEtfRjgsIE5vU3ltYm9sLAorICBYS19GOSwgTm9TeW1ib2wsCisgIFhLX0YxMCwgTm9TeW1ib2wsCisgIFhLX051bV9Mb2NrLCBYS19Qb2ludGVyX0VuYWJsZUtleXMsCisgIFhLX1Njcm9sbF9Mb2NrLCBOb1N5bWJvbCwKKyAgWEtfS1BfSG9tZSwgWEtfS1BfNywKKyAgWEtfS1BfVXAsIFhLX0tQXzgsCisgIFhLX0tQX1ByaW9yLCBYS19LUF85LAorICBYS19LUF9TdWJ0cmFjdCwgTm9TeW1ib2wsCisgIFhLX0tQX0xlZnQsIFhLX0tQXzQsCisgIFhLX0tQX0JlZ2luLCBYS19LUF81LAorICBYS19LUF9SaWdodCwgWEtfS1BfNiwKKyAgWEtfS1BfQWRkLCBOb1N5bWJvbCwKKyAgWEtfS1BfRW5kLCBYS19LUF8xLAorICBYS19LUF9Eb3duLCBYS19LUF8yLAorICBYS19LUF9OZXh0LCBYS19LUF8zLAorICBYS19LUF9JbnNlcnQsIFhLX0tQXzAsCisgIFhLX0tQX0RlbGV0ZSwgWEtfS1BfRGVjaW1hbCwKKyAgTm9TeW1ib2wsIE5vU3ltYm9sLAorICBOb1N5bWJvbCwgTm9TeW1ib2wsCisgIE5vU3ltYm9sLCBOb1N5bWJvbCwKKyAgWEtfRjExLCBOb1N5bWJvbCwKKyAgWEtfRjEyLCBOb1N5bWJvbCwKKyAgWEtfSG9tZSwgTm9TeW1ib2wsCisgIFhLX1VwLCBOb1N5bWJvbCwKKyAgWEtfUHJpb3IsIE5vU3ltYm9sLAorICBYS19MZWZ0LCBOb1N5bWJvbCwKKyAgTm9TeW1ib2wsIE5vU3ltYm9sLAorICBYS19SaWdodCwgTm9TeW1ib2wsCisgIFhLX0VuZCwgTm9TeW1ib2wsCisgIFhLX0Rvd24sIE5vU3ltYm9sLAorICBYS19OZXh0LCBOb1N5bWJvbCwKKyAgWEtfSW5zZXJ0LCBOb1N5bWJvbCwKKyAgWEtfRGVsZXRlLCBOb1N5bWJvbCwKKyAgWEtfS1BfRW50ZXIsIE5vU3ltYm9sLAorICBYS19Db250cm9sX1IsIE5vU3ltYm9sLAorICBYS19QYXVzZSwgWEtfQnJlYWssCisgIFhLX1ByaW50LCBYS19FeGVjdXRlLAorICBYS19LUF9EaXZpZGUsIE5vU3ltYm9sLAorICBYS19BbHRfUiwgWEtfTWV0YV9SLAorfTsKKworc3RhdGljIEJvb2wgR2V0TWFwcGluZ3MoS2V5U3ltc1B0ciBwS2V5U3ltcywgQ0FSRDggKnBNb2RNYXApCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVBfTEVOR1RIOyBpKyspCisgICAgcE1vZE1hcFtpXSA9IE5vU3ltYm9sOworCisgIGZvciAoaSA9IDA7IGkgPCBWRkJfTUFQX0xFTjsgaSsrKSB7CisgICAgaWYgKGtleWJvYXJkTWFwW2kgKiBLRVlTWU1TX1BFUl9LRVldID09IFhLX0NhcHNfTG9jaykKKyAgICAgIHBNb2RNYXBbaSArIFZGQl9NSU5fS0VZXSA9IExvY2tNYXNrOworICAgIGVsc2UgaWYgKGtleWJvYXJkTWFwW2kgKiBLRVlTWU1TX1BFUl9LRVldID09IFhLX1NoaWZ0X0wgfHwKKyAgICAgICAgICAgICBrZXlib2FyZE1hcFtpICogS0VZU1lNU19QRVJfS0VZXSA9PSBYS19TaGlmdF9SKQorICAgICAgcE1vZE1hcFtpICsgVkZCX01JTl9LRVldID0gU2hpZnRNYXNrOworICAgIGVsc2UgaWYgKGtleWJvYXJkTWFwW2kgKiBLRVlTWU1TX1BFUl9LRVldID09IFhLX0NvbnRyb2xfTCB8fAorICAgICAgICAgICAgIGtleWJvYXJkTWFwW2kgKiBLRVlTWU1TX1BFUl9LRVldID09IFhLX0NvbnRyb2xfUikgeworICAgICAgcE1vZE1hcFtpICsgVkZCX01JTl9LRVldID0gQ29udHJvbE1hc2s7CisgICAgfQorICAgIGVsc2UgaWYgKGtleWJvYXJkTWFwW2kgKiBLRVlTWU1TX1BFUl9LRVldID09IFhLX0FsdF9MIHx8CisgICAgICAgICAgICAga2V5Ym9hcmRNYXBbaSAqIEtFWVNZTVNfUEVSX0tFWV0gPT0gWEtfQWx0X1IpCisgICAgICBwTW9kTWFwW2kgKyBWRkJfTUlOX0tFWV0gPSBNb2QxTWFzazsKKyAgfQorCisgIHBLZXlTeW1zLT5taW5LZXlDb2RlID0gVkZCX01JTl9LRVk7CisgIHBLZXlTeW1zLT5tYXhLZXlDb2RlID0gVkZCX01BWF9LRVk7CisgIHBLZXlTeW1zLT5tYXBXaWR0aCA9IEtFWVNZTVNfUEVSX0tFWTsKKyAgcEtleVN5bXMtPm1hcCA9IGtleWJvYXJkTWFwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCB2ZmJCZWxsKGludCBwZXJjZW50LCBEZXZpY2VJbnRQdHIgZGV2aWNlLCBwb2ludGVyIGN0cmwsIGludCBjbGFzc18pCit7CisgIGlmIChwZXJjZW50ID4gMCkKKyAgICB2bmNCZWxsKCk7Cit9CisKK3N0YXRpYyBpbnQgdmZiS2V5YmRQcm9jKERldmljZUludFB0ciBwRGV2aWNlLCBpbnQgb25vZmYpCit7CisgIEtleVN5bXNSZWMJCWtleVN5bXM7CisgIENBUkQ4IAkJbW9kTWFwW01BUF9MRU5HVEhdOworICBEZXZpY2VQdHIgcERldiA9IChEZXZpY2VQdHIpcERldmljZTsKKworICBzd2l0Y2ggKG9ub2ZmKQorICB7CisgIGNhc2UgREVWSUNFX0lOSVQ6IAorICAgIEdldE1hcHBpbmdzKCZrZXlTeW1zLCBtb2RNYXApOworICAgIEluaXRLZXlib2FyZERldmljZVN0cnVjdChwRGV2LCAma2V5U3ltcywgbW9kTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQmVsbFByb2NQdHIpdmZiQmVsbCwgKEtiZEN0cmxQcm9jUHRyKU5vb3BEREEpOworICAgIGJyZWFrOworICBjYXNlIERFVklDRV9PTjogCisgICAgcERldi0+b24gPSBUUlVFOworICAgIGJyZWFrOworICBjYXNlIERFVklDRV9PRkY6IAorICAgIHBEZXYtPm9uID0gRkFMU0U7CisgICAgYnJlYWs7CisgIGNhc2UgREVWSUNFX0NMT1NFOgorICAgIGJyZWFrOworICB9CisgIHJldHVybiBTdWNjZXNzOworfQorCitzdGF0aWMgaW50IHZmYk1vdXNlUHJvYyhEZXZpY2VJbnRQdHIgcERldmljZSwgaW50IG9ub2ZmKQoreworICBCWVRFIG1hcFs2XTsKKyAgRGV2aWNlUHRyIHBEZXYgPSAoRGV2aWNlUHRyKXBEZXZpY2U7CisKKyAgc3dpdGNoIChvbm9mZikKKyAgeworICBjYXNlIERFVklDRV9JTklUOgorICAgIG1hcFsxXSA9IDE7CisgICAgbWFwWzJdID0gMjsKKyAgICBtYXBbM10gPSAzOworICAgIG1hcFs0XSA9IDQ7CisgICAgbWFwWzVdID0gNTsKKyAgICBJbml0UG9pbnRlckRldmljZVN0cnVjdChwRGV2LCBtYXAsIDUsIG1pUG9pbnRlckdldE1vdGlvbkV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyQ3RybFByb2NQdHIpTm9vcEREQSwgbWlQb2ludGVyR2V0TW90aW9uQnVmZmVyU2l6ZSgpKTsKKyAgICBicmVhazsKKworICBjYXNlIERFVklDRV9PTjoKKyAgICBwRGV2LT5vbiA9IFRSVUU7CisgICAgYnJlYWs7CisKKyAgY2FzZSBERVZJQ0VfT0ZGOgorICAgIHBEZXYtPm9uID0gRkFMU0U7CisgICAgYnJlYWs7CisKKyAgY2FzZSBERVZJQ0VfQ0xPU0U6CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFN1Y2Nlc3M7Cit9CisKKy8vIEluaXRJbnB1dCBpcyBjYWxsZWQgYWZ0ZXIgSW5pdEV4dGVuc2lvbnMsIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdAorLy8gdm5jRXh0ZW5zaW9uSW5pdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLgorCit2b2lkIEluaXRJbnB1dChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEZXZpY2VJbnRQdHIgcCwgazsKKyAgcCA9IEFkZElucHV0RGV2aWNlKHZmYk1vdXNlUHJvYywgVFJVRSk7CisgIGsgPSBBZGRJbnB1dERldmljZSh2ZmJLZXliZFByb2MsIFRSVUUpOworICBSZWdpc3RlclBvaW50ZXJEZXZpY2UocCk7CisgIFJlZ2lzdGVyS2V5Ym9hcmREZXZpY2Uoayk7CisgIG1pUmVnaXN0ZXJQb2ludGVyRGV2aWNlKHNjcmVlbkluZm8uc2NyZWVuc1swXSwgcCk7CisgICh2b2lkKW1pZXFJbml0ICgoRGV2aWNlUHRyKWssIChEZXZpY2VQdHIpcCk7Cit9CmRpZmYgLS1naXQgYS91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL21vZHVsZS9JbWFrZWZpbGUgYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL21vZHVsZS9JbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3OTY0OQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvbW9kdWxlL0ltYWtlZmlsZQpAQCAtMCwwICsxLDYwIEBACisKKyAgICAgICBWTkNUT1AgPSAkKFRPUCkvLi4KKyAgICAgIFZOQ0xJQlMgPSBWbmNFeHRMaWJzCisgICBWTkNJTkNMVURFID0gLUkkKFZOQ1RPUCkgLUkkKFZOQ1RPUCkvdm5jY29uZmlnX3VuaXgKKworI2RlZmluZSBDcGx1c3BsdXNTb3VyY2UKKworI2RlZmluZSBJSGF2ZU1vZHVsZXMKKyNpbmNsdWRlIDxTZXJ2ZXIudG1wbD4KKworICAgIFNSQ1MgPSB2bmNFeHRJbml0LmNjIHZuY0hvb2tzLmNjIHhmODZ2bmNNb2R1bGUuY2MgWHNlcnZlckRlc2t0b3AuY2MKKyAgICBPQkpTID0gdm5jRXh0SW5pdC5vIHZuY0hvb2tzLm8geGY4NnZuY01vZHVsZS5vIFhzZXJ2ZXJEZXNrdG9wLm8KK0lOQ0xVREVTID0gLUkuLiAtSS4uLy4uL2luY2x1ZGUgLUkkKEVYVElOQ1NSQykgLUkkKFhJTkNMVURFU1JDKSBcCisgICAgICAgICAgIC1JJChGT05USU5DU1JDKSAtSSQoWEY4NkNPTVNSQykgXAorICAgICAgICAgICAtSS4uLy4uL3JlbmRlciAkKFZOQ0lOQ0xVREUpCisgREVGSU5FUyA9ICQoU1REX0RFRklORVMpIC1ER0NfSEFTX0NPTVBPU0lURV9DTElQIC1EWEZyZWU4NkxPQURFUgorCitMaW5rU291cmNlRmlsZSh2bmNFeHRJbml0LmNjLC4uKQorTGlua1NvdXJjZUZpbGUodm5jSG9va3MuY2MsLi4pCitMaW5rU291cmNlRmlsZSh4Zjg2dm5jTW9kdWxlLmNjLC4uKQorTGlua1NvdXJjZUZpbGUoWHNlcnZlckRlc2t0b3AuY2MsLi4pCisKK01vZHVsZU9iamVjdFJ1bGUoKQorLyoKKyBMaWJyYXJ5TW9kdWxlVGFyZ2V0KHZuYywkKE9CSlMpICQoVk5DTElCUykpCisgSW5zdGFsbExpYnJhcnlNb2R1bGUodm5jLCQoTU9EVUxFRElSKSxleHRlbnNpb25zKQorKi8KKworLyogKioqIFRoZSBpbWFrZSBydWxlcyBkb24ndCBkZWZpbmUgYSBNb2R1bGVDcGx1c3BsdXNPYmplY3RSdWxlIHNvCisgICAgICAgZm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSB0aGF0IE5vcm1hbENwbHVzcGx1c09iamVjdFJ1bGUgd2lsbAorICAgICAgIGRvIHRoZSBqb2IuCisgICBOQjogSWYgd2UgZG9uJ3QgZG8gdGhpcyB0aGVuIG1ha2Ugd2lsbCBhc3N1bWUgQ0MgaXMgdGhlIEMrKyBjb21waWxlciEKKyovCitOb3JtYWxDcGx1c3BsdXNPYmplY3RSdWxlKCkKKworLyoKKyAqIENwbHVzcGx1c0R5bmFtaWNNb2R1bGVUYXJnZXQgLSBidWlsZCBhIG1vZHVsZSB0byBiZSBkeW5hbWljYWxseSBsb2FkZWQKKyAqLworI2lmbmRlZiBDcGx1c3BsdXNEeW5hbWljTW9kdWxlVGFyZ2V0CisjZGVmaW5lIENwbHVzcGx1c0R5bmFtaWNNb2R1bGVUYXJnZXQobW9kdWxlLG1vZGxpc3QpCQkJQEBcCitBbGxUYXJnZXQobW9kdWxlKQkJCQkJCQlAQFwKKwkJCQkJCQkJCUBAXAorbW9kdWxlOiBtb2RsaXN0CQkJCQkJCQlAQFwKKwlSZW1vdmVGaWxlKCRAKQkJCQkJCQlAQFwKKwkkKENYWCkgLW8gJEAgJChTSExJQkxERkxBR1MpIG1vZGxpc3QJCQkJQEBcCisJCQkJCQkJCQlAQFwKK2NsZWFuOjoJCQkJCQkJCQlAQFwKKwlSZW1vdmVGaWxlKG1vZHVsZSkKKyNlbmRpZiAvKiBDcGx1c3BsdXNEeW5hbWljTW9kdWxlVGFyZ2V0ICovCisKKworCitDcGx1c3BsdXNEeW5hbWljTW9kdWxlVGFyZ2V0KHZuYy5zbywkKE9CSlMpICQoVk5DTElCUykpCitJbnN0YWxsRHluYW1pY01vZHVsZSh2bmMuc28sJChNT0RVTEVESVIpLGV4dGVuc2lvbnMpCisKK0RlcGVuZFRhcmdldCgpCisKKy8qCisgSW5zdGFsbERyaXZlclNES0xpYnJhcnlNb2R1bGUodm5jLCQoRFJJVkVSU0RLTU9EVUxFRElSKSxleHRlbnNpb25zKQorKi8KZGlmZiAtLWdpdCBhL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvdm5jRXh0SW5pdC5jYyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvdm5jRXh0SW5pdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Y5ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy92bmNFeHRJbml0LmNjCkBAIC0wLDAgKzEsODY2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitleHRlcm4gIkMiIHsKKyNkZWZpbmUgY2xhc3MgY19jbGFzcworI2RlZmluZSBORUVEX0VWRU5UUworI2luY2x1ZGUgIlguaCIKKyNpbmNsdWRlICJYcHJvdG8uaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJkaXhzdHJ1Y3QuaCIKKyNpbmNsdWRlICJleHRuc2lvbnN0LmgiCisjaW5jbHVkZSAic2NybmludHN0ci5oIgorI2luY2x1ZGUgInNlbGVjdGlvbi5oIgorI2RlZmluZSBfVk5DRVhUX1NFUlZFUl8KKyNkZWZpbmUgX1ZOQ0VYVF9QUk9UT18KKyNpbmNsdWRlICJ2bmNFeHQuaCIKKyN1bmRlZiBjbGFzcworI3VuZGVmIHhhbGxvYworfQorCisjaW5jbHVkZSA8cmZiL0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxyZmIvTG9nZ2VyX3N0ZGlvLmg+CisjaW5jbHVkZSA8cmZiL0xvZ1dyaXRlci5oPgorI2luY2x1ZGUgPHJmYi91dGlsLmg+CisjaW5jbHVkZSA8cmZiL1NlcnZlckNvcmUuaD4KKyNpbmNsdWRlIDxyZmIvU1NlY3VyaXR5RmFjdG9yeVN0YW5kYXJkLmg+CisjaW5jbHVkZSA8cmRyL0hleE91dFN0cmVhbS5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKyN1bmRlZiBtYXgKKyN1bmRlZiBtaW4KKyNpbmNsdWRlIDxuZXR3b3JrL1RjcFNvY2tldC5oPgorCisjaW5jbHVkZSAiWHNlcnZlckRlc2t0b3AuaCIKKyNpbmNsdWRlICJ2bmNIb29rcy5oIgorI2luY2x1ZGUgInZuY0V4dEluaXQuaCIKKworZXh0ZXJuICJDIiB7CisKKyAgZXh0ZXJuIHZvaWQgdm5jRXh0ZW5zaW9uSW5pdCgpOworICBzdGF0aWMgdm9pZCB2bmNSZXNldFByb2MoRXh0ZW5zaW9uRW50cnkqIGV4dEVudHJ5KTsKKyAgc3RhdGljIHZvaWQgdm5jQmxvY2tIYW5kbGVyKHBvaW50ZXIgZGF0YSwgT1NUaW1lUHRyIHQsIHBvaW50ZXIgcmVhZG1hc2spOworICBzdGF0aWMgdm9pZCB2bmNXYWtldXBIYW5kbGVyKHBvaW50ZXIgZGF0YSwgaW50IG5mZHMsIHBvaW50ZXIgcmVhZG1hc2spOworICBzdGF0aWMgdm9pZCB2bmNDbGllbnRTdGF0ZUNoYW5nZShDYWxsYmFja0xpc3RQdHIqLCBwb2ludGVyLCBwb2ludGVyKTsKKyAgc3RhdGljIHZvaWQgU2VuZFNlbGVjdGlvbkNoYW5nZUV2ZW50KEF0b20gc2VsZWN0aW9uKTsKKyAgc3RhdGljIGludCBQcm9jVm5jRXh0RGlzcGF0Y2goQ2xpZW50UHRyIGNsaWVudCk7CisgIHN0YXRpYyBpbnQgU1Byb2NWbmNFeHREaXNwYXRjaChDbGllbnRQdHIgY2xpZW50KTsKKworICBleHRlcm4gY2hhciAqZGlzcGxheTsKKworICBleHRlcm4gU2VsZWN0aW9uICpDdXJyZW50U2VsZWN0aW9uczsKKyAgZXh0ZXJuIGludCBOdW1DdXJyZW50U2VsZWN0aW9uczsKK30KKwordXNpbmcgbmFtZXNwYWNlIHJmYjsKKworc3RhdGljIHJmYjo6TG9nV3JpdGVyIHZsb2coInZuY2V4dCIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bmNFeHRHZW5lcmF0aW9uID0gMDsKK3N0YXRpYyBib29sIGluaXRpYWxpc2VkID0gZmFsc2U7CitzdGF0aWMgWHNlcnZlckRlc2t0b3AqIGRlc2t0b3BbTUFYU0NSRUVOU10gPSB7IDAsIH07Cit2b2lkKiB2bmNGYnB0cltNQVhTQ1JFRU5TXSA9IHsgMCwgfTsKKworc3RhdGljIGNoYXIqIGNsaWVudEN1dFRleHQgPSAwOworc3RhdGljIGludCBjbGllbnRDdXRUZXh0TGVuID0gMDsKKworc3RhdGljIFhzZXJ2ZXJEZXNrdG9wKiBxdWVyeUNvbm5lY3REZXNrdG9wID0gMDsKK3N0YXRpYyB2b2lkKiBxdWVyeUNvbm5lY3RJZCA9IDA7CitzdGF0aWMgaW50IHF1ZXJ5Q29ubmVjdFRpbWVvdXQgPSAwOworc3RhdGljIE9zVGltZXJQdHIgcXVlcnlDb25uZWN0VGltZXIgPSAwOworCitzdGF0aWMgc3RydWN0IFZuY0lucHV0U2VsZWN0KiB2bmNJbnB1dFNlbGVjdEhlYWQgPSAwOworc3RydWN0IFZuY0lucHV0U2VsZWN0IHsKKyAgVm5jSW5wdXRTZWxlY3QoQ2xpZW50UHRyIGMsIFdpbmRvdyB3LCBpbnQgbSkgOiBjbGllbnQoYyksIHdpbmRvdyh3KSwgbWFzayhtKQorICB7CisgICAgbmV4dCA9IHZuY0lucHV0U2VsZWN0SGVhZDsKKyAgICB2bmNJbnB1dFNlbGVjdEhlYWQgPSB0aGlzOworICB9CisgIENsaWVudFB0ciBjbGllbnQ7CisgIFdpbmRvdyB3aW5kb3c7CisgIGludCBtYXNrOworICBWbmNJbnB1dFNlbGVjdCogbmV4dDsKK307CisKK3N0YXRpYyBpbnQgblByZXZTZWxlY3Rpb25zID0gMDsKK3N0YXRpYyBUaW1lU3RhbXAqIHByZXZTZWxlY3Rpb25UaW1lcyA9IDA7CisKK3N0YXRpYyBpbnQgdm5jRXJyb3JCYXNlID0gMDsKK3N0YXRpYyBpbnQgdm5jRXZlbnRCYXNlID0gMDsKK3N0YXRpYyBjaGFyKiB2bmNQYXNzd2RGaWxlID0gMDsKK2ludCB2bmNJbmV0ZFNvY2sgPSAtMTsKKworcmZiOjpBbGlhc1BhcmFtZXRlciByZmJhdXRoKCJyZmJhdXRoIiwgIkFsaWFzIGZvciBQYXNzd29yZEZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTU2VjdXJpdHlGYWN0b3J5U3RhbmRhcmQ6OnZuY0F1dGhQYXNzd2RGaWxlKTsKK3JmYjo6U3RyaW5nUGFyYW1ldGVyIGh0dHBEaXIoImh0dHBkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpcmVjdG9yeSBjb250YWluaW5nIGZpbGVzIHRvIHNlcnZlIHZpYSBIVFRQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOworcmZiOjpJbnRQYXJhbWV0ZXIgaHR0cFBvcnQoImh0dHBQb3J0IiwgIlRDUCBwb3J0IHRvIGxpc3RlbiBmb3IgSFRUUCIsMCk7CityZmI6OkFsaWFzUGFyYW1ldGVyIHJmYndhaXQoInJmYndhaXQiLCAiQWxpYXMgZm9yIENsaWVudFdhaXRUaW1lTWlsbGlzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmZiOjpTZXJ2ZXI6OmNsaWVudFdhaXRUaW1lTWlsbGlzKTsKK3JmYjo6SW50UGFyYW1ldGVyIHJmYnBvcnQoInJmYnBvcnQiLCAiVENQIHBvcnQgdG8gbGlzdGVuIGZvciBSRkIgcHJvdG9jb2wiLDApOworcmZiOjpTdHJpbmdQYXJhbWV0ZXIgZGVza3RvcE5hbWUoImRlc2t0b3AiLCAiTmFtZSBvZiBWTkMgZGVza3RvcCIsIngxMSIpOworcmZiOjpCb29sUGFyYW1ldGVyIGxvY2FsaG9zdE9ubHkoImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25seSBhbGxvdyBjb25uZWN0aW9ucyBmcm9tIGxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKK3ZvaWQgdm5jRXh0ZW5zaW9uSW5pdCgpCit7CisgIGlmICh2bmNFeHRHZW5lcmF0aW9uID09IHNlcnZlckdlbmVyYXRpb24pIHsKKyAgICB2bG9nLmVycm9yKCJ2bmNFeHRlbnNpb25Jbml0OiBjYWxsZWQgdHdpY2UgaW4gc2FtZSBnZW5lcmF0aW9uPyIpOworICAgIHJldHVybjsKKyAgfQorICB2bmNFeHRHZW5lcmF0aW9uID0gc2VydmVyR2VuZXJhdGlvbjsKKworICBFeHRlbnNpb25FbnRyeSogZXh0RW50cnkKKyAgICA9IEFkZEV4dGVuc2lvbihWTkNFWFROQU1FLCBWbmNFeHROdW1iZXJFdmVudHMsIFZuY0V4dE51bWJlckVycm9ycywKKyAgICAgICAgICAgICAgICAgICBQcm9jVm5jRXh0RGlzcGF0Y2gsIFNQcm9jVm5jRXh0RGlzcGF0Y2gsIHZuY1Jlc2V0UHJvYywKKyAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE1pbm9yT3Bjb2RlKTsKKyAgaWYgKCFleHRFbnRyeSkgeworICAgIEVycm9yRigidm5jRXh0SW5pdDogQWRkRXh0ZW5zaW9uIGZhaWxlZFxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgdm5jRXJyb3JCYXNlID0gZXh0RW50cnktPmVycm9yQmFzZTsKKyAgdm5jRXZlbnRCYXNlID0gZXh0RW50cnktPmV2ZW50QmFzZTsKKworICB2bG9nLmluZm8oIlZOQyBleHRlbnNpb24gcnVubmluZyEiKTsKKworICBpZiAoIUFkZENhbGxiYWNrKCZDbGllbnRTdGF0ZUNhbGxiYWNrLCB2bmNDbGllbnRTdGF0ZUNoYW5nZSwgMCkpIHsKKyAgICBGYXRhbEVycm9yKCJBZGRDYWxsYmFjayBmYWlsZWRcbiIpOworICB9CisKKyAgdHJ5IHsKKyAgICBpZiAoIWluaXRpYWxpc2VkKSB7CisgICAgICByZmI6OmluaXRTdGRJT0xvZ2dlcnMoKTsKKyAgICAgIGluaXRpYWxpc2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKGludCBzY3IgPSAwOyBzY3IgPCBzY3JlZW5JbmZvLm51bVNjcmVlbnM7IHNjcisrKSB7CisKKyAgICAgIGlmICghZGVza3RvcFtzY3JdKSB7CisgICAgICAgIG5ldHdvcms6OlRjcExpc3RlbmVyKiBsaXN0ZW5lciA9IDA7CisgICAgICAgIG5ldHdvcms6OlRjcExpc3RlbmVyKiBodHRwTGlzdGVuZXIgPSAwOworICAgICAgICBpZiAoc2NyID09IDAgJiYgdm5jSW5ldGRTb2NrICE9IC0xKSB7CisgICAgICAgICAgaWYgKG5ldHdvcms6OlRjcFNvY2tldDo6aXNTb2NrZXQodm5jSW5ldGRTb2NrKSAmJgorICAgICAgICAgICAgICAhbmV0d29yazo6VGNwU29ja2V0Ojppc0Nvbm5lY3RlZCh2bmNJbmV0ZFNvY2spKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IG5ldHdvcms6OlRjcExpc3RlbmVyKDAsIDAsIHZuY0luZXRkU29jaywgdHJ1ZSk7CisgICAgICAgICAgICB2bG9nLmluZm8oImluZXRkIHdhaXQiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IHBvcnQgPSByZmJwb3J0OworICAgICAgICAgIGlmIChwb3J0ID09IDApIHBvcnQgPSA1OTAwICsgYXRvaShkaXNwbGF5KTsKKyAgICAgICAgICBwb3J0ICs9IDEwMDAgKiBzY3I7CisgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgbmV0d29yazo6VGNwTGlzdGVuZXIocG9ydCwgbG9jYWxob3N0T25seSk7CisgICAgICAgICAgdmxvZy5pbmZvKCJMaXN0ZW5pbmcgZm9yIFZOQyBjb25uZWN0aW9ucyBvbiBwb3J0ICVkIixwb3J0KTsKKyAgICAgICAgICBDaGFyQXJyYXkgaHR0cERpclN0cihodHRwRGlyLmdldERhdGEoKSk7CisgICAgICAgICAgaWYgKGh0dHBEaXJTdHIuYnVmWzBdKSB7CisgICAgICAgICAgICBwb3J0ID0gaHR0cFBvcnQ7CisgICAgICAgICAgICBpZiAocG9ydCA9PSAwKSBwb3J0ID0gNTgwMCArIGF0b2koZGlzcGxheSk7CisgICAgICAgICAgICBwb3J0ICs9IDEwMDAgKiBzY3I7CisgICAgICAgICAgICBodHRwTGlzdGVuZXIgPSBuZXcgbmV0d29yazo6VGNwTGlzdGVuZXIocG9ydCwgbG9jYWxob3N0T25seSk7CisgICAgICAgICAgICB2bG9nLmluZm8oIkxpc3RlbmluZyBmb3IgSFRUUCBjb25uZWN0aW9ucyBvbiBwb3J0ICVkIixwb3J0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDaGFyQXJyYXkgZGVza3RvcE5hbWVTdHIoZGVza3RvcE5hbWUuZ2V0RGF0YSgpKTsKKyAgICAgICAgZGVza3RvcFtzY3JdID0gbmV3IFhzZXJ2ZXJEZXNrdG9wKHNjcmVlbkluZm8uc2NyZWVuc1tzY3JdLCBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2t0b3BOYW1lU3RyLmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuY0ZicHRyW3Njcl0pOworICAgICAgICB2bG9nLmluZm8oImNyZWF0ZWQgVk5DIHNlcnZlciBmb3Igc2NyZWVuICVkIiwgc2NyKTsKKworICAgICAgICBpZiAoc2NyID09IDAgJiYgdm5jSW5ldGRTb2NrICE9IC0xICYmICFsaXN0ZW5lcikgeworICAgICAgICAgIG5ldHdvcms6OlNvY2tldCogc29jayA9IG5ldyBuZXR3b3JrOjpUY3BTb2NrZXQodm5jSW5ldGRTb2NrKTsKKyAgICAgICAgICBkZXNrdG9wW3Njcl0tPmFkZENsaWVudChzb2NrLCBmYWxzZSk7CisgICAgICAgICAgdmxvZy5pbmZvKCJhZGRlZCBpbmV0ZCBzb2NrIik7CisgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVza3RvcFtzY3JdLT5zZXJ2ZXJSZXNldChzY3JlZW5JbmZvLnNjcmVlbnNbc2NyXSk7CisgICAgICB9CisKKyAgICAgIHZuY0hvb2tzSW5pdChzY3JlZW5JbmZvLnNjcmVlbnNbc2NyXSwgZGVza3RvcFtzY3JdKTsKKyAgICB9CisKKyAgICBSZWdpc3RlckJsb2NrQW5kV2FrZXVwSGFuZGxlcnModm5jQmxvY2tIYW5kbGVyLCB2bmNXYWtldXBIYW5kbGVyLCAwKTsKKworICB9IGNhdGNoIChyZHI6OkV4Y2VwdGlvbiYgZSkgeworICAgIHZsb2cuZXJyb3IoInZuY0V4dEluaXQ6ICVzIixlLnN0cigpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB2bmNSZXNldFByb2MoRXh0ZW5zaW9uRW50cnkqIGV4dEVudHJ5KQoreworfQorCisvLworLy8gdm5jQmxvY2tIYW5kbGVyIC0gY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBYIHNlcnZlciBnb2VzIGludG8gc2VsZWN0KCkuICBDYWxsCisvLyBvbiB0byB0aGUgYmxvY2sgaGFuZGxlciBmb3IgZWFjaCBkZXNrdG9wLiAgVGhlbiBjaGVjayB3aGV0aGVyIGFueSBvZiB0aGUKKy8vIHNlbGVjdGlvbnMgaGF2ZSBjaGFuZ2VkLCBhbmQgaWYgc28sIG5vdGlmeSBhbnkgaW50ZXJlc3RlZCBYIGNsaWVudHMuCisvLworCitzdGF0aWMgdm9pZCB2bmNCbG9ja0hhbmRsZXIocG9pbnRlciBkYXRhLCBPU1RpbWVQdHIgdGltZW91dCwgcG9pbnRlciByZWFkbWFzaykKK3sKKyAgZmRfc2V0KiBmZHMgPSAoZmRfc2V0KilyZWFkbWFzazsKKworICBmb3IgKGludCBzY3IgPSAwOyBzY3IgPCBzY3JlZW5JbmZvLm51bVNjcmVlbnM7IHNjcisrKSB7CisgICAgaWYgKGRlc2t0b3Bbc2NyXSkgeworICAgICAgZGVza3RvcFtzY3JdLT5ibG9ja0hhbmRsZXIoZmRzKTsKKyAgICB9CisgIH0KKworICBpZiAoblByZXZTZWxlY3Rpb25zICE9IE51bUN1cnJlbnRTZWxlY3Rpb25zKSB7CisgICAgcHJldlNlbGVjdGlvblRpbWVzCisgICAgICA9IChUaW1lU3RhbXAqKXhuZnJlYWxsb2MocHJldlNlbGVjdGlvblRpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUN1cnJlbnRTZWxlY3Rpb25zICogc2l6ZW9mKFRpbWVTdGFtcCkpOworICAgIGZvciAoaW50IGkgPSBuUHJldlNlbGVjdGlvbnM7IGkgPCBOdW1DdXJyZW50U2VsZWN0aW9uczsgaSsrKSB7CisgICAgICBwcmV2U2VsZWN0aW9uVGltZXNbaV0ubW9udGhzID0gMDsKKyAgICAgIHByZXZTZWxlY3Rpb25UaW1lc1tpXS5taWxsaXNlY29uZHMgPSAwOworICAgIH0KKyAgICBuUHJldlNlbGVjdGlvbnMgPSBOdW1DdXJyZW50U2VsZWN0aW9uczsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IE51bUN1cnJlbnRTZWxlY3Rpb25zOyBpKyspIHsKKyAgICBpZiAoQ3VycmVudFNlbGVjdGlvbnNbaV0ubGFzdFRpbWVDaGFuZ2VkLm1vbnRocworICAgICAgICAhPSBwcmV2U2VsZWN0aW9uVGltZXNbaV0ubW9udGhzIHx8CisgICAgICAgIEN1cnJlbnRTZWxlY3Rpb25zW2ldLmxhc3RUaW1lQ2hhbmdlZC5taWxsaXNlY29uZHMKKyAgICAgICAgIT0gcHJldlNlbGVjdGlvblRpbWVzW2ldLm1pbGxpc2Vjb25kcykKKyAgICB7CisgICAgICBTZW5kU2VsZWN0aW9uQ2hhbmdlRXZlbnQoQ3VycmVudFNlbGVjdGlvbnNbaV0uc2VsZWN0aW9uKTsKKyAgICAgIHByZXZTZWxlY3Rpb25UaW1lc1tpXSA9IEN1cnJlbnRTZWxlY3Rpb25zW2ldLmxhc3RUaW1lQ2hhbmdlZDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgdm5jV2FrZXVwSGFuZGxlcihwb2ludGVyIGRhdGEsIGludCBuZmRzLCBwb2ludGVyIHJlYWRtYXNrKQoreworICBmZF9zZXQqIGZkcyA9IChmZF9zZXQqKXJlYWRtYXNrOworCisgIGZvciAoaW50IHNjciA9IDA7IHNjciA8IHNjcmVlbkluZm8ubnVtU2NyZWVuczsgc2NyKyspIHsKKyAgICBpZiAoZGVza3RvcFtzY3JdKSB7CisgICAgICBkZXNrdG9wW3Njcl0tPndha2V1cEhhbmRsZXIoZmRzLCBuZmRzKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgdm5jQ2xpZW50U3RhdGVDaGFuZ2UoQ2FsbGJhY2tMaXN0UHRyKiwgcG9pbnRlciwgcG9pbnRlciBwKQoreworICBDbGllbnRQdHIgY2xpZW50ID0gKChOZXdDbGllbnRJbmZvUmVjKilwKS0+Y2xpZW50OworICBpZiAoY2xpZW50LT5jbGllbnRTdGF0ZSA9PSBDbGllbnRTdGF0ZUdvbmUpIHsKKyAgICBWbmNJbnB1dFNlbGVjdCoqIG5leHRQdHIgPSAmdm5jSW5wdXRTZWxlY3RIZWFkOworICAgIGZvciAoVm5jSW5wdXRTZWxlY3QqIGN1ciA9IHZuY0lucHV0U2VsZWN0SGVhZDsgY3VyOyBjdXIgPSAqbmV4dFB0cikgeworICAgICAgaWYgKGN1ci0+Y2xpZW50ID09IGNsaWVudCkgeworICAgICAgICAqbmV4dFB0ciA9IGN1ci0+bmV4dDsKKyAgICAgICAgZGVsZXRlIGN1cjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBuZXh0UHRyID0gJmN1ci0+bmV4dDsKKyAgICB9CisgIH0KK30KKwordm9pZCB2bmNCZWxsKCkKK3sKKyAgZm9yIChpbnQgc2NyID0gMDsgc2NyIDwgc2NyZWVuSW5mby5udW1TY3JlZW5zOyBzY3IrKykgeworICAgIGlmIChkZXNrdG9wW3Njcl0pIHsKKyAgICAgIGRlc2t0b3Bbc2NyXS0+YmVsbCgpOworICAgIH0KKyAgfQorfQorCit2b2lkIHZuY0NsaWVudEdvbmUoaW50IGZkKQoreworICBpZiAoZmQgPT0gdm5jSW5ldGRTb2NrKSB7CisgICAgZnByaW50ZihzdGRlcnIsImluZXRkU29jayBjbGllbnQgZ29uZVxuIik7CisgICAgR2l2ZVVwKDApOworICB9Cit9CisKK3ZvaWQgdm5jQ2xpZW50Q3V0VGV4dChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisgIGRlbGV0ZSBbXSBjbGllbnRDdXRUZXh0OworICBjbGllbnRDdXRUZXh0ID0gbmV3IGNoYXJbbGVuXTsKKyAgbWVtY3B5KGNsaWVudEN1dFRleHQsIHN0ciwgbGVuKTsKKyAgY2xpZW50Q3V0VGV4dExlbiA9IGxlbjsKKyAgeFZuY0V4dENsaWVudEN1dFRleHROb3RpZnlFdmVudCBldjsKKyAgZXYudHlwZSA9IHZuY0V2ZW50QmFzZSArIFZuY0V4dENsaWVudEN1dFRleHROb3RpZnk7CisgIGZvciAoVm5jSW5wdXRTZWxlY3QqIGN1ciA9IHZuY0lucHV0U2VsZWN0SGVhZDsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICBpZiAoY3VyLT5tYXNrICYgVm5jRXh0Q2xpZW50Q3V0VGV4dE1hc2spIHsKKyAgICAgIGV2LnNlcXVlbmNlTnVtYmVyID0gY3VyLT5jbGllbnQtPnNlcXVlbmNlOworICAgICAgZXYud2luZG93ID0gY3VyLT53aW5kb3c7CisgICAgICBldi50aW1lID0gR2V0VGltZUluTWlsbGlzKCk7CisgICAgICBpZiAoY3VyLT5jbGllbnQtPnN3YXBwZWQpIHsKKyAgICAgICAgaW50IG47CisgICAgICAgIHN3YXBzKCZldi5zZXF1ZW5jZU51bWJlciwgbik7CisgICAgICAgIHN3YXBsKCZldi53aW5kb3csIG4pOworICAgICAgICBzd2FwbCgmZXYudGltZSwgbik7CisgICAgICB9CisgICAgICBXcml0ZVRvQ2xpZW50KGN1ci0+Y2xpZW50LCBzaXplb2YoeFZuY0V4dENsaWVudEN1dFRleHROb3RpZnlFdmVudCksCisgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmV2KTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgQ0FSRDMyIHF1ZXJ5Q29ubmVjdFRpbWVyQ2FsbGJhY2soT3NUaW1lclB0ciB0aW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVJEMzIgbm93LCBwb2ludGVyIGFyZykKK3sKKyAgaWYgKHF1ZXJ5Q29ubmVjdFRpbWVvdXQpCisgICAgcXVlcnlDb25uZWN0RGVza3RvcC0+YXBwcm92ZUNvbm5lY3Rpb24ocXVlcnlDb25uZWN0SWQsIGZhbHNlLCAiVGhlIGF0dGVtcHQgdG8gcHJvbXB0IHRoZSB1c2VyIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbiBmYWlsZWQiKTsKKyAgLy8gUmUtbm90aWZ5IGNsaWVudHMsIGNhdXNpbmcgdGhlbSB0byBkaXNjb3ZlciB0aGF0IHdlJ3JlIGRvbmUKKyAgdm5jUXVlcnlDb25uZWN0KHF1ZXJ5Q29ubmVjdERlc2t0b3AsIHF1ZXJ5Q29ubmVjdElkKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgdm5jUXVlcnlDb25uZWN0KFhzZXJ2ZXJEZXNrdG9wKiBkZXNrdG9wLCB2b2lkKiBvcGFxdWVJZCkKK3sKKyAgLy8gT25seSBvbmUgcXVlcnkgY2FuIGJlIHByb2Nlc3NlZCBhdCBhbnkgb25lIHRpbWUKKyAgaWYgKHF1ZXJ5Q29ubmVjdFRpbWVvdXQgJiYgKChkZXNrdG9wICE9IHF1ZXJ5Q29ubmVjdERlc2t0b3ApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BhcXVlSWQgIT0gcXVlcnlDb25uZWN0SWQpKSkgeworICAgIGRlc2t0b3AtPmFwcHJvdmVDb25uZWN0aW9uKG9wYXF1ZUlkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5vdGhlciBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBxdWVyaWVkLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEdldCB0aGUgcXVlcnkgdGltZW91dC4gIElmIGl0J3MgemVybywgdGhlcmUgaXMgbm8gcXVlcnkuCisgIHF1ZXJ5Q29ubmVjdFRpbWVvdXQgPSBkZXNrdG9wLT5nZXRRdWVyeVRpbWVvdXQob3BhcXVlSWQpOworICBxdWVyeUNvbm5lY3RJZCA9IHF1ZXJ5Q29ubmVjdFRpbWVvdXQgPyBvcGFxdWVJZCA6IDA7CisgIHF1ZXJ5Q29ubmVjdERlc2t0b3AgPSBxdWVyeUNvbm5lY3RUaW1lb3V0ID8gZGVza3RvcCA6IDA7CisKKyAgLy8gTm90aWZ5IGNsaWVudHMKKyAgYm9vbCBub3RpZmllZCA9IGZhbHNlOworICB4Vm5jRXh0UXVlcnlDb25uZWN0Tm90aWZ5RXZlbnQgZXY7CisgIGV2LnR5cGUgPSB2bmNFdmVudEJhc2UgKyBWbmNFeHRRdWVyeUNvbm5lY3ROb3RpZnk7CisgIGZvciAoVm5jSW5wdXRTZWxlY3QqIGN1ciA9IHZuY0lucHV0U2VsZWN0SGVhZDsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICBpZiAoY3VyLT5tYXNrICYgVm5jRXh0UXVlcnlDb25uZWN0TWFzaykgeworICAgICAgZXYuc2VxdWVuY2VOdW1iZXIgPSBjdXItPmNsaWVudC0+c2VxdWVuY2U7CisgICAgICBldi53aW5kb3cgPSBjdXItPndpbmRvdzsKKyAgICAgIGlmIChjdXItPmNsaWVudC0+c3dhcHBlZCkgeworICAgICAgICBpbnQgbjsKKyAgICAgICAgc3dhcHMoJmV2LnNlcXVlbmNlTnVtYmVyLCBuKTsKKyAgICAgICAgc3dhcGwoJmV2LndpbmRvdywgbik7CisgICAgICB9CisgICAgICBXcml0ZVRvQ2xpZW50KGN1ci0+Y2xpZW50LCBzaXplb2YoeFZuY0V4dFF1ZXJ5Q29ubmVjdE5vdGlmeUV2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmZXYpOworICAgICAgbm90aWZpZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIElmIHdlJ3JlIGJlaW5nIGFza2VkIHRvIHF1ZXJ5IGEgY29ubmVjdGlvbiAocmF0aGVyIHRoYW4gdG8gY2FuY2VsCisgIC8vICAgYSBxdWVyeSksIGFuZCBoYXZlbid0IGJlZW4gYWJsZSB0byBub3RpZnkgY2xpZW50cyB0aGVuIHJlamVjdCBpdC4KKyAgaWYgKHF1ZXJ5Q29ubmVjdFRpbWVvdXQgJiYgIW5vdGlmaWVkKSB7CisgICAgcXVlcnlDb25uZWN0VGltZW91dCA9IDA7CisgICAgcXVlcnlDb25uZWN0SWQgPSAwOworICAgIHF1ZXJ5Q29ubmVjdERlc2t0b3AgPSAwOworICAgIGRlc2t0b3AtPmFwcHJvdmVDb25uZWN0aW9uKG9wYXF1ZUlkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHF1ZXJ5IHRoZSBsb2NhbCB1c2VyIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbi4iKTsKKyAgICByZXR1cm47CisgIH0gICAgCisKKyAgLy8gU2V0IGEgdGltZXIgc28gdGhhdCBpZiBuby1vbmUgZXZlciByZXNwb25kcywgd2Ugd2lsbCBldmVudHVhbGx5IAorICAvLyAgIHJlamVjdCB0aGUgY29ubmVjdGlvbgorICAvLyAgIE5COiBXZSBkb24ndCBzZXQgYSB0aW1lciBpZiBzb2NrIGlzIG51bGwsIHNpbmNlIHRoYXQgaW5kaWNhdGVzCisgIC8vICAgICAgIHRoYXQgcGVuZGluZyBxdWVyaWVzIHNob3VsZCBiZSBjYW5jZWxsZWQuCisgIGlmIChxdWVyeUNvbm5lY3REZXNrdG9wKQorICAgIHF1ZXJ5Q29ubmVjdFRpbWVyID0gVGltZXJTZXQocXVlcnlDb25uZWN0VGltZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvbm5lY3RUaW1lb3V0KjIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvbm5lY3RUaW1lckNhbGxiYWNrLCAwKTsKKyAgZWxzZQorICAgIFRpbWVyQ2FuY2VsKHF1ZXJ5Q29ubmVjdFRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgU2VuZFNlbGVjdGlvbkNoYW5nZUV2ZW50KEF0b20gc2VsZWN0aW9uKQoreworICB4Vm5jRXh0U2VsZWN0aW9uQ2hhbmdlTm90aWZ5RXZlbnQgZXY7CisgIGV2LnR5cGUgPSB2bmNFdmVudEJhc2UgKyBWbmNFeHRTZWxlY3Rpb25DaGFuZ2VOb3RpZnk7CisgIGZvciAoVm5jSW5wdXRTZWxlY3QqIGN1ciA9IHZuY0lucHV0U2VsZWN0SGVhZDsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICBpZiAoY3VyLT5tYXNrICYgVm5jRXh0U2VsZWN0aW9uQ2hhbmdlTWFzaykgeworICAgICAgZXYuc2VxdWVuY2VOdW1iZXIgPSBjdXItPmNsaWVudC0+c2VxdWVuY2U7CisgICAgICBldi53aW5kb3cgPSBjdXItPndpbmRvdzsKKyAgICAgIGV2LnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgIGlmIChjdXItPmNsaWVudC0+c3dhcHBlZCkgeworICAgICAgICBpbnQgbjsKKyAgICAgICAgc3dhcHMoJmV2LnNlcXVlbmNlTnVtYmVyLCBuKTsKKyAgICAgICAgc3dhcGwoJmV2LndpbmRvdywgbik7CisgICAgICAgIHN3YXBsKCZldi5zZWxlY3Rpb24sIG4pOworICAgICAgfQorICAgICAgV3JpdGVUb0NsaWVudChjdXItPmNsaWVudCwgc2l6ZW9mKHhWbmNFeHRTZWxlY3Rpb25DaGFuZ2VOb3RpZnlFdmVudCksCisgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmV2KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBQcm9jVm5jRXh0U2V0UGFyYW0oQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgUkVRVUVTVCh4Vm5jRXh0U2V0UGFyYW1SZXEpOworICBSRVFVRVNUX0ZJWEVEX1NJWkUoeFZuY0V4dFNldFBhcmFtUmVxLCBzdHVmZi0+cGFyYW1MZW4pOworICBDaGFyQXJyYXkgcGFyYW0oc3R1ZmYtPnBhcmFtTGVuKzEpOworICBzdHJuY3B5KHBhcmFtLmJ1ZiwgKGNoYXIqKSZzdHVmZlsxXSwgc3R1ZmYtPnBhcmFtTGVuKTsKKyAgcGFyYW0uYnVmW3N0dWZmLT5wYXJhbUxlbl0gPSAwOworCisgIHhWbmNFeHRTZXRQYXJhbVJlcGx5IHJlcDsKKyAgaW50IG47CisgIHJlcC50eXBlID0gWF9SZXBseTsKKyAgcmVwLmxlbmd0aCA9IDA7CisgIHJlcC5zZXF1ZW5jZU51bWJlciA9IGNsaWVudC0+c2VxdWVuY2U7CisgIHJlcC5zdWNjZXNzID0gcmZiOjpDb25maWd1cmF0aW9uOjpzZXRQYXJhbShwYXJhbS5idWYpOworICBpZiAoY2xpZW50LT5zd2FwcGVkKSB7CisgICAgc3dhcHMoJnJlcC5zZXF1ZW5jZU51bWJlciwgbik7CisgICAgc3dhcGwoJnJlcC5sZW5ndGgsIG4pOworICB9CisgIFdyaXRlVG9DbGllbnQoY2xpZW50LCBzaXplb2YoeFZuY0V4dFNldFBhcmFtUmVwbHkpLCAoY2hhciAqKSZyZXApOworICByZXR1cm4gKGNsaWVudC0+bm9DbGllbnRFeGNlcHRpb24pOworfQorCitzdGF0aWMgaW50IFNQcm9jVm5jRXh0U2V0UGFyYW0oQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgcmVnaXN0ZXIgY2hhciBuOworICBSRVFVRVNUKHhWbmNFeHRTZXRQYXJhbVJlcSk7CisgIHN3YXBzKCZzdHVmZi0+bGVuZ3RoLCBuKTsKKyAgUkVRVUVTVF9BVF9MRUFTVF9TSVpFKHhWbmNFeHRTZXRQYXJhbVJlcSk7CisgIHJldHVybiBQcm9jVm5jRXh0U2V0UGFyYW0oY2xpZW50KTsKK30KKworc3RhdGljIGludCBQcm9jVm5jRXh0R2V0UGFyYW0oQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgUkVRVUVTVCh4Vm5jRXh0R2V0UGFyYW1SZXEpOworICBSRVFVRVNUX0ZJWEVEX1NJWkUoeFZuY0V4dEdldFBhcmFtUmVxLCBzdHVmZi0+cGFyYW1MZW4pOworICBDaGFyQXJyYXkgcGFyYW0oc3R1ZmYtPnBhcmFtTGVuKzEpOworICBzdHJuY3B5KHBhcmFtLmJ1ZiwgKGNoYXIqKSZzdHVmZlsxXSwgc3R1ZmYtPnBhcmFtTGVuKTsKKyAgcGFyYW0uYnVmW3N0dWZmLT5wYXJhbUxlbl0gPSAwOworCisgIHhWbmNFeHRHZXRQYXJhbVJlcGx5IHJlcDsKKyAgaW50IG47CisgIHJlcC50eXBlID0gWF9SZXBseTsKKyAgcmVwLnNlcXVlbmNlTnVtYmVyID0gY2xpZW50LT5zZXF1ZW5jZTsKKyAgcmVwLnN1Y2Nlc3MgPSAwOworICBpbnQgbGVuID0gMDsKKyAgY2hhciogdmFsdWUgPSAwOworICByZmI6OlZvaWRQYXJhbWV0ZXIqIHAgPSByZmI6OkNvbmZpZ3VyYXRpb246OmdldFBhcmFtKHBhcmFtLmJ1Zik7CisgIC8vIEhhY2sgdG8gYXZvaWQgZXhwb3NpbmcgcGFzc3dvcmQhCisgIGlmIChzdHJjYXNlY21wKHBhcmFtLmJ1ZiwgIlBhc3N3b3JkIikgPT0gMCkKKyAgICBwID0gMDsKKyAgaWYgKHApIHsKKyAgICB2YWx1ZSA9IHAtPmdldFZhbHVlU3RyKCk7CisgICAgcmVwLnN1Y2Nlc3MgPSAxOworICAgIGxlbiA9IHZhbHVlID8gc3RybGVuKHZhbHVlKSA6IDA7CisgIH0KKyAgcmVwLmxlbmd0aCA9IChsZW4gKyAzKSA+PiAyOworICByZXAudmFsdWVMZW4gPSBsZW47CisgIGlmIChjbGllbnQtPnN3YXBwZWQpIHsKKyAgICBzd2FwcygmcmVwLnNlcXVlbmNlTnVtYmVyLCBuKTsKKyAgICBzd2FwbCgmcmVwLmxlbmd0aCwgbik7CisgICAgc3dhcHMoJnJlcC52YWx1ZUxlbiwgbik7CisgIH0KKyAgV3JpdGVUb0NsaWVudChjbGllbnQsIHNpemVvZih4Vm5jRXh0R2V0UGFyYW1SZXBseSksIChjaGFyICopJnJlcCk7CisgIGlmICh2YWx1ZSkKKyAgICBXcml0ZVRvQ2xpZW50KGNsaWVudCwgbGVuLCB2YWx1ZSk7CisgIGRlbGV0ZSBbXSB2YWx1ZTsKKyAgcmV0dXJuIChjbGllbnQtPm5vQ2xpZW50RXhjZXB0aW9uKTsKK30KKworc3RhdGljIGludCBTUHJvY1ZuY0V4dEdldFBhcmFtKENsaWVudFB0ciBjbGllbnQpCit7CisgIHJlZ2lzdGVyIGNoYXIgbjsKKyAgUkVRVUVTVCh4Vm5jRXh0R2V0UGFyYW1SZXEpOworICBzd2Fwcygmc3R1ZmYtPmxlbmd0aCwgbik7CisgIFJFUVVFU1RfQVRfTEVBU1RfU0laRSh4Vm5jRXh0R2V0UGFyYW1SZXEpOworICByZXR1cm4gUHJvY1ZuY0V4dEdldFBhcmFtKGNsaWVudCk7Cit9CisKK3N0YXRpYyBpbnQgUHJvY1ZuY0V4dEdldFBhcmFtRGVzYyhDbGllbnRQdHIgY2xpZW50KQoreworICBSRVFVRVNUKHhWbmNFeHRHZXRQYXJhbURlc2NSZXEpOworICBSRVFVRVNUX0ZJWEVEX1NJWkUoeFZuY0V4dEdldFBhcmFtRGVzY1JlcSwgc3R1ZmYtPnBhcmFtTGVuKTsKKyAgQ2hhckFycmF5IHBhcmFtKHN0dWZmLT5wYXJhbUxlbisxKTsKKyAgc3RybmNweShwYXJhbS5idWYsIChjaGFyKikmc3R1ZmZbMV0sIHN0dWZmLT5wYXJhbUxlbik7CisgIHBhcmFtLmJ1ZltzdHVmZi0+cGFyYW1MZW5dID0gMDsKKworICB4Vm5jRXh0R2V0UGFyYW1EZXNjUmVwbHkgcmVwOworICBpbnQgbjsKKyAgcmVwLnR5cGUgPSBYX1JlcGx5OworICByZXAuc2VxdWVuY2VOdW1iZXIgPSBjbGllbnQtPnNlcXVlbmNlOworICByZXAuc3VjY2VzcyA9IDA7CisgIGludCBsZW4gPSAwOworICBjb25zdCBjaGFyKiBkZXNjID0gMDsKKyAgcmZiOjpWb2lkUGFyYW1ldGVyKiBwID0gcmZiOjpDb25maWd1cmF0aW9uOjpnZXRQYXJhbShwYXJhbS5idWYpOworICBpZiAocCkgeworICAgIGRlc2MgPSBwLT5nZXREZXNjcmlwdGlvbigpOworICAgIHJlcC5zdWNjZXNzID0gMTsKKyAgICBsZW4gPSBkZXNjID8gc3RybGVuKGRlc2MpIDogMDsKKyAgfQorICByZXAubGVuZ3RoID0gKGxlbiArIDMpID4+IDI7CisgIHJlcC5kZXNjTGVuID0gbGVuOworICBpZiAoY2xpZW50LT5zd2FwcGVkKSB7CisgICAgc3dhcHMoJnJlcC5zZXF1ZW5jZU51bWJlciwgbik7CisgICAgc3dhcGwoJnJlcC5sZW5ndGgsIG4pOworICAgIHN3YXBzKCZyZXAuZGVzY0xlbiwgbik7CisgIH0KKyAgV3JpdGVUb0NsaWVudChjbGllbnQsIHNpemVvZih4Vm5jRXh0R2V0UGFyYW1EZXNjUmVwbHkpLCAoY2hhciAqKSZyZXApOworICBpZiAoZGVzYykKKyAgICBXcml0ZVRvQ2xpZW50KGNsaWVudCwgbGVuLCAoY2hhciopZGVzYyk7CisgIHJldHVybiAoY2xpZW50LT5ub0NsaWVudEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgU1Byb2NWbmNFeHRHZXRQYXJhbURlc2MoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgcmVnaXN0ZXIgY2hhciBuOworICBSRVFVRVNUKHhWbmNFeHRHZXRQYXJhbURlc2NSZXEpOworICBzd2Fwcygmc3R1ZmYtPmxlbmd0aCwgbik7CisgIFJFUVVFU1RfQVRfTEVBU1RfU0laRSh4Vm5jRXh0R2V0UGFyYW1EZXNjUmVxKTsKKyAgcmV0dXJuIFByb2NWbmNFeHRHZXRQYXJhbURlc2MoY2xpZW50KTsKK30KKworc3RhdGljIGludCBQcm9jVm5jRXh0TGlzdFBhcmFtcyhDbGllbnRQdHIgY2xpZW50KQoreworICBSRVFVRVNUKHhWbmNFeHRMaXN0UGFyYW1zUmVxKTsKKyAgUkVRVUVTVF9TSVpFX01BVENIKHhWbmNFeHRMaXN0UGFyYW1zUmVxKTsKKworICB4Vm5jRXh0TGlzdFBhcmFtc1JlcGx5IHJlcDsKKyAgaW50IG47CisgIHJlcC50eXBlID0gWF9SZXBseTsKKyAgcmVwLnNlcXVlbmNlTnVtYmVyID0gY2xpZW50LT5zZXF1ZW5jZTsKKworICBpbnQgblBhcmFtcyA9IDA7CisgIGludCBsZW4gPSAwOworICBmb3IgKFBhcmFtZXRlckl0ZXJhdG9yIGkoQ29uZmlndXJhdGlvbjo6Z2xvYmFsKCkpOyBpLnBhcmFtOyBpLm5leHQoKSkgeworICAgIGludCBsID0gc3RybGVuKGkucGFyYW0tPmdldE5hbWUoKSk7CisgICAgaWYgKGwgPD0gMjU1KSB7CisgICAgICBuUGFyYW1zKys7CisgICAgICBsZW4gKz0gbCArIDE7CisgICAgfQorICB9CisgIHJlcC5sZW5ndGggPSAobGVuICsgMykgPj4gMjsKKyAgcmVwLm5QYXJhbXMgPSBuUGFyYW1zOworICBpZiAoY2xpZW50LT5zd2FwcGVkKSB7CisgICAgc3dhcHMoJnJlcC5zZXF1ZW5jZU51bWJlciwgbik7CisgICAgc3dhcGwoJnJlcC5sZW5ndGgsIG4pOworICAgIHN3YXBzKCZyZXAublBhcmFtcywgbik7CisgIH0KKyAgV3JpdGVUb0NsaWVudChjbGllbnQsIHNpemVvZih4Vm5jRXh0TGlzdFBhcmFtc1JlcGx5KSwgKGNoYXIgKikmcmVwKTsKKyAgcmRyOjpVOCogZGF0YSA9IG5ldyByZHI6OlU4W2xlbl07CisgIHJkcjo6VTgqIHB0ciA9IGRhdGE7CisgIGZvciAoUGFyYW1ldGVySXRlcmF0b3IgaShDb25maWd1cmF0aW9uOjpnbG9iYWwoKSk7IGkucGFyYW07IGkubmV4dCgpKSB7CisgICAgaW50IGwgPSBzdHJsZW4oaS5wYXJhbS0+Z2V0TmFtZSgpKTsKKyAgICBpZiAobCA8PSAyNTUpIHsKKyAgICAgICpwdHIrKyA9IGw7CisgICAgICBtZW1jcHkocHRyLCBpLnBhcmFtLT5nZXROYW1lKCksIGwpOworICAgICAgcHRyICs9IGw7CisgICAgfQorICB9CisgIFdyaXRlVG9DbGllbnQoY2xpZW50LCBsZW4sIChjaGFyKilkYXRhKTsKKyAgZGVsZXRlIFtdIGRhdGE7CisgIHJldHVybiAoY2xpZW50LT5ub0NsaWVudEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgU1Byb2NWbmNFeHRMaXN0UGFyYW1zKENsaWVudFB0ciBjbGllbnQpCit7CisgIHJlZ2lzdGVyIGNoYXIgbjsKKyAgUkVRVUVTVCh4Vm5jRXh0TGlzdFBhcmFtc1JlcSk7CisgIHN3YXBzKCZzdHVmZi0+bGVuZ3RoLCBuKTsKKyAgUkVRVUVTVF9TSVpFX01BVENIKHhWbmNFeHRMaXN0UGFyYW1zUmVxKTsKKyAgcmV0dXJuIFByb2NWbmNFeHRMaXN0UGFyYW1zKGNsaWVudCk7Cit9CisKK3N0YXRpYyBpbnQgUHJvY1ZuY0V4dFNldFNlcnZlckN1dFRleHQoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgUkVRVUVTVCh4Vm5jRXh0U2V0U2VydmVyQ3V0VGV4dFJlcSk7CisgIFJFUVVFU1RfRklYRURfU0laRSh4Vm5jRXh0U2V0U2VydmVyQ3V0VGV4dFJlcSwgc3R1ZmYtPnRleHRMZW4pOworICBjaGFyKiBzdHIgPSBuZXcgY2hhcltzdHVmZi0+dGV4dExlbisxXTsKKyAgc3RybmNweShzdHIsIChjaGFyKikmc3R1ZmZbMV0sIHN0dWZmLT50ZXh0TGVuKTsKKyAgc3RyW3N0dWZmLT50ZXh0TGVuXSA9IDA7CisgIGZvciAoaW50IHNjciA9IDA7IHNjciA8IHNjcmVlbkluZm8ubnVtU2NyZWVuczsgc2NyKyspIHsKKyAgICBpZiAoZGVza3RvcFtzY3JdKSB7CisgICAgICBkZXNrdG9wW3Njcl0tPnNlcnZlckN1dFRleHQoc3RyLCBzdHVmZi0+dGV4dExlbik7CisgICAgfQorICB9CisgIGRlbGV0ZSBbXSBzdHI7CisgIHJldHVybiAoY2xpZW50LT5ub0NsaWVudEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgU1Byb2NWbmNFeHRTZXRTZXJ2ZXJDdXRUZXh0KENsaWVudFB0ciBjbGllbnQpCit7CisgIHJlZ2lzdGVyIGNoYXIgbjsKKyAgUkVRVUVTVCh4Vm5jRXh0U2V0U2VydmVyQ3V0VGV4dFJlcSk7CisgIHN3YXBzKCZzdHVmZi0+bGVuZ3RoLCBuKTsKKyAgUkVRVUVTVF9BVF9MRUFTVF9TSVpFKHhWbmNFeHRTZXRTZXJ2ZXJDdXRUZXh0UmVxKTsKKyAgc3dhcGwoJnN0dWZmLT50ZXh0TGVuLCBuKTsKKyAgcmV0dXJuIFByb2NWbmNFeHRTZXRTZXJ2ZXJDdXRUZXh0KGNsaWVudCk7Cit9CisKK3N0YXRpYyBpbnQgUHJvY1ZuY0V4dEdldENsaWVudEN1dFRleHQoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgUkVRVUVTVCh4Vm5jRXh0R2V0Q2xpZW50Q3V0VGV4dFJlcSk7CisgIFJFUVVFU1RfU0laRV9NQVRDSCh4Vm5jRXh0R2V0Q2xpZW50Q3V0VGV4dFJlcSk7CisKKyAgeFZuY0V4dEdldENsaWVudEN1dFRleHRSZXBseSByZXA7CisgIGludCBuOworICByZXAudHlwZSA9IFhfUmVwbHk7CisgIHJlcC5sZW5ndGggPSAoY2xpZW50Q3V0VGV4dExlbiArIDMpID4+IDI7CisgIHJlcC5zZXF1ZW5jZU51bWJlciA9IGNsaWVudC0+c2VxdWVuY2U7CisgIHJlcC50ZXh0TGVuID0gY2xpZW50Q3V0VGV4dExlbjsKKyAgaWYgKGNsaWVudC0+c3dhcHBlZCkgeworICAgIHN3YXBzKCZyZXAuc2VxdWVuY2VOdW1iZXIsIG4pOworICAgIHN3YXBsKCZyZXAubGVuZ3RoLCBuKTsKKyAgICBzd2FwbCgmcmVwLnRleHRMZW4sIG4pOworICB9CisgIFdyaXRlVG9DbGllbnQoY2xpZW50LCBzaXplb2YoeFZuY0V4dEdldENsaWVudEN1dFRleHRSZXBseSksIChjaGFyICopJnJlcCk7CisgIGlmIChjbGllbnRDdXRUZXh0KQorICAgIFdyaXRlVG9DbGllbnQoY2xpZW50LCBjbGllbnRDdXRUZXh0TGVuLCBjbGllbnRDdXRUZXh0KTsKKyAgcmV0dXJuIChjbGllbnQtPm5vQ2xpZW50RXhjZXB0aW9uKTsKK30KKworc3RhdGljIGludCBTUHJvY1ZuY0V4dEdldENsaWVudEN1dFRleHQoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgcmVnaXN0ZXIgY2hhciBuOworICBSRVFVRVNUKHhWbmNFeHRHZXRDbGllbnRDdXRUZXh0UmVxKTsKKyAgc3dhcHMoJnN0dWZmLT5sZW5ndGgsIG4pOworICBSRVFVRVNUX1NJWkVfTUFUQ0goeFZuY0V4dEdldENsaWVudEN1dFRleHRSZXEpOworICByZXR1cm4gUHJvY1ZuY0V4dEdldENsaWVudEN1dFRleHQoY2xpZW50KTsKK30KKworc3RhdGljIGludCBQcm9jVm5jRXh0U2VsZWN0SW5wdXQoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgUkVRVUVTVCh4Vm5jRXh0U2VsZWN0SW5wdXRSZXEpOworICBSRVFVRVNUX1NJWkVfTUFUQ0goeFZuY0V4dFNlbGVjdElucHV0UmVxKTsKKyAgVm5jSW5wdXRTZWxlY3QqKiBuZXh0UHRyID0gJnZuY0lucHV0U2VsZWN0SGVhZDsKKyAgVm5jSW5wdXRTZWxlY3QqIGN1cjsKKyAgZm9yIChjdXIgPSB2bmNJbnB1dFNlbGVjdEhlYWQ7IGN1cjsgY3VyID0gKm5leHRQdHIpIHsKKyAgICBpZiAoY3VyLT5jbGllbnQgPT0gY2xpZW50ICYmIGN1ci0+d2luZG93ID09IHN0dWZmLT53aW5kb3cpIHsKKyAgICAgIGN1ci0+bWFzayA9IHN0dWZmLT5tYXNrOworICAgICAgaWYgKCFjdXItPm1hc2spIHsKKyAgICAgICAgKm5leHRQdHIgPSBjdXItPm5leHQ7CisgICAgICAgIGRlbGV0ZSBjdXI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgbmV4dFB0ciA9ICZjdXItPm5leHQ7CisgIH0KKyAgaWYgKCFjdXIpIHsKKyAgICBjdXIgPSBuZXcgVm5jSW5wdXRTZWxlY3QoY2xpZW50LCBzdHVmZi0+d2luZG93LCBzdHVmZi0+bWFzayk7CisgIH0KKyAgcmV0dXJuIChjbGllbnQtPm5vQ2xpZW50RXhjZXB0aW9uKTsKK30KKworc3RhdGljIGludCBTUHJvY1ZuY0V4dFNlbGVjdElucHV0KENsaWVudFB0ciBjbGllbnQpCit7CisgIHJlZ2lzdGVyIGNoYXIgbjsKKyAgUkVRVUVTVCh4Vm5jRXh0U2VsZWN0SW5wdXRSZXEpOworICBzd2Fwcygmc3R1ZmYtPmxlbmd0aCwgbik7CisgIFJFUVVFU1RfU0laRV9NQVRDSCh4Vm5jRXh0U2VsZWN0SW5wdXRSZXEpOworICBzd2FwbCgmc3R1ZmYtPndpbmRvdywgbik7CisgIHN3YXBsKCZzdHVmZi0+bWFzaywgbik7CisgIHJldHVybiBQcm9jVm5jRXh0U2VsZWN0SW5wdXQoY2xpZW50KTsKK30KKworc3RhdGljIGludCBQcm9jVm5jRXh0Q29ubmVjdChDbGllbnRQdHIgY2xpZW50KQoreworICBSRVFVRVNUKHhWbmNFeHRDb25uZWN0UmVxKTsKKyAgUkVRVUVTVF9GSVhFRF9TSVpFKHhWbmNFeHRDb25uZWN0UmVxLCBzdHVmZi0+c3RyTGVuKTsKKyAgQ2hhckFycmF5IHN0cihzdHVmZi0+c3RyTGVuKzEpOworICBzdHJuY3B5KHN0ci5idWYsIChjaGFyKikmc3R1ZmZbMV0sIHN0dWZmLT5zdHJMZW4pOworICBzdHIuYnVmW3N0dWZmLT5zdHJMZW5dID0gMDsKKworICB4Vm5jRXh0Q29ubmVjdFJlcGx5IHJlcDsKKyAgcmVwLnN1Y2Nlc3MgPSAwOworICBpZiAoZGVza3RvcFswXSkgeworICAgIGlmIChzdHVmZi0+c3RyTGVuID09IDApIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGRlc2t0b3BbMF0tPmRpc2Nvbm5lY3RDbGllbnRzKCk7CisgICAgICAgIHJlcC5zdWNjZXNzID0gMTsKKyAgICAgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgICAgIHZsb2cuZXJyb3IoIkRpc2Nvbm5lY3RpbmcgYWxsIGNsaWVudHM6ICVzIixlLnN0cigpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IHBvcnQgPSA1NTAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHVmZi0+c3RyTGVuOyBpKyspIHsKKyAgICAgICAgaWYgKHN0ci5idWZbaV0gPT0gJzonKSB7CisgICAgICAgICAgcG9ydCA9IGF0b2koJnN0ci5idWZbaSsxXSk7CisgICAgICAgICAgc3RyLmJ1ZltpXSA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgbmV0d29yazo6U29ja2V0KiBzb2NrID0gbmV3IG5ldHdvcms6OlRjcFNvY2tldChzdHIuYnVmLCBwb3J0KTsKKyAgICAgICAgZGVza3RvcFswXS0+YWRkQ2xpZW50KHNvY2ssIHRydWUpOworCXJlcC5zdWNjZXNzID0gMTsKKyAgICAgIH0gY2F0Y2ggKHJkcjo6RXhjZXB0aW9uJiBlKSB7CisgICAgICAgIHZsb2cuZXJyb3IoIlJldmVyc2UgY29ubmVjdGlvbjogJXMiLGUuc3RyKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJlcC50eXBlID0gWF9SZXBseTsKKyAgcmVwLmxlbmd0aCA9IDA7CisgIHJlcC5zZXF1ZW5jZU51bWJlciA9IGNsaWVudC0+c2VxdWVuY2U7CisgIGlmIChjbGllbnQtPnN3YXBwZWQpIHsKKyAgICBpbnQgbjsKKyAgICBzd2FwcygmcmVwLnNlcXVlbmNlTnVtYmVyLCBuKTsKKyAgICBzd2FwbCgmcmVwLmxlbmd0aCwgbik7CisgIH0KKyAgV3JpdGVUb0NsaWVudChjbGllbnQsIHNpemVvZih4Vm5jRXh0Q29ubmVjdFJlcGx5KSwgKGNoYXIgKikmcmVwKTsKKyAgcmV0dXJuIChjbGllbnQtPm5vQ2xpZW50RXhjZXB0aW9uKTsKK30KKworc3RhdGljIGludCBTUHJvY1ZuY0V4dENvbm5lY3QoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgcmVnaXN0ZXIgY2hhciBuOworICBSRVFVRVNUKHhWbmNFeHRDb25uZWN0UmVxKTsKKyAgc3dhcHMoJnN0dWZmLT5sZW5ndGgsIG4pOworICBSRVFVRVNUX0FUX0xFQVNUX1NJWkUoeFZuY0V4dENvbm5lY3RSZXEpOworICByZXR1cm4gUHJvY1ZuY0V4dENvbm5lY3QoY2xpZW50KTsKK30KKworCitzdGF0aWMgaW50IFByb2NWbmNFeHRHZXRRdWVyeUNvbm5lY3QoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgUkVRVUVTVCh4Vm5jRXh0R2V0UXVlcnlDb25uZWN0UmVxKTsKKyAgUkVRVUVTVF9TSVpFX01BVENIKHhWbmNFeHRHZXRRdWVyeUNvbm5lY3RSZXEpOworCisgIGNvbnN0IGNoYXIgKnFjQWRkcmVzcz0wLCAqcWNVc2VybmFtZT0wOworICBpbnQgcWNUaW1lb3V0OworICBpZiAocXVlcnlDb25uZWN0RGVza3RvcCkKKyAgICBxY1RpbWVvdXQgPSBxdWVyeUNvbm5lY3REZXNrdG9wLT5nZXRRdWVyeVRpbWVvdXQocXVlcnlDb25uZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY0FkZHJlc3MsICZxY1VzZXJuYW1lKTsKKyAgZWxzZQorICAgIHFjVGltZW91dCA9IDA7CisKKyAgeFZuY0V4dEdldFF1ZXJ5Q29ubmVjdFJlcGx5IHJlcDsKKyAgaW50IG47CisgIHJlcC50eXBlID0gWF9SZXBseTsKKyAgcmVwLnNlcXVlbmNlTnVtYmVyID0gY2xpZW50LT5zZXF1ZW5jZTsKKyAgcmVwLnRpbWVvdXQgPSBxY1RpbWVvdXQ7CisgIHJlcC5hZGRyTGVuID0gcWNUaW1lb3V0ID8gc3RybGVuKHFjQWRkcmVzcykgOiAwOworICByZXAudXNlckxlbiA9IHFjVGltZW91dCA/IHN0cmxlbihxY1VzZXJuYW1lKSA6IDA7CisgIHJlcC5vcGFxdWVJZCA9IChDQVJEMzIpcXVlcnlDb25uZWN0SWQ7CisgIHJlcC5sZW5ndGggPSAocmVwLnVzZXJMZW4gKyByZXAuYWRkckxlbiArIDMpID4+IDI7CisgIGlmIChjbGllbnQtPnN3YXBwZWQpIHsKKyAgICBzd2FwcygmcmVwLnNlcXVlbmNlTnVtYmVyLCBuKTsKKyAgICBzd2FwbCgmcmVwLnVzZXJMZW4sIG4pOworICAgIHN3YXBsKCZyZXAuYWRkckxlbiwgbik7CisgICAgc3dhcGwoJnJlcC50aW1lb3V0LCBuKTsKKyAgICBzd2FwbCgmcmVwLm9wYXF1ZUlkLCBuKTsKKyAgfQorICBXcml0ZVRvQ2xpZW50KGNsaWVudCwgc2l6ZW9mKHhWbmNFeHRHZXRRdWVyeUNvbm5lY3RSZXBseSksIChjaGFyICopJnJlcCk7CisgIGlmIChxY1RpbWVvdXQpCisgICAgV3JpdGVUb0NsaWVudChjbGllbnQsIHN0cmxlbihxY0FkZHJlc3MpLCAoY2hhciopcWNBZGRyZXNzKTsKKyAgaWYgKHFjVGltZW91dCkKKyAgICBXcml0ZVRvQ2xpZW50KGNsaWVudCwgc3RybGVuKHFjVXNlcm5hbWUpLCAoY2hhciopcWNVc2VybmFtZSk7CisgIHJldHVybiAoY2xpZW50LT5ub0NsaWVudEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgU1Byb2NWbmNFeHRHZXRRdWVyeUNvbm5lY3QoQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgcmVnaXN0ZXIgY2hhciBuOworICBSRVFVRVNUKHhWbmNFeHRHZXRRdWVyeUNvbm5lY3RSZXEpOworICBzd2Fwcygmc3R1ZmYtPmxlbmd0aCwgbik7CisgIFJFUVVFU1RfU0laRV9NQVRDSCh4Vm5jRXh0R2V0UXVlcnlDb25uZWN0UmVxKTsKKyAgcmV0dXJuIFByb2NWbmNFeHRHZXRRdWVyeUNvbm5lY3QoY2xpZW50KTsKK30KKworCitzdGF0aWMgaW50IFByb2NWbmNFeHRBcHByb3ZlQ29ubmVjdChDbGllbnRQdHIgY2xpZW50KQoreworICBSRVFVRVNUKHhWbmNFeHRBcHByb3ZlQ29ubmVjdFJlcSk7CisgIFJFUVVFU1RfU0laRV9NQVRDSCh4Vm5jRXh0QXBwcm92ZUNvbm5lY3RSZXEpOworICBpZiAocXVlcnlDb25uZWN0SWQgPT0gKHZvaWQqKXN0dWZmLT5vcGFxdWVJZCkgeworICAgIGZvciAoaW50IHNjciA9IDA7IHNjciA8IHNjcmVlbkluZm8ubnVtU2NyZWVuczsgc2NyKyspIHsKKyAgICAgIGlmIChkZXNrdG9wW3Njcl0pIHsKKyAgICAgICAgZGVza3RvcFtzY3JdLT5hcHByb3ZlQ29ubmVjdGlvbihxdWVyeUNvbm5lY3RJZCwgc3R1ZmYtPmFwcHJvdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gcmVqZWN0ZWQgYnkgbG9jYWwgdXNlciIpOworICAgICAgfQorICAgIH0KKyAgICAvLyBJbmZvcm0gb3RoZXIgY2xpZW50cyBvZiB0aGUgZXZlbnQgYW5kIHRpZHkgdXAKKyAgICB2bmNRdWVyeUNvbm5lY3QocXVlcnlDb25uZWN0RGVza3RvcCwgcXVlcnlDb25uZWN0SWQpOworICB9CisgIHJldHVybiAoY2xpZW50LT5ub0NsaWVudEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgU1Byb2NWbmNFeHRBcHByb3ZlQ29ubmVjdChDbGllbnRQdHIgY2xpZW50KQoreworICByZWdpc3RlciBjaGFyIG47CisgIFJFUVVFU1QoeFZuY0V4dEFwcHJvdmVDb25uZWN0UmVxKTsKKyAgc3dhcHMoJnN0dWZmLT5sZW5ndGgsIG4pOworICBzd2FwbCgmc3R1ZmYtPm9wYXF1ZUlkLCBuKTsKKyAgUkVRVUVTVF9TSVpFX01BVENIKHhWbmNFeHRBcHByb3ZlQ29ubmVjdFJlcSk7CisgIHJldHVybiBQcm9jVm5jRXh0QXBwcm92ZUNvbm5lY3QoY2xpZW50KTsKK30KKworCitzdGF0aWMgaW50IFByb2NWbmNFeHREaXNwYXRjaChDbGllbnRQdHIgY2xpZW50KQoreworICBSRVFVRVNUKHhSZXEpOworICBzd2l0Y2ggKHN0dWZmLT5kYXRhKSB7CisgIGNhc2UgWF9WbmNFeHRTZXRQYXJhbToKKyAgICByZXR1cm4gUHJvY1ZuY0V4dFNldFBhcmFtKGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRHZXRQYXJhbToKKyAgICByZXR1cm4gUHJvY1ZuY0V4dEdldFBhcmFtKGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRHZXRQYXJhbURlc2M6CisgICAgcmV0dXJuIFByb2NWbmNFeHRHZXRQYXJhbURlc2MoY2xpZW50KTsKKyAgY2FzZSBYX1ZuY0V4dExpc3RQYXJhbXM6CisgICAgcmV0dXJuIFByb2NWbmNFeHRMaXN0UGFyYW1zKGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRTZXRTZXJ2ZXJDdXRUZXh0OgorICAgIHJldHVybiBQcm9jVm5jRXh0U2V0U2VydmVyQ3V0VGV4dChjbGllbnQpOworICBjYXNlIFhfVm5jRXh0R2V0Q2xpZW50Q3V0VGV4dDoKKyAgICByZXR1cm4gUHJvY1ZuY0V4dEdldENsaWVudEN1dFRleHQoY2xpZW50KTsKKyAgY2FzZSBYX1ZuY0V4dFNlbGVjdElucHV0OgorICAgIHJldHVybiBQcm9jVm5jRXh0U2VsZWN0SW5wdXQoY2xpZW50KTsKKyAgY2FzZSBYX1ZuY0V4dENvbm5lY3Q6CisgICAgcmV0dXJuIFByb2NWbmNFeHRDb25uZWN0KGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRHZXRRdWVyeUNvbm5lY3Q6CisgICAgcmV0dXJuIFByb2NWbmNFeHRHZXRRdWVyeUNvbm5lY3QoY2xpZW50KTsKKyAgY2FzZSBYX1ZuY0V4dEFwcHJvdmVDb25uZWN0OgorICAgIHJldHVybiBQcm9jVm5jRXh0QXBwcm92ZUNvbm5lY3QoY2xpZW50KTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gQmFkUmVxdWVzdDsKKyAgfQorfQorCitzdGF0aWMgaW50IFNQcm9jVm5jRXh0RGlzcGF0Y2goQ2xpZW50UHRyIGNsaWVudCkKK3sKKyAgUkVRVUVTVCh4UmVxKTsKKyAgc3dpdGNoIChzdHVmZi0+ZGF0YSkgeworICBjYXNlIFhfVm5jRXh0U2V0UGFyYW06CisgICAgcmV0dXJuIFNQcm9jVm5jRXh0U2V0UGFyYW0oY2xpZW50KTsKKyAgY2FzZSBYX1ZuY0V4dEdldFBhcmFtOgorICAgIHJldHVybiBTUHJvY1ZuY0V4dEdldFBhcmFtKGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRHZXRQYXJhbURlc2M6CisgICAgcmV0dXJuIFNQcm9jVm5jRXh0R2V0UGFyYW1EZXNjKGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRMaXN0UGFyYW1zOgorICAgIHJldHVybiBTUHJvY1ZuY0V4dExpc3RQYXJhbXMoY2xpZW50KTsKKyAgY2FzZSBYX1ZuY0V4dFNldFNlcnZlckN1dFRleHQ6CisgICAgcmV0dXJuIFNQcm9jVm5jRXh0U2V0U2VydmVyQ3V0VGV4dChjbGllbnQpOworICBjYXNlIFhfVm5jRXh0R2V0Q2xpZW50Q3V0VGV4dDoKKyAgICByZXR1cm4gU1Byb2NWbmNFeHRHZXRDbGllbnRDdXRUZXh0KGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRTZWxlY3RJbnB1dDoKKyAgICByZXR1cm4gU1Byb2NWbmNFeHRTZWxlY3RJbnB1dChjbGllbnQpOworICBjYXNlIFhfVm5jRXh0Q29ubmVjdDoKKyAgICByZXR1cm4gU1Byb2NWbmNFeHRDb25uZWN0KGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRHZXRRdWVyeUNvbm5lY3Q6CisgICAgcmV0dXJuIFNQcm9jVm5jRXh0R2V0UXVlcnlDb25uZWN0KGNsaWVudCk7CisgIGNhc2UgWF9WbmNFeHRBcHByb3ZlQ29ubmVjdDoKKyAgICByZXR1cm4gU1Byb2NWbmNFeHRBcHByb3ZlQ29ubmVjdChjbGllbnQpOworICBkZWZhdWx0OgorICAgIHJldHVybiBCYWRSZXF1ZXN0OworICB9Cit9CisKZGlmZiAtLWdpdCBhL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvdm5jRXh0SW5pdC5oIGIvdW5peC94Yy9wcm9ncmFtcy9Yc2VydmVyL3ZuYy92bmNFeHRJbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0NTNlMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvdm5jRXh0SW5pdC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJlYWxWTkMgTHRkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKyNpZm5kZWYgX19WTkNFWFRJTklUX0hfXworI2RlZmluZSBfX1ZOQ0VYVElOSVRfSF9fCisKKyNpbmNsdWRlIDxyZmIvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgIlhzZXJ2ZXJEZXNrdG9wLmgiCisKK2V4dGVybiB2b2lkIHZuY0NsaWVudEN1dFRleHQoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIHZuY1F1ZXJ5Q29ubmVjdChYc2VydmVyRGVza3RvcCogZGVza3RvcCwgdm9pZCogb3BhcXVlSWQpOworZXh0ZXJuIHZvaWQgdm5jQ2xpZW50R29uZShpbnQgZmQpOworZXh0ZXJuIHZvaWQgdm5jQmVsbCgpOworZXh0ZXJuIHZvaWQqIHZuY0ZicHRyW107CitleHRlcm4gaW50IHZuY0luZXRkU29jazsKK2V4dGVybiByZmI6OlN0cmluZ1BhcmFtZXRlciBodHRwRGlyOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvdm5jSG9va3MuY2MgYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL3ZuY0hvb2tzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGU3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL3ZuY0hvb2tzLmNjCkBAIC0wLDAgKzEsMTUzMyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgUmVhbFZOQyBMdGQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJYc2VydmVyRGVza3RvcC5oIgorI2luY2x1ZGUgInZuY0hvb2tzLmgiCisKK2V4dGVybiAiQyIgeworI2RlZmluZSBjbGFzcyBjX2NsYXNzCisjZGVmaW5lIHByaXZhdGUgY19wcml2YXRlCisjaW5jbHVkZSAic2NybmludHN0ci5oIgorI2luY2x1ZGUgIndpbmRvd3N0ci5oIgorI2luY2x1ZGUgImdjc3RydWN0LmgiCisjaW5jbHVkZSAicmVnaW9uc3RyLmgiCisjaW5jbHVkZSAiZGl4Zm9udHN0ci5oIgorI2luY2x1ZGUgImNvbG9ybWFwc3QuaCIKKyNpZmRlZiBSRU5ERVIKKyNpbmNsdWRlICJwaWN0dXJlc3RyLmgiCisjZW5kaWYKKworI2lmZGVmIEdDX0hBU19DT01QT1NJVEVfQ0xJUAorI2RlZmluZSBDT01QT1NJVEVfQ0xJUChnYykgKChnYyktPnBDb21wb3NpdGVDbGlwKQorI2Vsc2UKKyNpbmNsdWRlICJtZmIuaCIKKyNkZWZpbmUgQ09NUE9TSVRFX0NMSVAoZ2MpIFwKKyAgKCgobWZiUHJpdkdDUHRyKSgoZ2MpLT5kZXZQcml2YXRlc1ttZmJHQ1ByaXZhdGVJbmRleF0ucHRyKSktPnBDb21wb3NpdGVDbGlwKQorI2VuZGlmCisKKyN1bmRlZiBjbGFzcworI3VuZGVmIHByaXZhdGUKK30KKworI2luY2x1ZGUgIlJlZ2lvbkhlbHBlci5oIgorCisjZGVmaW5lIERCR1BSSU5UKHgpIC8vKGZwcmludGYgeCkKKworLy8gTUFYX1JFQ1RTX1BFUl9PUCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjdGFuZ2xlcyB3ZSBnZW5lcmF0ZSBmcm9tCisvLyBvcGVyYXRpb25zIGxpa2UgUG9seWxpbmVzIGFuZCBQb2x5U2VnbWVudC4gIElmIHRoZSBvcGVyYXRpb24gaXMgbW9yZSBjb21wbGV4CisvLyB0aGFuIHRoaXMsIHdlIHNpbXBseSB1c2UgdGhlIGJvdW5kaW5nIGJveC4gIElkZWFsbHkgaXQgd291bGQgYmUgYQorLy8gY29tbWFuZC1saW5lIG9wdGlvbiwgYnV0IHRoYXQgd291bGQgaW52b2x2ZSBhbiBleHRyYSBtYWxsb2MgZWFjaCB0aW1lLCBzbyB3ZQorLy8gZml4IGl0IGhlcmUuCisjZGVmaW5lIE1BWF9SRUNUU19QRVJfT1AgNQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bmNIb29rc0dlbmVyYXRpb24gPSAwOworCisvLyB2bmNIb29rc1NjcmVlblJlYyBhbmQgdm5jSG9va3NHQ1JlYyBjb250YWluIHBvaW50ZXJzIHRvIHRoZSBvcmlnaW5hbAorLy8gZnVuY3Rpb25zIHdoaWNoIHdlICJ3cmFwIiBpbiBvcmRlciB0byBob29rIHRoZSBzY3JlZW4gY2hhbmdlcy4gIFRoZSBzY3JlZW4KKy8vIGZ1bmN0aW9ucyBhcmUgZWFjaCB3cmFwcGVkIGluZGl2aWR1YWxseSwgd2hpbGUgdGhlIEdDICJmdW5jcyIgYW5kICJvcHMiIGFyZQorLy8gd3JhcHBlZCBhcyBhIHVuaXQuCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgWHNlcnZlckRlc2t0b3AqIGRlc2t0b3A7CisKKyAgQ2xvc2VTY3JlZW5Qcm9jUHRyICAgICAgICAgICBDbG9zZVNjcmVlbjsKKyAgQ3JlYXRlR0NQcm9jUHRyICAgICAgICAgICAgICBDcmVhdGVHQzsKKyAgUGFpbnRXaW5kb3dCYWNrZ3JvdW5kUHJvY1B0ciBQYWludFdpbmRvd0JhY2tncm91bmQ7CisgIFBhaW50V2luZG93Qm9yZGVyUHJvY1B0ciAgICAgUGFpbnRXaW5kb3dCb3JkZXI7CisgIENvcHlXaW5kb3dQcm9jUHRyICAgICAgICAgICAgQ29weVdpbmRvdzsKKyAgQ2xlYXJUb0JhY2tncm91bmRQcm9jUHRyICAgICBDbGVhclRvQmFja2dyb3VuZDsKKyAgUmVzdG9yZUFyZWFzUHJvY1B0ciAgICAgICAgICBSZXN0b3JlQXJlYXM7CisgIEluc3RhbGxDb2xvcm1hcFByb2NQdHIgICAgICAgSW5zdGFsbENvbG9ybWFwOworICBTdG9yZUNvbG9yc1Byb2NQdHIgICAgICAgICAgIFN0b3JlQ29sb3JzOworICBEaXNwbGF5Q3Vyc29yUHJvY1B0ciAgICAgICAgIERpc3BsYXlDdXJzb3I7CisgIFNjcmVlbkJsb2NrSGFuZGxlclByb2NQdHIgICAgQmxvY2tIYW5kbGVyOworI2lmZGVmIFJFTkRFUgorICBDb21wb3NpdGVQcm9jUHRyICAgICAgICAgICAgIENvbXBvc2l0ZTsKKyNlbmRpZgorfSB2bmNIb29rc1NjcmVlblJlYywgKnZuY0hvb2tzU2NyZWVuUHRyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgR0NGdW5jcyAqd3JhcHBlZEZ1bmNzOworICAgIEdDT3BzICp3cmFwcGVkT3BzOworfSB2bmNIb29rc0dDUmVjLCAqdm5jSG9va3NHQ1B0cjsKKworc3RhdGljIGludCB2bmNIb29rc1NjcmVlbkluZGV4Oworc3RhdGljIGludCB2bmNIb29rc0dDSW5kZXg7CisKKworLy8gc2NyZWVuIGZ1bmN0aW9ucworCitzdGF0aWMgQm9vbCB2bmNIb29rc0Nsb3NlU2NyZWVuKGludCBpLCBTY3JlZW5QdHIgcFNjcmVlbik7CitzdGF0aWMgQm9vbCB2bmNIb29rc0NyZWF0ZUdDKEdDUHRyIHBHQyk7CitzdGF0aWMgdm9pZCB2bmNIb29rc1BhaW50V2luZG93QmFja2dyb3VuZChXaW5kb3dQdHIgcFdpbiwgUmVnaW9uUHRyIHBSZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCk7CitzdGF0aWMgdm9pZCB2bmNIb29rc1BhaW50V2luZG93Qm9yZGVyKFdpbmRvd1B0ciBwV2luLCBSZWdpb25QdHIgcFJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQpOworc3RhdGljIHZvaWQgdm5jSG9va3NDb3B5V2luZG93KFdpbmRvd1B0ciBwV2luLCBERFhQb2ludFJlYyBwdE9sZE9yZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25QdHIgcE9sZFJlZ2lvbik7CitzdGF0aWMgdm9pZCB2bmNIb29rc0NsZWFyVG9CYWNrZ3JvdW5kKFdpbmRvd1B0ciBwV2luLCBpbnQgeCwgaW50IHksIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgQm9vbCBnZW5lcmF0ZUV4cG9zdXJlcyk7CitzdGF0aWMgUmVnaW9uUHRyIHZuY0hvb2tzUmVzdG9yZUFyZWFzKFdpbmRvd1B0ciBwV2luLCBSZWdpb25QdHIgcHJnbkV4cG9zZWQpOworc3RhdGljIHZvaWQgdm5jSG9va3NJbnN0YWxsQ29sb3JtYXAoQ29sb3JtYXBQdHIgcENvbG9ybWFwKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzU3RvcmVDb2xvcnMoQ29sb3JtYXBQdHIgcENvbG9ybWFwLCBpbnQgbmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeENvbG9ySXRlbSogcGRlZik7CitzdGF0aWMgQm9vbCB2bmNIb29rc0Rpc3BsYXlDdXJzb3IoU2NyZWVuUHRyIHBTY3JlZW4sIEN1cnNvclB0ciBjdXJzb3IpOworc3RhdGljIHZvaWQgdm5jSG9va3NCbG9ja0hhbmRsZXIoaW50IGksIHBvaW50ZXIgYmxvY2tEYXRhLCBwb2ludGVyIHBUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBwUmVhZG1hc2spOworI2lmZGVmIFJFTkRFUgorc3RhdGljIHZvaWQgdm5jSG9va3NDb21wb3NpdGUoQ0FSRDggb3AsIFBpY3R1cmVQdHIgcFNyYywgUGljdHVyZVB0ciBwTWFzaywgCisJCQkgICAgICBQaWN0dXJlUHRyIHBEc3QsIElOVDE2IHhTcmMsIElOVDE2IHlTcmMsIElOVDE2IHhNYXNrLCAKKwkJCSAgICAgIElOVDE2IHlNYXNrLCBJTlQxNiB4RHN0LCBJTlQxNiB5RHN0LCBDQVJEMTYgd2lkdGgsIENBUkQxNiBoZWlnaHQpOworI2VuZGlmCisKKy8vIEdDICJmdW5jcyIKKworc3RhdGljIHZvaWQgdm5jSG9va3NWYWxpZGF0ZUdDKEdDUHRyIHBHQywgdW5zaWduZWQgbG9uZyBjaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlUHRyIHBEcmF3YWJsZSk7CitzdGF0aWMgdm9pZCB2bmNIb29rc0NoYW5nZUdDKEdDUHRyIHBHQywgdW5zaWduZWQgbG9uZyBtYXNrKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzQ29weUdDKEdDUHRyIHNyYywgdW5zaWduZWQgbG9uZyBtYXNrLCBHQ1B0ciBkc3QpOworc3RhdGljIHZvaWQgdm5jSG9va3NEZXN0cm95R0MoR0NQdHIgcEdDKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzQ2hhbmdlQ2xpcChHQ1B0ciBwR0MsIGludCB0eXBlLCBwb2ludGVyIHBWYWx1ZSxpbnQgbnJlY3RzKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzRGVzdHJveUNsaXAoR0NQdHIgcEdDKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzQ29weUNsaXAoR0NQdHIgZHN0LCBHQ1B0ciBzcmMpOworCitzdGF0aWMgR0NGdW5jcyB2bmNIb29rc0dDRnVuY3MgPSB7CisgIHZuY0hvb2tzVmFsaWRhdGVHQywgdm5jSG9va3NDaGFuZ2VHQywgdm5jSG9va3NDb3B5R0MsIHZuY0hvb2tzRGVzdHJveUdDLAorICB2bmNIb29rc0NoYW5nZUNsaXAsIHZuY0hvb2tzRGVzdHJveUNsaXAsIHZuY0hvb2tzQ29weUNsaXAsCit9OworCisvLyBHQyAib3BzIgorCitzdGF0aWMgdm9pZCB2bmNIb29rc0ZpbGxTcGFucyhEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5Jbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERYUG9pbnRQdHIgcHB0SW5pdCwgaW50ICpwd2lkdGhJbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZTb3J0ZWQpOworc3RhdGljIHZvaWQgdm5jSG9va3NTZXRTcGFucyhEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgY2hhciAqcHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERYUG9pbnRQdHIgcHB0LCBpbnQgKnB3aWR0aCwgaW50IG5zcGFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZTb3J0ZWQpOworc3RhdGljIHZvaWQgdm5jSG9va3NQdXRJbWFnZShEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGxlZnRQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsIGNoYXIgKnBCaXRzKTsKK3N0YXRpYyBSZWdpb25QdHIgdm5jSG9va3NDb3B5QXJlYShEcmF3YWJsZVB0ciBwU3JjLCBEcmF3YWJsZVB0ciBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDUHRyIHBHQywgaW50IHNyY3gsIGludCBzcmN5LCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdHgsIGludCBkc3R5KTsKK3N0YXRpYyBSZWdpb25QdHIgdm5jSG9va3NDb3B5UGxhbmUoRHJhd2FibGVQdHIgcFNyYywgRHJhd2FibGVQdHIgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NQdHIgcEdDLCBpbnQgc3JjeCwgaW50IHNyY3ksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdHgsIGludCBkc3R5LCB1bnNpZ25lZCBsb25nIHBsYW5lKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seVBvaW50KERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucHQsIHhQb2ludCAqcHRzKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seWxpbmVzKERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucHQsIEREWFBvaW50UHRyIHBwdHMpOworc3RhdGljIHZvaWQgdm5jSG9va3NQb2x5U2VnbWVudChEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5zZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTZWdtZW50ICpzZWdzKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seVJlY3RhbmdsZShEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5yZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4UmVjdGFuZ2xlICpyZWN0cyk7CitzdGF0aWMgdm9pZCB2bmNIb29rc1BvbHlBcmMoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCBuYXJjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4QXJjICphcmNzKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzRmlsbFBvbHlnb24oRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCBzaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIGludCBjb3VudCwgRERYUG9pbnRQdHIgcHRzKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seUZpbGxSZWN0KERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgbnJlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFJlY3RhbmdsZSAqcmVjdHMpOworc3RhdGljIHZvaWQgdm5jSG9va3NQb2x5RmlsbEFyYyhEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5hcmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4QXJjICphcmNzKTsKK3N0YXRpYyBpbnQgdm5jSG9va3NQb2x5VGV4dDgoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBjaGFyICpjaGFycyk7CitzdGF0aWMgaW50IHZuY0hvb2tzUG9seVRleHQxNihEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB1bnNpZ25lZCBzaG9ydCAqY2hhcnMpOworc3RhdGljIHZvaWQgdm5jSG9va3NJbWFnZVRleHQ4KERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBjaGFyICpjaGFycyk7CitzdGF0aWMgdm9pZCB2bmNIb29rc0ltYWdlVGV4dDE2KERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdW5zaWduZWQgc2hvcnQgKmNoYXJzKTsKK3N0YXRpYyB2b2lkIHZuY0hvb2tzSW1hZ2VHbHlwaEJsdChEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksIHVuc2lnbmVkIGludCBuZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhckluZm9QdHIgKnBwY2ksIHBvaW50ZXIgcGdseXBoQmFzZSk7CitzdGF0aWMgdm9pZCB2bmNIb29rc1BvbHlHbHlwaEJsdChEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgdW5zaWduZWQgaW50IG5nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJJbmZvUHRyICpwcGNpLCBwb2ludGVyIHBnbHlwaEJhc2UpOworc3RhdGljIHZvaWQgdm5jSG9va3NQdXNoUGl4ZWxzKEdDUHRyIHBHQywgUGl4bWFwUHRyIHBCaXRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGVQdHIgcERyYXdhYmxlLCBpbnQgdywgaW50IGgsIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5KTsKKworc3RhdGljIEdDT3BzIHZuY0hvb2tzR0NPcHMgPSB7CisgIHZuY0hvb2tzRmlsbFNwYW5zLCB2bmNIb29rc1NldFNwYW5zLCB2bmNIb29rc1B1dEltYWdlLCB2bmNIb29rc0NvcHlBcmVhLAorICB2bmNIb29rc0NvcHlQbGFuZSwgdm5jSG9va3NQb2x5UG9pbnQsIHZuY0hvb2tzUG9seWxpbmVzLCB2bmNIb29rc1BvbHlTZWdtZW50LAorICB2bmNIb29rc1BvbHlSZWN0YW5nbGUsIHZuY0hvb2tzUG9seUFyYywgdm5jSG9va3NGaWxsUG9seWdvbiwKKyAgdm5jSG9va3NQb2x5RmlsbFJlY3QsIHZuY0hvb2tzUG9seUZpbGxBcmMsIHZuY0hvb2tzUG9seVRleHQ4LAorICB2bmNIb29rc1BvbHlUZXh0MTYsIHZuY0hvb2tzSW1hZ2VUZXh0OCwgdm5jSG9va3NJbWFnZVRleHQxNiwKKyAgdm5jSG9va3NJbWFnZUdseXBoQmx0LCB2bmNIb29rc1BvbHlHbHlwaEJsdCwgdm5jSG9va3NQdXNoUGl4ZWxzCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHZuY0hvb2tzSW5pdCgpIGlzIGNhbGxlZCBhdCBpbml0aWFsaXNhdGlvbiB0aW1lIGFuZCBldmVyeSB0aW1lIHRoZSBzZXJ2ZXIKKy8vIHJlc2V0cy4gIEl0IGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHNjcmVlbiwgYnV0IHRoZSBpbmRleGVzIGFyZSBvbmx5CisvLyBhbGxvY2F0ZWQgb25jZSBmb3IgZWFjaCBzZXJ2ZXIgZ2VuZXJhdGlvbi4KKworQm9vbCB2bmNIb29rc0luaXQoU2NyZWVuUHRyIHBTY3JlZW4sIFhzZXJ2ZXJEZXNrdG9wKiBkZXNrdG9wKQoreworICB2bmNIb29rc1NjcmVlblB0ciB2bmNIb29rc1NjcmVlbjsKKworICBpZiAodm5jSG9va3NHZW5lcmF0aW9uICE9IHNlcnZlckdlbmVyYXRpb24pIHsKKyAgICB2bmNIb29rc0dlbmVyYXRpb24gPSBzZXJ2ZXJHZW5lcmF0aW9uOworCisgICAgdm5jSG9va3NTY3JlZW5JbmRleCA9IEFsbG9jYXRlU2NyZWVuUHJpdmF0ZUluZGV4KCk7CisgICAgaWYgKHZuY0hvb2tzU2NyZWVuSW5kZXggPCAwKSB7CisgICAgICBFcnJvckYoInZuY0hvb2tzSW5pdDogQWxsb2NhdGVTY3JlZW5Qcml2YXRlSW5kZXggZmFpbGVkXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICB2bmNIb29rc0dDSW5kZXggPSBBbGxvY2F0ZUdDUHJpdmF0ZUluZGV4KCk7CisgICAgaWYgKHZuY0hvb2tzR0NJbmRleCA8IDApIHsKKyAgICAgIEVycm9yRigidm5jSG9va3NJbml0OiBBbGxvY2F0ZUdDUHJpdmF0ZUluZGV4IGZhaWxlZFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKCFBbGxvY2F0ZUdDUHJpdmF0ZShwU2NyZWVuLCB2bmNIb29rc0dDSW5kZXgsIHNpemVvZih2bmNIb29rc0dDUmVjKSkpIHsKKyAgICBFcnJvckYoInZuY0hvb2tzSW5pdDogQWxsb2NhdGVHQ1ByaXZhdGUgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB2bmNIb29rc1NjcmVlbiA9ICh2bmNIb29rc1NjcmVlblB0cil4bmZhbGxvYyhzaXplb2Yodm5jSG9va3NTY3JlZW5SZWMpKTsKKyAgcFNjcmVlbi0+ZGV2UHJpdmF0ZXNbdm5jSG9va3NTY3JlZW5JbmRleF0ucHRyID0gKHBvaW50ZXIpdm5jSG9va3NTY3JlZW47CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AgPSBkZXNrdG9wOworCisgIHZuY0hvb2tzU2NyZWVuLT5DbG9zZVNjcmVlbiA9IHBTY3JlZW4tPkNsb3NlU2NyZWVuOworICB2bmNIb29rc1NjcmVlbi0+Q3JlYXRlR0MgPSBwU2NyZWVuLT5DcmVhdGVHQzsKKyAgdm5jSG9va3NTY3JlZW4tPlBhaW50V2luZG93QmFja2dyb3VuZCA9IHBTY3JlZW4tPlBhaW50V2luZG93QmFja2dyb3VuZDsKKyAgdm5jSG9va3NTY3JlZW4tPlBhaW50V2luZG93Qm9yZGVyID0gcFNjcmVlbi0+UGFpbnRXaW5kb3dCb3JkZXI7CisgIHZuY0hvb2tzU2NyZWVuLT5Db3B5V2luZG93ID0gcFNjcmVlbi0+Q29weVdpbmRvdzsKKyAgdm5jSG9va3NTY3JlZW4tPkNsZWFyVG9CYWNrZ3JvdW5kID0gcFNjcmVlbi0+Q2xlYXJUb0JhY2tncm91bmQ7CisgIHZuY0hvb2tzU2NyZWVuLT5SZXN0b3JlQXJlYXMgPSBwU2NyZWVuLT5SZXN0b3JlQXJlYXM7CisgIHZuY0hvb2tzU2NyZWVuLT5JbnN0YWxsQ29sb3JtYXAgPSBwU2NyZWVuLT5JbnN0YWxsQ29sb3JtYXA7CisgIHZuY0hvb2tzU2NyZWVuLT5TdG9yZUNvbG9ycyA9IHBTY3JlZW4tPlN0b3JlQ29sb3JzOworICB2bmNIb29rc1NjcmVlbi0+RGlzcGxheUN1cnNvciA9IHBTY3JlZW4tPkRpc3BsYXlDdXJzb3I7CisgIHZuY0hvb2tzU2NyZWVuLT5CbG9ja0hhbmRsZXIgPSBwU2NyZWVuLT5CbG9ja0hhbmRsZXI7CisjaWZkZWYgUkVOREVSCisgIFBpY3R1cmVTY3JlZW5QdHIgcHM7CisgIHBzID0gR2V0UGljdHVyZVNjcmVlbklmU2V0KHBTY3JlZW4pOworICBpZiAocHMpIHsKKyAgICB2bmNIb29rc1NjcmVlbi0+Q29tcG9zaXRlID0gcHMtPkNvbXBvc2l0ZTsKKyAgfQorI2VuZGlmCisKKyAgcFNjcmVlbi0+Q2xvc2VTY3JlZW4gPSB2bmNIb29rc0Nsb3NlU2NyZWVuOworICBwU2NyZWVuLT5DcmVhdGVHQyA9IHZuY0hvb2tzQ3JlYXRlR0M7CisgIHBTY3JlZW4tPlBhaW50V2luZG93QmFja2dyb3VuZCA9IHZuY0hvb2tzUGFpbnRXaW5kb3dCYWNrZ3JvdW5kOworICBwU2NyZWVuLT5QYWludFdpbmRvd0JvcmRlciA9IHZuY0hvb2tzUGFpbnRXaW5kb3dCb3JkZXI7CisgIHBTY3JlZW4tPkNvcHlXaW5kb3cgPSB2bmNIb29rc0NvcHlXaW5kb3c7CisgIHBTY3JlZW4tPkNsZWFyVG9CYWNrZ3JvdW5kID0gdm5jSG9va3NDbGVhclRvQmFja2dyb3VuZDsKKyAgcFNjcmVlbi0+UmVzdG9yZUFyZWFzID0gdm5jSG9va3NSZXN0b3JlQXJlYXM7CisgIHBTY3JlZW4tPkluc3RhbGxDb2xvcm1hcCA9IHZuY0hvb2tzSW5zdGFsbENvbG9ybWFwOworICBwU2NyZWVuLT5TdG9yZUNvbG9ycyA9IHZuY0hvb2tzU3RvcmVDb2xvcnM7CisgIHBTY3JlZW4tPkRpc3BsYXlDdXJzb3IgPSB2bmNIb29rc0Rpc3BsYXlDdXJzb3I7CisgIHBTY3JlZW4tPkJsb2NrSGFuZGxlciA9IHZuY0hvb2tzQmxvY2tIYW5kbGVyOworI2lmZGVmIFJFTkRFUgorICBpZiAocHMpIHsKKyAgICBwcy0+Q29tcG9zaXRlID0gdm5jSG9va3NDb21wb3NpdGU7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBzY3JlZW4gZnVuY3Rpb25zCisvLworCisvLyBTQ1JFRU5fVU5XUkFQIGFuZCBTQ1JFRU5fUkVXUkFQIHVud3JhcCBhbmQgcmV3cmFwIHRoZSBnaXZlbiBzY3JlZW4gZnVuY3Rpb24uCisvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIGRvIHRoaXMgd2l0aCBhIEMrKyBjbGFzcywgYnV0IGVhY2ggZnVuY3Rpb24gaXMgb2YgYQorLy8gZGlzdGluY3QgdHlwZSwgc28gaXQgd291bGQgaGF2ZSB0byB1c2UgdGVtcGxhdGVzLCBhbmQgaXQncyBub3Qgd29ydGggdGhhdAorLy8gbXVjaCBwYWluLgorCisjZGVmaW5lIFNDUkVFTl9VTldSQVAoc2NybixmaWVsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU2NyZWVuUHRyIHBTY3JlZW4gPSBzY3JuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2bmNIb29rc1NjcmVlblB0ciB2bmNIb29rc1NjcmVlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPSAoKHZuY0hvb2tzU2NyZWVuUHRyKXBTY3JlZW4tPmRldlByaXZhdGVzW3ZuY0hvb2tzU2NyZWVuSW5kZXhdLnB0cik7IFwKKyAgcFNjcmVlbi0+ZmllbGQgPSB2bmNIb29rc1NjcmVlbi0+ZmllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQkdQUklOVCgoc3RkZXJyLCJ2bmNIb29rcyIgI2ZpZWxkICIgY2FsbGVkXG4iKSk7CisKKyNkZWZpbmUgU0NSRUVOX1JFV1JBUChmaWVsZCkgcFNjcmVlbi0+ZmllbGQgPSB2bmNIb29rcyMjZmllbGQ7CisKKworLy8gQ2xvc2VTY3JlZW4gLSB1bndyYXAgdGhlIHNjcmVlbiBmdW5jdGlvbnMgYW5kIGNhbGwgdGhlIG9yaWdpbmFsIENsb3NlU2NyZWVuCisvLyBmdW5jdGlvbgorCitzdGF0aWMgQm9vbCB2bmNIb29rc0Nsb3NlU2NyZWVuKGludCBpLCBTY3JlZW5QdHIgcFNjcmVlbl8pCit7CisgIFNDUkVFTl9VTldSQVAocFNjcmVlbl8sIENsb3NlU2NyZWVuKTsKKworICBwU2NyZWVuLT5DcmVhdGVHQyA9IHZuY0hvb2tzU2NyZWVuLT5DcmVhdGVHQzsKKyAgcFNjcmVlbi0+UGFpbnRXaW5kb3dCYWNrZ3JvdW5kID0gdm5jSG9va3NTY3JlZW4tPlBhaW50V2luZG93QmFja2dyb3VuZDsKKyAgcFNjcmVlbi0+UGFpbnRXaW5kb3dCb3JkZXIgPSB2bmNIb29rc1NjcmVlbi0+UGFpbnRXaW5kb3dCb3JkZXI7CisgIHBTY3JlZW4tPkNvcHlXaW5kb3cgPSB2bmNIb29rc1NjcmVlbi0+Q29weVdpbmRvdzsKKyAgcFNjcmVlbi0+Q2xlYXJUb0JhY2tncm91bmQgPSB2bmNIb29rc1NjcmVlbi0+Q2xlYXJUb0JhY2tncm91bmQ7CisgIHBTY3JlZW4tPlJlc3RvcmVBcmVhcyA9IHZuY0hvb2tzU2NyZWVuLT5SZXN0b3JlQXJlYXM7CisgIHBTY3JlZW4tPkluc3RhbGxDb2xvcm1hcCA9IHZuY0hvb2tzU2NyZWVuLT5JbnN0YWxsQ29sb3JtYXA7CisgIHBTY3JlZW4tPlN0b3JlQ29sb3JzID0gdm5jSG9va3NTY3JlZW4tPlN0b3JlQ29sb3JzOworICBwU2NyZWVuLT5EaXNwbGF5Q3Vyc29yID0gdm5jSG9va3NTY3JlZW4tPkRpc3BsYXlDdXJzb3I7CisgIHBTY3JlZW4tPkJsb2NrSGFuZGxlciA9IHZuY0hvb2tzU2NyZWVuLT5CbG9ja0hhbmRsZXI7CisKKyAgeGZyZWUoKHBvaW50ZXIpdm5jSG9va3NTY3JlZW4pOworCisgIERCR1BSSU5UKChzdGRlcnIsInZuY0hvb2tzQ2xvc2VTY3JlZW46IHVud3JhcHBlZCBzY3JlZW4gZnVuY3Rpb25zXG4iKSk7CisKKyAgcmV0dXJuICgqcFNjcmVlbi0+Q2xvc2VTY3JlZW4pKGksIHBTY3JlZW4pOworfQorCisvLyBDcmVhdGVHQyAtIHdyYXAgdGhlICJHQyBmdW5jcyIKKworc3RhdGljIEJvb2wgdm5jSG9va3NDcmVhdGVHQyhHQ1B0ciBwR0MpCit7CisgIFNDUkVFTl9VTldSQVAocEdDLT5wU2NyZWVuLCBDcmVhdGVHQyk7CisgICAgCisgIHZuY0hvb2tzR0NQdHIgdm5jSG9va3NHQworICAgID0gKHZuY0hvb2tzR0NQdHIpcEdDLT5kZXZQcml2YXRlc1t2bmNIb29rc0dDSW5kZXhdLnB0cjsKKworICBCb29sIHJldCA9ICgqcFNjcmVlbi0+Q3JlYXRlR0MpIChwR0MpOworCisgIHZuY0hvb2tzR0MtPndyYXBwZWRPcHMgPSAwOworICB2bmNIb29rc0dDLT53cmFwcGVkRnVuY3MgPSBwR0MtPmZ1bmNzOworICBwR0MtPmZ1bmNzID0gJnZuY0hvb2tzR0NGdW5jczsKKworICBTQ1JFRU5fUkVXUkFQKENyZWF0ZUdDKTsKKworICByZXR1cm4gcmV0OworfQorCisvLyBQYWludFdpbmRvd0JhY2tncm91bmQgLSBjaGFuZ2VkIHJlZ2lvbiBpcyB0aGUgZ2l2ZW4gcmVnaW9uCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUGFpbnRXaW5kb3dCYWNrZ3JvdW5kKFdpbmRvd1B0ciBwV2luLCBSZWdpb25QdHIgcFJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGF0KQoreworICBTQ1JFRU5fVU5XUkFQKHBXaW4tPmRyYXdhYmxlLnBTY3JlZW4sIFBhaW50V2luZG93QmFja2dyb3VuZCk7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgcFJlZ2lvbik7CisKKyAgKCpwU2NyZWVuLT5QYWludFdpbmRvd0JhY2tncm91bmQpIChwV2luLCBwUmVnaW9uLCB3aGF0KTsKKworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NoYW5nZWQoY2hhbmdlZC5yZWcpOworCisgIFNDUkVFTl9SRVdSQVAoUGFpbnRXaW5kb3dCYWNrZ3JvdW5kKTsKK30KKworLy8gUGFpbnRXaW5kb3dCb3JkZXIgLSBjaGFuZ2VkIHJlZ2lvbiBpcyB0aGUgZ2l2ZW4gcmVnaW9uCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUGFpbnRXaW5kb3dCb3JkZXIoV2luZG93UHRyIHBXaW4sIFJlZ2lvblB0ciBwUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCkKK3sKKyAgU0NSRUVOX1VOV1JBUChwV2luLT5kcmF3YWJsZS5wU2NyZWVuLCBQYWludFdpbmRvd0JvcmRlcik7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgcFJlZ2lvbik7CisKKyAgKCpwU2NyZWVuLT5QYWludFdpbmRvd0JvcmRlcikgKHBXaW4sIHBSZWdpb24sIHdoYXQpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7CisKKyAgU0NSRUVOX1JFV1JBUChQYWludFdpbmRvd0JvcmRlcik7Cit9CisKKy8vIENvcHlXaW5kb3cgLSBkZXN0aW5hdGlvbiBvZiB0aGUgY29weSBpcyB0aGUgb2xkIHJlZ2lvbiwgY2xpcHBlZCBieQorLy8gYm9yZGVyQ2xpcCwgdHJhbnNsYXRlZCBieSB0aGUgZGVsdGEuICBUaGlzIGNhbGwgb25seSBkb2VzIHRoZSBjb3B5IC0gaXQKKy8vIGRvZXNuJ3QgYWZmZWN0IGFueSBvdGhlciBiaXRzLgorCitzdGF0aWMgdm9pZCB2bmNIb29rc0NvcHlXaW5kb3coV2luZG93UHRyIHBXaW4sIEREWFBvaW50UmVjIHB0T2xkT3JnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvblB0ciBwT2xkUmVnaW9uKQoreworICBTQ1JFRU5fVU5XUkFQKHBXaW4tPmRyYXdhYmxlLnBTY3JlZW4sIENvcHlXaW5kb3cpOworCisgIFJlZ2lvbkhlbHBlciBjb3BpZWQocFNjcmVlbiwgcE9sZFJlZ2lvbik7CisgIGludCBkeCA9IHBXaW4tPmRyYXdhYmxlLnggLSBwdE9sZE9yZy54OworICBpbnQgZHkgPSBwV2luLT5kcmF3YWJsZS55IC0gcHRPbGRPcmcueTsKKyAgUkVHSU9OX1RSQU5TTEFURShwU2NyZWVuLCBjb3BpZWQucmVnLCBkeCwgZHkpOworICBSRUdJT05fSU5URVJTRUNUKHBXaW4tPmRyYXdhYmxlLnBTY3JlZW4sIGNvcGllZC5yZWcsIGNvcGllZC5yZWcsCisgICAgICAgICAgICAgICAgICAgJnBXaW4tPmJvcmRlckNsaXApOworCisgICgqcFNjcmVlbi0+Q29weVdpbmRvdykgKHBXaW4sIHB0T2xkT3JnLCBwT2xkUmVnaW9uKTsKKworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NvcGllZChjb3BpZWQucmVnLCBkeCwgZHkpOworCisgIFNDUkVFTl9SRVdSQVAoQ29weVdpbmRvdyk7Cit9CisKKy8vIENsZWFyVG9CYWNrZ3JvdW5kIC0gY2hhbmdlZCByZWdpb24gaXMgdGhlIGdpdmVuIHJlY3RhbmdsZSwgY2xpcHBlZCBieQorLy8gY2xpcExpc3QsIGJ1dCBvbmx5IGlmIGdlbmVyYXRlRXhwb3N1cmVzIGlzIGZhbHNlLgorCitzdGF0aWMgdm9pZCB2bmNIb29rc0NsZWFyVG9CYWNrZ3JvdW5kKFdpbmRvd1B0ciBwV2luLCBpbnQgeCwgaW50IHksIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgQm9vbCBnZW5lcmF0ZUV4cG9zdXJlcykKK3sKKyAgU0NSRUVOX1VOV1JBUChwV2luLT5kcmF3YWJsZS5wU2NyZWVuLCBDbGVhclRvQmFja2dyb3VuZCk7CisKKyAgQm94UmVjIGJveDsKKyAgYm94LngxID0geCArIHBXaW4tPmRyYXdhYmxlLng7CisgIGJveC55MSA9IHkgKyBwV2luLT5kcmF3YWJsZS55OworICBib3gueDIgPSB3ID8gKGJveC54MSArIHcpIDogKHBXaW4tPmRyYXdhYmxlLnggKyBwV2luLT5kcmF3YWJsZS53aWR0aCk7CisgIGJveC55MiA9IGggPyAoYm94LnkxICsgaCkgOiAocFdpbi0+ZHJhd2FibGUueSArIHBXaW4tPmRyYXdhYmxlLmhlaWdodCk7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgJmJveCwgMCk7CisKKyAgUkVHSU9OX0lOVEVSU0VDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgY2hhbmdlZC5yZWcsICZwV2luLT5jbGlwTGlzdCk7CisKKyAgKCpwU2NyZWVuLT5DbGVhclRvQmFja2dyb3VuZCkgKHBXaW4sIHgsIHksIHcsIGgsIGdlbmVyYXRlRXhwb3N1cmVzKTsKKworICBpZiAoIWdlbmVyYXRlRXhwb3N1cmVzKSB7CisgICAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKKyAgfQorCisgIFNDUkVFTl9SRVdSQVAoQ2xlYXJUb0JhY2tncm91bmQpOworfQorCisvLyBSZXN0b3JlQXJlYXMgLSBjaGFuZ2VkIHJlZ2lvbiBpcyB0aGUgZ2l2ZW4gcmVnaW9uCisKK3N0YXRpYyBSZWdpb25QdHIgdm5jSG9va3NSZXN0b3JlQXJlYXMoV2luZG93UHRyIHBXaW4sIFJlZ2lvblB0ciBwUmVnaW9uKQoreworICBTQ1JFRU5fVU5XUkFQKHBXaW4tPmRyYXdhYmxlLnBTY3JlZW4sIFJlc3RvcmVBcmVhcyk7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgcFJlZ2lvbik7CisKKyAgUmVnaW9uUHRyIHJlc3VsdCA9ICgqcFNjcmVlbi0+UmVzdG9yZUFyZWFzKSAocFdpbiwgcFJlZ2lvbik7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKKworICBTQ1JFRU5fUkVXUkFQKFJlc3RvcmVBcmVhcyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gSW5zdGFsbENvbG9ybWFwIC0gZ2V0IHRoZSBuZXcgY29sb3JtYXAKKworc3RhdGljIHZvaWQgdm5jSG9va3NJbnN0YWxsQ29sb3JtYXAoQ29sb3JtYXBQdHIgcENvbG9ybWFwKQoreworICBTQ1JFRU5fVU5XUkFQKHBDb2xvcm1hcC0+cFNjcmVlbiwgSW5zdGFsbENvbG9ybWFwKTsKKworICAoKnBTY3JlZW4tPkluc3RhbGxDb2xvcm1hcCkgKHBDb2xvcm1hcCk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPnNldENvbG9ybWFwKHBDb2xvcm1hcCk7CisKKyAgU0NSRUVOX1JFV1JBUChJbnN0YWxsQ29sb3JtYXApOworfQorCisvLyBTdG9yZUNvbG9ycyAtIGdldCB0aGUgY29sb3JtYXAgY2hhbmdlcworCitzdGF0aWMgdm9pZCB2bmNIb29rc1N0b3JlQ29sb3JzKENvbG9ybWFwUHRyIHBDb2xvcm1hcCwgaW50IG5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhDb2xvckl0ZW0qIHBkZWYpCit7CisgIFNDUkVFTl9VTldSQVAocENvbG9ybWFwLT5wU2NyZWVuLCBTdG9yZUNvbG9ycyk7CisKKyAgKCpwU2NyZWVuLT5TdG9yZUNvbG9ycykgKHBDb2xvcm1hcCwgbmRlZiwgcGRlZik7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPnNldENvbG91ck1hcEVudHJpZXMocENvbG9ybWFwLCBuZGVmLCBwZGVmKTsKKworICBTQ1JFRU5fUkVXUkFQKFN0b3JlQ29sb3JzKTsKK30KKworLy8gRGlzcGxheUN1cnNvciAtIGdldCB0aGUgY3Vyc29yIHNoYXBlCisKK3N0YXRpYyBCb29sIHZuY0hvb2tzRGlzcGxheUN1cnNvcihTY3JlZW5QdHIgcFNjcmVlbl8sIEN1cnNvclB0ciBjdXJzb3IpCit7CisgIFNDUkVFTl9VTldSQVAocFNjcmVlbl8sIERpc3BsYXlDdXJzb3IpOworCisgIEJvb2wgcmV0ID0gKCpwU2NyZWVuLT5EaXNwbGF5Q3Vyc29yKSAocFNjcmVlbiwgY3Vyc29yKTsKKworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+c2V0Q3Vyc29yKGN1cnNvcik7CisKKyAgU0NSRUVOX1JFV1JBUChEaXNwbGF5Q3Vyc29yKTsKKworICByZXR1cm4gcmV0OworfQorCisvLyBCbG9ja0hhbmRsZXIgLSBpZ25vcmUgYW55IGNoYW5nZXMgZHVyaW5nIHRoZSBibG9jayBoYW5kbGVyIC0gaXQncyBsaWtlbHkKKy8vIHRoZXNlIGFyZSBqdXN0IGRyYXdpbmcgdGhlIGN1cnNvci4KKworc3RhdGljIHZvaWQgdm5jSG9va3NCbG9ja0hhbmRsZXIoaW50IGksIHBvaW50ZXIgYmxvY2tEYXRhLCBwb2ludGVyIHBUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBwUmVhZG1hc2spCit7CisgIFNDUkVFTl9VTldSQVAoc2NyZWVuSW5mby5zY3JlZW5zW2ldLCBCbG9ja0hhbmRsZXIpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5pZ25vcmVIb29rcyh0cnVlKTsKKworICAoKnBTY3JlZW4tPkJsb2NrSGFuZGxlcikgKGksIGJsb2NrRGF0YSwgcFRpbWVvdXQsIHBSZWFkbWFzayk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmlnbm9yZUhvb2tzKGZhbHNlKTsKKworICBTQ1JFRU5fUkVXUkFQKEJsb2NrSGFuZGxlcik7Cit9CisKKy8vIENvbXBvc2l0ZSAtIG5lZWRlZCBmb3IgUkVOREVSCisKKyNpZmRlZiBSRU5ERVIKK3ZvaWQgdm5jSG9va3NDb21wb3NpdGUoQ0FSRDggb3AsIFBpY3R1cmVQdHIgcFNyYywgUGljdHVyZVB0ciBwTWFzaywgCisJCSAgICAgICBQaWN0dXJlUHRyIHBEc3QsIElOVDE2IHhTcmMsIElOVDE2IHlTcmMsIElOVDE2IHhNYXNrLCAKKwkJICAgICAgIElOVDE2IHlNYXNrLCBJTlQxNiB4RHN0LCBJTlQxNiB5RHN0LCBDQVJEMTYgd2lkdGgsIENBUkQxNiBoZWlnaHQpCit7CisgIFNjcmVlblB0ciBwU2NyZWVuID0gcERzdC0+cERyYXdhYmxlLT5wU2NyZWVuOworICB2bmNIb29rc1NjcmVlblB0ciB2bmNIb29rc1NjcmVlbiA9ICgodm5jSG9va3NTY3JlZW5QdHIpcFNjcmVlbi0+ZGV2UHJpdmF0ZXNbdm5jSG9va3NTY3JlZW5JbmRleF0ucHRyKTsgCisgIEJveFJlYyBib3g7CisgIFBpY3R1cmVTY3JlZW5QdHIgcHMgPSBHZXRQaWN0dXJlU2NyZWVuKHBTY3JlZW4pOworICByZmI6OlJlY3QgcmVjdDEsIHJlY3QyOworCisgIHJlY3QxLnNldFhZV0gocERzdC0+cERyYXdhYmxlLT54ICsgeERzdCwKKwkJcERzdC0+cERyYXdhYmxlLT55ICsgeURzdCwKKwkJd2lkdGgsCisJCWhlaWdodCk7CisgICAgICAKKyAgcmVjdDIgPSByZWN0MS5pbnRlcnNlY3Qodm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmdldFJlY3QoKSk7CisgIGlmICghcmVjdDIuaXNfZW1wdHkoKSkgeworICAgIGJveC54MSA9IHJlY3QyLnRsLng7CisgICAgYm94LnkxID0gcmVjdDIudGwueTsKKyAgICBib3gueDIgPSByZWN0Mi5ici54OworICAgIGJveC55MiA9IHJlY3QyLmJyLnk7CisgICAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgJmJveCwgMCk7CisgICAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKKyAgfQorCisgIHBzLT5Db21wb3NpdGUgPSB2bmNIb29rc1NjcmVlbi0+Q29tcG9zaXRlOworICAoKnBzLT5Db21wb3NpdGUpKG9wLCBwU3JjLCBwTWFzaywgcERzdCwgeFNyYywgeVNyYywKKwkJICAgeE1hc2ssIHlNYXNrLCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgcHMtPkNvbXBvc2l0ZSA9IHZuY0hvb2tzQ29tcG9zaXRlOworfQorCisjZW5kaWYgLyogUkVOREVSICovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBHQyAiZnVuY3MiCisvLworCisvLyBHQ0Z1bmNVbndyYXBwZXIgaXMgYSBoZWxwZXIgY2xhc3Mgd2hpY2ggdW53cmFwcyB0aGUgR0MgZnVuY3MgYW5kIG9wcyBpbiBpdHMKKy8vIGNvbnN0cnVjdG9yIGFuZCByZXdyYXBzIHRoZW0gaW4gaXRzIGRlc3RydWN0b3IuCisKK2NsYXNzIEdDRnVuY1Vud3JhcHBlciB7CitwdWJsaWM6CisgIEdDRnVuY1Vud3JhcHBlcihHQ1B0ciBwR0NfKSA6IHBHQyhwR0NfKSB7CisgICAgdm5jSG9va3NHQyA9ICh2bmNIb29rc0dDUHRyKXBHQy0+ZGV2UHJpdmF0ZXNbdm5jSG9va3NHQ0luZGV4XS5wdHI7CisgICAgcEdDLT5mdW5jcyA9IHZuY0hvb2tzR0MtPndyYXBwZWRGdW5jczsKKyAgICBpZiAodm5jSG9va3NHQy0+d3JhcHBlZE9wcykKKyAgICAgIHBHQy0+b3BzID0gdm5jSG9va3NHQy0+d3JhcHBlZE9wczsKKyAgfQorICB+R0NGdW5jVW53cmFwcGVyKCkgeworICAgIHZuY0hvb2tzR0MtPndyYXBwZWRGdW5jcyA9IHBHQy0+ZnVuY3M7CisgICAgcEdDLT5mdW5jcyA9ICZ2bmNIb29rc0dDRnVuY3M7CisgICAgaWYgKHZuY0hvb2tzR0MtPndyYXBwZWRPcHMpIHsKKyAgICAgIHZuY0hvb2tzR0MtPndyYXBwZWRPcHMgPSBwR0MtPm9wczsKKyAgICAgIHBHQy0+b3BzID0gJnZuY0hvb2tzR0NPcHM7CisgICAgfQorICB9CisgIEdDUHRyIHBHQzsKKyAgdm5jSG9va3NHQ1B0ciB2bmNIb29rc0dDOworfTsKKworCisvLyBWYWxpZGF0ZUdDIC0gd3JhcCB0aGUgIm9wcyIgaWYgYSB2aWV3YWJsZSB3aW5kb3cKKworc3RhdGljIHZvaWQgdm5jSG9va3NWYWxpZGF0ZUdDKEdDUHRyIHBHQywgdW5zaWduZWQgbG9uZyBjaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlUHRyIHBEcmF3YWJsZSkKK3sKKyAgR0NGdW5jVW53cmFwcGVyIHUocEdDKTsKKworICBEQkdQUklOVCgoc3RkZXJyLCJ2bmNIb29rc1ZhbGlkYXRlR0MgY2FsbGVkXG4iKSk7CisKKyAgKCpwR0MtPmZ1bmNzLT5WYWxpZGF0ZUdDKSAocEdDLCBjaGFuZ2VzLCBwRHJhd2FibGUpOworICAgIAorICB1LnZuY0hvb2tzR0MtPndyYXBwZWRPcHMgPSAwOworICBpZiAocERyYXdhYmxlLT50eXBlID09IERSQVdBQkxFX1dJTkRPVyAmJiAoKFdpbmRvd1B0cilwRHJhd2FibGUpLT52aWV3YWJsZSkgeworICAgIFdpbmRvd1B0ciBwV2luID0gKFdpbmRvd1B0cilwRHJhd2FibGU7CisgICAgUmVnaW9uUHRyIHBSZWdpb24gPSAmcFdpbi0+Y2xpcExpc3Q7CisKKyAgICBpZiAocEdDLT5zdWJXaW5kb3dNb2RlID09IEluY2x1ZGVJbmZlcmlvcnMpCisgICAgICBwUmVnaW9uID0gJnBXaW4tPmJvcmRlckNsaXA7CisgICAgaWYgKFJFR0lPTl9OT1RFTVBUWShwRHJhd2FibGUtPnBTY3JlZW4sIHBSZWdpb24pKSB7CisgICAgICB1LnZuY0hvb2tzR0MtPndyYXBwZWRPcHMgPSBwR0MtPm9wczsKKyAgICAgIERCR1BSSU5UKChzdGRlcnIsInZuY0hvb2tzVmFsaWRhdGVHQzogd3JhcHBlZCBHQyBvcHNcbiIpKTsKKyAgICB9CisgIH0KK30KKworLy8gT3RoZXIgR0MgZnVuY3MgLSBqdXN0IHVud3JhcCBhbmQgY2FsbCBvbgorCitzdGF0aWMgdm9pZCB2bmNIb29rc0NoYW5nZUdDKEdDUHRyIHBHQywgdW5zaWduZWQgbG9uZyBtYXNrKSB7CisgIEdDRnVuY1Vud3JhcHBlciB1KHBHQyk7CisgICgqcEdDLT5mdW5jcy0+Q2hhbmdlR0MpIChwR0MsIG1hc2spOworfQorc3RhdGljIHZvaWQgdm5jSG9va3NDb3B5R0MoR0NQdHIgc3JjLCB1bnNpZ25lZCBsb25nIG1hc2ssIEdDUHRyIGRzdCkgeworICBHQ0Z1bmNVbndyYXBwZXIgdShkc3QpOworICAoKmRzdC0+ZnVuY3MtPkNvcHlHQykgKHNyYywgbWFzaywgZHN0KTsKK30KK3N0YXRpYyB2b2lkIHZuY0hvb2tzRGVzdHJveUdDKEdDUHRyIHBHQykgeworICBHQ0Z1bmNVbndyYXBwZXIgdShwR0MpOworICAoKnBHQy0+ZnVuY3MtPkRlc3Ryb3lHQykgKHBHQyk7Cit9CitzdGF0aWMgdm9pZCB2bmNIb29rc0NoYW5nZUNsaXAoR0NQdHIgcEdDLCBpbnQgdHlwZSwgcG9pbnRlciBwVmFsdWUsIGludCBucmVjdHMpCit7CisgIEdDRnVuY1Vud3JhcHBlciB1KHBHQyk7CisgICgqcEdDLT5mdW5jcy0+Q2hhbmdlQ2xpcCkgKHBHQywgdHlwZSwgcFZhbHVlLCBucmVjdHMpOworfQorc3RhdGljIHZvaWQgdm5jSG9va3NEZXN0cm95Q2xpcChHQ1B0ciBwR0MpIHsKKyAgR0NGdW5jVW53cmFwcGVyIHUocEdDKTsKKyAgKCpwR0MtPmZ1bmNzLT5EZXN0cm95Q2xpcCkgKHBHQyk7Cit9CitzdGF0aWMgdm9pZCB2bmNIb29rc0NvcHlDbGlwKEdDUHRyIGRzdCwgR0NQdHIgc3JjKSB7CisgIEdDRnVuY1Vud3JhcHBlciB1KGRzdCk7CisgICgqZHN0LT5mdW5jcy0+Q29weUNsaXApIChkc3QsIHNyYyk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBHQyAib3BzIgorLy8KKworLy8gR0NPcFVud3JhcHBlciBpcyBhIGhlbHBlciBjbGFzcyB3aGljaCB1bndyYXBzIHRoZSBHQyBmdW5jcyBhbmQgb3BzIGluIGl0cworLy8gY29uc3RydWN0b3IgYW5kIHJld3JhcHMgdGhlbSBpbiBpdHMgZGVzdHJ1Y3Rvci4KKworY2xhc3MgR0NPcFVud3JhcHBlciB7CitwdWJsaWM6CisgIEdDT3BVbndyYXBwZXIoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0NfKQorICAgIDogcEdDKHBHQ18pLCBwU2NyZWVuKHBEcmF3YWJsZS0+cFNjcmVlbikKKyAgeworICAgIHZuY0hvb2tzR0MgPSAodm5jSG9va3NHQ1B0cilwR0MtPmRldlByaXZhdGVzW3ZuY0hvb2tzR0NJbmRleF0ucHRyOworICAgIG9sZEZ1bmNzID0gcEdDLT5mdW5jczsKKyAgICBwR0MtPmZ1bmNzID0gdm5jSG9va3NHQy0+d3JhcHBlZEZ1bmNzOworICAgIHBHQy0+b3BzID0gdm5jSG9va3NHQy0+d3JhcHBlZE9wczsKKyAgfQorICB+R0NPcFVud3JhcHBlcigpIHsKKyAgICB2bmNIb29rc0dDLT53cmFwcGVkT3BzID0gcEdDLT5vcHM7CisgICAgcEdDLT5mdW5jcyA9IG9sZEZ1bmNzOworICAgIHBHQy0+b3BzID0gJnZuY0hvb2tzR0NPcHM7CisgIH0KKyAgR0NQdHIgcEdDOworICB2bmNIb29rc0dDUHRyIHZuY0hvb2tzR0M7CisgIEdDRnVuY3MqIG9sZEZ1bmNzOworICBTY3JlZW5QdHIgcFNjcmVlbjsKK307CisKKyNkZWZpbmUgR0NfT1BfVU5XUkFQUEVSKHBEcmF3YWJsZSwgcEdDLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHQ09wVW53cmFwcGVyIHUocERyYXdhYmxlLCBwR0MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNjcmVlblB0ciBwU2NyZWVuID0gKHBEcmF3YWJsZSktPnBTY3JlZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm5jSG9va3NTY3JlZW5QdHIgdm5jSG9va3NTY3JlZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID0gKCh2bmNIb29rc1NjcmVlblB0cilwU2NyZWVuLT5kZXZQcml2YXRlc1t2bmNIb29rc1NjcmVlbkluZGV4XS5wdHIpOyBcCisgIERCR1BSSU5UKChzdGRlcnIsInZuY0hvb2tzIiAjbmFtZSAiIGNhbGxlZFxuIikpOworCisKKy8vIEZpbGxTcGFucyAtIGNoYW5nZWQgcmVnaW9uIGlzIHRoZSB3aG9sZSBvZiBib3JkZXJDbGlwLiAgVGhpcyBpcyBwZXNzaW1pc3RpYywKKy8vIGJ1dCBJIGJlbGlldmUgdGhpcyBmdW5jdGlvbiBpcyByYXJlbHkgdXNlZCBzbyBpdCBkb2Vzbid0IG1hdHRlci4KKworc3RhdGljIHZvaWQgdm5jSG9va3NGaWxsU3BhbnMoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCBuSW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREWFBvaW50UHRyIHBwdEluaXQsIGludCAqcHdpZHRoSW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmU29ydGVkKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIEZpbGxTcGFucyk7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgJigoV2luZG93UHRyKXBEcmF3YWJsZSktPmJvcmRlckNsaXApOworCisgICgqcEdDLT5vcHMtPkZpbGxTcGFucykgKHBEcmF3YWJsZSwgcEdDLCBuSW5pdCwgcHB0SW5pdCwgcHdpZHRoSW5pdCwgZlNvcnRlZCk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKK30KKworLy8gU2V0U3BhbnMgLSBjaGFuZ2VkIHJlZ2lvbiBpcyB0aGUgd2hvbGUgb2YgYm9yZGVyQ2xpcC4gIFRoaXMgaXMgcGVzc2ltaXN0aWMsCisvLyBidXQgSSBiZWxpZXZlIHRoaXMgZnVuY3Rpb24gaXMgcmFyZWx5IHVzZWQgc28gaXQgZG9lc24ndCBtYXR0ZXIuCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzU2V0U3BhbnMoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGNoYXIgKnBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREWFBvaW50UHRyIHBwdCwgaW50ICpwd2lkdGgsIGludCBuc3BhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmU29ydGVkKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIFNldFNwYW5zKTsKKworICBSZWdpb25IZWxwZXIgY2hhbmdlZChwU2NyZWVuLCAmKChXaW5kb3dQdHIpcERyYXdhYmxlKS0+Ym9yZGVyQ2xpcCk7CisKKyAgKCpwR0MtPm9wcy0+U2V0U3BhbnMpIChwRHJhd2FibGUsIHBHQywgcHNyYywgcHB0LCBwd2lkdGgsIG5zcGFucywgZlNvcnRlZCk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKK30KKworLy8gUHV0SW1hZ2UgLSBjaGFuZ2VkIHJlZ2lvbiBpcyB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLCBjbGlwcGVkIGJ5IHBDb21wb3NpdGVDbGlwCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUHV0SW1hZ2UoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBsZWZ0UGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LCBjaGFyICpwQml0cykKK3sKKyAgR0NfT1BfVU5XUkFQUEVSKHBEcmF3YWJsZSwgcEdDLCBQdXRJbWFnZSk7CisKKyAgQm94UmVjIGJveDsKKyAgYm94LngxID0geCArIHBEcmF3YWJsZS0+eDsKKyAgYm94LnkxID0geSArIHBEcmF3YWJsZS0+eTsKKyAgYm94LngyID0gYm94LngxICsgdzsKKyAgYm94LnkyID0gYm94LnkxICsgaDsKKworICBSZWdpb25IZWxwZXIgY2hhbmdlZChwU2NyZWVuLCAmYm94LCAwKTsKKworICBSRUdJT05fSU5URVJTRUNUKHBTY3JlZW4sIGNoYW5nZWQucmVnLCBjaGFuZ2VkLnJlZywgQ09NUE9TSVRFX0NMSVAocEdDKSk7CisKKyAgKCpwR0MtPm9wcy0+UHV0SW1hZ2UpIChwRHJhd2FibGUsIHBHQywgZGVwdGgsIHgsIHksIHcsIGgsIGxlZnRQYWQsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQml0cyk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKK30KKworLy8gQ29weUFyZWEgLSBkZXN0aW5hdGlvbiBvZiB0aGUgY29weSBpcyB0aGUgZGVzdCByZWN0YW5nbGUsIGNsaXBwZWQgYnkKKy8vIHBDb21wb3NpdGVDbGlwLiAgQW55IHBhcnRzIG9mIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBjYW5ub3QgYmUgY29waWVkIGZyb20KKy8vIHRoZSBzb3VyY2UgKGNvdWxkIGJlIGFsbCBvZiBpdCkgZ28gaW50byB0aGUgY2hhbmdlZCByZWdpb24uCisKK3N0YXRpYyBSZWdpb25QdHIgdm5jSG9va3NDb3B5QXJlYShEcmF3YWJsZVB0ciBwU3JjLCBEcmF3YWJsZVB0ciBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDUHRyIHBHQywgaW50IHNyY3gsIGludCBzcmN5LCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdHgsIGludCBkc3R5KQoreworICBHQ19PUF9VTldSQVBQRVIocERzdCwgcEdDLCBDb3B5QXJlYSk7CisKKyAgQm94UmVjIGJveDsKKyAgYm94LngxID0gZHN0eCArIHBEc3QtPng7CisgIGJveC55MSA9IGRzdHkgKyBwRHN0LT55OworICBib3gueDIgPSBib3gueDEgKyB3OworICBib3gueTIgPSBib3gueTEgKyBoOworCisgIFJlZ2lvbkhlbHBlciBkc3QocFNjcmVlbiwgJmJveCwgMCk7CisgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgZHN0LnJlZywgZHN0LnJlZywgQ09NUE9TSVRFX0NMSVAocEdDKSk7CisKKyAgUmVnaW9uSGVscGVyIHNyYyhwU2NyZWVuKTsKKworICBpZiAoKHBTcmMtPnR5cGUgPT0gRFJBV0FCTEVfV0lORE9XKSAmJiAocFNyYy0+cFNjcmVlbiA9PSBwU2NyZWVuKSkgeworICAgIGJveC54MSA9IHNyY3ggKyBwU3JjLT54OworICAgIGJveC55MSA9IHNyY3kgKyBwU3JjLT55OworICAgIGJveC54MiA9IGJveC54MSArIHc7CisgICAgYm94LnkyID0gYm94LnkxICsgaDsKKworICAgIHNyYy5pbml0KCZib3gsIDApOworICAgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgc3JjLnJlZywgc3JjLnJlZywgJigoV2luZG93UHRyKXBTcmMpLT5jbGlwTGlzdCk7CisgICAgUkVHSU9OX1RSQU5TTEFURShwU2NyZWVuLCBzcmMucmVnLAorICAgICAgICAgICAgICAgICAgICAgZHN0eCArIHBEc3QtPnggLSBzcmN4IC0gcFNyYy0+eCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdHkgKyBwRHN0LT55IC0gc3JjeSAtIHBTcmMtPnkpOworICB9IGVsc2UgeworICAgIHNyYy5pbml0KE51bGxCb3gsIDApOworICB9CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgTnVsbEJveCwgMCk7CisgIFJFR0lPTl9TVUJUUkFDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgZHN0LnJlZywgc3JjLnJlZyk7CisgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgZHN0LnJlZywgZHN0LnJlZywgc3JjLnJlZyk7CisKKyAgUmVnaW9uUHRyIHJnbiA9ICgqcEdDLT5vcHMtPkNvcHlBcmVhKSAocFNyYywgcERzdCwgcEdDLCBzcmN4LCBzcmN5LCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3R4LCBkc3R5KTsKKworICBpZiAoUkVHSU9OX05PVEVNUFRZKHBTY3JlZW4sIGRzdC5yZWcpKQorICAgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY29waWVkKGRzdC5yZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0eCArIHBEc3QtPnggLSBzcmN4IC0gcFNyYy0+eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3R5ICsgcERzdC0+eSAtIHNyY3kgLSBwU3JjLT55KTsKKworICBpZiAoUkVHSU9OX05PVEVNUFRZKHBTY3JlZW4sIGNoYW5nZWQucmVnKSkKKyAgICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NoYW5nZWQoY2hhbmdlZC5yZWcpOworCisgIHJldHVybiByZ247Cit9CisKKworLy8gQ29weVBsYW5lIC0gY2hhbmdlZCByZWdpb24gaXMgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSwgY2xpcHBlZCBieQorLy8gcENvbXBvc2l0ZUNsaXAKKworc3RhdGljIFJlZ2lvblB0ciB2bmNIb29rc0NvcHlQbGFuZShEcmF3YWJsZVB0ciBwU3JjLCBEcmF3YWJsZVB0ciBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ1B0ciBwR0MsIGludCBzcmN4LCBpbnQgc3JjeSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0eCwgaW50IGRzdHksIHVuc2lnbmVkIGxvbmcgcGxhbmUpCit7CisgIEdDX09QX1VOV1JBUFBFUihwRHN0LCBwR0MsIENvcHlQbGFuZSk7CisKKyAgQm94UmVjIGJveDsKKyAgYm94LngxID0gZHN0eCArIHBEc3QtPng7CisgIGJveC55MSA9IGRzdHkgKyBwRHN0LT55OworICBib3gueDIgPSBib3gueDEgKyB3OworICBib3gueTIgPSBib3gueTEgKyBoOworCisgIFJlZ2lvbkhlbHBlciBjaGFuZ2VkKHBTY3JlZW4sICZib3gsIDApOworCisgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgY2hhbmdlZC5yZWcsIGNoYW5nZWQucmVnLCBDT01QT1NJVEVfQ0xJUChwR0MpKTsKKworICBSZWdpb25QdHIgcmduID0gKCpwR0MtPm9wcy0+Q29weVBsYW5lKSAocFNyYywgcERzdCwgcEdDLCBzcmN4LCBzcmN5LCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0eCwgZHN0eSwgcGxhbmUpOworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NoYW5nZWQoY2hhbmdlZC5yZWcpOworCisgIHJldHVybiByZ247Cit9CisKKy8vIFBvbHlQb2ludCAtIGNoYW5nZWQgcmVnaW9uIGlzIHRoZSBib3VuZGluZyByZWN0LCBjbGlwcGVkIGJ5IHBDb21wb3NpdGVDbGlwCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seVBvaW50KERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucHQsIHhQb2ludCAqcHRzKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIFBvbHlQb2ludCk7CisKKyAgaWYgKG5wdCA9PSAwKSB7CisgICAgKCpwR0MtPm9wcy0+UG9seVBvaW50KSAocERyYXdhYmxlLCBwR0MsIG1vZGUsIG5wdCwgcHRzKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgbWluWCA9IHB0c1swXS54OworICBpbnQgbWF4WCA9IHB0c1swXS54OworICBpbnQgbWluWSA9IHB0c1swXS55OworICBpbnQgbWF4WSA9IHB0c1swXS55OworCisgIGlmIChtb2RlID09IENvb3JkTW9kZVByZXZpb3VzKSB7CisgICAgaW50IHggPSBwdHNbMF0ueDsKKyAgICBpbnQgeSA9IHB0c1swXS55OworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBucHQ7IGkrKykgeworICAgICAgeCArPSBwdHNbaV0ueDsKKyAgICAgIHkgKz0gcHRzW2ldLnk7CisgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4OworICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDsKKyAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7CisgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG5wdDsgaSsrKSB7CisgICAgICBpZiAocHRzW2ldLnggPCBtaW5YKSBtaW5YID0gcHRzW2ldLng7CisgICAgICBpZiAocHRzW2ldLnggPiBtYXhYKSBtYXhYID0gcHRzW2ldLng7CisgICAgICBpZiAocHRzW2ldLnkgPCBtaW5ZKSBtaW5ZID0gcHRzW2ldLnk7CisgICAgICBpZiAocHRzW2ldLnkgPiBtYXhZKSBtYXhZID0gcHRzW2ldLnk7CisgICAgfQorICB9CisKKyAgQm94UmVjIGJveDsKKyAgYm94LngxID0gbWluWCArIHBEcmF3YWJsZS0+eDsKKyAgYm94LnkxID0gbWluWSArIHBEcmF3YWJsZS0+eTsKKyAgYm94LngyID0gbWF4WCArIDEgKyBwRHJhd2FibGUtPng7CisgIGJveC55MiA9IG1heFkgKyAxICsgcERyYXdhYmxlLT55OworCisgIFJlZ2lvbkhlbHBlciBjaGFuZ2VkKHBTY3JlZW4sICZib3gsIDApOworCisgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgY2hhbmdlZC5yZWcsIGNoYW5nZWQucmVnLCBDT01QT1NJVEVfQ0xJUChwR0MpKTsKKworICAoKnBHQy0+b3BzLT5Qb2x5UG9pbnQpIChwRHJhd2FibGUsIHBHQywgbW9kZSwgbnB0LCBwdHMpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7Cit9CisKKy8vIFBvbHlsaW5lcyAtIGNoYW5nZWQgcmVnaW9uIGlzIHRoZSB1bmlvbiBvZiB0aGUgYm91bmRpbmcgcmVjdHMgb2YgZWFjaCBsaW5lLAorLy8gY2xpcHBlZCBieSBwQ29tcG9zaXRlQ2xpcC4gIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gTUFYX1JFQ1RTX1BFUl9PUCBsaW5lcywKKy8vIGp1c3QgdXNlIHRoZSBib3VuZGluZyByZWN0IG9mIGFsbCB0aGUgbGluZXMuCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seWxpbmVzKERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucHQsIEREWFBvaW50UHRyIHBwdHMpCit7CisgIEdDX09QX1VOV1JBUFBFUihwRHJhd2FibGUsIHBHQywgUG9seWxpbmVzKTsKKworICBpZiAobnB0ID09IDApIHsKKyAgICAoKnBHQy0+b3BzLT5Qb2x5bGluZXMpIChwRHJhd2FibGUsIHBHQywgbW9kZSwgbnB0LCBwcHRzKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgblJlZ1JlY3RzID0gbnB0IC0gMTsKKyAgeFJlY3RhbmdsZSByZWdSZWN0c1tNQVhfUkVDVFNfUEVSX09QXTsKKworICBpbnQgbHcgPSBwR0MtPmxpbmVXaWR0aDsKKyAgaWYgKGx3ID09IDApIGx3ID0gMTsKKworICBpZiAobnB0ID09IDEpCisgIHsKKyAgICAvLyBhIHNpbmdsZSBwb2ludAorICAgIG5SZWdSZWN0cyA9IDE7CisgICAgcmVnUmVjdHNbMF0ueCA9IHBEcmF3YWJsZS0+eCArIHBwdHNbMF0ueCAtIGx3OworICAgIHJlZ1JlY3RzWzBdLnkgPSBwRHJhd2FibGUtPnkgKyBwcHRzWzBdLnkgLSBsdzsKKyAgICByZWdSZWN0c1swXS53aWR0aCA9IDIqbHc7CisgICAgcmVnUmVjdHNbMF0uaGVpZ2h0ID0gMipsdzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKgorICAgICAqIG1pdGVyZWQgam9pbnMgY2FuIHByb2plY3QgcXVpdGUgYSB3YXkgZnJvbQorICAgICAqIHRoZSBsaW5lIGVuZDsgdGhlIDExIGRlZ3JlZSBtaXRlciBsaW1pdCBsaW1pdHMKKyAgICAgKiB0aGlzIGV4dGVuc2lvbiB0byBsdyAvICgyICogdGFuKDExLzIpKSwgcm91bmRlZCB1cAorICAgICAqIGFuZCBjb252ZXJ0ZWQgdG8gaW50IHlpZWxkcyA2ICogbHcKKyAgICAgKi8KKworICAgIGludCBleHRyYSA9IGx3IC8gMjsKKyAgICBpZiAocEdDLT5qb2luU3R5bGUgPT0gSm9pbk1pdGVyKSB7CisgICAgICBleHRyYSA9IDYgKiBsdzsKKyAgICB9CisKKyAgICBpbnQgcHJldlgsIHByZXZZLCBjdXJYLCBjdXJZOworICAgIGludCByZWN0WDEsIHJlY3RZMSwgcmVjdFgyLCByZWN0WTI7CisgICAgaW50IG1pblgsIG1pblksIG1heFgsIG1heFk7CisKKyAgICBwcmV2WCA9IHBwdHNbMF0ueCArIHBEcmF3YWJsZS0+eDsKKyAgICBwcmV2WSA9IHBwdHNbMF0ueSArIHBEcmF3YWJsZS0+eTsKKyAgICBtaW5YID0gbWF4WCA9IHByZXZYOworICAgIG1pblkgPSBtYXhZID0gcHJldlk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5SZWdSZWN0czsgaSsrKSB7CisgICAgICBpZiAobW9kZSA9PSBDb29yZE1vZGVPcmlnaW4pIHsKKyAgICAgICAgY3VyWCA9IHBEcmF3YWJsZS0+eCArIHBwdHNbaSsxXS54OworICAgICAgICBjdXJZID0gcERyYXdhYmxlLT55ICsgcHB0c1tpKzFdLnk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJYID0gcHJldlggKyBwcHRzW2krMV0ueDsKKyAgICAgICAgY3VyWSA9IHByZXZZICsgcHB0c1tpKzFdLnk7CisgICAgICB9CisKKyAgICAgIGlmIChwcmV2WCA+IGN1clgpIHsKKyAgICAgICAgcmVjdFgxID0gY3VyWCAtIGV4dHJhOworICAgICAgICByZWN0WDIgPSBwcmV2WCArIGV4dHJhICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlY3RYMSA9IHByZXZYIC0gZXh0cmE7CisgICAgICAgIHJlY3RYMiA9IGN1clggKyBleHRyYSArIDE7CisgICAgICB9CisKKyAgICAgIGlmIChwcmV2WSA+IGN1clkpIHsKKyAgICAgICAgcmVjdFkxID0gY3VyWSAtIGV4dHJhOworICAgICAgICByZWN0WTIgPSBwcmV2WSArIGV4dHJhICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlY3RZMSA9IHByZXZZIC0gZXh0cmE7CisgICAgICAgIHJlY3RZMiA9IGN1clkgKyBleHRyYSArIDE7CisgICAgICB9CisKKyAgICAgIGlmIChuUmVnUmVjdHMgPD0gTUFYX1JFQ1RTX1BFUl9PUCkgeworICAgICAgICByZWdSZWN0c1tpXS54ID0gcmVjdFgxOworICAgICAgICByZWdSZWN0c1tpXS55ID0gcmVjdFkxOworICAgICAgICByZWdSZWN0c1tpXS53aWR0aCA9IHJlY3RYMiAtIHJlY3RYMTsKKyAgICAgICAgcmVnUmVjdHNbaV0uaGVpZ2h0ID0gcmVjdFkyIC0gcmVjdFkxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlY3RYMSA8IG1pblgpIG1pblggPSByZWN0WDE7CisgICAgICAgIGlmIChyZWN0WTEgPCBtaW5ZKSBtaW5ZID0gcmVjdFkxOworICAgICAgICBpZiAocmVjdFgyID4gbWF4WCkgbWF4WCA9IHJlY3RYMjsKKyAgICAgICAgaWYgKHJlY3RZMiA+IG1heFkpIG1heFkgPSByZWN0WTI7CisgICAgICB9CisKKyAgICAgIHByZXZYID0gY3VyWDsKKyAgICAgIHByZXZZID0gY3VyWTsKKyAgICB9CisKKyAgICBpZiAoblJlZ1JlY3RzID4gTUFYX1JFQ1RTX1BFUl9PUCkgeworICAgICAgcmVnUmVjdHNbMF0ueCA9IG1pblg7CisgICAgICByZWdSZWN0c1swXS55ID0gbWluWTsKKyAgICAgIHJlZ1JlY3RzWzBdLndpZHRoID0gbWF4WCAtIG1pblg7CisgICAgICByZWdSZWN0c1swXS5oZWlnaHQgPSBtYXhZIC0gbWluWTsKKyAgICAgIG5SZWdSZWN0cyA9IDE7CisgICAgfQorICB9CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgblJlZ1JlY3RzLCByZWdSZWN0cyk7CisKKyAgUkVHSU9OX0lOVEVSU0VDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgY2hhbmdlZC5yZWcsIENPTVBPU0lURV9DTElQKHBHQykpOworCisgICgqcEdDLT5vcHMtPlBvbHlsaW5lcykgKHBEcmF3YWJsZSwgcEdDLCBtb2RlLCBucHQsIHBwdHMpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7Cit9CisKKy8vIFBvbHlTZWdtZW50IC0gY2hhbmdlZCByZWdpb24gaXMgdGhlIHVuaW9uIG9mIHRoZSBib3VuZGluZyByZWN0cyBvZiBlYWNoCisvLyBzZWdtZW50LCBjbGlwcGVkIGJ5IHBDb21wb3NpdGVDbGlwLiAgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBNQVhfUkVDVFNfUEVSX09QCisvLyBzZWdtZW50cywganVzdCB1c2UgdGhlIGJvdW5kaW5nIHJlY3Qgb2YgYWxsIHRoZSBzZWdtZW50cy4KKworc3RhdGljIHZvaWQgdm5jSG9va3NQb2x5U2VnbWVudChEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5zZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTZWdtZW50ICpzZWdzKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIFBvbHlTZWdtZW50KTsKKworICBpZiAobnNlZyA9PSAwKSB7CisgICAgKCpwR0MtPm9wcy0+UG9seVNlZ21lbnQpIChwRHJhd2FibGUsIHBHQywgbnNlZywgc2Vncyk7CisgICAgcmV0dXJuOworICB9CisKKyAgeFJlY3RhbmdsZSByZWdSZWN0c1tNQVhfUkVDVFNfUEVSX09QXTsKKyAgaW50IG5SZWdSZWN0cyA9IG5zZWc7CisKKyAgaW50IGx3ID0gcEdDLT5saW5lV2lkdGg7CisgIGludCBleHRyYSA9IGx3IC8gMjsKKworICBpbnQgcmVjdFgxLCByZWN0WTEsIHJlY3RYMiwgcmVjdFkyOworICBpbnQgbWluWCwgbWluWSwgbWF4WCwgbWF4WTsKKworICBtaW5YID0gbWF4WCA9IHNlZ3NbMF0ueDE7CisgIG1pblkgPSBtYXhZID0gc2Vnc1swXS55MTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5zZWc7IGkrKykgeworICAgIGlmIChzZWdzW2ldLngxID4gc2Vnc1tpXS54MikgeworICAgICAgcmVjdFgxID0gcERyYXdhYmxlLT54ICsgc2Vnc1tpXS54MiAtIGV4dHJhOworICAgICAgcmVjdFgyID0gcERyYXdhYmxlLT54ICsgc2Vnc1tpXS54MSArIGV4dHJhICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgcmVjdFgxID0gcERyYXdhYmxlLT54ICsgc2Vnc1tpXS54MSAtIGV4dHJhOworICAgICAgcmVjdFgyID0gcERyYXdhYmxlLT54ICsgc2Vnc1tpXS54MiArIGV4dHJhICsgMTsKKyAgICB9CisKKyAgICBpZiAoc2Vnc1tpXS55MSA+IHNlZ3NbaV0ueTIpIHsKKyAgICAgIHJlY3RZMSA9IHBEcmF3YWJsZS0+eSArIHNlZ3NbaV0ueTIgLSBleHRyYTsKKyAgICAgIHJlY3RZMiA9IHBEcmF3YWJsZS0+eSArIHNlZ3NbaV0ueTEgKyBleHRyYSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlY3RZMSA9IHBEcmF3YWJsZS0+eSArIHNlZ3NbaV0ueTEgLSBleHRyYTsKKyAgICAgIHJlY3RZMiA9IHBEcmF3YWJsZS0+eSArIHNlZ3NbaV0ueTIgKyBleHRyYSArIDE7CisgICAgfQorCisgICAgaWYgKG5zZWcgPD0gTUFYX1JFQ1RTX1BFUl9PUCkgeworICAgICAgcmVnUmVjdHNbaV0ueCA9IHJlY3RYMTsKKyAgICAgIHJlZ1JlY3RzW2ldLnkgPSByZWN0WTE7CisgICAgICByZWdSZWN0c1tpXS53aWR0aCA9IHJlY3RYMiAtIHJlY3RYMTsKKyAgICAgIHJlZ1JlY3RzW2ldLmhlaWdodCA9IHJlY3RZMiAtIHJlY3RZMTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlY3RYMSA8IG1pblgpIG1pblggPSByZWN0WDE7CisgICAgICBpZiAocmVjdFkxIDwgbWluWSkgbWluWSA9IHJlY3RZMTsKKyAgICAgIGlmIChyZWN0WDIgPiBtYXhYKSBtYXhYID0gcmVjdFgyOworICAgICAgaWYgKHJlY3RZMiA+IG1heFkpIG1heFkgPSByZWN0WTI7CisgICAgfQorICB9CisKKyAgaWYgKG5zZWcgPiBNQVhfUkVDVFNfUEVSX09QKSB7CisgICAgcmVnUmVjdHNbMF0ueCA9IG1pblg7CisgICAgcmVnUmVjdHNbMF0ueSA9IG1pblk7CisgICAgcmVnUmVjdHNbMF0ud2lkdGggPSBtYXhYIC0gbWluWDsKKyAgICByZWdSZWN0c1swXS5oZWlnaHQgPSBtYXhZIC0gbWluWTsKKyAgICBuUmVnUmVjdHMgPSAxOworICB9CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgblJlZ1JlY3RzLCByZWdSZWN0cyk7CisKKyAgUkVHSU9OX0lOVEVSU0VDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgY2hhbmdlZC5yZWcsIENPTVBPU0lURV9DTElQKHBHQykpOworCisgICgqcEdDLT5vcHMtPlBvbHlTZWdtZW50KSAocERyYXdhYmxlLCBwR0MsIG5zZWcsIHNlZ3MpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7Cit9CisKKy8vIFBvbHlSZWN0YW5nbGUgLSBjaGFuZ2VkIHJlZ2lvbiBpcyB0aGUgdW5pb24gb2YgdGhlIGJvdW5kaW5nIHJlY3RzIGFyb3VuZAorLy8gZWFjaCBzaWRlIG9mIHRoZSBvdXRsaW5lIHJlY3RhbmdsZXMsIGNsaXBwZWQgYnkgcENvbXBvc2l0ZUNsaXAuICBJZiB0aGVyZQorLy8gYXJlIG1vcmUgdGhhbiBNQVhfUkVDVFNfUEVSX09QIHJlY3RhbmdsZXMsIGp1c3QgdXNlIHRoZSBib3VuZGluZyByZWN0IG9mIGFsbAorLy8gdGhlIHJlY3RhbmdsZXMuCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seVJlY3RhbmdsZShEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5yZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4UmVjdGFuZ2xlICpyZWN0cykKK3sKKyAgR0NfT1BfVU5XUkFQUEVSKHBEcmF3YWJsZSwgcEdDLCBQb2x5UmVjdGFuZ2xlKTsKKworICBpZiAobnJlY3RzID09IDApIHsKKyAgICAoKnBHQy0+b3BzLT5Qb2x5UmVjdGFuZ2xlKSAocERyYXdhYmxlLCBwR0MsIG5yZWN0cywgcmVjdHMpOworICAgIHJldHVybjsKKyAgfQorCisgIHhSZWN0YW5nbGUgcmVnUmVjdHNbTUFYX1JFQ1RTX1BFUl9PUCo0XTsKKyAgaW50IG5SZWdSZWN0cyA9IG5yZWN0cyAqIDQ7CisKKyAgaW50IGx3ID0gcEdDLT5saW5lV2lkdGg7CisgIGludCBleHRyYSA9IGx3IC8gMjsKKworICBpbnQgcmVjdFgxLCByZWN0WTEsIHJlY3RYMiwgcmVjdFkyOworICBpbnQgbWluWCwgbWluWSwgbWF4WCwgbWF4WTsKKworICBtaW5YID0gbWF4WCA9IHJlY3RzWzBdLng7CisgIG1pblkgPSBtYXhZID0gcmVjdHNbMF0ueTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5yZWN0czsgaSsrKSB7CisgICAgaWYgKG5yZWN0cyA8PSBNQVhfUkVDVFNfUEVSX09QKSB7CisgICAgICByZWdSZWN0c1tpKjRdLnggPSByZWN0c1tpXS54IC0gZXh0cmEgKyBwRHJhd2FibGUtPng7CisgICAgICByZWdSZWN0c1tpKjRdLnkgPSByZWN0c1tpXS55IC0gZXh0cmEgKyBwRHJhd2FibGUtPnk7CisgICAgICByZWdSZWN0c1tpKjRdLndpZHRoID0gcmVjdHNbaV0ud2lkdGggKyAxICsgMiAqIGV4dHJhOworICAgICAgcmVnUmVjdHNbaSo0XS5oZWlnaHQgPSAxICsgMiAqIGV4dHJhOworCisgICAgICByZWdSZWN0c1tpKjQrMV0ueCA9IHJlY3RzW2ldLnggLSBleHRyYSArIHBEcmF3YWJsZS0+eDsKKyAgICAgIHJlZ1JlY3RzW2kqNCsxXS55ID0gcmVjdHNbaV0ueSAtIGV4dHJhICsgcERyYXdhYmxlLT55OworICAgICAgcmVnUmVjdHNbaSo0KzFdLndpZHRoID0gMSArIDIgKiBleHRyYTsKKyAgICAgIHJlZ1JlY3RzW2kqNCsxXS5oZWlnaHQgPSByZWN0c1tpXS5oZWlnaHQgKyAxICsgMiAqIGV4dHJhOworCisgICAgICByZWdSZWN0c1tpKjQrMl0ueCA9IHJlY3RzW2ldLnggKyByZWN0c1tpXS53aWR0aCAtIGV4dHJhICsgcERyYXdhYmxlLT54OworICAgICAgcmVnUmVjdHNbaSo0KzJdLnkgPSByZWN0c1tpXS55IC0gZXh0cmEgKyBwRHJhd2FibGUtPnk7CisgICAgICByZWdSZWN0c1tpKjQrMl0ud2lkdGggPSAxICsgMiAqIGV4dHJhOworICAgICAgcmVnUmVjdHNbaSo0KzJdLmhlaWdodCA9IHJlY3RzW2ldLmhlaWdodCArIDEgKyAyICogZXh0cmE7CisKKyAgICAgIHJlZ1JlY3RzW2kqNCszXS54ID0gcmVjdHNbaV0ueCAtIGV4dHJhICsgcERyYXdhYmxlLT54OworICAgICAgcmVnUmVjdHNbaSo0KzNdLnkgPSByZWN0c1tpXS55ICsgcmVjdHNbaV0uaGVpZ2h0IC0gZXh0cmEgKyBwRHJhd2FibGUtPnk7CisgICAgICByZWdSZWN0c1tpKjQrM10ud2lkdGggPSByZWN0c1tpXS53aWR0aCArIDEgKyAyICogZXh0cmE7CisgICAgICByZWdSZWN0c1tpKjQrM10uaGVpZ2h0ID0gMSArIDIgKiBleHRyYTsKKyAgICB9IGVsc2UgeworICAgICAgcmVjdFgxID0gcERyYXdhYmxlLT54ICsgcmVjdHNbaV0ueCAtIGV4dHJhOworICAgICAgcmVjdFkxID0gcERyYXdhYmxlLT55ICsgcmVjdHNbaV0ueSAtIGV4dHJhOworICAgICAgcmVjdFgyID0gcERyYXdhYmxlLT54ICsgcmVjdHNbaV0ueCArIHJlY3RzW2ldLndpZHRoICsgZXh0cmErMTsKKyAgICAgIHJlY3RZMiA9IHBEcmF3YWJsZS0+eSArIHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oZWlnaHQgKyBleHRyYSsxOworICAgICAgaWYgKHJlY3RYMSA8IG1pblgpIG1pblggPSByZWN0WDE7CisgICAgICBpZiAocmVjdFkxIDwgbWluWSkgbWluWSA9IHJlY3RZMTsKKyAgICAgIGlmIChyZWN0WDIgPiBtYXhYKSBtYXhYID0gcmVjdFgyOworICAgICAgaWYgKHJlY3RZMiA+IG1heFkpIG1heFkgPSByZWN0WTI7CisgICAgfQorICB9CisKKyAgaWYgKG5yZWN0cyA+IE1BWF9SRUNUU19QRVJfT1ApIHsKKyAgICByZWdSZWN0c1swXS54ID0gbWluWDsKKyAgICByZWdSZWN0c1swXS55ID0gbWluWTsKKyAgICByZWdSZWN0c1swXS53aWR0aCA9IG1heFggLSBtaW5YOworICAgIHJlZ1JlY3RzWzBdLmhlaWdodCA9IG1heFkgLSBtaW5ZOworICAgIG5SZWdSZWN0cyA9IDE7CisgIH0KKworICBSZWdpb25IZWxwZXIgY2hhbmdlZChwU2NyZWVuLCBuUmVnUmVjdHMsIHJlZ1JlY3RzKTsKKworICBSRUdJT05fSU5URVJTRUNUKHBTY3JlZW4sIGNoYW5nZWQucmVnLCBjaGFuZ2VkLnJlZywgQ09NUE9TSVRFX0NMSVAocEdDKSk7CisKKyAgKCpwR0MtPm9wcy0+UG9seVJlY3RhbmdsZSkgKHBEcmF3YWJsZSwgcEdDLCBucmVjdHMsIHJlY3RzKTsKKworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NoYW5nZWQoY2hhbmdlZC5yZWcpOworfQorCisvLyBQb2x5QXJjIC0gY2hhbmdlZCByZWdpb24gaXMgdGhlIHVuaW9uIG9mIGJvdW5kaW5nIHJlY3RzIGFyb3VuZCBlYWNoIGFyYywKKy8vIGNsaXBwZWQgYnkgcENvbXBvc2l0ZUNsaXAuICBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIE1BWF9SRUNUU19QRVJfT1AKKy8vIGFyY3MsIGp1c3QgdXNlIHRoZSBib3VuZGluZyByZWN0IG9mIGFsbCB0aGUgYXJjcy4KKworc3RhdGljIHZvaWQgdm5jSG9va3NQb2x5QXJjKERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgbmFyY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEFyYyAqYXJjcykKK3sKKyAgR0NfT1BfVU5XUkFQUEVSKHBEcmF3YWJsZSwgcEdDLCBQb2x5QXJjKTsKKworICBpZiAobmFyY3MgPT0gMCkgeworICAgICgqcEdDLT5vcHMtPlBvbHlBcmMpIChwRHJhd2FibGUsIHBHQywgbmFyY3MsIGFyY3MpOworICAgIHJldHVybjsKKyAgfQorCisgIHhSZWN0YW5nbGUgcmVnUmVjdHNbTUFYX1JFQ1RTX1BFUl9PUF07CisgIGludCBuUmVnUmVjdHMgPSBuYXJjczsKKworICBpbnQgbHcgPSBwR0MtPmxpbmVXaWR0aDsKKyAgaWYgKGx3ID09IDApIGx3ID0gMTsKKyAgaW50IGV4dHJhID0gbHcgLyAyOworCisgIGludCByZWN0WDEsIHJlY3RZMSwgcmVjdFgyLCByZWN0WTI7CisgIGludCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZOworCisgIG1pblggPSBtYXhYID0gYXJjc1swXS54OworICBtaW5ZID0gbWF4WSA9IGFyY3NbMF0ueTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5hcmNzOyBpKyspIHsKKyAgICBpZiAobmFyY3MgPD0gTUFYX1JFQ1RTX1BFUl9PUCkgeworICAgICAgcmVnUmVjdHNbaV0ueCA9IGFyY3NbaV0ueCAtIGV4dHJhICsgcERyYXdhYmxlLT54OworICAgICAgcmVnUmVjdHNbaV0ueSA9IGFyY3NbaV0ueSAtIGV4dHJhICsgcERyYXdhYmxlLT55OworICAgICAgcmVnUmVjdHNbaV0ud2lkdGggPSBhcmNzW2ldLndpZHRoICsgbHc7CisgICAgICByZWdSZWN0c1tpXS5oZWlnaHQgPSBhcmNzW2ldLmhlaWdodCArIGx3OworICAgIH0gZWxzZSB7CisgICAgICByZWN0WDEgPSBwRHJhd2FibGUtPnggKyBhcmNzW2ldLnggLSBleHRyYTsKKyAgICAgIHJlY3RZMSA9IHBEcmF3YWJsZS0+eSArIGFyY3NbaV0ueSAtIGV4dHJhOworICAgICAgcmVjdFgyID0gcERyYXdhYmxlLT54ICsgYXJjc1tpXS54ICsgYXJjc1tpXS53aWR0aCArIGx3OworICAgICAgcmVjdFkyID0gcERyYXdhYmxlLT55ICsgYXJjc1tpXS55ICsgYXJjc1tpXS5oZWlnaHQgKyBsdzsKKyAgICAgIGlmIChyZWN0WDEgPCBtaW5YKSBtaW5YID0gcmVjdFgxOworICAgICAgaWYgKHJlY3RZMSA8IG1pblkpIG1pblkgPSByZWN0WTE7CisgICAgICBpZiAocmVjdFgyID4gbWF4WCkgbWF4WCA9IHJlY3RYMjsKKyAgICAgIGlmIChyZWN0WTIgPiBtYXhZKSBtYXhZID0gcmVjdFkyOworICAgIH0KKyAgfQorCisgIGlmIChuYXJjcyA+IE1BWF9SRUNUU19QRVJfT1ApIHsKKyAgICByZWdSZWN0c1swXS54ID0gbWluWDsKKyAgICByZWdSZWN0c1swXS55ID0gbWluWTsKKyAgICByZWdSZWN0c1swXS53aWR0aCA9IG1heFggLSBtaW5YOworICAgIHJlZ1JlY3RzWzBdLmhlaWdodCA9IG1heFkgLSBtaW5ZOworICAgIG5SZWdSZWN0cyA9IDE7CisgIH0KKworICBSZWdpb25IZWxwZXIgY2hhbmdlZChwU2NyZWVuLCBuUmVnUmVjdHMsIHJlZ1JlY3RzKTsKKworICBSRUdJT05fSU5URVJTRUNUKHBTY3JlZW4sIGNoYW5nZWQucmVnLCBjaGFuZ2VkLnJlZywgQ09NUE9TSVRFX0NMSVAocEdDKSk7CisKKyAgKCpwR0MtPm9wcy0+UG9seUFyYykgKHBEcmF3YWJsZSwgcEdDLCBuYXJjcywgYXJjcyk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKK30KKworCisvLyBGaWxsUG9seWdvbiAtIGNoYW5nZWQgcmVnaW9uIGlzIHRoZSBib3VuZGluZyByZWN0IGFyb3VuZCB0aGUgcG9seWdvbiwKKy8vIGNsaXBwZWQgYnkgcENvbXBvc2l0ZUNsaXAKKworc3RhdGljIHZvaWQgdm5jSG9va3NGaWxsUG9seWdvbihEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IHNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50IGNvdW50LCBERFhQb2ludFB0ciBwdHMpCit7CisgIEdDX09QX1VOV1JBUFBFUihwRHJhd2FibGUsIHBHQywgRmlsbFBvbHlnb24pOworCisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgKCpwR0MtPm9wcy0+RmlsbFBvbHlnb24pIChwRHJhd2FibGUsIHBHQywgc2hhcGUsIG1vZGUsIGNvdW50LCBwdHMpOworICAgIHJldHVybjsKKyAgfQorCisgIGludCBtaW5YID0gcHRzWzBdLng7CisgIGludCBtYXhYID0gcHRzWzBdLng7CisgIGludCBtaW5ZID0gcHRzWzBdLnk7CisgIGludCBtYXhZID0gcHRzWzBdLnk7CisKKyAgaWYgKG1vZGUgPT0gQ29vcmRNb2RlUHJldmlvdXMpIHsKKyAgICBpbnQgeCA9IHB0c1swXS54OworICAgIGludCB5ID0gcHRzWzBdLnk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIHggKz0gcHRzW2ldLng7CisgICAgICB5ICs9IHB0c1tpXS55OworICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDsKKyAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7CisgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5OworICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBpZiAocHRzW2ldLnggPCBtaW5YKSBtaW5YID0gcHRzW2ldLng7CisgICAgICBpZiAocHRzW2ldLnggPiBtYXhYKSBtYXhYID0gcHRzW2ldLng7CisgICAgICBpZiAocHRzW2ldLnkgPCBtaW5ZKSBtaW5ZID0gcHRzW2ldLnk7CisgICAgICBpZiAocHRzW2ldLnkgPiBtYXhZKSBtYXhZID0gcHRzW2ldLnk7CisgICAgfQorICB9CisKKyAgQm94UmVjIGJveDsKKyAgYm94LngxID0gbWluWCArIHBEcmF3YWJsZS0+eDsKKyAgYm94LnkxID0gbWluWSArIHBEcmF3YWJsZS0+eTsKKyAgYm94LngyID0gbWF4WCArIDEgKyBwRHJhd2FibGUtPng7CisgIGJveC55MiA9IG1heFkgKyAxICsgcERyYXdhYmxlLT55OworCisgIFJlZ2lvbkhlbHBlciBjaGFuZ2VkKHBTY3JlZW4sICZib3gsIDApOworCisgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgY2hhbmdlZC5yZWcsIGNoYW5nZWQucmVnLCBDT01QT1NJVEVfQ0xJUChwR0MpKTsKKworICAoKnBHQy0+b3BzLT5GaWxsUG9seWdvbikgKHBEcmF3YWJsZSwgcEdDLCBzaGFwZSwgbW9kZSwgY291bnQsIHB0cyk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKK30KKworLy8gUG9seUZpbGxSZWN0IC0gY2hhbmdlZCByZWdpb24gaXMgdGhlIHVuaW9uIG9mIHRoZSByZWN0YW5nbGVzLCBjbGlwcGVkIGJ5CisvLyBwQ29tcG9zaXRlQ2xpcC4gIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gTUFYX1JFQ1RTX1BFUl9PUCByZWN0YW5nbGVzLCBqdXN0CisvLyB1c2UgdGhlIGJvdW5kaW5nIHJlY3Qgb2YgYWxsIHRoZSByZWN0YW5nbGVzLgorCitzdGF0aWMgdm9pZCB2bmNIb29rc1BvbHlGaWxsUmVjdChEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5yZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhSZWN0YW5nbGUgKnJlY3RzKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIFBvbHlGaWxsUmVjdCk7CisKKyAgaWYgKG5yZWN0cyA9PSAwKSB7CisgICAgKCpwR0MtPm9wcy0+UG9seUZpbGxSZWN0KSAocERyYXdhYmxlLCBwR0MsIG5yZWN0cywgcmVjdHMpOworICAgIHJldHVybjsKKyAgfQorCisgIHhSZWN0YW5nbGUgcmVnUmVjdHNbTUFYX1JFQ1RTX1BFUl9PUF07CisgIGludCBuUmVnUmVjdHMgPSBucmVjdHM7CisgIGludCByZWN0WDEsIHJlY3RZMSwgcmVjdFgyLCByZWN0WTI7CisgIGludCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZOworICBtaW5YID0gbWF4WCA9IHJlY3RzWzBdLng7CisgIG1pblkgPSBtYXhZID0gcmVjdHNbMF0ueTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5yZWN0czsgaSsrKSB7CisgICAgaWYgKG5yZWN0cyA8PSBNQVhfUkVDVFNfUEVSX09QKSB7CisgICAgICByZWdSZWN0c1tpXS54ID0gcmVjdHNbaV0ueCArIHBEcmF3YWJsZS0+eDsKKyAgICAgIHJlZ1JlY3RzW2ldLnkgPSByZWN0c1tpXS55ICsgcERyYXdhYmxlLT55OworICAgICAgcmVnUmVjdHNbaV0ud2lkdGggPSByZWN0c1tpXS53aWR0aDsKKyAgICAgIHJlZ1JlY3RzW2ldLmhlaWdodCA9IHJlY3RzW2ldLmhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgcmVjdFgxID0gcERyYXdhYmxlLT54ICsgcmVjdHNbaV0ueDsKKyAgICAgIHJlY3RZMSA9IHBEcmF3YWJsZS0+eSArIHJlY3RzW2ldLnk7CisgICAgICByZWN0WDIgPSBwRHJhd2FibGUtPnggKyByZWN0c1tpXS54ICsgcmVjdHNbaV0ud2lkdGg7CisgICAgICByZWN0WTIgPSBwRHJhd2FibGUtPnkgKyByZWN0c1tpXS55ICsgcmVjdHNbaV0uaGVpZ2h0OworICAgICAgaWYgKHJlY3RYMSA8IG1pblgpIG1pblggPSByZWN0WDE7CisgICAgICBpZiAocmVjdFkxIDwgbWluWSkgbWluWSA9IHJlY3RZMTsKKyAgICAgIGlmIChyZWN0WDIgPiBtYXhYKSBtYXhYID0gcmVjdFgyOworICAgICAgaWYgKHJlY3RZMiA+IG1heFkpIG1heFkgPSByZWN0WTI7CisgICAgfQorICB9CisKKyAgaWYgKG5yZWN0cyA+IE1BWF9SRUNUU19QRVJfT1ApIHsKKyAgICByZWdSZWN0c1swXS54ID0gbWluWDsKKyAgICByZWdSZWN0c1swXS55ID0gbWluWTsKKyAgICByZWdSZWN0c1swXS53aWR0aCA9IG1heFggLSBtaW5YOworICAgIHJlZ1JlY3RzWzBdLmhlaWdodCA9IG1heFkgLSBtaW5ZOworICAgIG5SZWdSZWN0cyA9IDE7CisgIH0KKworICBSZWdpb25IZWxwZXIgY2hhbmdlZChwU2NyZWVuLCBuUmVnUmVjdHMsIHJlZ1JlY3RzKTsKKworICBSRUdJT05fSU5URVJTRUNUKHBTY3JlZW4sIGNoYW5nZWQucmVnLCBjaGFuZ2VkLnJlZywgQ09NUE9TSVRFX0NMSVAocEdDKSk7CisKKyAgKCpwR0MtPm9wcy0+UG9seUZpbGxSZWN0KSAocERyYXdhYmxlLCBwR0MsIG5yZWN0cywgcmVjdHMpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7Cit9CisKKy8vIFBvbHlGaWxsQXJjIC0gY2hhbmdlZCByZWdpb24gaXMgdGhlIHVuaW9uIG9mIGJvdW5kaW5nIHJlY3RzIGFyb3VuZCBlYWNoIGFyYywKKy8vIGNsaXBwZWQgYnkgcENvbXBvc2l0ZUNsaXAuICBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIE1BWF9SRUNUU19QRVJfT1AgYXJjcywKKy8vIGp1c3QgdXNlIHRoZSBib3VuZGluZyByZWN0IG9mIGFsbCB0aGUgYXJjcy4KKworc3RhdGljIHZvaWQgdm5jSG9va3NQb2x5RmlsbEFyYyhEcmF3YWJsZVB0ciBwRHJhd2FibGUsIEdDUHRyIHBHQywgaW50IG5hcmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4QXJjICphcmNzKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIFBvbHlGaWxsQXJjKTsKKworICBpZiAobmFyY3MgPT0gMCkgeworICAgICgqcEdDLT5vcHMtPlBvbHlGaWxsQXJjKSAocERyYXdhYmxlLCBwR0MsIG5hcmNzLCBhcmNzKTsKKyAgICByZXR1cm47CisgIH0KKworICB4UmVjdGFuZ2xlIHJlZ1JlY3RzW01BWF9SRUNUU19QRVJfT1BdOworICBpbnQgblJlZ1JlY3RzID0gbmFyY3M7CisKKyAgaW50IGx3ID0gcEdDLT5saW5lV2lkdGg7CisgIGlmIChsdyA9PSAwKSBsdyA9IDE7CisgIGludCBleHRyYSA9IGx3IC8gMjsKKworICBpbnQgcmVjdFgxLCByZWN0WTEsIHJlY3RYMiwgcmVjdFkyOworICBpbnQgbWluWCwgbWluWSwgbWF4WCwgbWF4WTsKKworICBtaW5YID0gbWF4WCA9IGFyY3NbMF0ueDsKKyAgbWluWSA9IG1heFkgPSBhcmNzWzBdLnk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYXJjczsgaSsrKSB7CisgICAgaWYgKG5hcmNzIDw9IE1BWF9SRUNUU19QRVJfT1ApIHsKKyAgICAgIHJlZ1JlY3RzW2ldLnggPSBhcmNzW2ldLnggLSBleHRyYSArIHBEcmF3YWJsZS0+eDsKKyAgICAgIHJlZ1JlY3RzW2ldLnkgPSBhcmNzW2ldLnkgLSBleHRyYSArIHBEcmF3YWJsZS0+eTsKKyAgICAgIHJlZ1JlY3RzW2ldLndpZHRoID0gYXJjc1tpXS53aWR0aCArIGx3OworICAgICAgcmVnUmVjdHNbaV0uaGVpZ2h0ID0gYXJjc1tpXS5oZWlnaHQgKyBsdzsKKyAgICB9IGVsc2UgeworICAgICAgcmVjdFgxID0gcERyYXdhYmxlLT54ICsgYXJjc1tpXS54IC0gZXh0cmE7CisgICAgICByZWN0WTEgPSBwRHJhd2FibGUtPnkgKyBhcmNzW2ldLnkgLSBleHRyYTsKKyAgICAgIHJlY3RYMiA9IHBEcmF3YWJsZS0+eCArIGFyY3NbaV0ueCArIGFyY3NbaV0ud2lkdGggKyBsdzsKKyAgICAgIHJlY3RZMiA9IHBEcmF3YWJsZS0+eSArIGFyY3NbaV0ueSArIGFyY3NbaV0uaGVpZ2h0ICsgbHc7CisgICAgICBpZiAocmVjdFgxIDwgbWluWCkgbWluWCA9IHJlY3RYMTsKKyAgICAgIGlmIChyZWN0WTEgPCBtaW5ZKSBtaW5ZID0gcmVjdFkxOworICAgICAgaWYgKHJlY3RYMiA+IG1heFgpIG1heFggPSByZWN0WDI7CisgICAgICBpZiAocmVjdFkyID4gbWF4WSkgbWF4WSA9IHJlY3RZMjsKKyAgICB9CisgIH0KKworICBpZiAobmFyY3MgPiBNQVhfUkVDVFNfUEVSX09QKSB7CisgICAgcmVnUmVjdHNbMF0ueCA9IG1pblg7CisgICAgcmVnUmVjdHNbMF0ueSA9IG1pblk7CisgICAgcmVnUmVjdHNbMF0ud2lkdGggPSBtYXhYIC0gbWluWDsKKyAgICByZWdSZWN0c1swXS5oZWlnaHQgPSBtYXhZIC0gbWluWTsKKyAgICBuUmVnUmVjdHMgPSAxOworICB9CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgblJlZ1JlY3RzLCByZWdSZWN0cyk7CisKKyAgUkVHSU9OX0lOVEVSU0VDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgY2hhbmdlZC5yZWcsIENPTVBPU0lURV9DTElQKHBHQykpOworCisgICgqcEdDLT5vcHMtPlBvbHlGaWxsQXJjKSAocERyYXdhYmxlLCBwR0MsIG5hcmNzLCBhcmNzKTsKKworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NoYW5nZWQoY2hhbmdlZC5yZWcpOworfQorCisvLyBHZXRUZXh0Qm91bmRpbmdSZWN0IC0gY2FsY3VsYXRlIGEgYm91bmRpbmcgcmVjdGFuZ2xlIGFyb3VuZCBuIGNoYXJzIG9mIGEKKy8vIGZvbnQuICBOb3QgcGFydGljdWxhcmx5IGFjY3VyYXRlLCBidXQgZ29vZCBlbm91Z2guCisKK3N0YXRpYyB2b2lkIEdldFRleHRCb3VuZGluZ1JlY3QoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBGb250UHRyIGZvbnQsIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgaW50IG5jaGFycywgQm94UHRyIGJveCkKK3sKKyAgaW50IGFzY2VudCA9IF9fcmZibWF4KEZPTlRBU0NFTlQoZm9udCksIEZPTlRNQVhCT1VORFMoZm9udCwgYXNjZW50KSk7CisgIGludCBkZXNjZW50ID0gX19yZmJtYXgoRk9OVERFU0NFTlQoZm9udCksIEZPTlRNQVhCT1VORFMoZm9udCwgZGVzY2VudCkpOworICBpbnQgY2hhcldpZHRoID0gX19yZmJtYXgoRk9OVE1BWEJPVU5EUyhmb250LHJpZ2h0U2lkZUJlYXJpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9OVE1BWEJPVU5EUyhmb250LGNoYXJhY3RlcldpZHRoKSk7CisKKyAgYm94LT54MSA9IHBEcmF3YWJsZS0+eCArIHg7CisgIGJveC0+eTEgPSBwRHJhd2FibGUtPnkgKyB5IC0gYXNjZW50OworICBib3gtPngyID0gYm94LT54MSArIGNoYXJXaWR0aCAqIG5jaGFyczsKKyAgYm94LT55MiA9IGJveC0+eTEgKyBhc2NlbnQgKyBkZXNjZW50OworCisgIGlmIChGT05UTUlOQk9VTkRTKGZvbnQsbGVmdFNpZGVCZWFyaW5nKSA8IDApCisgICAgYm94LT54MSArPSBGT05UTUlOQk9VTkRTKGZvbnQsbGVmdFNpZGVCZWFyaW5nKTsKK30KKworLy8gUG9seVRleHQ4IC0gY2hhbmdlZCByZWdpb24gaXMgYm91bmRpbmcgcmVjdCBhcm91bmQgY291bnQgY2hhcnMsIGNsaXBwZWQgYnkKKy8vIHBDb21wb3NpdGVDbGlwCisKK3N0YXRpYyBpbnQgdm5jSG9va3NQb2x5VGV4dDgoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBjaGFyICpjaGFycykKK3sKKyAgR0NfT1BfVU5XUkFQUEVSKHBEcmF3YWJsZSwgcEdDLCBQb2x5VGV4dDgpOworCisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybiAoKnBHQy0+b3BzLT5Qb2x5VGV4dDgpIChwRHJhd2FibGUsIHBHQywgeCwgeSwgY291bnQsIGNoYXJzKTsKKworICBCb3hSZWMgYm94OworICBHZXRUZXh0Qm91bmRpbmdSZWN0KHBEcmF3YWJsZSwgcEdDLT5mb250LCB4LCB5LCBjb3VudCwgJmJveCk7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgJmJveCwgMCk7CisKKyAgUkVHSU9OX0lOVEVSU0VDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgY2hhbmdlZC5yZWcsIENPTVBPU0lURV9DTElQKHBHQykpOworCisgIGludCByZXQgPSAoKnBHQy0+b3BzLT5Qb2x5VGV4dDgpIChwRHJhd2FibGUsIHBHQywgeCwgeSwgY291bnQsIGNoYXJzKTsKKworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NoYW5nZWQoY2hhbmdlZC5yZWcpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8vIFBvbHlUZXh0MTYgLSBjaGFuZ2VkIHJlZ2lvbiBpcyBib3VuZGluZyByZWN0IGFyb3VuZCBjb3VudCBjaGFycywgY2xpcHBlZCBieQorLy8gcENvbXBvc2l0ZUNsaXAKKworc3RhdGljIGludCB2bmNIb29rc1BvbHlUZXh0MTYoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdW5zaWduZWQgc2hvcnQgKmNoYXJzKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIFBvbHlUZXh0MTYpOworCisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybiAoKnBHQy0+b3BzLT5Qb2x5VGV4dDE2KSAocERyYXdhYmxlLCBwR0MsIHgsIHksIGNvdW50LCBjaGFycyk7CisKKyAgQm94UmVjIGJveDsKKyAgR2V0VGV4dEJvdW5kaW5nUmVjdChwRHJhd2FibGUsIHBHQy0+Zm9udCwgeCwgeSwgY291bnQsICZib3gpOworCisgIFJlZ2lvbkhlbHBlciBjaGFuZ2VkKHBTY3JlZW4sICZib3gsIDApOworCisgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgY2hhbmdlZC5yZWcsIGNoYW5nZWQucmVnLCBDT01QT1NJVEVfQ0xJUChwR0MpKTsKKworICBpbnQgcmV0ID0gKCpwR0MtPm9wcy0+UG9seVRleHQxNikgKHBEcmF3YWJsZSwgcEdDLCB4LCB5LCBjb3VudCwgY2hhcnMpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLy8gSW1hZ2VUZXh0OCAtIGNoYW5nZWQgcmVnaW9uIGlzIGJvdW5kaW5nIHJlY3QgYXJvdW5kIGNvdW50IGNoYXJzLCBjbGlwcGVkIGJ5CisvLyBwQ29tcG9zaXRlQ2xpcAorCitzdGF0aWMgdm9pZCB2bmNIb29rc0ltYWdlVGV4dDgoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGNoYXIgKmNoYXJzKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIEltYWdlVGV4dDgpOworCisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgKCpwR0MtPm9wcy0+SW1hZ2VUZXh0OCkgKHBEcmF3YWJsZSwgcEdDLCB4LCB5LCBjb3VudCwgY2hhcnMpOworICAgIHJldHVybjsKKyAgfQorCisgIEJveFJlYyBib3g7CisgIEdldFRleHRCb3VuZGluZ1JlY3QocERyYXdhYmxlLCBwR0MtPmZvbnQsIHgsIHksIGNvdW50LCAmYm94KTsKKworICBSZWdpb25IZWxwZXIgY2hhbmdlZChwU2NyZWVuLCAmYm94LCAwKTsKKworICBSRUdJT05fSU5URVJTRUNUKHBTY3JlZW4sIGNoYW5nZWQucmVnLCBjaGFuZ2VkLnJlZywgQ09NUE9TSVRFX0NMSVAocEdDKSk7CisKKyAgKCpwR0MtPm9wcy0+SW1hZ2VUZXh0OCkgKHBEcmF3YWJsZSwgcEdDLCB4LCB5LCBjb3VudCwgY2hhcnMpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7Cit9CisKKy8vIEltYWdlVGV4dDE2IC0gY2hhbmdlZCByZWdpb24gaXMgYm91bmRpbmcgcmVjdCBhcm91bmQgY291bnQgY2hhcnMsIGNsaXBwZWQgYnkKKy8vIHBDb21wb3NpdGVDbGlwCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzSW1hZ2VUZXh0MTYoRHJhd2FibGVQdHIgcERyYXdhYmxlLCBHQ1B0ciBwR0MsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB1bnNpZ25lZCBzaG9ydCAqY2hhcnMpCit7CisgIEdDX09QX1VOV1JBUFBFUihwRHJhd2FibGUsIHBHQywgSW1hZ2VUZXh0MTYpOworCisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgKCpwR0MtPm9wcy0+SW1hZ2VUZXh0MTYpIChwRHJhd2FibGUsIHBHQywgeCwgeSwgY291bnQsIGNoYXJzKTsKKyAgICByZXR1cm47CisgIH0KKworICBCb3hSZWMgYm94OworICBHZXRUZXh0Qm91bmRpbmdSZWN0KHBEcmF3YWJsZSwgcEdDLT5mb250LCB4LCB5LCBjb3VudCwgJmJveCk7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgJmJveCwgMCk7CisKKyAgUkVHSU9OX0lOVEVSU0VDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgY2hhbmdlZC5yZWcsIENPTVBPU0lURV9DTElQKHBHQykpOworCisgICgqcEdDLT5vcHMtPkltYWdlVGV4dDE2KSAocERyYXdhYmxlLCBwR0MsIHgsIHksIGNvdW50LCBjaGFycyk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKK30KKworLy8gSW1hZ2VHbHlwaEJsdCAtIGNoYW5nZWQgcmVnaW9uIGlzIGJvdW5kaW5nIHJlY3QgYXJvdW5kIG5nbHlwaCBjaGFycywgY2xpcHBlZAorLy8gYnkgcENvbXBvc2l0ZUNsaXAKKworc3RhdGljIHZvaWQgdm5jSG9va3NJbWFnZUdseXBoQmx0KERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgdW5zaWduZWQgaW50IG5nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFySW5mb1B0ciAqcHBjaSwgcG9pbnRlciBwZ2x5cGhCYXNlKQoreworICBHQ19PUF9VTldSQVBQRVIocERyYXdhYmxlLCBwR0MsIEltYWdlR2x5cGhCbHQpOworCisgIGlmIChuZ2x5cGggPT0gMCkgeworICAgICgqcEdDLT5vcHMtPkltYWdlR2x5cGhCbHQpIChwRHJhd2FibGUsIHBHQywgeCwgeSwgbmdseXBoLCBwcGNpLHBnbHlwaEJhc2UpOworICAgIHJldHVybjsKKyAgfQorCisgIEJveFJlYyBib3g7CisgIEdldFRleHRCb3VuZGluZ1JlY3QocERyYXdhYmxlLCBwR0MtPmZvbnQsIHgsIHksIG5nbHlwaCwgJmJveCk7CisKKyAgUmVnaW9uSGVscGVyIGNoYW5nZWQocFNjcmVlbiwgJmJveCwgMCk7CisKKyAgUkVHSU9OX0lOVEVSU0VDVChwU2NyZWVuLCBjaGFuZ2VkLnJlZywgY2hhbmdlZC5yZWcsIENPTVBPU0lURV9DTElQKHBHQykpOworCisgICgqcEdDLT5vcHMtPkltYWdlR2x5cGhCbHQpIChwRHJhd2FibGUsIHBHQywgeCwgeSwgbmdseXBoLCBwcGNpLCBwZ2x5cGhCYXNlKTsKKworICB2bmNIb29rc1NjcmVlbi0+ZGVza3RvcC0+YWRkX2NoYW5nZWQoY2hhbmdlZC5yZWcpOworfQorCisvLyBQb2x5R2x5cGhCbHQgLSBjaGFuZ2VkIHJlZ2lvbiBpcyBib3VuZGluZyByZWN0IGFyb3VuZCBuZ2x5cGggY2hhcnMsIGNsaXBwZWQKKy8vIGJ5IHBDb21wb3NpdGVDbGlwCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUG9seUdseXBoQmx0KERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgR0NQdHIgcEdDLCBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCB1bnNpZ25lZCBpbnQgbmdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhckluZm9QdHIgKnBwY2ksIHBvaW50ZXIgcGdseXBoQmFzZSkKK3sKKyAgR0NfT1BfVU5XUkFQUEVSKHBEcmF3YWJsZSwgcEdDLCBQb2x5R2x5cGhCbHQpOworCisgIGlmIChuZ2x5cGggPT0gMCkgeworICAgICgqcEdDLT5vcHMtPlBvbHlHbHlwaEJsdCkgKHBEcmF3YWJsZSwgcEdDLCB4LCB5LCBuZ2x5cGgsIHBwY2kscGdseXBoQmFzZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgQm94UmVjIGJveDsKKyAgR2V0VGV4dEJvdW5kaW5nUmVjdChwRHJhd2FibGUsIHBHQy0+Zm9udCwgeCwgeSwgbmdseXBoLCAmYm94KTsKKworICBSZWdpb25IZWxwZXIgY2hhbmdlZChwU2NyZWVuLCAmYm94LCAwKTsKKworICBSRUdJT05fSU5URVJTRUNUKHBTY3JlZW4sIGNoYW5nZWQucmVnLCBjaGFuZ2VkLnJlZywgQ09NUE9TSVRFX0NMSVAocEdDKSk7CisKKyAgKCpwR0MtPm9wcy0+UG9seUdseXBoQmx0KSAocERyYXdhYmxlLCBwR0MsIHgsIHksIG5nbHlwaCwgcHBjaSwgcGdseXBoQmFzZSk7CisKKyAgdm5jSG9va3NTY3JlZW4tPmRlc2t0b3AtPmFkZF9jaGFuZ2VkKGNoYW5nZWQucmVnKTsKK30KKworLy8gUHVzaFBpeGVscyAtIGNoYW5nZWQgcmVnaW9uIGlzIHRoZSBnaXZlbiByZWN0YW5nbGUsIGNsaXBwZWQgYnkKKy8vIHBDb21wb3NpdGVDbGlwCisKK3N0YXRpYyB2b2lkIHZuY0hvb2tzUHVzaFBpeGVscyhHQ1B0ciBwR0MsIFBpeG1hcFB0ciBwQml0TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlUHRyIHBEcmF3YWJsZSwgaW50IHcsIGludCBoLCBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSkKK3sKKyAgR0NfT1BfVU5XUkFQUEVSKHBEcmF3YWJsZSwgcEdDLCBQdXNoUGl4ZWxzKTsKKworICBCb3hSZWMgYm94OworICBib3gueDEgPSB4ICsgcERyYXdhYmxlLT54OworICBib3gueTEgPSB5ICsgcERyYXdhYmxlLT55OworICBib3gueDIgPSBib3gueDEgKyB3OworICBib3gueTIgPSBib3gueTEgKyBoOworCisgIFJlZ2lvbkhlbHBlciBjaGFuZ2VkKHBTY3JlZW4sICZib3gsIDApOworCisgIFJFR0lPTl9JTlRFUlNFQ1QocFNjcmVlbiwgY2hhbmdlZC5yZWcsIGNoYW5nZWQucmVnLCBDT01QT1NJVEVfQ0xJUChwR0MpKTsKKworICAoKnBHQy0+b3BzLT5QdXNoUGl4ZWxzKSAocEdDLCBwQml0TWFwLCBwRHJhd2FibGUsIHcsIGgsIHgsIHkpOworCisgIHZuY0hvb2tzU2NyZWVuLT5kZXNrdG9wLT5hZGRfY2hhbmdlZChjaGFuZ2VkLnJlZyk7Cit9CmRpZmYgLS1naXQgYS91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL3ZuY0hvb2tzLmggYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL3ZuY0hvb2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1NmVmMwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMvdm5jSG9va3MuaApAQCAtMCwwICsxLDI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisjaWZuZGVmIF9fVk5DSE9PS1NfSF9fCisjZGVmaW5lIF9fVk5DSE9PS1NfSF9fCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPHNjcmVlbmludC5oPgorICBleHRlcm4gQm9vbCB2bmNIb29rc0luaXQoU2NyZWVuUHRyIHBTY3JlZW4sIFhzZXJ2ZXJEZXNrdG9wKiBkZXNrdG9wKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL3hmODZ2bmNNb2R1bGUuY2MgYi91bml4L3hjL3Byb2dyYW1zL1hzZXJ2ZXIvdm5jL3hmODZ2bmNNb2R1bGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4ZWE1MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgveGMvcHJvZ3JhbXMvWHNlcnZlci92bmMveGY4NnZuY01vZHVsZS5jYwpAQCAtMCwwICsxLDk3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSZWFsVk5DIEx0ZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LAorICogVVNBLgorICovCisvKiAgVGhpcyBpcyB0aGUgeGY4NiBtb2R1bGUgY29kZSBmb3IgdGhlIHZuYyBleHRlbnNpb24uCisgKi8KKworI2luY2x1ZGUgPHJmYi9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8cmZiL0xvZ2dlcl9zdGRpby5oPgorI2luY2x1ZGUgPHJmYi9Mb2dXcml0ZXIuaD4KKworZXh0ZXJuICJDIiB7CisjZGVmaW5lIGNsYXNzIGNfY2xhc3MKKyNkZWZpbmUgcHJpdmF0ZSBjX3ByaXZhdGUKKyNkZWZpbmUgYm9vbCBjX2Jvb2wKKyNkZWZpbmUgbmV3IGNfbmV3CisjaW5jbHVkZSAieGY4Ni5oIgorI2luY2x1ZGUgInhmODZNb2R1bGUuaCIKKyN1bmRlZiBjbGFzcworI3VuZGVmIHByaXZhdGUKKyN1bmRlZiBib29sCisjdW5kZWYgbmV3CisKK3VzaW5nIG5hbWVzcGFjZSByZmI7CisKK2V4dGVybiB2b2lkIHZuY0V4dGVuc2lvbkluaXQoKTsKK3N0YXRpYyB2b2lkIHZuY0V4dGVuc2lvbkluaXRXaXRoUGFyYW1zKElOSVRBUkdTKTsKKworI2lmZGVmIFhGcmVlODZMT0FERVIKKworc3RhdGljIE1PRFVMRVNFVFVQUFJPVE8odm5jU2V0dXApOworCitFeHRlbnNpb25Nb2R1bGUgdm5jRXh0ID0KK3sKKyAgICB2bmNFeHRlbnNpb25Jbml0V2l0aFBhcmFtcywKKyAgICAiVk5DIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTAorfTsKKworc3RhdGljIFhGODZNb2R1bGVWZXJzaW9uSW5mbyB2bmNWZXJzUmVjID0KK3sKKyAgICAidm5jIiwKKyAgICAiQ29uc3RhbnRpbiBLYXBsaW5za3kiLAorICAgIE1PRElORk9TVFJJTkcxLAorICAgIE1PRElORk9TVFJJTkcyLAorICAgIFhGODZfVkVSU0lPTl9DVVJSRU5ULAorICAgIDEsIDAsIDAsCisgICAgQUJJX0NMQVNTX0VYVEVOU0lPTiwgICAgICAgICAvKiBuZWVkcyB0aGUgc2VydmVyIGV4dGVuc2lvbiBBQkkgKi8KKyAgICBBQklfRVhURU5TSU9OX1ZFUlNJT04sCisgICAgTU9EX0NMQVNTX0VYVEVOU0lPTiwKKyAgICB7MCwwLDAsMH0KK307CisKK1hGODZNb2R1bGVEYXRhIHZuY01vZHVsZURhdGEgPSB7ICZ2bmNWZXJzUmVjLCB2bmNTZXR1cCwgTlVMTCB9OworCitzdGF0aWMgcG9pbnRlcgordm5jU2V0dXAocG9pbnRlciBtb2R1bGUsIHBvaW50ZXIgb3B0cywgaW50ICplcnJtYWosIGludCAqZXJybWluKSB7CisgICAgTG9hZEV4dGVuc2lvbigmdm5jRXh0LCBGQUxTRSk7CisgICAgLyogTmVlZCBhIG5vbi1OVUxMIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSBzdWNjZXNzICovCisgICAgcmV0dXJuIChwb2ludGVyKTE7Cit9CisKK3N0YXRpYyB2b2lkIHZuY0V4dGVuc2lvbkluaXRXaXRoUGFyYW1zKElOSVRBUkdTKQoreworICByZmI6OmluaXRTdGRJT0xvZ2dlcnMoKTsKKyAgcmZiOjpMb2dXcml0ZXI6OnNldExvZ1BhcmFtcygiKjpzdGRlcnI6MzAiKTsKKworICBmb3IgKGludCBzY3IgPSAwOyBzY3IgPCBzY3JlZW5JbmZvLm51bVNjcmVlbnM7IHNjcisrKSB7CisgICAgU2NybkluZm9QdHIgcFNjcm4gPSB4Zjg2U2NyZWVuc1tzY3JdOworCisgICAgZm9yIChQYXJhbWV0ZXJJdGVyYXRvciBpKENvbmZpZ3VyYXRpb246Omdsb2JhbCgpKTsgaS5wYXJhbTsgaS5uZXh0KCkpIHsKKyAgICAgIGNoYXIqIHZhbCA9IHhmODZGaW5kT3B0aW9uVmFsdWUocFNjcm4tPm9wdGlvbnMsIGkucGFyYW0tPmdldE5hbWUoKSk7CisgICAgICBpZiAodmFsKQorICAgICAgICBpLnBhcmFtLT5zZXRQYXJhbSh2YWwpOworICAgIH0KKyAgfQorCisgIHZuY0V4dGVuc2lvbkluaXQoKTsKK30KKworI2VuZGlmIC8qIFhGcmVlODZMT0FERVIgKi8KK30K