LyoKICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAqCiAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwogKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgogKgogKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogKgogKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAqIHF1ZXN0aW9ucy4KICovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBEaWFsb2cKLy8KCklERF9ET1dOTE9BRF9ESUFMT0cgRElBTE9HRVggMCwgMCwgMzQwLCAxMjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTXzNETE9PSyB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgCiAgICBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiQ29tcG9zYW50cyBzdXBwbOltZW50YWlyZXMgcmVxdWlzIgpFWFNUWUxFIFdTX0VYX0FQUFdJTkRPVwpGT05UIDgsICJNUyBTYW5zIFNlcmlmIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfRE9XTkxPQURfTUFTVEhFQUQsIDAsIDAsIDM0MCwgMzkKICAgIExURVhUICAgICAgICAgICAiIiwgSURDX01BU1RIRUFEX1RFWFQsIDYwLCA0LCAyMjAsIDMwCiAgICBDT05UUk9MICAgICAgICAgIiIsIElEQ19TVEFUSUMsIlN0YXRpYyIsIFNTX0JMQUNLRlJBTUUgfCBTU19TVU5LRU4sCiAgICAgICAgICAgICAgICAgICAgMCwgMzksIDM0MCwgMQogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfRE9XTkxPQURfVEVYVCwgMTIsIDYwLCAzMTYsIDIwCiAgICBMVEVYVCAgICAgICAgICAgIiIsIElEQ19USU1FX1JFTUFJTklORywgMTIsIDkwLCAzMTYsIDEwCiAgICBDT05UUk9MICAgICAgICAgIlByb2dyZXNzMSIsMTAwNiwibXNjdGxzX3Byb2dyZXNzMzIiLFBCU19TTU9PVEgsCiAgICAgICAgICAgICAgICAgICAgMTIsIDEwMCwgMjY1LCAxNAogICAgUFVTSEJVVFRPTgkgICAgIkFubnVsZXIiLCAgMiwgMjg1LCAxMDAsIDQ2LCAxNApFTkQKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gREVTSUdOSU5GTwovLwoKI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKR1VJREVMSU5FUyBERVNJR05JTkZPIERJU0NBUkRBQkxFIApCRUdJTgogICAgMTA1LCBESUFMT0cKICAgIEJFR0lOCiAgICAgICAgTEVGVE1BUkdJTiwgNwogICAgICAgIFJJR0hUTUFSR0lOLCAyMzYKICAgICAgICBUT1BNQVJHSU4sIDcKICAgICAgICBCT1RUT01NQVJHSU4sIDYzCiAgICBFTkQKRU5ECiNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gU3RyaW5nIFRhYmxlCi8vCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSAKQkVHSU4KICAgIElEU19ET1dOTE9BRF9DQU5DRUxfTUVTU0FHRSAgICJMJ2FubnVsYXRpb24gZGUgbCdpbnN0YWxsYXRpb24gZGUgY29tcG9zYW50cyBzdXBwbOltZW50YWlyZXMgbuljZXNzYWlyZXMg4CBsJ2FwcGxpY2F0aW9uIHJpc3F1ZSBkJ2VudHJh7m5lciBsYSBmZXJtZXR1cmUgZGUgY2VsbGUtY2kuXG5cblZvdWxlei12b3VzIHZyYWltZW50IGFubnVsZXIgbCdpbnN0YWxsYXRpb24gZGVzIGNvbXBvc2FudHMgc3VwcGzpbWVudGFpcmVzID8iCiAgICBJRFNfRE9XTkxPQURfQ0FOQ0VMX0NBUFRJT04gICAiQW5udWxlciA6IGNvbXBvc2FudHMgc3VwcGzpbWVudGFpcmVzIgogICAgSURTX0RPV05MT0FEX0NBTkNFTF9JTlNUUlVDVElPTiAgICIiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9SRVFVRVNUX1RJTUVPVVQgICAgICAiROlsYWkgZGUgY29ubmV4aW9uIGTpcGFzc+kiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9TRVJWRVJfTk9UX1JFQUNIQUJMRSAiQ29ubmV4aW9uIOAgSW50ZXJuZXQgaW1wb3NzaWJsZSIKICAgIElEU19IVFRQX0lOU1RSVUNUSU9OX1VOS05PV05fRVJST1IgICAgICAgICJFcnJldXIgZGUgc2VydmV1ciAoZXJyZXVyICVzKSIKICAgIElEU19IVFRQX0lOU1RSVUNUSU9OX1NFUlZJQ0VfVU5BVkFJTCAgICAgICJTZXJ2aWNlIG5vbiBkaXNwb25pYmxlIChlcnJldXIgJXMpIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fRk9SQklEREVOICAgICAgICAgICAgIkFjY+hzIHJlZnVz6SBvdSBpbnRlcmRpdCAoZXJyZXVyICVzKSIKICAgIElEU19IVFRQX1NUQVRVU19PVEhFUiAgICAgICAgICAgICAgICAgICAgICJVbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZGUgY2V0dGUgZGVtYW5kZS4gVm91bGV6LXZvdXMgZWZmZWN0dWVyIOAgbm91dmVhdSBsYSBkZW1hbmRlID8iCgovLyBIVFRQIHN0YXR1cyBjb2RlCiAgICBJRFNfSFRUUF9TVEFUVVNfUkVRVUVTVF9USU1FT1VUICJUZW1wb3Jpc2F0aW9uIGR1IHNlcnZldXIgbG9ycyBkZSBsJ2F0dGVudGUgZGUgbGEgcmVxdep0ZS4iCiAgICBJRFNfSFRUUF9TVEFUVVNfRk9SQklEREVOCQkiTGUgc2VydmV1ciBhIGNvbXByaXMgbGEgcmVxdep0ZSBtYWlzIHJlZnVzZSBkZSBsYSBzYXRpc2ZhaXJlLiIKICAgIElEU19IVFRQX1NUQVRVU19TRVJWRVJfRVJST1IJIkxlIHNlcnZldXIgYSByZW5jb250cukgdW5lIGNvbmRpdGlvbiBpbmF0dGVuZHVlIGwnZW1w6mNoYW50IGRlIHNhdGlzZmFpcmUgbGEgcmVxdep0ZS4iCiAgICBJRFNfSFRUUF9TVEFUVVNfU0VSVklDRV9VTkFWQUlMCSJMZSBzZXJ2aWNlIGVzdCB0ZW1wb3JhaXJlbWVudCBzdXJjaGFyZ+kuIgoKCiAgICBJRFNfRE9XTkxPQURfU1RBVFVTX1JFVFJZCQkiTGUgc2VydmV1ciBlc3Qgb2NjdXDpIDsgdmV1aWxsZXogcullc3NheWVyIGRhbnMgJWxkIHNlY29uZGVzLi4uIgoKICAgIElEU19FUlJPUl9DQVBUSU9OICAgICAgICAgICAgICAgIkVycmV1ciAtIEphdmEgS2VybmVsIgogICAgSURTX0hPVVJTTUlOVVRFU0VDT05ECSAgICAiVGVtcHMgcmVzdGFudCBwcul2dSA6ICVkIGhldXJlcyAlZCBtaW51dGVzICUuMGYgc2Vjb25kZXMiCiAgICBJRFNfSE9VUk1JTlVURVNFQ09ORAkgICAgIlRlbXBzIHJlc3RhbnQgcHLpdnUgOiAlZCBoZXVyZSAlZCBtaW51dGVzICUuMGYgc2Vjb25kZXMiCiAgICBJRFNfTUlOVVRFU0VDT05EIAkJICAgICJUZW1wcyByZXN0YW50IHBy6XZ1IDogJWQgbWludXRlcyAlLjBmIHNlY29uZGVzIgogICAgSURTX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAiVGVtcHMgcmVzdGFudCBwcul2dSA6ICUuMGYgc2Vjb25kZXMiCiAgICBJRFNfRElTS19GVUxMX0VSUk9SX0NBUFRJT04gICAgICJEaXNxdWUgc2F0dXLpIgogICAgSURTX0RJU0tfRlVMTF9FUlJPUiAgICAgICAgICAgICAiRW4gcmFpc29uIGRlIGxhIHNhdHVyYXRpb24gZHUgZGlzcXVlLCBKYXZhIEtlcm5lbCBuJ2EgcGFzIOl06SBlbiBtZXN1cmUgZGUgdOls6WNoYXJnZXIgbGVzIGNvbXBvc2FudHMgcmVxdWlzLiAgVm91bGV6LXZvdXMgcullc3NheWVyID8iCiAgICBJRFNfRElTS19XUklURV9FUlJPUl9DQVBUSU9OICAgICJFcnJldXIgZCfpY3JpdHVyZSBzdXIgbGUgZGlzcXVlIgogICAgSURTX0RJU0tfV1JJVEVfRVJST1IgICAgICAgICAgICAiSmF2YSBLZXJuZWwgYSByZW5jb250cukgdW5lIGVycmV1ciBsb3JzIGRlIGwn6WNyaXR1cmUgc3VyIGxlIGRpc3F1ZS4gIFZvdWxlei12b3VzIHLpZXNzYXllciA/IgogICAgSURTX0hUVFBfU1RBVFVTX1NFUlZFUl9OT1RfUkVBQ0hBQkxFICJKYXZhIEtlcm5lbCBuZSBwZXV0IHBhcyBzJ2V46WN1dGVyIGF2ZWMgbGVzIHBhcmFt6HRyZXMgZGUgY29ubmV4aW9uIEludGVybmV0IGFjdHVlbHMgZGUgdm90cmUgc3lzdOhtZS4gIERhbnMgbGUgUGFubmVhdSBkZSBjb25maWd1cmF0aW9uIGRlIFdpbmRvd3MsIGNsaXF1ZXogc3VyIE9wdGlvbnMgSW50ZXJuZXQgLT4gQ29ubmV4aW9ucyBwb3VyIHbpcmlmaWVyIGxlcyBwYXJhbeh0cmVzIGV0IGluZm9ybWF0aW9ucyBkZSBwcm94eS4iCgogICAgSURTX0RPV05MT0FEX1JFVFJZICAgICAgICAgICAgICJFcnJldXIgZGUgdOls6WNoYXJnZW1lbnQiCiAgICBJRFNfRE9XTkxPQURfUkVUUllfVEVYVCAgICAgICAgIlVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUgbG9ycyBkdSB06WzpY2hhcmdlbWVudCBkZSBjZXJ0YWlucyBjb21wb3NhbnRzIHJlcXVpcy4gU291aGFpdGV6LXZvdXMgcullc3NheWVyIGRlIHTpbOljaGFyZ2VyIGNlcyBjb21wb3NhbnRzID8iCgogICAgSURTX0RPV05MT0FEICAgICAgICAgICAgICAgICAgICJJbnN0YWxsYXRpb24gZGUgY29tcG9zYW50cyBzdXBwbOltZW50YWlyZXMiCglJRFNfRE9XTkxPQURfVU5QQUNLSU5HICAgICAgICAgIkTpY29tcHJlc3Npb24gZHUgYnVuZGxlIgogICAgSURTX0RPV05MT0FEX1RFWFQgICAgICAgICAgICAgICJMJ2FwcGxpY2F0aW9uIEphdmEgZOltYXJyZSBsb3JzcXVlIGRlcyBjb21wb3NhbnRzIHN1cHBs6W1lbnRhaXJlcyByZXF1aXMgc29udCB06WzpY2hhcmfpcyBldCBpbnN0YWxs6XMuIgogICAgCiAgICBJRFNfRklMRV9VUERBVEVfRVJST1IgICAgICAgICAgIlVuZSBlcnJldXIgcydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSBtaXNlIOAgam91ciBkZSAlcyVzLiIKICAgIElEU19GSUxFX0RFTEVURV9FUlJPUiAgICAgICAgICAiVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZSBsb3JzIGRlIGxhIHN1cHByZXNzaW9uIGRlICVzLiIKICAgIElEU19KQVZBX0hPTUVfRVJST1IgICAgICAgICAgICAiTGUgculwZXJ0b2lyZSBkJ2FjY3VlaWwgSmF2YSBlc3QgaW50cm91dmFibGUuIgogICAgSURTX0tFUk5FTF9IT01FX0VSUk9SICAgICAgICAgICJMZSBjaGVtaW4gZGUgamtlcm5lbC5kbGwgZXN0IGludHJvdXZhYmxlLiIKICAgIElEU19KQlJPS0VSX0VSUk9SICAgICAgICAgICAgICAiSW1wb3NzaWJsZSBkZSBsYW5jZXIgamJyb2tlci5leGUuIgogICAgSURTX0ZBVEFMX0VSUk9SICAgICAgICAgICAgICAgICJKYXZhIG4nYSBwYXMg6XTpIGVuIG1lc3VyZSBkZSB06WzpY2hhcmdlciBsZXMgY29tcG9zYW50cyByZXF1aXMuICBGZXJtZXR1cmUgaW1taW5lbnRlIGR1IHByb2dyYW1tZS4iCiAgICBJRFNfRVJST1JfRE9XTkxPQURJTkdfQlVORExFX1BST1BFUlRJRVMgIkphdmEgbidhIHBhcyDpdOkgZW4gbWVzdXJlIGRlIGNvbW11bmlxdWVyIGF2ZWMgbGUgc2VydmV1ciBkZSB06WzpY2hhcmdlbWVudC4gIEZlcm1ldHVyZSBpbW1pbmVudGUgZHUgcHJvZ3JhbW1lLiIKICAgIElEU19FUlJPUl9NQUxGT1JNRURfQlVORExFX1BST1BFUlRJRVMgIkphdmEgYSByZW5jb250cukgdW5lIGVycmV1ciBsb3JzIGRlIGxhIGNvbW11bmljYXRpb24gYXZlYyBsZSBzZXJ2ZXVyIGRlIHTpbOljaGFyZ2VtZW50LiAgRmVybWV0dXJlIGltbWluZW50ZSBkdSBwcm9ncmFtbWUuIgogICAgSURTX0VSUk9SX01BTEZPUk1FRF9VUkwgIkphdmEgbidhIHBhcyDpdOkgZW4gbWVzdXJlIGRlIHLpYWxpc2VyIGxlIHTpbOljaGFyZ2VtZW50IOAgcGFydGlyIGRlIGwnVVJMICclcycuICBGZXJtZXR1cmUgaW1taW5lbnRlIGR1IHByb2dyYW1tZS4iCkVORAo=