SW50cm9kdWN0aW9uIHRvIEltYWdlTWFnaWNrCgogIEltYWdlTWFnaWNrriBpcyBhIHNvZnR3YXJlIHN1aXRlIHRvIGNyZWF0ZSwgZWRpdCwgYW5kIGNvbXBvc2UgYml0bWFwCiAgaW1hZ2VzLiBJdCBjYW4gcmVhZCwgY29udmVydCBhbmQgd3JpdGUgaW1hZ2VzIGluIGEgdmFyaWV0eSBvZiBmb3JtYXRzCiAgKG92ZXIgMTAwKSBpbmNsdWRpbmcgRFBYLCBFWFIsIEdJRiwgSlBFRywgSlBFRy0yMDAwLCBQREYsIFBob3RvQ0QsIFBORywKICBQb3N0c2NyaXB0LCBTVkcsIGFuZCBUSUZGLiBVc2UgSW1hZ2VNYWdpY2sgdG8gdHJhbnNsYXRlLCBmbGlwLCBtaXJyb3IsCiAgcm90YXRlLCBzY2FsZSwgc2hlYXIgYW5kIHRyYW5zZm9ybSBpbWFnZXMsIGFkanVzdCBpbWFnZSBjb2xvcnMsIGFwcGx5IHZhcmlvdXMKICBzcGVjaWFsIGVmZmVjdHMsIG9yIGRyYXcgdGV4dCwgbGluZXMsIHBvbHlnb25zLCBlbGxpcHNlcyBhbmQgQul6aWVyIGN1cnZlcy4KCiAgVGhlIGZ1bmN0aW9uYWxpdHkgb2YgSW1hZ2VNYWdpY2sgaXMgdHlwaWNhbGx5IHV0aWxpemVkIGZyb20gdGhlIGNvbW1hbmQKICBsaW5lIG9yIHlvdSBjYW4gdXNlIHRoZSBmZWF0dXJlcyBmcm9tIHByb2dyYW1zIHdyaXR0ZW4gaW4geW91ciBmYXZvcml0ZQogIHByb2dyYW1taW5nIGxhbmd1YWdlLiBDaG9vc2UgZnJvbSB0aGVzZSBpbnRlcmZhY2VzOiBHMkYgKEFkYSksIE1hZ2lja0NvcmUKICAoQyksIE1hZ2lja1dhbmQgKEMpLCBDaE1hZ2ljayAoQ2gpLCBJbWFnZU1hZ2lja09iamVjdCAoQ09NKyksIE1hZ2ljaysrCiAgKEMrKyksIEpNYWdpY2sgKEphdmEpLCBMLU1hZ2ljayAoTGlzcCksIE5NYWdpY2sgKE5la28vaGFYZSksIE1hZ2lja05ldAogICguTkVUKSwgUGFzY2FsTWFnaWNrIChQYXNjYWwpLCBQZXJsTWFnaWNrIChQZXJsKSwgTWFnaWNrV2FuZCBmb3IgUEhQCiAgKFBIUCksIElNYWdpY2sgKFBIUCksIFB5dGhvbk1hZ2ljayAoUHl0aG9uKSwgUk1hZ2ljayAoUnVieSksIG9yIFRjbE1hZ2ljawogIChUY2wvVEspLiBXaXRoIGEgbGFuZ3VhZ2UgaW50ZXJmYWNlLCB1c2UgSW1hZ2VNYWdpY2sgdG8gbW9kaWZ5IG9yIGNyZWF0ZQogIGltYWdlcyBkeW5hbWljYWxseSBhbmQgYXV0b21hZ2ljYWxseS4KCiAgSW1hZ2VNYWdpY2sgaXMgZnJlZSBzb2Z0d2FyZSBkZWxpdmVyZWQgYXMgYSByZWFkeS10by1ydW4gYmluYXJ5IGRpc3RyaWJ1dGlvbgogIG9yIGFzIHNvdXJjZSBjb2RlIHRoYXQgeW91IG1heSBmcmVlbHkgdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIGluCiAgYm90aCBvcGVuIGFuZCBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMuIEl0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIGFuIEFwYWNoZQogIDIuMC1zdHlsZSBsaWNlbnNlLCBhcHByb3ZlZCBieSB0aGUgT1NJLgoKICBUaGUgSW1hZ2VNYWdpY2sgZGV2ZWxvcG1lbnQgcHJvY2VzcyBlbnN1cmVzIGEgc3RhYmxlIEFQSSBhbmQgQUJJLiBCZWZvcmUKICBlYWNoIEltYWdlTWFnaWNrIHJlbGVhc2UsIHdlIHBlcmZvcm0gYSBjb21wcmVoZW5zaXZlIHNlY3VyaXR5IGFzc2Vzc21lbnQKICB0aGF0IGluY2x1ZGVzIG1lbW9yeSBhbmQgdGhyZWFkIGVycm9yIGRldGVjdGlvbiB0byBoZWxwIHByZXZlbnQgZXhwbG9pdHMuCgpGZWF0dXJlcyBhbmQgQ2FwYWJpbGl0aWVzCgogIEhlcmUgYXJlIGp1c3QgYSBmZXcgZXhhbXBsZXMgb2Ygd2hhdCBJbWFnZU1hZ2ljayBjYW4gZG86CgogICAgKiBGb3JtYXQgY29udmVyc2lvbjogY29udmVydCBhbiBpbWFnZSBmcm9tIG9uZSBmb3JtYXQgdG8gYW5vdGhlciAoZS5nLiBQTkcKICAgICAgdG8gSlBFRykuCiAgICAqIFRyYW5zZm9ybTogcmVzaXplLCByb3RhdGUsIGNyb3AsIGZsaXAgb3IgdHJpbSBhbiBpbWFnZS4KICAgICogVHJhbnNwYXJlbmN5OiByZW5kZXIgcG9ydGlvbnMgb2YgYW4gaW1hZ2UgaW52aXNpYmxlLgogICAgKiBEcmF3OiBhZGQgc2hhcGVzIG9yIHRleHQgdG8gYW4gaW1hZ2UuCiAgICAqIERlY29yYXRlOiBhZGQgYSBib3JkZXIgb3IgZnJhbWUgdG8gYW4gaW1hZ2UuCiAgICAqIFNwZWNpYWwgZWZmZWN0czogYmx1ciwgc2hhcnBlbiwgdGhyZXNob2xkLCBvciB0aW50IGFuIGltYWdlLgogICAgKiBBbmltYXRpb246IGNyZWF0ZSBhIEdJRiBhbmltYXRpb24gc2VxdWVuY2UgZnJvbSBhIGdyb3VwIG9mIGltYWdlcy4KICAgICogVGV4dCAmIGNvbW1lbnRzOiBpbnNlcnQgZGVzY3JpcHRpdmUgb3IgYXJ0aXN0aWMgdGV4dCBpbiBhbiBpbWFnZS4KICAgICogSW1hZ2UgaWRlbnRpZmljYXRpb246IGRlc2NyaWJlIHRoZSBmb3JtYXQgYW5kIGF0dHJpYnV0ZXMgb2YgYW4gaW1hZ2UuCiAgICAqIENvbXBvc2l0ZTogb3ZlcmxhcCBvbmUgaW1hZ2Ugb3ZlciBhbm90aGVyLgogICAgKiBNb250YWdlOiBqdXh0YXBvc2UgaW1hZ2UgdGh1bWJuYWlscyBvbiBhbiBpbWFnZSBjYW52YXMuCiAgICAqIEdlbmVyYWxpemVkIHBpeGVsIGRpc3RvcnRpb246IGNvcnJlY3QgZm9yLCBvciBpbmR1Y2UgaW1hZ2UgZGlzdG9ydGlvbnMKICAgICAgaW5jbHVkaW5nIHBlcnNwZWN0aXZlLgogICAgKiBNb3JwaG9sb2d5IG9mIHNoYXBlczogZXh0cmFjdCBmZWF0dXJlcywgZGVzY3JpYmUgc2hhcGVzIGFuZCByZWNvZ25pemUKICAgICAgcGF0dGVybnMgaW4gaW1hZ2VzLgogICAgKiBNb3Rpb24gcGljdHVyZSBzdXBwb3J0OiByZWFkIGFuZCB3cml0ZSB0aGUgY29tbW9uIGltYWdlIGZvcm1hdHMgdXNlZCBpbgogICAgICBkaWdpdGFsIGZpbG0gd29yay4KICAgICogSW1hZ2UgY2FsY3VsYXRvcjogYXBwbHkgYSBtYXRoZW1hdGljYWwgZXhwcmVzc2lvbiB0byBhbiBpbWFnZSBvciBpbWFnZQogICAgICBjaGFubmVscy4KICAgICogRGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm06IGltcGxlbWVudHMgdGhlIGZvcndhcmQgYW5kIGludmVyc2UgREZULgogICAgKiBIaWdoIGR5bmFtaWMtcmFuZ2UgaW1hZ2VzOiBhY2N1cmF0ZWx5IHJlcHJlc2VudCB0aGUgd2lkZSByYW5nZSBvZgogICAgICBpbnRlbnNpdHkgbGV2ZWxzIGZvdW5kIGluIHJlYWwgc2NlbmVzIHJhbmdpbmcgZnJvbSB0aGUgYnJpZ2h0ZXN0IGRpcmVjdAogICAgICBzdW5saWdodCB0byB0aGUgZGVlcGVzdCBkYXJrZXN0IHNoYWRvd3MuCiAgICAqIEVuY2lwaGVyIG9yIGRlY2lwaGVyIGFuIGltYWdlOiBjb252ZXJ0IG9yZGluYXJ5IGltYWdlcyBpbnRvCiAgICAgIHVuaW50ZWxsaWdpYmxlIGdpYmJlcmlzaCBhbmQgYmFjayBhZ2Fpbi4KICAgICogVmlydHVhbCBwaXhlbCBzdXBwb3J0OiBjb252ZW5pZW50IGFjY2VzcyB0byBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UKICAgICAgcmVnaW9uLgogICAgKiBMYXJnZSBpbWFnZSBzdXBwb3J0OiByZWFkLCBwcm9jZXNzLCBvciB3cml0ZSBtZWdhLSwgZ2lnYS0sIG9yIHRlcmEtcGl4ZWwKICAgICAgaW1hZ2Ugc2l6ZXMuCiAgICAqIFRocmVhZHMgb2YgZXhlY3V0aW9uIHN1cHBvcnQ6IEltYWdlTWFnaWNrIGlzIHRocmVhZCBzYWZlIGFuZCBtb3N0CiAgICAgIGludGVybmFsIGFsZ29yaXRobXMgYXJlIE9wZW5NUC1lbmFibGVkIHRvIHRha2UgYWR2YW50YWdlIG9mIHNwZWVkLXVwcwogICAgICBvZmZlcmVkIGJ5IG11bHRpY29yZSBwcm9jZXNzb3IgY2hpcHMuCiAgICAqIEhldGVyb2dlbmVvdXMgZGlzdHJpYnV0ZWQgcHJvY2Vzc2luZzogY2VydGFpbiBhbGdvcml0aG1zIGFyZQogICAgICBPcGVuQ0wtZW5hYmxlZCB0byB0YWtlIGFkdmFudGFnZSBvZiBzcGVlZC11cHMgb2ZmZXJlZCBieSBleGVjdXRpbmcgaW4KICAgICAgY29uY2VydCBhY3Jvc3MgaGV0ZXJvZ2VuZW91cyBwbGF0Zm9ybXMgY29uc2lzdGluZyBvZiBDUFVzLCBHUFVzLCBhbmQKICAgICAgb3RoZXIgcHJvY2Vzc29ycy4KICAgICogSW1hZ2VNYWdpY2sgb24gdGhlIGlQaG9uZTogY29udmVydCwgZWRpdCwgb3IgY29tcG9zZSBpbWFnZXMgb24geW91cgogICAgICBpUGhvbmUuCgogIEV4YW1wbGVzIG9mIEltYWdlTWFnaWNrIFVzYWdlIHNob3dzIGhvdyB0byB1c2UgSW1hZ2VNYWdpY2sgZnJvbSB0aGUKICBjb21tYW5kLWxpbmUgdG8gYWNjb21wbGlzaCBhbnkgb2YgdGhlc2UgdGFza3MgYW5kIG11Y2ggbW9yZS4gQWxzbywKICBzZWUgRnJlZCdzIEltYWdlTWFnaWNrIFNjcmlwdHM6IGEgcGxldGhvcmEgb2YgY29tbWFuZC1saW5lIHNjcmlwdHMgdGhhdAogIHBlcmZvcm0gZ2VvbWV0cmljIHRyYW5zZm9ybXMsIGJsdXJzLCBzaGFycGVucywgZWRnaW5nLCBub2lzZSByZW1vdmFsLAogIGFuZCBjb2xvciBtYW5pcHVsYXRpb25zLgoK