@horietakehiro/aws-cdk-utul 0.41.44 → 0.41.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/lib/types/cfn-resource-types/aws-bedrockagentcore-browsercustom.d.ts +7 -0
  2. package/lib/types/cfn-resource-types/aws-bedrockagentcore-browsercustom.js +1 -1
  3. package/lib/types/cfn-resource-types/aws-bedrockagentcore-runtime.d.ts +75 -0
  4. package/lib/types/cfn-resource-types/aws-bedrockagentcore-runtime.js +1 -1
  5. package/lib/types/cfn-resource-types/aws-cassandra-keyspace.d.ts +2 -2
  6. package/lib/types/cfn-resource-types/aws-cassandra-keyspace.js +1 -1
  7. package/lib/types/cfn-resource-types/aws-dynamodb-globaltable.d.ts +7 -4
  8. package/lib/types/cfn-resource-types/aws-dynamodb-globaltable.js +1 -1
  9. package/lib/types/cfn-resource-types/aws-ec2-volume.d.ts +37 -33
  10. package/lib/types/cfn-resource-types/aws-ec2-volume.js +1 -1
  11. package/lib/types/cfn-resource-types/aws-ecr-repositorycreationtemplate.d.ts +2 -2
  12. package/lib/types/cfn-resource-types/aws-ecr-repositorycreationtemplate.js +1 -1
  13. package/lib/types/cfn-resource-types/aws-ecs-taskdefinition.d.ts +4 -4
  14. package/lib/types/cfn-resource-types/aws-ecs-taskdefinition.js +1 -1
  15. package/lib/types/cfn-resource-types/aws-gamelift-build.d.ts +1 -1
  16. package/lib/types/cfn-resource-types/aws-gamelift-build.js +1 -1
  17. package/lib/types/cfn-resource-types/aws-imagebuilder-imagerecipe.d.ts +1 -1
  18. package/lib/types/cfn-resource-types/aws-imagebuilder-imagerecipe.js +1 -1
  19. package/lib/types/cfn-resource-types/aws-kinesis-stream.d.ts +4 -0
  20. package/lib/types/cfn-resource-types/aws-kinesis-stream.js +1 -1
  21. package/lib/types/cfn-resource-types/aws-kms-key.d.ts +1 -1
  22. package/lib/types/cfn-resource-types/aws-kms-key.js +1 -1
  23. package/lib/types/cfn-resource-types/aws-opensearchserverless-collection.d.ts +25 -21
  24. package/lib/types/cfn-resource-types/aws-opensearchserverless-collection.js +1 -1
  25. package/lib/types/cfn-resource-types/aws-quicksight-dataset.d.ts +411 -74
  26. package/lib/types/cfn-resource-types/aws-quicksight-dataset.js +1 -1
  27. package/lib/types/cfn-resource-types/aws-quicksight-datasource.d.ts +1 -1
  28. package/lib/types/cfn-resource-types/aws-quicksight-datasource.js +1 -1
  29. package/lib/types/cfn-resource-types/aws-servicecatalog-cloudformationproduct.d.ts +123 -21
  30. package/lib/types/cfn-resource-types/aws-servicecatalog-cloudformationproduct.js +1 -1
  31. package/lib/types/cfn-resource-types/aws-servicecatalog-portfolioprincipalassociation.d.ts +14 -3
  32. package/lib/types/cfn-resource-types/aws-servicecatalog-portfolioprincipalassociation.js +1 -1
  33. package/lib/types/cfn-resource-types/aws-ses-multiregionendpoint.d.ts +50 -0
  34. package/lib/types/cfn-resource-types/aws-ses-multiregionendpoint.js +3 -0
  35. package/lib/types/cfn-resource-types/aws-wafv2-webacl.d.ts +36 -0
  36. package/lib/types/cfn-resource-types/aws-wafv2-webacl.js +1 -1
  37. package/lib/types/cfn-resource-types.d.ts +2 -0
  38. package/lib/types/cfn-resource-types.js +7 -5
  39. package/package.json +1 -1
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy10YXNrZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3cy1lY3MtdGFza2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaXN0ZXJzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBgYGZhbWlseWBgIGFuZCBgYGNvbnRhaW5lckRlZmluaXRpb25zYGAuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGRhdGEgdm9sdW1lcyB0byB5b3VyIGNvbnRhaW5lcnMgd2l0aCB0aGUgYGB2b2x1bWVzYGAgcGFyYW1ldGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0YXNrIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBjYW4gc3BlY2lmeSBhIHJvbGUgZm9yIHlvdXIgdGFzayB3aXRoIHRoZSBgYHRhc2tSb2xlQXJuYGAgcGFyYW1ldGVyLiBXaGVuIHlvdSBzcGVjaWZ5IGEgcm9sZSBmb3IgYSB0YXNrLCBpdHMgY29udGFpbmVycyBjYW4gdGhlbiB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIG9yIFNES3MgdG8gbWFrZSBBUEkgcmVxdWVzdHMgdG8gdGhlIEFXUyBzZXJ2aWNlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHBvbGljeSB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJQU0gUm9sZXMgZm9yIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLWlhbS1yb2xlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgWW91IGNhbiBzcGVjaWZ5IGEgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4geW91ciB0YXNrIGRlZmluaXRpb24gd2l0aCB0aGUgYGBuZXR3b3JrTW9kZWBgIHBhcmFtZXRlci4gSWYgeW91IHNwZWNpZnkgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgb3IgZXhhbXBsZXMsIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjb250ZW50cyAoYGBBVVRIUEFSQU1TYGApIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NpZ25hdHVyZSBWZXJzaW9uIDQgU2lnbmluZyBQcm9jZXNzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3Ivc2lnbmF0dXJlLXZlcnNpb24tNC5odG1sKSBpbiB0aGUgKkdlbmVyYWwgUmVmZXJlbmNlKi5cbiAqICBZb3Ugb25seSBuZWVkIHRvIGxlYXJuIGhvdyB0byBzaWduIEhUVFAgcmVxdWVzdHMgaWYgeW91IGludGVuZCB0byBjcmVhdGUgdGhlbSBtYW51YWxseS4gV2hlbiB5b3UgdXNlIHRoZSBbXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xpLykgb3Igb25lIG9mIHRoZSBbU0RLc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Rvb2xzLykgdG8gbWFrZSByZXF1ZXN0cyB0byBBV1MsIHRoZXNlIHRvb2xzIGF1dG9tYXRpY2FsbHkgc2lnbiB0aGUgcmVxdWVzdHMgZm9yIHlvdSwgd2l0aCB0aGUgYWNjZXNzIGtleSB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4geW91IGNvbmZpZ3VyZSB0aGUgdG9vbHMuIFdoZW4geW91IHVzZSB0aGVzZSB0b29scywgeW91IGRvbid0IGhhdmUgdG8gc2lnbiByZXF1ZXN0cyB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBfQVdTX0VDU19UQVNLREVGSU5JVElPTiB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTWxvbmcgcm9sZSB0aGF0IGdyYW50cyBjb250YWluZXJzIGluIHRoZSB0YXNrIHBlcm1pc3Npb24gdG8gY2FsbCBBV1MgQVBJcyBvbiB5b3VyIGJlaGFsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBUYXNrIFJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2staWFtLXJvbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJQU0gcm9sZXMgZm9yIHRhc2tzIG9uIFdpbmRvd3MgcmVxdWlyZSB0aGF0IHRoZSBgYC1FbmFibGVUYXNrSUFNUm9sZWBgIG9wdGlvbiBpcyBzZXQgd2hlbiB5b3UgbGF1bmNoIHRoZSBBbWF6b24gRUNTLW9wdGltaXplZCBXaW5kb3dzIEFNSS4gWW91ciBjb250YWluZXJzIG11c3QgYWxzbyBydW4gc29tZSBjb25maWd1cmF0aW9uIGNvZGUgdG8gdXNlIHRoZSBmZWF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXaW5kb3dzIElBTSByb2xlcyBmb3IgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3NfdGFza19JQU1fcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBTdHJpbmcgdmFsaWRhdGlvbiBpcyBkb25lIG9uIHRoZSBFQ1Mgc2lkZS4gSWYgYW4gaW52YWxpZCBzdHJpbmcgdmFsdWUgaXMgZ2l2ZW4gZm9yIGBgVGFza1JvbGVBcm5gYCwgaXQgbWF5IGNhdXNlIHRoZSBDbG91ZGZvcm1hdGlvbiBqb2IgdG8gaGFuZy5cbiAqL1xuVGFza1JvbGVBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAsIGBgdGFza2BgLCBvciBgYG5vbmVgYC4gSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCB0aGVuIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIElQQyBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBJUEMgcmVzb3VyY2VzIHdpdGggdGhlIGhvc3QgQW1hem9uIEVDMiBpbnN0YW5jZS4gSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIElQQyByZXNvdXJjZXMuIElmIGBgbm9uZWBgIGlzIHNwZWNpZmllZCwgdGhlbiBJUEMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgY29udGFpbmVycyBvZiBhIHRhc2sgYXJlIHByaXZhdGUgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBjb250YWluZXJzIGluIGEgdGFzayBvciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2Ugc2hhcmluZyBkZXBlbmRzIG9uIHRoZSBEb2NrZXIgZGFlbW9uIHNldHRpbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqICBJZiB0aGUgYGBob3N0YGAgSVBDIG1vZGUgaXMgdXNlZCwgYmUgYXdhcmUgdGhhdCB0aGVyZSBpcyBhIGhlaWdodGVuZWQgcmlzayBvZiB1bmRlc2lyZWQgSVBDIG5hbWVzcGFjZSBleHBvc2UuXG4gKiAgSWYgeW91IGFyZSBzZXR0aW5nIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdXNpbmcgYGBzeXN0ZW1Db250cm9sc2BgIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyB3aWxsIGFwcGx5IHRvIHlvdXIgSVBDIHJlc291cmNlIG5hbWVzcGFjZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3lzdGVtIENvbnRyb2xzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgd2lsbCBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuSXBjTW9kZT86IHN0cmluZ1xuSW5mZXJlbmNlQWNjZWxlcmF0b3JzPzogSW5mZXJlbmNlQWNjZWxlcmF0b3JbXVxuLyoqXG4gKiBUaGUgYW1vdW50IChpbiBNaUIpIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSB0YXNrLlxuICogIElmIHlvdXIgdGFza3MgcnVucyBvbiBBbWF6b24gRUMyIGluc3RhbmNlcywgeW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBvciBhIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgdmFsdWUuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGFueSB2YWx1ZSBjYW4gYmUgdXNlZC4gSWYgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBjb250YWluZXItbGV2ZWwgbWVtb3J5IHZhbHVlIGlzIG9wdGlvbmFsLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29udGFpbmVyLWxldmVsIG1lbW9yeSBhbmQgbWVtb3J5IHJlc2VydmF0aW9uLCBzZWUgW0NvbnRhaW5lckRlZmluaXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ29udGFpbmVyRGVmaW5pdGlvbi5odG1sKS5cbiAqICBJZiB5b3VyIHRhc2tzIHJ1bnMgb24gRkFSR0FURWxvbmcsIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIFlvdSBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuIFRoZSB2YWx1ZSB5b3UgY2hvb3NlIGRldGVybWluZXMgeW91ciByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgYGNwdWBgIHBhcmFtZXRlci5cbiAqICAgKyAgNTEyICgwLjUgR0IpLCAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDI1NiAoLjI1IHZDUFUpXG4gKiAgICsgIDEwMjQgKDEgR0IpLCAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA1MTIgKC41IHZDUFUpXG4gKiAgICsgIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQiksIDUxMjAgKDUgR0IpLCA2MTQ0ICg2IEdCKSwgNzE2OCAoNyBHQiksIDgxOTIgKDggR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAxMDI0ICgxIHZDUFUpXG4gKiAgICsgIEJldHdlZW4gNDA5NiAoNCBHQikgYW5kIDE2Mzg0ICgxNiBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogMjA0OCAoMiB2Q1BVKVxuICogICArICBCZXR3ZWVuIDgxOTIgKDggR0IpIGFuZCAzMDcyMCAoMzAgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDQwOTYgKDQgdkNQVSlcbiAqICAgKyAgQmV0d2VlbiAxNiBHQiBhbmQgNjAgR0IgaW4gNCBHQiBpbmNyZW1lbnRzIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA4MTkyICg4IHZDUFUpXG4gKiAgVGhpcyBvcHRpb24gcmVxdWlyZXMgTGludXggcGxhdGZvcm0gYGAxLjQuMGBgIG9yIGxhdGVyLlxuICogICArICBCZXR3ZWVuIDMyR0IgYW5kIDEyMCBHQiBpbiA4IEdCIGluY3JlbWVudHMgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDE2Mzg0ICgxNiB2Q1BVKVxuICogIFRoaXMgb3B0aW9uIHJlcXVpcmVzIExpbnV4IHBsYXRmb3JtIGBgMS40LjBgYCBvciBsYXRlci5cbiAqL1xuTWVtb3J5Pzogc3RyaW5nXG4vKipcbiAqIEFuIGFycmF5IG9mIHBsYWNlbWVudCBjb25zdHJhaW50IG9iamVjdHMgdG8gdXNlIGZvciB0YXNrcy5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkIGZvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cblBsYWNlbWVudENvbnN0cmFpbnRzPzogVGFza0RlZmluaXRpb25QbGFjZW1lbnRDb25zdHJhaW50W11cbi8qKlxuICogVGhlIG51bWJlciBvZiBgYGNwdWBgIHVuaXRzIHVzZWQgYnkgdGhlIHRhc2suIElmIHlvdSB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gQW55IHZhbHVlIGNhbiBiZSB1c2VkLiBJZiB5b3UgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLiBZb3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiBUaGUgdmFsdWUgdGhhdCB5b3UgY2hvb3NlIGRldGVybWluZXMgeW91ciByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgYG1lbW9yeWBgIHBhcmFtZXRlci5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSBvciB0aGUgZXh0ZXJuYWwgbGF1bmNoIHR5cGUsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIGJldHdlZW4gYGAxMjhgYCBDUFUgdW5pdHMgKGBgMC4xMjVgYCB2Q1BVcykgYW5kIGBgMTk2NjA4YGAgQ1BVIHVuaXRzIChgYDE5MmBgIHZDUFVzKS4gXG4gKiAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgRmFyZ2F0ZS4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2YWxpZCB2YWx1ZXMsIHNlZSBbVGFzayBzaXplXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sI3Rhc2tfc2l6ZSkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5DcHU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHRhc2sgbGF1bmNoIHR5cGVzIHRoZSB0YXNrIGRlZmluaXRpb24gd2FzIHZhbGlkYXRlZCBhZ2FpbnN0LiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYE1BTkFHRURfSU5TVEFOQ0VTYGAsIGBgRUMyYGAsIGBgRkFSR0FURWBgLCBhbmQgYGBFWFRFUk5BTGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTIGxhdW5jaCB0eXBlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbGF1bmNoX3R5cGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuUmVxdWlyZXNDb21wYXRpYmlsaXRpZXM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSB0byB1c2UgZm9yIHRoZSBjb250YWluZXJzIGluIHRoZSB0YXNrLiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYG5vbmVgYCwgYGBicmlkZ2VgYCwgYGBhd3N2cGNgYCwgYW5kIGBgaG9zdGBgLiBJZiBubyBuZXR3b3JrIG1vZGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBgYGJyaWRnZWBgLlxuICogIEZvciBBbWF6b24gRUNTIHRhc2tzIG9uIEZhcmdhdGUsIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSBpcyByZXF1aXJlZC4gRm9yIEFtYXpvbiBFQ1MgdGFza3Mgb24gQW1hem9uIEVDMiBMaW51eCBpbnN0YW5jZXMsIGFueSBuZXR3b3JrIG1vZGUgY2FuIGJlIHVzZWQuIEZvciBBbWF6b24gRUNTIHRhc2tzIG9uIEFtYXpvbiBFQzIgV2luZG93cyBpbnN0YW5jZXMsIGBgPGRlZmF1bHQ+YGAgb3IgYGBhd3N2cGNgYCBjYW4gYmUgdXNlZC4gSWYgdGhlIG5ldHdvcmsgbW9kZSBpcyBzZXQgdG8gYGBub25lYGAsIHlvdSBjYW5ub3Qgc3BlY2lmeSBwb3J0IG1hcHBpbmdzIGluIHlvdXIgY29udGFpbmVyIGRlZmluaXRpb25zLCBhbmQgdGhlIHRhc2tzIGNvbnRhaW5lcnMgZG8gbm90IGhhdmUgZXh0ZXJuYWwgY29ubmVjdGl2aXR5LiBUaGUgYGBob3N0YGAgYW5kIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlcyBvZmZlciB0aGUgaGlnaGVzdCBuZXR3b3JraW5nIHBlcmZvcm1hbmNlIGZvciBjb250YWluZXJzIGJlY2F1c2UgdGhleSB1c2UgdGhlIEVDMiBuZXR3b3JrIHN0YWNrIGluc3RlYWQgb2YgdGhlIHZpcnR1YWxpemVkIG5ldHdvcmsgc3RhY2sgcHJvdmlkZWQgYnkgdGhlIGBgYnJpZGdlYGAgbW9kZS5cbiAqICBXaXRoIHRoZSBgYGhvc3RgYCBhbmQgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGVzLCBleHBvc2VkIGNvbnRhaW5lciBwb3J0cyBhcmUgbWFwcGVkIGRpcmVjdGx5IHRvIHRoZSBjb3JyZXNwb25kaW5nIGhvc3QgcG9ydCAoZm9yIHRoZSBgYGhvc3RgYCBuZXR3b3JrIG1vZGUpIG9yIHRoZSBhdHRhY2hlZCBlbGFzdGljIG5ldHdvcmsgaW50ZXJmYWNlIHBvcnQgKGZvciB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUpLCBzbyB5b3UgY2Fubm90IHRha2UgYWR2YW50YWdlIG9mIGR5bmFtaWMgaG9zdCBwb3J0IG1hcHBpbmdzLiBcbiAqICAgV2hlbiB1c2luZyB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlLCB5b3Ugc2hvdWxkIG5vdCBydW4gY29udGFpbmVycyB1c2luZyB0aGUgcm9vdCB1c2VyIChVSUQgMCkuIEl0IGlzIGNvbnNpZGVyZWQgYmVzdCBwcmFjdGljZSB0byB1c2UgYSBub24tcm9vdCB1c2VyLlxuICogICBJZiB0aGUgbmV0d29yayBtb2RlIGlzIGBgYXdzdnBjYGAsIHRoZSB0YXNrIGlzIGFsbG9jYXRlZCBhbiBlbGFzdGljIG5ldHdvcmsgaW50ZXJmYWNlLCBhbmQgeW91IG11c3Qgc3BlY2lmeSBhIFtOZXR3b3JrQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9OZXR3b3JrQ29uZmlndXJhdGlvbi5odG1sKSB2YWx1ZSB3aGVuIHlvdSBjcmVhdGUgYSBzZXJ2aWNlIG9yIHJ1biBhIHRhc2sgd2l0aCB0aGUgdGFzayBkZWZpbml0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUYXNrIE5ldHdvcmtpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2stbmV0d29ya2luZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgdGhlIG5ldHdvcmsgbW9kZSBpcyBgYGhvc3RgYCwgeW91IGNhbm5vdCBydW4gbXVsdGlwbGUgaW5zdGFudGlhdGlvbnMgb2YgdGhlIHNhbWUgdGFzayBvbiBhIHNpbmdsZSBjb250YWluZXIgaW5zdGFuY2Ugd2hlbiBwb3J0IG1hcHBpbmdzIGFyZSB1c2VkLlxuICovXG5OZXR3b3JrTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcHJvY2VzcyBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAgb3IgYGB0YXNrYGAuIE9uIEZhcmdhdGUgZm9yIExpbnV4IGNvbnRhaW5lcnMsIHRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzIGBgdGFza2BgLiBGb3IgZXhhbXBsZSwgbW9uaXRvcmluZyBzaWRlY2FycyBtaWdodCBuZWVkIGBgcGlkTW9kZWBgIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBjb250YWluZXJzIHJ1bm5pbmcgaW4gdGhlIHNhbWUgdGFzay5cbiAqICBJZiBgYGhvc3RgYCBpcyBzcGVjaWZpZWQsIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIFBJRCBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBwcm9jZXNzIG5hbWVzcGFjZSB3aXRoIHRoZSBob3N0IEFtYXpvbiBFQzIgaW5zdGFuY2UuXG4gKiAgSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIHByb2Nlc3MgbmFtZXNwYWNlLlxuICogIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgYSBwcml2YXRlIG5hbWVzcGFjZSBmb3IgZWFjaCBjb250YWluZXIuXG4gKiAgSWYgdGhlIGBgaG9zdGBgIFBJRCBtb2RlIGlzIHVzZWQsIHRoZXJlJ3MgYSBoZWlnaHRlbmVkIHJpc2sgb2YgdW5kZXNpcmVkIHByb2Nlc3MgbmFtZXNwYWNlIGV4cG9zdXJlLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKiAgICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgdGFza3MgdGhhdCBhcmUgaG9zdGVkIG9uIEZBUkdBVEVsb25nIGlmIHRoZSB0YXNrcyBhcmUgdXNpbmcgcGxhdGZvcm0gdmVyc2lvbiBgYDEuNC4wYGAgb3IgbGF0ZXIgKExpbnV4KS4gVGhpcyBpc24ndCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvbiBGYXJnYXRlLlxuICovXG5QaWRNb2RlPzogc3RyaW5nXG4vKipcbiAqIEVuYWJsZXMgZmF1bHQgaW5qZWN0aW9uIGFuZCBhbGxvd3MgZm9yIGZhdWx0IGluamVjdGlvbiByZXF1ZXN0cyB0byBiZSBhY2NlcHRlZCBmcm9tIHRoZSB0YXNrJ3MgY29udGFpbmVycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBmYWxzZWBgLlxuICovXG5FbmFibGVGYXVsdEluamVjdGlvbj86IGJvb2xlYW5cbi8qKlxuICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSB0YXNrIGV4ZWN1dGlvbiByb2xlIHRoYXQgZ3JhbnRzIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwZXJtaXNzaW9uIHRvIG1ha2UgQVdTIEFQSSBjYWxscyBvbiB5b3VyIGJlaGFsZi4gRm9yIGluZm9ybWF0aW9uYWJvdXQgdGhlIHJlcXVpcmVkIElBTSByb2xlcyBmb3IgQW1hem9uIEVDUywgc2VlIFtJQU0gcm9sZXMgZm9yIEFtYXpvbiBFQ1NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlY3VyaXR5LWVjcy1pYW0tcm9sZS1vdmVydmlldy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkV4ZWN1dGlvblJvbGVBcm4/OiBzdHJpbmdcblJ1bnRpbWVQbGF0Zm9ybT86IFJ1bnRpbWVQbGF0Zm9ybVxuUHJveHlDb25maWd1cmF0aW9uPzogUHJveHlDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBsaXN0IG9mIGRhdGEgdm9sdW1lIGRlZmluaXRpb25zIGZvciB0aGUgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgZGF0YSB2b2x1bWVzIGluIHRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19kYXRhX3ZvbHVtZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBUaGUgYGBob3N0YGAgYW5kIGBgc291cmNlUGF0aGBgIHBhcmFtZXRlcnMgYXJlbid0IHN1cHBvcnRlZCBmb3IgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5Wb2x1bWVzPzogVm9sdW1lW11cbi8qKlxuICogQSBsaXN0IG9mIGNvbnRhaW5lciBkZWZpbml0aW9ucyBpbiBKU09OIGZvcm1hdCB0aGF0IGRlc2NyaWJlIHRoZSBkaWZmZXJlbnQgY29udGFpbmVycyB0aGF0IG1ha2UgdXAgeW91ciB0YXNrLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXJzIGFuZCBkZWZhdWx0cywgc2VlIFtBbWF6b24gRUNTIFRhc2sgRGVmaW5pdGlvbnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2tfZGVmaW50aW9ucy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkNvbnRhaW5lckRlZmluaXRpb25zPzogQ29udGFpbmVyRGVmaW5pdGlvbltdXG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmFtaWx5IHRoYXQgdGhpcyB0YXNrIGRlZmluaXRpb24gaXMgcmVnaXN0ZXJlZCB0by4gVXAgdG8gMjU1IGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzIGFyZSBhbGxvd2VkLlxuICogIEEgZmFtaWx5IGdyb3VwcyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhIHRhc2sgZGVmaW5pdGlvbi4gQW1hem9uIEVDUyBnaXZlcyB0aGUgZmlyc3QgdGFzayBkZWZpbml0aW9uIHRoYXQgeW91IHJlZ2lzdGVyZWQgdG8gYSBmYW1pbHkgYSByZXZpc2lvbiBudW1iZXIgb2YgMS4gQW1hem9uIEVDUyBnaXZlcyBzZXF1ZW50aWFsIHJldmlzaW9uIG51bWJlcnMgdG8gZWFjaCB0YXNrIGRlZmluaXRpb24gdGhhdCB5b3UgYWRkLlxuICogICBUbyB1c2UgcmV2aXNpb24gbnVtYmVycyB3aGVuIHlvdSB1cGRhdGUgYSB0YXNrIGRlZmluaXRpb24sIHNwZWNpZnkgdGhpcyBwcm9wZXJ0eS4gSWYgeW91IGRvbid0IHNwZWNpZnkgYSB2YWx1ZSwgQ0ZObG9uZyBnZW5lcmF0ZXMgYSBuZXcgdGFzayBkZWZpbml0aW9uIGVhY2ggdGltZSB0aGF0IHlvdSB1cGRhdGUgaXQuXG4gKi9cbkZhbWlseT86IHN0cmluZ1xuRXBoZW1lcmFsU3RvcmFnZT86IEVwaGVtZXJhbFN0b3JhZ2Vcbi8qKlxuICogVGhlIG1ldGFkYXRhIHRoYXQgeW91IGFwcGx5IHRvIHRoZSB0YXNrIGRlZmluaXRpb24gdG8gaGVscCB5b3UgY2F0ZWdvcml6ZSBhbmQgb3JnYW5pemUgdGhlbS4gRWFjaCB0YWcgY29uc2lzdHMgb2YgYSBrZXkgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLiBZb3UgZGVmaW5lIGJvdGggb2YgdGhlbS5cbiAqICBUaGUgZm9sbG93aW5nIGJhc2ljIHJlc3RyaWN0aW9ucyBhcHBseSB0byB0YWdzOlxuICogICArICBNYXhpbXVtIG51bWJlciBvZiB0YWdzIHBlciByZXNvdXJjZSAtIDUwXG4gKiAgICsgIEZvciBlYWNoIHJlc291cmNlLCBlYWNoIHRhZyBrZXkgbXVzdCBiZSB1bmlxdWUsIGFuZCBlYWNoIHRhZyBrZXkgY2FuIGhhdmUgb25seSBvbmUgdmFsdWUuXG4gKiAgICsgIE1heGltdW0ga2V5IGxlbmd0aCAtIDEyOCBVbmljb2RlIGNoYXJhY3RlcnMgaW4gVVRGLThcbiAqICAgKyAgTWF4aW11bSB2YWx1ZSBsZW5ndGggLSAyNTYgVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIElmIHlvdXIgdGFnZ2luZyBzY2hlbWEgaXMgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgc2VydmljZXMgYW5kIHJlc291cmNlcywgcmVtZW1iZXIgdGhhdCBvdGhlciBzZXJ2aWNlcyBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gYWxsb3dlZCBjaGFyYWN0ZXJzLiBHZW5lcmFsbHkgYWxsb3dlZCBjaGFyYWN0ZXJzIGFyZTogbGV0dGVycywgbnVtYmVycywgYW5kIHNwYWNlcyByZXByZXNlbnRhYmxlIGluIFVURi04LCBhbmQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiArIC0gPSAuIF8gOiAvIEAuXG4gKiAgICsgIFRhZyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICogICArICBEbyBub3QgdXNlIGBgYXdzOmBgLCBgYEFXUzpgYCwgb3IgYW55IHVwcGVyIG9yIGxvd2VyY2FzZSBjb21iaW5hdGlvbiBvZiBzdWNoIGFzIGEgcHJlZml4IGZvciBlaXRoZXIga2V5cyBvciB2YWx1ZXMgYXMgaXQgaXMgcmVzZXJ2ZWQgZm9yIEFXUyB1c2UuIFlvdSBjYW5ub3QgZWRpdCBvciBkZWxldGUgdGFnIGtleXMgb3IgdmFsdWVzIHdpdGggdGhpcyBwcmVmaXguIFRhZ3Mgd2l0aCB0aGlzIHByZWZpeCBkbyBub3QgY291bnQgYWdhaW5zdCB5b3VyIHRhZ3MgcGVyIHJlc291cmNlIGxpbWl0LlxuICovXG5UYWdzPzogVGFnW11cblRhc2tEZWZpbml0aW9uQXJuPzogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIEluZmVyZW5jZUFjY2VsZXJhdG9yIHtcbkRldmljZVR5cGU/OiBzdHJpbmdcbkRldmljZU5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGNvbnN0cmFpbnQgb24gdGFzayBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBwbGFjZW1lbnQgY29uc3RyYWludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2stcGxhY2VtZW50LWNvbnN0cmFpbnRzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVGFzayBwbGFjZW1lbnQgY29uc3RyYWludHMgYXJlbid0IHN1cHBvcnRlZCBmb3IgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tEZWZpbml0aW9uUGxhY2VtZW50Q29uc3RyYWludCB7XG4vKipcbiAqIFRoZSB0eXBlIG9mIGNvbnN0cmFpbnQuIFRoZSBgYE1lbWJlck9mYGAgY29uc3RyYWludCByZXN0cmljdHMgc2VsZWN0aW9uIHRvIGJlIGZyb20gYSBncm91cCBvZiB2YWxpZCBjYW5kaWRhdGVzLlxuICovXG5UeXBlOiBzdHJpbmdcbi8qKlxuICogQSBjbHVzdGVyIHF1ZXJ5IGxhbmd1YWdlIGV4cHJlc3Npb24gdG8gYXBwbHkgdG8gdGhlIGNvbnN0cmFpbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NsdXN0ZXIgcXVlcnkgbGFuZ3VhZ2VdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2NsdXN0ZXItcXVlcnktbGFuZ3VhZ2UuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5FeHByZXNzaW9uPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgeW91ciB0YXNrcyBkZWZpbml0aW9ucyBydW4gb24uIEEgcGxhdGZvcm0gZmFtaWx5IGlzIHNwZWNpZmllZCBvbmx5IGZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lUGxhdGZvcm0ge1xuLyoqXG4gKiBUaGUgb3BlcmF0aW5nIHN5c3RlbS5cbiAqL1xuT3BlcmF0aW5nU3lzdGVtRmFtaWx5Pzogc3RyaW5nXG4vKipcbiAqIFRoZSBDUFUgYXJjaGl0ZWN0dXJlLlxuICogIFlvdSBjYW4gcnVuIHlvdXIgTGludXggdGFza3Mgb24gYW4gQVJNLWJhc2VkIHBsYXRmb3JtIGJ5IHNldHRpbmcgdGhlIHZhbHVlIHRvIGBgQVJNNjRgYC4gVGhpcyBvcHRpb24gaXMgYXZhaWxhYmxlIGZvciB0YXNrcyB0aGF0IHJ1biBvbiBMaW51eCBBbWF6b24gRUMyIGluc3RhbmNlIG9yIExpbnV4IGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuQ3B1QXJjaGl0ZWN0dXJlPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBcHAgTWVzaCBwcm94eS5cbiAqICBZb3VyIEFtYXpvbiBFQ1MgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlIHRvIHVzZSBhIHByb3h5IGNvbmZpZ3VyYXRpb24uIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB0aGUgQW1hem9uIEVDUyBvcHRpbWl6ZWQgQU1JIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIHNldCBvZiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB0byBwcm92aWRlIHRoZSBDb250YWluZXIgTmV0d29yayBJbnRlcmZhY2UgKENOSSkgcGx1Z2luLCBzcGVjaWZpZWQgYXMga2V5LXZhbHVlIHBhaXJzLlxuICogICArICBgYElnbm9yZWRVSURgYCAtIChSZXF1aXJlZCkgVGhlIHVzZXIgSUQgKFVJRCkgb2YgdGhlIHByb3h5IGNvbnRhaW5lciBhcyBkZWZpbmVkIGJ5IHRoZSBgYHVzZXJgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgcHJveHkgaWdub3JlcyBpdHMgb3duIHRyYWZmaWMuIElmIGBgSWdub3JlZEdJRGBgIGlzIHNwZWNpZmllZCwgdGhpcyBmaWVsZCBjYW4gYmUgZW1wdHkuXG4gKiAgICsgIGBgSWdub3JlZEdJRGBgIC0gKFJlcXVpcmVkKSBUaGUgZ3JvdXAgSUQgKEdJRCkgb2YgdGhlIHByb3h5IGNvbnRhaW5lciBhcyBkZWZpbmVkIGJ5IHRoZSBgYHVzZXJgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgcHJveHkgaWdub3JlcyBpdHMgb3duIHRyYWZmaWMuIElmIGBgSWdub3JlZFVJRGBgIGlzIHNwZWNpZmllZCwgdGhpcyBmaWVsZCBjYW4gYmUgZW1wdHkuXG4gKiAgICsgIGBgQXBwUG9ydHNgYCAtIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgcG9ydHMgdGhhdCB0aGUgYXBwbGljYXRpb24gdXNlcy4gTmV0d29yayB0cmFmZmljIHRvIHRoZXNlIHBvcnRzIGlzIGZvcndhcmRlZCB0byB0aGUgYGBQcm94eUluZ3Jlc3NQb3J0YGAgYW5kIGBgUHJveHlFZ3Jlc3NQb3J0YGAuXG4gKiAgICsgIGBgUHJveHlJbmdyZXNzUG9ydGBgIC0gKFJlcXVpcmVkKSBTcGVjaWZpZXMgdGhlIHBvcnQgdGhhdCBpbmNvbWluZyB0cmFmZmljIHRvIHRoZSBgYEFwcFBvcnRzYGAgaXMgZGlyZWN0ZWQgdG8uXG4gKiAgICsgIGBgUHJveHlFZ3Jlc3NQb3J0YGAgLSAoUmVxdWlyZWQpIFNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IG91dGdvaW5nIHRyYWZmaWMgZnJvbSB0aGUgYGBBcHBQb3J0c2BgIGlzIGRpcmVjdGVkIHRvLlxuICogICArICBgYEVncmVzc0lnbm9yZWRQb3J0c2BgIC0gKFJlcXVpcmVkKSBUaGUgZWdyZXNzIHRyYWZmaWMgZ29pbmcgdG8gdGhlIHNwZWNpZmllZCBwb3J0cyBpcyBpZ25vcmVkIGFuZCBub3QgcmVkaXJlY3RlZCB0byB0aGUgYGBQcm94eUVncmVzc1BvcnRgYC4gSXQgY2FuIGJlIGFuIGVtcHR5IGxpc3QuXG4gKiAgICsgIGBgRWdyZXNzSWdub3JlZElQc2BgIC0gKFJlcXVpcmVkKSBUaGUgZWdyZXNzIHRyYWZmaWMgZ29pbmcgdG8gdGhlIHNwZWNpZmllZCBJUCBhZGRyZXNzZXMgaXMgaWdub3JlZCBhbmQgbm90IHJlZGlyZWN0ZWQgdG8gdGhlIGBgUHJveHlFZ3Jlc3NQb3J0YGAuIEl0IGNhbiBiZSBhbiBlbXB0eSBsaXN0LlxuICovXG5Qcm94eUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzPzogS2V5VmFsdWVQYWlyW11cbi8qKlxuICogVGhlIHByb3h5IHR5cGUuIFRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgYEFQUE1FU0hgYC5cbiAqL1xuVHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRoYXQgd2lsbCBzZXJ2ZSBhcyB0aGUgQXBwIE1lc2ggcHJveHkuXG4gKi9cbkNvbnRhaW5lck5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBBIGtleS12YWx1ZSBwYWlyIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYWx1ZVBhaXIge1xuLyoqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIGtleS12YWx1ZSBwYWlyLiBGb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cblZhbHVlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBrZXktdmFsdWUgcGFpci4gRm9yIGVudmlyb25tZW50IHZhcmlhYmxlcywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbk5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGRhdGEgdm9sdW1lIGNvbmZpZ3VyYXRpb24gZm9yIHRhc2tzIGxhdW5jaGVkIHVzaW5nIHRoaXMgdGFzayBkZWZpbml0aW9uLiBTcGVjaWZ5aW5nIGEgdm9sdW1lIGNvbmZpZ3VyYXRpb24gaW4gYSB0YXNrIGRlZmluaXRpb24gaXMgb3B0aW9uYWwuIFRoZSB2b2x1bWUgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtdWx0aXBsZSB2b2x1bWVzIGJ1dCBvbmx5IG9uZSB2b2x1bWUgY29uZmlndXJlZCBhdCBsYXVuY2ggaXMgc3VwcG9ydGVkLiBFYWNoIHZvbHVtZSBkZWZpbmVkIGluIHRoZSB2b2x1bWUgY29uZmlndXJhdGlvbiBtYXkgb25seSBzcGVjaWZ5IGEgYGBuYW1lYGAgYW5kIG9uZSBvZiBlaXRoZXIgYGBjb25maWd1cmVkQXRMYXVuY2hgYCwgYGBkb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uYGAsIGBgZWZzVm9sdW1lQ29uZmlndXJhdGlvbmBgLCBgYGZzeFdpbmRvd3NGaWxlU2VydmVyVm9sdW1lQ29uZmlndXJhdGlvbmBgLCBvciBgYGhvc3RgYC4gSWYgYW4gZW1wdHkgdm9sdW1lIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLCBieSBkZWZhdWx0IEFtYXpvbiBFQ1MgdXNlcyBhIGhvc3Qgdm9sdW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBkYXRhIHZvbHVtZXMgaW4gdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzaW5nX2RhdGFfdm9sdW1lcy5odG1sKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWUge1xuRUZTVm9sdW1lQ29uZmlndXJhdGlvbj86IEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25cbkhvc3Q/OiBIb3N0Vm9sdW1lUHJvcGVydGllc1xuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdm9sdW1lIHNob3VsZCBiZSBjb25maWd1cmVkIGF0IGxhdW5jaCB0aW1lLiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIEFtYXpvbiBFQlMgdm9sdW1lcyBmb3Igc3RhbmRhbG9uZSB0YXNrcyBvciB0YXNrcyBjcmVhdGVkIGFzIHBhcnQgb2YgYSBzZXJ2aWNlLiBFYWNoIHRhc2sgZGVmaW5pdGlvbiByZXZpc2lvbiBtYXkgb25seSBoYXZlIG9uZSB2b2x1bWUgY29uZmlndXJlZCBhdCBsYXVuY2ggaW4gdGhlIHZvbHVtZSBjb25maWd1cmF0aW9uLlxuICogIFRvIGNvbmZpZ3VyZSBhIHZvbHVtZSBhdCBsYXVuY2ggdGltZSwgdXNlIHRoaXMgdGFzayBkZWZpbml0aW9uIHJldmlzaW9uIGFuZCBzcGVjaWZ5IGEgYGB2b2x1bWVDb25maWd1cmF0aW9uc2BgIG9iamVjdCB3aGVuIGNhbGxpbmcgdGhlIGBgQ3JlYXRlU2VydmljZWBgLCBgYFVwZGF0ZVNlcnZpY2VgYCwgYGBSdW5UYXNrYGAgb3IgYGBTdGFydFRhc2tgYCBBUElzLlxuICovXG5Db25maWd1cmVkQXRMYXVuY2g/OiBib29sZWFuXG5Eb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uPzogRG9ja2VyVm9sdW1lQ29uZmlndXJhdGlvblxuRlN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uPzogRlN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSB2b2x1bWUuIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBhcmUgYWxsb3dlZC5cbiAqICBXaGVuIHVzaW5nIGEgdm9sdW1lIGNvbmZpZ3VyZWQgYXQgbGF1bmNoLCB0aGUgYGBuYW1lYGAgaXMgcmVxdWlyZWQgYW5kIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQgYXMgdGhlIHZvbHVtZSBuYW1lIGluIHRoZSBgYFNlcnZpY2VWb2x1bWVDb25maWd1cmF0aW9uYGAgb3IgYGBUYXNrVm9sdW1lQ29uZmlndXJhdGlvbmBgIHBhcmFtZXRlciB3aGVuIGNyZWF0aW5nIHlvdXIgc2VydmljZSBvciBzdGFuZGFsb25lIHRhc2suXG4gKiAgRm9yIGFsbCBvdGhlciB0eXBlcyBvZiB2b2x1bWVzLCB0aGlzIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYGBzb3VyY2VWb2x1bWVgYCBwYXJhbWV0ZXIgb2YgdGhlIGBgbW91bnRQb2ludHNgYCBvYmplY3QgaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICogIFdoZW4gYSB2b2x1bWUgaXMgdXNpbmcgdGhlIGBgZWZzVm9sdW1lQ29uZmlndXJhdGlvbmBgLCB0aGUgbmFtZSBpcyByZXF1aXJlZC5cbiAqL1xuTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2hlbiB5b3UgdXNlIGFuIEFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIGZpbGUgc3lzdGVtIGZvciB0YXNrIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUZTVm9sdW1lQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtIElEIHRvIHVzZS5cbiAqL1xuRmlsZXN5c3RlbUlkOiBzdHJpbmdcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBlbmNyeXB0aW9uIGZvciBBbWF6b24gRUZTIGRhdGEgaW4gdHJhbnNpdCBiZXR3ZWVuIHRoZSBBbWF6b24gRUNTIGhvc3QgYW5kIHRoZSBBbWF6b24gRUZTIHNlcnZlci4gVHJhbnNpdCBlbmNyeXB0aW9uIG11c3QgYmUgdHVybmVkIG9uIGlmIEFtYXpvbiBFRlMgSUFNIGF1dGhvcml6YXRpb24gaXMgdXNlZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGBESVNBQkxFRGBgIGlzIHVzZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0VuY3J5cHRpbmcgZGF0YSBpbiB0cmFuc2l0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWZzL2xhdGVzdC91Zy9lbmNyeXB0aW9uLWluLXRyYW5zaXQuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBGaWxlIFN5c3RlbSBVc2VyIEd1aWRlKi5cbiAqL1xuVHJhbnNpdEVuY3J5cHRpb24/OiAoXCJFTkFCTEVEXCIgfCBcIkRJU0FCTEVEXCIpXG5BdXRob3JpemF0aW9uQ29uZmlnPzogQXV0aG9yaXphdGlvbkNvbmZpZ1xuLyoqXG4gKiBUaGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgQW1hem9uIEVGUyBmaWxlIHN5c3RlbSB0byBtb3VudCBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgaW5zaWRlIHRoZSBob3N0LiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgcm9vdCBvZiB0aGUgQW1hem9uIEVGUyB2b2x1bWUgd2lsbCBiZSB1c2VkLiBTcGVjaWZ5aW5nIGBgL2BgIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgb21pdHRpbmcgdGhpcyBwYXJhbWV0ZXIuXG4gKiAgIElmIGFuIEVGUyBhY2Nlc3MgcG9pbnQgaXMgc3BlY2lmaWVkIGluIHRoZSBgYGF1dGhvcml6YXRpb25Db25maWdgYCwgdGhlIHJvb3QgZGlyZWN0b3J5IHBhcmFtZXRlciBtdXN0IGVpdGhlciBiZSBvbWl0dGVkIG9yIHNldCB0byBgYC9gYCB3aGljaCB3aWxsIGVuZm9yY2UgdGhlIHBhdGggc2V0IG9uIHRoZSBFRlMgYWNjZXNzIHBvaW50LlxuICovXG5Sb290RGlyZWN0b3J5Pzogc3RyaW5nXG4vKipcbiAqIFRoZSBwb3J0IHRvIHVzZSB3aGVuIHNlbmRpbmcgZW5jcnlwdGVkIGRhdGEgYmV0d2VlbiB0aGUgQW1hem9uIEVDUyBob3N0IGFuZCB0aGUgQW1hem9uIEVGUyBzZXJ2ZXIuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHRyYW5zaXQgZW5jcnlwdGlvbiBwb3J0LCBpdCB3aWxsIHVzZSB0aGUgcG9ydCBzZWxlY3Rpb24gc3RyYXRlZ3kgdGhhdCB0aGUgQW1hem9uIEVGUyBtb3VudCBoZWxwZXIgdXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbRUZTIG1vdW50IGhlbHBlcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vmcy9sYXRlc3QvdWcvZWZzLW1vdW50LWhlbHBlci5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIFVzZXIgR3VpZGUqLlxuICovXG5UcmFuc2l0RW5jcnlwdGlvblBvcnQ/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgQW1hem9uIEVGUyBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemF0aW9uQ29uZmlnIHtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgQW1hem9uIEVDUyB0YXNrIHJvbGUgZGVmaW5lZCBpbiBhIHRhc2sgZGVmaW5pdGlvbiB3aGVuIG1vdW50aW5nIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtLiBJZiBpdCBpcyB0dXJuZWQgb24sIHRyYW5zaXQgZW5jcnlwdGlvbiBtdXN0IGJlIHR1cm5lZCBvbiBpbiB0aGUgYGBFRlNWb2x1bWVDb25maWd1cmF0aW9uYGAuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGBgRElTQUJMRURgYCBpcyB1c2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBBbWF6b24gRUZTIGFjY2VzcyBwb2ludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vmcy12b2x1bWVzLmh0bWwjZWZzLXZvbHVtZS1hY2Nlc3Nwb2ludHMpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuSUFNPzogKFwiRU5BQkxFRFwiIHwgXCJESVNBQkxFRFwiKVxuLyoqXG4gKiBUaGUgQW1hem9uIEVGUyBhY2Nlc3MgcG9pbnQgSUQgdG8gdXNlLiBJZiBhbiBhY2Nlc3MgcG9pbnQgaXMgc3BlY2lmaWVkLCB0aGUgcm9vdCBkaXJlY3RvcnkgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBgYEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25gYCBtdXN0IGVpdGhlciBiZSBvbWl0dGVkIG9yIHNldCB0byBgYC9gYCB3aGljaCB3aWxsIGVuZm9yY2UgdGhlIHBhdGggc2V0IG9uIHRoZSBFRlMgYWNjZXNzIHBvaW50LiBJZiBhbiBhY2Nlc3MgcG9pbnQgaXMgdXNlZCwgdHJhbnNpdCBlbmNyeXB0aW9uIG11c3QgYmUgb24gaW4gdGhlIGBgRUZTVm9sdW1lQ29uZmlndXJhdGlvbmBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXb3JraW5nIHdpdGggQW1hem9uIEVGUyBhY2Nlc3MgcG9pbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWZzL2xhdGVzdC91Zy9lZnMtYWNjZXNzLXBvaW50cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIFVzZXIgR3VpZGUqLlxuICovXG5BY2Nlc3NQb2ludElkPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgYmluZCBtb3VudCBob3N0IHZvbHVtZXMuIFRoZSBjb250ZW50cyBvZiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGRldGVybWluZSB3aGV0aGVyIHlvdXIgYmluZCBtb3VudCBob3N0IHZvbHVtZSBwZXJzaXN0cyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgYW5kIHdoZXJlIGl0J3Mgc3RvcmVkLiBJZiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGlzIGVtcHR5LCB0aGVuIHRoZSBEb2NrZXIgZGFlbW9uIGFzc2lnbnMgYSBob3N0IHBhdGggZm9yIHlvdXIgZGF0YSB2b2x1bWUuIEhvd2V2ZXIsIHRoZSBkYXRhIGlzbid0IGd1YXJhbnRlZWQgdG8gcGVyc2lzdCBhZnRlciB0aGUgY29udGFpbmVycyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggaXQgc3RvcCBydW5uaW5nLlxuICogIFdpbmRvd3MgY29udGFpbmVycyBjYW4gbW91bnQgd2hvbGUgZGlyZWN0b3JpZXMgb24gdGhlIHNhbWUgZHJpdmUgYXMgYGAkZW52OlByb2dyYW1EYXRhYGAuIFdpbmRvd3MgY29udGFpbmVycyBjYW4ndCBtb3VudCBkaXJlY3RvcmllcyBvbiBhIGRpZmZlcmVudCBkcml2ZSwgYW5kIG1vdW50IHBvaW50IGNhbid0IGJlIGFjcm9zcyBkcml2ZXMuIEZvciBleGFtcGxlLCB5b3UgY2FuIG1vdW50IGBgQzpcXG15XFxwYXRoOkM6XFxteVxccGF0aGBgIGFuZCBgYEQ6XFw6RDpcXGBgLCBidXQgbm90IGBgRDpcXG15XFxwYXRoOkM6XFxteVxccGF0aGBgIG9yIGBgRDpcXDpDOlxcbXlcXHBhdGhgYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0Vm9sdW1lUHJvcGVydGllcyB7XG4vKipcbiAqIFdoZW4gdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBpcyB1c2VkLCBzcGVjaWZ5IGEgYGBzb3VyY2VQYXRoYGAgdG8gZGVjbGFyZSB0aGUgcGF0aCBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdGhhdCdzIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBlbXB0eSwgdGhlbiB0aGUgRG9ja2VyIGRhZW1vbiBoYXMgYXNzaWduZWQgYSBob3N0IHBhdGggZm9yIHlvdS4gSWYgdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBjb250YWlucyBhIGBgc291cmNlUGF0aGBgIGZpbGUgbG9jYXRpb24sIHRoZW4gdGhlIGRhdGEgdm9sdW1lIHBlcnNpc3RzIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIHVudGlsIHlvdSBkZWxldGUgaXQgbWFudWFsbHkuIElmIHRoZSBgYHNvdXJjZVBhdGhgYCB2YWx1ZSBkb2Vzbid0IGV4aXN0IG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSwgdGhlIERvY2tlciBkYWVtb24gY3JlYXRlcyBpdC4gSWYgdGhlIGxvY2F0aW9uIGRvZXMgZXhpc3QsIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIHBhdGggZm9sZGVyIGFyZSBleHBvcnRlZC5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHNvdXJjZVBhdGhgYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuU291cmNlUGF0aD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2hlbiB5b3UgdXNlIERvY2tlciB2b2x1bWVzLlxuICogIFdpbmRvd3MgY29udGFpbmVycyBvbmx5IHN1cHBvcnQgdGhlIHVzZSBvZiB0aGUgYGBsb2NhbGBgIGRyaXZlci4gVG8gdXNlIGJpbmQgbW91bnRzLCBzcGVjaWZ5IHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgaW5zdGVhZC5cbiAqICAgRG9ja2VyIHZvbHVtZXMgYXJlbid0IHN1cHBvcnRlZCBieSB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9ja2VyVm9sdW1lQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIEEgbWFwIG9mIERvY2tlciBkcml2ZXItc3BlY2lmaWMgb3B0aW9ucyBwYXNzZWQgdGhyb3VnaC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERyaXZlck9wdHNgYCBpbiB0aGUgZG9ja2VyIGNyZWF0ZS12b2x1bWUgY29tbWFuZCBhbmQgdGhlIGBgeHhvcHRgYCBvcHRpb24gdG8gZG9ja2VyIHZvbHVtZSBjcmVhdGUuXG4gKi9cbkRyaXZlck9wdHM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHNjb3BlIGZvciB0aGUgRG9ja2VyIHZvbHVtZSB0aGF0IGRldGVybWluZXMgaXRzIGxpZmVjeWNsZS4gRG9ja2VyIHZvbHVtZXMgdGhhdCBhcmUgc2NvcGVkIHRvIGEgYGB0YXNrYGAgYXJlIGF1dG9tYXRpY2FsbHkgcHJvdmlzaW9uZWQgd2hlbiB0aGUgdGFzayBzdGFydHMgYW5kIGRlc3Ryb3llZCB3aGVuIHRoZSB0YXNrIHN0b3BzLiBEb2NrZXIgdm9sdW1lcyB0aGF0IGFyZSBzY29wZWQgYXMgYGBzaGFyZWRgYCBwZXJzaXN0IGFmdGVyIHRoZSB0YXNrIHN0b3BzLlxuICovXG5TY29wZT86IHN0cmluZ1xuLyoqXG4gKiBJZiB0aGlzIHZhbHVlIGlzIGBgdHJ1ZWBgLCB0aGUgRG9ja2VyIHZvbHVtZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqICAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaWYgdGhlIGBgc2NvcGVgYCBpcyBgYHNoYXJlZGBgLlxuICovXG5BdXRvcHJvdmlzaW9uPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgRG9ja2VyIHZvbHVtZSBkcml2ZXIgdG8gdXNlLiBUaGUgZHJpdmVyIHZhbHVlIG11c3QgbWF0Y2ggdGhlIGRyaXZlciBuYW1lIHByb3ZpZGVkIGJ5IERvY2tlciBiZWNhdXNlIGl0IGlzIHVzZWQgZm9yIHRhc2sgcGxhY2VtZW50LiBJZiB0aGUgZHJpdmVyIHdhcyBpbnN0YWxsZWQgdXNpbmcgdGhlIERvY2tlciBwbHVnaW4gQ0xJLCB1c2UgYGBkb2NrZXIgcGx1Z2luIGxzYGAgdG8gcmV0cmlldmUgdGhlIGRyaXZlciBuYW1lIGZyb20geW91ciBjb250YWluZXIgaW5zdGFuY2UuIElmIHRoZSBkcml2ZXIgd2FzIGluc3RhbGxlZCB1c2luZyBhbm90aGVyIG1ldGhvZCwgdXNlIERvY2tlciBwbHVnaW4gZGlzY292ZXJ5IHRvIHJldHJpZXZlIHRoZSBkcml2ZXIgbmFtZS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERyaXZlcmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGB4eGRyaXZlcmBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuRHJpdmVyPzogc3RyaW5nXG4vKipcbiAqIEN1c3RvbSBtZXRhZGF0YSB0byBhZGQgdG8geW91ciBEb2NrZXIgdm9sdW1lLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTGFiZWxzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYHh4bGFiZWxgYCBvcHRpb24gdG8gZG9ja2VyIHZvbHVtZSBjcmVhdGUuXG4gKi9cbkxhYmVscz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxufVxuLyoqXG4gKiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2hlbiB5b3UgdXNlIEFtYXpvbiBGU3ggZm9yIFdpbmRvd3MgRmlsZSBTZXJ2ZXIgZmlsZSBzeXN0ZW0gZm9yIHRhc2sgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb24ge1xuQXV0aG9yaXphdGlvbkNvbmZpZz86IEZTeEF1dGhvcml6YXRpb25Db25maWdcbi8qKlxuICogVGhlIEFtYXpvbiBGU3ggZm9yIFdpbmRvd3MgRmlsZSBTZXJ2ZXIgZmlsZSBzeXN0ZW0gSUQgdG8gdXNlLlxuICovXG5GaWxlU3lzdGVtSWQ6IHN0cmluZ1xuLyoqXG4gKiBUaGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSB0byBtb3VudCBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgaW5zaWRlIHRoZSBob3N0LlxuICovXG5Sb290RGlyZWN0b3J5OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGU3hBdXRob3JpemF0aW9uQ29uZmlnIHtcbi8qKlxuICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbCBvcHRpb24gdG8gdXNlLiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFsIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHVzaW5nIGVpdGhlciB0aGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgYW4gQVNNbG9uZyBzZWNyZXQgb3IgU1NNIFBhcmFtZXRlciBTdG9yZSBwYXJhbWV0ZXIuIFRoZSBBUk4gcmVmZXJzIHRvIHRoZSBzdG9yZWQgY3JlZGVudGlhbHMuXG4gKi9cbkNyZWRlbnRpYWxzUGFyYW1ldGVyOiBzdHJpbmdcbi8qKlxuICogQSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgaG9zdGVkIGJ5IGFuIFtdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kaXJlY3RvcnlzZXJ2aWNlL2xhdGVzdC9hZG1pbi1ndWlkZS9kaXJlY3RvcnlfbWljcm9zb2Z0X2FkLmh0bWwpIE1hbmFnZWQgTWljcm9zb2Z0IEFEIChBY3RpdmUgRGlyZWN0b3J5KSBvciBzZWxmLWhvc3RlZCBBRCBvbiBBbWF6b24gRUMyLlxuICovXG5Eb21haW46IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGBDb250YWluZXJEZWZpbml0aW9uYGAgcHJvcGVydHkgc3BlY2lmaWVzIGEgY29udGFpbmVyIGRlZmluaXRpb24uIENvbnRhaW5lciBkZWZpbml0aW9ucyBhcmUgdXNlZCBpbiB0YXNrIGRlZmluaXRpb25zIHRvIGRlc2NyaWJlIHRoZSBkaWZmZXJlbnQgY29udGFpbmVycyB0aGF0IGFyZSBsYXVuY2hlZCBhcyBwYXJ0IG9mIGEgdGFzay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJEZWZpbml0aW9uIHtcbi8qKlxuICogVGhlIHVzZXIgdG8gdXNlIGluc2lkZSB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVXNlcmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXVzZXJgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgV2hlbiBydW5uaW5nIHRhc2tzIHVzaW5nIHRoZSBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIGRvbid0IHJ1biBjb250YWluZXJzIHVzaW5nIHRoZSByb290IHVzZXIgKFVJRCAwKS4gV2UgcmVjb21tZW5kIHVzaW5nIGEgbm9uLXJvb3QgdXNlciBmb3IgYmV0dGVyIHNlY3VyaXR5LlxuICogICBZb3UgY2FuIHNwZWNpZnkgdGhlIGBgdXNlcmBgIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0cy4gSWYgc3BlY2lmeWluZyBhIFVJRCBvciBHSUQsIHlvdSBtdXN0IHNwZWNpZnkgaXQgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICogICArICAgYGB1c2VyYGAgXG4gKiAgICsgICBgYHVzZXI6Z3JvdXBgYCBcbiAqICAgKyAgIGBgdWlkYGAgXG4gKiAgICsgICBgYHVpZDpnaWRgYCBcbiAqICAgKyAgIGBgdXNlcjpnaWRgYCBcbiAqICAgKyAgIGBgdWlkOmdyb3VwYGAgXG4gKiAgIFxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cblVzZXI/OiBzdHJpbmdcbi8qKlxuICogVGhlIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTcGVjaWZ5aW5nIFNlbnNpdGl2ZSBEYXRhXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuU2VjcmV0cz86IFNlY3JldFtdXG4vKipcbiAqIFRoZSBhbW91bnQgKGluIE1pQikgb2YgbWVtb3J5IHRvIHByZXNlbnQgdG8gdGhlIGNvbnRhaW5lci4gSWYgeW91ciBjb250YWluZXIgYXR0ZW1wdHMgdG8gZXhjZWVkIHRoZSBtZW1vcnkgc3BlY2lmaWVkIGhlcmUsIHRoZSBjb250YWluZXIgaXMga2lsbGVkLiBUaGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSByZXNlcnZlZCBmb3IgYWxsIGNvbnRhaW5lcnMgd2l0aGluIGEgdGFzayBtdXN0IGJlIGxvd2VyIHRoYW4gdGhlIHRhc2sgYGBtZW1vcnlgYCB2YWx1ZSwgaWYgb25lIGlzIHNwZWNpZmllZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE1lbW9yeWBgIGluIHRoZSBbQ3JlYXRlIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8jb3BlcmF0aW9uL0NvbnRhaW5lckNyZWF0ZSkgc2VjdGlvbiBvZiB0aGUgW0RvY2tlciBSZW1vdGUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8pIGFuZCB0aGUgYGAtLW1lbW9yeWBgIG9wdGlvbiB0byBbZG9ja2VyIHJ1bl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvcnVuLyNzZWN1cml0eS1jb25maWd1cmF0aW9uKS5cbiAqICBJZiB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuXG4gKiAgSWYgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSwgeW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBvciBhIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgdmFsdWUuIElmIHlvdSBzcGVjaWZ5IGJvdGggYSBjb250YWluZXItbGV2ZWwgYGBtZW1vcnlgYCBhbmQgYGBtZW1vcnlSZXNlcnZhdGlvbmBgIHZhbHVlLCBgYG1lbW9yeWBgIG11c3QgYmUgZ3JlYXRlciB0aGFuIGBgbWVtb3J5UmVzZXJ2YXRpb25gYC4gSWYgeW91IHNwZWNpZnkgYGBtZW1vcnlSZXNlcnZhdGlvbmBgLCB0aGVuIHRoYXQgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBhdmFpbGFibGUgbWVtb3J5IHJlc291cmNlcyBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIHBsYWNlZC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYGBtZW1vcnlgYCBpcyB1c2VkLlxuICogIFRoZSBEb2NrZXIgMjAuMTAuMCBvciBsYXRlciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDYgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIsIHNvIHlvdSBzaG91bGQgbm90IHNwZWNpZnkgZmV3ZXIgdGhhbiA2IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqICBUaGUgRG9ja2VyIDE5LjAzLjEzLWNlIG9yIGVhcmxpZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA0IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLCBzbyB5b3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IGZld2VyIHRoYW4gNCBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuXG4gKi9cbk1lbW9yeT86IG51bWJlclxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZSBjb250YWluZXIgaXMgZ2l2ZW4gZWxldmF0ZWQgcHJpdmlsZWdlcyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgKHNpbWlsYXIgdG8gdGhlIGBgcm9vdGBgIHVzZXIpLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgUHJpdmlsZWdlZGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXByaXZpbGVnZWRgYCBvcHRpb24gdG8gZG9ja2VyIHJ1blxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb3IgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5Qcml2aWxlZ2VkPzogYm9vbGVhblxuSGVhbHRoQ2hlY2s/OiBIZWFsdGhDaGVja1xuLyoqXG4gKiBUaW1lIGR1cmF0aW9uIChpbiBzZWNvbmRzKSB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgb24gcmVzb2x2aW5nIGRlcGVuZGVuY2llcyBmb3IgYSBjb250YWluZXIuIEZvciBleGFtcGxlLCB5b3Ugc3BlY2lmeSB0d28gY29udGFpbmVycyBpbiBhIHRhc2sgZGVmaW5pdGlvbiB3aXRoIGNvbnRhaW5lckEgaGF2aW5nIGEgZGVwZW5kZW5jeSBvbiBjb250YWluZXJCIHJlYWNoaW5nIGEgYGBDT01QTEVURWBgLCBgYFNVQ0NFU1NgYCwgb3IgYGBIRUFMVEhZYGAgc3RhdHVzLiBJZiBhIGBgc3RhcnRUaW1lb3V0YGAgdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBjb250YWluZXJCIGFuZCBpdCBkb2Vzbid0IHJlYWNoIHRoZSBkZXNpcmVkIHN0YXR1cyB3aXRoaW4gdGhhdCB0aW1lIHRoZW4gY29udGFpbmVyQSBnaXZlcyB1cCBhbmQgbm90IHN0YXJ0LiBUaGlzIHJlc3VsdHMgaW4gdGhlIHRhc2sgdHJhbnNpdGlvbmluZyB0byBhIGBgU1RPUFBFRGBgIHN0YXRlLlxuICogICBXaGVuIHRoZSBgYEVDU19DT05UQUlORVJfU1RBUlRfVElNRU9VVGBgIGNvbnRhaW5lciBhZ2VudCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHVzZWQsIGl0J3MgZW5mb3JjZWQgaW5kZXBlbmRlbnRseSBmcm9tIHRoaXMgc3RhcnQgdGltZW91dCB2YWx1ZS5cbiAqICAgRm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgdGFzayBvciBzZXJ2aWNlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOlxuICogICArICBMaW51eCBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4zLjBgYCBvciBsYXRlci5cbiAqICAgKyAgV2luZG93cyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4wLjBgYCBvciBsYXRlci5cbiAqICAgXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gYGAxLjI2LjBgYCBvZiB0aGUgY29udGFpbmVyIGFnZW50IHRvIHVzZSBhIGNvbnRhaW5lciBzdGFydCB0aW1lb3V0IHZhbHVlLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSdyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiBgYDEuMjYuMC0xYGAgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSB2YWxpZCB2YWx1ZXMgZm9yIEZhcmdhdGUgYXJlIDItMTIwIHNlY29uZHMuXG4gKi9cblN0YXJ0VGltZW91dD86IG51bWJlclxuLyoqXG4gKiBEYXRhIHZvbHVtZXMgdG8gbW91bnQgZnJvbSBhbm90aGVyIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFZvbHVtZXNGcm9tYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdm9sdW1lcy1mcm9tYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cblZvbHVtZXNGcm9tPzogVm9sdW1lRnJvbVtdXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgYGBjcHVgYCB1bml0cyByZXNlcnZlZCBmb3IgdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYENwdVNoYXJlc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kYW5kIHRoZSBgYC0tY3B1LXNoYXJlc2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgZm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCBhbmQgdGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgdG90YWwgYW1vdW50IG9mIENQVSByZXNlcnZlZCBmb3IgYWxsIGNvbnRhaW5lcnMgd2l0aGluIGEgdGFzayBiZSBsb3dlciB0aGFuIHRoZSB0YXNrLWxldmVsIGBgY3B1YGAgdmFsdWUuXG4gKiAgIFlvdSBjYW4gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgQ1BVIHVuaXRzIHRoYXQgYXJlIGF2YWlsYWJsZSBwZXIgRUMyIGluc3RhbmNlIHR5cGUgYnkgbXVsdGlwbHlpbmcgdGhlIHZDUFVzIGxpc3RlZCBmb3IgdGhhdCBpbnN0YW5jZSB0eXBlIG9uIHRoZSBbQW1hem9uIEVDMiBJbnN0YW5jZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lYzIvaW5zdGFuY2UtdHlwZXMvKSBkZXRhaWwgcGFnZSBieSAxLDAyNC5cbiAqICAgTGludXggY29udGFpbmVycyBzaGFyZSB1bmFsbG9jYXRlZCBDUFUgdW5pdHMgd2l0aCBvdGhlciBjb250YWluZXJzIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSByYXRpbyBhcyB0aGVpciBhbGxvY2F0ZWQgYW1vdW50LiBGb3IgZXhhbXBsZSwgaWYgeW91IHJ1biBhIHNpbmdsZS1jb250YWluZXIgdGFzayBvbiBhIHNpbmdsZS1jb3JlIGluc3RhbmNlIHR5cGUgd2l0aCA1MTIgQ1BVIHVuaXRzIHNwZWNpZmllZCBmb3IgdGhhdCBjb250YWluZXIsIGFuZCB0aGF0J3MgdGhlIG9ubHkgdGFzayBydW5uaW5nIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UsIHRoYXQgY29udGFpbmVyIGNvdWxkIHVzZSB0aGUgZnVsbCAxLDAyNCBDUFUgdW5pdCBzaGFyZSBhdCBhbnkgZ2l2ZW4gdGltZS4gSG93ZXZlciwgaWYgeW91IGxhdW5jaGVkIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSB0YXNrIG9uIHRoYXQgY29udGFpbmVyIGluc3RhbmNlLCBlYWNoIHRhc2sgaXMgZ3VhcmFudGVlZCBhIG1pbmltdW0gb2YgNTEyIENQVSB1bml0cyB3aGVuIG5lZWRlZC4gTW9yZW92ZXIsIGVhY2ggY29udGFpbmVyIGNvdWxkIGZsb2F0IHRvIGhpZ2hlciBDUFUgdXNhZ2UgaWYgdGhlIG90aGVyIGNvbnRhaW5lciB3YXMgbm90IHVzaW5nIGl0LiBJZiBib3RoIHRhc2tzIHdlcmUgMTAwJSBhY3RpdmUgYWxsIG9mIHRoZSB0aW1lLCB0aGV5IHdvdWxkIGJlIGxpbWl0ZWQgdG8gNTEyIENQVSB1bml0cy5cbiAqICBPbiBMaW51eCBjb250YWluZXIgaW5zdGFuY2VzLCB0aGUgRG9ja2VyIGRhZW1vbiBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHVzZXMgdGhlIENQVSB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIHJlbGF0aXZlIENQVSBzaGFyZSByYXRpb3MgZm9yIHJ1bm5pbmcgY29udGFpbmVycy4gVGhlIG1pbmltdW0gdmFsaWQgQ1BVIHNoYXJlIHZhbHVlIHRoYXQgdGhlIExpbnV4IGtlcm5lbCBhbGxvd3MgaXMgMiwgYW5kIHRoZSBtYXhpbXVtIHZhbGlkIENQVSBzaGFyZSB2YWx1ZSB0aGF0IHRoZSBMaW51eCBrZXJuZWwgYWxsb3dzIGlzIDI2MjE0NC4gSG93ZXZlciwgdGhlIENQVSBwYXJhbWV0ZXIgaXNuJ3QgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIHVzZSBDUFUgdmFsdWVzIGJlbG93IDIgb3IgYWJvdmUgMjYyMTQ0IGluIHlvdXIgY29udGFpbmVyIGRlZmluaXRpb25zLiBGb3IgQ1BVIHZhbHVlcyBiZWxvdyAyIChpbmNsdWRpbmcgbnVsbCkgb3IgYWJvdmUgMjYyMTQ0LCB0aGUgYmVoYXZpb3IgdmFyaWVzIGJhc2VkIG9uIHlvdXIgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgdmVyc2lvbjpcbiAqICAgKyAgKkFnZW50IHZlcnNpb25zIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLjEuMDoqIE51bGwgYW5kIHplcm8gQ1BVIHZhbHVlcyBhcmUgcGFzc2VkIHRvIERvY2tlciBhcyAwLCB3aGljaCBEb2NrZXIgdGhlbiBjb252ZXJ0cyB0byAxLDAyNCBDUFUgc2hhcmVzLiBDUFUgdmFsdWVzIG9mIDEgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMSwgd2hpY2ggdGhlIExpbnV4IGtlcm5lbCBjb252ZXJ0cyB0byB0d28gQ1BVIHNoYXJlcy5cbiAqICAgKyAgKkFnZW50IHZlcnNpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLjIuMDoqIE51bGwsIHplcm8sIGFuZCBDUFUgdmFsdWVzIG9mIDEgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMi5cbiAqICAgKyAgKkFnZW50IHZlcnNpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLjg0LjA6KiBDUFUgdmFsdWVzIGdyZWF0ZXIgdGhhbiAyNTYgdkNQVSBhcmUgcGFzc2VkIHRvIERvY2tlciBhcyAyNTYsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gMjYyMTQ0IENQVSBzaGFyZXMuXG4gKiAgIFxuICogIE9uIFdpbmRvd3MgY29udGFpbmVyIGluc3RhbmNlcywgdGhlIENQVSBsaW1pdCBpcyBlbmZvcmNlZCBhcyBhbiBhYnNvbHV0ZSBsaW1pdCwgb3IgYSBxdW90YS4gV2luZG93cyBjb250YWluZXJzIG9ubHkgaGF2ZSBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgQ1BVIHRoYXQncyBkZXNjcmliZWQgaW4gdGhlIHRhc2sgZGVmaW5pdGlvbi4gQSBudWxsIG9yIHplcm8gQ1BVIHZhbHVlIGlzIHBhc3NlZCB0byBEb2NrZXIgYXMgYGAwYGAsIHdoaWNoIFdpbmRvd3MgaW50ZXJwcmV0cyBhcyAxJSBvZiBvbmUgQ1BVLlxuICovXG5DcHU/OiBudW1iZXJcbi8qKlxuICogRWFybHkgdmVyc2lvbnMgb2YgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IGRvbid0IHByb3Blcmx5IGhhbmRsZSBgYGVudHJ5UG9pbnRgYCBwYXJhbWV0ZXJzLiBJZiB5b3UgaGF2ZSBwcm9ibGVtcyB1c2luZyBgYGVudHJ5UG9pbnRgYCwgdXBkYXRlIHlvdXIgY29udGFpbmVyIGFnZW50IG9yIGVudGVyIHlvdXIgY29tbWFuZHMgYW5kIGFyZ3VtZW50cyBhcyBgYGNvbW1hbmRgYCBhcnJheSBpdGVtcyBpbnN0ZWFkLlxuICogICBUaGUgZW50cnkgcG9pbnQgdGhhdCdzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRW50cnlwb2ludGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWVudHJ5cG9pbnRgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuRW50cnlQb2ludD86IHN0cmluZ1tdXG4vKipcbiAqIEEgbGlzdCBvZiBETlMgc2VydmVycyB0aGF0IGFyZSBwcmVzZW50ZWQgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERuc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWRuc2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbkRuc1NlcnZlcnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZSBjb250YWluZXIgaXMgZ2l2ZW4gcmVhZC1vbmx5IGFjY2VzcyB0byBpdHMgcm9vdCBmaWxlIHN5c3RlbS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFJlYWRvbmx5Um9vdGZzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tcmVhZC1vbmx5YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuUmVhZG9ubHlSb290RmlsZXN5c3RlbT86IGJvb2xlYW5cbi8qKlxuICogVGhlIGltYWdlIHVzZWQgdG8gc3RhcnQgYSBjb250YWluZXIuIFRoaXMgc3RyaW5nIGlzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgRG9ja2VyIGRhZW1vbi4gQnkgZGVmYXVsdCwgaW1hZ2VzIGluIHRoZSBEb2NrZXIgSHViIHJlZ2lzdHJ5IGFyZSBhdmFpbGFibGUuIE90aGVyIHJlcG9zaXRvcmllcyBhcmUgc3BlY2lmaWVkIHdpdGggZWl0aGVyIGBgcmVwb3NpdG9yeS11cmwvaW1hZ2U6dGFnYGAgb3IgYGByZXBvc2l0b3J5LXVybC9pbWFnZUBkaWdlc3RgYC4gRm9yIGltYWdlcyB1c2luZyB0YWdzIChyZXBvc2l0b3J5LXVybC9pbWFnZTp0YWcpLCB1cCB0byAyNTUgY2hhcmFjdGVycyB0b3RhbCBhcmUgYWxsb3dlZCwgaW5jbHVkaW5nIGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGNvbG9ucywgcGVyaW9kcywgZm9yd2FyZCBzbGFzaGVzLCBhbmQgbnVtYmVyIHNpZ25zICgjKS4gRm9yIGltYWdlcyB1c2luZyBkaWdlc3RzIChyZXBvc2l0b3J5LXVybC9pbWFnZUBkaWdlc3QpLCB0aGUgMjU1IGNoYXJhY3RlciBsaW1pdCBhcHBsaWVzIG9ubHkgdG8gdGhlIHJlcG9zaXRvcnkgVVJMIGFuZCBpbWFnZSBuYW1lIChldmVyeXRoaW5nIGJlZm9yZSB0aGUgQCBzaWduKS4gVGhlIG9ubHkgc3VwcG9ydGVkIGhhc2ggZnVuY3Rpb24gaXMgc2hhMjU2LCBhbmQgdGhlIGhhc2ggdmFsdWUgYWZ0ZXIgc2hhMjU2OiBtdXN0IGJlIGV4YWN0bHkgNjQgY2hhcmFjdGVycyAob25seSBsZXR0ZXJzIEEtRiwgYS1mLCBhbmQgbnVtYmVycyAwLTkgYXJlIGFsbG93ZWQpLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgSW1hZ2VgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgSU1BR0VgYCBwYXJhbWV0ZXIgb2YgZG9ja2VyIHJ1bi5cbiAqICAgKyAgV2hlbiBhIG5ldyB0YXNrIHN0YXJ0cywgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHB1bGxzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZCB0YWcgZm9yIHRoZSBjb250YWluZXIgdG8gdXNlLiBIb3dldmVyLCBzdWJzZXF1ZW50IHVwZGF0ZXMgdG8gYSByZXBvc2l0b3J5IGltYWdlIGFyZW4ndCBwcm9wYWdhdGVkIHRvIGFscmVhZHkgcnVubmluZyB0YXNrcy5cbiAqICAgKyAgSW1hZ2VzIGluIEFtYXpvbiBFQ1IgcmVwb3NpdG9yaWVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyIHVzaW5nIHRoZSBmdWxsIGBgcmVnaXN0cnkvcmVwb3NpdG9yeTp0YWdgYCBvciBgYHJlZ2lzdHJ5L3JlcG9zaXRvcnlAZGlnZXN0YGAuIEZvciBleGFtcGxlLCBgYDAxMjM0NTY3ODkxMC5ka3IuZWNyLjxyZWdpb24tbmFtZT4uYW1hem9uYXdzLmNvbS88cmVwb3NpdG9yeS1uYW1lPjpsYXRlc3RgYCBvciBgYDAxMjM0NTY3ODkxMC5ka3IuZWNyLjxyZWdpb24tbmFtZT4uYW1hem9uYXdzLmNvbS88cmVwb3NpdG9yeS1uYW1lPkBzaGEyNTY6OTRhZmQxZjJlNjRkOTA4YmM5MGRiY2EwMDM1YTViNTY3RVhBTVBMRWBgLiBcbiAqICAgKyAgSW1hZ2VzIGluIG9mZmljaWFsIHJlcG9zaXRvcmllcyBvbiBEb2NrZXIgSHViIHVzZSBhIHNpbmdsZSBuYW1lIChmb3IgZXhhbXBsZSwgYGB1YnVudHVgYCBvciBgYG1vbmdvYGApLlxuICogICArICBJbWFnZXMgaW4gb3RoZXIgcmVwb3NpdG9yaWVzIG9uIERvY2tlciBIdWIgYXJlIHF1YWxpZmllZCB3aXRoIGFuIG9yZ2FuaXphdGlvbiBuYW1lIChmb3IgZXhhbXBsZSwgYGBhbWF6b24vYW1hem9uLWVjcy1hZ2VudGBgKS5cbiAqICAgKyAgSW1hZ2VzIGluIG90aGVyIG9ubGluZSByZXBvc2l0b3JpZXMgYXJlIHF1YWxpZmllZCBmdXJ0aGVyIGJ5IGEgZG9tYWluIG5hbWUgKGZvciBleGFtcGxlLCBgYHF1YXkuaW8vYXNzZW1ibHlsaW5lL3VidW50dWBgKS5cbiAqL1xuSW1hZ2U6IHN0cmluZ1xuLyoqXG4gKiBJZiB0aGUgYGBlc3NlbnRpYWxgYCBwYXJhbWV0ZXIgb2YgYSBjb250YWluZXIgaXMgbWFya2VkIGFzIGBgdHJ1ZWBgLCBhbmQgdGhhdCBjb250YWluZXIgZmFpbHMgb3Igc3RvcHMgZm9yIGFueSByZWFzb24sIGFsbCBvdGhlciBjb250YWluZXJzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHRhc2sgYXJlIHN0b3BwZWQuIElmIHRoZSBgYGVzc2VudGlhbGBgIHBhcmFtZXRlciBvZiBhIGNvbnRhaW5lciBpcyBtYXJrZWQgYXMgYGBmYWxzZWBgLCBpdHMgZmFpbHVyZSBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdCBvZiB0aGUgY29udGFpbmVycyBpbiBhIHRhc2suIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIGEgY29udGFpbmVyIGlzIGFzc3VtZWQgdG8gYmUgZXNzZW50aWFsLlxuICogIEFsbCB0YXNrcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVzc2VudGlhbCBjb250YWluZXIuIElmIHlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQncyBjb21wb3NlZCBvZiBtdWx0aXBsZSBjb250YWluZXJzLCBncm91cCBjb250YWluZXJzIHRoYXQgYXJlIHVzZWQgZm9yIGEgY29tbW9uIHB1cnBvc2UgaW50byBjb21wb25lbnRzLCBhbmQgc2VwYXJhdGUgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIGludG8gbXVsdGlwbGUgdGFzayBkZWZpbml0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQXBwbGljYXRpb24gQXJjaGl0ZWN0dXJlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9hcHBsaWNhdGlvbl9hcmNoaXRlY3R1cmUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Fc3NlbnRpYWw/OiBib29sZWFuXG5Mb2dDb25maWd1cmF0aW9uPzogTG9nQ29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgdHlwZSBhbmQgYW1vdW50IG9mIGEgcmVzb3VyY2UgdG8gYXNzaWduIHRvIGEgY29udGFpbmVyLiBUaGUgb25seSBzdXBwb3J0ZWQgcmVzb3VyY2UgaXMgYSBHUFUuXG4gKi9cblJlc291cmNlUmVxdWlyZW1lbnRzPzogUmVzb3VyY2VSZXF1aXJlbWVudFtdXG4vKipcbiAqIEEgbGlzdCBvZiBmaWxlcyBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byBhIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLWVudi1maWxlYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgWW91IGNhbiBzcGVjaWZ5IHVwIHRvIHRlbiBlbnZpcm9ubWVudCBmaWxlcy4gVGhlIGZpbGUgbXVzdCBoYXZlIGEgYGAuZW52YGAgZmlsZSBleHRlbnNpb24uIEVhY2ggbGluZSBpbiBhbiBlbnZpcm9ubWVudCBmaWxlIGNvbnRhaW5zIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGluIGBgVkFSSUFCTEU9VkFMVUVgYCBmb3JtYXQuIExpbmVzIGJlZ2lubmluZyB3aXRoIGBgI2BgIGFyZSB0cmVhdGVkIGFzIGNvbW1lbnRzIGFuZCBhcmUgaWdub3JlZC5cbiAqICBJZiB0aGVyZSBhcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNwZWNpZmllZCB1c2luZyB0aGUgYGBlbnZpcm9ubWVudGBgIHBhcmFtZXRlciBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLCB0aGV5IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSB2YXJpYWJsZXMgY29udGFpbmVkIHdpdGhpbiBhbiBlbnZpcm9ubWVudCBmaWxlLiBJZiBtdWx0aXBsZSBlbnZpcm9ubWVudCBmaWxlcyBhcmUgc3BlY2lmaWVkIHRoYXQgY29udGFpbiB0aGUgc2FtZSB2YXJpYWJsZSwgdGhleSdyZSBwcm9jZXNzZWQgZnJvbSB0aGUgdG9wIGRvd24uIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdW5pcXVlIHZhcmlhYmxlIG5hbWVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTcGVjaWZ5aW5nIEVudmlyb25tZW50IFZhcmlhYmxlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza2RlZi1lbnZmaWxlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkVudmlyb25tZW50RmlsZXM/OiBFbnZpcm9ubWVudEZpbGVbXVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGNvbnRhaW5lci4gSWYgeW91J3JlIGxpbmtpbmcgbXVsdGlwbGUgY29udGFpbmVycyB0b2dldGhlciBpbiBhIHRhc2sgZGVmaW5pdGlvbiwgdGhlIGBgbmFtZWBgIG9mIG9uZSBjb250YWluZXIgY2FuIGJlIGVudGVyZWQgaW4gdGhlIGBgbGlua3NgYCBvZiBhbm90aGVyIGNvbnRhaW5lciB0byBjb25uZWN0IHRoZSBjb250YWluZXJzLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBuYW1lYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tbmFtZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5OYW1lOiBzdHJpbmdcbkZpcmVsZW5zQ29uZmlndXJhdGlvbj86IEZpcmVsZW5zQ29uZmlndXJhdGlvblxuLyoqXG4gKiBBIGxpc3Qgb2Ygc3RyaW5ncyB0byBwcm92aWRlIGN1c3RvbSBjb25maWd1cmF0aW9uIGZvciBtdWx0aXBsZSBzZWN1cml0eSBzeXN0ZW1zLiBUaGlzIGZpZWxkIGlzbid0IHZhbGlkIGZvciBjb250YWluZXJzIGluIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLlxuICogIEZvciBMaW51eCB0YXNrcyBvbiBFQzIsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBjdXN0b20gbGFiZWxzIGZvciBTRUxpbnV4IGFuZCBBcHBBcm1vciBtdWx0aS1sZXZlbCBzZWN1cml0eSBzeXN0ZW1zLlxuICogIEZvciBhbnkgdGFza3Mgb24gRUMyLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYSBjcmVkZW50aWFsIHNwZWMgZmlsZSB0aGF0IGNvbmZpZ3VyZXMgYSBjb250YWluZXIgZm9yIEFjdGl2ZSBEaXJlY3RvcnkgYXV0aGVudGljYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGdNU0FzIGZvciBXaW5kb3dzIENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3MtZ21zYS5odG1sKSBhbmQgW1VzaW5nIGdNU0FzIGZvciBMaW51eCBDb250YWluZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9saW51eC1nbXNhLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgU2VjdXJpdHlPcHRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1zZWN1cml0eS1vcHRgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHJ1bm5pbmcgb24gYSBjb250YWluZXIgaW5zdGFuY2UgbXVzdCByZWdpc3RlciB3aXRoIHRoZSBgYEVDU19TRUxJTlVYX0NBUEFCTEU9dHJ1ZWBgIG9yIGBgRUNTX0FQUEFSTU9SX0NBUEFCTEU9dHJ1ZWBgIGVudmlyb25tZW50IHZhcmlhYmxlcyBiZWZvcmUgY29udGFpbmVycyBwbGFjZWQgb24gdGhhdCBpbnN0YW5jZSBjYW4gdXNlIHRoZXNlIHNlY3VyaXR5IG9wdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50IENvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC1jb25maWcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBWYWxpZCB2YWx1ZXM6IFwibm8tbmV3LXByaXZpbGVnZXNcIiB8IFwiYXBwYXJtb3I6UFJPRklMRVwiIHwgXCJsYWJlbDp2YWx1ZVwiIHwgXCJjcmVkZW50aWFsc3BlYzpDcmVkZW50aWFsU3BlY0ZpbGVQYXRoXCJcbiAqL1xuRG9ja2VyU2VjdXJpdHlPcHRpb25zPzogc3RyaW5nW11cbi8qKlxuICogQSBsaXN0IG9mIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdG8gc2V0IGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBTeXNjdGxzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tc3lzY3RsYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIEZvciBleGFtcGxlLCB5b3UgY2FuIGNvbmZpZ3VyZSBgYG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfdGltZWBgIHNldHRpbmcgdG8gbWFpbnRhaW4gbG9uZ2VyIGxpdmVkIGNvbm5lY3Rpb25zLlxuICovXG5TeXN0ZW1Db250cm9scz86IFN5c3RlbUNvbnRyb2xbXVxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIGBgdHJ1ZWBgLCB5b3UgY2FuIGRlcGxveSBjb250YWluZXJpemVkIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgYGBzdGRpbmBgIG9yIGEgYGB0dHlgYCB0byBiZSBhbGxvY2F0ZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBPcGVuU3RkaW5gYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1pbnRlcmFjdGl2ZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5JbnRlcmFjdGl2ZT86IGJvb2xlYW5cbi8qKlxuICogQSBsaXN0IG9mIEROUyBzZWFyY2ggZG9tYWlucyB0aGF0IGFyZSBwcmVzZW50ZWQgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERuc1NlYXJjaGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWRucy1zZWFyY2hgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5EbnNTZWFyY2hEb21haW5zPzogc3RyaW5nW11cbi8qKlxuICogQSBsaXN0IG9mIEFSTnMgaW4gU1NNIG9yIEFtYXpvbiBTMyB0byBhIGNyZWRlbnRpYWwgc3BlYyAoYGBDcmVkU3BlY2BgKSBmaWxlIHRoYXQgY29uZmlndXJlcyB0aGUgY29udGFpbmVyIGZvciBBY3RpdmUgRGlyZWN0b3J5IGF1dGhlbnRpY2F0aW9uLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHRoaXMgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBgZG9ja2VyU2VjdXJpdHlPcHRpb25zYGAuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBBUk5zIGlzIDEuXG4gKiAgVGhlcmUgYXJlIHR3byBmb3JtYXRzIGZvciBlYWNoIEFSTi5cbiAqICAgKyBjcmVkZW50aWFsc3BlY2RvbWFpbmxlc3M6TXlBUk4gWW91IHVzZSBjcmVkZW50aWFsc3BlY2RvbWFpbmxlc3M6TXlBUk4gdG8gcHJvdmlkZSBhIENyZWRTcGVjIHdpdGggYW4gYWRkaXRpb25hbCBzZWN0aW9uIGZvciBhIHNlY3JldCBpbiAuIFlvdSBwcm92aWRlIHRoZSBsb2dpbiBjcmVkZW50aWFscyB0byB0aGUgZG9tYWluIGluIHRoZSBzZWNyZXQuIEVhY2ggdGFzayB0aGF0IHJ1bnMgb24gYW55IGNvbnRhaW5lciBpbnN0YW5jZSBjYW4gam9pbiBkaWZmZXJlbnQgZG9tYWlucy4gWW91IGNhbiB1c2UgdGhpcyBmb3JtYXQgd2l0aG91dCBqb2luaW5nIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdG8gYSBkb21haW4uICsgY3JlZGVudGlhbHNwZWM6TXlBUk4gWW91IHVzZSBjcmVkZW50aWFsc3BlYzpNeUFSTiB0byBwcm92aWRlIGEgQ3JlZFNwZWMgZm9yIGEgc2luZ2xlIGRvbWFpbi4gWW91IG11c3Qgam9pbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRvIHRoZSBkb21haW4gYmVmb3JlIHlvdSBzdGFydCBhbnkgdGFza3MgdGhhdCB1c2UgdGhpcyB0YXNrIGRlZmluaXRpb24uIFxuICogIEluIGJvdGggZm9ybWF0cywgcmVwbGFjZSBgYE15QVJOYGAgd2l0aCB0aGUgQVJOIGluIFNTTSBvciBBbWF6b24gUzMuXG4gKiAgSWYgeW91IHByb3ZpZGUgYSBgYGNyZWRlbnRpYWxzcGVjZG9tYWlubGVzczpNeUFSTmBgLCB0aGUgYGBjcmVkc3BlY2BgIG11c3QgcHJvdmlkZSBhIEFSTiBpbiBBU01sb25nIGZvciBhIHNlY3JldCBjb250YWluaW5nIHRoZSB1c2VybmFtZSwgcGFzc3dvcmQsIGFuZCB0aGUgZG9tYWluIHRvIGNvbm5lY3QgdG8uIEZvciBiZXR0ZXIgc2VjdXJpdHksIHRoZSBpbnN0YW5jZSBpc24ndCBqb2luZWQgdG8gdGhlIGRvbWFpbiBmb3IgZG9tYWlubGVzcyBhdXRoZW50aWNhdGlvbi4gT3RoZXIgYXBwbGljYXRpb25zIG9uIHRoZSBpbnN0YW5jZSBjYW4ndCB1c2UgdGhlIGRvbWFpbmxlc3MgY3JlZGVudGlhbHMuIFlvdSBjYW4gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIHJ1biB0YXNrcyBvbiB0aGUgc2FtZSBpbnN0YW5jZSwgZXZlbiBpdCB0aGUgdGFza3MgbmVlZCB0byBqb2luIGRpZmZlcmVudCBkb21haW5zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBnTVNBcyBmb3IgV2luZG93cyBDb250YWluZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS93aW5kb3dzLWdtc2EuaHRtbCkgYW5kIFtVc2luZyBnTVNBcyBmb3IgTGludXggQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbGludXgtZ21zYS5odG1sKS5cbiAqL1xuQ3JlZGVudGlhbFNwZWNzPzogc3RyaW5nW11cbi8qKlxuICogQSBsaXN0IG9mIGBgdWxpbWl0c2BgIHRvIHNldCBpbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVWxpbWl0c2BgIGluIHRoZSBbQ3JlYXRlIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8jb3BlcmF0aW9uL0NvbnRhaW5lckNyZWF0ZSkgc2VjdGlvbiBvZiB0aGUgW0RvY2tlciBSZW1vdGUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8pIGFuZCB0aGUgYGAtLXVsaW1pdGBgIG9wdGlvbiB0byBbZG9ja2VyIHJ1bl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvcnVuLykuIFZhbGlkIG5hbWluZyB2YWx1ZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgW1VsaW1pdF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbGltaXQuaHRtbCkgZGF0YSB0eXBlLiBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTggb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cblVsaW1pdHM/OiBVbGltaXRbXVxuLyoqXG4gKiBUaW1lIGR1cmF0aW9uIChpbiBzZWNvbmRzKSB0byB3YWl0IGJlZm9yZSB0aGUgY29udGFpbmVyIGlzIGZvcmNlZnVsbHkga2lsbGVkIGlmIGl0IGRvZXNuJ3QgZXhpdCBub3JtYWxseSBvbiBpdHMgb3duLlxuICogIEZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIHRhc2sgb3Igc2VydmljZSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuMy4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIG1heCBzdG9wIHRpbWVvdXQgdmFsdWUgaXMgMTIwIHNlY29uZHMgYW5kIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMzAgc2Vjb25kcyBpcyB1c2VkLlxuICogIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgRUMyIGxhdW5jaCB0eXBlLCBpZiB0aGUgYGBzdG9wVGltZW91dGBgIHBhcmFtZXRlciBpc24ndCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBzZXQgZm9yIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGBgRUNTX0NPTlRBSU5FUl9TVE9QX1RJTUVPVVRgYCBpcyB1c2VkLiBJZiBuZWl0aGVyIHRoZSBgYHN0b3BUaW1lb3V0YGAgcGFyYW1ldGVyIG9yIHRoZSBgYEVDU19DT05UQUlORVJfU1RPUF9USU1FT1VUYGAgYWdlbnQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBhcmUgc2V0LCB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiAzMCBzZWNvbmRzIGZvciBMaW51eCBjb250YWluZXJzIGFuZCAzMCBzZWNvbmRzIG9uIFdpbmRvd3MgY29udGFpbmVycyBhcmUgdXNlZC4gWW91ciBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byB1c2UgYSBjb250YWluZXIgc3RvcCB0aW1lb3V0IHZhbHVlLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSdyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhlIHZhbGlkIHZhbHVlcyBmb3IgRmFyZ2F0ZSBhcmUgMi0xMjAgc2Vjb25kcy5cbiAqL1xuU3RvcFRpbWVvdXQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biBjb21tYW5kcyBpbnNpZGUgdGhlIGNvbnRhaW5lciBpbi4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFdvcmtpbmdEaXJgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS13b3JrZGlyYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbldvcmtpbmdEaXJlY3Rvcnk/OiBzdHJpbmdcbi8qKlxuICogVGhlIHNvZnQgbGltaXQgKGluIE1pQikgb2YgbWVtb3J5IHRvIHJlc2VydmUgZm9yIHRoZSBjb250YWluZXIuIFdoZW4gc3lzdGVtIG1lbW9yeSBpcyB1bmRlciBoZWF2eSBjb250ZW50aW9uLCBEb2NrZXIgYXR0ZW1wdHMgdG8ga2VlcCB0aGUgY29udGFpbmVyIG1lbW9yeSB0byB0aGlzIHNvZnQgbGltaXQuIEhvd2V2ZXIsIHlvdXIgY29udGFpbmVyIGNhbiBjb25zdW1lIG1vcmUgbWVtb3J5IHdoZW4gaXQgbmVlZHMgdG8sIHVwIHRvIGVpdGhlciB0aGUgaGFyZCBsaW1pdCBzcGVjaWZpZWQgd2l0aCB0aGUgYGBtZW1vcnlgYCBwYXJhbWV0ZXIgKGlmIGFwcGxpY2FibGUpLCBvciBhbGwgb2YgdGhlIGF2YWlsYWJsZSBtZW1vcnkgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTWVtb3J5UmVzZXJ2YXRpb25gYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1tZW1vcnktcmVzZXJ2YXRpb25gYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBJZiBhIHRhc2stbGV2ZWwgbWVtb3J5IHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIHlvdSBtdXN0IHNwZWNpZnkgYSBub24temVybyBpbnRlZ2VyIGZvciBvbmUgb3IgYm90aCBvZiBgYG1lbW9yeWBgIG9yIGBgbWVtb3J5UmVzZXJ2YXRpb25gYCBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLiBJZiB5b3Ugc3BlY2lmeSBib3RoLCBgYG1lbW9yeWBgIG11c3QgYmUgZ3JlYXRlciB0aGFuIGBgbWVtb3J5UmVzZXJ2YXRpb25gYC4gSWYgeW91IHNwZWNpZnkgYGBtZW1vcnlSZXNlcnZhdGlvbmBgLCB0aGVuIHRoYXQgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBhdmFpbGFibGUgbWVtb3J5IHJlc291cmNlcyBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIHBsYWNlZC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYGBtZW1vcnlgYCBpcyB1c2VkLlxuICogIEZvciBleGFtcGxlLCBpZiB5b3VyIGNvbnRhaW5lciBub3JtYWxseSB1c2VzIDEyOCBNaUIgb2YgbWVtb3J5LCBidXQgb2NjYXNpb25hbGx5IGJ1cnN0cyB0byAyNTYgTWlCIG9mIG1lbW9yeSBmb3Igc2hvcnQgcGVyaW9kcyBvZiB0aW1lLCB5b3UgY2FuIHNldCBhIGBgbWVtb3J5UmVzZXJ2YXRpb25gYCBvZiAxMjggTWlCLCBhbmQgYSBgYG1lbW9yeWBgIGhhcmQgbGltaXQgb2YgMzAwIE1pQi4gVGhpcyBjb25maWd1cmF0aW9uIHdvdWxkIGFsbG93IHRoZSBjb250YWluZXIgdG8gb25seSByZXNlcnZlIDEyOCBNaUIgb2YgbWVtb3J5IGZyb20gdGhlIHJlbWFpbmluZyByZXNvdXJjZXMgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSwgYnV0IGFsc28gYWxsb3cgdGhlIGNvbnRhaW5lciB0byBjb25zdW1lIG1vcmUgbWVtb3J5IHJlc291cmNlcyB3aGVuIG5lZWRlZC5cbiAqICBUaGUgRG9ja2VyIDIwLjEwLjAgb3IgbGF0ZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA2IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLiBTbywgZG9uJ3Qgc3BlY2lmeSBsZXNzIHRoYW4gNiBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuIFxuICogIFRoZSBEb2NrZXIgMTkuMDMuMTMtY2Ugb3IgZWFybGllciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDQgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIuIFNvLCBkb24ndCBzcGVjaWZ5IGxlc3MgdGhhbiA0IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqL1xuTWVtb3J5UmVzZXJ2YXRpb24/OiBudW1iZXJcblJlcG9zaXRvcnlDcmVkZW50aWFscz86IFJlcG9zaXRvcnlDcmVkZW50aWFsc1xuLyoqXG4gKiBBIGxpc3Qgb2YgaG9zdG5hbWVzIGFuZCBJUCBhZGRyZXNzIG1hcHBpbmdzIHRvIGFwcGVuZCB0byB0aGUgYGAvZXRjL2hvc3RzYGAgZmlsZSBvbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRXh0cmFIb3N0c2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWFkZC1ob3N0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZS5cbiAqL1xuRXh0cmFIb3N0cz86IEhvc3RFbnRyeVtdXG4vKipcbiAqIFRoZSBob3N0bmFtZSB0byB1c2UgZm9yIHlvdXIgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgSG9zdG5hbWVgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1ob3N0bmFtZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGUgYGBob3N0bmFtZWBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGlmIHlvdSdyZSB1c2luZyB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuXG4gKi9cbkhvc3RuYW1lPzogc3RyaW5nXG5MaW51eFBhcmFtZXRlcnM/OiBMaW51eFBhcmFtZXRlcnNcbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgQW1hem9uIEVDUyB3aWxsIHJlc29sdmUgdGhlIGNvbnRhaW5lciBpbWFnZSB0YWcgcHJvdmlkZWQgaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uIHRvIGFuIGltYWdlIGRpZ2VzdC4gQnkgZGVmYXVsdCwgdGhlIHZhbHVlIGlzIGBgZW5hYmxlZGBgLiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBmb3IgYSBjb250YWluZXIgYXMgYGBkaXNhYmxlZGBgLCBBbWF6b24gRUNTIHdpbGwgbm90IHJlc29sdmUgdGhlIHByb3ZpZGVkIGNvbnRhaW5lciBpbWFnZSB0YWcgdG8gYSBkaWdlc3QgYW5kIHdpbGwgdXNlIHRoZSBvcmlnaW5hbCBpbWFnZSBVUkkgc3BlY2lmaWVkIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiBmb3IgZGVwbG95bWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIGltYWdlIHJlc29sdXRpb24sIHNlZSBbQ29udGFpbmVyIGltYWdlIHJlc29sdXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2RlcGxveW1lbnQtdHlwZS1lY3MuaHRtbCNkZXBsb3ltZW50LWNvbnRhaW5lci1pbWFnZS1zdGFiaWxpdHkpIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5WZXJzaW9uQ29uc2lzdGVuY3k/OiAoXCJlbmFibGVkXCIgfCBcImRpc2FibGVkXCIpXG5SZXN0YXJ0UG9saWN5PzogUmVzdGFydFBvbGljeVxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIG5ldHdvcmtpbmcgaXMgb2ZmIHdpdGhpbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTmV0d29ya0Rpc2FibGVkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQuXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRGlzYWJsZU5ldHdvcmtpbmc/OiBib29sZWFuXG4vKipcbiAqIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgYGB0cnVlYGAsIGEgVFRZIGlzIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFR0eWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXR0eWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5Qc2V1ZG9UZXJtaW5hbD86IGJvb2xlYW5cbi8qKlxuICogVGhlIG1vdW50IHBvaW50cyBmb3IgZGF0YSB2b2x1bWVzIGluIHlvdXIgY29udGFpbmVyLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBWb2x1bWVzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdm9sdW1lYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgV2luZG93cyBjb250YWluZXJzIGNhbiBtb3VudCB3aG9sZSBkaXJlY3RvcmllcyBvbiB0aGUgc2FtZSBkcml2ZSBhcyBgYCRlbnY6UHJvZ3JhbURhdGFgYC4gV2luZG93cyBjb250YWluZXJzIGNhbid0IG1vdW50IGRpcmVjdG9yaWVzIG9uIGEgZGlmZmVyZW50IGRyaXZlLCBhbmQgbW91bnQgcG9pbnQgY2FuJ3QgYmUgYWNyb3NzIGRyaXZlcy5cbiAqL1xuTW91bnRQb2ludHM/OiBNb3VudFBvaW50W11cbi8qKlxuICogVGhlIGRlcGVuZGVuY2llcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24uIEEgY29udGFpbmVyIGNhbiBjb250YWluIG11bHRpcGxlIGRlcGVuZGVuY2llcy4gV2hlbiBhIGRlcGVuZGVuY3kgaXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAsIGZvciBjb250YWluZXIgc2h1dGRvd24gaXQgaXMgcmV2ZXJzZWQuXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHRoZSBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byB0dXJuIG9uIGNvbnRhaW5lciBkZXBlbmRlbmNpZXMuIEhvd2V2ZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgbGF0ZXN0IGNvbnRhaW5lciBhZ2VudCB2ZXJzaW9uLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hlY2tpbmcgeW91ciBhZ2VudCB2ZXJzaW9uIGFuZCB1cGRhdGluZyB0byB0aGUgbGF0ZXN0IHZlcnNpb24sIHNlZSBbVXBkYXRpbmcgdGhlIEFtYXpvbiBFQ1MgQ29udGFpbmVyIEFnZW50XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtdXBkYXRlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi4gSWYgeW91J3JlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZS4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGVuIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBJZiB0aGUgdGFzayBkZWZpbml0aW9uIGlzIHVzZWQgaW4gYSBibHVlL2dyZWVuIGRlcGxveW1lbnQgdGhhdCB1c2VzIFtBV1M6OkNvZGVEZXBsb3k6OkRlcGxveW1lbnRHcm91cCBCbHVlR3JlZW5EZXBsb3ltZW50Q29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtY29kZWRlcGxveS1kZXBsb3ltZW50Z3JvdXAtYmx1ZWdyZWVuZGVwbG95bWVudGNvbmZpZ3VyYXRpb24uaHRtbCksIHRoZSBgYGRlcGVuZHNPbmBgIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLlxuICovXG5EZXBlbmRzT24/OiBDb250YWluZXJEZXBlbmRlbmN5W11cbi8qKlxuICogQSBrZXkvdmFsdWUgbWFwIG9mIGxhYmVscyB0byBhZGQgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYExhYmVsc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWxhYmVsYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4xOCBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgXG4gKi9cbkRvY2tlckxhYmVscz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbGlzdCBvZiBwb3J0IG1hcHBpbmdzIGZvciB0aGUgY29udGFpbmVyLiBQb3J0IG1hcHBpbmdzIGFsbG93IGNvbnRhaW5lcnMgdG8gYWNjZXNzIHBvcnRzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB0byBzZW5kIG9yIHJlY2VpdmUgdHJhZmZpYy5cbiAqICBGb3IgdGFzayBkZWZpbml0aW9ucyB0aGF0IHVzZSB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUsIHlvdSBzaG91bGQgb25seSBzcGVjaWZ5IHRoZSBgYGNvbnRhaW5lclBvcnRgYC4gVGhlIGBgaG9zdFBvcnRgYCBjYW4gYmUgbGVmdCBibGFuayBvciBpdCBtdXN0IGJlIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRgYC5cbiAqICBQb3J0IG1hcHBpbmdzIG9uIFdpbmRvd3MgdXNlIHRoZSBgYE5ldE5BVGBgIGdhdGV3YXkgYWRkcmVzcyByYXRoZXIgdGhhbiBgYGxvY2FsaG9zdGBgLiBUaGVyZSBpcyBubyBsb29wYmFjayBmb3IgcG9ydCBtYXBwaW5ncyBvbiBXaW5kb3dzLCBzbyB5b3UgY2Fubm90IGFjY2VzcyBhIGNvbnRhaW5lcidzIG1hcHBlZCBwb3J0IGZyb20gdGhlIGhvc3QgaXRzZWxmLiBcbiAqICBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgUG9ydEJpbmRpbmdzYGAgaW4gdGhlIFtDcmVhdGUgYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LyNvcGVyYXRpb24vQ29udGFpbmVyQ3JlYXRlKSBzZWN0aW9uIG9mIHRoZSBbRG9ja2VyIFJlbW90ZSBBUEldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYXBpL3YxLjM1LykgYW5kIHRoZSBgYC0tcHVibGlzaGBgIG9wdGlvbiB0byBbZG9ja2VyIHJ1bl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvcnVuLykuIElmIHRoZSBuZXR3b3JrIG1vZGUgb2YgYSB0YXNrIGRlZmluaXRpb24gaXMgc2V0IHRvIGBgbm9uZWBgLCB0aGVuIHlvdSBjYW4ndCBzcGVjaWZ5IHBvcnQgbWFwcGluZ3MuIElmIHRoZSBuZXR3b3JrIG1vZGUgb2YgYSB0YXNrIGRlZmluaXRpb24gaXMgc2V0IHRvIGBgaG9zdGBgLCB0aGVuIGhvc3QgcG9ydHMgbXVzdCBlaXRoZXIgYmUgdW5kZWZpbmVkIG9yIHRoZXkgbXVzdCBtYXRjaCB0aGUgY29udGFpbmVyIHBvcnQgaW4gdGhlIHBvcnQgbWFwcGluZy5cbiAqICAgQWZ0ZXIgYSB0YXNrIHJlYWNoZXMgdGhlIGBgUlVOTklOR2BgIHN0YXR1cywgbWFudWFsIGFuZCBhdXRvbWF0aWMgaG9zdCBhbmQgY29udGFpbmVyIHBvcnQgYXNzaWdubWVudHMgYXJlIHZpc2libGUgaW4gdGhlICpOZXR3b3JrIEJpbmRpbmdzKiBzZWN0aW9uIG9mIGEgY29udGFpbmVyIGRlc2NyaXB0aW9uIGZvciBhIHNlbGVjdGVkIHRhc2sgaW4gdGhlIEFtYXpvbiBFQ1MgY29uc29sZS4gVGhlIGFzc2lnbm1lbnRzIGFyZSBhbHNvIHZpc2libGUgaW4gdGhlIGBgbmV0d29ya0JpbmRpbmdzYGAgc2VjdGlvbiBbRGVzY3JpYmVUYXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRhc2tzLmh0bWwpIHJlc3BvbnNlcy5cbiAqL1xuUG9ydE1hcHBpbmdzPzogUG9ydE1hcHBpbmdbXVxuLyoqXG4gKiBUaGUgY29tbWFuZCB0aGF0J3MgcGFzc2VkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBDbWRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgQ09NTUFORGBgIHBhcmFtZXRlciB0byBkb2NrZXIgcnVuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJndW1lbnRzLCBlYWNoIGFyZ3VtZW50IGlzIGEgc2VwYXJhdGVkIHN0cmluZyBpbiB0aGUgYXJyYXkuXG4gKi9cbkNvbW1hbmQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gYSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBFbnZgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1lbnZgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgV2UgZG9uJ3QgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBwbGFpbnRleHQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBzZW5zaXRpdmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgY3JlZGVudGlhbCBkYXRhLlxuICovXG5FbnZpcm9ubWVudD86IEtleVZhbHVlUGFpcltdXG4vKipcbiAqIFRoZSBgYGxpbmtzYGAgcGFyYW1ldGVyIGFsbG93cyBjb250YWluZXJzIHRvIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlciB3aXRob3V0IHRoZSBuZWVkIGZvciBwb3J0IG1hcHBpbmdzLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBpZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIGBgYnJpZGdlYGAuIFRoZSBgYG5hbWU6aW50ZXJuYWxOYW1lYGAgY29uc3RydWN0IGlzIGFuYWxvZ291cyB0byBgYG5hbWU6YWxpYXNgYCBpbiBEb2NrZXIgbGlua3MuIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBhcmUgYWxsb3dlZC4uIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMaW5rc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWxpbmtgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgQ29udGFpbmVycyB0aGF0IGFyZSBjb2xsb2NhdGVkIG9uIGEgc2luZ2xlIGNvbnRhaW5lciBpbnN0YW5jZSBtYXkgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgd2l0aG91dCByZXF1aXJpbmcgbGlua3Mgb3IgaG9zdCBwb3J0IG1hcHBpbmdzLiBOZXR3b3JrIGlzb2xhdGlvbiBpcyBhY2hpZXZlZCBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHVzaW5nIHNlY3VyaXR5IGdyb3VwcyBhbmQgVlBDIHNldHRpbmdzLlxuICovXG5MaW5rcz86IHN0cmluZ1tdXG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlY3JldCB0byBleHBvc2UgdG8geW91ciBjb250YWluZXIuIFNlY3JldHMgY2FuIGJlIGV4cG9zZWQgdG8gYSBjb250YWluZXIgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogICArICBUbyBpbmplY3Qgc2Vuc2l0aXZlIGRhdGEgaW50byB5b3VyIGNvbnRhaW5lcnMgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB1c2UgdGhlIGBgc2VjcmV0c2BgIGNvbnRhaW5lciBkZWZpbml0aW9uIHBhcmFtZXRlci5cbiAqICAgKyAgVG8gcmVmZXJlbmNlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBpbiB0aGUgbG9nIGNvbmZpZ3VyYXRpb24gb2YgYSBjb250YWluZXIsIHVzZSB0aGUgYGBzZWNyZXRPcHRpb25zYGAgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVyLlxuICogICBcbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTcGVjaWZ5aW5nIHNlbnNpdGl2ZSBkYXRhXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWNyZXQge1xuLyoqXG4gKiBUaGUgc2VjcmV0IHRvIGV4cG9zZSB0byB0aGUgY29udGFpbmVyLiBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgZWl0aGVyIHRoZSBmdWxsIEFSTiBvZiB0aGUgQVNNbG9uZyBzZWNyZXQgb3IgdGhlIGZ1bGwgQVJOIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIFNTTSBQYXJhbWV0ZXIgU3RvcmUuXG4gKiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1aXJlIElBTWxvbmcgcGVybWlzc2lvbnMsIHNlZSBbUmVxdWlyZWQgSUFNIHBlcm1pc3Npb25zIGZvciBBbWF6b24gRUNTIHNlY3JldHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEtc2VjcmV0cy5odG1sI3NlY3JldHMtaWFtKSAoZm9yIFNlY3JldHMgTWFuYWdlcikgb3IgW1JlcXVpcmVkIElBTSBwZXJtaXNzaW9ucyBmb3IgQW1hem9uIEVDUyBzZWNyZXRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLXBhcmFtZXRlcnMuaHRtbCkgKGZvciBTeXN0ZW1zIE1hbmFnZXIgUGFyYW1ldGVyIHN0b3JlKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIElmIHRoZSBTU00gUGFyYW1ldGVyIFN0b3JlIHBhcmFtZXRlciBleGlzdHMgaW4gdGhlIHNhbWUgUmVnaW9uIGFzIHRoZSB0YXNrIHlvdSdyZSBsYXVuY2hpbmcsIHRoZW4geW91IGNhbiB1c2UgZWl0aGVyIHRoZSBmdWxsIEFSTiBvciBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuIElmIHRoZSBwYXJhbWV0ZXIgZXhpc3RzIGluIGEgZGlmZmVyZW50IFJlZ2lvbiwgdGhlbiB0aGUgZnVsbCBBUk4gbXVzdCBiZSBzcGVjaWZpZWQuXG4gKi9cblZhbHVlRnJvbTogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBzZWNyZXQuXG4gKi9cbk5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGhlYWx0aCBjaGVjayBjb21tYW5kIGFuZCBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEhlYWx0aENoZWNrYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYEhFQUxUSENIRUNLYGAgcGFyYW1ldGVyIG9mIGRvY2tlciBydW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2sge1xuLyoqXG4gKiBBIHN0cmluZyBhcnJheSByZXByZXNlbnRpbmcgdGhlIGNvbW1hbmQgdGhhdCB0aGUgY29udGFpbmVyIHJ1bnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGhlYWx0aHkuIFRoZSBzdHJpbmcgYXJyYXkgbXVzdCBzdGFydCB3aXRoIGBgQ01EYGAgdG8gcnVuIHRoZSBjb21tYW5kIGFyZ3VtZW50cyBkaXJlY3RseSwgb3IgYGBDTUQtU0hFTExgYCB0byBydW4gdGhlIGNvbW1hbmQgd2l0aCB0aGUgY29udGFpbmVyJ3MgZGVmYXVsdCBzaGVsbC4gXG4gKiAgIFdoZW4geW91IHVzZSB0aGUgQVdTIE1hbmFnZW1lbnQgQ29uc29sZSBKU09OIHBhbmVsLCB0aGUgQ0xJbG9uZywgb3IgdGhlIEFQSXMsIGVuY2xvc2UgdGhlIGxpc3Qgb2YgY29tbWFuZHMgaW4gZG91YmxlIHF1b3RlcyBhbmQgYnJhY2tldHMuXG4gKiAgIGBgWyBcIkNNRC1TSEVMTFwiLCBcImN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdC8gfHwgZXhpdCAxXCIgXWBgIFxuICogIFlvdSBkb24ndCBpbmNsdWRlIHRoZSBkb3VibGUgcXVvdGVzIGFuZCBicmFja2V0cyB3aGVuIHlvdSB1c2UgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUuXG4gKiAgIGBgQ01ELVNIRUxMLCBjdXJsIC1mIGh0dHA6Ly9sb2NhbGhvc3QvIHx8IGV4aXQgMWBgIFxuICogIEFuIGV4aXQgY29kZSBvZiAwIGluZGljYXRlcyBzdWNjZXNzLCBhbmQgbm9uLXplcm8gZXhpdCBjb2RlIGluZGljYXRlcyBmYWlsdXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGBgSGVhbHRoQ2hlY2tgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZC5cbiAqL1xuQ29tbWFuZD86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSB0aW1lIHBlcmlvZCBpbiBzZWNvbmRzIHRvIHdhaXQgZm9yIGEgaGVhbHRoIGNoZWNrIHRvIHN1Y2NlZWQgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYSBmYWlsdXJlLiBZb3UgbWF5IHNwZWNpZnkgYmV0d2VlbiAyIGFuZCA2MCBzZWNvbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LiBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb21tYW5kYGAuXG4gKi9cblRpbWVvdXQ/OiBudW1iZXJcbi8qKlxuICogVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXRyeSBhIGZhaWxlZCBoZWFsdGggY2hlY2sgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgY29uc2lkZXJlZCB1bmhlYWx0aHkuIFlvdSBtYXkgc3BlY2lmeSBiZXR3ZWVuIDEgYW5kIDEwIHJldHJpZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMuIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4geW91IHNwZWNpZnkgYSBgYGNvbW1hbmRgYC5cbiAqL1xuUmV0cmllcz86IG51bWJlclxuLyoqXG4gKiBUaGUgdGltZSBwZXJpb2QgaW4gc2Vjb25kcyBiZXR3ZWVuIGVhY2ggaGVhbHRoIGNoZWNrIGV4ZWN1dGlvbi4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gNSBhbmQgMzAwIHNlY29uZHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMwIHNlY29uZHMuIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4geW91IHNwZWNpZnkgYSBgYGNvbW1hbmRgYC5cbiAqL1xuSW50ZXJ2YWw/OiBudW1iZXJcbi8qKlxuICogVGhlIG9wdGlvbmFsIGdyYWNlIHBlcmlvZCB0byBwcm92aWRlIGNvbnRhaW5lcnMgdGltZSB0byBib290c3RyYXAgYmVmb3JlIGZhaWxlZCBoZWFsdGggY2hlY2tzIGNvdW50IHRvd2FyZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuIFlvdSBjYW4gc3BlY2lmeSBiZXR3ZWVuIDAgYW5kIDMwMCBzZWNvbmRzLiBCeSBkZWZhdWx0LCB0aGUgYGBzdGFydFBlcmlvZGBgIGlzIG9mZi4gVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29tbWFuZGBgLiBcbiAqICAgSWYgYSBoZWFsdGggY2hlY2sgc3VjY2VlZHMgd2l0aGluIHRoZSBgYHN0YXJ0UGVyaW9kYGAsIHRoZW4gdGhlIGNvbnRhaW5lciBpcyBjb25zaWRlcmVkIGhlYWx0aHkgYW5kIGFueSBzdWJzZXF1ZW50IGZhaWx1cmVzIGNvdW50IHRvd2FyZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqL1xuU3RhcnRQZXJpb2Q/OiBudW1iZXJcbn1cbi8qKlxuICogRGV0YWlscyBvbiBhIGRhdGEgdm9sdW1lIGZyb20gYW5vdGhlciBjb250YWluZXIgaW4gdGhlIHNhbWUgdGFzayBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZvbHVtZUZyb20ge1xuLyoqXG4gKiBJZiB0aGlzIHZhbHVlIGlzIGBgdHJ1ZWBgLCB0aGUgY29udGFpbmVyIGhhcyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSB2b2x1bWUuIElmIHRoaXMgdmFsdWUgaXMgYGBmYWxzZWBgLCB0aGVuIHRoZSBjb250YWluZXIgY2FuIHdyaXRlIHRvIHRoZSB2b2x1bWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgZmFsc2VgYC5cbiAqL1xuUmVhZE9ubHk/OiBib29sZWFuXG4vKipcbiAqIFRoZSBuYW1lIG9mIGFub3RoZXIgY29udGFpbmVyIHdpdGhpbiB0aGUgc2FtZSB0YXNrIGRlZmluaXRpb24gdG8gbW91bnQgdm9sdW1lcyBmcm9tLlxuICovXG5Tb3VyY2VDb250YWluZXI/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGxvZyBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gZm9yIHRoZSBjb250YWluZXIuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYExvZ0NvbmZpZ2BgIGluIHRoZSBkb2NrZXIgQ3JlYXRlIGEgY29udGFpbmVyIGNvbW1hbmQgYW5kIHRoZSBgYC0tbG9nLWRyaXZlcmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBCeSBkZWZhdWx0LCBjb250YWluZXJzIHVzZSB0aGUgc2FtZSBsb2dnaW5nIGRyaXZlciB0aGF0IHRoZSBEb2NrZXIgZGFlbW9uIHVzZXMuIEhvd2V2ZXIsIHRoZSBjb250YWluZXIgbWF5IHVzZSBhIGRpZmZlcmVudCBsb2dnaW5nIGRyaXZlciB0aGFuIHRoZSBEb2NrZXIgZGFlbW9uIGJ5IHNwZWNpZnlpbmcgYSBsb2cgZHJpdmVyIHdpdGggdGhpcyBwYXJhbWV0ZXIgaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLiBUbyB1c2UgYSBkaWZmZXJlbnQgbG9nZ2luZyBkcml2ZXIgZm9yIGEgY29udGFpbmVyLCB0aGUgbG9nIHN5c3RlbSBtdXN0IGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSAob3Igb24gYSBkaWZmZXJlbnQgbG9nIHNlcnZlciBmb3IgcmVtb3RlIGxvZ2dpbmcgb3B0aW9ucykuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBvcHRpb25zIGZvciBkaWZmZXJlbnQgc3VwcG9ydGVkIGxvZyBkcml2ZXJzLCBzZWUgW0NvbmZpZ3VyZSBsb2dnaW5nIGRyaXZlcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvYWRtaW4vbG9nZ2luZy9vdmVydmlldy8pIGluIHRoZSBEb2NrZXIgZG9jdW1lbnRhdGlvbi5cbiAqICAgQW1hem9uIEVDUyBjdXJyZW50bHkgc3VwcG9ydHMgYSBzdWJzZXQgb2YgdGhlIGxvZ2dpbmcgZHJpdmVycyBhdmFpbGFibGUgdG8gdGhlIERvY2tlciBkYWVtb24gKHNob3duIGluIHRoZSBbTG9nQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Mb2dDb25maWd1cmF0aW9uLmh0bWwpIGRhdGEgdHlwZSkuIEFkZGl0aW9uYWwgbG9nIGRyaXZlcnMgbWF5IGJlIGF2YWlsYWJsZSBpbiBmdXR1cmUgcmVsZWFzZXMgb2YgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50LlxuICogICBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTggb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICogICBUaGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcnVubmluZyBvbiBhIGNvbnRhaW5lciBpbnN0YW5jZSBtdXN0IHJlZ2lzdGVyIHRoZSBsb2dnaW5nIGRyaXZlcnMgYXZhaWxhYmxlIG9uIHRoYXQgaW5zdGFuY2Ugd2l0aCB0aGUgYGBFQ1NfQVZBSUxBQkxFX0xPR0dJTkdfRFJJVkVSU2BgIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSBjb250YWluZXJzIHBsYWNlZCBvbiB0aGF0IGluc3RhbmNlIGNhbiB1c2UgdGhlc2UgbG9nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ29udGFpbmVyIEFnZW50IENvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC1jb25maWcuaHRtbCkgaW4gdGhlICpEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0NvbmZpZ3VyYXRpb24ge1xuLyoqXG4gKiBUaGUgc2VjcmV0cyB0byBwYXNzIHRvIHRoZSBsb2cgY29uZmlndXJhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBzZW5zaXRpdmUgZGF0YV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cblNlY3JldE9wdGlvbnM/OiBTZWNyZXRbXVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHNlbmQgdG8gdGhlIGxvZyBkcml2ZXIuXG4gKiAgVGhlIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IGRlcGVuZCBvbiB0aGUgbG9nIGRyaXZlci4gU29tZSBvZiB0aGUgb3B0aW9ucyB5b3UgY2FuIHNwZWNpZnkgd2hlbiB5b3UgdXNlIHRoZSBgYGF3c2xvZ3NgYCBsb2cgZHJpdmVyIHRvIHJvdXRlIGxvZ3MgdG8gQW1hem9uIENsb3VkV2F0Y2ggaW5jbHVkZSB0aGUgZm9sbG93aW5nOlxuICogICArIGF3c2xvZ3MtY3JlYXRlLWdyb3VwIFJlcXVpcmVkOiBObyBTcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgdGhlIGxvZyBncm91cCB0byBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuIElmIHRoaXMgb3B0aW9uIGlzbid0IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gZmFsc2UuIFlvdXIgSUFNIHBvbGljeSBtdXN0IGluY2x1ZGUgdGhlIGxvZ3M6Q3JlYXRlTG9nR3JvdXAgcGVybWlzc2lvbiBiZWZvcmUgeW91IGF0dGVtcHQgdG8gdXNlIGF3c2xvZ3MtY3JlYXRlLWdyb3VwLiArIGF3c2xvZ3MtcmVnaW9uIFJlcXVpcmVkOiBZZXMgU3BlY2lmeSB0aGUgUmVnaW9uIHRoYXQgdGhlIGF3c2xvZ3MgbG9nIGRyaXZlciBpcyB0byBzZW5kIHlvdXIgRG9ja2VyIGxvZ3MgdG8uIFlvdSBjYW4gY2hvb3NlIHRvIHNlbmQgYWxsIG9mIHlvdXIgbG9ncyBmcm9tIGNsdXN0ZXJzIGluIGRpZmZlcmVudCBSZWdpb25zIHRvIGEgc2luZ2xlIHJlZ2lvbiBpbiBDbG91ZFdhdGNoIExvZ3MuIFRoaXMgaXMgc28gdGhhdCB0aGV5J3JlIGFsbCB2aXNpYmxlIGluIG9uZSBsb2NhdGlvbi4gT3RoZXJ3aXNlLCB5b3UgY2FuIHNlcGFyYXRlIHRoZW0gYnkgUmVnaW9uIGZvciBtb3JlIGdyYW51bGFyaXR5LiBNYWtlIHN1cmUgdGhhdCB0aGUgc3BlY2lmaWVkIGxvZyBncm91cCBleGlzdHMgaW4gdGhlIFJlZ2lvbiB0aGF0IHlvdSBzcGVjaWZ5IHdpdGggdGhpcyBvcHRpb24uICsgYXdzbG9ncy1ncm91cCBSZXF1aXJlZDogWWVzIE1ha2Ugc3VyZSB0byBzcGVjaWZ5IGEgbG9nIGdyb3VwIHRoYXQgdGhlIGF3c2xvZ3MgbG9nIGRyaXZlciBzZW5kcyBpdHMgbG9nIHN0cmVhbXMgdG8uICsgYXdzbG9ncy1zdHJlYW0tcHJlZml4IFJlcXVpcmVkOiBZZXMsIHdoZW4gdXNpbmcgRmFyZ2F0ZS5PcHRpb25hbCB3aGVuIHVzaW5nIEVDMi4gVXNlIHRoZSBhd3Nsb2dzLXN0cmVhbS1wcmVmaXggb3B0aW9uIHRvIGFzc29jaWF0ZSBhIGxvZyBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgdGhlIGNvbnRhaW5lciBuYW1lLCBhbmQgdGhlIElEIG9mIHRoZSBBbWF6b24gRUNTIHRhc2sgdGhhdCB0aGUgY29udGFpbmVyIGJlbG9uZ3MgdG8uIElmIHlvdSBzcGVjaWZ5IGEgcHJlZml4IHdpdGggdGhpcyBvcHRpb24sIHRoZW4gdGhlIGxvZyBzdHJlYW0gdGFrZXMgdGhlIGZvcm1hdCBwcmVmaXgtbmFtZS9jb250YWluZXItbmFtZS9lY3MtdGFzay1pZC4gSWYgeW91IGRvbid0IHNwZWNpZnkgYSBwcmVmaXggd2l0aCB0aGlzIG9wdGlvbiwgdGhlbiB0aGUgbG9nIHN0cmVhbSBpcyBuYW1lZCBhZnRlciB0aGUgY29udGFpbmVyIElEIHRoYXQncyBhc3NpZ25lZCBieSB0aGUgRG9ja2VyIGRhZW1vbiBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLiBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIHRyYWNlIGxvZ3MgYmFjayB0byB0aGUgY29udGFpbmVyIHRoYXQgc2VudCB0aGVtIHdpdGgganVzdCB0aGUgRG9ja2VyIGNvbnRhaW5lciBJRCAod2hpY2ggaXMgb25seSBhdmFpbGFibGUgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSksIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5IGEgcHJlZml4IHdpdGggdGhpcyBvcHRpb24uIEZvciBBbWF6b24gRUNTIHNlcnZpY2VzLCB5b3UgY2FuIHVzZSB0aGUgc2VydmljZSBuYW1lIGFzIHRoZSBwcmVmaXguIERvaW5nIHNvLCB5b3UgY2FuIHRyYWNlIGxvZyBzdHJlYW1zIHRvIHRoZSBzZXJ2aWNlIHRoYXQgdGhlIGNvbnRhaW5lciBiZWxvbmdzIHRvLCB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRoYXQgc2VudCB0aGVtLCBhbmQgdGhlIElEIG9mIHRoZSB0YXNrIHRoYXQgdGhlIGNvbnRhaW5lciBiZWxvbmdzIHRvLiBZb3UgbXVzdCBzcGVjaWZ5IGEgc3RyZWFtLXByZWZpeCBmb3IgeW91ciBsb2dzIHRvIGhhdmUgeW91ciBsb2dzIGFwcGVhciBpbiB0aGUgTG9nIHBhbmUgd2hlbiB1c2luZyB0aGUgQW1hem9uIEVDUyBjb25zb2xlLiArIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0IFJlcXVpcmVkOiBObyBUaGlzIG9wdGlvbiBkZWZpbmVzIGEgbXVsdGlsaW5lIHN0YXJ0IHBhdHRlcm4gaW4gUHl0aG9uIHN0cmZ0aW1lIGZvcm1hdC4gQSBsb2cgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGFuZCBhbnkgZm9sbG93aW5nIGxpbmVzIHRoYXQgZG9u4oCZdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIG1hdGNoZWQgbGluZSBpcyB0aGUgZGVsaW1pdGVyIGJldHdlZW4gbG9nIG1lc3NhZ2VzLiBPbmUgZXhhbXBsZSBvZiBhIHVzZSBjYXNlIGZvciB1c2luZyB0aGlzIGZvcm1hdCBpcyBmb3IgcGFyc2luZyBvdXRwdXQgc3VjaCBhcyBhIHN0YWNrIGR1bXAsIHdoaWNoIG1pZ2h0IG90aGVyd2lzZSBiZSBsb2dnZWQgaW4gbXVsdGlwbGUgZW50cmllcy4gVGhlIGNvcnJlY3QgcGF0dGVybiBhbGxvd3MgaXQgdG8gYmUgY2FwdHVyZWQgaW4gYSBzaW5nbGUgZW50cnkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQuIFlvdSBjYW5ub3QgY29uZmlndXJlIGJvdGggdGhlIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0IGFuZCBhd3Nsb2dzLW11bHRpbGluZS1wYXR0ZXJuIG9wdGlvbnMuIE11bHRpbGluZSBsb2dnaW5nIHBlcmZvcm1zIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXJzaW5nIGFuZCBtYXRjaGluZyBvZiBhbGwgbG9nIG1lc3NhZ2VzLiBUaGlzIG1pZ2h0IGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gbG9nZ2luZyBwZXJmb3JtYW5jZS4gKyBhd3Nsb2dzLW11bHRpbGluZS1wYXR0ZXJuIFJlcXVpcmVkOiBObyBUaGlzIG9wdGlvbiBkZWZpbmVzIGEgbXVsdGlsaW5lIHN0YXJ0IHBhdHRlcm4gdGhhdCB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uLiBBIGxvZyBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgbGluZSB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gYW5kIGFueSBmb2xsb3dpbmcgbGluZXMgdGhhdCBkb27igJl0IG1hdGNoIHRoZSBwYXR0ZXJuLiBUaGUgbWF0Y2hlZCBsaW5lIGlzIHRoZSBkZWxpbWl0ZXIgYmV0d2VlbiBsb2cgbWVzc2FnZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybi4gVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBpcyBhbHNvIGNvbmZpZ3VyZWQuIFlvdSBjYW5ub3QgY29uZmlndXJlIGJvdGggdGhlIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0IGFuZCBhd3Nsb2dzLW11bHRpbGluZS1wYXR0ZXJuIG9wdGlvbnMuIE11bHRpbGluZSBsb2dnaW5nIHBlcmZvcm1zIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXJzaW5nIGFuZCBtYXRjaGluZyBvZiBhbGwgbG9nIG1lc3NhZ2VzLiBUaGlzIG1pZ2h0IGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gbG9nZ2luZyBwZXJmb3JtYW5jZS4gXG4gKiAgVGhlIGZvbGxvd2luZyBvcHRpb25zIGFwcGx5IHRvIGFsbCBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMuXG4gKiAgICsgbW9kZSBSZXF1aXJlZDogTm8gVmFsaWQgdmFsdWVzOiBub24tYmxvY2tpbmcgfCBibG9ja2luZyBUaGlzIG9wdGlvbiBkZWZpbmVzIHRoZSBkZWxpdmVyeSBtb2RlIG9mIGxvZyBtZXNzYWdlcyBmcm9tIHRoZSBjb250YWluZXIgdG8gdGhlIGxvZyBkcml2ZXIgc3BlY2lmaWVkIHVzaW5nIGxvZ0RyaXZlci4gVGhlIGRlbGl2ZXJ5IG1vZGUgeW91IGNob29zZSBhZmZlY3RzIGFwcGxpY2F0aW9uIGF2YWlsYWJpbGl0eSB3aGVuIHRoZSBmbG93IG9mIGxvZ3MgZnJvbSBjb250YWluZXIgaXMgaW50ZXJydXB0ZWQuIElmIHlvdSB1c2UgdGhlIGJsb2NraW5nIG1vZGUgYW5kIHRoZSBmbG93IG9mIGxvZ3MgaXMgaW50ZXJydXB0ZWQsIGNhbGxzIGZyb20gY29udGFpbmVyIGNvZGUgdG8gd3JpdGUgdG8gdGhlIHN0ZG91dCBhbmQgc3RkZXJyIHN0cmVhbXMgd2lsbCBibG9jay4gVGhlIGxvZ2dpbmcgdGhyZWFkIG9mIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJsb2NrIGFzIGEgcmVzdWx0LiBUaGlzIG1heSBjYXVzZSB0aGUgYXBwbGljYXRpb24gdG8gYmVjb21lIHVucmVzcG9uc2l2ZSBhbmQgbGVhZCB0byBjb250YWluZXIgaGVhbHRoY2hlY2sgZmFpbHVyZS4gSWYgeW91IHVzZSB0aGUgbm9uLWJsb2NraW5nIG1vZGUsIHRoZSBjb250YWluZXIncyBsb2dzIGFyZSBpbnN0ZWFkIHN0b3JlZCBpbiBhbiBpbi1tZW1vcnkgaW50ZXJtZWRpYXRlIGJ1ZmZlciBjb25maWd1cmVkIHdpdGggdGhlIG1heC1idWZmZXItc2l6ZSBvcHRpb24uIFRoaXMgcHJldmVudHMgdGhlIGFwcGxpY2F0aW9uIGZyb20gYmVjb21pbmcgdW5yZXNwb25zaXZlIHdoZW4gbG9ncyBjYW5ub3QgYmUgc2VudC4gV2UgcmVjb21tZW5kIHVzaW5nIHRoaXMgbW9kZSBpZiB5b3Ugd2FudCB0byBlbnN1cmUgc2VydmljZSBhdmFpbGFiaWxpdHkgYW5kIGFyZSBva2F5IHdpdGggc29tZSBsb2cgbG9zcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBQcmV2ZW50aW5nIGxvZyBsb3NzIHdpdGggbm9uLWJsb2NraW5nIG1vZGUgaW4gdGhlIGF3c2xvZ3MgY29udGFpbmVyIGxvZyBkcml2ZXIuIFlvdSBjYW4gc2V0IGEgZGVmYXVsdCBtb2RlIGZvciBhbGwgY29udGFpbmVycyBpbiBhIHNwZWNpZmljIFJlZ2lvbiBieSB1c2luZyB0aGUgZGVmYXVsdExvZ0RyaXZlck1vZGUgYWNjb3VudCBzZXR0aW5nLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGUgbW9kZSBvcHRpb24gb3IgY29uZmlndXJlIHRoZSBhY2NvdW50IHNldHRpbmcsIEFtYXpvbiBFQ1Mgd2lsbCBkZWZhdWx0IHRvIHRoZSBub24tYmxvY2tpbmcgbW9kZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgc2V0dGluZywgc2VlIERlZmF1bHQgbG9nIGRyaXZlciBtb2RlIGluIHRoZSBBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUuIE9uIEp1bmUgMjUsIDIwMjUsIEFtYXpvbiBFQ1MgY2hhbmdlZCB0aGUgZGVmYXVsdCBsb2cgZHJpdmVyIG1vZGUgZnJvbSBibG9ja2luZyB0byBub24tYmxvY2tpbmcgdG8gcHJpb3JpdGl6ZSB0YXNrIGF2YWlsYWJpbGl0eSBvdmVyIGxvZ2dpbmcuIFRvIGNvbnRpbnVlIHVzaW5nIHRoZSBibG9ja2luZyBtb2RlIGFmdGVyIHRoaXMgY2hhbmdlLCBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzogU2V0IHRoZSBtb2RlIG9wdGlvbiBpbiB5b3VyIGNvbnRhaW5lciBkZWZpbml0aW9uJ3MgbG9nQ29uZmlndXJhdGlvbiBhcyBibG9ja2luZy4gU2V0IHRoZSBkZWZhdWx0TG9nRHJpdmVyTW9kZSBhY2NvdW50IHNldHRpbmcgdG8gYmxvY2tpbmcuICsgbWF4LWJ1ZmZlci1zaXplIFJlcXVpcmVkOiBObyBEZWZhdWx0IHZhbHVlOiAxMG0gV2hlbiBub24tYmxvY2tpbmcgbW9kZSBpcyB1c2VkLCB0aGUgbWF4LWJ1ZmZlci1zaXplIGxvZyBvcHRpb24gY29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB0aGF0J3MgdXNlZCBmb3IgaW50ZXJtZWRpYXRlIG1lc3NhZ2Ugc3RvcmFnZS4gTWFrZSBzdXJlIHRvIHNwZWNpZnkgYW4gYWRlcXVhdGUgYnVmZmVyIHNpemUgYmFzZWQgb24geW91ciBhcHBsaWNhdGlvbi4gV2hlbiB0aGUgYnVmZmVyIGZpbGxzIHVwLCBmdXJ0aGVyIGxvZ3MgY2Fubm90IGJlIHN0b3JlZC4gTG9ncyB0aGF0IGNhbm5vdCBiZSBzdG9yZWQgYXJlIGxvc3QuIFxuICogIFRvIHJvdXRlIGxvZ3MgdXNpbmcgdGhlIGBgc3BsdW5rYGAgbG9nIHJvdXRlciwgeW91IG5lZWQgdG8gc3BlY2lmeSBhIGBgc3BsdW5rLXRva2VuYGAgYW5kIGEgYGBzcGx1bmstdXJsYGAuXG4gKiAgV2hlbiB5b3UgdXNlIHRoZSBgYGF3c2ZpcmVsZW5zYGAgbG9nIHJvdXRlciB0byByb3V0ZSBsb2dzIHRvIGFuIEFXUyBTZXJ2aWNlIG9yIEFXUyBQYXJ0bmVyIE5ldHdvcmsgZGVzdGluYXRpb24gZm9yIGxvZyBzdG9yYWdlIGFuZCBhbmFseXRpY3MsIHlvdSBjYW4gc2V0IHRoZSBgYGxvZy1kcml2ZXItYnVmZmVyLWxpbWl0YGAgb3B0aW9uIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZXZlbnRzIHRoYXQgYXJlIGJ1ZmZlcmVkIGluIG1lbW9yeSwgYmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlIGxvZyByb3V0ZXIgY29udGFpbmVyLiBJdCBjYW4gaGVscCB0byByZXNvbHZlIHBvdGVudGlhbCBsb2cgbG9zcyBpc3N1ZSBiZWNhdXNlIGhpZ2ggdGhyb3VnaHB1dCBtaWdodCByZXN1bHQgaW4gbWVtb3J5IHJ1bm5pbmcgb3V0IGZvciB0aGUgYnVmZmVyIGluc2lkZSBvZiBEb2NrZXIuXG4gKiAgT3RoZXIgb3B0aW9ucyB5b3UgY2FuIHNwZWNpZnkgd2hlbiB1c2luZyBgYGF3c2ZpcmVsZW5zYGAgdG8gcm91dGUgbG9ncyBkZXBlbmQgb24gdGhlIGRlc3RpbmF0aW9uLiBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gRGF0YSBGaXJlaG9zZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBBV1MgUmVnaW9uIHdpdGggYGByZWdpb25gYCBhbmQgYSBuYW1lIGZvciB0aGUgbG9nIHN0cmVhbSB3aXRoIGBgZGVsaXZlcnlfc3RyZWFtYGAuXG4gKiAgV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIEtpbmVzaXMgRGF0YSBTdHJlYW1zLCB5b3UgY2FuIHNwZWNpZnkgYW4gQVdTIFJlZ2lvbiB3aXRoIGBgcmVnaW9uYGAgYW5kIGEgZGF0YSBzdHJlYW0gbmFtZSB3aXRoIGBgc3RyZWFtYGAuXG4gKiAgIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBPcGVuU2VhcmNoIFNlcnZpY2UsIHlvdSBjYW4gc3BlY2lmeSBvcHRpb25zIGxpa2UgYGBOYW1lYGAsIGBgSG9zdGBgIChPcGVuU2VhcmNoIFNlcnZpY2UgZW5kcG9pbnQgd2l0aG91dCBwcm90b2NvbCksIGBgUG9ydGBgLCBgYEluZGV4YGAsIGBgVHlwZWBgLCBgYEF3c19hdXRoYGAsIGBgQXdzX3JlZ2lvbmBgLCBgYFN1cHByZXNzX1R5cGVfTmFtZWBgLCBhbmQgYGB0bHNgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVW5kZXIgdGhlIGhvb2Q6IEZpcmVMZW5zIGZvciBBbWF6b24gRUNTIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29udGFpbmVycy91bmRlci10aGUtaG9vZC1maXJlbGVucy1mb3ItYW1hem9uLWVjcy10YXNrcy8pLlxuICogIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBTMywgeW91IGNhbiBzcGVjaWZ5IHRoZSBidWNrZXQgdXNpbmcgdGhlIGBgYnVja2V0YGAgb3B0aW9uLiBZb3UgY2FuIGFsc28gc3BlY2lmeSBgYHJlZ2lvbmBgLCBgYHRvdGFsX2ZpbGVfc2l6ZWBgLCBgYHVwbG9hZF90aW1lb3V0YGAsIGFuZCBgYHVzZV9wdXRfb2JqZWN0YGAgYXMgb3B0aW9ucy5cbiAqICBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTkgb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5PcHRpb25zPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgZHJpdmVyIHRvIHVzZSBmb3IgdGhlIGNvbnRhaW5lci5cbiAqICBGb3IgdGFza3Mgb24gRkFSR0FURWxvbmcsIHRoZSBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMgYXJlIGBgYXdzbG9nc2BgLCBgYHNwbHVua2BgLCBhbmQgYGBhd3NmaXJlbGVuc2BgLlxuICogIEZvciB0YXNrcyBob3N0ZWQgb24gQW1hem9uIEVDMiBpbnN0YW5jZXMsIHRoZSBzdXBwb3J0ZWQgbG9nIGRyaXZlcnMgYXJlIGBgYXdzbG9nc2BgLCBgYGZsdWVudGRgYCwgYGBnZWxmYGAsIGBganNvbi1maWxlYGAsIGBgam91cm5hbGRgYCwgYGBzeXNsb2dgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGUgYGBhd3Nsb2dzYGAgbG9nIGRyaXZlciwgc2VlIFtTZW5kIEFtYXpvbiBFQ1MgbG9ncyB0byBDbG91ZFdhdGNoXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19hd3Nsb2dzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGUgYGBhd3NmaXJlbGVuc2BgIGxvZyBkcml2ZXIsIHNlZSBbU2VuZCBBbWF6b24gRUNTIGxvZ3MgdG8gYW4gc2VydmljZSBvciBQYXJ0bmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sKS5cbiAqICAgSWYgeW91IGhhdmUgYSBjdXN0b20gZHJpdmVyIHRoYXQgaXNuJ3QgbGlzdGVkLCB5b3UgY2FuIGZvcmsgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHByb2plY3QgdGhhdCdzIFthdmFpbGFibGUgb24gR2l0SHViXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hbWF6b24tZWNzLWFnZW50KSBhbmQgY3VzdG9taXplIGl0IHRvIHdvcmsgd2l0aCB0aGF0IGRyaXZlci4gV2UgZW5jb3VyYWdlIHlvdSB0byBzdWJtaXQgcHVsbCByZXF1ZXN0cyBmb3IgY2hhbmdlcyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgaW5jbHVkZWQuIEhvd2V2ZXIsIHdlIGRvbid0IGN1cnJlbnRseSBwcm92aWRlIHN1cHBvcnQgZm9yIHJ1bm5pbmcgbW9kaWZpZWQgY29waWVzIG9mIHRoaXMgc29mdHdhcmUuXG4gKi9cbkxvZ0RyaXZlcjogc3RyaW5nXG59XG4vKipcbiAqIFRoZSB0eXBlIGFuZCBhbW91bnQgb2YgYSByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuIFRoZSBzdXBwb3J0ZWQgcmVzb3VyY2UgdHlwZXMgYXJlIEdQVXMgYW5kIEVsYXN0aWMgSW5mZXJlbmNlIGFjY2VsZXJhdG9ycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbV29ya2luZyB3aXRoIEdQVXMgb24gQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWdwdS5odG1sKSBvciBbV29ya2luZyB3aXRoIEFtYXpvbiBFbGFzdGljIEluZmVyZW5jZSBvbiBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtaW5mZXJlbmNlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUmVxdWlyZW1lbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiByZXNvdXJjZSB0byBhc3NpZ24gdG8gYSBjb250YWluZXIuXG4gKi9cblR5cGU6IHN0cmluZ1xuLyoqXG4gKiBUaGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS5cbiAqICBXaGVuIHRoZSB0eXBlIGlzIGBgR1BVYGAsIHRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGBgR1BVc2BgIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCByZXNlcnZlcyBmb3IgdGhlIGNvbnRhaW5lci4gVGhlIG51bWJlciBvZiBHUFVzIHRoYXQncyByZXNlcnZlZCBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gYSB0YXNrIGNhbid0IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBHUFVzIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdGhhdCB0aGUgdGFzayBpcyBsYXVuY2hlZCBvbi5cbiAqICBXaGVuIHRoZSB0eXBlIGlzIGBgSW5mZXJlbmNlQWNjZWxlcmF0b3JgYCwgdGhlIGBgdmFsdWVgYCBtYXRjaGVzIHRoZSBgYGRldmljZU5hbWVgYCBmb3IgYW4gW0luZmVyZW5jZUFjY2VsZXJhdG9yXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0luZmVyZW5jZUFjY2VsZXJhdG9yLmh0bWwpIHNwZWNpZmllZCBpbiBhIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuVmFsdWU6IHN0cmluZ1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZmlsZXMgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gYSBjb250YWluZXIuIFlvdSBjYW4gc3BlY2lmeSB1cCB0byB0ZW4gZW52aXJvbm1lbnQgZmlsZXMuIFRoZSBmaWxlIG11c3QgaGF2ZSBhIGBgLmVudmBgIGZpbGUgZXh0ZW5zaW9uLiBFYWNoIGxpbmUgaW4gYW4gZW52aXJvbm1lbnQgZmlsZSBzaG91bGQgY29udGFpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBgYFZBUklBQkxFPVZBTFVFYGAgZm9ybWF0LiBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgYCNgYCBhcmUgdHJlYXRlZCBhcyBjb21tZW50cyBhbmQgYXJlIGlnbm9yZWQuXG4gKiAgSWYgdGhlcmUgYXJlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGBgZW52aXJvbm1lbnRgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbiwgdGhleSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgdmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gYW4gZW52aXJvbm1lbnQgZmlsZS4gSWYgbXVsdGlwbGUgZW52aXJvbm1lbnQgZmlsZXMgYXJlIHNwZWNpZmllZCB0aGF0IGNvbnRhaW4gdGhlIHNhbWUgdmFyaWFibGUsIHRoZXkncmUgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcCBkb3duLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNlIGEgZmlsZSB0byBwYXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBhIGNvbnRhaW5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNlLWVudmlyb25tZW50LWZpbGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIEVudmlyb25tZW50IHZhcmlhYmxlIGZpbGVzIGFyZSBvYmplY3RzIGluIEFtYXpvbiBTMyBhbmQgYWxsIEFtYXpvbiBTMyBzZWN1cml0eSBjb25zaWRlcmF0aW9ucyBhcHBseS4gXG4gKiAgWW91IG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zIGZvciB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZTpcbiAqICAgKyAgTGludXggcGxhdGZvcm0gdmVyc2lvbiBgYDEuNC4wYGAgb3IgbGF0ZXIuXG4gKiAgICsgIFdpbmRvd3MgcGxhdGZvcm0gdmVyc2lvbiBgYDEuMC4wYGAgb3IgbGF0ZXIuXG4gKiAgIFxuICogIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgd2hlbiB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZTpcbiAqICAgKyAgVGhlIGZpbGUgaXMgaGFuZGxlZCBsaWtlIGEgbmF0aXZlIERvY2tlciBlbnYtZmlsZS5cbiAqICAgKyAgVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2hlbGwgZXNjYXBlIGhhbmRsaW5nLlxuICogICArICBUaGUgY29udGFpbmVyIGVudHJ5IHBvaW50IGludGVycGVydHMgdGhlIGBgVkFSSUFCTEVgYCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRGaWxlIHtcbi8qKlxuICogVGhlIGZpbGUgdHlwZSB0byB1c2UuIEVudmlyb25tZW50IGZpbGVzIGFyZSBvYmplY3RzIGluIEFtYXpvbiBTMy4gVGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGBgczNgYC5cbiAqL1xuVHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIEFtYXpvbiBTMyBvYmplY3QgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlsZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIEZpcmVMZW5zIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb250YWluZXIuIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGFuZCBjb25maWd1cmUgYSBsb2cgcm91dGVyIGZvciBjb250YWluZXIgbG9ncy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQ3VzdG9tIExvZyBSb3V0aW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2luZ19maXJlbGVucy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZWxlbnNDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29uZmlndXJpbmcgdGhlIGxvZyByb3V0ZXIuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIG1ldGFkYXRhLCBzdWNoIGFzIHRoZSB0YXNrLCB0YXNrIGRlZmluaXRpb24sIGNsdXN0ZXIsIGFuZCBjb250YWluZXIgaW5zdGFuY2UgZGV0YWlscyB0byB0aGUgbG9nIGV2ZW50LlxuICogICBJZiBzcGVjaWZpZWQsIHZhbGlkIG9wdGlvbiBrZXlzIGFyZTpcbiAqICAgKyAgYGBlbmFibGUtZWNzLWxvZy1tZXRhZGF0YWBgLCB3aGljaCBjYW4gYmUgYGB0cnVlYGAgb3IgYGBmYWxzZWBgXG4gKiAgICsgIGBgY29uZmlnLWZpbGUtdHlwZWBgLCB3aGljaCBjYW4gYmUgYGBzM2BgIG9yIGBgZmlsZWBgXG4gKiAgICsgIGBgY29uZmlnLWZpbGUtdmFsdWVgYCwgd2hpY2ggaXMgZWl0aGVyIGFuIFMzIEFSTiBvciBhIGZpbGUgcGF0aFxuICovXG5PcHRpb25zPzoge1xuLyoqXG4gKiBUaGlzIGludGVyZmFjZSB3YXMgcmVmZXJlbmNlZCBieSBgdW5kZWZpbmVkYCdzIEpTT04tU2NoZW1hIGRlZmluaXRpb25cbiAqIHZpYSB0aGUgYHBhdHRlcm5Qcm9wZXJ0eWAgXCIuezEsfVwiLlxuICovXG5bazogc3RyaW5nXTogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgcm91dGVyIHRvIHVzZS4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBmbHVlbnRkYGAgb3IgYGBmbHVlbnRiaXRgYC5cbiAqL1xuVHlwZT86IHN0cmluZ1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVycyB0byBzZXQgaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFN5c2N0bHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1zeXNjdGxgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY29uZmlndXJlIGBgbmV0LmlwdjQudGNwX2tlZXBhbGl2ZV90aW1lYGAgc2V0dGluZyB0byBtYWludGFpbiBsb25nZXIgbGl2ZWQgY29ubmVjdGlvbnMuXG4gKiAgV2UgZG9uJ3QgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkgbmV0d29yay1yZWxhdGVkIGBgc3lzdGVtQ29udHJvbHNgYCBwYXJhbWV0ZXJzIGZvciBtdWx0aXBsZSBjb250YWluZXJzIGluIGEgc2luZ2xlIHRhc2sgdGhhdCBhbHNvIHVzZXMgZWl0aGVyIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZS4gRG9pbmcgdGhpcyBoYXMgdGhlIGZvbGxvd2luZyBkaXNhZHZhbnRhZ2VzOlxuICogICArICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlIGluY2x1ZGluZyBGYXJnYXRlLCBpZiB5b3Ugc2V0IGBgc3lzdGVtQ29udHJvbHNgYCBmb3IgYW55IGNvbnRhaW5lciwgaXQgYXBwbGllcyB0byBhbGwgY29udGFpbmVycyBpbiB0aGUgdGFzay4gSWYgeW91IHNldCBkaWZmZXJlbnQgYGBzeXN0ZW1Db250cm9sc2BgIGZvciBtdWx0aXBsZSBjb250YWluZXJzIGluIGEgc2luZ2xlIHRhc2ssIHRoZSBjb250YWluZXIgdGhhdCdzIHN0YXJ0ZWQgbGFzdCBkZXRlcm1pbmVzIHdoaWNoIGBgc3lzdGVtQ29udHJvbHNgYCB0YWtlIGVmZmVjdC5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlbid0IHN1cHBvcnRlZC5cbiAqICAgXG4gKiAgSWYgeW91J3JlIHNldHRpbmcgYW4gSVBDIHJlc291cmNlIG5hbWVzcGFjZSB0byB1c2UgZm9yIHRoZSBjb250YWluZXJzIGluIHRoZSB0YXNrLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHkgdG8geW91ciBzeXN0ZW0gY29udHJvbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0lQQyBtb2RlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sI3Rhc2tfZGVmaW5pdGlvbl9pcGNtb2RlKS5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGhvc3RgYCBJUEMgbW9kZSwgSVBDIG5hbWVzcGFjZSBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlbid0IHN1cHBvcnRlZC5cbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYHRhc2tgYCBJUEMgbW9kZSwgSVBDIG5hbWVzcGFjZSBgYHN5c3RlbUNvbnRyb2xzYGAgdmFsdWVzIGFwcGx5IHRvIGFsbCBjb250YWluZXJzIHdpdGhpbiBhIHRhc2suXG4gKiAgIFxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKiAgICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgdGFza3MgdGhhdCBhcmUgaG9zdGVkIG9uIEZBUkdBVEVsb25nIGlmIHRoZSB0YXNrcyBhcmUgdXNpbmcgcGxhdGZvcm0gdmVyc2lvbiBgYDEuNC4wYGAgb3IgbGF0ZXIgKExpbnV4KS4gVGhpcyBpc24ndCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvbiBGYXJnYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5c3RlbUNvbnRyb2wge1xuLyoqXG4gKiBUaGUgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVyIHRvIHNldCBhIGBgdmFsdWVgYCBmb3IuXG4gKiAgVmFsaWQgSVBDIG5hbWVzcGFjZSB2YWx1ZXM6IGBgXCJrZXJuZWwubXNnbWF4XCIgfCBcImtlcm5lbC5tc2dtbmJcIiB8IFwia2VybmVsLm1zZ21uaVwiIHwgXCJrZXJuZWwuc2VtXCIgfCBcImtlcm5lbC5zaG1hbGxcIiB8IFwia2VybmVsLnNobW1heFwiIHwgXCJrZXJuZWwuc2htbW5pXCIgfCBcImtlcm5lbC5zaG1fcm1pZF9mb3JjZWRcImBgLCBhbmQgYGBTeXNjdGxzYGAgdGhhdCBzdGFydCB3aXRoIGBgXCJmcy5tcXVldWUuKlwiYGBcbiAqICBWYWxpZCBuZXR3b3JrIG5hbWVzcGFjZSB2YWx1ZXM6IGBgU3lzY3Rsc2BgIHRoYXQgc3RhcnQgd2l0aCBgYFwibmV0LipcImBgLiBPbmx5IG5hbWVzcGFjZWQgYGBTeXNjdGxzYGAgdGhhdCBleGlzdCB3aXRoaW4gdGhlIGNvbnRhaW5lciBzdGFydGluZyB3aXRoIFwibmV0LiogYXJlIGFjY2VwdGVkLlxuICogIEFsbCBvZiB0aGVzZSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCBieSBGYXJnYXRlLlxuICovXG5WYWx1ZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZXNwYWNlZCBrZXJuZWwgcGFyYW1ldGVyIHRvIHNldCBhIGBgdmFsdWVgYCBmb3IuXG4gKi9cbk5hbWVzcGFjZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGB1bGltaXRgYCBzZXR0aW5ncyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIuXG4gKiAgQW1hem9uIEVDUyB0YXNrcyBob3N0ZWQgb24gRkFSR0FURWxvbmcgdXNlIHRoZSBkZWZhdWx0IHJlc291cmNlIGxpbWl0IHZhbHVlcyBzZXQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBgYG5vZmlsZWBgIHJlc291cmNlIGxpbWl0IHBhcmFtZXRlciB3aGljaCBGQVJHQVRFbG9uZyBvdmVycmlkZXMuIFRoZSBgYG5vZmlsZWBgIHJlc291cmNlIGxpbWl0IHNldHMgYSByZXN0cmljdGlvbiBvbiB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgdGhhdCBhIGNvbnRhaW5lciBjYW4gdXNlLiBUaGUgZGVmYXVsdCBgYG5vZmlsZWBgIHNvZnQgbGltaXQgaXMgYGA2NTUzNWBgIGFuZCB0aGUgZGVmYXVsdCBoYXJkIGxpbWl0IGlzIGBgNjU1MzVgYC5cbiAqICBZb3UgY2FuIHNwZWNpZnkgdGhlIGBgdWxpbWl0YGAgc2V0dGluZ3MgZm9yIGEgY29udGFpbmVyIGluIGEgdGFzayBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVsaW1pdCB7XG4vKipcbiAqIFRoZSBzb2Z0IGxpbWl0IGZvciB0aGUgYGB1bGltaXRgYCB0eXBlLiBUaGUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBpbiBieXRlcywgc2Vjb25kcywgb3IgYXMgYSBjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgYHR5cGVgYCBvZiB0aGUgYGB1bGltaXRgYC5cbiAqL1xuU29mdExpbWl0OiBudW1iZXJcbi8qKlxuICogVGhlIGhhcmQgbGltaXQgZm9yIHRoZSBgYHVsaW1pdGBgIHR5cGUuIFRoZSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGluIGJ5dGVzLCBzZWNvbmRzLCBvciBhcyBhIGNvdW50LCBkZXBlbmRpbmcgb24gdGhlIGBgdHlwZWBgIG9mIHRoZSBgYHVsaW1pdGBgLlxuICovXG5IYXJkTGltaXQ6IG51bWJlclxuLyoqXG4gKiBUaGUgYGB0eXBlYGAgb2YgdGhlIGBgdWxpbWl0YGAuXG4gKi9cbk5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgcHJpdmF0ZSByZXBvc2l0b3J5IGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvc2l0b3J5Q3JlZGVudGlhbHMge1xuLyoqXG4gKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHNlY3JldCBjb250YWluaW5nIHRoZSBwcml2YXRlIHJlcG9zaXRvcnkgY3JlZGVudGlhbHMuXG4gKiAgIFdoZW4geW91IHVzZSB0aGUgQW1hem9uIEVDUyBBUEksIENMSSwgb3IgQVdTIFNESywgaWYgdGhlIHNlY3JldCBleGlzdHMgaW4gdGhlIHNhbWUgUmVnaW9uIGFzIHRoZSB0YXNrIHRoYXQgeW91J3JlIGxhdW5jaGluZyB0aGVuIHlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZnVsbCBBUk4gb3IgdGhlIG5hbWUgb2YgdGhlIHNlY3JldC4gV2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBmdWxsIEFSTiBvZiB0aGUgc2VjcmV0LlxuICovXG5DcmVkZW50aWFsc1BhcmFtZXRlcj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGBIb3N0RW50cnlgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBob3N0bmFtZSBhbmQgYW4gSVAgYWRkcmVzcyB0aGF0IGFyZSBhZGRlZCB0byB0aGUgYGAvZXRjL2hvc3RzYGAgZmlsZSBvZiBhIGNvbnRhaW5lciB0aHJvdWdoIHRoZSBgYGV4dHJhSG9zdHNgYCBwYXJhbWV0ZXIgb2YgaXRzIGBgQ29udGFpbmVyRGVmaW5pdGlvbmBgIHJlc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RFbnRyeSB7XG4vKipcbiAqIFRoZSBob3N0bmFtZSB0byB1c2UgaW4gdGhlIGBgL2V0Yy9ob3N0c2BgIGVudHJ5LlxuICovXG5Ib3N0bmFtZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgSVAgYWRkcmVzcyB0byB1c2UgaW4gdGhlIGBgL2V0Yy9ob3N0c2BgIGVudHJ5LlxuICovXG5JcEFkZHJlc3M/OiBzdHJpbmdcbn1cbi8qKlxuICogTGludXgtc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0aGF0IGFyZSBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIsIHN1Y2ggYXMgTGludXgga2VybmVsIGNhcGFiaWxpdGllcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIFtLZXJuZWxDYXBhYmlsaXRpZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfS2VybmVsQ2FwYWJpbGl0aWVzLmh0bWwpLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGludXhQYXJhbWV0ZXJzIHtcbkNhcGFiaWxpdGllcz86IEtlcm5lbENhcGFiaWxpdGllc1xuLyoqXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gdHVuZSBhIGNvbnRhaW5lcidzIG1lbW9yeSBzd2FwcGluZXNzIGJlaGF2aW9yLiBBIGBgc3dhcHBpbmVzc2BgIHZhbHVlIG9mIGBgMGBgIHdpbGwgY2F1c2Ugc3dhcHBpbmcgdG8gbm90IGhhcHBlbiB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuIEEgYGBzd2FwcGluZXNzYGAgdmFsdWUgb2YgYGAxMDBgYCB3aWxsIGNhdXNlIHBhZ2VzIHRvIGJlIHN3YXBwZWQgdmVyeSBhZ2dyZXNzaXZlbHkuIEFjY2VwdGVkIHZhbHVlcyBhcmUgd2hvbGUgbnVtYmVycyBiZXR3ZWVuIGBgMGBgIGFuZCBgYDEwMGBgLiBJZiB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCB2YWx1ZSBvZiBgYDYwYGAgaXMgdXNlZC4gSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciBgYG1heFN3YXBgYCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1tZW1vcnktc3dhcHBpbmVzc2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0YXNrcyBvbiBBbWF6b24gTGludXggMjAyMyB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuU3dhcHBpbmVzcz86IG51bWJlclxuLyoqXG4gKiBUaGUgY29udGFpbmVyIHBhdGgsIG1vdW50IG9wdGlvbnMsIGFuZCBzaXplIChpbiBNaUIpIG9mIHRoZSB0bXBmcyBtb3VudC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLXRtcGZzYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgdG1wZnNgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5UbXBmcz86IFRtcGZzW11cbi8qKlxuICogVGhlIHZhbHVlIGZvciB0aGUgc2l6ZSAoaW4gTWlCKSBvZiB0aGUgYGAvZGV2L3NobWBgIHZvbHVtZS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byB0aGUgYGAtLXNobS1zaXplYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIElmIHlvdSBhcmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHNoYXJlZE1lbW9yeVNpemVgYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuU2hhcmVkTWVtb3J5U2l6ZT86IG51bWJlclxuLyoqXG4gKiBBbnkgaG9zdCBkZXZpY2VzIHRvIGV4cG9zZSB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRGV2aWNlc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWRldmljZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYGRldmljZXNgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5EZXZpY2VzPzogRGV2aWNlW11cbi8qKlxuICogUnVuIGFuIGBgaW5pdGBgIHByb2Nlc3MgaW5zaWRlIHRoZSBjb250YWluZXIgdGhhdCBmb3J3YXJkcyBzaWduYWxzIGFuZCByZWFwcyBwcm9jZXNzZXMuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1pbml0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIFRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHZlcnNpb24gMS4yNSBvZiB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgb3IgZ3JlYXRlciBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZS4gVG8gY2hlY2sgdGhlIERvY2tlciBSZW1vdGUgQVBJIHZlcnNpb24gb24geW91ciBjb250YWluZXIgaW5zdGFuY2UsIGxvZyBpbiB0byB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBhbmQgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGBzdWRvIGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuQVBJVmVyc2lvbn19J2BgXG4gKi9cbkluaXRQcm9jZXNzRW5hYmxlZD86IGJvb2xlYW5cbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCBvZiBzd2FwIG1lbW9yeSAoaW4gTWlCKSBhIGNvbnRhaW5lciBjYW4gdXNlLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdGhlIGBgLS1tZW1vcnktc3dhcGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuIHdoZXJlIHRoZSB2YWx1ZSB3b3VsZCBiZSB0aGUgc3VtIG9mIHRoZSBjb250YWluZXIgbWVtb3J5IHBsdXMgdGhlIGBgbWF4U3dhcGBgIHZhbHVlLlxuICogIElmIGEgYGBtYXhTd2FwYGAgdmFsdWUgb2YgYGAwYGAgaXMgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyIHdpbGwgbm90IHVzZSBzd2FwLiBBY2NlcHRlZCB2YWx1ZXMgYXJlIGBgMGBgIG9yIGFueSBwb3NpdGl2ZSBpbnRlZ2VyLiBJZiB0aGUgYGBtYXhTd2FwYGAgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBjb250YWluZXIgd2lsbCB1c2UgdGhlIHN3YXAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSBpdCBpcyBydW5uaW5nIG9uLiBBIGBgbWF4U3dhcGBgIHZhbHVlIG11c3QgYmUgc2V0IGZvciB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIHRvIGJlIHVzZWQuXG4gKiAgIElmIHlvdSdyZSB1c2luZyB0YXNrcyB0aGF0IHVzZSB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhlIGBgbWF4U3dhcGBgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKiAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIG9uIEFtYXpvbiBMaW51eCAyMDIzIHRoZSBgYHN3YXBwaW5lc3NgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICovXG5NYXhTd2FwPzogbnVtYmVyXG59XG4vKipcbiAqIFRoZSBMaW51eCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb250YWluZXIgdGhhdCBhcmUgYWRkZWQgdG8gb3IgZHJvcHBlZCBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgRG9ja2VyLlxuICogICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIGBgY2FwYWJpbGl0aWVzYGAgaXMgc3VwcG9ydGVkIGZvciBhbGwgcGxhdGZvcm0gdmVyc2lvbnMgYnV0IHRoZSBgYGFkZGBgIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBpZiB1c2luZyBwbGF0Zm9ybSB2ZXJzaW9uIDEuNC4wIG9yIGxhdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtlcm5lbENhcGFiaWxpdGllcyB7XG4vKipcbiAqIFRoZSBMaW51eCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb250YWluZXIgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSBEb2NrZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBDYXBBZGRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1jYXAtYWRkYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRhc2tzIGxhdW5jaGVkIG9uIEZBUkdBVEVsb25nIG9ubHkgc3VwcG9ydCBhZGRpbmcgdGhlIGBgU1lTX1BUUkFDRWBgIGtlcm5lbCBjYXBhYmlsaXR5LlxuICogICBWYWxpZCB2YWx1ZXM6IGBgXCJBTExcIiB8IFwiQVVESVRfQ09OVFJPTFwiIHwgXCJBVURJVF9XUklURVwiIHwgXCJCTE9DS19TVVNQRU5EXCIgfCBcIkNIT1dOXCIgfCBcIkRBQ19PVkVSUklERVwiIHwgXCJEQUNfUkVBRF9TRUFSQ0hcIiB8IFwiRk9XTkVSXCIgfCBcIkZTRVRJRFwiIHwgXCJJUENfTE9DS1wiIHwgXCJJUENfT1dORVJcIiB8IFwiS0lMTFwiIHwgXCJMRUFTRVwiIHwgXCJMSU5VWF9JTU1VVEFCTEVcIiB8IFwiTUFDX0FETUlOXCIgfCBcIk1BQ19PVkVSUklERVwiIHwgXCJNS05PRFwiIHwgXCJORVRfQURNSU5cIiB8IFwiTkVUX0JJTkRfU0VSVklDRVwiIHwgXCJORVRfQlJPQURDQVNUXCIgfCBcIk5FVF9SQVdcIiB8IFwiU0VURkNBUFwiIHwgXCJTRVRHSURcIiB8IFwiU0VUUENBUFwiIHwgXCJTRVRVSURcIiB8IFwiU1lTX0FETUlOXCIgfCBcIlNZU19CT09UXCIgfCBcIlNZU19DSFJPT1RcIiB8IFwiU1lTX01PRFVMRVwiIHwgXCJTWVNfTklDRVwiIHwgXCJTWVNfUEFDQ1RcIiB8IFwiU1lTX1BUUkFDRVwiIHwgXCJTWVNfUkFXSU9cIiB8IFwiU1lTX1JFU09VUkNFXCIgfCBcIlNZU19USU1FXCIgfCBcIlNZU19UVFlfQ09ORklHXCIgfCBcIlNZU0xPR1wiIHwgXCJXQUtFX0FMQVJNXCJgYFxuICovXG5BZGQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgTGludXggY2FwYWJpbGl0aWVzIGZvciB0aGUgY29udGFpbmVyIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IERvY2tlci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYENhcERyb3BgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1jYXAtZHJvcGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFZhbGlkIHZhbHVlczogYGBcIkFMTFwiIHwgXCJBVURJVF9DT05UUk9MXCIgfCBcIkFVRElUX1dSSVRFXCIgfCBcIkJMT0NLX1NVU1BFTkRcIiB8IFwiQ0hPV05cIiB8IFwiREFDX09WRVJSSURFXCIgfCBcIkRBQ19SRUFEX1NFQVJDSFwiIHwgXCJGT1dORVJcIiB8IFwiRlNFVElEXCIgfCBcIklQQ19MT0NLXCIgfCBcIklQQ19PV05FUlwiIHwgXCJLSUxMXCIgfCBcIkxFQVNFXCIgfCBcIkxJTlVYX0lNTVVUQUJMRVwiIHwgXCJNQUNfQURNSU5cIiB8IFwiTUFDX09WRVJSSURFXCIgfCBcIk1LTk9EXCIgfCBcIk5FVF9BRE1JTlwiIHwgXCJORVRfQklORF9TRVJWSUNFXCIgfCBcIk5FVF9CUk9BRENBU1RcIiB8IFwiTkVUX1JBV1wiIHwgXCJTRVRGQ0FQXCIgfCBcIlNFVEdJRFwiIHwgXCJTRVRQQ0FQXCIgfCBcIlNFVFVJRFwiIHwgXCJTWVNfQURNSU5cIiB8IFwiU1lTX0JPT1RcIiB8IFwiU1lTX0NIUk9PVFwiIHwgXCJTWVNfTU9EVUxFXCIgfCBcIlNZU19OSUNFXCIgfCBcIlNZU19QQUNDVFwiIHwgXCJTWVNfUFRSQUNFXCIgfCBcIlNZU19SQVdJT1wiIHwgXCJTWVNfUkVTT1VSQ0VcIiB8IFwiU1lTX1RJTUVcIiB8IFwiU1lTX1RUWV9DT05GSUdcIiB8IFwiU1lTTE9HXCIgfCBcIldBS0VfQUxBUk1cImBgXG4gKi9cbkRyb3A/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBUaGUgY29udGFpbmVyIHBhdGgsIG1vdW50IG9wdGlvbnMsIGFuZCBzaXplIG9mIHRoZSB0bXBmcyBtb3VudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUbXBmcyB7XG4vKipcbiAqIFRoZSBtYXhpbXVtIHNpemUgKGluIE1pQikgb2YgdGhlIHRtcGZzIHZvbHVtZS5cbiAqL1xuU2l6ZTogbnVtYmVyXG4vKipcbiAqIFRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggd2hlcmUgdGhlIHRtcGZzIHZvbHVtZSBpcyB0byBiZSBtb3VudGVkLlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG4vKipcbiAqIFRoZSBsaXN0IG9mIHRtcGZzIHZvbHVtZSBtb3VudCBvcHRpb25zLlxuICogIFZhbGlkIHZhbHVlczogYGBcImRlZmF1bHRzXCIgfCBcInJvXCIgfCBcInJ3XCIgfCBcInN1aWRcIiB8IFwibm9zdWlkXCIgfCBcImRldlwiIHwgXCJub2RldlwiIHwgXCJleGVjXCIgfCBcIm5vZXhlY1wiIHwgXCJzeW5jXCIgfCBcImFzeW5jXCIgfCBcImRpcnN5bmNcIiB8IFwicmVtb3VudFwiIHwgXCJtYW5kXCIgfCBcIm5vbWFuZFwiIHwgXCJhdGltZVwiIHwgXCJub2F0aW1lXCIgfCBcImRpcmF0aW1lXCIgfCBcIm5vZGlyYXRpbWVcIiB8IFwiYmluZFwiIHwgXCJyYmluZFwiIHwgXCJ1bmJpbmRhYmxlXCIgfCBcInJ1bmJpbmRhYmxlXCIgfCBcInByaXZhdGVcIiB8IFwicnByaXZhdGVcIiB8IFwic2hhcmVkXCIgfCBcInJzaGFyZWRcIiB8IFwic2xhdmVcIiB8IFwicnNsYXZlXCIgfCBcInJlbGF0aW1lXCIgfCBcIm5vcmVsYXRpbWVcIiB8IFwic3RyaWN0YXRpbWVcIiB8IFwibm9zdHJpY3RhdGltZVwiIHwgXCJtb2RlXCIgfCBcInVpZFwiIHwgXCJnaWRcIiB8IFwibnJfaW5vZGVzXCIgfCBcIm5yX2Jsb2Nrc1wiIHwgXCJtcG9sXCJgYFxuICovXG5Nb3VudE9wdGlvbnM/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBUaGUgYGBEZXZpY2VgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbnRhaW5lciBpbnN0YW5jZSBob3N0IGRldmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2Uge1xuLyoqXG4gKiBUaGUgcGF0aCBmb3IgdGhlIGRldmljZSBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UuXG4gKi9cbkhvc3RQYXRoPzogc3RyaW5nXG4vKipcbiAqIFRoZSBleHBsaWNpdCBwZXJtaXNzaW9ucyB0byBwcm92aWRlIHRvIHRoZSBjb250YWluZXIgZm9yIHRoZSBkZXZpY2UuIEJ5IGRlZmF1bHQsIHRoZSBjb250YWluZXIgaGFzIHBlcm1pc3Npb25zIGZvciBgYHJlYWRgYCwgYGB3cml0ZWBgLCBhbmQgYGBta25vZGBgIGZvciB0aGUgZGV2aWNlLlxuICovXG5QZXJtaXNzaW9ucz86IHN0cmluZ1tdXG4vKipcbiAqIFRoZSBwYXRoIGluc2lkZSB0aGUgY29udGFpbmVyIGF0IHdoaWNoIHRvIGV4cG9zZSB0aGUgaG9zdCBkZXZpY2UuXG4gKi9cbkNvbnRhaW5lclBhdGg/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHJlc3RhcnQgcG9saWN5IGZvciBhIGNvbnRhaW5lci4gV2hlbiB5b3Ugc2V0IHVwIGEgcmVzdGFydCBwb2xpY3ksIEFtYXpvbiBFQ1MgY2FuIHJlc3RhcnQgdGhlIGNvbnRhaW5lciB3aXRob3V0IG5lZWRpbmcgdG8gcmVwbGFjZSB0aGUgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUmVzdGFydCBpbmRpdmlkdWFsIGNvbnRhaW5lcnMgaW4gQW1hem9uIEVDUyB0YXNrcyB3aXRoIGNvbnRhaW5lciByZXN0YXJ0IHBvbGljaWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jb250YWluZXItcmVzdGFydC1wb2xpY3kuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhcnRQb2xpY3kge1xuLyoqXG4gKiBBIGxpc3Qgb2YgZXhpdCBjb2RlcyB0aGF0IEFtYXpvbiBFQ1Mgd2lsbCBpZ25vcmUgYW5kIG5vdCBhdHRlbXB0IGEgcmVzdGFydCBvbi4gWW91IGNhbiBzcGVjaWZ5IGEgbWF4aW11bSBvZiA1MCBjb250YWluZXIgZXhpdCBjb2Rlcy4gQnkgZGVmYXVsdCwgQW1hem9uIEVDUyBkb2VzIG5vdCBpZ25vcmUgYW55IGV4aXQgY29kZXMuXG4gKi9cbklnbm9yZWRFeGl0Q29kZXM/OiBudW1iZXJbXVxuLyoqXG4gKiBBIHBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBydW4gZm9yIGJlZm9yZSBhIHJlc3RhcnQgY2FuIGJlIGF0dGVtcHRlZC4gQSBjb250YWluZXIgY2FuIGJlIHJlc3RhcnRlZCBvbmx5IG9uY2UgZXZlcnkgYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIHNlY29uZHMuIElmIGEgY29udGFpbmVyIGlzbid0IGFibGUgdG8gcnVuIGZvciB0aGlzIHRpbWUgcGVyaW9kIGFuZCBleGl0cyBlYXJseSwgaXQgd2lsbCBub3QgYmUgcmVzdGFydGVkLiBZb3UgY2FuIHNldCBhIG1pbmltdW0gYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIG9mIDYwIHNlY29uZHMgYW5kIGEgbWF4aW11bSBgYHJlc3RhcnRBdHRlbXB0UGVyaW9kYGAgb2YgMTgwMCBzZWNvbmRzLiBCeSBkZWZhdWx0LCBhIGNvbnRhaW5lciBtdXN0IHJ1biBmb3IgMzAwIHNlY29uZHMgYmVmb3JlIGl0IGNhbiBiZSByZXN0YXJ0ZWQuXG4gKi9cblJlc3RhcnRBdHRlbXB0UGVyaW9kPzogbnVtYmVyXG4vKipcbiAqIFNwZWNpZmllcyB3aGV0aGVyIGEgcmVzdGFydCBwb2xpY3kgaXMgZW5hYmxlZCBmb3IgdGhlIGNvbnRhaW5lci5cbiAqL1xuRW5hYmxlZD86IGJvb2xlYW5cbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIGEgdm9sdW1lIG1vdW50IHBvaW50IHRoYXQncyB1c2VkIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRQb2ludCB7XG4vKipcbiAqIElmIHRoaXMgdmFsdWUgaXMgYGB0cnVlYGAsIHRoZSBjb250YWluZXIgaGFzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHZvbHVtZS4gSWYgdGhpcyB2YWx1ZSBpcyBgYGZhbHNlYGAsIHRoZW4gdGhlIGNvbnRhaW5lciBjYW4gd3JpdGUgdG8gdGhlIHZvbHVtZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBmYWxzZWBgLlxuICovXG5SZWFkT25seT86IGJvb2xlYW5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHZvbHVtZSB0byBtb3VudC4gTXVzdCBiZSBhIHZvbHVtZSBuYW1lIHJlZmVyZW5jZWQgaW4gdGhlIGBgbmFtZWBgIHBhcmFtZXRlciBvZiB0YXNrIGRlZmluaXRpb24gYGB2b2x1bWVgYC5cbiAqL1xuU291cmNlVm9sdW1lPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwYXRoIG9uIHRoZSBjb250YWluZXIgdG8gbW91bnQgdGhlIGhvc3Qgdm9sdW1lIGF0LlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYENvbnRhaW5lckRlcGVuZGVuY3lgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhlIGRlcGVuZGVuY2llcyBkZWZpbmVkIGZvciBjb250YWluZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24uIEEgY29udGFpbmVyIGNhbiBjb250YWluIG11bHRpcGxlIGRlcGVuZGVuY2llcy4gV2hlbiBhIGRlcGVuZGVuY3kgaXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAsIGZvciBjb250YWluZXIgc2h1dGRvd24gaXQgaXMgcmV2ZXJzZWQuXG4gKiAgWW91ciBBbWF6b24gRUNTIGNvbnRhaW5lciBpbnN0YW5jZXMgcmVxdWlyZSBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IHRvIGVuYWJsZSBjb250YWluZXIgZGVwZW5kZW5jaWVzLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSBhcmUgdXNpbmcgYW4gQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JLCB5b3VyIGluc3RhbmNlIG5lZWRzIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoaXMgcGFyYW1ldGVyIHJlcXVpcmVzIHRoYXQgdGhlIHRhc2sgb3Igc2VydmljZSB1c2VzIHBsYXRmb3JtIHZlcnNpb24gMS4zLjAgb3IgbGF0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyRGVwZW5kZW5jeSB7XG4vKipcbiAqIFRoZSBkZXBlbmRlbmN5IGNvbmRpdGlvbiBvZiB0aGUgY29udGFpbmVyLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgYXZhaWxhYmxlIGNvbmRpdGlvbnMgYW5kIHRoZWlyIGJlaGF2aW9yOlxuICogICArICBgYFNUQVJUYGAgLSBUaGlzIGNvbmRpdGlvbiBlbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgbGlua3MgYW5kIHZvbHVtZXMgdG9kYXkuIEl0IHZhbGlkYXRlcyB0aGF0IGEgZGVwZW5kZW50IGNvbnRhaW5lciBpcyBzdGFydGVkIGJlZm9yZSBwZXJtaXR0aW5nIG90aGVyIGNvbnRhaW5lcnMgdG8gc3RhcnQuXG4gKiAgICsgIGBgQ09NUExFVEVgYCAtIFRoaXMgY29uZGl0aW9uIHZhbGlkYXRlcyB0aGF0IGEgZGVwZW5kZW50IGNvbnRhaW5lciBydW5zIHRvIGNvbXBsZXRpb24gKGV4aXRzKSBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIG5vbmVzc2VudGlhbCBjb250YWluZXJzIHRoYXQgcnVuIGEgc2NyaXB0IGFuZCB0aGVuIGV4aXQuIFRoaXMgY29uZGl0aW9uIGNhbid0IGJlIHNldCBvbiBhbiBlc3NlbnRpYWwgY29udGFpbmVyLlxuICogICArICBgYFNVQ0NFU1NgYCAtIFRoaXMgY29uZGl0aW9uIGlzIHRoZSBzYW1lIGFzIGBgQ09NUExFVEVgYCwgYnV0IGl0IGFsc28gcmVxdWlyZXMgdGhhdCB0aGUgY29udGFpbmVyIGV4aXRzIHdpdGggYSBgYHplcm9gYCBzdGF0dXMuIFRoaXMgY29uZGl0aW9uIGNhbid0IGJlIHNldCBvbiBhbiBlc3NlbnRpYWwgY29udGFpbmVyLlxuICogICArICBgYEhFQUxUSFlgYCAtIFRoaXMgY29uZGl0aW9uIHZhbGlkYXRlcyB0aGF0IHRoZSBkZXBlbmRlbnQgY29udGFpbmVyIHBhc3NlcyBpdHMgRG9ja2VyIGhlYWx0aCBjaGVjayBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRlcGVuZGVudCBjb250YWluZXIgaGFzIGhlYWx0aCBjaGVja3MgY29uZmlndXJlZC4gVGhpcyBjb25kaXRpb24gaXMgY29uZmlybWVkIG9ubHkgYXQgdGFzayBzdGFydHVwLlxuICovXG5Db25kaXRpb24/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgb2YgYSBjb250YWluZXIuXG4gKi9cbkNvbnRhaW5lck5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgUG9ydE1hcHBpbmdgYCBwcm9wZXJ0eSBzcGVjaWZpZXMgYSBwb3J0IG1hcHBpbmcuIFBvcnQgbWFwcGluZ3MgYWxsb3cgY29udGFpbmVycyB0byBhY2Nlc3MgcG9ydHMgb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIHRvIHNlbmQgb3IgcmVjZWl2ZSB0cmFmZmljLiBQb3J0IG1hcHBpbmdzIGFyZSBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24uXG4gKiAgSWYgeW91IGFyZSB1c2luZyBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgZXhwb3NlZCBwb3J0cyBzaG91bGQgYmUgc3BlY2lmaWVkIHVzaW5nIGBgY29udGFpbmVyUG9ydGBgLiBUaGUgYGBob3N0UG9ydGBgIGNhbiBiZSBsZWZ0IGJsYW5rIG9yIGl0IG11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLlxuICogIEFmdGVyIGEgdGFzayByZWFjaGVzIHRoZSBgYFJVTk5JTkdgYCBzdGF0dXMsIG1hbnVhbCBhbmQgYXV0b21hdGljIGhvc3QgYW5kIGNvbnRhaW5lciBwb3J0IGFzc2lnbm1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZSBgYG5ldHdvcmtCaW5kaW5nc2BgIHNlY3Rpb24gb2YgW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSBBUEkgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRNYXBwaW5nIHtcbi8qKlxuICogVGhlIGFwcGxpY2F0aW9uIHByb3RvY29sIHRoYXQncyB1c2VkIGZvciB0aGUgcG9ydCBtYXBwaW5nLiBUaGlzIHBhcmFtZXRlciBvbmx5IGFwcGxpZXMgdG8gU2VydmljZSBDb25uZWN0LiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJvdG9jb2wgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHVzZXMuIElmIHlvdSBzZXQgdGhpcyBwYXJhbWV0ZXIsIEFtYXpvbiBFQ1MgYWRkcyBwcm90b2NvbC1zcGVjaWZpYyBjb25uZWN0aW9uIGhhbmRsaW5nIHRvIHRoZSBTZXJ2aWNlIENvbm5lY3QgcHJveHkuIElmIHlvdSBzZXQgdGhpcyBwYXJhbWV0ZXIsIEFtYXpvbiBFQ1MgYWRkcyBwcm90b2NvbC1zcGVjaWZpYyB0ZWxlbWV0cnkgaW4gdGhlIEFtYXpvbiBFQ1MgY29uc29sZSBhbmQgQ2xvdWRXYXRjaC5cbiAqICBJZiB5b3UgZG9uJ3Qgc2V0IGEgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLCB0aGVuIFRDUCBpcyB1c2VkLiBIb3dldmVyLCBBbWF6b24gRUNTIGRvZXNuJ3QgYWRkIHByb3RvY29sLXNwZWNpZmljIHRlbGVtZXRyeSBmb3IgVENQLlxuICogIGBgYXBwUHJvdG9jb2xgYCBpcyBpbW11dGFibGUgaW4gYSBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZS4gVXBkYXRpbmcgdGhpcyBmaWVsZCByZXF1aXJlcyBhIHNlcnZpY2UgZGVsZXRpb24gYW5kIHJlZGVwbG95bWVudC5cbiAqICBUYXNrcyB0aGF0IHJ1biBpbiBhIG5hbWVzcGFjZSBjYW4gdXNlIHNob3J0IG5hbWVzIHRvIGNvbm5lY3QgdG8gc2VydmljZXMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY2FuIGNvbm5lY3QgdG8gc2VydmljZXMgYWNyb3NzIGFsbCBvZiB0aGUgY2x1c3RlcnMgaW4gdGhlIG5hbWVzcGFjZS4gVGFza3MgY29ubmVjdCB0aHJvdWdoIGEgbWFuYWdlZCBwcm94eSBjb250YWluZXIgdGhhdCBjb2xsZWN0cyBsb2dzIGFuZCBtZXRyaWNzIGZvciBpbmNyZWFzZWQgdmlzaWJpbGl0eS4gT25seSB0aGUgdGFza3MgdGhhdCBBbWF6b24gRUNTIHNlcnZpY2VzIGNyZWF0ZSBhcmUgc3VwcG9ydGVkIHdpdGggU2VydmljZSBDb25uZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTZXJ2aWNlIENvbm5lY3RdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlcnZpY2UtY29ubmVjdC5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbkFwcFByb3RvY29sPzogKFwiaHR0cFwiIHwgXCJodHRwMlwiIHwgXCJncnBjXCIpXG4vKipcbiAqIFRoZSBwb3J0IG51bWJlciByYW5nZSBvbiB0aGUgY29udGFpbmVyIHRoYXQncyBib3VuZCB0byB0aGUgZHluYW1pY2FsbHkgbWFwcGVkIGhvc3QgcG9ydCByYW5nZS4gXG4gKiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb250YWluZXJQb3J0UmFuZ2VgYDpcbiAqICAgKyAgWW91IG11c3QgdXNlIGVpdGhlciB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUgb3IgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLlxuICogICArICBUaGlzIHBhcmFtZXRlciBpcyBhdmFpbGFibGUgZm9yIGJvdGggdGhlIEVDMiBhbmQgRkFSR0FURWxvbmcgbGF1bmNoIHR5cGVzLlxuICogICArICBUaGlzIHBhcmFtZXRlciBpcyBhdmFpbGFibGUgZm9yIGJvdGggdGhlIExpbnV4IGFuZCBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW1zLlxuICogICArICBUaGUgY29udGFpbmVyIGluc3RhbmNlIG11c3QgaGF2ZSBhdCBsZWFzdCB2ZXJzaW9uIDEuNjcuMCBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBhdCBsZWFzdCB2ZXJzaW9uIDEuNjcuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZSBcbiAqICAgKyAgWW91IGNhbiBzcGVjaWZ5IGEgbWF4aW11bSBvZiAxMDAgcG9ydCByYW5nZXMgcGVyIGNvbnRhaW5lci5cbiAqICAgKyAgWW91IGRvIG5vdCBzcGVjaWZ5IGEgYGBob3N0UG9ydFJhbmdlYGAuIFRoZSB2YWx1ZSBvZiB0aGUgYGBob3N0UG9ydFJhbmdlYGAgaXMgc2V0IGFzIGZvbGxvd3M6XG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSwgdGhlIGBgaG9zdFBvcnRSYW5nZWBgIGlzIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0UmFuZ2VgYC4gVGhpcyBpcyBhIHN0YXRpYyBtYXBwaW5nIHN0cmF0ZWd5LlxuICogICArICBGb3IgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUsIHRoZSBBbWF6b24gRUNTIGFnZW50IGZpbmRzIG9wZW4gaG9zdCBwb3J0cyBmcm9tIHRoZSBkZWZhdWx0IGVwaGVtZXJhbCByYW5nZSBhbmQgcGFzc2VzIGl0IHRvIGRvY2tlciB0byBiaW5kIHRoZW0gdG8gdGhlIGNvbnRhaW5lciBwb3J0cy5cbiAqICAgXG4gKiAgICsgIFRoZSBgYGNvbnRhaW5lclBvcnRSYW5nZWBgIHZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiAxIGFuZCA2NTUzNS5cbiAqICAgKyAgQSBwb3J0IGNhbiBvbmx5IGJlIGluY2x1ZGVkIGluIG9uZSBwb3J0IG1hcHBpbmcgcGVyIGNvbnRhaW5lci5cbiAqICAgKyAgWW91IGNhbm5vdCBzcGVjaWZ5IG92ZXJsYXBwaW5nIHBvcnQgcmFuZ2VzLlxuICogICArICBUaGUgZmlyc3QgcG9ydCBpbiB0aGUgcmFuZ2UgbXVzdCBiZSBsZXNzIHRoYW4gbGFzdCBwb3J0IGluIHRoZSByYW5nZS5cbiAqICAgKyAgRG9ja2VyIHJlY29tbWVuZHMgdGhhdCB5b3UgdHVybiBvZmYgdGhlIGRvY2tlci1wcm94eSBpbiB0aGUgRG9ja2VyIGRhZW1vbiBjb25maWcgZmlsZSB3aGVuIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHBvcnRzLlxuICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0lzc3VlICMxMTE4NV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZ2l0aHViLmNvbS9tb2J5L21vYnkvaXNzdWVzLzExMTg1KSBvbiB0aGUgR2l0aHViIHdlYnNpdGUuXG4gKiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byB0dXJuIG9mZiB0aGUgZG9ja2VyLXByb3h5IGluIHRoZSBEb2NrZXIgZGFlbW9uIGNvbmZpZyBmaWxlLCBzZWUgW0RvY2tlciBkYWVtb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Jvb3RzdHJhcF9jb250YWluZXJfaW5zdGFuY2UuaHRtbCNib290c3RyYXBfZG9ja2VyX2RhZW1vbikgaW4gdGhlICpBbWF6b24gRUNTIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFxuICogIFlvdSBjYW4gY2FsbCBbRGVzY3JpYmVUYXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRhc2tzLmh0bWwpIHRvIHZpZXcgdGhlIGBgaG9zdFBvcnRSYW5nZWBgIHdoaWNoIGFyZSB0aGUgaG9zdCBwb3J0cyB0aGF0IGFyZSBib3VuZCB0byB0aGUgY29udGFpbmVyIHBvcnRzLlxuICovXG5Db250YWluZXJQb3J0UmFuZ2U/OiBzdHJpbmdcbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgdG8gcmVzZXJ2ZSBmb3IgeW91ciBjb250YWluZXIuXG4gKiAgSWYgeW91IHNwZWNpZnkgYSBgYGNvbnRhaW5lclBvcnRSYW5nZWBgLCBsZWF2ZSB0aGlzIGZpZWxkIGVtcHR5IGFuZCB0aGUgdmFsdWUgb2YgdGhlIGBgaG9zdFBvcnRgYCBpcyBzZXQgYXMgZm9sbG93czpcbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgYGBob3N0UG9ydGBgIGlzIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuIFRoaXMgaXMgYSBzdGF0aWMgbWFwcGluZyBzdHJhdGVneS5cbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlLCB0aGUgQW1hem9uIEVDUyBhZ2VudCBmaW5kcyBvcGVuIHBvcnRzIG9uIHRoZSBob3N0IGFuZCBhdXRvbWF0aWNhbGx5IGJpbmRzIHRoZW0gdG8gdGhlIGNvbnRhaW5lciBwb3J0cy4gVGhpcyBpcyBhIGR5bmFtaWMgbWFwcGluZyBzdHJhdGVneS5cbiAqICAgXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG9yIGBgaG9zdGBgIG5ldHdvcmsgbW9kZSwgdGhlIGBgaG9zdFBvcnRgYCBjYW4gZWl0aGVyIGJlIGxlZnQgYmxhbmsgb3Igc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRgYC5cbiAqICBJZiB5b3UgdXNlIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlLCB5b3UgY2FuIHNwZWNpZnkgYSBub24tcmVzZXJ2ZWQgaG9zdCBwb3J0IGZvciB5b3VyIGNvbnRhaW5lciBwb3J0IG1hcHBpbmcsIG9yIHlvdSBjYW4gb21pdCB0aGUgYGBob3N0UG9ydGBgIChvciBzZXQgaXQgdG8gYGAwYGApIHdoaWxlIHNwZWNpZnlpbmcgYSBgYGNvbnRhaW5lclBvcnRgYCBhbmQgeW91ciBjb250YWluZXIgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIHBvcnQgaW4gdGhlIGVwaGVtZXJhbCBwb3J0IHJhbmdlIGZvciB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBEb2NrZXIgdmVyc2lvbi5cbiAqICBUaGUgZGVmYXVsdCBlcGhlbWVyYWwgcG9ydCByYW5nZSBmb3IgRG9ja2VyIHZlcnNpb24gMS42LjAgYW5kIGxhdGVyIGlzIGxpc3RlZCBvbiB0aGUgaW5zdGFuY2UgdW5kZXIgYGAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfbG9jYWxfcG9ydF9yYW5nZWBgLiBJZiB0aGlzIGtlcm5lbCBwYXJhbWV0ZXIgaXMgdW5hdmFpbGFibGUsIHRoZSBkZWZhdWx0IGVwaGVtZXJhbCBwb3J0IHJhbmdlIGZyb20gNDkxNTMgdGhyb3VnaCA2NTUzNSAoTGludXgpIG9yIDQ5MTUyIHRocm91Z2ggNjU1MzUgKFdpbmRvd3MpIGlzIHVzZWQuIERvIG5vdCBhdHRlbXB0IHRvIHNwZWNpZnkgYSBob3N0IHBvcnQgaW4gdGhlIGVwaGVtZXJhbCBwb3J0IHJhbmdlIGFzIHRoZXNlIGFyZSByZXNlcnZlZCBmb3IgYXV0b21hdGljIGFzc2lnbm1lbnQuIEluIGdlbmVyYWwsIHBvcnRzIGJlbG93IDMyNzY4IGFyZSBvdXRzaWRlIG9mIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZS5cbiAqICBUaGUgZGVmYXVsdCByZXNlcnZlZCBwb3J0cyBhcmUgMjIgZm9yIFNTSCwgdGhlIERvY2tlciBwb3J0cyAyMzc1IGFuZCAyMzc2LCBhbmQgdGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHBvcnRzIDUxNjc4LTUxNjgwLiBBbnkgaG9zdCBwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc3BlY2lmaWVkIGluIGEgcnVubmluZyB0YXNrIGlzIGFsc28gcmVzZXJ2ZWQgd2hpbGUgdGhlIHRhc2sgaXMgcnVubmluZy4gVGhhdCBpcywgYWZ0ZXIgYSB0YXNrIHN0b3BzLCB0aGUgaG9zdCBwb3J0IGlzIHJlbGVhc2VkLiBUaGUgY3VycmVudCByZXNlcnZlZCBwb3J0cyBhcmUgZGlzcGxheWVkIGluIHRoZSBgYHJlbWFpbmluZ1Jlc291cmNlc2BgIG9mIFtEZXNjcmliZUNvbnRhaW5lckluc3RhbmNlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNvbnRhaW5lckluc3RhbmNlcy5odG1sKSBvdXRwdXQuIEEgY29udGFpbmVyIGluc3RhbmNlIGNhbiBoYXZlIHVwIHRvIDEwMCByZXNlcnZlZCBwb3J0cyBhdCBhIHRpbWUuIFRoaXMgbnVtYmVyIGluY2x1ZGVzIHRoZSBkZWZhdWx0IHJlc2VydmVkIHBvcnRzLiBBdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHBvcnRzIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUgMTAwIHJlc2VydmVkIHBvcnRzIHF1b3RhLlxuICovXG5Ib3N0UG9ydD86IG51bWJlclxuLyoqXG4gKiBUaGUgcG9ydCBudW1iZXIgb24gdGhlIGNvbnRhaW5lciB0aGF0J3MgYm91bmQgdG8gdGhlIHVzZXItc3BlY2lmaWVkIG9yIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaG9zdCBwb3J0LlxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHNwZWNpZnkgdGhlIGV4cG9zZWQgcG9ydHMgdXNpbmcgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSBhbmQgeW91IHNwZWNpZnkgYSBjb250YWluZXIgcG9ydCBhbmQgbm90IGEgaG9zdCBwb3J0LCB5b3VyIGNvbnRhaW5lciBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgaG9zdCBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYGhvc3RQb3J0YGAuIFBvcnQgbWFwcGluZ3MgdGhhdCBhcmUgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpbiB0aGlzIHdheSBkbyBub3QgY291bnQgdG93YXJkIHRoZSAxMDAgcmVzZXJ2ZWQgcG9ydHMgbGltaXQgb2YgYSBjb250YWluZXIgaW5zdGFuY2UuXG4gKi9cbkNvbnRhaW5lclBvcnQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHByb3RvY29sIHVzZWQgZm9yIHRoZSBwb3J0IG1hcHBpbmcuIFZhbGlkIHZhbHVlcyBhcmUgYGB0Y3BgYCBhbmQgYGB1ZHBgYC4gVGhlIGRlZmF1bHQgaXMgYGB0Y3BgYC4gYGBwcm90b2NvbGBgIGlzIGltbXV0YWJsZSBpbiBhIFNlcnZpY2UgQ29ubmVjdCBzZXJ2aWNlLiBVcGRhdGluZyB0aGlzIGZpZWxkIHJlcXVpcmVzIGEgc2VydmljZSBkZWxldGlvbiBhbmQgcmVkZXBsb3ltZW50LlxuICovXG5Qcm90b2NvbD86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSB0aGF0J3MgdXNlZCBmb3IgdGhlIHBvcnQgbWFwcGluZy4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgdGhhdCB5b3UgdXNlIGluIHRoZSBgYHNlcnZpY2VDb25uZWN0Q29uZmlndXJhdGlvbmBgIGFuZCB0aGUgYGB2cGNMYXR0aWNlQ29uZmlndXJhdGlvbnNgYCBvZiBhIHNlcnZpY2UuIFRoZSBuYW1lIGNhbiBpbmNsdWRlIHVwIHRvIDY0IGNoYXJhY3RlcnMuIFRoZSBjaGFyYWN0ZXJzIGNhbiBpbmNsdWRlIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyAoXyksIGFuZCBoeXBoZW5zICgtKS4gVGhlIG5hbWUgY2FuJ3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi5cbiAqL1xuTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgZXBoZW1lcmFsIHN0b3JhZ2Ugc2V0dGluZ3MgdG8gdXNlIGZvciB0YXNrcyBydW4gd2l0aCB0aGUgdGFzayBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVwaGVtZXJhbFN0b3JhZ2Uge1xuLyoqXG4gKiBUaGUgdG90YWwgYW1vdW50LCBpbiBHaUIsIG9mIGVwaGVtZXJhbCBzdG9yYWdlIHRvIHNldCBmb3IgdGhlIHRhc2suIFRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2YWx1ZSBpcyBgYDIxYGAgR2lCIGFuZCB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgYGAyMDBgYCBHaUIuXG4gKi9cblNpemVJbkdpQj86IG51bWJlclxufVxuLyoqXG4gKiBUaGUgbWV0YWRhdGEgdGhhdCB5b3UgYXBwbHkgdG8gYSByZXNvdXJjZSB0byBoZWxwIHlvdSBjYXRlZ29yaXplIGFuZCBvcmdhbml6ZSB0aGVtLiBFYWNoIHRhZyBjb25zaXN0cyBvZiBhIGtleSBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuIFlvdSBkZWZpbmUgdGhlbS5cbiAqICBUaGUgZm9sbG93aW5nIGJhc2ljIHJlc3RyaWN0aW9ucyBhcHBseSB0byB0YWdzOlxuICogICArICBNYXhpbXVtIG51bWJlciBvZiB0YWdzIHBlciByZXNvdXJjZSAtIDUwXG4gKiAgICsgIEZvciBlYWNoIHJlc291cmNlLCBlYWNoIHRhZyBrZXkgbXVzdCBiZSB1bmlxdWUsIGFuZCBlYWNoIHRhZyBrZXkgY2FuIGhhdmUgb25seSBvbmUgdmFsdWUuXG4gKiAgICsgIE1heGltdW0ga2V5IGxlbmd0aCAtIDEyOCBVbmljb2RlIGNoYXJhY3RlcnMgaW4gVVRGLThcbiAqICAgKyAgTWF4aW11bSB2YWx1ZSBsZW5ndGggLSAyNTYgVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIElmIHlvdXIgdGFnZ2luZyBzY2hlbWEgaXMgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgc2VydmljZXMgYW5kIHJlc291cmNlcywgcmVtZW1iZXIgdGhhdCBvdGhlciBzZXJ2aWNlcyBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gYWxsb3dlZCBjaGFyYWN0ZXJzLiBHZW5lcmFsbHkgYWxsb3dlZCBjaGFyYWN0ZXJzIGFyZTogbGV0dGVycywgbnVtYmVycywgYW5kIHNwYWNlcyByZXByZXNlbnRhYmxlIGluIFVURi04LCBhbmQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiArIC0gPSAuIF8gOiAvIEAuXG4gKiAgICsgIFRhZyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICogICArICBEbyBub3QgdXNlIGBgYXdzOmBgLCBgYEFXUzpgYCwgb3IgYW55IHVwcGVyIG9yIGxvd2VyY2FzZSBjb21iaW5hdGlvbiBvZiBzdWNoIGFzIGEgcHJlZml4IGZvciBlaXRoZXIga2V5cyBvciB2YWx1ZXMgYXMgaXQgaXMgcmVzZXJ2ZWQgZm9yIEFXUyB1c2UuIFlvdSBjYW5ub3QgZWRpdCBvciBkZWxldGUgdGFnIGtleXMgb3IgdmFsdWVzIHdpdGggdGhpcyBwcmVmaXguIFRhZ3Mgd2l0aCB0aGlzIHByZWZpeCBkbyBub3QgY291bnQgYWdhaW5zdCB5b3VyIHRhZ3MgcGVyIHJlc291cmNlIGxpbWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhZyB7XG4vKipcbiAqIFRoZSBvcHRpb25hbCBwYXJ0IG9mIGEga2V5LXZhbHVlIHBhaXIgdGhhdCBtYWtlIHVwIGEgdGFnLiBBIGBgdmFsdWVgYCBhY3RzIGFzIGEgZGVzY3JpcHRvciB3aXRoaW4gYSB0YWcgY2F0ZWdvcnkgKGtleSkuXG4gKi9cblZhbHVlPzogc3RyaW5nXG4vKipcbiAqIE9uZSBwYXJ0IG9mIGEga2V5LXZhbHVlIHBhaXIgdGhhdCBtYWtlIHVwIGEgdGFnLiBBIGBga2V5YGAgaXMgYSBnZW5lcmFsIGxhYmVsIHRoYXQgYWN0cyBsaWtlIGEgY2F0ZWdvcnkgZm9yIG1vcmUgc3BlY2lmaWMgdGFnIHZhbHVlcy5cbiAqL1xuS2V5Pzogc3RyaW5nXG59XG4iXX0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWVjcy10YXNrZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3cy1lY3MtdGFza2RlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaXN0ZXJzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBgYGZhbWlseWBgIGFuZCBgYGNvbnRhaW5lckRlZmluaXRpb25zYGAuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGRhdGEgdm9sdW1lcyB0byB5b3VyIGNvbnRhaW5lcnMgd2l0aCB0aGUgYGB2b2x1bWVzYGAgcGFyYW1ldGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0YXNrIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFlvdSBjYW4gc3BlY2lmeSBhIHJvbGUgZm9yIHlvdXIgdGFzayB3aXRoIHRoZSBgYHRhc2tSb2xlQXJuYGAgcGFyYW1ldGVyLiBXaGVuIHlvdSBzcGVjaWZ5IGEgcm9sZSBmb3IgYSB0YXNrLCBpdHMgY29udGFpbmVycyBjYW4gdGhlbiB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIG9yIFNES3MgdG8gbWFrZSBBUEkgcmVxdWVzdHMgdG8gdGhlIEFXUyBzZXJ2aWNlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHBvbGljeSB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb2xlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJQU0gUm9sZXMgZm9yIFRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLWlhbS1yb2xlcy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgWW91IGNhbiBzcGVjaWZ5IGEgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIGNvbnRhaW5lcnMgaW4geW91ciB0YXNrIGRlZmluaXRpb24gd2l0aCB0aGUgYGBuZXR3b3JrTW9kZWBgIHBhcmFtZXRlci4gSWYgeW91IHNwZWNpZnkgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB0aGUgdGFzayBpcyBhbGxvY2F0ZWQgYW4gZWxhc3RpYyBuZXR3b3JrIGludGVyZmFjZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYSBbTmV0d29ya0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTmV0d29ya0NvbmZpZ3VyYXRpb24uaHRtbCkgd2hlbiB5b3UgY3JlYXRlIGEgc2VydmljZSBvciBydW4gYSB0YXNrIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVGFzayBOZXR3b3JraW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLW5ldHdvcmtpbmcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgb3IgZXhhbXBsZXMsIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjb250ZW50cyAoYGBBVVRIUEFSQU1TYGApIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBzaWduYXR1cmUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NpZ25hdHVyZSBWZXJzaW9uIDQgU2lnbmluZyBQcm9jZXNzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3Ivc2lnbmF0dXJlLXZlcnNpb24tNC5odG1sKSBpbiB0aGUgKkdlbmVyYWwgUmVmZXJlbmNlKi5cbiAqICBZb3Ugb25seSBuZWVkIHRvIGxlYXJuIGhvdyB0byBzaWduIEhUVFAgcmVxdWVzdHMgaWYgeW91IGludGVuZCB0byBjcmVhdGUgdGhlbSBtYW51YWxseS4gV2hlbiB5b3UgdXNlIHRoZSBbXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xpLykgb3Igb25lIG9mIHRoZSBbU0RLc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Rvb2xzLykgdG8gbWFrZSByZXF1ZXN0cyB0byBBV1MsIHRoZXNlIHRvb2xzIGF1dG9tYXRpY2FsbHkgc2lnbiB0aGUgcmVxdWVzdHMgZm9yIHlvdSwgd2l0aCB0aGUgYWNjZXNzIGtleSB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4geW91IGNvbmZpZ3VyZSB0aGUgdG9vbHMuIFdoZW4geW91IHVzZSB0aGVzZSB0b29scywgeW91IGRvbid0IGhhdmUgdG8gc2lnbiByZXF1ZXN0cyB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBfQVdTX0VDU19UQVNLREVGSU5JVElPTiB7XG4vKipcbiAqIFRoZSBzaG9ydCBuYW1lIG9yIGZ1bGwgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIElBTWxvbmcgcm9sZSB0aGF0IGdyYW50cyBjb250YWluZXJzIGluIHRoZSB0YXNrIHBlcm1pc3Npb24gdG8gY2FsbCBBV1MgQVBJcyBvbiB5b3VyIGJlaGFsZi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUyBUYXNrIFJvbGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2staWFtLXJvbGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBJQU0gcm9sZXMgZm9yIHRhc2tzIG9uIFdpbmRvd3MgcmVxdWlyZSB0aGF0IHRoZSBgYC1FbmFibGVUYXNrSUFNUm9sZWBgIG9wdGlvbiBpcyBzZXQgd2hlbiB5b3UgbGF1bmNoIHRoZSBBbWF6b24gRUNTLW9wdGltaXplZCBXaW5kb3dzIEFNSS4gWW91ciBjb250YWluZXJzIG11c3QgYWxzbyBydW4gc29tZSBjb25maWd1cmF0aW9uIGNvZGUgdG8gdXNlIHRoZSBmZWF0dXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXaW5kb3dzIElBTSByb2xlcyBmb3IgdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3dpbmRvd3NfdGFza19JQU1fcm9sZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBTdHJpbmcgdmFsaWRhdGlvbiBpcyBkb25lIG9uIHRoZSBFQ1Mgc2lkZS4gSWYgYW4gaW52YWxpZCBzdHJpbmcgdmFsdWUgaXMgZ2l2ZW4gZm9yIGBgVGFza1JvbGVBcm5gYCwgaXQgbWF5IGNhdXNlIHRoZSBDbG91ZGZvcm1hdGlvbiBqb2IgdG8gaGFuZy5cbiAqL1xuVGFza1JvbGVBcm4/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAsIGBgdGFza2BgLCBvciBgYG5vbmVgYC4gSWYgYGBob3N0YGAgaXMgc3BlY2lmaWVkLCB0aGVuIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIElQQyBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBJUEMgcmVzb3VyY2VzIHdpdGggdGhlIGhvc3QgQW1hem9uIEVDMiBpbnN0YW5jZS4gSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIElQQyByZXNvdXJjZXMuIElmIGBgbm9uZWBgIGlzIHNwZWNpZmllZCwgdGhlbiBJUEMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgY29udGFpbmVycyBvZiBhIHRhc2sgYXJlIHByaXZhdGUgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBjb250YWluZXJzIGluIGEgdGFzayBvciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIElQQyByZXNvdXJjZSBuYW1lc3BhY2Ugc2hhcmluZyBkZXBlbmRzIG9uIHRoZSBEb2NrZXIgZGFlbW9uIHNldHRpbmcgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS5cbiAqICBJZiB0aGUgYGBob3N0YGAgSVBDIG1vZGUgaXMgdXNlZCwgYmUgYXdhcmUgdGhhdCB0aGVyZSBpcyBhIGhlaWdodGVuZWQgcmlzayBvZiB1bmRlc2lyZWQgSVBDIG5hbWVzcGFjZSBleHBvc2UuXG4gKiAgSWYgeW91IGFyZSBzZXR0aW5nIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdXNpbmcgYGBzeXN0ZW1Db250cm9sc2BgIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyB3aWxsIGFwcGx5IHRvIHlvdXIgSVBDIHJlc291cmNlIG5hbWVzcGFjZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3lzdGVtIENvbnRyb2xzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgd2lsbCBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzIG9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuSXBjTW9kZT86IHN0cmluZ1xuSW5mZXJlbmNlQWNjZWxlcmF0b3JzPzogSW5mZXJlbmNlQWNjZWxlcmF0b3JbXVxuLyoqXG4gKiBUaGUgYW1vdW50IChpbiBNaUIpIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSB0YXNrLlxuICogIElmIHlvdXIgdGFza3MgcnVucyBvbiBBbWF6b24gRUMyIGluc3RhbmNlcywgeW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBvciBhIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgdmFsdWUuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGFueSB2YWx1ZSBjYW4gYmUgdXNlZC4gSWYgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBjb250YWluZXItbGV2ZWwgbWVtb3J5IHZhbHVlIGlzIG9wdGlvbmFsLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29udGFpbmVyLWxldmVsIG1lbW9yeSBhbmQgbWVtb3J5IHJlc2VydmF0aW9uLCBzZWUgW0NvbnRhaW5lckRlZmluaXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ29udGFpbmVyRGVmaW5pdGlvbi5odG1sKS5cbiAqICBJZiB5b3VyIHRhc2tzIHJ1bnMgb24gRkFSR0FURWxvbmcsIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIFlvdSBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuIFRoZSB2YWx1ZSB5b3UgY2hvb3NlIGRldGVybWluZXMgeW91ciByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgYGNwdWBgIHBhcmFtZXRlci5cbiAqICAgKyAgNTEyICgwLjUgR0IpLCAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDI1NiAoLjI1IHZDUFUpXG4gKiAgICsgIDEwMjQgKDEgR0IpLCAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA1MTIgKC41IHZDUFUpXG4gKiAgICsgIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQiksIDUxMjAgKDUgR0IpLCA2MTQ0ICg2IEdCKSwgNzE2OCAoNyBHQiksIDgxOTIgKDggR0IpIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiAxMDI0ICgxIHZDUFUpXG4gKiAgICsgIEJldHdlZW4gNDA5NiAoNCBHQikgYW5kIDE2Mzg0ICgxNiBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKSAtIEF2YWlsYWJsZSBgYGNwdWBgIHZhbHVlczogMjA0OCAoMiB2Q1BVKVxuICogICArICBCZXR3ZWVuIDgxOTIgKDggR0IpIGFuZCAzMDcyMCAoMzAgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQikgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDQwOTYgKDQgdkNQVSlcbiAqICAgKyAgQmV0d2VlbiAxNiBHQiBhbmQgNjAgR0IgaW4gNCBHQiBpbmNyZW1lbnRzIC0gQXZhaWxhYmxlIGBgY3B1YGAgdmFsdWVzOiA4MTkyICg4IHZDUFUpXG4gKiAgVGhpcyBvcHRpb24gcmVxdWlyZXMgTGludXggcGxhdGZvcm0gYGAxLjQuMGBgIG9yIGxhdGVyLlxuICogICArICBCZXR3ZWVuIDMyR0IgYW5kIDEyMCBHQiBpbiA4IEdCIGluY3JlbWVudHMgLSBBdmFpbGFibGUgYGBjcHVgYCB2YWx1ZXM6IDE2Mzg0ICgxNiB2Q1BVKVxuICogIFRoaXMgb3B0aW9uIHJlcXVpcmVzIExpbnV4IHBsYXRmb3JtIGBgMS40LjBgYCBvciBsYXRlci5cbiAqL1xuTWVtb3J5Pzogc3RyaW5nXG4vKipcbiAqIEFuIGFycmF5IG9mIHBsYWNlbWVudCBjb25zdHJhaW50IG9iamVjdHMgdG8gdXNlIGZvciB0YXNrcy5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkIGZvciB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cblBsYWNlbWVudENvbnN0cmFpbnRzPzogVGFza0RlZmluaXRpb25QbGFjZW1lbnRDb25zdHJhaW50W11cbi8qKlxuICogVGhlIG51bWJlciBvZiBgYGNwdWBgIHVuaXRzIHVzZWQgYnkgdGhlIHRhc2suIElmIHlvdSB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gQW55IHZhbHVlIGNhbiBiZSB1c2VkLiBJZiB5b3UgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLiBZb3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiBUaGUgdmFsdWUgdGhhdCB5b3UgY2hvb3NlIGRldGVybWluZXMgeW91ciByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgYG1lbW9yeWBgIHBhcmFtZXRlci5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSBvciB0aGUgZXh0ZXJuYWwgbGF1bmNoIHR5cGUsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIGJldHdlZW4gYGAxMjhgYCBDUFUgdW5pdHMgKGBgMC4xMjVgYCB2Q1BVcykgYW5kIGBgMTk2NjA4YGAgQ1BVIHVuaXRzIChgYDE5MmBgIHZDUFVzKS4gXG4gKiAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgRmFyZ2F0ZS4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2YWxpZCB2YWx1ZXMsIHNlZSBbVGFzayBzaXplXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmluaXRpb25fcGFyYW1ldGVycy5odG1sI3Rhc2tfc2l6ZSkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5DcHU/OiBzdHJpbmdcbi8qKlxuICogVGhlIHRhc2sgbGF1bmNoIHR5cGVzIHRoZSB0YXNrIGRlZmluaXRpb24gd2FzIHZhbGlkYXRlZCBhZ2FpbnN0LiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYE1BTkFHRURfSU5TVEFOQ0VTYGAsIGBgRUMyYGAsIGBgRkFSR0FURWBgLCBhbmQgYGBFWFRFUk5BTGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTIGxhdW5jaCB0eXBlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbGF1bmNoX3R5cGVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuUmVxdWlyZXNDb21wYXRpYmlsaXRpZXM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgRG9ja2VyIG5ldHdvcmtpbmcgbW9kZSB0byB1c2UgZm9yIHRoZSBjb250YWluZXJzIGluIHRoZSB0YXNrLiBUaGUgdmFsaWQgdmFsdWVzIGFyZSBgYG5vbmVgYCwgYGBicmlkZ2VgYCwgYGBhd3N2cGNgYCwgYW5kIGBgaG9zdGBgLiBJZiBubyBuZXR3b3JrIG1vZGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBgYGJyaWRnZWBgLlxuICogIEZvciBBbWF6b24gRUNTIHRhc2tzIG9uIEZhcmdhdGUsIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSBpcyByZXF1aXJlZC4gRm9yIEFtYXpvbiBFQ1MgdGFza3Mgb24gQW1hem9uIEVDMiBMaW51eCBpbnN0YW5jZXMsIGFueSBuZXR3b3JrIG1vZGUgY2FuIGJlIHVzZWQuIEZvciBBbWF6b24gRUNTIHRhc2tzIG9uIEFtYXpvbiBFQzIgV2luZG93cyBpbnN0YW5jZXMsIGBgPGRlZmF1bHQ+YGAgb3IgYGBhd3N2cGNgYCBjYW4gYmUgdXNlZC4gSWYgdGhlIG5ldHdvcmsgbW9kZSBpcyBzZXQgdG8gYGBub25lYGAsIHlvdSBjYW5ub3Qgc3BlY2lmeSBwb3J0IG1hcHBpbmdzIGluIHlvdXIgY29udGFpbmVyIGRlZmluaXRpb25zLCBhbmQgdGhlIHRhc2tzIGNvbnRhaW5lcnMgZG8gbm90IGhhdmUgZXh0ZXJuYWwgY29ubmVjdGl2aXR5LiBUaGUgYGBob3N0YGAgYW5kIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlcyBvZmZlciB0aGUgaGlnaGVzdCBuZXR3b3JraW5nIHBlcmZvcm1hbmNlIGZvciBjb250YWluZXJzIGJlY2F1c2UgdGhleSB1c2UgdGhlIEVDMiBuZXR3b3JrIHN0YWNrIGluc3RlYWQgb2YgdGhlIHZpcnR1YWxpemVkIG5ldHdvcmsgc3RhY2sgcHJvdmlkZWQgYnkgdGhlIGBgYnJpZGdlYGAgbW9kZS5cbiAqICBXaXRoIHRoZSBgYGhvc3RgYCBhbmQgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGVzLCBleHBvc2VkIGNvbnRhaW5lciBwb3J0cyBhcmUgbWFwcGVkIGRpcmVjdGx5IHRvIHRoZSBjb3JyZXNwb25kaW5nIGhvc3QgcG9ydCAoZm9yIHRoZSBgYGhvc3RgYCBuZXR3b3JrIG1vZGUpIG9yIHRoZSBhdHRhY2hlZCBlbGFzdGljIG5ldHdvcmsgaW50ZXJmYWNlIHBvcnQgKGZvciB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUpLCBzbyB5b3UgY2Fubm90IHRha2UgYWR2YW50YWdlIG9mIGR5bmFtaWMgaG9zdCBwb3J0IG1hcHBpbmdzLiBcbiAqICAgV2hlbiB1c2luZyB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlLCB5b3Ugc2hvdWxkIG5vdCBydW4gY29udGFpbmVycyB1c2luZyB0aGUgcm9vdCB1c2VyIChVSUQgMCkuIEl0IGlzIGNvbnNpZGVyZWQgYmVzdCBwcmFjdGljZSB0byB1c2UgYSBub24tcm9vdCB1c2VyLlxuICogICBJZiB0aGUgbmV0d29yayBtb2RlIGlzIGBgYXdzdnBjYGAsIHRoZSB0YXNrIGlzIGFsbG9jYXRlZCBhbiBlbGFzdGljIG5ldHdvcmsgaW50ZXJmYWNlLCBhbmQgeW91IG11c3Qgc3BlY2lmeSBhIFtOZXR3b3JrQ29uZmlndXJhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9OZXR3b3JrQ29uZmlndXJhdGlvbi5odG1sKSB2YWx1ZSB3aGVuIHlvdSBjcmVhdGUgYSBzZXJ2aWNlIG9yIHJ1biBhIHRhc2sgd2l0aCB0aGUgdGFzayBkZWZpbml0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUYXNrIE5ldHdvcmtpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2stbmV0d29ya2luZy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgSWYgdGhlIG5ldHdvcmsgbW9kZSBpcyBgYGhvc3RgYCwgeW91IGNhbm5vdCBydW4gbXVsdGlwbGUgaW5zdGFudGlhdGlvbnMgb2YgdGhlIHNhbWUgdGFzayBvbiBhIHNpbmdsZSBjb250YWluZXIgaW5zdGFuY2Ugd2hlbiBwb3J0IG1hcHBpbmdzIGFyZSB1c2VkLlxuICovXG5OZXR3b3JrTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcHJvY2VzcyBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzay4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgYGBob3N0YGAgb3IgYGB0YXNrYGAuIE9uIEZhcmdhdGUgZm9yIExpbnV4IGNvbnRhaW5lcnMsIHRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzIGBgdGFza2BgLiBGb3IgZXhhbXBsZSwgbW9uaXRvcmluZyBzaWRlY2FycyBtaWdodCBuZWVkIGBgcGlkTW9kZWBgIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBjb250YWluZXJzIHJ1bm5pbmcgaW4gdGhlIHNhbWUgdGFzay5cbiAqICBJZiBgYGhvc3RgYCBpcyBzcGVjaWZpZWQsIGFsbCBjb250YWluZXJzIHdpdGhpbiB0aGUgdGFza3MgdGhhdCBzcGVjaWZpZWQgdGhlIGBgaG9zdGBgIFBJRCBtb2RlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBwcm9jZXNzIG5hbWVzcGFjZSB3aXRoIHRoZSBob3N0IEFtYXpvbiBFQzIgaW5zdGFuY2UuXG4gKiAgSWYgYGB0YXNrYGAgaXMgc3BlY2lmaWVkLCBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHNwZWNpZmllZCB0YXNrIHNoYXJlIHRoZSBzYW1lIHByb2Nlc3MgbmFtZXNwYWNlLlxuICogIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIFRoZSBkZWZhdWx0IGlzIGEgcHJpdmF0ZSBuYW1lc3BhY2UgZm9yIGVhY2ggY29udGFpbmVyLlxuICogIElmIHRoZSBgYGhvc3RgYCBQSUQgbW9kZSBpcyB1c2VkLCB0aGVyZSdzIGEgaGVpZ2h0ZW5lZCByaXNrIG9mIHVuZGVzaXJlZCBwcm9jZXNzIG5hbWVzcGFjZSBleHBvc3VyZS5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyBpZiB0aGUgdGFza3MgYXJlIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyIChMaW51eCkuIFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuUGlkTW9kZT86IHN0cmluZ1xuLyoqXG4gKiBFbmFibGVzIGZhdWx0IGluamVjdGlvbiBhbmQgYWxsb3dzIGZvciBmYXVsdCBpbmplY3Rpb24gcmVxdWVzdHMgdG8gYmUgYWNjZXB0ZWQgZnJvbSB0aGUgdGFzaydzIGNvbnRhaW5lcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgZmFsc2VgYC5cbiAqL1xuRW5hYmxlRmF1bHRJbmplY3Rpb24/OiBib29sZWFuXG4vKipcbiAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgdGFzayBleGVjdXRpb24gcm9sZSB0aGF0IGdyYW50cyB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcGVybWlzc2lvbiB0byBtYWtlIEFXUyBBUEkgY2FsbHMgb24geW91ciBiZWhhbGYuIEZvciBpbmZvcm1hdGlvbmFib3V0IHRoZSByZXF1aXJlZCBJQU0gcm9sZXMgZm9yIEFtYXpvbiBFQ1MsIHNlZSBbSUFNIHJvbGVzIGZvciBBbWF6b24gRUNTXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZWN1cml0eS1lY3MtaWFtLXJvbGUtb3ZlcnZpZXcuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5FeGVjdXRpb25Sb2xlQXJuPzogc3RyaW5nXG5SdW50aW1lUGxhdGZvcm0/OiBSdW50aW1lUGxhdGZvcm1cblByb3h5Q29uZmlndXJhdGlvbj86IFByb3h5Q29uZmlndXJhdGlvblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBkYXRhIHZvbHVtZSBkZWZpbml0aW9ucyBmb3IgdGhlIHRhc2suIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzaW5nIGRhdGEgdm9sdW1lcyBpbiB0YXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZGF0YV92b2x1bWVzLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVGhlIGBgaG9zdGBgIGFuZCBgYHNvdXJjZVBhdGhgYCBwYXJhbWV0ZXJzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuVm9sdW1lcz86IFZvbHVtZVtdXG4vKipcbiAqIEEgbGlzdCBvZiBjb250YWluZXIgZGVmaW5pdGlvbnMgaW4gSlNPTiBmb3JtYXQgdGhhdCBkZXNjcmliZSB0aGUgZGlmZmVyZW50IGNvbnRhaW5lcnMgdGhhdCBtYWtlIHVwIHlvdXIgdGFzay4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIGRlZmluaXRpb24gcGFyYW1ldGVycyBhbmQgZGVmYXVsdHMsIHNlZSBbQW1hem9uIEVDUyBUYXNrIERlZmluaXRpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrX2RlZmludGlvbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5Db250YWluZXJEZWZpbml0aW9ucz86IENvbnRhaW5lckRlZmluaXRpb25bXVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZhbWlseSB0aGF0IHRoaXMgdGFzayBkZWZpbml0aW9uIGlzIHJlZ2lzdGVyZWQgdG8uIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBhcmUgYWxsb3dlZC5cbiAqICBBIGZhbWlseSBncm91cHMgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSB0YXNrIGRlZmluaXRpb24uIEFtYXpvbiBFQ1MgZ2l2ZXMgdGhlIGZpcnN0IHRhc2sgZGVmaW5pdGlvbiB0aGF0IHlvdSByZWdpc3RlcmVkIHRvIGEgZmFtaWx5IGEgcmV2aXNpb24gbnVtYmVyIG9mIDEuIEFtYXpvbiBFQ1MgZ2l2ZXMgc2VxdWVudGlhbCByZXZpc2lvbiBudW1iZXJzIHRvIGVhY2ggdGFzayBkZWZpbml0aW9uIHRoYXQgeW91IGFkZC5cbiAqICAgVG8gdXNlIHJldmlzaW9uIG51bWJlcnMgd2hlbiB5b3UgdXBkYXRlIGEgdGFzayBkZWZpbml0aW9uLCBzcGVjaWZ5IHRoaXMgcHJvcGVydHkuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgdmFsdWUsIENGTmxvbmcgZ2VuZXJhdGVzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiBlYWNoIHRpbWUgdGhhdCB5b3UgdXBkYXRlIGl0LlxuICovXG5GYW1pbHk/OiBzdHJpbmdcbkVwaGVtZXJhbFN0b3JhZ2U/OiBFcGhlbWVyYWxTdG9yYWdlXG4vKipcbiAqIFRoZSBtZXRhZGF0YSB0aGF0IHlvdSBhcHBseSB0byB0aGUgdGFzayBkZWZpbml0aW9uIHRvIGhlbHAgeW91IGNhdGVnb3JpemUgYW5kIG9yZ2FuaXplIHRoZW0uIEVhY2ggdGFnIGNvbnNpc3RzIG9mIGEga2V5IGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4gWW91IGRlZmluZSBib3RoIG9mIHRoZW0uXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuVGFncz86IFRhZ1tdXG5UYXNrRGVmaW5pdGlvbkFybj86IHN0cmluZ1xufVxuZXhwb3J0IGludGVyZmFjZSBJbmZlcmVuY2VBY2NlbGVyYXRvciB7XG5EZXZpY2VUeXBlPzogc3RyaW5nXG5EZXZpY2VOYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25zdHJhaW50IG9uIHRhc2sgcGxhY2VtZW50IGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Rhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS90YXNrLXBsYWNlbWVudC1jb25zdHJhaW50cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgIFRhc2sgcGxhY2VtZW50IGNvbnN0cmFpbnRzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIHRhc2tzIHJ1biBvbiBGQVJHQVRFbG9uZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrRGVmaW5pdGlvblBsYWNlbWVudENvbnN0cmFpbnQge1xuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb25zdHJhaW50LiBUaGUgYGBNZW1iZXJPZmBgIGNvbnN0cmFpbnQgcmVzdHJpY3RzIHNlbGVjdGlvbiB0byBiZSBmcm9tIGEgZ3JvdXAgb2YgdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuVHlwZTogc3RyaW5nXG4vKipcbiAqIEEgY2x1c3RlciBxdWVyeSBsYW5ndWFnZSBleHByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBjb25zdHJhaW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtDbHVzdGVyIHF1ZXJ5IGxhbmd1YWdlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9jbHVzdGVyLXF1ZXJ5LWxhbmd1YWdlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXhwcmVzc2lvbj86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdXIgdGFza3MgZGVmaW5pdGlvbnMgcnVuIG9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVQbGF0Zm9ybSB7XG4vKipcbiAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICovXG5PcGVyYXRpbmdTeXN0ZW1GYW1pbHk/OiBzdHJpbmdcbi8qKlxuICogVGhlIENQVSBhcmNoaXRlY3R1cmUuXG4gKiAgWW91IGNhbiBydW4geW91ciBMaW51eCB0YXNrcyBvbiBhbiBBUk0tYmFzZWQgcGxhdGZvcm0gYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYGBBUk02NGBgLiBUaGlzIG9wdGlvbiBpcyBhdmFpbGFibGUgZm9yIHRhc2tzIHRoYXQgcnVuIG9uIExpbnV4IEFtYXpvbiBFQzIgaW5zdGFuY2UsIEFtYXpvbiBFQ1MgTWFuYWdlZCBJbnN0YW5jZXMsIG9yIExpbnV4IGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuQ3B1QXJjaGl0ZWN0dXJlPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHRoZSBBcHAgTWVzaCBwcm94eS5cbiAqICBZb3VyIEFtYXpvbiBFQ1MgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlIHRvIHVzZSBhIHByb3h5IGNvbmZpZ3VyYXRpb24uIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB0aGUgQW1hem9uIEVDUyBvcHRpbWl6ZWQgQU1JIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIHNldCBvZiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB0byBwcm92aWRlIHRoZSBDb250YWluZXIgTmV0d29yayBJbnRlcmZhY2UgKENOSSkgcGx1Z2luLCBzcGVjaWZpZWQgYXMga2V5LXZhbHVlIHBhaXJzLlxuICogICArICBgYElnbm9yZWRVSURgYCAtIChSZXF1aXJlZCkgVGhlIHVzZXIgSUQgKFVJRCkgb2YgdGhlIHByb3h5IGNvbnRhaW5lciBhcyBkZWZpbmVkIGJ5IHRoZSBgYHVzZXJgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgcHJveHkgaWdub3JlcyBpdHMgb3duIHRyYWZmaWMuIElmIGBgSWdub3JlZEdJRGBgIGlzIHNwZWNpZmllZCwgdGhpcyBmaWVsZCBjYW4gYmUgZW1wdHkuXG4gKiAgICsgIGBgSWdub3JlZEdJRGBgIC0gKFJlcXVpcmVkKSBUaGUgZ3JvdXAgSUQgKEdJRCkgb2YgdGhlIHByb3h5IGNvbnRhaW5lciBhcyBkZWZpbmVkIGJ5IHRoZSBgYHVzZXJgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgcHJveHkgaWdub3JlcyBpdHMgb3duIHRyYWZmaWMuIElmIGBgSWdub3JlZFVJRGBgIGlzIHNwZWNpZmllZCwgdGhpcyBmaWVsZCBjYW4gYmUgZW1wdHkuXG4gKiAgICsgIGBgQXBwUG9ydHNgYCAtIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgcG9ydHMgdGhhdCB0aGUgYXBwbGljYXRpb24gdXNlcy4gTmV0d29yayB0cmFmZmljIHRvIHRoZXNlIHBvcnRzIGlzIGZvcndhcmRlZCB0byB0aGUgYGBQcm94eUluZ3Jlc3NQb3J0YGAgYW5kIGBgUHJveHlFZ3Jlc3NQb3J0YGAuXG4gKiAgICsgIGBgUHJveHlJbmdyZXNzUG9ydGBgIC0gKFJlcXVpcmVkKSBTcGVjaWZpZXMgdGhlIHBvcnQgdGhhdCBpbmNvbWluZyB0cmFmZmljIHRvIHRoZSBgYEFwcFBvcnRzYGAgaXMgZGlyZWN0ZWQgdG8uXG4gKiAgICsgIGBgUHJveHlFZ3Jlc3NQb3J0YGAgLSAoUmVxdWlyZWQpIFNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IG91dGdvaW5nIHRyYWZmaWMgZnJvbSB0aGUgYGBBcHBQb3J0c2BgIGlzIGRpcmVjdGVkIHRvLlxuICogICArICBgYEVncmVzc0lnbm9yZWRQb3J0c2BgIC0gKFJlcXVpcmVkKSBUaGUgZWdyZXNzIHRyYWZmaWMgZ29pbmcgdG8gdGhlIHNwZWNpZmllZCBwb3J0cyBpcyBpZ25vcmVkIGFuZCBub3QgcmVkaXJlY3RlZCB0byB0aGUgYGBQcm94eUVncmVzc1BvcnRgYC4gSXQgY2FuIGJlIGFuIGVtcHR5IGxpc3QuXG4gKiAgICsgIGBgRWdyZXNzSWdub3JlZElQc2BgIC0gKFJlcXVpcmVkKSBUaGUgZWdyZXNzIHRyYWZmaWMgZ29pbmcgdG8gdGhlIHNwZWNpZmllZCBJUCBhZGRyZXNzZXMgaXMgaWdub3JlZCBhbmQgbm90IHJlZGlyZWN0ZWQgdG8gdGhlIGBgUHJveHlFZ3Jlc3NQb3J0YGAuIEl0IGNhbiBiZSBhbiBlbXB0eSBsaXN0LlxuICovXG5Qcm94eUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzPzogS2V5VmFsdWVQYWlyW11cbi8qKlxuICogVGhlIHByb3h5IHR5cGUuIFRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgYEFQUE1FU0hgYC5cbiAqL1xuVHlwZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRoYXQgd2lsbCBzZXJ2ZSBhcyB0aGUgQXBwIE1lc2ggcHJveHkuXG4gKi9cbkNvbnRhaW5lck5hbWU6IHN0cmluZ1xufVxuLyoqXG4gKiBBIGtleS12YWx1ZSBwYWlyIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYWx1ZVBhaXIge1xuLyoqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIGtleS12YWx1ZSBwYWlyLiBGb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cblZhbHVlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBrZXktdmFsdWUgcGFpci4gRm9yIGVudmlyb25tZW50IHZhcmlhYmxlcywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbk5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGRhdGEgdm9sdW1lIGNvbmZpZ3VyYXRpb24gZm9yIHRhc2tzIGxhdW5jaGVkIHVzaW5nIHRoaXMgdGFzayBkZWZpbml0aW9uLiBTcGVjaWZ5aW5nIGEgdm9sdW1lIGNvbmZpZ3VyYXRpb24gaW4gYSB0YXNrIGRlZmluaXRpb24gaXMgb3B0aW9uYWwuIFRoZSB2b2x1bWUgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtdWx0aXBsZSB2b2x1bWVzIGJ1dCBvbmx5IG9uZSB2b2x1bWUgY29uZmlndXJlZCBhdCBsYXVuY2ggaXMgc3VwcG9ydGVkLiBFYWNoIHZvbHVtZSBkZWZpbmVkIGluIHRoZSB2b2x1bWUgY29uZmlndXJhdGlvbiBtYXkgb25seSBzcGVjaWZ5IGEgYGBuYW1lYGAgYW5kIG9uZSBvZiBlaXRoZXIgYGBjb25maWd1cmVkQXRMYXVuY2hgYCwgYGBkb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uYGAsIGBgZWZzVm9sdW1lQ29uZmlndXJhdGlvbmBgLCBgYGZzeFdpbmRvd3NGaWxlU2VydmVyVm9sdW1lQ29uZmlndXJhdGlvbmBgLCBvciBgYGhvc3RgYC4gSWYgYW4gZW1wdHkgdm9sdW1lIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLCBieSBkZWZhdWx0IEFtYXpvbiBFQ1MgdXNlcyBhIGhvc3Qgdm9sdW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBkYXRhIHZvbHVtZXMgaW4gdGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzaW5nX2RhdGFfdm9sdW1lcy5odG1sKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWUge1xuRUZTVm9sdW1lQ29uZmlndXJhdGlvbj86IEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25cbkhvc3Q/OiBIb3N0Vm9sdW1lUHJvcGVydGllc1xuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdm9sdW1lIHNob3VsZCBiZSBjb25maWd1cmVkIGF0IGxhdW5jaCB0aW1lLiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIEFtYXpvbiBFQlMgdm9sdW1lcyBmb3Igc3RhbmRhbG9uZSB0YXNrcyBvciB0YXNrcyBjcmVhdGVkIGFzIHBhcnQgb2YgYSBzZXJ2aWNlLiBFYWNoIHRhc2sgZGVmaW5pdGlvbiByZXZpc2lvbiBtYXkgb25seSBoYXZlIG9uZSB2b2x1bWUgY29uZmlndXJlZCBhdCBsYXVuY2ggaW4gdGhlIHZvbHVtZSBjb25maWd1cmF0aW9uLlxuICogIFRvIGNvbmZpZ3VyZSBhIHZvbHVtZSBhdCBsYXVuY2ggdGltZSwgdXNlIHRoaXMgdGFzayBkZWZpbml0aW9uIHJldmlzaW9uIGFuZCBzcGVjaWZ5IGEgYGB2b2x1bWVDb25maWd1cmF0aW9uc2BgIG9iamVjdCB3aGVuIGNhbGxpbmcgdGhlIGBgQ3JlYXRlU2VydmljZWBgLCBgYFVwZGF0ZVNlcnZpY2VgYCwgYGBSdW5UYXNrYGAgb3IgYGBTdGFydFRhc2tgYCBBUElzLlxuICovXG5Db25maWd1cmVkQXRMYXVuY2g/OiBib29sZWFuXG5Eb2NrZXJWb2x1bWVDb25maWd1cmF0aW9uPzogRG9ja2VyVm9sdW1lQ29uZmlndXJhdGlvblxuRlN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uPzogRlN4V2luZG93c0ZpbGVTZXJ2ZXJWb2x1bWVDb25maWd1cmF0aW9uXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSB2b2x1bWUuIFVwIHRvIDI1NSBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBhcmUgYWxsb3dlZC5cbiAqICBXaGVuIHVzaW5nIGEgdm9sdW1lIGNvbmZpZ3VyZWQgYXQgbGF1bmNoLCB0aGUgYGBuYW1lYGAgaXMgcmVxdWlyZWQgYW5kIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQgYXMgdGhlIHZvbHVtZSBuYW1lIGluIHRoZSBgYFNlcnZpY2VWb2x1bWVDb25maWd1cmF0aW9uYGAgb3IgYGBUYXNrVm9sdW1lQ29uZmlndXJhdGlvbmBgIHBhcmFtZXRlciB3aGVuIGNyZWF0aW5nIHlvdXIgc2VydmljZSBvciBzdGFuZGFsb25lIHRhc2suXG4gKiAgRm9yIGFsbCBvdGhlciB0eXBlcyBvZiB2b2x1bWVzLCB0aGlzIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYGBzb3VyY2VWb2x1bWVgYCBwYXJhbWV0ZXIgb2YgdGhlIGBgbW91bnRQb2ludHNgYCBvYmplY3QgaW4gdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICogIFdoZW4gYSB2b2x1bWUgaXMgdXNpbmcgdGhlIGBgZWZzVm9sdW1lQ29uZmlndXJhdGlvbmBgLCB0aGUgbmFtZSBpcyByZXF1aXJlZC5cbiAqL1xuTmFtZT86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2hlbiB5b3UgdXNlIGFuIEFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIGZpbGUgc3lzdGVtIGZvciB0YXNrIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUZTVm9sdW1lQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtIElEIHRvIHVzZS5cbiAqL1xuRmlsZXN5c3RlbUlkOiBzdHJpbmdcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBlbmNyeXB0aW9uIGZvciBBbWF6b24gRUZTIGRhdGEgaW4gdHJhbnNpdCBiZXR3ZWVuIHRoZSBBbWF6b24gRUNTIGhvc3QgYW5kIHRoZSBBbWF6b24gRUZTIHNlcnZlci4gVHJhbnNpdCBlbmNyeXB0aW9uIG11c3QgYmUgdHVybmVkIG9uIGlmIEFtYXpvbiBFRlMgSUFNIGF1dGhvcml6YXRpb24gaXMgdXNlZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYGBESVNBQkxFRGBgIGlzIHVzZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0VuY3J5cHRpbmcgZGF0YSBpbiB0cmFuc2l0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWZzL2xhdGVzdC91Zy9lbmNyeXB0aW9uLWluLXRyYW5zaXQuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBGaWxlIFN5c3RlbSBVc2VyIEd1aWRlKi5cbiAqL1xuVHJhbnNpdEVuY3J5cHRpb24/OiAoXCJFTkFCTEVEXCIgfCBcIkRJU0FCTEVEXCIpXG5BdXRob3JpemF0aW9uQ29uZmlnPzogQXV0aG9yaXphdGlvbkNvbmZpZ1xuLyoqXG4gKiBUaGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgQW1hem9uIEVGUyBmaWxlIHN5c3RlbSB0byBtb3VudCBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgaW5zaWRlIHRoZSBob3N0LiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgcm9vdCBvZiB0aGUgQW1hem9uIEVGUyB2b2x1bWUgd2lsbCBiZSB1c2VkLiBTcGVjaWZ5aW5nIGBgL2BgIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgb21pdHRpbmcgdGhpcyBwYXJhbWV0ZXIuXG4gKiAgIElmIGFuIEVGUyBhY2Nlc3MgcG9pbnQgaXMgc3BlY2lmaWVkIGluIHRoZSBgYGF1dGhvcml6YXRpb25Db25maWdgYCwgdGhlIHJvb3QgZGlyZWN0b3J5IHBhcmFtZXRlciBtdXN0IGVpdGhlciBiZSBvbWl0dGVkIG9yIHNldCB0byBgYC9gYCB3aGljaCB3aWxsIGVuZm9yY2UgdGhlIHBhdGggc2V0IG9uIHRoZSBFRlMgYWNjZXNzIHBvaW50LlxuICovXG5Sb290RGlyZWN0b3J5Pzogc3RyaW5nXG4vKipcbiAqIFRoZSBwb3J0IHRvIHVzZSB3aGVuIHNlbmRpbmcgZW5jcnlwdGVkIGRhdGEgYmV0d2VlbiB0aGUgQW1hem9uIEVDUyBob3N0IGFuZCB0aGUgQW1hem9uIEVGUyBzZXJ2ZXIuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHRyYW5zaXQgZW5jcnlwdGlvbiBwb3J0LCBpdCB3aWxsIHVzZSB0aGUgcG9ydCBzZWxlY3Rpb24gc3RyYXRlZ3kgdGhhdCB0aGUgQW1hem9uIEVGUyBtb3VudCBoZWxwZXIgdXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbRUZTIG1vdW50IGhlbHBlcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vmcy9sYXRlc3QvdWcvZWZzLW1vdW50LWhlbHBlci5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIFVzZXIgR3VpZGUqLlxuICovXG5UcmFuc2l0RW5jcnlwdGlvblBvcnQ/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgQW1hem9uIEVGUyBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemF0aW9uQ29uZmlnIHtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgQW1hem9uIEVDUyB0YXNrIHJvbGUgZGVmaW5lZCBpbiBhIHRhc2sgZGVmaW5pdGlvbiB3aGVuIG1vdW50aW5nIHRoZSBBbWF6b24gRUZTIGZpbGUgc3lzdGVtLiBJZiBpdCBpcyB0dXJuZWQgb24sIHRyYW5zaXQgZW5jcnlwdGlvbiBtdXN0IGJlIHR1cm5lZCBvbiBpbiB0aGUgYGBFRlNWb2x1bWVDb25maWd1cmF0aW9uYGAuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGBgRElTQUJMRURgYCBpcyB1c2VkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBBbWF6b24gRUZTIGFjY2VzcyBwb2ludHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vmcy12b2x1bWVzLmh0bWwjZWZzLXZvbHVtZS1hY2Nlc3Nwb2ludHMpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuSUFNPzogKFwiRU5BQkxFRFwiIHwgXCJESVNBQkxFRFwiKVxuLyoqXG4gKiBUaGUgQW1hem9uIEVGUyBhY2Nlc3MgcG9pbnQgSUQgdG8gdXNlLiBJZiBhbiBhY2Nlc3MgcG9pbnQgaXMgc3BlY2lmaWVkLCB0aGUgcm9vdCBkaXJlY3RvcnkgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBgYEVGU1ZvbHVtZUNvbmZpZ3VyYXRpb25gYCBtdXN0IGVpdGhlciBiZSBvbWl0dGVkIG9yIHNldCB0byBgYC9gYCB3aGljaCB3aWxsIGVuZm9yY2UgdGhlIHBhdGggc2V0IG9uIHRoZSBFRlMgYWNjZXNzIHBvaW50LiBJZiBhbiBhY2Nlc3MgcG9pbnQgaXMgdXNlZCwgdHJhbnNpdCBlbmNyeXB0aW9uIG11c3QgYmUgb24gaW4gdGhlIGBgRUZTVm9sdW1lQ29uZmlndXJhdGlvbmBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtXb3JraW5nIHdpdGggQW1hem9uIEVGUyBhY2Nlc3MgcG9pbnRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWZzL2xhdGVzdC91Zy9lZnMtYWNjZXNzLXBvaW50cy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIEZpbGUgU3lzdGVtIFVzZXIgR3VpZGUqLlxuICovXG5BY2Nlc3NQb2ludElkPzogc3RyaW5nXG59XG4vKipcbiAqIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB3aGVuIHlvdSB1c2UgYmluZCBtb3VudCBob3N0IHZvbHVtZXMuIFRoZSBjb250ZW50cyBvZiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGRldGVybWluZSB3aGV0aGVyIHlvdXIgYmluZCBtb3VudCBob3N0IHZvbHVtZSBwZXJzaXN0cyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgYW5kIHdoZXJlIGl0J3Mgc3RvcmVkLiBJZiB0aGUgYGBob3N0YGAgcGFyYW1ldGVyIGlzIGVtcHR5LCB0aGVuIHRoZSBEb2NrZXIgZGFlbW9uIGFzc2lnbnMgYSBob3N0IHBhdGggZm9yIHlvdXIgZGF0YSB2b2x1bWUuIEhvd2V2ZXIsIHRoZSBkYXRhIGlzbid0IGd1YXJhbnRlZWQgdG8gcGVyc2lzdCBhZnRlciB0aGUgY29udGFpbmVycyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggaXQgc3RvcCBydW5uaW5nLlxuICogIFdpbmRvd3MgY29udGFpbmVycyBjYW4gbW91bnQgd2hvbGUgZGlyZWN0b3JpZXMgb24gdGhlIHNhbWUgZHJpdmUgYXMgYGAkZW52OlByb2dyYW1EYXRhYGAuIFdpbmRvd3MgY29udGFpbmVycyBjYW4ndCBtb3VudCBkaXJlY3RvcmllcyBvbiBhIGRpZmZlcmVudCBkcml2ZSwgYW5kIG1vdW50IHBvaW50IGNhbid0IGJlIGFjcm9zcyBkcml2ZXMuIEZvciBleGFtcGxlLCB5b3UgY2FuIG1vdW50IGBgQzpcXG15XFxwYXRoOkM6XFxteVxccGF0aGBgIGFuZCBgYEQ6XFw6RDpcXGBgLCBidXQgbm90IGBgRDpcXG15XFxwYXRoOkM6XFxteVxccGF0aGBgIG9yIGBgRDpcXDpDOlxcbXlcXHBhdGhgYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0Vm9sdW1lUHJvcGVydGllcyB7XG4vKipcbiAqIFdoZW4gdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBpcyB1c2VkLCBzcGVjaWZ5IGEgYGBzb3VyY2VQYXRoYGAgdG8gZGVjbGFyZSB0aGUgcGF0aCBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdGhhdCdzIHByZXNlbnRlZCB0byB0aGUgY29udGFpbmVyLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBlbXB0eSwgdGhlbiB0aGUgRG9ja2VyIGRhZW1vbiBoYXMgYXNzaWduZWQgYSBob3N0IHBhdGggZm9yIHlvdS4gSWYgdGhlIGBgaG9zdGBgIHBhcmFtZXRlciBjb250YWlucyBhIGBgc291cmNlUGF0aGBgIGZpbGUgbG9jYXRpb24sIHRoZW4gdGhlIGRhdGEgdm9sdW1lIHBlcnNpc3RzIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlIHVudGlsIHlvdSBkZWxldGUgaXQgbWFudWFsbHkuIElmIHRoZSBgYHNvdXJjZVBhdGhgYCB2YWx1ZSBkb2Vzbid0IGV4aXN0IG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSwgdGhlIERvY2tlciBkYWVtb24gY3JlYXRlcyBpdC4gSWYgdGhlIGxvY2F0aW9uIGRvZXMgZXhpc3QsIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIHBhdGggZm9sZGVyIGFyZSBleHBvcnRlZC5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHNvdXJjZVBhdGhgYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuU291cmNlUGF0aD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2hlbiB5b3UgdXNlIERvY2tlciB2b2x1bWVzLlxuICogIFdpbmRvd3MgY29udGFpbmVycyBvbmx5IHN1cHBvcnQgdGhlIHVzZSBvZiB0aGUgYGBsb2NhbGBgIGRyaXZlci4gVG8gdXNlIGJpbmQgbW91bnRzLCBzcGVjaWZ5IHRoZSBgYGhvc3RgYCBwYXJhbWV0ZXIgaW5zdGVhZC5cbiAqICAgRG9ja2VyIHZvbHVtZXMgYXJlbid0IHN1cHBvcnRlZCBieSB0YXNrcyBydW4gb24gRkFSR0FURWxvbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9ja2VyVm9sdW1lQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIEEgbWFwIG9mIERvY2tlciBkcml2ZXItc3BlY2lmaWMgb3B0aW9ucyBwYXNzZWQgdGhyb3VnaC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERyaXZlck9wdHNgYCBpbiB0aGUgZG9ja2VyIGNyZWF0ZS12b2x1bWUgY29tbWFuZCBhbmQgdGhlIGBgeHhvcHRgYCBvcHRpb24gdG8gZG9ja2VyIHZvbHVtZSBjcmVhdGUuXG4gKi9cbkRyaXZlck9wdHM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHNjb3BlIGZvciB0aGUgRG9ja2VyIHZvbHVtZSB0aGF0IGRldGVybWluZXMgaXRzIGxpZmVjeWNsZS4gRG9ja2VyIHZvbHVtZXMgdGhhdCBhcmUgc2NvcGVkIHRvIGEgYGB0YXNrYGAgYXJlIGF1dG9tYXRpY2FsbHkgcHJvdmlzaW9uZWQgd2hlbiB0aGUgdGFzayBzdGFydHMgYW5kIGRlc3Ryb3llZCB3aGVuIHRoZSB0YXNrIHN0b3BzLiBEb2NrZXIgdm9sdW1lcyB0aGF0IGFyZSBzY29wZWQgYXMgYGBzaGFyZWRgYCBwZXJzaXN0IGFmdGVyIHRoZSB0YXNrIHN0b3BzLlxuICovXG5TY29wZT86IHN0cmluZ1xuLyoqXG4gKiBJZiB0aGlzIHZhbHVlIGlzIGBgdHJ1ZWBgLCB0aGUgRG9ja2VyIHZvbHVtZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqICAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaWYgdGhlIGBgc2NvcGVgYCBpcyBgYHNoYXJlZGBgLlxuICovXG5BdXRvcHJvdmlzaW9uPzogYm9vbGVhblxuLyoqXG4gKiBUaGUgRG9ja2VyIHZvbHVtZSBkcml2ZXIgdG8gdXNlLiBUaGUgZHJpdmVyIHZhbHVlIG11c3QgbWF0Y2ggdGhlIGRyaXZlciBuYW1lIHByb3ZpZGVkIGJ5IERvY2tlciBiZWNhdXNlIGl0IGlzIHVzZWQgZm9yIHRhc2sgcGxhY2VtZW50LiBJZiB0aGUgZHJpdmVyIHdhcyBpbnN0YWxsZWQgdXNpbmcgdGhlIERvY2tlciBwbHVnaW4gQ0xJLCB1c2UgYGBkb2NrZXIgcGx1Z2luIGxzYGAgdG8gcmV0cmlldmUgdGhlIGRyaXZlciBuYW1lIGZyb20geW91ciBjb250YWluZXIgaW5zdGFuY2UuIElmIHRoZSBkcml2ZXIgd2FzIGluc3RhbGxlZCB1c2luZyBhbm90aGVyIG1ldGhvZCwgdXNlIERvY2tlciBwbHVnaW4gZGlzY292ZXJ5IHRvIHJldHJpZXZlIHRoZSBkcml2ZXIgbmFtZS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERyaXZlcmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGB4eGRyaXZlcmBgIG9wdGlvbiB0byBkb2NrZXIgdm9sdW1lIGNyZWF0ZS5cbiAqL1xuRHJpdmVyPzogc3RyaW5nXG4vKipcbiAqIEN1c3RvbSBtZXRhZGF0YSB0byBhZGQgdG8geW91ciBEb2NrZXIgdm9sdW1lLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTGFiZWxzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYHh4bGFiZWxgYCBvcHRpb24gdG8gZG9ja2VyIHZvbHVtZSBjcmVhdGUuXG4gKi9cbkxhYmVscz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxufVxuLyoqXG4gKiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2hlbiB5b3UgdXNlIEFtYXpvbiBGU3ggZm9yIFdpbmRvd3MgRmlsZSBTZXJ2ZXIgZmlsZSBzeXN0ZW0gZm9yIHRhc2sgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGU3hXaW5kb3dzRmlsZVNlcnZlclZvbHVtZUNvbmZpZ3VyYXRpb24ge1xuQXV0aG9yaXphdGlvbkNvbmZpZz86IEZTeEF1dGhvcml6YXRpb25Db25maWdcbi8qKlxuICogVGhlIEFtYXpvbiBGU3ggZm9yIFdpbmRvd3MgRmlsZSBTZXJ2ZXIgZmlsZSBzeXN0ZW0gSUQgdG8gdXNlLlxuICovXG5GaWxlU3lzdGVtSWQ6IHN0cmluZ1xuLyoqXG4gKiBUaGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbSB0byBtb3VudCBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgaW5zaWRlIHRoZSBob3N0LlxuICovXG5Sb290RGlyZWN0b3J5OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgQW1hem9uIEZTeCBmb3IgV2luZG93cyBGaWxlIFNlcnZlciBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGU3hBdXRob3JpemF0aW9uQ29uZmlnIHtcbi8qKlxuICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbCBvcHRpb24gdG8gdXNlLiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFsIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHVzaW5nIGVpdGhlciB0aGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgYW4gQVNNbG9uZyBzZWNyZXQgb3IgU1NNIFBhcmFtZXRlciBTdG9yZSBwYXJhbWV0ZXIuIFRoZSBBUk4gcmVmZXJzIHRvIHRoZSBzdG9yZWQgY3JlZGVudGlhbHMuXG4gKi9cbkNyZWRlbnRpYWxzUGFyYW1ldGVyOiBzdHJpbmdcbi8qKlxuICogQSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgaG9zdGVkIGJ5IGFuIFtdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kaXJlY3RvcnlzZXJ2aWNlL2xhdGVzdC9hZG1pbi1ndWlkZS9kaXJlY3RvcnlfbWljcm9zb2Z0X2FkLmh0bWwpIE1hbmFnZWQgTWljcm9zb2Z0IEFEIChBY3RpdmUgRGlyZWN0b3J5KSBvciBzZWxmLWhvc3RlZCBBRCBvbiBBbWF6b24gRUMyLlxuICovXG5Eb21haW46IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGBDb250YWluZXJEZWZpbml0aW9uYGAgcHJvcGVydHkgc3BlY2lmaWVzIGEgY29udGFpbmVyIGRlZmluaXRpb24uIENvbnRhaW5lciBkZWZpbml0aW9ucyBhcmUgdXNlZCBpbiB0YXNrIGRlZmluaXRpb25zIHRvIGRlc2NyaWJlIHRoZSBkaWZmZXJlbnQgY29udGFpbmVycyB0aGF0IGFyZSBsYXVuY2hlZCBhcyBwYXJ0IG9mIGEgdGFzay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJEZWZpbml0aW9uIHtcbi8qKlxuICogVGhlIHVzZXIgdG8gdXNlIGluc2lkZSB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVXNlcmBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXVzZXJgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgV2hlbiBydW5uaW5nIHRhc2tzIHVzaW5nIHRoZSBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIGRvbid0IHJ1biBjb250YWluZXJzIHVzaW5nIHRoZSByb290IHVzZXIgKFVJRCAwKS4gV2UgcmVjb21tZW5kIHVzaW5nIGEgbm9uLXJvb3QgdXNlciBmb3IgYmV0dGVyIHNlY3VyaXR5LlxuICogICBZb3UgY2FuIHNwZWNpZnkgdGhlIGBgdXNlcmBgIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0cy4gSWYgc3BlY2lmeWluZyBhIFVJRCBvciBHSUQsIHlvdSBtdXN0IHNwZWNpZnkgaXQgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICogICArICAgYGB1c2VyYGAgXG4gKiAgICsgICBgYHVzZXI6Z3JvdXBgYCBcbiAqICAgKyAgIGBgdWlkYGAgXG4gKiAgICsgICBgYHVpZDpnaWRgYCBcbiAqICAgKyAgIGBgdXNlcjpnaWRgYCBcbiAqICAgKyAgIGBgdWlkOmdyb3VwYGAgXG4gKiAgIFxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cblVzZXI/OiBzdHJpbmdcbi8qKlxuICogVGhlIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtTcGVjaWZ5aW5nIFNlbnNpdGl2ZSBEYXRhXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuU2VjcmV0cz86IFNlY3JldFtdXG4vKipcbiAqIFRoZSBhbW91bnQgKGluIE1pQikgb2YgbWVtb3J5IHRvIHByZXNlbnQgdG8gdGhlIGNvbnRhaW5lci4gSWYgeW91ciBjb250YWluZXIgYXR0ZW1wdHMgdG8gZXhjZWVkIHRoZSBtZW1vcnkgc3BlY2lmaWVkIGhlcmUsIHRoZSBjb250YWluZXIgaXMga2lsbGVkLiBUaGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSByZXNlcnZlZCBmb3IgYWxsIGNvbnRhaW5lcnMgd2l0aGluIGEgdGFzayBtdXN0IGJlIGxvd2VyIHRoYW4gdGhlIHRhc2sgYGBtZW1vcnlgYCB2YWx1ZSwgaWYgb25lIGlzIHNwZWNpZmllZC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE1lbW9yeWBgIGluIHRoZSBbQ3JlYXRlIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8jb3BlcmF0aW9uL0NvbnRhaW5lckNyZWF0ZSkgc2VjdGlvbiBvZiB0aGUgW0RvY2tlciBSZW1vdGUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8pIGFuZCB0aGUgYGAtLW1lbW9yeWBgIG9wdGlvbiB0byBbZG9ja2VyIHJ1bl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvcnVuLyNzZWN1cml0eS1jb25maWd1cmF0aW9uKS5cbiAqICBJZiB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgdGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuXG4gKiAgSWYgdXNpbmcgdGhlIEVDMiBsYXVuY2ggdHlwZSwgeW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBvciBhIGNvbnRhaW5lci1sZXZlbCBtZW1vcnkgdmFsdWUuIElmIHlvdSBzcGVjaWZ5IGJvdGggYSBjb250YWluZXItbGV2ZWwgYGBtZW1vcnlgYCBhbmQgYGBtZW1vcnlSZXNlcnZhdGlvbmBgIHZhbHVlLCBgYG1lbW9yeWBgIG11c3QgYmUgZ3JlYXRlciB0aGFuIGBgbWVtb3J5UmVzZXJ2YXRpb25gYC4gSWYgeW91IHNwZWNpZnkgYGBtZW1vcnlSZXNlcnZhdGlvbmBgLCB0aGVuIHRoYXQgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBhdmFpbGFibGUgbWVtb3J5IHJlc291cmNlcyBmb3IgdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIHBsYWNlZC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgYGBtZW1vcnlgYCBpcyB1c2VkLlxuICogIFRoZSBEb2NrZXIgMjAuMTAuMCBvciBsYXRlciBkYWVtb24gcmVzZXJ2ZXMgYSBtaW5pbXVtIG9mIDYgTWlCIG9mIG1lbW9yeSBmb3IgYSBjb250YWluZXIsIHNvIHlvdSBzaG91bGQgbm90IHNwZWNpZnkgZmV3ZXIgdGhhbiA2IE1pQiBvZiBtZW1vcnkgZm9yIHlvdXIgY29udGFpbmVycy5cbiAqICBUaGUgRG9ja2VyIDE5LjAzLjEzLWNlIG9yIGVhcmxpZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA0IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLCBzbyB5b3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IGZld2VyIHRoYW4gNCBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuXG4gKi9cbk1lbW9yeT86IG51bWJlclxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZSBjb250YWluZXIgaXMgZ2l2ZW4gZWxldmF0ZWQgcHJpdmlsZWdlcyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgKHNpbWlsYXIgdG8gdGhlIGBgcm9vdGBgIHVzZXIpLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgUHJpdmlsZWdlZGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXByaXZpbGVnZWRgYCBvcHRpb24gdG8gZG9ja2VyIHJ1blxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb3IgdGFza3MgcnVuIG9uIEZBUkdBVEVsb25nLlxuICovXG5Qcml2aWxlZ2VkPzogYm9vbGVhblxuSGVhbHRoQ2hlY2s/OiBIZWFsdGhDaGVja1xuLyoqXG4gKiBUaW1lIGR1cmF0aW9uIChpbiBzZWNvbmRzKSB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgb24gcmVzb2x2aW5nIGRlcGVuZGVuY2llcyBmb3IgYSBjb250YWluZXIuIEZvciBleGFtcGxlLCB5b3Ugc3BlY2lmeSB0d28gY29udGFpbmVycyBpbiBhIHRhc2sgZGVmaW5pdGlvbiB3aXRoIGNvbnRhaW5lckEgaGF2aW5nIGEgZGVwZW5kZW5jeSBvbiBjb250YWluZXJCIHJlYWNoaW5nIGEgYGBDT01QTEVURWBgLCBgYFNVQ0NFU1NgYCwgb3IgYGBIRUFMVEhZYGAgc3RhdHVzLiBJZiBhIGBgc3RhcnRUaW1lb3V0YGAgdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBjb250YWluZXJCIGFuZCBpdCBkb2Vzbid0IHJlYWNoIHRoZSBkZXNpcmVkIHN0YXR1cyB3aXRoaW4gdGhhdCB0aW1lIHRoZW4gY29udGFpbmVyQSBnaXZlcyB1cCBhbmQgbm90IHN0YXJ0LiBUaGlzIHJlc3VsdHMgaW4gdGhlIHRhc2sgdHJhbnNpdGlvbmluZyB0byBhIGBgU1RPUFBFRGBgIHN0YXRlLlxuICogICBXaGVuIHRoZSBgYEVDU19DT05UQUlORVJfU1RBUlRfVElNRU9VVGBgIGNvbnRhaW5lciBhZ2VudCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzIHVzZWQsIGl0J3MgZW5mb3JjZWQgaW5kZXBlbmRlbnRseSBmcm9tIHRoaXMgc3RhcnQgdGltZW91dCB2YWx1ZS5cbiAqICAgRm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgdGFzayBvciBzZXJ2aWNlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOlxuICogICArICBMaW51eCBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4zLjBgYCBvciBsYXRlci5cbiAqICAgKyAgV2luZG93cyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4wLjBgYCBvciBsYXRlci5cbiAqICAgXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBFQzIgbGF1bmNoIHR5cGUsIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gYGAxLjI2LjBgYCBvZiB0aGUgY29udGFpbmVyIGFnZW50IHRvIHVzZSBhIGNvbnRhaW5lciBzdGFydCB0aW1lb3V0IHZhbHVlLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSdyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiBgYDEuMjYuMC0xYGAgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSB2YWxpZCB2YWx1ZXMgZm9yIEZhcmdhdGUgYXJlIDItMTIwIHNlY29uZHMuXG4gKi9cblN0YXJ0VGltZW91dD86IG51bWJlclxuLyoqXG4gKiBEYXRhIHZvbHVtZXMgdG8gbW91bnQgZnJvbSBhbm90aGVyIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFZvbHVtZXNGcm9tYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tdm9sdW1lcy1mcm9tYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cblZvbHVtZXNGcm9tPzogVm9sdW1lRnJvbVtdXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgYGBjcHVgYCB1bml0cyByZXNlcnZlZCBmb3IgdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYENwdVNoYXJlc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLWNwdS1zaGFyZXNgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSwgYW5kIHRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIHRvdGFsIGFtb3VudCBvZiBDUFUgcmVzZXJ2ZWQgZm9yIGFsbCBjb250YWluZXJzIHdpdGhpbiBhIHRhc2sgYmUgbG93ZXIgdGhhbiB0aGUgdGFzay1sZXZlbCBgYGNwdWBgIHZhbHVlLlxuICogICBZb3UgY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIENQVSB1bml0cyB0aGF0IGFyZSBhdmFpbGFibGUgcGVyIEVDMiBpbnN0YW5jZSB0eXBlIGJ5IG11bHRpcGx5aW5nIHRoZSB2Q1BVcyBsaXN0ZWQgZm9yIHRoYXQgaW5zdGFuY2UgdHlwZSBvbiB0aGUgW0FtYXpvbiBFQzIgSW5zdGFuY2VzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWMyL2luc3RhbmNlLXR5cGVzLykgZGV0YWlsIHBhZ2UgYnkgMSwwMjQuXG4gKiAgIExpbnV4IGNvbnRhaW5lcnMgc2hhcmUgdW5hbGxvY2F0ZWQgQ1BVIHVuaXRzIHdpdGggb3RoZXIgY29udGFpbmVycyBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgcmF0aW8gYXMgdGhlaXIgYWxsb2NhdGVkIGFtb3VudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBydW4gYSBzaW5nbGUtY29udGFpbmVyIHRhc2sgb24gYSBzaW5nbGUtY29yZSBpbnN0YW5jZSB0eXBlIHdpdGggNTEyIENQVSB1bml0cyBzcGVjaWZpZWQgZm9yIHRoYXQgY29udGFpbmVyLCBhbmQgdGhhdCdzIHRoZSBvbmx5IHRhc2sgcnVubmluZyBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlLCB0aGF0IGNvbnRhaW5lciBjb3VsZCB1c2UgdGhlIGZ1bGwgMSwwMjQgQ1BVIHVuaXQgc2hhcmUgYXQgYW55IGdpdmVuIHRpbWUuIEhvd2V2ZXIsIGlmIHlvdSBsYXVuY2hlZCBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgdGFzayBvbiB0aGF0IGNvbnRhaW5lciBpbnN0YW5jZSwgZWFjaCB0YXNrIGlzIGd1YXJhbnRlZWQgYSBtaW5pbXVtIG9mIDUxMiBDUFUgdW5pdHMgd2hlbiBuZWVkZWQuIE1vcmVvdmVyLCBlYWNoIGNvbnRhaW5lciBjb3VsZCBmbG9hdCB0byBoaWdoZXIgQ1BVIHVzYWdlIGlmIHRoZSBvdGhlciBjb250YWluZXIgd2FzIG5vdCB1c2luZyBpdC4gSWYgYm90aCB0YXNrcyB3ZXJlIDEwMCUgYWN0aXZlIGFsbCBvZiB0aGUgdGltZSwgdGhleSB3b3VsZCBiZSBsaW1pdGVkIHRvIDUxMiBDUFUgdW5pdHMuXG4gKiAgT24gTGludXggY29udGFpbmVyIGluc3RhbmNlcywgdGhlIERvY2tlciBkYWVtb24gb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB1c2VzIHRoZSBDUFUgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBDUFUgc2hhcmUgcmF0aW9zIGZvciBydW5uaW5nIGNvbnRhaW5lcnMuIFRoZSBtaW5pbXVtIHZhbGlkIENQVSBzaGFyZSB2YWx1ZSB0aGF0IHRoZSBMaW51eCBrZXJuZWwgYWxsb3dzIGlzIDIsIGFuZCB0aGUgbWF4aW11bSB2YWxpZCBDUFUgc2hhcmUgdmFsdWUgdGhhdCB0aGUgTGludXgga2VybmVsIGFsbG93cyBpcyAyNjIxNDQuIEhvd2V2ZXIsIHRoZSBDUFUgcGFyYW1ldGVyIGlzbid0IHJlcXVpcmVkLCBhbmQgeW91IGNhbiB1c2UgQ1BVIHZhbHVlcyBiZWxvdyAyIG9yIGFib3ZlIDI2MjE0NCBpbiB5b3VyIGNvbnRhaW5lciBkZWZpbml0aW9ucy4gRm9yIENQVSB2YWx1ZXMgYmVsb3cgMiAoaW5jbHVkaW5nIG51bGwpIG9yIGFib3ZlIDI2MjE0NCwgdGhlIGJlaGF2aW9yIHZhcmllcyBiYXNlZCBvbiB5b3VyIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHZlcnNpb246XG4gKiAgICsgICpBZ2VudCB2ZXJzaW9ucyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMS4xLjA6KiBOdWxsIGFuZCB6ZXJvIENQVSB2YWx1ZXMgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMCwgd2hpY2ggRG9ja2VyIHRoZW4gY29udmVydHMgdG8gMSwwMjQgQ1BVIHNoYXJlcy4gQ1BVIHZhbHVlcyBvZiAxIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDEsIHdoaWNoIHRoZSBMaW51eCBrZXJuZWwgY29udmVydHMgdG8gdHdvIENQVSBzaGFyZXMuXG4gKiAgICsgICpBZ2VudCB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4yLjA6KiBOdWxsLCB6ZXJvLCBhbmQgQ1BVIHZhbHVlcyBvZiAxIGFyZSBwYXNzZWQgdG8gRG9ja2VyIGFzIDIuXG4gKiAgICsgICpBZ2VudCB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS44NC4wOiogQ1BVIHZhbHVlcyBncmVhdGVyIHRoYW4gMjU2IHZDUFUgYXJlIHBhc3NlZCB0byBEb2NrZXIgYXMgMjU2LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIDI2MjE0NCBDUFUgc2hhcmVzLlxuICogICBcbiAqICBPbiBXaW5kb3dzIGNvbnRhaW5lciBpbnN0YW5jZXMsIHRoZSBDUFUgbGltaXQgaXMgZW5mb3JjZWQgYXMgYW4gYWJzb2x1dGUgbGltaXQsIG9yIGEgcXVvdGEuIFdpbmRvd3MgY29udGFpbmVycyBvbmx5IGhhdmUgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIENQVSB0aGF0J3MgZGVzY3JpYmVkIGluIHRoZSB0YXNrIGRlZmluaXRpb24uIEEgbnVsbCBvciB6ZXJvIENQVSB2YWx1ZSBpcyBwYXNzZWQgdG8gRG9ja2VyIGFzIGBgMGBgLCB3aGljaCBXaW5kb3dzIGludGVycHJldHMgYXMgMSUgb2Ygb25lIENQVS5cbiAqL1xuQ3B1PzogbnVtYmVyXG4vKipcbiAqIEVhcmx5IHZlcnNpb25zIG9mIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBkb24ndCBwcm9wZXJseSBoYW5kbGUgYGBlbnRyeVBvaW50YGAgcGFyYW1ldGVycy4gSWYgeW91IGhhdmUgcHJvYmxlbXMgdXNpbmcgYGBlbnRyeVBvaW50YGAsIHVwZGF0ZSB5b3VyIGNvbnRhaW5lciBhZ2VudCBvciBlbnRlciB5b3VyIGNvbW1hbmRzIGFuZCBhcmd1bWVudHMgYXMgYGBjb21tYW5kYGAgYXJyYXkgaXRlbXMgaW5zdGVhZC5cbiAqICAgVGhlIGVudHJ5IHBvaW50IHRoYXQncyBwYXNzZWQgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEVudHJ5cG9pbnRgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1lbnRyeXBvaW50YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKi9cbkVudHJ5UG9pbnQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgRE5TIHNlcnZlcnMgdGhhdCBhcmUgcHJlc2VudGVkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBEbnNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1kbnNgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5EbnNTZXJ2ZXJzPzogc3RyaW5nW11cbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgY29udGFpbmVyIGlzIGdpdmVuIHJlYWQtb25seSBhY2Nlc3MgdG8gaXRzIHJvb3QgZmlsZSBzeXN0ZW0uIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBSZWFkb25seVJvb3Rmc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXJlYWQtb25seWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cblJlYWRvbmx5Um9vdEZpbGVzeXN0ZW0/OiBib29sZWFuXG4vKipcbiAqIFRoZSBpbWFnZSB1c2VkIHRvIHN0YXJ0IGEgY29udGFpbmVyLiBUaGlzIHN0cmluZyBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIERvY2tlciBkYWVtb24uIEJ5IGRlZmF1bHQsIGltYWdlcyBpbiB0aGUgRG9ja2VyIEh1YiByZWdpc3RyeSBhcmUgYXZhaWxhYmxlLiBPdGhlciByZXBvc2l0b3JpZXMgYXJlIHNwZWNpZmllZCB3aXRoIGVpdGhlciBgYHJlcG9zaXRvcnktdXJsL2ltYWdlOnRhZ2BgIG9yIGBgcmVwb3NpdG9yeS11cmwvaW1hZ2VAZGlnZXN0YGAuIEZvciBpbWFnZXMgdXNpbmcgdGFncyAocmVwb3NpdG9yeS11cmwvaW1hZ2U6dGFnKSwgdXAgdG8gMjU1IGNoYXJhY3RlcnMgdG90YWwgYXJlIGFsbG93ZWQsIGluY2x1ZGluZyBsZXR0ZXJzICh1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSksIG51bWJlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBjb2xvbnMsIHBlcmlvZHMsIGZvcndhcmQgc2xhc2hlcywgYW5kIG51bWJlciBzaWducyAoIykuIEZvciBpbWFnZXMgdXNpbmcgZGlnZXN0cyAocmVwb3NpdG9yeS11cmwvaW1hZ2VAZGlnZXN0KSwgdGhlIDI1NSBjaGFyYWN0ZXIgbGltaXQgYXBwbGllcyBvbmx5IHRvIHRoZSByZXBvc2l0b3J5IFVSTCBhbmQgaW1hZ2UgbmFtZSAoZXZlcnl0aGluZyBiZWZvcmUgdGhlIEAgc2lnbikuIFRoZSBvbmx5IHN1cHBvcnRlZCBoYXNoIGZ1bmN0aW9uIGlzIHNoYTI1NiwgYW5kIHRoZSBoYXNoIHZhbHVlIGFmdGVyIHNoYTI1NjogbXVzdCBiZSBleGFjdGx5IDY0IGNoYXJhY3RlcnMgKG9ubHkgbGV0dGVycyBBLUYsIGEtZiwgYW5kIG51bWJlcnMgMC05IGFyZSBhbGxvd2VkKS4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEltYWdlYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYElNQUdFYGAgcGFyYW1ldGVyIG9mIGRvY2tlciBydW4uXG4gKiAgICsgIFdoZW4gYSBuZXcgdGFzayBzdGFydHMsIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwdWxscyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQgdGFnIGZvciB0aGUgY29udGFpbmVyIHRvIHVzZS4gSG93ZXZlciwgc3Vic2VxdWVudCB1cGRhdGVzIHRvIGEgcmVwb3NpdG9yeSBpbWFnZSBhcmVuJ3QgcHJvcGFnYXRlZCB0byBhbHJlYWR5IHJ1bm5pbmcgdGFza3MuXG4gKiAgICsgIEltYWdlcyBpbiBBbWF6b24gRUNSIHJlcG9zaXRvcmllcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciB1c2luZyB0aGUgZnVsbCBgYHJlZ2lzdHJ5L3JlcG9zaXRvcnk6dGFnYGAgb3IgYGByZWdpc3RyeS9yZXBvc2l0b3J5QGRpZ2VzdGBgLiBGb3IgZXhhbXBsZSwgYGAwMTIzNDU2Nzg5MTAuZGtyLmVjci48cmVnaW9uLW5hbWU+LmFtYXpvbmF3cy5jb20vPHJlcG9zaXRvcnktbmFtZT46bGF0ZXN0YGAgb3IgYGAwMTIzNDU2Nzg5MTAuZGtyLmVjci48cmVnaW9uLW5hbWU+LmFtYXpvbmF3cy5jb20vPHJlcG9zaXRvcnktbmFtZT5Ac2hhMjU2Ojk0YWZkMWYyZTY0ZDkwOGJjOTBkYmNhMDAzNWE1YjU2N0VYQU1QTEVgYC4gXG4gKiAgICsgIEltYWdlcyBpbiBvZmZpY2lhbCByZXBvc2l0b3JpZXMgb24gRG9ja2VyIEh1YiB1c2UgYSBzaW5nbGUgbmFtZSAoZm9yIGV4YW1wbGUsIGBgdWJ1bnR1YGAgb3IgYGBtb25nb2BgKS5cbiAqICAgKyAgSW1hZ2VzIGluIG90aGVyIHJlcG9zaXRvcmllcyBvbiBEb2NrZXIgSHViIGFyZSBxdWFsaWZpZWQgd2l0aCBhbiBvcmdhbml6YXRpb24gbmFtZSAoZm9yIGV4YW1wbGUsIGBgYW1hem9uL2FtYXpvbi1lY3MtYWdlbnRgYCkuXG4gKiAgICsgIEltYWdlcyBpbiBvdGhlciBvbmxpbmUgcmVwb3NpdG9yaWVzIGFyZSBxdWFsaWZpZWQgZnVydGhlciBieSBhIGRvbWFpbiBuYW1lIChmb3IgZXhhbXBsZSwgYGBxdWF5LmlvL2Fzc2VtYmx5bGluZS91YnVudHVgYCkuXG4gKi9cbkltYWdlOiBzdHJpbmdcbi8qKlxuICogSWYgdGhlIGBgZXNzZW50aWFsYGAgcGFyYW1ldGVyIG9mIGEgY29udGFpbmVyIGlzIG1hcmtlZCBhcyBgYHRydWVgYCwgYW5kIHRoYXQgY29udGFpbmVyIGZhaWxzIG9yIHN0b3BzIGZvciBhbnkgcmVhc29uLCBhbGwgb3RoZXIgY29udGFpbmVycyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB0YXNrIGFyZSBzdG9wcGVkLiBJZiB0aGUgYGBlc3NlbnRpYWxgYCBwYXJhbWV0ZXIgb2YgYSBjb250YWluZXIgaXMgbWFya2VkIGFzIGBgZmFsc2VgYCwgaXRzIGZhaWx1cmUgZG9lc24ndCBhZmZlY3QgdGhlIHJlc3Qgb2YgdGhlIGNvbnRhaW5lcnMgaW4gYSB0YXNrLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhIGNvbnRhaW5lciBpcyBhc3N1bWVkIHRvIGJlIGVzc2VudGlhbC5cbiAqICBBbGwgdGFza3MgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlc3NlbnRpYWwgY29udGFpbmVyLiBJZiB5b3UgaGF2ZSBhbiBhcHBsaWNhdGlvbiB0aGF0J3MgY29tcG9zZWQgb2YgbXVsdGlwbGUgY29udGFpbmVycywgZ3JvdXAgY29udGFpbmVycyB0aGF0IGFyZSB1c2VkIGZvciBhIGNvbW1vbiBwdXJwb3NlIGludG8gY29tcG9uZW50cywgYW5kIHNlcGFyYXRlIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBpbnRvIG11bHRpcGxlIHRhc2sgZGVmaW5pdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FwcGxpY2F0aW9uIEFyY2hpdGVjdHVyZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBwbGljYXRpb25fYXJjaGl0ZWN0dXJlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuRXNzZW50aWFsPzogYm9vbGVhblxuTG9nQ29uZmlndXJhdGlvbj86IExvZ0NvbmZpZ3VyYXRpb25cbi8qKlxuICogVGhlIHR5cGUgYW5kIGFtb3VudCBvZiBhIHJlc291cmNlIHRvIGFzc2lnbiB0byBhIGNvbnRhaW5lci4gVGhlIG9ubHkgc3VwcG9ydGVkIHJlc291cmNlIGlzIGEgR1BVLlxuICovXG5SZXNvdXJjZVJlcXVpcmVtZW50cz86IFJlc291cmNlUmVxdWlyZW1lbnRbXVxuLyoqXG4gKiBBIGxpc3Qgb2YgZmlsZXMgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gYSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1lbnYtZmlsZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFlvdSBjYW4gc3BlY2lmeSB1cCB0byB0ZW4gZW52aXJvbm1lbnQgZmlsZXMuIFRoZSBmaWxlIG11c3QgaGF2ZSBhIGBgLmVudmBgIGZpbGUgZXh0ZW5zaW9uLiBFYWNoIGxpbmUgaW4gYW4gZW52aXJvbm1lbnQgZmlsZSBjb250YWlucyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBgYFZBUklBQkxFPVZBTFVFYGAgZm9ybWF0LiBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgYCNgYCBhcmUgdHJlYXRlZCBhcyBjb21tZW50cyBhbmQgYXJlIGlnbm9yZWQuXG4gKiAgSWYgdGhlcmUgYXJlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGBgZW52aXJvbm1lbnRgYCBwYXJhbWV0ZXIgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbiwgdGhleSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgdmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gYW4gZW52aXJvbm1lbnQgZmlsZS4gSWYgbXVsdGlwbGUgZW52aXJvbm1lbnQgZmlsZXMgYXJlIHNwZWNpZmllZCB0aGF0IGNvbnRhaW4gdGhlIHNhbWUgdmFyaWFibGUsIHRoZXkncmUgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcCBkb3duLiBXZSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBFbnZpcm9ubWVudCBWYXJpYWJsZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Rhc2tkZWYtZW52ZmlsZXMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5FbnZpcm9ubWVudEZpbGVzPzogRW52aXJvbm1lbnRGaWxlW11cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBjb250YWluZXIuIElmIHlvdSdyZSBsaW5raW5nIG11bHRpcGxlIGNvbnRhaW5lcnMgdG9nZXRoZXIgaW4gYSB0YXNrIGRlZmluaXRpb24sIHRoZSBgYG5hbWVgYCBvZiBvbmUgY29udGFpbmVyIGNhbiBiZSBlbnRlcmVkIGluIHRoZSBgYGxpbmtzYGAgb2YgYW5vdGhlciBjb250YWluZXIgdG8gY29ubmVjdCB0aGUgY29udGFpbmVycy4gVXAgdG8gMjU1IGxldHRlcnMgKHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlKSwgbnVtYmVycywgdW5kZXJzY29yZXMsIGFuZCBoeXBoZW5zIGFyZSBhbGxvd2VkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgbmFtZWBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLW5hbWVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuTmFtZTogc3RyaW5nXG5GaXJlbGVuc0NvbmZpZ3VyYXRpb24/OiBGaXJlbGVuc0NvbmZpZ3VyYXRpb25cbi8qKlxuICogQSBsaXN0IG9mIHN0cmluZ3MgdG8gcHJvdmlkZSBjdXN0b20gY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgc2VjdXJpdHkgc3lzdGVtcy4gVGhpcyBmaWVsZCBpc24ndCB2YWxpZCBmb3IgY29udGFpbmVycyBpbiB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZS5cbiAqICBGb3IgTGludXggdGFza3Mgb24gRUMyLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgY3VzdG9tIGxhYmVscyBmb3IgU0VMaW51eCBhbmQgQXBwQXJtb3IgbXVsdGktbGV2ZWwgc2VjdXJpdHkgc3lzdGVtcy5cbiAqICBGb3IgYW55IHRhc2tzIG9uIEVDMiwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGEgY3JlZGVudGlhbCBzcGVjIGZpbGUgdGhhdCBjb25maWd1cmVzIGEgY29udGFpbmVyIGZvciBBY3RpdmUgRGlyZWN0b3J5IGF1dGhlbnRpY2F0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtVc2luZyBnTVNBcyBmb3IgV2luZG93cyBDb250YWluZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS93aW5kb3dzLWdtc2EuaHRtbCkgYW5kIFtVc2luZyBnTVNBcyBmb3IgTGludXggQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbGludXgtZ21zYS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFNlY3VyaXR5T3B0YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tc2VjdXJpdHktb3B0YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBydW5uaW5nIG9uIGEgY29udGFpbmVyIGluc3RhbmNlIG11c3QgcmVnaXN0ZXIgd2l0aCB0aGUgYGBFQ1NfU0VMSU5VWF9DQVBBQkxFPXRydWVgYCBvciBgYEVDU19BUFBBUk1PUl9DQVBBQkxFPXRydWVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIGNvbnRhaW5lcnMgcGxhY2VkIG9uIHRoYXQgaW5zdGFuY2UgY2FuIHVzZSB0aGVzZSBzZWN1cml0eSBvcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudCBDb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtY29uZmlnLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgVmFsaWQgdmFsdWVzOiBcIm5vLW5ldy1wcml2aWxlZ2VzXCIgfCBcImFwcGFybW9yOlBST0ZJTEVcIiB8IFwibGFiZWw6dmFsdWVcIiB8IFwiY3JlZGVudGlhbHNwZWM6Q3JlZGVudGlhbFNwZWNGaWxlUGF0aFwiXG4gKi9cbkRvY2tlclNlY3VyaXR5T3B0aW9ucz86IHN0cmluZ1tdXG4vKipcbiAqIEEgbGlzdCBvZiBuYW1lc3BhY2VkIGtlcm5lbCBwYXJhbWV0ZXJzIHRvIHNldCBpbiB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgU3lzY3Rsc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXN5c2N0bGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjb25maWd1cmUgYGBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX3RpbWVgYCBzZXR0aW5nIHRvIG1haW50YWluIGxvbmdlciBsaXZlZCBjb25uZWN0aW9ucy5cbiAqL1xuU3lzdGVtQ29udHJvbHM/OiBTeXN0ZW1Db250cm9sW11cbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBgYHRydWVgYCwgeW91IGNhbiBkZXBsb3kgY29udGFpbmVyaXplZCBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIGBgc3RkaW5gYCBvciBhIGBgdHR5YGAgdG8gYmUgYWxsb2NhdGVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgT3BlblN0ZGluYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0taW50ZXJhY3RpdmVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuSW50ZXJhY3RpdmU/OiBib29sZWFuXG4vKipcbiAqIEEgbGlzdCBvZiBETlMgc2VhcmNoIGRvbWFpbnMgdGhhdCBhcmUgcHJlc2VudGVkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBEbnNTZWFyY2hgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1kbnMtc2VhcmNoYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqL1xuRG5zU2VhcmNoRG9tYWlucz86IHN0cmluZ1tdXG4vKipcbiAqIEEgbGlzdCBvZiBBUk5zIGluIFNTTSBvciBBbWF6b24gUzMgdG8gYSBjcmVkZW50aWFsIHNwZWMgKGBgQ3JlZFNwZWNgYCkgZmlsZSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGNvbnRhaW5lciBmb3IgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbi4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB0aGlzIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgYGRvY2tlclNlY3VyaXR5T3B0aW9uc2BgLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQVJOcyBpcyAxLlxuICogIFRoZXJlIGFyZSB0d28gZm9ybWF0cyBmb3IgZWFjaCBBUk4uXG4gKiAgICsgY3JlZGVudGlhbHNwZWNkb21haW5sZXNzOk15QVJOIFlvdSB1c2UgY3JlZGVudGlhbHNwZWNkb21haW5sZXNzOk15QVJOIHRvIHByb3ZpZGUgYSBDcmVkU3BlYyB3aXRoIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBmb3IgYSBzZWNyZXQgaW4gLiBZb3UgcHJvdmlkZSB0aGUgbG9naW4gY3JlZGVudGlhbHMgdG8gdGhlIGRvbWFpbiBpbiB0aGUgc2VjcmV0LiBFYWNoIHRhc2sgdGhhdCBydW5zIG9uIGFueSBjb250YWluZXIgaW5zdGFuY2UgY2FuIGpvaW4gZGlmZmVyZW50IGRvbWFpbnMuIFlvdSBjYW4gdXNlIHRoaXMgZm9ybWF0IHdpdGhvdXQgam9pbmluZyB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRvIGEgZG9tYWluLiArIGNyZWRlbnRpYWxzcGVjOk15QVJOIFlvdSB1c2UgY3JlZGVudGlhbHNwZWM6TXlBUk4gdG8gcHJvdmlkZSBhIENyZWRTcGVjIGZvciBhIHNpbmdsZSBkb21haW4uIFlvdSBtdXN0IGpvaW4gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB0byB0aGUgZG9tYWluIGJlZm9yZSB5b3Ugc3RhcnQgYW55IHRhc2tzIHRoYXQgdXNlIHRoaXMgdGFzayBkZWZpbml0aW9uLiBcbiAqICBJbiBib3RoIGZvcm1hdHMsIHJlcGxhY2UgYGBNeUFSTmBgIHdpdGggdGhlIEFSTiBpbiBTU00gb3IgQW1hem9uIFMzLlxuICogIElmIHlvdSBwcm92aWRlIGEgYGBjcmVkZW50aWFsc3BlY2RvbWFpbmxlc3M6TXlBUk5gYCwgdGhlIGBgY3JlZHNwZWNgYCBtdXN0IHByb3ZpZGUgYSBBUk4gaW4gQVNNbG9uZyBmb3IgYSBzZWNyZXQgY29udGFpbmluZyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkLCBhbmQgdGhlIGRvbWFpbiB0byBjb25uZWN0IHRvLiBGb3IgYmV0dGVyIHNlY3VyaXR5LCB0aGUgaW5zdGFuY2UgaXNuJ3Qgam9pbmVkIHRvIHRoZSBkb21haW4gZm9yIGRvbWFpbmxlc3MgYXV0aGVudGljYXRpb24uIE90aGVyIGFwcGxpY2F0aW9ucyBvbiB0aGUgaW5zdGFuY2UgY2FuJ3QgdXNlIHRoZSBkb21haW5sZXNzIGNyZWRlbnRpYWxzLiBZb3UgY2FuIHVzZSB0aGlzIHBhcmFtZXRlciB0byBydW4gdGFza3Mgb24gdGhlIHNhbWUgaW5zdGFuY2UsIGV2ZW4gaXQgdGhlIHRhc2tzIG5lZWQgdG8gam9pbiBkaWZmZXJlbnQgZG9tYWlucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVXNpbmcgZ01TQXMgZm9yIFdpbmRvd3MgQ29udGFpbmVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2luZG93cy1nbXNhLmh0bWwpIGFuZCBbVXNpbmcgZ01TQXMgZm9yIExpbnV4IENvbnRhaW5lcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2xpbnV4LWdtc2EuaHRtbCkuXG4gKi9cbkNyZWRlbnRpYWxTcGVjcz86IHN0cmluZ1tdXG4vKipcbiAqIEEgbGlzdCBvZiBgYHVsaW1pdHNgYCB0byBzZXQgaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFVsaW1pdHNgYCBpbiB0aGUgW0NyZWF0ZSBhIGNvbnRhaW5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvI29wZXJhdGlvbi9Db250YWluZXJDcmVhdGUpIHNlY3Rpb24gb2YgdGhlIFtEb2NrZXIgUmVtb3RlIEFQSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9hcGkvdjEuMzUvKSBhbmQgdGhlIGBgLS11bGltaXRgYCBvcHRpb24gdG8gW2RvY2tlciBydW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL3J1bi8pLiBWYWxpZCBuYW1pbmcgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFtVbGltaXRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVWxpbWl0Lmh0bWwpIGRhdGEgdHlwZS4gVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5VbGltaXRzPzogVWxpbWl0W11cbi8qKlxuICogVGltZSBkdXJhdGlvbiAoaW4gc2Vjb25kcykgdG8gd2FpdCBiZWZvcmUgdGhlIGNvbnRhaW5lciBpcyBmb3JjZWZ1bGx5IGtpbGxlZCBpZiBpdCBkb2Vzbid0IGV4aXQgbm9ybWFsbHkgb24gaXRzIG93bi5cbiAqICBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSB0YXNrIG9yIHNlcnZpY2UgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjMuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBtYXggc3RvcCB0aW1lb3V0IHZhbHVlIGlzIDEyMCBzZWNvbmRzIGFuZCBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDMwIHNlY29uZHMgaXMgdXNlZC5cbiAqICBGb3IgdGFza3MgdGhhdCB1c2UgdGhlIEVDMiBsYXVuY2ggdHlwZSwgaWYgdGhlIGBgc3RvcFRpbWVvdXRgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgc2V0IGZvciB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBgYEVDU19DT05UQUlORVJfU1RPUF9USU1FT1VUYGAgaXMgdXNlZC4gSWYgbmVpdGhlciB0aGUgYGBzdG9wVGltZW91dGBgIHBhcmFtZXRlciBvciB0aGUgYGBFQ1NfQ09OVEFJTkVSX1NUT1BfVElNRU9VVGBgIGFnZW50IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgYXJlIHNldCwgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgMzAgc2Vjb25kcyBmb3IgTGludXggY29udGFpbmVycyBhbmQgMzAgc2Vjb25kcyBvbiBXaW5kb3dzIGNvbnRhaW5lcnMgYXJlIHVzZWQuIFlvdXIgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gdXNlIGEgY29udGFpbmVyIHN0b3AgdGltZW91dCB2YWx1ZS4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHVzaW5nIHRoZSBsYXRlc3QgY29udGFpbmVyIGFnZW50IHZlcnNpb24uIEZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGVja2luZyB5b3VyIGFnZW50IHZlcnNpb24gYW5kIHVwZGF0aW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiwgc2VlIFtVcGRhdGluZyB0aGUgQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC11cGRhdGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLiBJZiB5b3UncmUgdXNpbmcgYW4gQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JLCB5b3VyIGluc3RhbmNlIG5lZWRzIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wLTEgb2YgdGhlIGBgZWNzLWluaXRgYCBwYWNrYWdlLiBJZiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZXMgYXJlIGxhdW5jaGVkIGZyb20gdmVyc2lvbiBgYDIwMTkwMzAxYGAgb3IgbGF0ZXIsIHRoZW4gdGhleSBjb250YWluIHRoZSByZXF1aXJlZCB2ZXJzaW9ucyBvZiB0aGUgY29udGFpbmVyIGFnZW50IGFuZCBgYGVjcy1pbml0YGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0FtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLW9wdGltaXplZF9BTUkuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogIFRoZSB2YWxpZCB2YWx1ZXMgZm9yIEZhcmdhdGUgYXJlIDItMTIwIHNlY29uZHMuXG4gKi9cblN0b3BUaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBydW4gY29tbWFuZHMgaW5zaWRlIHRoZSBjb250YWluZXIgaW4uIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBXb3JraW5nRGlyYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0td29ya2RpcmBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICovXG5Xb3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nXG4vKipcbiAqIFRoZSBzb2Z0IGxpbWl0IChpbiBNaUIpIG9mIG1lbW9yeSB0byByZXNlcnZlIGZvciB0aGUgY29udGFpbmVyLiBXaGVuIHN5c3RlbSBtZW1vcnkgaXMgdW5kZXIgaGVhdnkgY29udGVudGlvbiwgRG9ja2VyIGF0dGVtcHRzIHRvIGtlZXAgdGhlIGNvbnRhaW5lciBtZW1vcnkgdG8gdGhpcyBzb2Z0IGxpbWl0LiBIb3dldmVyLCB5b3VyIGNvbnRhaW5lciBjYW4gY29uc3VtZSBtb3JlIG1lbW9yeSB3aGVuIGl0IG5lZWRzIHRvLCB1cCB0byBlaXRoZXIgdGhlIGhhcmQgbGltaXQgc3BlY2lmaWVkIHdpdGggdGhlIGBgbWVtb3J5YGAgcGFyYW1ldGVyIChpZiBhcHBsaWNhYmxlKSwgb3IgYWxsIG9mIHRoZSBhdmFpbGFibGUgbWVtb3J5IG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE1lbW9yeVJlc2VydmF0aW9uYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tbWVtb3J5LXJlc2VydmF0aW9uYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgSWYgYSB0YXNrLWxldmVsIG1lbW9yeSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCB5b3UgbXVzdCBzcGVjaWZ5IGEgbm9uLXplcm8gaW50ZWdlciBmb3Igb25lIG9yIGJvdGggb2YgYGBtZW1vcnlgYCBvciBgYG1lbW9yeVJlc2VydmF0aW9uYGAgaW4gYSBjb250YWluZXIgZGVmaW5pdGlvbi4gSWYgeW91IHNwZWNpZnkgYm90aCwgYGBtZW1vcnlgYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBgYG1lbW9yeVJlc2VydmF0aW9uYGAuIElmIHlvdSBzcGVjaWZ5IGBgbWVtb3J5UmVzZXJ2YXRpb25gYCwgdGhlbiB0aGF0IHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgYXZhaWxhYmxlIG1lbW9yeSByZXNvdXJjZXMgZm9yIHRoZSBjb250YWluZXIgaW5zdGFuY2Ugd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBwbGFjZWQuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBgbWVtb3J5YGAgaXMgdXNlZC5cbiAqICBGb3IgZXhhbXBsZSwgaWYgeW91ciBjb250YWluZXIgbm9ybWFsbHkgdXNlcyAxMjggTWlCIG9mIG1lbW9yeSwgYnV0IG9jY2FzaW9uYWxseSBidXJzdHMgdG8gMjU2IE1pQiBvZiBtZW1vcnkgZm9yIHNob3J0IHBlcmlvZHMgb2YgdGltZSwgeW91IGNhbiBzZXQgYSBgYG1lbW9yeVJlc2VydmF0aW9uYGAgb2YgMTI4IE1pQiwgYW5kIGEgYGBtZW1vcnlgYCBoYXJkIGxpbWl0IG9mIDMwMCBNaUIuIFRoaXMgY29uZmlndXJhdGlvbiB3b3VsZCBhbGxvdyB0aGUgY29udGFpbmVyIHRvIG9ubHkgcmVzZXJ2ZSAxMjggTWlCIG9mIG1lbW9yeSBmcm9tIHRoZSByZW1haW5pbmcgcmVzb3VyY2VzIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UsIGJ1dCBhbHNvIGFsbG93IHRoZSBjb250YWluZXIgdG8gY29uc3VtZSBtb3JlIG1lbW9yeSByZXNvdXJjZXMgd2hlbiBuZWVkZWQuXG4gKiAgVGhlIERvY2tlciAyMC4xMC4wIG9yIGxhdGVyIGRhZW1vbiByZXNlcnZlcyBhIG1pbmltdW0gb2YgNiBNaUIgb2YgbWVtb3J5IGZvciBhIGNvbnRhaW5lci4gU28sIGRvbid0IHNwZWNpZnkgbGVzcyB0aGFuIDYgTWlCIG9mIG1lbW9yeSBmb3IgeW91ciBjb250YWluZXJzLiBcbiAqICBUaGUgRG9ja2VyIDE5LjAzLjEzLWNlIG9yIGVhcmxpZXIgZGFlbW9uIHJlc2VydmVzIGEgbWluaW11bSBvZiA0IE1pQiBvZiBtZW1vcnkgZm9yIGEgY29udGFpbmVyLiBTbywgZG9uJ3Qgc3BlY2lmeSBsZXNzIHRoYW4gNCBNaUIgb2YgbWVtb3J5IGZvciB5b3VyIGNvbnRhaW5lcnMuXG4gKi9cbk1lbW9yeVJlc2VydmF0aW9uPzogbnVtYmVyXG5SZXBvc2l0b3J5Q3JlZGVudGlhbHM/OiBSZXBvc2l0b3J5Q3JlZGVudGlhbHNcbi8qKlxuICogQSBsaXN0IG9mIGhvc3RuYW1lcyBhbmQgSVAgYWRkcmVzcyBtYXBwaW5ncyB0byBhcHBlbmQgdG8gdGhlIGBgL2V0Yy9ob3N0c2BgIGZpbGUgb24gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEV4dHJhSG9zdHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1hZGQtaG9zdGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUaGlzIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycyBvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUuXG4gKi9cbkV4dHJhSG9zdHM/OiBIb3N0RW50cnlbXVxuLyoqXG4gKiBUaGUgaG9zdG5hbWUgdG8gdXNlIGZvciB5b3VyIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYEhvc3RuYW1lYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0taG9zdG5hbWVgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgVGhlIGBgaG9zdG5hbWVgYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBpZiB5b3UncmUgdXNpbmcgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLlxuICovXG5Ib3N0bmFtZT86IHN0cmluZ1xuTGludXhQYXJhbWV0ZXJzPzogTGludXhQYXJhbWV0ZXJzXG4vKipcbiAqIFNwZWNpZmllcyB3aGV0aGVyIEFtYXpvbiBFQ1Mgd2lsbCByZXNvbHZlIHRoZSBjb250YWluZXIgaW1hZ2UgdGFnIHByb3ZpZGVkIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiB0byBhbiBpbWFnZSBkaWdlc3QuIEJ5IGRlZmF1bHQsIHRoZSB2YWx1ZSBpcyBgYGVuYWJsZWRgYC4gSWYgeW91IHNldCB0aGUgdmFsdWUgZm9yIGEgY29udGFpbmVyIGFzIGBgZGlzYWJsZWRgYCwgQW1hem9uIEVDUyB3aWxsIG5vdCByZXNvbHZlIHRoZSBwcm92aWRlZCBjb250YWluZXIgaW1hZ2UgdGFnIHRvIGEgZGlnZXN0IGFuZCB3aWxsIHVzZSB0aGUgb3JpZ2luYWwgaW1hZ2UgVVJJIHNwZWNpZmllZCBpbiB0aGUgY29udGFpbmVyIGRlZmluaXRpb24gZm9yIGRlcGxveW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbnRhaW5lciBpbWFnZSByZXNvbHV0aW9uLCBzZWUgW0NvbnRhaW5lciBpbWFnZSByZXNvbHV0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9kZXBsb3ltZW50LXR5cGUtZWNzLmh0bWwjZGVwbG95bWVudC1jb250YWluZXItaW1hZ2Utc3RhYmlsaXR5KSBpbiB0aGUgKkFtYXpvbiBFQ1MgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuVmVyc2lvbkNvbnNpc3RlbmN5PzogKFwiZW5hYmxlZFwiIHwgXCJkaXNhYmxlZFwiKVxuUmVzdGFydFBvbGljeT86IFJlc3RhcnRQb2xpY3lcbi8qKlxuICogV2hlbiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCBuZXR3b3JraW5nIGlzIG9mZiB3aXRoaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYE5ldHdvcmtEaXNhYmxlZGBgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kLlxuICogICBUaGlzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMuXG4gKi9cbkRpc2FibGVOZXR3b3JraW5nPzogYm9vbGVhblxuLyoqXG4gKiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIGBgdHJ1ZWBgLCBhIFRUWSBpcyBhbGxvY2F0ZWQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBUdHlgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS10dHlgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqL1xuUHNldWRvVGVybWluYWw/OiBib29sZWFuXG4vKipcbiAqIFRoZSBtb3VudCBwb2ludHMgZm9yIGRhdGEgdm9sdW1lcyBpbiB5b3VyIGNvbnRhaW5lci5cbiAqICBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgVm9sdW1lc2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGAtLXZvbHVtZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogIFdpbmRvd3MgY29udGFpbmVycyBjYW4gbW91bnQgd2hvbGUgZGlyZWN0b3JpZXMgb24gdGhlIHNhbWUgZHJpdmUgYXMgYGAkZW52OlByb2dyYW1EYXRhYGAuIFdpbmRvd3MgY29udGFpbmVycyBjYW4ndCBtb3VudCBkaXJlY3RvcmllcyBvbiBhIGRpZmZlcmVudCBkcml2ZSwgYW5kIG1vdW50IHBvaW50IGNhbid0IGJlIGFjcm9zcyBkcml2ZXMuXG4gKi9cbk1vdW50UG9pbnRzPzogTW91bnRQb2ludFtdXG4vKipcbiAqIFRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAgYW5kIHNodXRkb3duLiBBIGNvbnRhaW5lciBjYW4gY29udGFpbiBtdWx0aXBsZSBkZXBlbmRlbmNpZXMuIFdoZW4gYSBkZXBlbmRlbmN5IGlzIGRlZmluZWQgZm9yIGNvbnRhaW5lciBzdGFydHVwLCBmb3IgY29udGFpbmVyIHNodXRkb3duIGl0IGlzIHJldmVyc2VkLlxuICogIEZvciB0YXNrcyB1c2luZyB0aGUgRUMyIGxhdW5jaCB0eXBlLCB0aGUgY29udGFpbmVyIGluc3RhbmNlcyByZXF1aXJlIGF0IGxlYXN0IHZlcnNpb24gMS4yNi4wIG9mIHRoZSBjb250YWluZXIgYWdlbnQgdG8gdHVybiBvbiBjb250YWluZXIgZGVwZW5kZW5jaWVzLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCBjb250YWluZXIgYWdlbnQgdmVyc2lvbi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGNoZWNraW5nIHlvdXIgYWdlbnQgdmVyc2lvbiBhbmQgdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLCBzZWUgW1VwZGF0aW5nIHRoZSBBbWF6b24gRUNTIENvbnRhaW5lciBBZ2VudF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWFnZW50LXVwZGF0ZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouIElmIHlvdSdyZSB1c2luZyBhbiBBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUksIHlvdXIgaW5zdGFuY2UgbmVlZHMgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UuIElmIHlvdXIgY29udGFpbmVyIGluc3RhbmNlcyBhcmUgbGF1bmNoZWQgZnJvbSB2ZXJzaW9uIGBgMjAxOTAzMDFgYCBvciBsYXRlciwgdGhlbiB0aGV5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIHZlcnNpb25zIG9mIHRoZSBjb250YWluZXIgYWdlbnQgYW5kIGBgZWNzLWluaXRgYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbQW1hem9uIEVDUy1vcHRpbWl6ZWQgTGludXggQU1JXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3Mtb3B0aW1pemVkX0FNSS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgRm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgdGFzayBvciBzZXJ2aWNlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOlxuICogICArICBMaW51eCBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4zLjBgYCBvciBsYXRlci5cbiAqICAgKyAgV2luZG93cyBwbGF0Zm9ybSB2ZXJzaW9uIGBgMS4wLjBgYCBvciBsYXRlci5cbiAqICAgXG4gKiAgSWYgdGhlIHRhc2sgZGVmaW5pdGlvbiBpcyB1c2VkIGluIGEgYmx1ZS9ncmVlbiBkZXBsb3ltZW50IHRoYXQgdXNlcyBbQVdTOjpDb2RlRGVwbG95OjpEZXBsb3ltZW50R3JvdXAgQmx1ZUdyZWVuRGVwbG95bWVudENvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWNvZGVkZXBsb3ktZGVwbG95bWVudGdyb3VwLWJsdWVncmVlbmRlcGxveW1lbnRjb25maWd1cmF0aW9uLmh0bWwpLCB0aGUgYGBkZXBlbmRzT25gYCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuRGVwZW5kc09uPzogQ29udGFpbmVyRGVwZW5kZW5jeVtdXG4vKipcbiAqIEEga2V5L3ZhbHVlIG1hcCBvZiBsYWJlbHMgdG8gYWRkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMYWJlbHNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1sYWJlbGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMTggb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5Eb2NrZXJMYWJlbHM/OiB7XG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGB1bmRlZmluZWRgJ3MgSlNPTi1TY2hlbWEgZGVmaW5pdGlvblxuICogdmlhIHRoZSBgcGF0dGVyblByb3BlcnR5YCBcIi57MSx9XCIuXG4gKi9cbltrOiBzdHJpbmddOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGxpc3Qgb2YgcG9ydCBtYXBwaW5ncyBmb3IgdGhlIGNvbnRhaW5lci4gUG9ydCBtYXBwaW5ncyBhbGxvdyBjb250YWluZXJzIHRvIGFjY2VzcyBwb3J0cyBvbiB0aGUgaG9zdCBjb250YWluZXIgaW5zdGFuY2UgdG8gc2VuZCBvciByZWNlaXZlIHRyYWZmaWMuXG4gKiAgRm9yIHRhc2sgZGVmaW5pdGlvbnMgdGhhdCB1c2UgdGhlIGBgYXdzdnBjYGAgbmV0d29yayBtb2RlLCB5b3Ugc2hvdWxkIG9ubHkgc3BlY2lmeSB0aGUgYGBjb250YWluZXJQb3J0YGAuIFRoZSBgYGhvc3RQb3J0YGAgY2FuIGJlIGxlZnQgYmxhbmsgb3IgaXQgbXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgUG9ydCBtYXBwaW5ncyBvbiBXaW5kb3dzIHVzZSB0aGUgYGBOZXROQVRgYCBnYXRld2F5IGFkZHJlc3MgcmF0aGVyIHRoYW4gYGBsb2NhbGhvc3RgYC4gVGhlcmUgaXMgbm8gbG9vcGJhY2sgZm9yIHBvcnQgbWFwcGluZ3Mgb24gV2luZG93cywgc28geW91IGNhbm5vdCBhY2Nlc3MgYSBjb250YWluZXIncyBtYXBwZWQgcG9ydCBmcm9tIHRoZSBob3N0IGl0c2VsZi4gXG4gKiAgVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYFBvcnRCaW5kaW5nc2BgIGluIHRoZSBbQ3JlYXRlIGEgY29udGFpbmVyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8jb3BlcmF0aW9uL0NvbnRhaW5lckNyZWF0ZSkgc2VjdGlvbiBvZiB0aGUgW0RvY2tlciBSZW1vdGUgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FwaS92MS4zNS8pIGFuZCB0aGUgYGAtLXB1Ymxpc2hgYCBvcHRpb24gdG8gW2RvY2tlciBydW5dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL3J1bi8pLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYG5vbmVgYCwgdGhlbiB5b3UgY2FuJ3Qgc3BlY2lmeSBwb3J0IG1hcHBpbmdzLiBJZiB0aGUgbmV0d29yayBtb2RlIG9mIGEgdGFzayBkZWZpbml0aW9uIGlzIHNldCB0byBgYGhvc3RgYCwgdGhlbiBob3N0IHBvcnRzIG11c3QgZWl0aGVyIGJlIHVuZGVmaW5lZCBvciB0aGV5IG11c3QgbWF0Y2ggdGhlIGNvbnRhaW5lciBwb3J0IGluIHRoZSBwb3J0IG1hcHBpbmcuXG4gKiAgIEFmdGVyIGEgdGFzayByZWFjaGVzIHRoZSBgYFJVTk5JTkdgYCBzdGF0dXMsIG1hbnVhbCBhbmQgYXV0b21hdGljIGhvc3QgYW5kIGNvbnRhaW5lciBwb3J0IGFzc2lnbm1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZSAqTmV0d29yayBCaW5kaW5ncyogc2VjdGlvbiBvZiBhIGNvbnRhaW5lciBkZXNjcmlwdGlvbiBmb3IgYSBzZWxlY3RlZCB0YXNrIGluIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUuIFRoZSBhc3NpZ25tZW50cyBhcmUgYWxzbyB2aXNpYmxlIGluIHRoZSBgYG5ldHdvcmtCaW5kaW5nc2BgIHNlY3Rpb24gW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSByZXNwb25zZXMuXG4gKi9cblBvcnRNYXBwaW5ncz86IFBvcnRNYXBwaW5nW11cbi8qKlxuICogVGhlIGNvbW1hbmQgdGhhdCdzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ21kYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYENPTU1BTkRgYCBwYXJhbWV0ZXIgdG8gZG9ja2VyIHJ1bi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGFyZ3VtZW50cywgZWFjaCBhcmd1bWVudCBpcyBhIHNlcGFyYXRlZCBzdHJpbmcgaW4gdGhlIGFycmF5LlxuICovXG5Db21tYW5kPzogc3RyaW5nW11cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgRW52YGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tZW52YGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFdlIGRvbid0IHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgcGxhaW50ZXh0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igc2Vuc2l0aXZlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGNyZWRlbnRpYWwgZGF0YS5cbiAqL1xuRW52aXJvbm1lbnQ/OiBLZXlWYWx1ZVBhaXJbXVxuLyoqXG4gKiBUaGUgYGBsaW5rc2BgIHBhcmFtZXRlciBhbGxvd3MgY29udGFpbmVycyB0byBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgd2l0aG91dCB0aGUgbmVlZCBmb3IgcG9ydCBtYXBwaW5ncy4gVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgaWYgdGhlIG5ldHdvcmsgbW9kZSBvZiBhIHRhc2sgZGVmaW5pdGlvbiBpcyBgYGJyaWRnZWBgLiBUaGUgYGBuYW1lOmludGVybmFsTmFtZWBgIGNvbnN0cnVjdCBpcyBhbmFsb2dvdXMgdG8gYGBuYW1lOmFsaWFzYGAgaW4gRG9ja2VyIGxpbmtzLiBVcCB0byAyNTUgbGV0dGVycyAodXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UpLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgYXJlIGFsbG93ZWQuLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgTGlua3NgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1saW5rYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uXG4gKiAgIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MgY29udGFpbmVycy5cbiAqICAgIENvbnRhaW5lcnMgdGhhdCBhcmUgY29sbG9jYXRlZCBvbiBhIHNpbmdsZSBjb250YWluZXIgaW5zdGFuY2UgbWF5IGJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyIHdpdGhvdXQgcmVxdWlyaW5nIGxpbmtzIG9yIGhvc3QgcG9ydCBtYXBwaW5ncy4gTmV0d29yayBpc29sYXRpb24gaXMgYWNoaWV2ZWQgb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZSB1c2luZyBzZWN1cml0eSBncm91cHMgYW5kIFZQQyBzZXR0aW5ncy5cbiAqL1xuTGlua3M/OiBzdHJpbmdbXVxufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZWNyZXQgdG8gZXhwb3NlIHRvIHlvdXIgY29udGFpbmVyLiBTZWNyZXRzIGNhbiBiZSBleHBvc2VkIHRvIGEgY29udGFpbmVyIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqICAgKyAgVG8gaW5qZWN0IHNlbnNpdGl2ZSBkYXRhIGludG8geW91ciBjb250YWluZXJzIGFzIGVudmlyb25tZW50IHZhcmlhYmxlcywgdXNlIHRoZSBgYHNlY3JldHNgYCBjb250YWluZXIgZGVmaW5pdGlvbiBwYXJhbWV0ZXIuXG4gKiAgICsgIFRvIHJlZmVyZW5jZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gaW4gdGhlIGxvZyBjb25maWd1cmF0aW9uIG9mIGEgY29udGFpbmVyLCB1c2UgdGhlIGBgc2VjcmV0T3B0aW9uc2BgIGNvbnRhaW5lciBkZWZpbml0aW9uIHBhcmFtZXRlci5cbiAqICAgXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU3BlY2lmeWluZyBzZW5zaXRpdmUgZGF0YV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjcmV0IHtcbi8qKlxuICogVGhlIHNlY3JldCB0byBleHBvc2UgdG8gdGhlIGNvbnRhaW5lci4gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGVpdGhlciB0aGUgZnVsbCBBUk4gb2YgdGhlIEFTTWxvbmcgc2VjcmV0IG9yIHRoZSBmdWxsIEFSTiBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICogIEZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWlyZSBJQU1sb25nIHBlcm1pc3Npb25zLCBzZWUgW1JlcXVpcmVkIElBTSBwZXJtaXNzaW9ucyBmb3IgQW1hem9uIEVDUyBzZWNyZXRzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zcGVjaWZ5aW5nLXNlbnNpdGl2ZS1kYXRhLXNlY3JldHMuaHRtbCNzZWNyZXRzLWlhbSkgKGZvciBTZWNyZXRzIE1hbmFnZXIpIG9yIFtSZXF1aXJlZCBJQU0gcGVybWlzc2lvbnMgZm9yIEFtYXpvbiBFQ1Mgc2VjcmV0c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc3BlY2lmeWluZy1zZW5zaXRpdmUtZGF0YS1wYXJhbWV0ZXJzLmh0bWwpIChmb3IgU3lzdGVtcyBNYW5hZ2VyIFBhcmFtZXRlciBzdG9yZSkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBJZiB0aGUgU1NNIFBhcmFtZXRlciBTdG9yZSBwYXJhbWV0ZXIgZXhpc3RzIGluIHRoZSBzYW1lIFJlZ2lvbiBhcyB0aGUgdGFzayB5b3UncmUgbGF1bmNoaW5nLCB0aGVuIHlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZnVsbCBBUk4gb3IgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBJZiB0aGUgcGFyYW1ldGVyIGV4aXN0cyBpbiBhIGRpZmZlcmVudCBSZWdpb24sIHRoZW4gdGhlIGZ1bGwgQVJOIG11c3QgYmUgc3BlY2lmaWVkLlxuICovXG5WYWx1ZUZyb206IHN0cmluZ1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0LlxuICovXG5OYW1lOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGNvbnRhaW5lciBoZWFsdGggY2hlY2sgY29tbWFuZCBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBIZWFsdGhDaGVja2BgIGluIHRoZSBkb2NrZXIgY29udGFpbmVyIGNyZWF0ZSBjb21tYW5kIGFuZCB0aGUgYGBIRUFMVEhDSEVDS2BgIHBhcmFtZXRlciBvZiBkb2NrZXIgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrIHtcbi8qKlxuICogQSBzdHJpbmcgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBjb21tYW5kIHRoYXQgdGhlIGNvbnRhaW5lciBydW5zIHRvIGRldGVybWluZSBpZiBpdCBpcyBoZWFsdGh5LiBUaGUgc3RyaW5nIGFycmF5IG11c3Qgc3RhcnQgd2l0aCBgYENNRGBgIHRvIHJ1biB0aGUgY29tbWFuZCBhcmd1bWVudHMgZGlyZWN0bHksIG9yIGBgQ01ELVNIRUxMYGAgdG8gcnVuIHRoZSBjb21tYW5kIHdpdGggdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgc2hlbGwuIFxuICogICBXaGVuIHlvdSB1c2UgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUgSlNPTiBwYW5lbCwgdGhlIENMSWxvbmcsIG9yIHRoZSBBUElzLCBlbmNsb3NlIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGluIGRvdWJsZSBxdW90ZXMgYW5kIGJyYWNrZXRzLlxuICogICBgYFsgXCJDTUQtU0hFTExcIiwgXCJjdXJsIC1mIGh0dHA6Ly9sb2NhbGhvc3QvIHx8IGV4aXQgMVwiIF1gYCBcbiAqICBZb3UgZG9uJ3QgaW5jbHVkZSB0aGUgZG91YmxlIHF1b3RlcyBhbmQgYnJhY2tldHMgd2hlbiB5b3UgdXNlIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlLlxuICogICBgYENNRC1TSEVMTCwgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0LyB8fCBleGl0IDFgYCBcbiAqICBBbiBleGl0IGNvZGUgb2YgMCBpbmRpY2F0ZXMgc3VjY2VzcywgYW5kIG5vbi16ZXJvIGV4aXQgY29kZSBpbmRpY2F0ZXMgZmFpbHVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgYEhlYWx0aENoZWNrYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQuXG4gKi9cbkNvbW1hbmQ/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgdGltZSBwZXJpb2QgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIGhlYWx0aCBjaGVjayB0byBzdWNjZWVkIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4gWW91IG1heSBzcGVjaWZ5IGJldHdlZW4gMiBhbmQgNjAgc2Vjb25kcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNS4gVGhpcyB2YWx1ZSBhcHBsaWVzIG9ubHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29tbWFuZGBgLlxuICovXG5UaW1lb3V0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYSBmYWlsZWQgaGVhbHRoIGNoZWNrIGJlZm9yZSB0aGUgY29udGFpbmVyIGlzIGNvbnNpZGVyZWQgdW5oZWFsdGh5LiBZb3UgbWF5IHNwZWNpZnkgYmV0d2VlbiAxIGFuZCAxMCByZXRyaWVzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLiBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb21tYW5kYGAuXG4gKi9cblJldHJpZXM/OiBudW1iZXJcbi8qKlxuICogVGhlIHRpbWUgcGVyaW9kIGluIHNlY29uZHMgYmV0d2VlbiBlYWNoIGhlYWx0aCBjaGVjayBleGVjdXRpb24uIFlvdSBtYXkgc3BlY2lmeSBiZXR3ZWVuIDUgYW5kIDMwMCBzZWNvbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMCBzZWNvbmRzLiBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSB3aGVuIHlvdSBzcGVjaWZ5IGEgYGBjb21tYW5kYGAuXG4gKi9cbkludGVydmFsPzogbnVtYmVyXG4vKipcbiAqIFRoZSBvcHRpb25hbCBncmFjZSBwZXJpb2QgdG8gcHJvdmlkZSBjb250YWluZXJzIHRpbWUgdG8gYm9vdHN0cmFwIGJlZm9yZSBmYWlsZWQgaGVhbHRoIGNoZWNrcyBjb3VudCB0b3dhcmRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiAwIGFuZCAzMDAgc2Vjb25kcy4gQnkgZGVmYXVsdCwgdGhlIGBgc3RhcnRQZXJpb2RgYCBpcyBvZmYuIFRoaXMgdmFsdWUgYXBwbGllcyBvbmx5IHdoZW4geW91IHNwZWNpZnkgYSBgYGNvbW1hbmRgYC4gXG4gKiAgIElmIGEgaGVhbHRoIGNoZWNrIHN1Y2NlZWRzIHdpdGhpbiB0aGUgYGBzdGFydFBlcmlvZGBgLCB0aGVuIHRoZSBjb250YWluZXIgaXMgY29uc2lkZXJlZCBoZWFsdGh5IGFuZCBhbnkgc3Vic2VxdWVudCBmYWlsdXJlcyBjb3VudCB0b3dhcmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKi9cblN0YXJ0UGVyaW9kPzogbnVtYmVyXG59XG4vKipcbiAqIERldGFpbHMgb24gYSBkYXRhIHZvbHVtZSBmcm9tIGFub3RoZXIgY29udGFpbmVyIGluIHRoZSBzYW1lIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWVGcm9tIHtcbi8qKlxuICogSWYgdGhpcyB2YWx1ZSBpcyBgYHRydWVgYCwgdGhlIGNvbnRhaW5lciBoYXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgdm9sdW1lLiBJZiB0aGlzIHZhbHVlIGlzIGBgZmFsc2VgYCwgdGhlbiB0aGUgY29udGFpbmVyIGNhbiB3cml0ZSB0byB0aGUgdm9sdW1lLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYGZhbHNlYGAuXG4gKi9cblJlYWRPbmx5PzogYm9vbGVhblxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhbm90aGVyIGNvbnRhaW5lciB3aXRoaW4gdGhlIHNhbWUgdGFzayBkZWZpbml0aW9uIHRvIG1vdW50IHZvbHVtZXMgZnJvbS5cbiAqL1xuU291cmNlQ29udGFpbmVyPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBsb2cgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY29udGFpbmVyLlxuICogIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBMb2dDb25maWdgYCBpbiB0aGUgZG9ja2VyIENyZWF0ZSBhIGNvbnRhaW5lciBjb21tYW5kIGFuZCB0aGUgYGAtLWxvZy1kcml2ZXJgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi4gQnkgZGVmYXVsdCwgY29udGFpbmVycyB1c2UgdGhlIHNhbWUgbG9nZ2luZyBkcml2ZXIgdGhhdCB0aGUgRG9ja2VyIGRhZW1vbiB1c2VzLiBIb3dldmVyLCB0aGUgY29udGFpbmVyIG1heSB1c2UgYSBkaWZmZXJlbnQgbG9nZ2luZyBkcml2ZXIgdGhhbiB0aGUgRG9ja2VyIGRhZW1vbiBieSBzcGVjaWZ5aW5nIGEgbG9nIGRyaXZlciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbi4gVG8gdXNlIGEgZGlmZmVyZW50IGxvZ2dpbmcgZHJpdmVyIGZvciBhIGNvbnRhaW5lciwgdGhlIGxvZyBzeXN0ZW0gbXVzdCBiZSBjb25maWd1cmVkIHByb3Blcmx5IG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UgKG9yIG9uIGEgZGlmZmVyZW50IGxvZyBzZXJ2ZXIgZm9yIHJlbW90ZSBsb2dnaW5nIG9wdGlvbnMpLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgb3B0aW9ucyBmb3IgZGlmZmVyZW50IHN1cHBvcnRlZCBsb2cgZHJpdmVycywgc2VlIFtDb25maWd1cmUgbG9nZ2luZyBkcml2ZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL2FkbWluL2xvZ2dpbmcvb3ZlcnZpZXcvKSBpbiB0aGUgRG9ja2VyIGRvY3VtZW50YXRpb24uXG4gKiAgIEFtYXpvbiBFQ1MgY3VycmVudGx5IHN1cHBvcnRzIGEgc3Vic2V0IG9mIHRoZSBsb2dnaW5nIGRyaXZlcnMgYXZhaWxhYmxlIHRvIHRoZSBEb2NrZXIgZGFlbW9uIChzaG93biBpbiB0aGUgW0xvZ0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTG9nQ29uZmlndXJhdGlvbi5odG1sKSBkYXRhIHR5cGUpLiBBZGRpdGlvbmFsIGxvZyBkcml2ZXJzIG1heSBiZSBhdmFpbGFibGUgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudC5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE4IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqICAgVGhlIEFtYXpvbiBFQ1MgY29udGFpbmVyIGFnZW50IHJ1bm5pbmcgb24gYSBjb250YWluZXIgaW5zdGFuY2UgbXVzdCByZWdpc3RlciB0aGUgbG9nZ2luZyBkcml2ZXJzIGF2YWlsYWJsZSBvbiB0aGF0IGluc3RhbmNlIHdpdGggdGhlIGBgRUNTX0FWQUlMQUJMRV9MT0dHSU5HX0RSSVZFUlNgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgY29udGFpbmVycyBwbGFjZWQgb24gdGhhdCBpbnN0YW5jZSBjYW4gdXNlIHRoZXNlIGxvZyBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0NvbnRhaW5lciBBZ2VudCBDb25maWd1cmF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9lY3MtYWdlbnQtY29uZmlnLmh0bWwpIGluIHRoZSAqRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dDb25maWd1cmF0aW9uIHtcbi8qKlxuICogVGhlIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgbG9nIGNvbmZpZ3VyYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1NwZWNpZnlpbmcgc2Vuc2l0aXZlIGRhdGFdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NwZWNpZnlpbmctc2Vuc2l0aXZlLWRhdGEuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5TZWNyZXRPcHRpb25zPzogU2VjcmV0W11cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBzZW5kIHRvIHRoZSBsb2cgZHJpdmVyLlxuICogIFRoZSBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSBkZXBlbmQgb24gdGhlIGxvZyBkcml2ZXIuIFNvbWUgb2YgdGhlIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4geW91IHVzZSB0aGUgYGBhd3Nsb2dzYGAgbG9nIGRyaXZlciB0byByb3V0ZSBsb2dzIHRvIEFtYXpvbiBDbG91ZFdhdGNoIGluY2x1ZGUgdGhlIGZvbGxvd2luZzpcbiAqICAgKyBhd3Nsb2dzLWNyZWF0ZS1ncm91cCBSZXF1aXJlZDogTm8gU3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRoZSBsb2cgZ3JvdXAgdG8gYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiBJZiB0aGlzIG9wdGlvbiBpc24ndCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLiBZb3VyIElBTSBwb2xpY3kgbXVzdCBpbmNsdWRlIHRoZSBsb2dzOkNyZWF0ZUxvZ0dyb3VwIHBlcm1pc3Npb24gYmVmb3JlIHlvdSBhdHRlbXB0IHRvIHVzZSBhd3Nsb2dzLWNyZWF0ZS1ncm91cC4gKyBhd3Nsb2dzLXJlZ2lvbiBSZXF1aXJlZDogWWVzIFNwZWNpZnkgdGhlIFJlZ2lvbiB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgaXMgdG8gc2VuZCB5b3VyIERvY2tlciBsb2dzIHRvLiBZb3UgY2FuIGNob29zZSB0byBzZW5kIGFsbCBvZiB5b3VyIGxvZ3MgZnJvbSBjbHVzdGVycyBpbiBkaWZmZXJlbnQgUmVnaW9ucyB0byBhIHNpbmdsZSByZWdpb24gaW4gQ2xvdWRXYXRjaCBMb2dzLiBUaGlzIGlzIHNvIHRoYXQgdGhleSdyZSBhbGwgdmlzaWJsZSBpbiBvbmUgbG9jYXRpb24uIE90aGVyd2lzZSwgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIGJ5IFJlZ2lvbiBmb3IgbW9yZSBncmFudWxhcml0eS4gTWFrZSBzdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBsb2cgZ3JvdXAgZXhpc3RzIGluIHRoZSBSZWdpb24gdGhhdCB5b3Ugc3BlY2lmeSB3aXRoIHRoaXMgb3B0aW9uLiArIGF3c2xvZ3MtZ3JvdXAgUmVxdWlyZWQ6IFllcyBNYWtlIHN1cmUgdG8gc3BlY2lmeSBhIGxvZyBncm91cCB0aGF0IHRoZSBhd3Nsb2dzIGxvZyBkcml2ZXIgc2VuZHMgaXRzIGxvZyBzdHJlYW1zIHRvLiArIGF3c2xvZ3Mtc3RyZWFtLXByZWZpeCBSZXF1aXJlZDogWWVzLCB3aGVuIHVzaW5nIEZhcmdhdGUuT3B0aW9uYWwgd2hlbiB1c2luZyBFQzIuIFVzZSB0aGUgYXdzbG9ncy1zdHJlYW0tcHJlZml4IG9wdGlvbiB0byBhc3NvY2lhdGUgYSBsb2cgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIHRoZSBjb250YWluZXIgbmFtZSwgYW5kIHRoZSBJRCBvZiB0aGUgQW1hem9uIEVDUyB0YXNrIHRoYXQgdGhlIGNvbnRhaW5lciBiZWxvbmdzIHRvLiBJZiB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLCB0aGVuIHRoZSBsb2cgc3RyZWFtIHRha2VzIHRoZSBmb3JtYXQgcHJlZml4LW5hbWUvY29udGFpbmVyLW5hbWUvZWNzLXRhc2staWQuIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgcHJlZml4IHdpdGggdGhpcyBvcHRpb24sIHRoZW4gdGhlIGxvZyBzdHJlYW0gaXMgbmFtZWQgYWZ0ZXIgdGhlIGNvbnRhaW5lciBJRCB0aGF0J3MgYXNzaWduZWQgYnkgdGhlIERvY2tlciBkYWVtb24gb24gdGhlIGNvbnRhaW5lciBpbnN0YW5jZS4gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byB0cmFjZSBsb2dzIGJhY2sgdG8gdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSB3aXRoIGp1c3QgdGhlIERvY2tlciBjb250YWluZXIgSUQgKHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHRoZSBjb250YWluZXIgaW5zdGFuY2UpLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeSBhIHByZWZpeCB3aXRoIHRoaXMgb3B0aW9uLiBGb3IgQW1hem9uIEVDUyBzZXJ2aWNlcywgeW91IGNhbiB1c2UgdGhlIHNlcnZpY2UgbmFtZSBhcyB0aGUgcHJlZml4LiBEb2luZyBzbywgeW91IGNhbiB0cmFjZSBsb2cgc3RyZWFtcyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0bywgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHNlbnQgdGhlbSwgYW5kIHRoZSBJRCBvZiB0aGUgdGFzayB0aGF0IHRoZSBjb250YWluZXIgYmVsb25ncyB0by4gWW91IG11c3Qgc3BlY2lmeSBhIHN0cmVhbS1wcmVmaXggZm9yIHlvdXIgbG9ncyB0byBoYXZlIHlvdXIgbG9ncyBhcHBlYXIgaW4gdGhlIExvZyBwYW5lIHdoZW4gdXNpbmcgdGhlIEFtYXpvbiBFQ1MgY29uc29sZS4gKyBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIGluIFB5dGhvbiBzdHJmdGltZSBmb3JtYXQuIEEgbG9nIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBsaW5lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBhbmQgYW55IGZvbGxvd2luZyBsaW5lcyB0aGF0IGRvbuKAmXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBtYXRjaGVkIGxpbmUgaXMgdGhlIGRlbGltaXRlciBiZXR3ZWVuIGxvZyBtZXNzYWdlcy4gT25lIGV4YW1wbGUgb2YgYSB1c2UgY2FzZSBmb3IgdXNpbmcgdGhpcyBmb3JtYXQgaXMgZm9yIHBhcnNpbmcgb3V0cHV0IHN1Y2ggYXMgYSBzdGFjayBkdW1wLCB3aGljaCBtaWdodCBvdGhlcndpc2UgYmUgbG9nZ2VkIGluIG11bHRpcGxlIGVudHJpZXMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gYWxsb3dzIGl0IHRvIGJlIGNhcHR1cmVkIGluIGEgc2luZ2xlIGVudHJ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtZGF0ZXRpbWUtZm9ybWF0LiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuICsgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBSZXF1aXJlZDogTm8gVGhpcyBvcHRpb24gZGVmaW5lcyBhIG11bHRpbGluZSBzdGFydCBwYXR0ZXJuIHRoYXQgdXNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQSBsb2cgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGFuZCBhbnkgZm9sbG93aW5nIGxpbmVzIHRoYXQgZG9u4oCZdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIG1hdGNoZWQgbGluZSBpcyB0aGUgZGVsaW1pdGVyIGJldHdlZW4gbG9nIG1lc3NhZ2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGF3c2xvZ3MtbXVsdGlsaW5lLXBhdHRlcm4uIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgYXdzbG9ncy1kYXRldGltZS1mb3JtYXQgaXMgYWxzbyBjb25maWd1cmVkLiBZb3UgY2Fubm90IGNvbmZpZ3VyZSBib3RoIHRoZSBhd3Nsb2dzLWRhdGV0aW1lLWZvcm1hdCBhbmQgYXdzbG9ncy1tdWx0aWxpbmUtcGF0dGVybiBvcHRpb25zLiBNdWx0aWxpbmUgbG9nZ2luZyBwZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgbWF0Y2hpbmcgb2YgYWxsIGxvZyBtZXNzYWdlcy4gVGhpcyBtaWdodCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGxvZ2dpbmcgcGVyZm9ybWFuY2UuIFxuICogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcHBseSB0byBhbGwgc3VwcG9ydGVkIGxvZyBkcml2ZXJzLlxuICogICArIG1vZGUgUmVxdWlyZWQ6IE5vIFZhbGlkIHZhbHVlczogbm9uLWJsb2NraW5nIHwgYmxvY2tpbmcgVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgZGVsaXZlcnkgbW9kZSBvZiBsb2cgbWVzc2FnZXMgZnJvbSB0aGUgY29udGFpbmVyIHRvIHRoZSBsb2cgZHJpdmVyIHNwZWNpZmllZCB1c2luZyBsb2dEcml2ZXIuIFRoZSBkZWxpdmVyeSBtb2RlIHlvdSBjaG9vc2UgYWZmZWN0cyBhcHBsaWNhdGlvbiBhdmFpbGFiaWxpdHkgd2hlbiB0aGUgZmxvdyBvZiBsb2dzIGZyb20gY29udGFpbmVyIGlzIGludGVycnVwdGVkLiBJZiB5b3UgdXNlIHRoZSBibG9ja2luZyBtb2RlIGFuZCB0aGUgZmxvdyBvZiBsb2dzIGlzIGludGVycnVwdGVkLCBjYWxscyBmcm9tIGNvbnRhaW5lciBjb2RlIHRvIHdyaXRlIHRvIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBzdHJlYW1zIHdpbGwgYmxvY2suIFRoZSBsb2dnaW5nIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gd2lsbCBibG9jayBhcyBhIHJlc3VsdC4gVGhpcyBtYXkgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJlY29tZSB1bnJlc3BvbnNpdmUgYW5kIGxlYWQgdG8gY29udGFpbmVyIGhlYWx0aGNoZWNrIGZhaWx1cmUuIElmIHlvdSB1c2UgdGhlIG5vbi1ibG9ja2luZyBtb2RlLCB0aGUgY29udGFpbmVyJ3MgbG9ncyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gYW4gaW4tbWVtb3J5IGludGVybWVkaWF0ZSBidWZmZXIgY29uZmlndXJlZCB3aXRoIHRoZSBtYXgtYnVmZmVyLXNpemUgb3B0aW9uLiBUaGlzIHByZXZlbnRzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJlY29taW5nIHVucmVzcG9uc2l2ZSB3aGVuIGxvZ3MgY2Fubm90IGJlIHNlbnQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGlzIG1vZGUgaWYgeW91IHdhbnQgdG8gZW5zdXJlIHNlcnZpY2UgYXZhaWxhYmlsaXR5IGFuZCBhcmUgb2theSB3aXRoIHNvbWUgbG9nIGxvc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgUHJldmVudGluZyBsb2cgbG9zcyB3aXRoIG5vbi1ibG9ja2luZyBtb2RlIGluIHRoZSBhd3Nsb2dzIGNvbnRhaW5lciBsb2cgZHJpdmVyLiBZb3UgY2FuIHNldCBhIGRlZmF1bHQgbW9kZSBmb3IgYWxsIGNvbnRhaW5lcnMgaW4gYSBzcGVjaWZpYyBSZWdpb24gYnkgdXNpbmcgdGhlIGRlZmF1bHRMb2dEcml2ZXJNb2RlIGFjY291bnQgc2V0dGluZy4gSWYgeW91IGRvbid0IHNwZWNpZnkgdGhlIG1vZGUgb3B0aW9uIG9yIGNvbmZpZ3VyZSB0aGUgYWNjb3VudCBzZXR0aW5nLCBBbWF6b24gRUNTIHdpbGwgZGVmYXVsdCB0byB0aGUgbm9uLWJsb2NraW5nIG1vZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IHNldHRpbmcsIHNlZSBEZWZhdWx0IGxvZyBkcml2ZXIgbW9kZSBpbiB0aGUgQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlLiBPbiBKdW5lIDI1LCAyMDI1LCBBbWF6b24gRUNTIGNoYW5nZWQgdGhlIGRlZmF1bHQgbG9nIGRyaXZlciBtb2RlIGZyb20gYmxvY2tpbmcgdG8gbm9uLWJsb2NraW5nIHRvIHByaW9yaXRpemUgdGFzayBhdmFpbGFiaWxpdHkgb3ZlciBsb2dnaW5nLiBUbyBjb250aW51ZSB1c2luZyB0aGUgYmxvY2tpbmcgbW9kZSBhZnRlciB0aGlzIGNoYW5nZSwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6IFNldCB0aGUgbW9kZSBvcHRpb24gaW4geW91ciBjb250YWluZXIgZGVmaW5pdGlvbidzIGxvZ0NvbmZpZ3VyYXRpb24gYXMgYmxvY2tpbmcuIFNldCB0aGUgZGVmYXVsdExvZ0RyaXZlck1vZGUgYWNjb3VudCBzZXR0aW5nIHRvIGJsb2NraW5nLiArIG1heC1idWZmZXItc2l6ZSBSZXF1aXJlZDogTm8gRGVmYXVsdCB2YWx1ZTogMTBtIFdoZW4gbm9uLWJsb2NraW5nIG1vZGUgaXMgdXNlZCwgdGhlIG1heC1idWZmZXItc2l6ZSBsb2cgb3B0aW9uIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCdzIHVzZWQgZm9yIGludGVybWVkaWF0ZSBtZXNzYWdlIHN0b3JhZ2UuIE1ha2Ugc3VyZSB0byBzcGVjaWZ5IGFuIGFkZXF1YXRlIGJ1ZmZlciBzaXplIGJhc2VkIG9uIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gdGhlIGJ1ZmZlciBmaWxscyB1cCwgZnVydGhlciBsb2dzIGNhbm5vdCBiZSBzdG9yZWQuIExvZ3MgdGhhdCBjYW5ub3QgYmUgc3RvcmVkIGFyZSBsb3N0LiBcbiAqICBUbyByb3V0ZSBsb2dzIHVzaW5nIHRoZSBgYHNwbHVua2BgIGxvZyByb3V0ZXIsIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBgYHNwbHVuay10b2tlbmBgIGFuZCBhIGBgc3BsdW5rLXVybGBgLlxuICogIFdoZW4geW91IHVzZSB0aGUgYGBhd3NmaXJlbGVuc2BgIGxvZyByb3V0ZXIgdG8gcm91dGUgbG9ncyB0byBhbiBBV1MgU2VydmljZSBvciBBV1MgUGFydG5lciBOZXR3b3JrIGRlc3RpbmF0aW9uIGZvciBsb2cgc3RvcmFnZSBhbmQgYW5hbHl0aWNzLCB5b3UgY2FuIHNldCB0aGUgYGBsb2ctZHJpdmVyLWJ1ZmZlci1saW1pdGBgIG9wdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGV2ZW50cyB0aGF0IGFyZSBidWZmZXJlZCBpbiBtZW1vcnksIGJlZm9yZSBiZWluZyBzZW50IHRvIHRoZSBsb2cgcm91dGVyIGNvbnRhaW5lci4gSXQgY2FuIGhlbHAgdG8gcmVzb2x2ZSBwb3RlbnRpYWwgbG9nIGxvc3MgaXNzdWUgYmVjYXVzZSBoaWdoIHRocm91Z2hwdXQgbWlnaHQgcmVzdWx0IGluIG1lbW9yeSBydW5uaW5nIG91dCBmb3IgdGhlIGJ1ZmZlciBpbnNpZGUgb2YgRG9ja2VyLlxuICogIE90aGVyIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IHdoZW4gdXNpbmcgYGBhd3NmaXJlbGVuc2BgIHRvIHJvdXRlIGxvZ3MgZGVwZW5kIG9uIHRoZSBkZXN0aW5hdGlvbi4gV2hlbiB5b3UgZXhwb3J0IGxvZ3MgdG8gQW1hem9uIERhdGEgRmlyZWhvc2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgQVdTIFJlZ2lvbiB3aXRoIGBgcmVnaW9uYGAgYW5kIGEgbmFtZSBmb3IgdGhlIGxvZyBzdHJlYW0gd2l0aCBgYGRlbGl2ZXJ5X3N0cmVhbWBgLlxuICogIFdoZW4geW91IGV4cG9ydCBsb2dzIHRvIEFtYXpvbiBLaW5lc2lzIERhdGEgU3RyZWFtcywgeW91IGNhbiBzcGVjaWZ5IGFuIEFXUyBSZWdpb24gd2l0aCBgYHJlZ2lvbmBgIGFuZCBhIGRhdGEgc3RyZWFtIG5hbWUgd2l0aCBgYHN0cmVhbWBgLlxuICogICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gT3BlblNlYXJjaCBTZXJ2aWNlLCB5b3UgY2FuIHNwZWNpZnkgb3B0aW9ucyBsaWtlIGBgTmFtZWBgLCBgYEhvc3RgYCAoT3BlblNlYXJjaCBTZXJ2aWNlIGVuZHBvaW50IHdpdGhvdXQgcHJvdG9jb2wpLCBgYFBvcnRgYCwgYGBJbmRleGBgLCBgYFR5cGVgYCwgYGBBd3NfYXV0aGBgLCBgYEF3c19yZWdpb25gYCwgYGBTdXBwcmVzc19UeXBlX05hbWVgYCwgYW5kIGBgdGxzYGAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VuZGVyIHRoZSBob29kOiBGaXJlTGVucyBmb3IgQW1hem9uIEVDUyBUYXNrc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvbnRhaW5lcnMvdW5kZXItdGhlLWhvb2QtZmlyZWxlbnMtZm9yLWFtYXpvbi1lY3MtdGFza3MvKS5cbiAqICBXaGVuIHlvdSBleHBvcnQgbG9ncyB0byBBbWF6b24gUzMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgYnVja2V0IHVzaW5nIHRoZSBgYGJ1Y2tldGBgIG9wdGlvbi4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYGByZWdpb25gYCwgYGB0b3RhbF9maWxlX3NpemVgYCwgYGB1cGxvYWRfdGltZW91dGBgLCBhbmQgYGB1c2VfcHV0X29iamVjdGBgIGFzIG9wdGlvbnMuXG4gKiAgVGhpcyBwYXJhbWV0ZXIgcmVxdWlyZXMgdmVyc2lvbiAxLjE5IG9mIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSBvciBncmVhdGVyIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLiBUbyBjaGVjayB0aGUgRG9ja2VyIFJlbW90ZSBBUEkgdmVyc2lvbiBvbiB5b3VyIGNvbnRhaW5lciBpbnN0YW5jZSwgbG9nIGluIHRvIHlvdXIgY29udGFpbmVyIGluc3RhbmNlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgYHN1ZG8gZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5BUElWZXJzaW9ufX0nYGBcbiAqL1xuT3B0aW9ucz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIGRyaXZlciB0byB1c2UgZm9yIHRoZSBjb250YWluZXIuXG4gKiAgRm9yIHRhc2tzIG9uIEZBUkdBVEVsb25nLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBzcGx1bmtgYCwgYW5kIGBgYXdzZmlyZWxlbnNgYC5cbiAqICBGb3IgdGFza3MgaG9zdGVkIG9uIEFtYXpvbiBFQzIgaW5zdGFuY2VzLCB0aGUgc3VwcG9ydGVkIGxvZyBkcml2ZXJzIGFyZSBgYGF3c2xvZ3NgYCwgYGBmbHVlbnRkYGAsIGBgZ2VsZmBgLCBgYGpzb24tZmlsZWBgLCBgYGpvdXJuYWxkYGAsIGBgc3lzbG9nYGAsIGBgc3BsdW5rYGAsIGFuZCBgYGF3c2ZpcmVsZW5zYGAuXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzbG9nc2BgIGxvZyBkcml2ZXIsIHNlZSBbU2VuZCBBbWF6b24gRUNTIGxvZ3MgdG8gQ2xvdWRXYXRjaF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfYXdzbG9ncy5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSouXG4gKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGBgYXdzZmlyZWxlbnNgYCBsb2cgZHJpdmVyLCBzZWUgW1NlbmQgQW1hem9uIEVDUyBsb2dzIHRvIGFuIHNlcnZpY2Ugb3IgUGFydG5lcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCkuXG4gKiAgIElmIHlvdSBoYXZlIGEgY3VzdG9tIGRyaXZlciB0aGF0IGlzbid0IGxpc3RlZCwgeW91IGNhbiBmb3JrIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwcm9qZWN0IHRoYXQncyBbYXZhaWxhYmxlIG9uIEdpdEh1Yl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYW1hem9uLWVjcy1hZ2VudCkgYW5kIGN1c3RvbWl6ZSBpdCB0byB3b3JrIHdpdGggdGhhdCBkcml2ZXIuIFdlIGVuY291cmFnZSB5b3UgdG8gc3VibWl0IHB1bGwgcmVxdWVzdHMgZm9yIGNoYW5nZXMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGluY2x1ZGVkLiBIb3dldmVyLCB3ZSBkb24ndCBjdXJyZW50bHkgcHJvdmlkZSBzdXBwb3J0IGZvciBydW5uaW5nIG1vZGlmaWVkIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlLlxuICovXG5Mb2dEcml2ZXI6IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgdHlwZSBhbmQgYW1vdW50IG9mIGEgcmVzb3VyY2UgdG8gYXNzaWduIHRvIGEgY29udGFpbmVyLiBUaGUgc3VwcG9ydGVkIHJlc291cmNlIHR5cGVzIGFyZSBHUFVzIGFuZCBFbGFzdGljIEluZmVyZW5jZSBhY2NlbGVyYXRvcnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1dvcmtpbmcgd2l0aCBHUFVzIG9uIEFtYXpvbiBFQ1NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1ncHUuaHRtbCkgb3IgW1dvcmtpbmcgd2l0aCBBbWF6b24gRWxhc3RpYyBJbmZlcmVuY2Ugb24gQW1hem9uIEVDU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvZWNzLWluZmVyZW5jZS5odG1sKSBpbiB0aGUgKkFtYXpvbiBFbGFzdGljIENvbnRhaW5lciBTZXJ2aWNlIERldmVsb3BlciBHdWlkZSpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVJlcXVpcmVtZW50IHtcbi8qKlxuICogVGhlIHR5cGUgb2YgcmVzb3VyY2UgdG8gYXNzaWduIHRvIGEgY29udGFpbmVyLlxuICovXG5UeXBlOiBzdHJpbmdcbi8qKlxuICogVGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUuXG4gKiAgV2hlbiB0aGUgdHlwZSBpcyBgYEdQVWBgLCB0aGUgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBgYEdQVXNgYCB0aGUgQW1hem9uIEVDUyBjb250YWluZXIgYWdlbnQgcmVzZXJ2ZXMgZm9yIHRoZSBjb250YWluZXIuIFRoZSBudW1iZXIgb2YgR1BVcyB0aGF0J3MgcmVzZXJ2ZWQgZm9yIGFsbCBjb250YWluZXJzIGluIGEgdGFzayBjYW4ndCBleGNlZWQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgR1BVcyBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRoYXQgdGhlIHRhc2sgaXMgbGF1bmNoZWQgb24uXG4gKiAgV2hlbiB0aGUgdHlwZSBpcyBgYEluZmVyZW5jZUFjY2VsZXJhdG9yYGAsIHRoZSBgYHZhbHVlYGAgbWF0Y2hlcyB0aGUgYGBkZXZpY2VOYW1lYGAgZm9yIGFuIFtJbmZlcmVuY2VBY2NlbGVyYXRvcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9JbmZlcmVuY2VBY2NlbGVyYXRvci5odG1sKSBzcGVjaWZpZWQgaW4gYSB0YXNrIGRlZmluaXRpb24uXG4gKi9cblZhbHVlOiBzdHJpbmdcbn1cbi8qKlxuICogQSBsaXN0IG9mIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIGEgY29udGFpbmVyLiBZb3UgY2FuIHNwZWNpZnkgdXAgdG8gdGVuIGVudmlyb25tZW50IGZpbGVzLiBUaGUgZmlsZSBtdXN0IGhhdmUgYSBgYC5lbnZgYCBmaWxlIGV4dGVuc2lvbi4gRWFjaCBsaW5lIGluIGFuIGVudmlyb25tZW50IGZpbGUgc2hvdWxkIGNvbnRhaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gYGBWQVJJQUJMRT1WQUxVRWBgIGZvcm1hdC4gTGluZXMgYmVnaW5uaW5nIHdpdGggYGAjYGAgYXJlIHRyZWF0ZWQgYXMgY29tbWVudHMgYW5kIGFyZSBpZ25vcmVkLlxuICogIElmIHRoZXJlIGFyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBgYGVudmlyb25tZW50YGAgcGFyYW1ldGVyIGluIGEgY29udGFpbmVyIGRlZmluaXRpb24sIHRoZXkgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHZhcmlhYmxlcyBjb250YWluZWQgd2l0aGluIGFuIGVudmlyb25tZW50IGZpbGUuIElmIG11bHRpcGxlIGVudmlyb25tZW50IGZpbGVzIGFyZSBzcGVjaWZpZWQgdGhhdCBjb250YWluIHRoZSBzYW1lIHZhcmlhYmxlLCB0aGV5J3JlIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3AgZG93bi4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB1bmlxdWUgdmFyaWFibGUgbmFtZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1VzZSBhIGZpbGUgdG8gcGFzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYSBjb250YWluZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzZS1lbnZpcm9ubWVudC1maWxlLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICBFbnZpcm9ubWVudCB2YXJpYWJsZSBmaWxlcyBhcmUgb2JqZWN0cyBpbiBBbWF6b24gUzMgYW5kIGFsbCBBbWF6b24gUzMgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMgYXBwbHkuIFxuICogIFlvdSBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIHBsYXRmb3JtcyBmb3IgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGU6XG4gKiAgICsgIExpbnV4IHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyLlxuICogICArICBXaW5kb3dzIHBsYXRmb3JtIHZlcnNpb24gYGAxLjAuMGBgIG9yIGxhdGVyLlxuICogICBcbiAqICBDb25zaWRlciB0aGUgZm9sbG93aW5nIHdoZW4gdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGU6XG4gKiAgICsgIFRoZSBmaWxlIGlzIGhhbmRsZWQgbGlrZSBhIG5hdGl2ZSBEb2NrZXIgZW52LWZpbGUuXG4gKiAgICsgIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNoZWxsIGVzY2FwZSBoYW5kbGluZy5cbiAqICAgKyAgVGhlIGNvbnRhaW5lciBlbnRyeSBwb2ludCBpbnRlcnBlcnRzIHRoZSBgYFZBUklBQkxFYGAgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50RmlsZSB7XG4vKipcbiAqIFRoZSBmaWxlIHR5cGUgdG8gdXNlLiBFbnZpcm9ubWVudCBmaWxlcyBhcmUgb2JqZWN0cyBpbiBBbWF6b24gUzMuIFRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgYHMzYGAuXG4gKi9cblR5cGU/OiBzdHJpbmdcbi8qKlxuICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBBbWF6b24gUzMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGZpbGUuXG4gKi9cblZhbHVlPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBGaXJlTGVucyBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGFpbmVyLiBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSBhbmQgY29uZmlndXJlIGEgbG9nIHJvdXRlciBmb3IgY29udGFpbmVyIGxvZ3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0N1c3RvbSBMb2cgUm91dGluZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNpbmdfZmlyZWxlbnMuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpcmVsZW5zQ29uZmlndXJhdGlvbiB7XG4vKipcbiAqIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBsb2cgcm91dGVyLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBtZXRhZGF0YSwgc3VjaCBhcyB0aGUgdGFzaywgdGFzayBkZWZpbml0aW9uLCBjbHVzdGVyLCBhbmQgY29udGFpbmVyIGluc3RhbmNlIGRldGFpbHMgdG8gdGhlIGxvZyBldmVudC5cbiAqICAgSWYgc3BlY2lmaWVkLCB2YWxpZCBvcHRpb24ga2V5cyBhcmU6XG4gKiAgICsgIGBgZW5hYmxlLWVjcy1sb2ctbWV0YWRhdGFgYCwgd2hpY2ggY2FuIGJlIGBgdHJ1ZWBgIG9yIGBgZmFsc2VgYFxuICogICArICBgYGNvbmZpZy1maWxlLXR5cGVgYCwgd2hpY2ggY2FuIGJlIGBgczNgYCBvciBgYGZpbGVgYFxuICogICArICBgYGNvbmZpZy1maWxlLXZhbHVlYGAsIHdoaWNoIGlzIGVpdGhlciBhbiBTMyBBUk4gb3IgYSBmaWxlIHBhdGhcbiAqL1xuT3B0aW9ucz86IHtcbi8qKlxuICogVGhpcyBpbnRlcmZhY2Ugd2FzIHJlZmVyZW5jZWQgYnkgYHVuZGVmaW5lZGAncyBKU09OLVNjaGVtYSBkZWZpbml0aW9uXG4gKiB2aWEgdGhlIGBwYXR0ZXJuUHJvcGVydHlgIFwiLnsxLH1cIi5cbiAqL1xuW2s6IHN0cmluZ106IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgbG9nIHJvdXRlciB0byB1c2UuIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIGBgZmx1ZW50ZGBgIG9yIGBgZmx1ZW50Yml0YGAuXG4gKi9cblR5cGU/OiBzdHJpbmdcbn1cbi8qKlxuICogQSBsaXN0IG9mIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlcnMgdG8gc2V0IGluIHRoZSBjb250YWluZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBTeXNjdGxzYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tc3lzY3RsYGAgb3B0aW9uIHRvIGRvY2tlciBydW4uIEZvciBleGFtcGxlLCB5b3UgY2FuIGNvbmZpZ3VyZSBgYG5ldC5pcHY0LnRjcF9rZWVwYWxpdmVfdGltZWBgIHNldHRpbmcgdG8gbWFpbnRhaW4gbG9uZ2VyIGxpdmVkIGNvbm5lY3Rpb25zLlxuICogIFdlIGRvbid0IHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5IG5ldHdvcmstcmVsYXRlZCBgYHN5c3RlbUNvbnRyb2xzYGAgcGFyYW1ldGVycyBmb3IgbXVsdGlwbGUgY29udGFpbmVycyBpbiBhIHNpbmdsZSB0YXNrIHRoYXQgYWxzbyB1c2VzIGVpdGhlciB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUuIERvaW5nIHRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgZGlzYWR2YW50YWdlczpcbiAqICAgKyAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSBpbmNsdWRpbmcgRmFyZ2F0ZSwgaWYgeW91IHNldCBgYHN5c3RlbUNvbnRyb2xzYGAgZm9yIGFueSBjb250YWluZXIsIGl0IGFwcGxpZXMgdG8gYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2suIElmIHlvdSBzZXQgZGlmZmVyZW50IGBgc3lzdGVtQ29udHJvbHNgYCBmb3IgbXVsdGlwbGUgY29udGFpbmVycyBpbiBhIHNpbmdsZSB0YXNrLCB0aGUgY29udGFpbmVyIHRoYXQncyBzdGFydGVkIGxhc3QgZGV0ZXJtaW5lcyB3aGljaCBgYHN5c3RlbUNvbnRyb2xzYGAgdGFrZSBlZmZlY3QuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgbmV0d29yayBtb2RlLCB0aGUgbmV0d29yayBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIGFyZW4ndCBzdXBwb3J0ZWQuXG4gKiAgIFxuICogIElmIHlvdSdyZSBzZXR0aW5nIGFuIElQQyByZXNvdXJjZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgY29udGFpbmVycyBpbiB0aGUgdGFzaywgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5IHRvIHlvdXIgc3lzdGVtIGNvbnRyb2xzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJUEMgbW9kZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza19kZWZpbml0aW9uX3BhcmFtZXRlcnMuaHRtbCN0YXNrX2RlZmluaXRpb25faXBjbW9kZSkuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGBob3N0YGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIGFyZW4ndCBzdXBwb3J0ZWQuXG4gKiAgICsgIEZvciB0YXNrcyB0aGF0IHVzZSB0aGUgYGB0YXNrYGAgSVBDIG1vZGUsIElQQyBuYW1lc3BhY2UgYGBzeXN0ZW1Db250cm9sc2BgIHZhbHVlcyBhcHBseSB0byBhbGwgY29udGFpbmVycyB3aXRoaW4gYSB0YXNrLlxuICogICBcbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhc2tzIHRoYXQgYXJlIGhvc3RlZCBvbiBGQVJHQVRFbG9uZyBpZiB0aGUgdGFza3MgYXJlIHVzaW5nIHBsYXRmb3JtIHZlcnNpb24gYGAxLjQuMGBgIG9yIGxhdGVyIChMaW51eCkuIFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzIGNvbnRhaW5lcnMgb24gRmFyZ2F0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeXN0ZW1Db250cm9sIHtcbi8qKlxuICogVGhlIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlciB0byBzZXQgYSBgYHZhbHVlYGAgZm9yLlxuICogIFZhbGlkIElQQyBuYW1lc3BhY2UgdmFsdWVzOiBgYFwia2VybmVsLm1zZ21heFwiIHwgXCJrZXJuZWwubXNnbW5iXCIgfCBcImtlcm5lbC5tc2dtbmlcIiB8IFwia2VybmVsLnNlbVwiIHwgXCJrZXJuZWwuc2htYWxsXCIgfCBcImtlcm5lbC5zaG1tYXhcIiB8IFwia2VybmVsLnNobW1uaVwiIHwgXCJrZXJuZWwuc2htX3JtaWRfZm9yY2VkXCJgYCwgYW5kIGBgU3lzY3Rsc2BgIHRoYXQgc3RhcnQgd2l0aCBgYFwiZnMubXF1ZXVlLipcImBgXG4gKiAgVmFsaWQgbmV0d29yayBuYW1lc3BhY2UgdmFsdWVzOiBgYFN5c2N0bHNgYCB0aGF0IHN0YXJ0IHdpdGggYGBcIm5ldC4qXCJgYC4gT25seSBuYW1lc3BhY2VkIGBgU3lzY3Rsc2BgIHRoYXQgZXhpc3Qgd2l0aGluIHRoZSBjb250YWluZXIgc3RhcnRpbmcgd2l0aCBcIm5ldC4qIGFyZSBhY2NlcHRlZC5cbiAqICBBbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBzdXBwb3J0ZWQgYnkgRmFyZ2F0ZS5cbiAqL1xuVmFsdWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWVzcGFjZWQga2VybmVsIHBhcmFtZXRlciB0byBzZXQgYSBgYHZhbHVlYGAgZm9yLlxuICovXG5OYW1lc3BhY2U/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgdWxpbWl0YGAgc2V0dGluZ3MgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyLlxuICogIEFtYXpvbiBFQ1MgdGFza3MgaG9zdGVkIG9uIEZBUkdBVEVsb25nIHVzZSB0aGUgZGVmYXVsdCByZXNvdXJjZSBsaW1pdCB2YWx1ZXMgc2V0IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgYGBub2ZpbGVgYCByZXNvdXJjZSBsaW1pdCBwYXJhbWV0ZXIgd2hpY2ggRkFSR0FURWxvbmcgb3ZlcnJpZGVzLiBUaGUgYGBub2ZpbGVgYCByZXNvdXJjZSBsaW1pdCBzZXRzIGEgcmVzdHJpY3Rpb24gb24gdGhlIG51bWJlciBvZiBvcGVuIGZpbGVzIHRoYXQgYSBjb250YWluZXIgY2FuIHVzZS4gVGhlIGRlZmF1bHQgYGBub2ZpbGVgYCBzb2Z0IGxpbWl0IGlzIGBgNjU1MzVgYCBhbmQgdGhlIGRlZmF1bHQgaGFyZCBsaW1pdCBpcyBgYDY1NTM1YGAuXG4gKiAgWW91IGNhbiBzcGVjaWZ5IHRoZSBgYHVsaW1pdGBgIHNldHRpbmdzIGZvciBhIGNvbnRhaW5lciBpbiBhIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbGltaXQge1xuLyoqXG4gKiBUaGUgc29mdCBsaW1pdCBmb3IgdGhlIGBgdWxpbWl0YGAgdHlwZS4gVGhlIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgaW4gYnl0ZXMsIHNlY29uZHMsIG9yIGFzIGEgY291bnQsIGRlcGVuZGluZyBvbiB0aGUgYGB0eXBlYGAgb2YgdGhlIGBgdWxpbWl0YGAuXG4gKi9cblNvZnRMaW1pdDogbnVtYmVyXG4vKipcbiAqIFRoZSBoYXJkIGxpbWl0IGZvciB0aGUgYGB1bGltaXRgYCB0eXBlLiBUaGUgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBpbiBieXRlcywgc2Vjb25kcywgb3IgYXMgYSBjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgYHR5cGVgYCBvZiB0aGUgYGB1bGltaXRgYC5cbiAqL1xuSGFyZExpbWl0OiBudW1iZXJcbi8qKlxuICogVGhlIGBgdHlwZWBgIG9mIHRoZSBgYHVsaW1pdGBgLlxuICovXG5OYW1lOiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIHByaXZhdGUgcmVwb3NpdG9yeSBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyB0byB1c2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3NpdG9yeUNyZWRlbnRpYWxzIHtcbi8qKlxuICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBzZWNyZXQgY29udGFpbmluZyB0aGUgcHJpdmF0ZSByZXBvc2l0b3J5IGNyZWRlbnRpYWxzLlxuICogICBXaGVuIHlvdSB1c2UgdGhlIEFtYXpvbiBFQ1MgQVBJLCBDTEksIG9yIEFXUyBTREssIGlmIHRoZSBzZWNyZXQgZXhpc3RzIGluIHRoZSBzYW1lIFJlZ2lvbiBhcyB0aGUgdGFzayB0aGF0IHlvdSdyZSBsYXVuY2hpbmcgdGhlbiB5b3UgY2FuIHVzZSBlaXRoZXIgdGhlIGZ1bGwgQVJOIG9yIHRoZSBuYW1lIG9mIHRoZSBzZWNyZXQuIFdoZW4geW91IHVzZSB0aGUgQVdTIE1hbmFnZW1lbnQgQ29uc29sZSwgeW91IG11c3Qgc3BlY2lmeSB0aGUgZnVsbCBBUk4gb2YgdGhlIHNlY3JldC5cbiAqL1xuQ3JlZGVudGlhbHNQYXJhbWV0ZXI/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGBgSG9zdEVudHJ5YGAgcHJvcGVydHkgc3BlY2lmaWVzIGEgaG9zdG5hbWUgYW5kIGFuIElQIGFkZHJlc3MgdGhhdCBhcmUgYWRkZWQgdG8gdGhlIGBgL2V0Yy9ob3N0c2BgIGZpbGUgb2YgYSBjb250YWluZXIgdGhyb3VnaCB0aGUgYGBleHRyYUhvc3RzYGAgcGFyYW1ldGVyIG9mIGl0cyBgYENvbnRhaW5lckRlZmluaXRpb25gYCByZXNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0RW50cnkge1xuLyoqXG4gKiBUaGUgaG9zdG5hbWUgdG8gdXNlIGluIHRoZSBgYC9ldGMvaG9zdHNgYCBlbnRyeS5cbiAqL1xuSG9zdG5hbWU/OiBzdHJpbmdcbi8qKlxuICogVGhlIElQIGFkZHJlc3MgdG8gdXNlIGluIHRoZSBgYC9ldGMvaG9zdHNgYCBlbnRyeS5cbiAqL1xuSXBBZGRyZXNzPzogc3RyaW5nXG59XG4vKipcbiAqIExpbnV4LXNwZWNpZmljIG1vZGlmaWNhdGlvbnMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGUgY29udGFpbmVyLCBzdWNoIGFzIExpbnV4IGtlcm5lbCBjYXBhYmlsaXRpZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbS2VybmVsQ2FwYWJpbGl0aWVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0tlcm5lbENhcGFiaWxpdGllcy5odG1sKS5cbiAqICAgVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBjb250YWluZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbnV4UGFyYW1ldGVycyB7XG5DYXBhYmlsaXRpZXM/OiBLZXJuZWxDYXBhYmlsaXRpZXNcbi8qKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHR1bmUgYSBjb250YWluZXIncyBtZW1vcnkgc3dhcHBpbmVzcyBiZWhhdmlvci4gQSBgYHN3YXBwaW5lc3NgYCB2YWx1ZSBvZiBgYDBgYCB3aWxsIGNhdXNlIHN3YXBwaW5nIHRvIG5vdCBoYXBwZW4gdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5LiBBIGBgc3dhcHBpbmVzc2BgIHZhbHVlIG9mIGBgMTAwYGAgd2lsbCBjYXVzZSBwYWdlcyB0byBiZSBzd2FwcGVkIHZlcnkgYWdncmVzc2l2ZWx5LiBBY2NlcHRlZCB2YWx1ZXMgYXJlIHdob2xlIG51bWJlcnMgYmV0d2VlbiBgYDBgYCBhbmQgYGAxMDBgYC4gSWYgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhIGRlZmF1bHQgdmFsdWUgb2YgYGA2MGBgIGlzIHVzZWQuIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgYGBtYXhTd2FwYGAgdGhlbiB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0tbWVtb3J5LXN3YXBwaW5lc3NgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqICBJZiB5b3UncmUgdXNpbmcgdGFza3Mgb24gQW1hem9uIExpbnV4IDIwMjMgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQuXG4gKi9cblN3YXBwaW5lc3M/OiBudW1iZXJcbi8qKlxuICogVGhlIGNvbnRhaW5lciBwYXRoLCBtb3VudCBvcHRpb25zLCBhbmQgc2l6ZSAoaW4gTWlCKSBvZiB0aGUgdG1wZnMgbW91bnQuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS10bXBmc2BgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYHRtcGZzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuVG1wZnM/OiBUbXBmc1tdXG4vKipcbiAqIFRoZSB2YWx1ZSBmb3IgdGhlIHNpemUgKGluIE1pQikgb2YgdGhlIGBgL2Rldi9zaG1gYCB2b2x1bWUuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gdGhlIGBgLS1zaG0tc2l6ZWBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBJZiB5b3UgYXJlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBzaGFyZWRNZW1vcnlTaXplYGAgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKi9cblNoYXJlZE1lbW9yeVNpemU/OiBudW1iZXJcbi8qKlxuICogQW55IGhvc3QgZGV2aWNlcyB0byBleHBvc2UgdG8gdGhlIGNvbnRhaW5lci4gVGhpcyBwYXJhbWV0ZXIgbWFwcyB0byBgYERldmljZXNgYCBpbiB0aGUgZG9ja2VyIGNvbnRhaW5lciBjcmVhdGUgY29tbWFuZCBhbmQgdGhlIGBgLS1kZXZpY2VgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICAgSWYgeW91J3JlIHVzaW5nIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGUgYGBkZXZpY2VzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuRGV2aWNlcz86IERldmljZVtdXG4vKipcbiAqIFJ1biBhbiBgYGluaXRgYCBwcm9jZXNzIGluc2lkZSB0aGUgY29udGFpbmVyIHRoYXQgZm9yd2FyZHMgc2lnbmFscyBhbmQgcmVhcHMgcHJvY2Vzc2VzLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIHRoZSBgYC0taW5pdGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLiBUaGlzIHBhcmFtZXRlciByZXF1aXJlcyB2ZXJzaW9uIDEuMjUgb2YgdGhlIERvY2tlciBSZW1vdGUgQVBJIG9yIGdyZWF0ZXIgb24geW91ciBjb250YWluZXIgaW5zdGFuY2UuIFRvIGNoZWNrIHRoZSBEb2NrZXIgUmVtb3RlIEFQSSB2ZXJzaW9uIG9uIHlvdXIgY29udGFpbmVyIGluc3RhbmNlLCBsb2cgaW4gdG8geW91ciBjb250YWluZXIgaW5zdGFuY2UgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBgc3VkbyBkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLkFQSVZlcnNpb259fSdgYFxuICovXG5Jbml0UHJvY2Vzc0VuYWJsZWQ/OiBib29sZWFuXG4vKipcbiAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygc3dhcCBtZW1vcnkgKGluIE1pQikgYSBjb250YWluZXIgY2FuIHVzZS4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZSBgYC0tbWVtb3J5LXN3YXBgYCBvcHRpb24gdG8gZG9ja2VyIHJ1biB3aGVyZSB0aGUgdmFsdWUgd291bGQgYmUgdGhlIHN1bSBvZiB0aGUgY29udGFpbmVyIG1lbW9yeSBwbHVzIHRoZSBgYG1heFN3YXBgYCB2YWx1ZS5cbiAqICBJZiBhIGBgbWF4U3dhcGBgIHZhbHVlIG9mIGBgMGBgIGlzIHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lciB3aWxsIG5vdCB1c2Ugc3dhcC4gQWNjZXB0ZWQgdmFsdWVzIGFyZSBgYDBgYCBvciBhbnkgcG9zaXRpdmUgaW50ZWdlci4gSWYgdGhlIGBgbWF4U3dhcGBgIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGUgY29udGFpbmVyIHdpbGwgdXNlIHRoZSBzd2FwIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb250YWluZXIgaW5zdGFuY2UgaXQgaXMgcnVubmluZyBvbi4gQSBgYG1heFN3YXBgYCB2YWx1ZSBtdXN0IGJlIHNldCBmb3IgdGhlIGBgc3dhcHBpbmVzc2BgIHBhcmFtZXRlciB0byBiZSB1c2VkLlxuICogICBJZiB5b3UncmUgdXNpbmcgdGFza3MgdGhhdCB1c2UgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsIHRoZSBgYG1heFN3YXBgYCBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuICogIElmIHlvdSdyZSB1c2luZyB0YXNrcyBvbiBBbWF6b24gTGludXggMjAyMyB0aGUgYGBzd2FwcGluZXNzYGAgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZC5cbiAqL1xuTWF4U3dhcD86IG51bWJlclxufVxuLyoqXG4gKiBUaGUgTGludXggY2FwYWJpbGl0aWVzIGZvciB0aGUgY29udGFpbmVyIHRoYXQgYXJlIGFkZGVkIHRvIG9yIGRyb3BwZWQgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IERvY2tlci5cbiAqICAgRm9yIHRhc2tzIHRoYXQgdXNlIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCBgYGNhcGFiaWxpdGllc2BgIGlzIHN1cHBvcnRlZCBmb3IgYWxsIHBsYXRmb3JtIHZlcnNpb25zIGJ1dCB0aGUgYGBhZGRgYCBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgaWYgdXNpbmcgcGxhdGZvcm0gdmVyc2lvbiAxLjQuMCBvciBsYXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXJuZWxDYXBhYmlsaXRpZXMge1xuLyoqXG4gKiBUaGUgTGludXggY2FwYWJpbGl0aWVzIGZvciB0aGUgY29udGFpbmVyIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgRG9ja2VyLiBUaGlzIHBhcmFtZXRlciBtYXBzIHRvIGBgQ2FwQWRkYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tY2FwLWFkZGBgIG9wdGlvbiB0byBkb2NrZXIgcnVuLlxuICogICBUYXNrcyBsYXVuY2hlZCBvbiBGQVJHQVRFbG9uZyBvbmx5IHN1cHBvcnQgYWRkaW5nIHRoZSBgYFNZU19QVFJBQ0VgYCBrZXJuZWwgY2FwYWJpbGl0eS5cbiAqICAgVmFsaWQgdmFsdWVzOiBgYFwiQUxMXCIgfCBcIkFVRElUX0NPTlRST0xcIiB8IFwiQVVESVRfV1JJVEVcIiB8IFwiQkxPQ0tfU1VTUEVORFwiIHwgXCJDSE9XTlwiIHwgXCJEQUNfT1ZFUlJJREVcIiB8IFwiREFDX1JFQURfU0VBUkNIXCIgfCBcIkZPV05FUlwiIHwgXCJGU0VUSURcIiB8IFwiSVBDX0xPQ0tcIiB8IFwiSVBDX09XTkVSXCIgfCBcIktJTExcIiB8IFwiTEVBU0VcIiB8IFwiTElOVVhfSU1NVVRBQkxFXCIgfCBcIk1BQ19BRE1JTlwiIHwgXCJNQUNfT1ZFUlJJREVcIiB8IFwiTUtOT0RcIiB8IFwiTkVUX0FETUlOXCIgfCBcIk5FVF9CSU5EX1NFUlZJQ0VcIiB8IFwiTkVUX0JST0FEQ0FTVFwiIHwgXCJORVRfUkFXXCIgfCBcIlNFVEZDQVBcIiB8IFwiU0VUR0lEXCIgfCBcIlNFVFBDQVBcIiB8IFwiU0VUVUlEXCIgfCBcIlNZU19BRE1JTlwiIHwgXCJTWVNfQk9PVFwiIHwgXCJTWVNfQ0hST09UXCIgfCBcIlNZU19NT0RVTEVcIiB8IFwiU1lTX05JQ0VcIiB8IFwiU1lTX1BBQ0NUXCIgfCBcIlNZU19QVFJBQ0VcIiB8IFwiU1lTX1JBV0lPXCIgfCBcIlNZU19SRVNPVVJDRVwiIHwgXCJTWVNfVElNRVwiIHwgXCJTWVNfVFRZX0NPTkZJR1wiIHwgXCJTWVNMT0dcIiB8IFwiV0FLRV9BTEFSTVwiYGBcbiAqL1xuQWRkPzogc3RyaW5nW11cbi8qKlxuICogVGhlIExpbnV4IGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbnRhaW5lciB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSBEb2NrZXIuIFRoaXMgcGFyYW1ldGVyIG1hcHMgdG8gYGBDYXBEcm9wYGAgaW4gdGhlIGRvY2tlciBjb250YWluZXIgY3JlYXRlIGNvbW1hbmQgYW5kIHRoZSBgYC0tY2FwLWRyb3BgYCBvcHRpb24gdG8gZG9ja2VyIHJ1bi5cbiAqICBWYWxpZCB2YWx1ZXM6IGBgXCJBTExcIiB8IFwiQVVESVRfQ09OVFJPTFwiIHwgXCJBVURJVF9XUklURVwiIHwgXCJCTE9DS19TVVNQRU5EXCIgfCBcIkNIT1dOXCIgfCBcIkRBQ19PVkVSUklERVwiIHwgXCJEQUNfUkVBRF9TRUFSQ0hcIiB8IFwiRk9XTkVSXCIgfCBcIkZTRVRJRFwiIHwgXCJJUENfTE9DS1wiIHwgXCJJUENfT1dORVJcIiB8IFwiS0lMTFwiIHwgXCJMRUFTRVwiIHwgXCJMSU5VWF9JTU1VVEFCTEVcIiB8IFwiTUFDX0FETUlOXCIgfCBcIk1BQ19PVkVSUklERVwiIHwgXCJNS05PRFwiIHwgXCJORVRfQURNSU5cIiB8IFwiTkVUX0JJTkRfU0VSVklDRVwiIHwgXCJORVRfQlJPQURDQVNUXCIgfCBcIk5FVF9SQVdcIiB8IFwiU0VURkNBUFwiIHwgXCJTRVRHSURcIiB8IFwiU0VUUENBUFwiIHwgXCJTRVRVSURcIiB8IFwiU1lTX0FETUlOXCIgfCBcIlNZU19CT09UXCIgfCBcIlNZU19DSFJPT1RcIiB8IFwiU1lTX01PRFVMRVwiIHwgXCJTWVNfTklDRVwiIHwgXCJTWVNfUEFDQ1RcIiB8IFwiU1lTX1BUUkFDRVwiIHwgXCJTWVNfUkFXSU9cIiB8IFwiU1lTX1JFU09VUkNFXCIgfCBcIlNZU19USU1FXCIgfCBcIlNZU19UVFlfQ09ORklHXCIgfCBcIlNZU0xPR1wiIHwgXCJXQUtFX0FMQVJNXCJgYFxuICovXG5Ecm9wPzogc3RyaW5nW11cbn1cbi8qKlxuICogVGhlIGNvbnRhaW5lciBwYXRoLCBtb3VudCBvcHRpb25zLCBhbmQgc2l6ZSBvZiB0aGUgdG1wZnMgbW91bnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG1wZnMge1xuLyoqXG4gKiBUaGUgbWF4aW11bSBzaXplIChpbiBNaUIpIG9mIHRoZSB0bXBmcyB2b2x1bWUuXG4gKi9cblNpemU6IG51bWJlclxuLyoqXG4gKiBUaGUgYWJzb2x1dGUgZmlsZSBwYXRoIHdoZXJlIHRoZSB0bXBmcyB2b2x1bWUgaXMgdG8gYmUgbW91bnRlZC5cbiAqL1xuQ29udGFpbmVyUGF0aD86IHN0cmluZ1xuLyoqXG4gKiBUaGUgbGlzdCBvZiB0bXBmcyB2b2x1bWUgbW91bnQgb3B0aW9ucy5cbiAqICBWYWxpZCB2YWx1ZXM6IGBgXCJkZWZhdWx0c1wiIHwgXCJyb1wiIHwgXCJyd1wiIHwgXCJzdWlkXCIgfCBcIm5vc3VpZFwiIHwgXCJkZXZcIiB8IFwibm9kZXZcIiB8IFwiZXhlY1wiIHwgXCJub2V4ZWNcIiB8IFwic3luY1wiIHwgXCJhc3luY1wiIHwgXCJkaXJzeW5jXCIgfCBcInJlbW91bnRcIiB8IFwibWFuZFwiIHwgXCJub21hbmRcIiB8IFwiYXRpbWVcIiB8IFwibm9hdGltZVwiIHwgXCJkaXJhdGltZVwiIHwgXCJub2RpcmF0aW1lXCIgfCBcImJpbmRcIiB8IFwicmJpbmRcIiB8IFwidW5iaW5kYWJsZVwiIHwgXCJydW5iaW5kYWJsZVwiIHwgXCJwcml2YXRlXCIgfCBcInJwcml2YXRlXCIgfCBcInNoYXJlZFwiIHwgXCJyc2hhcmVkXCIgfCBcInNsYXZlXCIgfCBcInJzbGF2ZVwiIHwgXCJyZWxhdGltZVwiIHwgXCJub3JlbGF0aW1lXCIgfCBcInN0cmljdGF0aW1lXCIgfCBcIm5vc3RyaWN0YXRpbWVcIiB8IFwibW9kZVwiIHwgXCJ1aWRcIiB8IFwiZ2lkXCIgfCBcIm5yX2lub2Rlc1wiIHwgXCJucl9ibG9ja3NcIiB8IFwibXBvbFwiYGBcbiAqL1xuTW91bnRPcHRpb25zPzogc3RyaW5nW11cbn1cbi8qKlxuICogVGhlIGBgRGV2aWNlYGAgcHJvcGVydHkgc3BlY2lmaWVzIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjb250YWluZXIgaW5zdGFuY2UgaG9zdCBkZXZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlIHtcbi8qKlxuICogVGhlIHBhdGggZm9yIHRoZSBkZXZpY2Ugb24gdGhlIGhvc3QgY29udGFpbmVyIGluc3RhbmNlLlxuICovXG5Ib3N0UGF0aD86IHN0cmluZ1xuLyoqXG4gKiBUaGUgZXhwbGljaXQgcGVybWlzc2lvbnMgdG8gcHJvdmlkZSB0byB0aGUgY29udGFpbmVyIGZvciB0aGUgZGV2aWNlLiBCeSBkZWZhdWx0LCB0aGUgY29udGFpbmVyIGhhcyBwZXJtaXNzaW9ucyBmb3IgYGByZWFkYGAsIGBgd3JpdGVgYCwgYW5kIGBgbWtub2RgYCBmb3IgdGhlIGRldmljZS5cbiAqL1xuUGVybWlzc2lvbnM/OiBzdHJpbmdbXVxuLyoqXG4gKiBUaGUgcGF0aCBpbnNpZGUgdGhlIGNvbnRhaW5lciBhdCB3aGljaCB0byBleHBvc2UgdGhlIGhvc3QgZGV2aWNlLlxuICovXG5Db250YWluZXJQYXRoPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSByZXN0YXJ0IHBvbGljeSBmb3IgYSBjb250YWluZXIuIFdoZW4geW91IHNldCB1cCBhIHJlc3RhcnQgcG9saWN5LCBBbWF6b24gRUNTIGNhbiByZXN0YXJ0IHRoZSBjb250YWluZXIgd2l0aG91dCBuZWVkaW5nIHRvIHJlcGxhY2UgdGhlIHRhc2suIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Jlc3RhcnQgaW5kaXZpZHVhbCBjb250YWluZXJzIGluIEFtYXpvbiBFQ1MgdGFza3Mgd2l0aCBjb250YWluZXIgcmVzdGFydCBwb2xpY2llc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvY29udGFpbmVyLXJlc3RhcnQtcG9saWN5Lmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN0YXJ0UG9saWN5IHtcbi8qKlxuICogQSBsaXN0IG9mIGV4aXQgY29kZXMgdGhhdCBBbWF6b24gRUNTIHdpbGwgaWdub3JlIGFuZCBub3QgYXR0ZW1wdCBhIHJlc3RhcnQgb24uIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgNTAgY29udGFpbmVyIGV4aXQgY29kZXMuIEJ5IGRlZmF1bHQsIEFtYXpvbiBFQ1MgZG9lcyBub3QgaWdub3JlIGFueSBleGl0IGNvZGVzLlxuICovXG5JZ25vcmVkRXhpdENvZGVzPzogbnVtYmVyW11cbi8qKlxuICogQSBwZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgdGhhdCB0aGUgY29udGFpbmVyIG11c3QgcnVuIGZvciBiZWZvcmUgYSByZXN0YXJ0IGNhbiBiZSBhdHRlbXB0ZWQuIEEgY29udGFpbmVyIGNhbiBiZSByZXN0YXJ0ZWQgb25seSBvbmNlIGV2ZXJ5IGBgcmVzdGFydEF0dGVtcHRQZXJpb2RgYCBzZWNvbmRzLiBJZiBhIGNvbnRhaW5lciBpc24ndCBhYmxlIHRvIHJ1biBmb3IgdGhpcyB0aW1lIHBlcmlvZCBhbmQgZXhpdHMgZWFybHksIGl0IHdpbGwgbm90IGJlIHJlc3RhcnRlZC4gWW91IGNhbiBzZXQgYSBtaW5pbXVtIGBgcmVzdGFydEF0dGVtcHRQZXJpb2RgYCBvZiA2MCBzZWNvbmRzIGFuZCBhIG1heGltdW0gYGByZXN0YXJ0QXR0ZW1wdFBlcmlvZGBgIG9mIDE4MDAgc2Vjb25kcy4gQnkgZGVmYXVsdCwgYSBjb250YWluZXIgbXVzdCBydW4gZm9yIDMwMCBzZWNvbmRzIGJlZm9yZSBpdCBjYW4gYmUgcmVzdGFydGVkLlxuICovXG5SZXN0YXJ0QXR0ZW1wdFBlcmlvZD86IG51bWJlclxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciBhIHJlc3RhcnQgcG9saWN5IGlzIGVuYWJsZWQgZm9yIHRoZSBjb250YWluZXIuXG4gKi9cbkVuYWJsZWQ/OiBib29sZWFuXG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciBhIHZvbHVtZSBtb3VudCBwb2ludCB0aGF0J3MgdXNlZCBpbiBhIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdW50UG9pbnQge1xuLyoqXG4gKiBJZiB0aGlzIHZhbHVlIGlzIGBgdHJ1ZWBgLCB0aGUgY29udGFpbmVyIGhhcyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSB2b2x1bWUuIElmIHRoaXMgdmFsdWUgaXMgYGBmYWxzZWBgLCB0aGVuIHRoZSBjb250YWluZXIgY2FuIHdyaXRlIHRvIHRoZSB2b2x1bWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgZmFsc2VgYC5cbiAqL1xuUmVhZE9ubHk/OiBib29sZWFuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSB2b2x1bWUgdG8gbW91bnQuIE11c3QgYmUgYSB2b2x1bWUgbmFtZSByZWZlcmVuY2VkIGluIHRoZSBgYG5hbWVgYCBwYXJhbWV0ZXIgb2YgdGFzayBkZWZpbml0aW9uIGBgdm9sdW1lYGAuXG4gKi9cblNvdXJjZVZvbHVtZT86IHN0cmluZ1xuLyoqXG4gKiBUaGUgcGF0aCBvbiB0aGUgY29udGFpbmVyIHRvIG1vdW50IHRoZSBob3N0IHZvbHVtZSBhdC5cbiAqL1xuQ29udGFpbmVyUGF0aD86IHN0cmluZ1xufVxuLyoqXG4gKiBUaGUgYGBDb250YWluZXJEZXBlbmRlbmN5YGAgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lZCBmb3IgY29udGFpbmVyIHN0YXJ0dXAgYW5kIHNodXRkb3duLiBBIGNvbnRhaW5lciBjYW4gY29udGFpbiBtdWx0aXBsZSBkZXBlbmRlbmNpZXMuIFdoZW4gYSBkZXBlbmRlbmN5IGlzIGRlZmluZWQgZm9yIGNvbnRhaW5lciBzdGFydHVwLCBmb3IgY29udGFpbmVyIHNodXRkb3duIGl0IGlzIHJldmVyc2VkLlxuICogIFlvdXIgQW1hem9uIEVDUyBjb250YWluZXIgaW5zdGFuY2VzIHJlcXVpcmUgYXQgbGVhc3QgdmVyc2lvbiAxLjI2LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCB0byBlbmFibGUgY29udGFpbmVyIGRlcGVuZGVuY2llcy4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHVzaW5nIHRoZSBsYXRlc3QgY29udGFpbmVyIGFnZW50IHZlcnNpb24uIEZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGVja2luZyB5b3VyIGFnZW50IHZlcnNpb24gYW5kIHVwZGF0aW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiwgc2VlIFtVcGRhdGluZyB0aGUgQW1hem9uIEVDUyBDb250YWluZXIgQWdlbnRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1hZ2VudC11cGRhdGUuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLiBJZiB5b3UgYXJlIHVzaW5nIGFuIEFtYXpvbiBFQ1Mtb3B0aW1pemVkIExpbnV4IEFNSSwgeW91ciBpbnN0YW5jZSBuZWVkcyBhdCBsZWFzdCB2ZXJzaW9uIDEuMjYuMC0xIG9mIHRoZSBgYGVjcy1pbml0YGAgcGFja2FnZS4gSWYgeW91ciBjb250YWluZXIgaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCBmcm9tIHZlcnNpb24gYGAyMDE5MDMwMWBgIG9yIGxhdGVyLCB0aGVuIHRoZXkgY29udGFpbiB0aGUgcmVxdWlyZWQgdmVyc2lvbnMgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYGBlY3MtaW5pdGBgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtBbWF6b24gRUNTLW9wdGltaXplZCBMaW51eCBBTUldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2Vjcy1vcHRpbWl6ZWRfQU1JLmh0bWwpIGluIHRoZSAqQW1hem9uIEVsYXN0aWMgQ29udGFpbmVyIFNlcnZpY2UgRGV2ZWxvcGVyIEd1aWRlKi5cbiAqICAgRm9yIHRhc2tzIHVzaW5nIHRoZSBGYXJnYXRlIGxhdW5jaCB0eXBlLCB0aGlzIHBhcmFtZXRlciByZXF1aXJlcyB0aGF0IHRoZSB0YXNrIG9yIHNlcnZpY2UgdXNlcyBwbGF0Zm9ybSB2ZXJzaW9uIDEuMy4wIG9yIGxhdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckRlcGVuZGVuY3kge1xuLyoqXG4gKiBUaGUgZGVwZW5kZW5jeSBjb25kaXRpb24gb2YgdGhlIGNvbnRhaW5lci4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGF2YWlsYWJsZSBjb25kaXRpb25zIGFuZCB0aGVpciBiZWhhdmlvcjpcbiAqICAgKyAgYGBTVEFSVGBgIC0gVGhpcyBjb25kaXRpb24gZW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIGxpbmtzIGFuZCB2b2x1bWVzIHRvZGF5LiBJdCB2YWxpZGF0ZXMgdGhhdCBhIGRlcGVuZGVudCBjb250YWluZXIgaXMgc3RhcnRlZCBiZWZvcmUgcGVybWl0dGluZyBvdGhlciBjb250YWluZXJzIHRvIHN0YXJ0LlxuICogICArICBgYENPTVBMRVRFYGAgLSBUaGlzIGNvbmRpdGlvbiB2YWxpZGF0ZXMgdGhhdCBhIGRlcGVuZGVudCBjb250YWluZXIgcnVucyB0byBjb21wbGV0aW9uIChleGl0cykgYmVmb3JlIHBlcm1pdHRpbmcgb3RoZXIgY29udGFpbmVycyB0byBzdGFydC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBub25lc3NlbnRpYWwgY29udGFpbmVycyB0aGF0IHJ1biBhIHNjcmlwdCBhbmQgdGhlbiBleGl0LiBUaGlzIGNvbmRpdGlvbiBjYW4ndCBiZSBzZXQgb24gYW4gZXNzZW50aWFsIGNvbnRhaW5lci5cbiAqICAgKyAgYGBTVUNDRVNTYGAgLSBUaGlzIGNvbmRpdGlvbiBpcyB0aGUgc2FtZSBhcyBgYENPTVBMRVRFYGAsIGJ1dCBpdCBhbHNvIHJlcXVpcmVzIHRoYXQgdGhlIGNvbnRhaW5lciBleGl0cyB3aXRoIGEgYGB6ZXJvYGAgc3RhdHVzLiBUaGlzIGNvbmRpdGlvbiBjYW4ndCBiZSBzZXQgb24gYW4gZXNzZW50aWFsIGNvbnRhaW5lci5cbiAqICAgKyAgYGBIRUFMVEhZYGAgLSBUaGlzIGNvbmRpdGlvbiB2YWxpZGF0ZXMgdGhhdCB0aGUgZGVwZW5kZW50IGNvbnRhaW5lciBwYXNzZXMgaXRzIERvY2tlciBoZWFsdGggY2hlY2sgYmVmb3JlIHBlcm1pdHRpbmcgb3RoZXIgY29udGFpbmVycyB0byBzdGFydC4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkZXBlbmRlbnQgY29udGFpbmVyIGhhcyBoZWFsdGggY2hlY2tzIGNvbmZpZ3VyZWQuIFRoaXMgY29uZGl0aW9uIGlzIGNvbmZpcm1lZCBvbmx5IGF0IHRhc2sgc3RhcnR1cC5cbiAqL1xuQ29uZGl0aW9uPzogc3RyaW5nXG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgY29udGFpbmVyLlxuICovXG5Db250YWluZXJOYW1lPzogc3RyaW5nXG59XG4vKipcbiAqIFRoZSBgYFBvcnRNYXBwaW5nYGAgcHJvcGVydHkgc3BlY2lmaWVzIGEgcG9ydCBtYXBwaW5nLiBQb3J0IG1hcHBpbmdzIGFsbG93IGNvbnRhaW5lcnMgdG8gYWNjZXNzIHBvcnRzIG9uIHRoZSBob3N0IGNvbnRhaW5lciBpbnN0YW5jZSB0byBzZW5kIG9yIHJlY2VpdmUgdHJhZmZpYy4gUG9ydCBtYXBwaW5ncyBhcmUgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uLlxuICogIElmIHlvdSBhcmUgdXNpbmcgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIGV4cG9zZWQgcG9ydHMgc2hvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBgYGNvbnRhaW5lclBvcnRgYC4gVGhlIGBgaG9zdFBvcnRgYCBjYW4gYmUgbGVmdCBibGFuayBvciBpdCBtdXN0IGJlIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBgYGNvbnRhaW5lclBvcnRgYC5cbiAqICBBZnRlciBhIHRhc2sgcmVhY2hlcyB0aGUgYGBSVU5OSU5HYGAgc3RhdHVzLCBtYW51YWwgYW5kIGF1dG9tYXRpYyBob3N0IGFuZCBjb250YWluZXIgcG9ydCBhc3NpZ25tZW50cyBhcmUgdmlzaWJsZSBpbiB0aGUgYGBuZXR3b3JrQmluZGluZ3NgYCBzZWN0aW9uIG9mIFtEZXNjcmliZVRhc2tzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGFza3MuaHRtbCkgQVBJIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3J0TWFwcGluZyB7XG4vKipcbiAqIFRoZSBhcHBsaWNhdGlvbiBwcm90b2NvbCB0aGF0J3MgdXNlZCBmb3IgdGhlIHBvcnQgbWFwcGluZy4gVGhpcyBwYXJhbWV0ZXIgb25seSBhcHBsaWVzIHRvIFNlcnZpY2UgQ29ubmVjdC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHNldCB0aGlzIHBhcmFtZXRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHByb3RvY29sIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB1c2VzLiBJZiB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyLCBBbWF6b24gRUNTIGFkZHMgcHJvdG9jb2wtc3BlY2lmaWMgY29ubmVjdGlvbiBoYW5kbGluZyB0byB0aGUgU2VydmljZSBDb25uZWN0IHByb3h5LiBJZiB5b3Ugc2V0IHRoaXMgcGFyYW1ldGVyLCBBbWF6b24gRUNTIGFkZHMgcHJvdG9jb2wtc3BlY2lmaWMgdGVsZW1ldHJ5IGluIHRoZSBBbWF6b24gRUNTIGNvbnNvbGUgYW5kIENsb3VkV2F0Y2guXG4gKiAgSWYgeW91IGRvbid0IHNldCBhIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciwgdGhlbiBUQ1AgaXMgdXNlZC4gSG93ZXZlciwgQW1hem9uIEVDUyBkb2Vzbid0IGFkZCBwcm90b2NvbC1zcGVjaWZpYyB0ZWxlbWV0cnkgZm9yIFRDUC5cbiAqICBgYGFwcFByb3RvY29sYGAgaXMgaW1tdXRhYmxlIGluIGEgU2VydmljZSBDb25uZWN0IHNlcnZpY2UuIFVwZGF0aW5nIHRoaXMgZmllbGQgcmVxdWlyZXMgYSBzZXJ2aWNlIGRlbGV0aW9uIGFuZCByZWRlcGxveW1lbnQuXG4gKiAgVGFza3MgdGhhdCBydW4gaW4gYSBuYW1lc3BhY2UgY2FuIHVzZSBzaG9ydCBuYW1lcyB0byBjb25uZWN0IHRvIHNlcnZpY2VzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNhbiBjb25uZWN0IHRvIHNlcnZpY2VzIGFjcm9zcyBhbGwgb2YgdGhlIGNsdXN0ZXJzIGluIHRoZSBuYW1lc3BhY2UuIFRhc2tzIGNvbm5lY3QgdGhyb3VnaCBhIG1hbmFnZWQgcHJveHkgY29udGFpbmVyIHRoYXQgY29sbGVjdHMgbG9ncyBhbmQgbWV0cmljcyBmb3IgaW5jcmVhc2VkIHZpc2liaWxpdHkuIE9ubHkgdGhlIHRhc2tzIHRoYXQgQW1hem9uIEVDUyBzZXJ2aWNlcyBjcmVhdGUgYXJlIHN1cHBvcnRlZCB3aXRoIFNlcnZpY2UgQ29ubmVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbU2VydmljZSBDb25uZWN0XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXJ2aWNlLWNvbm5lY3QuaHRtbCkgaW4gdGhlICpBbWF6b24gRWxhc3RpYyBDb250YWluZXIgU2VydmljZSBEZXZlbG9wZXIgR3VpZGUqLlxuICovXG5BcHBQcm90b2NvbD86IChcImh0dHBcIiB8IFwiaHR0cDJcIiB8IFwiZ3JwY1wiKVxuLyoqXG4gKiBUaGUgcG9ydCBudW1iZXIgcmFuZ2Ugb24gdGhlIGNvbnRhaW5lciB0aGF0J3MgYm91bmQgdG8gdGhlIGR5bmFtaWNhbGx5IG1hcHBlZCBob3N0IHBvcnQgcmFuZ2UuIFxuICogIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgd2hlbiB5b3Ugc3BlY2lmeSBhIGBgY29udGFpbmVyUG9ydFJhbmdlYGA6XG4gKiAgICsgIFlvdSBtdXN0IHVzZSBlaXRoZXIgdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlIG9yIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZS5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGZvciBib3RoIHRoZSBFQzIgYW5kIEZBUkdBVEVsb25nIGxhdW5jaCB0eXBlcy5cbiAqICAgKyAgVGhpcyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlIGZvciBib3RoIHRoZSBMaW51eCBhbmQgV2luZG93cyBvcGVyYXRpbmcgc3lzdGVtcy5cbiAqICAgKyAgVGhlIGNvbnRhaW5lciBpbnN0YW5jZSBtdXN0IGhhdmUgYXQgbGVhc3QgdmVyc2lvbiAxLjY3LjAgb2YgdGhlIGNvbnRhaW5lciBhZ2VudCBhbmQgYXQgbGVhc3QgdmVyc2lvbiAxLjY3LjAtMSBvZiB0aGUgYGBlY3MtaW5pdGBgIHBhY2thZ2UgXG4gKiAgICsgIFlvdSBjYW4gc3BlY2lmeSBhIG1heGltdW0gb2YgMTAwIHBvcnQgcmFuZ2VzIHBlciBjb250YWluZXIuXG4gKiAgICsgIFlvdSBkbyBub3Qgc3BlY2lmeSBhIGBgaG9zdFBvcnRSYW5nZWBgLiBUaGUgdmFsdWUgb2YgdGhlIGBgaG9zdFBvcnRSYW5nZWBgIGlzIHNldCBhcyBmb2xsb3dzOlxuICogICArICBGb3IgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBuZXR3b3JrIG1vZGUsIHRoZSBgYGhvc3RQb3J0UmFuZ2VgYCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydFJhbmdlYGAuIFRoaXMgaXMgYSBzdGF0aWMgbWFwcGluZyBzdHJhdGVneS5cbiAqICAgKyAgRm9yIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYnJpZGdlYGAgbmV0d29yayBtb2RlLCB0aGUgQW1hem9uIEVDUyBhZ2VudCBmaW5kcyBvcGVuIGhvc3QgcG9ydHMgZnJvbSB0aGUgZGVmYXVsdCBlcGhlbWVyYWwgcmFuZ2UgYW5kIHBhc3NlcyBpdCB0byBkb2NrZXIgdG8gYmluZCB0aGVtIHRvIHRoZSBjb250YWluZXIgcG9ydHMuXG4gKiAgIFxuICogICArICBUaGUgYGBjb250YWluZXJQb3J0UmFuZ2VgYCB2YWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4gMSBhbmQgNjU1MzUuXG4gKiAgICsgIEEgcG9ydCBjYW4gb25seSBiZSBpbmNsdWRlZCBpbiBvbmUgcG9ydCBtYXBwaW5nIHBlciBjb250YWluZXIuXG4gKiAgICsgIFlvdSBjYW5ub3Qgc3BlY2lmeSBvdmVybGFwcGluZyBwb3J0IHJhbmdlcy5cbiAqICAgKyAgVGhlIGZpcnN0IHBvcnQgaW4gdGhlIHJhbmdlIG11c3QgYmUgbGVzcyB0aGFuIGxhc3QgcG9ydCBpbiB0aGUgcmFuZ2UuXG4gKiAgICsgIERvY2tlciByZWNvbW1lbmRzIHRoYXQgeW91IHR1cm4gb2ZmIHRoZSBkb2NrZXItcHJveHkgaW4gdGhlIERvY2tlciBkYWVtb24gY29uZmlnIGZpbGUgd2hlbiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiBwb3J0cy5cbiAqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtJc3N1ZSAjMTExODVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9odHRwczovL2dpdGh1Yi5jb20vbW9ieS9tb2J5L2lzc3Vlcy8xMTE4NSkgb24gdGhlIEdpdGh1YiB3ZWJzaXRlLlxuICogIEZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdHVybiBvZmYgdGhlIGRvY2tlci1wcm94eSBpbiB0aGUgRG9ja2VyIGRhZW1vbiBjb25maWcgZmlsZSwgc2VlIFtEb2NrZXIgZGFlbW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9ib290c3RyYXBfY29udGFpbmVyX2luc3RhbmNlLmh0bWwjYm9vdHN0cmFwX2RvY2tlcl9kYWVtb24pIGluIHRoZSAqQW1hem9uIEVDUyBEZXZlbG9wZXIgR3VpZGUqLlxuICogICBcbiAqICBZb3UgY2FuIGNhbGwgW0Rlc2NyaWJlVGFza3NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUYXNrcy5odG1sKSB0byB2aWV3IHRoZSBgYGhvc3RQb3J0UmFuZ2VgYCB3aGljaCBhcmUgdGhlIGhvc3QgcG9ydHMgdGhhdCBhcmUgYm91bmQgdG8gdGhlIGNvbnRhaW5lciBwb3J0cy5cbiAqL1xuQ29udGFpbmVyUG9ydFJhbmdlPzogc3RyaW5nXG4vKipcbiAqIFRoZSBwb3J0IG51bWJlciBvbiB0aGUgY29udGFpbmVyIGluc3RhbmNlIHRvIHJlc2VydmUgZm9yIHlvdXIgY29udGFpbmVyLlxuICogIElmIHlvdSBzcGVjaWZ5IGEgYGBjb250YWluZXJQb3J0UmFuZ2VgYCwgbGVhdmUgdGhpcyBmaWVsZCBlbXB0eSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBgYGhvc3RQb3J0YGAgaXMgc2V0IGFzIGZvbGxvd3M6XG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGF3c3ZwY2BgIG5ldHdvcmsgbW9kZSwgdGhlIGBgaG9zdFBvcnRgYCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGBgY29udGFpbmVyUG9ydGBgLiBUaGlzIGlzIGEgc3RhdGljIG1hcHBpbmcgc3RyYXRlZ3kuXG4gKiAgICsgIEZvciBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSwgdGhlIEFtYXpvbiBFQ1MgYWdlbnQgZmluZHMgb3BlbiBwb3J0cyBvbiB0aGUgaG9zdCBhbmQgYXV0b21hdGljYWxseSBiaW5kcyB0aGVtIHRvIHRoZSBjb250YWluZXIgcG9ydHMuIFRoaXMgaXMgYSBkeW5hbWljIG1hcHBpbmcgc3RyYXRlZ3kuXG4gKiAgIFxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBhd3N2cGNgYCBvciBgYGhvc3RgYCBuZXR3b3JrIG1vZGUsIHRoZSBgYGhvc3RQb3J0YGAgY2FuIGVpdGhlciBiZSBsZWZ0IGJsYW5rIG9yIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYGBjb250YWluZXJQb3J0YGAuXG4gKiAgSWYgeW91IHVzZSBjb250YWluZXJzIGluIGEgdGFzayB3aXRoIHRoZSBgYGJyaWRnZWBgIG5ldHdvcmsgbW9kZSwgeW91IGNhbiBzcGVjaWZ5IGEgbm9uLXJlc2VydmVkIGhvc3QgcG9ydCBmb3IgeW91ciBjb250YWluZXIgcG9ydCBtYXBwaW5nLCBvciB5b3UgY2FuIG9taXQgdGhlIGBgaG9zdFBvcnRgYCAob3Igc2V0IGl0IHRvIGBgMGBgKSB3aGlsZSBzcGVjaWZ5aW5nIGEgYGBjb250YWluZXJQb3J0YGAgYW5kIHlvdXIgY29udGFpbmVyIGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZSBmb3IgeW91ciBjb250YWluZXIgaW5zdGFuY2Ugb3BlcmF0aW5nIHN5c3RlbSBhbmQgRG9ja2VyIHZlcnNpb24uXG4gKiAgVGhlIGRlZmF1bHQgZXBoZW1lcmFsIHBvcnQgcmFuZ2UgZm9yIERvY2tlciB2ZXJzaW9uIDEuNi4wIGFuZCBsYXRlciBpcyBsaXN0ZWQgb24gdGhlIGluc3RhbmNlIHVuZGVyIGBgL3Byb2Mvc3lzL25ldC9pcHY0L2lwX2xvY2FsX3BvcnRfcmFuZ2VgYC4gSWYgdGhpcyBrZXJuZWwgcGFyYW1ldGVyIGlzIHVuYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCBlcGhlbWVyYWwgcG9ydCByYW5nZSBmcm9tIDQ5MTUzIHRocm91Z2ggNjU1MzUgKExpbnV4KSBvciA0OTE1MiB0aHJvdWdoIDY1NTM1IChXaW5kb3dzKSBpcyB1c2VkLiBEbyBub3QgYXR0ZW1wdCB0byBzcGVjaWZ5IGEgaG9zdCBwb3J0IGluIHRoZSBlcGhlbWVyYWwgcG9ydCByYW5nZSBhcyB0aGVzZSBhcmUgcmVzZXJ2ZWQgZm9yIGF1dG9tYXRpYyBhc3NpZ25tZW50LiBJbiBnZW5lcmFsLCBwb3J0cyBiZWxvdyAzMjc2OCBhcmUgb3V0c2lkZSBvZiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UuXG4gKiAgVGhlIGRlZmF1bHQgcmVzZXJ2ZWQgcG9ydHMgYXJlIDIyIGZvciBTU0gsIHRoZSBEb2NrZXIgcG9ydHMgMjM3NSBhbmQgMjM3NiwgYW5kIHRoZSBBbWF6b24gRUNTIGNvbnRhaW5lciBhZ2VudCBwb3J0cyA1MTY3OC01MTY4MC4gQW55IGhvc3QgcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNwZWNpZmllZCBpbiBhIHJ1bm5pbmcgdGFzayBpcyBhbHNvIHJlc2VydmVkIHdoaWxlIHRoZSB0YXNrIGlzIHJ1bm5pbmcuIFRoYXQgaXMsIGFmdGVyIGEgdGFzayBzdG9wcywgdGhlIGhvc3QgcG9ydCBpcyByZWxlYXNlZC4gVGhlIGN1cnJlbnQgcmVzZXJ2ZWQgcG9ydHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgYGByZW1haW5pbmdSZXNvdXJjZXNgYCBvZiBbRGVzY3JpYmVDb250YWluZXJJbnN0YW5jZXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVDb250YWluZXJJbnN0YW5jZXMuaHRtbCkgb3V0cHV0LiBBIGNvbnRhaW5lciBpbnN0YW5jZSBjYW4gaGF2ZSB1cCB0byAxMDAgcmVzZXJ2ZWQgcG9ydHMgYXQgYSB0aW1lLiBUaGlzIG51bWJlciBpbmNsdWRlcyB0aGUgZGVmYXVsdCByZXNlcnZlZCBwb3J0cy4gQXV0b21hdGljYWxseSBhc3NpZ25lZCBwb3J0cyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIDEwMCByZXNlcnZlZCBwb3J0cyBxdW90YS5cbiAqL1xuSG9zdFBvcnQ/OiBudW1iZXJcbi8qKlxuICogVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBjb250YWluZXIgdGhhdCdzIGJvdW5kIHRvIHRoZSB1c2VyLXNwZWNpZmllZCBvciBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGhvc3QgcG9ydC5cbiAqICBJZiB5b3UgdXNlIGNvbnRhaW5lcnMgaW4gYSB0YXNrIHdpdGggdGhlIGBgYXdzdnBjYGAgb3IgYGBob3N0YGAgbmV0d29yayBtb2RlLCBzcGVjaWZ5IHRoZSBleHBvc2VkIHBvcnRzIHVzaW5nIGBgY29udGFpbmVyUG9ydGBgLlxuICogIElmIHlvdSB1c2UgY29udGFpbmVycyBpbiBhIHRhc2sgd2l0aCB0aGUgYGBicmlkZ2VgYCBuZXR3b3JrIG1vZGUgYW5kIHlvdSBzcGVjaWZ5IGEgY29udGFpbmVyIHBvcnQgYW5kIG5vdCBhIGhvc3QgcG9ydCwgeW91ciBjb250YWluZXIgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGhvc3QgcG9ydCBpbiB0aGUgZXBoZW1lcmFsIHBvcnQgcmFuZ2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgYGBob3N0UG9ydGBgLiBQb3J0IG1hcHBpbmdzIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaW4gdGhpcyB3YXkgZG8gbm90IGNvdW50IHRvd2FyZCB0aGUgMTAwIHJlc2VydmVkIHBvcnRzIGxpbWl0IG9mIGEgY29udGFpbmVyIGluc3RhbmNlLlxuICovXG5Db250YWluZXJQb3J0PzogbnVtYmVyXG4vKipcbiAqIFRoZSBwcm90b2NvbCB1c2VkIGZvciB0aGUgcG9ydCBtYXBwaW5nLiBWYWxpZCB2YWx1ZXMgYXJlIGBgdGNwYGAgYW5kIGBgdWRwYGAuIFRoZSBkZWZhdWx0IGlzIGBgdGNwYGAuIGBgcHJvdG9jb2xgYCBpcyBpbW11dGFibGUgaW4gYSBTZXJ2aWNlIENvbm5lY3Qgc2VydmljZS4gVXBkYXRpbmcgdGhpcyBmaWVsZCByZXF1aXJlcyBhIHNlcnZpY2UgZGVsZXRpb24gYW5kIHJlZGVwbG95bWVudC5cbiAqL1xuUHJvdG9jb2w/OiBzdHJpbmdcbi8qKlxuICogVGhlIG5hbWUgdGhhdCdzIHVzZWQgZm9yIHRoZSBwb3J0IG1hcHBpbmcuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIHRoYXQgeW91IHVzZSBpbiB0aGUgYGBzZXJ2aWNlQ29ubmVjdENvbmZpZ3VyYXRpb25gYCBhbmQgdGhlIGBgdnBjTGF0dGljZUNvbmZpZ3VyYXRpb25zYGAgb2YgYSBzZXJ2aWNlLiBUaGUgbmFtZSBjYW4gaW5jbHVkZSB1cCB0byA2NCBjaGFyYWN0ZXJzLiBUaGUgY2hhcmFjdGVycyBjYW4gaW5jbHVkZSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZXMgKF8pLCBhbmQgaHlwaGVucyAoLSkuIFRoZSBuYW1lIGNhbid0IHN0YXJ0IHdpdGggYSBoeXBoZW4uXG4gKi9cbk5hbWU/OiBzdHJpbmdcbn1cbi8qKlxuICogVGhlIGVwaGVtZXJhbCBzdG9yYWdlIHNldHRpbmdzIHRvIHVzZSBmb3IgdGFza3MgcnVuIHdpdGggdGhlIHRhc2sgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcGhlbWVyYWxTdG9yYWdlIHtcbi8qKlxuICogVGhlIHRvdGFsIGFtb3VudCwgaW4gR2lCLCBvZiBlcGhlbWVyYWwgc3RvcmFnZSB0byBzZXQgZm9yIHRoZSB0YXNrLiBUaGUgbWluaW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgYGAyMWBgIEdpQiBhbmQgdGhlIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIGBgMjAwYGAgR2lCLlxuICovXG5TaXplSW5HaUI/OiBudW1iZXJcbn1cbi8qKlxuICogVGhlIG1ldGFkYXRhIHRoYXQgeW91IGFwcGx5IHRvIGEgcmVzb3VyY2UgdG8gaGVscCB5b3UgY2F0ZWdvcml6ZSBhbmQgb3JnYW5pemUgdGhlbS4gRWFjaCB0YWcgY29uc2lzdHMgb2YgYSBrZXkgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLiBZb3UgZGVmaW5lIHRoZW0uXG4gKiAgVGhlIGZvbGxvd2luZyBiYXNpYyByZXN0cmljdGlvbnMgYXBwbHkgdG8gdGFnczpcbiAqICAgKyAgTWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgcmVzb3VyY2UgLSA1MFxuICogICArICBGb3IgZWFjaCByZXNvdXJjZSwgZWFjaCB0YWcga2V5IG11c3QgYmUgdW5pcXVlLCBhbmQgZWFjaCB0YWcga2V5IGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlLlxuICogICArICBNYXhpbXVtIGtleSBsZW5ndGggLSAxMjggVW5pY29kZSBjaGFyYWN0ZXJzIGluIFVURi04XG4gKiAgICsgIE1heGltdW0gdmFsdWUgbGVuZ3RoIC0gMjU2IFVuaWNvZGUgY2hhcmFjdGVycyBpbiBVVEYtOFxuICogICArICBJZiB5b3VyIHRhZ2dpbmcgc2NoZW1hIGlzIHVzZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCByZXNvdXJjZXMsIHJlbWVtYmVyIHRoYXQgb3RoZXIgc2VydmljZXMgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIGFsbG93ZWQgY2hhcmFjdGVycy4gR2VuZXJhbGx5IGFsbG93ZWQgY2hhcmFjdGVycyBhcmU6IGxldHRlcnMsIG51bWJlcnMsIGFuZCBzcGFjZXMgcmVwcmVzZW50YWJsZSBpbiBVVEYtOCwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogKyAtID0gLiBfIDogLyBALlxuICogICArICBUYWcga2V5cyBhbmQgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAqICAgKyAgRG8gbm90IHVzZSBgYGF3czpgYCwgYGBBV1M6YGAsIG9yIGFueSB1cHBlciBvciBsb3dlcmNhc2UgY29tYmluYXRpb24gb2Ygc3VjaCBhcyBhIHByZWZpeCBmb3IgZWl0aGVyIGtleXMgb3IgdmFsdWVzIGFzIGl0IGlzIHJlc2VydmVkIGZvciBBV1MgdXNlLiBZb3UgY2Fubm90IGVkaXQgb3IgZGVsZXRlIHRhZyBrZXlzIG9yIHZhbHVlcyB3aXRoIHRoaXMgcHJlZml4LiBUYWdzIHdpdGggdGhpcyBwcmVmaXggZG8gbm90IGNvdW50IGFnYWluc3QgeW91ciB0YWdzIHBlciByZXNvdXJjZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWcge1xuLyoqXG4gKiBUaGUgb3B0aW9uYWwgcGFydCBvZiBhIGtleS12YWx1ZSBwYWlyIHRoYXQgbWFrZSB1cCBhIHRhZy4gQSBgYHZhbHVlYGAgYWN0cyBhcyBhIGRlc2NyaXB0b3Igd2l0aGluIGEgdGFnIGNhdGVnb3J5IChrZXkpLlxuICovXG5WYWx1ZT86IHN0cmluZ1xuLyoqXG4gKiBPbmUgcGFydCBvZiBhIGtleS12YWx1ZSBwYWlyIHRoYXQgbWFrZSB1cCBhIHRhZy4gQSBgYGtleWBgIGlzIGEgZ2VuZXJhbCBsYWJlbCB0aGF0IGFjdHMgbGlrZSBhIGNhdGVnb3J5IGZvciBtb3JlIHNwZWNpZmljIHRhZyB2YWx1ZXMuXG4gKi9cbktleT86IHN0cmluZ1xufVxuIl19