mobx-keystone 0.69.2 → 0.69.3
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.
- package/CHANGELOG.md +4 -0
- package/dist/mobx-keystone.esm.mjs +1 -1
- package/dist/mobx-keystone.umd.js +1 -1
- package/dist/types/dataModel/BaseDataModel.d.ts +3 -3
- package/dist/types/dataModel/DataModel.d.ts +3 -3
- package/dist/types/model/BaseModel.d.ts +2 -2
- package/dist/types/model/Model.d.ts +2 -2
- package/dist/types/modelShared/BaseModelShared.d.ts +9 -9
- package/dist/types/modelShared/prop.d.ts +2 -2
- package/dist/types/types/objectBased/typesDataModelData.d.ts +2 -2
- package/package.json +3 -3
- package/src/dataModel/BaseDataModel.ts +7 -5
- package/src/dataModel/DataModel.ts +5 -5
- package/src/dataModel/newDataModel.ts +2 -2
- package/src/model/BaseModel.ts +2 -2
- package/src/model/Model.ts +2 -2
- package/src/model/newModel.ts +2 -2
- package/src/modelShared/BaseModelShared.ts +10 -11
- package/src/modelShared/prop.ts +2 -2
- package/src/types/objectBased/typesDataModelData.ts +11 -2
|
@@ -8249,4 +8249,4 @@ var __publicField = (obj, key, value) => {
|
|
|
8249
8249
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
8250
8250
|
exports2[Symbol.toStringTag] = "Module";
|
|
8251
8251
|
});
|
|
8252
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhTW9kZWwvYWN0aW9ucy50cyIsIi4uL3NyYy9hY3Rpb24vYnVpbHRJbkFjdGlvbnMudHMiLCIuLi9zcmMvYWN0aW9uL2NvbnRleHQudHMiLCIuLi9zcmMvYWN0aW9uL2lzTW9kZWxBY3Rpb24udHMiLCIuLi9zcmMvbW9kZWwvbWV0YWRhdGEudHMiLCIuLi9zcmMvdXRpbHMvaW5kZXgudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsSW5mby50cyIsIi4uL3NyYy91dGlscy9tYXBVdGlscy50cyIsIi4uL3NyYy9wYXJlbnQvY29yZS50cyIsIi4uL3NyYy90d2Vha2VyL2NvcmUudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzLnRzIiwiLi4vc3JjL21vZGVsL2dldE1vZGVsTWV0YWRhdGEudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm8udHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvcHJvcC50cyIsIi4uL3NyYy90eXBlcy9nZXRUeXBlSW5mby50cyIsIi4uL3NyYy90eXBlcy9UeXBlQ2hlY2tFcnJvci50cyIsIi4uL3NyYy90eXBlcy9UeXBlQ2hlY2tlci50cyIsIi4uL3NyYy90eXBlcy9vYmplY3RCYXNlZC90eXBlc01vZGVsLnRzIiwiLi4vc3JjL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlLnRzIiwiLi4vc3JjL3R5cGVzL3JlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVycy50cyIsIi4uL3NyYy90eXBlcy9yZXNvbHZlVHlwZUNoZWNrZXIudHMiLCIuLi9zcmMvc25hcHNob3QvaW50ZXJuYWwudHMiLCIuLi9zcmMvc25hcHNob3QvZ2V0U25hcHNob3QudHMiLCIuLi9zcmMvdHlwZXMvdHlwZUNoZWNrLnRzIiwiLi4vbm9kZV9tb2R1bGVzL25hbm9pZC9ub24tc2VjdXJlL2luZGV4LmpzIiwiLi4vc3JjL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWcudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxDbGFzc0luaXRpYWxpemVyLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL25ld01vZGVsLnRzIiwiLi4vc3JjL2FjdGlvbi9wcm90ZWN0aW9uLnRzIiwiLi4vc3JjL2FjdGlvbi9wZW5kaW5nQWN0aW9ucy50cyIsIi4uL3NyYy9hY3Rpb24vaG9va0FjdGlvbnMudHMiLCIuLi9zcmMvcGFyZW50L2NvcmVPYmplY3RDaGlsZHJlbi50cyIsIi4uL3NyYy9wYXJlbnQvd2Fsa1RyZWUudHMiLCIuLi9zcmMvcm9vdFN0b3JlL2F0dGFjaERldGFjaC50cyIsIi4uL3NyYy9yb290U3RvcmUvcm9vdFN0b3JlLnRzIiwiLi4vc3JjL3BhdGNoL2VtaXRQYXRjaC50cyIsIi4uL3NyYy9kYXRhTW9kZWwvZ2V0RGF0YU1vZGVsTWV0YWRhdGEudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNEYXRhTW9kZWxEYXRhLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC9uZXdEYXRhTW9kZWwudHMiLCIuLi9zcmMvZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWwudHMiLCIuLi9zcmMvZGF0YU1vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2Zyb3plbi9Gcm96ZW4udHMiLCIuLi9zcmMvdHdlYWtlci9Ud2Vha2VyUHJpb3JpdHkudHMiLCIuLi9zcmMvdHdlYWtlci90d2Vha0Zyb3plbi50cyIsIi4uL3NyYy9wYXJlbnQvZmluZFBhcmVudC50cyIsIi4uL3NyYy9wYXJlbnQvZ2V0Q2hpbGRyZW5PYmplY3RzLnRzIiwiLi4vc3JjL3BhcmVudC9maW5kQ2hpbGRyZW4udHMiLCIuLi9zcmMvcGFyZW50L29uQ2hpbGRBdHRhY2hlZFRvLnRzIiwiLi4vc3JjL3BhcmVudC9wYXRoMi50cyIsIi4uL3NyYy90d2Vha2VyL3dpdGhvdXRUeXBlQ2hlY2tpbmcudHMiLCIuLi9zcmMvc25hcHNob3QvU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlQXJyYXlTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWNvbmNpbGVGcm96ZW5TbmFwc2hvdC50cyIsIi4uL25vZGVfbW9kdWxlcy9mYXN0LWRlZXAtZXF1YWwvZXM2L2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzL01vZGVsUG9vbC50cyIsIi4uL3NyYy9zbmFwc2hvdC9hcHBseVNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L29uU25hcHNob3QudHMiLCIuLi9zcmMvdHJlZVV0aWxzL2RlZXBFcXVhbHMudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlTW9kZWxTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzLnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlY29uY2lsZVNuYXBzaG90LnRzIiwiLi4vc3JjL3BhdGNoL2FwcGx5UGF0Y2hlcy50cyIsIi4uL3NyYy90d2Vha2VyL3R5cGVDaGVja2luZy50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrUGxhaW5PYmplY3QudHMiLCIuLi9zcmMvdHdlYWtlci9yZWdpc3RlckRlZmF1bHRUd2Vha2Vycy50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrLnRzIiwiLi4vc3JjL3R3ZWFrZXIvdHdlYWtBcnJheS50cyIsIi4uL3NyYy9zbmFwc2hvdC9mcm9tQXJyYXlTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9mcm9tRnJvemVuU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbU1vZGVsU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbVBsYWluT2JqZWN0U25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvcmVnaXN0ZXJEZWZhdWx0U25hcHNob3R0ZXJzLnRzIiwiLi4vc3JjL3NuYXBzaG90L2Zyb21TbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9jbG9uZS50cyIsIi4uL3NyYy9wYXJlbnQvc2V0UGFyZW50LnRzIiwiLi4vc3JjL3R3ZWFrZXIvdHdlYWtNb2RlbC50cyIsIi4uL3NyYy9tb2RlbC9uZXdNb2RlbC50cyIsIi4uL3NyYy9tb2RlbC9CYXNlTW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvcGFyZW50L3BhdGgudHMiLCIuLi9zcmMvYWN0aW9uL21pZGRsZXdhcmUudHMiLCIuLi9zcmMvYWN0aW9uL3dyYXBJbkFjdGlvbi50cyIsIi4uL3NyYy9wYXJlbnQvZGV0YWNoLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL2NoZWNrTW9kZWxEZWNvcmF0b3JBcmdzLnRzIiwiLi4vc3JjL2FjdGlvbi9hY3Rpb25EZWNvcmF0b3JVdGlscy50cyIsIi4uL3NyYy9hY3Rpb24vbW9kZWxGbG93LnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9hY3Rpb25zLnRzIiwiLi4vc3JjL2FjdGlvbi9hcHBseURlbGV0ZS50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlNZXRob2RDYWxsLnRzIiwiLi4vc3JjL2FjdGlvbi9hcHBseVNldC50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlBY3Rpb24udHMiLCIuLi9zcmMvYWN0aW9uL21vZGVsQWN0aW9uLnRzIiwiLi4vc3JjL2FjdGlvbi9ydW5VbnByb3RlY3RlZC50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL2NvcmUudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9hcnJheVNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9kYXRlU2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL21hcFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvdXRpbHMudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9vYmplY3RQYXRoU2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL29iamVjdFNuYXBzaG90U2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL3BsYWluT2JqZWN0U2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL3ByaW1pdGl2ZVNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9zZXRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vYWN0aW9uU2VyaWFsaXphdGlvbi50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL2FwcGx5U2VyaWFsaXplZEFjdGlvbi50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25UcmFja2luZ01pZGRsZXdhcmUudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvb25BY3Rpb25NaWRkbGV3YXJlLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL3JlYWRvbmx5TWlkZGxld2FyZS50cyIsIi4uL3NyYy9wYXRjaC9qc29uUGF0Y2gudHMiLCIuLi9zcmMvcGF0Y2gvcGF0Y2hSZWNvcmRlci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy90cmFuc2FjdGlvbk1pZGRsZXdhcmUudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNPYmplY3QudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc1VuY2hlY2tlZC50cyIsIi4uL3NyYy90eXBlcy91dGlsaXR5L3R5cGVzT3IudHMiLCIuLi9zcmMvdHlwZXMvdFByb3AudHMiLCIuLi9zcmMvdXRpbHMvY2hhaW5GbnMudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvdXRpbHMudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvc2hhcmVkSW50ZXJuYWxNb2RlbC50cyIsIi4uL3NyYy9tb2RlbC9Nb2RlbC50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9tb2RlbERlY29yYXRvci50cyIsIi4uL3NyYy90eXBlcy9hcnJheUJhc2VkL3R5cGVzQXJyYXkudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvdW5kb01pZGRsZXdhcmUudHMiLCIuLi9zcmMvY29udGV4dC9jb250ZXh0LnRzIiwiLi4vc3JjL2NvbXB1dGVkVHJlZS9jb21wdXRlZFRyZWUudHMiLCIuLi9zcmMvZGF0YU1vZGVsL0RhdGFNb2RlbC50cyIsIi4uL3NyYy9yZWR1eC9jb25uZWN0UmVkdXhEZXZUb29scy50cyIsIi4uL3NyYy9yZWR1eC9yZWR1eC50cyIsIi4uL3NyYy9yZWYvUmVmLnRzIiwiLi4vc3JjL3JlZi9jb3JlLnRzIiwiLi4vc3JjL3JlZi9jdXN0b21SZWYudHMiLCIuLi9zcmMvcmVmL3Jvb3RSZWYudHMiLCIuLi9zcmMvc3RhbmRhcmRBY3Rpb25zL3N0YW5kYWxvbmVBY3Rpb25zLnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9hcnJheUFjdGlvbnMudHMiLCIuLi9zcmMvc3RhbmRhcmRBY3Rpb25zL29iamVjdEFjdGlvbnMudHMiLCIuLi9zcmMvdXRpbHMvdGFnLnRzIiwiLi4vc3JjL3dyYXBwZXJzL2FzTWFwLnRzIiwiLi4vc3JjL3RyYW5zZm9ybXMvYXNNYXAudHMiLCIuLi9zcmMvd3JhcHBlcnMvYXNTZXQudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9hc1NldC50cyIsIi4uL3NyYy90cmFuc2Zvcm1zL2JpZ2ludC50cyIsIi4uL3NyYy90cmFuc2Zvcm1zL0ltbXV0YWJsZURhdGUudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9kYXRlLnRzIiwiLi4vc3JjL3RyZWVVdGlscy9kcmFmdC50cyIsIi4uL3NyYy90cmVlVXRpbHMvc2FuZGJveC50cyIsIi4uL3NyYy90eXBlcy9hcnJheUJhc2VkL3R5cGVzVHVwbGUudHMiLCIuLi9zcmMvd3JhcHBlcnMvQXJyYXlTZXQudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNBcnJheVNldC50cyIsIi4uL3NyYy90eXBlcy9vYmplY3RCYXNlZC90eXBlc1JlY29yZC50cyIsIi4uL3NyYy93cmFwcGVycy9PYmplY3RNYXAudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNPYmplY3RNYXAudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNSZWYudHMiLCIuLi9zcmMvdHlwZXMvcHJpbWl0aXZlQmFzZWQvdHlwZXNFbnVtLnRzIiwiLi4vc3JjL3R5cGVzL3V0aWxpdHkvdHlwZXNSZWZpbmVtZW50LnRzIiwiLi4vc3JjL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUmVmaW5lZFByaW1pdGl2ZS50cyIsIi4uL3NyYy90eXBlcy91dGlsaXR5L3R5cGVzTWF5YmUudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc1RhZy50cyIsIi4uL3NyYy90eXBlcy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuL0Jhc2VEYXRhTW9kZWxcIlxuXG5jb25zdCBkYXRhTW9kZWxBY3Rpb25SZWdpc3RyeSA9IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAge1xuICAgIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPlxuICAgIGZuTmFtZTogc3RyaW5nXG4gIH1cbj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YU1vZGVsQWN0aW9uKGZ1bGxBY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGRhdGFNb2RlbEFjdGlvblJlZ2lzdHJ5LmdldChmdWxsQWN0aW9uTmFtZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERhdGFNb2RlbEFjdGlvbihcbiAgZnVsbEFjdGlvbk5hbWU6IHN0cmluZyxcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxuICBmbk5hbWU6IHN0cmluZ1xuKSB7XG4gIGRhdGFNb2RlbEFjdGlvblJlZ2lzdHJ5LnNldChmdWxsQWN0aW9uTmFtZSwge1xuICAgIG1vZGVsQ2xhc3MsXG4gICAgZm5OYW1lLFxuICB9KVxufVxuIiwiLyoqXG4gKiBBIGJ1aWx0LWluIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gQnVpbHRJbkFjdGlvbiB7XG4gIC8qKlxuICAgKiBhcHBseVBhdGNoZXNcbiAgICovXG4gIEFwcGx5UGF0Y2hlcyA9IFwiJCRhcHBseVBhdGNoZXNcIixcbiAgLyoqXG4gICAqIGFwcGx5U25hcHNob3RcbiAgICovXG4gIEFwcGx5U25hcHNob3QgPSBcIiQkYXBwbHlTbmFwc2hvdFwiLFxuICAvKipcbiAgICogZGV0YWNoXG4gICAqL1xuICBEZXRhY2ggPSBcIiQkZGV0YWNoXCIsXG4gIC8qKlxuICAgKiBhcHBseVNldFxuICAgKi9cbiAgQXBwbHlTZXQgPSBcIiQkYXBwbHlTZXRcIixcbiAgLyoqXG4gICAqIGFwcGx5RGVsZXRlXG4gICAqL1xuICBBcHBseURlbGV0ZSA9IFwiJCRhcHBseURlbGV0ZVwiLFxuICAvKipcbiAgICogYXBwbHlNZXRob2RDYWxsXG4gICAqL1xuICBBcHBseU1ldGhvZENhbGwgPSBcIiQkYXBwbHlNZXRob2RDYWxsXCIsXG59XG5cbmNvbnN0IGJ1aWx0SW5BY3Rpb25WYWx1ZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KE9iamVjdC52YWx1ZXMoQnVpbHRJbkFjdGlvbikpXG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIGFjdGlvbiBuYW1lIGlzIGEgYnVpbHQtaW4gYWN0aW9uLCB0aGlzIGlzLCBvbmUgb2Y6XG4gKiAtIGFwcGx5UGF0Y2hlcygpXG4gKiAtIGFwcGx5U25hcHNob3QoKVxuICogLSBkZXRhY2goKVxuICpcbiAqIEBwYXJhbSBhY3Rpb25OYW1lIEFjdGlvbiBuYW1lIHRvIGNoZWNrLlxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIGJ1aWx0LWluIGFjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCdWlsdEluQWN0aW9uKGFjdGlvbk5hbWU6IHN0cmluZyk6IGFjdGlvbk5hbWUgaXMgQnVpbHRJbkFjdGlvbiB7XG4gIHJldHVybiBidWlsdEluQWN0aW9uVmFsdWVzLmhhcyhhY3Rpb25OYW1lKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuXG4vKipcbiAqIExvdyBsZXZlbCBhY3Rpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Db250ZXh0IHtcbiAgLyoqXG4gICAqIEFjdGlvbiBuYW1lXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25OYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIEFjdGlvbiB0eXBlLCBzeW5jIG9yIGFzeW5jLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGVcbiAgLyoqXG4gICAqIEFjdGlvbiB0YXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBBbnlNb2RlbFxuICAvKipcbiAgICogQXJyYXkgb2YgYWN0aW9uIGFyZ3VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M6IFJlYWRvbmx5QXJyYXk8YW55PlxuICAvKipcbiAgICogUGFyZW50IGFjdGlvbiBjb250ZXh0LCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRDb250ZXh0PzogQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogUm9vdCBhY3Rpb24gY29udGV4dCwgb3IgaXRzZWxmIGlmIHRoZSByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdENvbnRleHQ6IEFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIFByZXZpb3VzIGFzeW5jIHN0ZXAgY29udGV4dCwgdW5kZWZpbmVkIGZvciBzeW5jIGFjdGlvbnMgb3IgdGhlIGZpcnN0IGFjdGlvbiBvZiBhIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBwcmV2aW91c0FzeW5jU3RlcENvbnRleHQ/OiBBY3Rpb25Db250ZXh0XG4gIC8qKlxuICAgKiBTcGF3biBhc3luYyBzdGVwIGNvbnRleHQsIHVuZGVmaW5lZCBmb3Igc3luYyBhY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Bhd25Bc3luY1N0ZXBDb250ZXh0PzogQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogQXN5bmMgc3RlcCB0eXBlLCBvciB1bmRlZmluZWQgZm9yIHN5bmMgYWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGFzeW5jU3RlcFR5cGU/OiBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZVxuICAvKipcbiAgICogQ3VzdG9tIGRhdGEgZm9yIHRoZSBhY3Rpb24gY29udGV4dCB0byBiZSBzZXQgYnkgbWlkZGxld2FyZXMsIGFuIG9iamVjdC5cbiAgICogU3ltYm9scyBtdXN0IGJlIHVzZWQgYXMga2V5cyB0byBhdm9pZCBuYW1lIGNsYXNoaW5nIGJldHdlZW4gbWlkZGxld2FyZXMuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBSZWNvcmQ8c3ltYm9sLCBhbnk+XG59XG5cbi8qKlxuICogQWN0aW9uIHR5cGUsIHN5bmMgb3IgYXN5bmMuXG4gKi9cbmV4cG9ydCBlbnVtIEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIHtcbiAgU3luYyA9IFwic3luY1wiLFxuICBBc3luYyA9IFwiYXN5bmNcIixcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBzdGVwIHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlIHtcbiAgLyoqXG4gICAqIFRoZSBmbG93IGlzIGFib3V0IHRvIHN0YXJ0LlxuICAgKi9cbiAgU3Bhd24gPSBcInNwYXduXCIsXG4gIC8qKlxuICAgKiBUaGUgZmxvdyBpcyBhYm91dCB0byByZXR1cm4gKGZpbmlzaCkuXG4gICAqL1xuICBSZXR1cm4gPSBcInJldHVyblwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgaXMgYWJvdXQgdG8gY29udGludWUuXG4gICAqL1xuICBSZXN1bWUgPSBcInJlc3VtZVwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgeWllbGQganVzdCB0aHJldywgd2hpY2ggbWlnaHQgYmUgcmVjb3ZlcmVkIChjYXVnaHQpIG9yIG5vdC5cbiAgICovXG4gIFJlc3VtZUVycm9yID0gXCJyZXN1bWVFcnJvclwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgaXMgYWJvdXQgdG8gdGhyb3cgYW4gZXJyb3IgdG8gdGhlIGZsb3cgY2FsbGVyLlxuICAgKi9cbiAgVGhyb3cgPSBcInRocm93XCIsXG59XG5cbmxldCBjdXJyZW50QWN0aW9uQ29udGV4dDogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZFxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnRseSBydW5uaW5nIGFjdGlvbiBjb250ZXh0LCBvciB1bmRlZmluZWQgaWYgbm9uZS5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKTogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjdXJyZW50QWN0aW9uQ29udGV4dFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFNldHMgdGhlIGN1cnJlbnQgYWN0aW9uIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGN0eCBDdXJyZW50IGFjdGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudEFjdGlvbkNvbnRleHQoY3R4OiBBY3Rpb25Db250ZXh0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGN1cnJlbnRBY3Rpb25Db250ZXh0ID0gY3R4XG59XG4iLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxBY3Rpb25TeW1ib2wgPSBTeW1ib2woXCJtb2RlbEFjdGlvblwiKVxuXG4vKipcbiAqIFJldHVybnMgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIGEgbW9kZWwgYWN0aW9uIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbEFjdGlvbihmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiICYmIG1vZGVsQWN0aW9uU3ltYm9sIGluIGZuXG59XG4iLCIvKipcbiAqIEtleSB3aGVyZSBtb2RlbCBzbmFwc2hvdHMgd2lsbCBzdG9yZSBtb2RlbCB0eXBlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgY29uc3QgbW9kZWxUeXBlS2V5ID0gXCIkbW9kZWxUeXBlXCJcblxuLyoqXG4gKiBLZXkgdGhhdCBzZXJ2ZXMgYXMgcHJveHkgdG8gdGhlIG1vZGVsIHByb3BlcnR5IGRlc2lnbmVkIGFzICdpZFByb3AnIChpZiBhbnkpLlxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJZEtleSA9IFwiJG1vZGVsSWRcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogUmV0dXJucyBpZiBhIGdpdmVuIGtleSBpcyBhIHJlc2VydmVkIGtleSBpbiBtb2RlbCBzbmFwc2hvdHMuXG4gKlxuICogQHBhcmFtIGtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzZXJ2ZWRNb2RlbEtleShrZXk6IHN0cmluZykge1xuICAvLyBub3RlICRtb2RlbElkIGlzIE5PVCBhIHJlc2VydmVkIGtleSwgc2luY2UgaXQgd2lsbCBldmVudHVhbGx5IGVuZCB1cCBpbiB0aGUgZGF0YVxuICAvLyBhbmQgY2FuIGFjdHVhbGx5IGJlIGNoYW5nZWRcbiAgcmV0dXJuIGtleSA9PT0gbW9kZWxUeXBlS2V5XG59XG4iLCJpbXBvcnQgKiBhcyBtb2J4IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIElPYnNlcnZhYmxlQXJyYXksXG4gIGlzT2JzZXJ2YWJsZUFycmF5LFxuICBpc09ic2VydmFibGVNYXAsXG4gIGlzT2JzZXJ2YWJsZU9iamVjdCxcbiAgaXNPYnNlcnZhYmxlU2V0LFxuICBPYnNlcnZhYmxlTWFwLFxuICBPYnNlcnZhYmxlU2V0LFxufSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBKU09OUHJpbWl0aXZlVmFsdWUsIFByaW1pdGl2ZVZhbHVlIH0gZnJvbSBcIi4vdHlwZXNcIlxuXG4vKipcbiAqIEEgbW9ieC1rZXlzdG9uZSBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKG1zZylcblxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZUVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZUVycm9yKG1zZylcbn1cblxuY29uc3Qgd3JpdGFibGVIaWRkZW5Qcm9wRGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0ge1xuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHZhbHVlOiB1bmRlZmluZWQsXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRIaWRkZW5Qcm9wKG9iamVjdDogYW55LCBwcm9wTmFtZTogUHJvcGVydHlLZXksIHZhbHVlOiBhbnksIHdyaXRhYmxlID0gdHJ1ZSkge1xuICBpZiAod3JpdGFibGUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwgd3JpdGFibGVIaWRkZW5Qcm9wRGVzY3JpcHRvcilcbiAgICBvYmplY3RbcHJvcE5hbWVdID0gdmFsdWVcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQcm9wUmVhZG9ubHk8VD4ob2JqZWN0OiBULCBwcm9wTmFtZToga2V5b2YgVCwgZW51bWVyYWJsZTogYm9vbGVhbikge1xuICBjb25zdCBwcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wTmFtZSlcbiAgaWYgKHByb3BEZXNjKSB7XG4gICAgcHJvcERlc2MuZW51bWVyYWJsZSA9IGVudW1lcmFibGVcbiAgICBpZiAocHJvcERlc2MuZ2V0KSB7XG4gICAgICBkZWxldGUgcHJvcERlc2Muc2V0XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BEZXNjLndyaXRhYmxlID0gZmFsc2VcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUsIHByb3BEZXNjKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIlxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcmltaXRpdmVWYWx1ZSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNKU09OUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSlNPTlByaW1pdGl2ZVZhbHVlIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpXG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRnJvbUFycmF5PFQ+KGFycmF5OiBUW10sIHZhbHVlOiBUKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IGFycmF5LmluZGV4T2YodmFsdWUpXG4gIGlmIChpbmRleCA+PSAwKSB7XG4gICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hcCh2YWw6IHVua25vd24pOiB2YWwgaXMgTWFwPGFueSwgYW55PiB8IE9ic2VydmFibGVNYXAge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgTWFwIHx8IGlzT2JzZXJ2YWJsZU1hcCh2YWwpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NldCh2YWw6IHVua25vd24pOiB2YWwgaXMgU2V0PGFueT4gfCBPYnNlcnZhYmxlU2V0IHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIFNldCB8fCBpc09ic2VydmFibGVTZXQodmFsKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSh2YWw6IHVua25vd24pOiB2YWwgaXMgYW55W10gfCBJT2JzZXJ2YWJsZUFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc09ic2VydmFibGVBcnJheSh2YWwpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbkRldk1vZGUoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCJcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzT2JqZWN0KHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIG9iamVjdCB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGFuIG9iamVjdGApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24sIGFyZ05hbWU6IHN0cmluZyk6IGFzc2VydHMgdmFsdWUgaXMgb2JqZWN0IHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHBsYWluIG9iamVjdGApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBvYmplY3Qge1xuICBpZiAoIWlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYW4gb2JzZXJ2YWJsZSBvYmplY3RgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc09ic2VydmFibGVBcnJheShcbiAgdmFsdWU6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZ1xuKTogYXNzZXJ0cyB2YWx1ZSBpcyBJT2JzZXJ2YWJsZUFycmF5IHtcbiAgaWYgKCFpc09ic2VydmFibGVBcnJheSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYW4gb2JzZXJ2YWJsZSBhcnJheWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzTWFwKHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIE1hcDxhbnksIGFueT4ge1xuICBpZiAoIWlzTWFwKHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIG1hcGApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzU2V0KHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIFNldDxhbnk+IHtcbiAgaWYgKCFpc1NldCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBzZXRgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc0Z1bmN0aW9uKHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIEZ1bmN0aW9uIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgZnVuY3Rpb25gKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc1ByaW1pdGl2ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZ1xuKTogYXNzZXJ0cyB2YWx1ZSBpcyBQcmltaXRpdmVWYWx1ZSB7XG4gIGlmICghaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgcHJpbWl0aXZlYClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNTdHJpbmcodmFsdWU6IHVua25vd24sIGFyZ05hbWU6IHN0cmluZyk6IGFzc2VydHMgdmFsdWUgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHN0cmluZ2ApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWNvcmF0ZU1ldGhvZE9yRmllbGREYXRhIHtcbiAgdGFyZ2V0OiBhbnlcbiAgcHJvcGVydHlLZXk6IHN0cmluZ1xuICBiYXNlRGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBhbnkgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcnVuQWZ0ZXJOZXdTeW1ib2wgPSBTeW1ib2woXCJydW5BZnRlck5ld1wiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcnVuQmVmb3JlT25Jbml0U3ltYm9sID0gU3ltYm9sKFwicnVuQmVmb3JlT25Jbml0XCIpXG5cbnR5cGUgV3JhcEZ1bmN0aW9uID0gKGRhdGE6IERlY29yYXRlTWV0aG9kT3JGaWVsZERhdGEsIGZuOiBhbnkpID0+IGFueVxudHlwZSBMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnNBcnJheSA9ICgoaW5zdGFuY2U6IGFueSkgPT4gdm9pZClbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24oXG4gIHRhcmdldDogYW55LFxuICBzeW1ib2w6IHN5bWJvbCxcbiAgZm46IChpbnN0YW5jZTogYW55KSA9PiB2b2lkXG4pIHtcbiAgbGV0IGFycmF5OiBMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnNBcnJheSA9IHRhcmdldFtzeW1ib2xdXG4gIGlmICghYXJyYXkgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIHN5bWJvbCkpIHtcbiAgICAvLyBsZWF2ZSBiYXNlIGFycmF5IHVubW9kaWZpZWQsIGNyZWF0ZSBuZXcgYXJyYXkgaW4gdGhlIGRlcml2ZWQgY2xhc3NcbiAgICBhcnJheSA9IGFycmF5ID8gYXJyYXkuc2xpY2UoKSA6IFtdXG4gICAgYWRkSGlkZGVuUHJvcCh0YXJnZXQsIHN5bWJvbCwgYXJyYXkpXG4gIH1cbiAgYXJyYXkucHVzaChmbilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlV3JhcE1ldGhvZE9yRmllbGQoXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbiAgZGF0YTogRGVjb3JhdGVNZXRob2RPckZpZWxkRGF0YSxcbiAgd3JhcDogV3JhcEZ1bmN0aW9uXG4pOiBhbnkge1xuICBjb25zdCB7IHRhcmdldCwgcHJvcGVydHlLZXksIGJhc2VEZXNjcmlwdG9yIH0gPSBkYXRhXG5cbiAgY29uc3QgYWRkRmllbGREZWNvcmF0b3IgPSAoKSA9PiB7XG4gICAgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24odGFyZ2V0LCBydW5BZnRlck5ld1N5bWJvbCwgKGluc3RhbmNlKSA9PiB7XG4gICAgICBpbnN0YW5jZVtwcm9wZXJ0eUtleV0gPSB3cmFwKGRhdGEsIGluc3RhbmNlW3Byb3BlcnR5S2V5XSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaWYgKGJhc2VEZXNjcmlwdG9yLmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBAJHtkZWNvcmF0b3JOYW1lfSBjYW5ub3QgYmUgdXNlZCB3aXRoIGdldHRlcnNgKVxuICAgIH1cblxuICAgIGlmIChiYXNlRGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgLy8gYmFiZWwgLyB0eXBlc2NyaXB0IC0gbWV0aG9kIGRlY29yYXRvclxuICAgICAgLy8gQGFjdGlvbiBtZXRob2QoKSB7IH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogd3JhcChkYXRhLCBiYXNlRGVzY3JpcHRvci52YWx1ZSksXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGJhYmVsIC0gZmllbGQgZGVjb3JhdG9yOiBAYWN0aW9uIG1ldGhvZCA9ICgpID0+IHt9XG4gICAgICBhZGRGaWVsZERlY29yYXRvcigpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHR5cGVzY3JpcHQgLSBmaWVsZCBkZWNvcmF0b3JcbiAgICBhZGRGaWVsZERlY29yYXRvcigpXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyh0YXJnZXQ6IGFueSwgc3ltYm9sOiBzeW1ib2wpOiB2b2lkIHtcbiAgY29uc3QgZm5zOiBMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnNBcnJheSB8IHVuZGVmaW5lZCA9IHRhcmdldFtzeW1ib2xdXG4gIGlmIChmbnMpIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZucykge1xuICAgICAgZm4odGFyZ2V0KVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCB3YXJuaW5nc0FscmVhZHlEaXNwbGF5ZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nV2FybmluZyh0eXBlOiBcIndhcm5cIiB8IFwiZXJyb3JcIiwgbXNnOiBzdHJpbmcsIHVuaXF1ZUtleT86IHN0cmluZyk6IHZvaWQge1xuICBpZiAodW5pcXVlS2V5KSB7XG4gICAgaWYgKHdhcm5pbmdzQWxyZWFkeURpc3BsYXllZC5oYXModW5pcXVlS2V5KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdhcm5pbmdzQWxyZWFkeURpc3BsYXllZC5hZGQodW5pcXVlS2V5KVxuICB9XG5cbiAgbXNnID0gXCJbbW9ieC1rZXlzdG9uZV0gXCIgKyBtc2dcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIndhcm5cIjpcbiAgICAgIGNvbnNvbGUud2Fybihtc2cpXG4gICAgICBicmVha1xuICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBmYWlsdXJlKGB1bmtub3duIGxvZyB0eXBlIC0gJHt0eXBlfWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhenk8QSBleHRlbmRzIHVua25vd25bXSwgUj4oZ2V0dGVyOiAoLi4uYXJnczogQSkgPT4gUik6IHR5cGVvZiBnZXR0ZXIge1xuICBsZXQgbWVtb2l6ZWRWYWx1ZTogUlxuICBsZXQgbWVtb2l6ZWQgPSBmYWxzZVxuXG4gIHJldHVybiAoLi4uYXJnczogQSk6IFIgPT4ge1xuICAgIGlmICghbWVtb2l6ZWQpIHtcbiAgICAgIG1lbW9pemVkVmFsdWUgPSBnZXR0ZXIoLi4uYXJncylcbiAgICAgIG1lbW9pemVkID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gbWVtb2l6ZWRWYWx1ZVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBpZGVudGl0eUZuID0gPFQ+KHg6IFQpOiBUID0+IHhcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vYng2ID0ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jb25jYXRcbiAgbWFrZU9ic2VydmFibGU6IChtb2J4IGFzIGFueSlbXG4gICAgLy8ganVzdCB0byBlbnN1cmUgaW1wb3J0ICogaXMga2VwdCBwcm9wZXJseVxuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoXCJsXCIuY2hhckNvZGVBdCgwKSArIDEpICsgXCJha2VPYnNlcnZhYmxlXCJcbiAgXSxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOYW1lVG9TZXR0ZXJOYW1lKHByb3BOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHNldCR7cHJvcE5hbWVbMF0udG9VcHBlckNhc2UoKX0ke3Byb3BOYW1lLnNsaWNlKDEpfWBcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vYnhWZXJzaW9uKCk6IG51bWJlciB7XG4gIGlmIChtb2J4Ni5tYWtlT2JzZXJ2YWJsZSEpIHtcbiAgICByZXR1cm4gNlxuICB9IGVsc2Uge1xuICAgIHJldHVybiA1XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG5hbWVzcGFjZSA9IFwibW9ieC1rZXlzdG9uZVwiXG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IEZsYXR0ZW4sIElzTmV2ZXJUeXBlIH0gZnJvbSBcIi4uL3V0aWxzL3R5cGVzXCJcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxQcm9wc1RvQ3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvU25hcHNob3REYXRhLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhLFxufSBmcm9tIFwiLi9wcm9wXCJcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9wc1R5cGVTeW1ib2wgPSBTeW1ib2woXCJwcm9wc1R5cGVcIilcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBjb25zdCBmcm9tU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2wgPSBTeW1ib2woXCJmcm9tU25hcHNob3RPdmVycmlkZVR5cGVcIilcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBjb25zdCB0b1NuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sID0gU3ltYm9sKFwidG9TbmFwc2hvdE92ZXJyaWRlVHlwZVwiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJbml0aWFsaXplZFN5bWJvbCA9IFN5bWJvbChcIm1vZGVsSW5pdGlhbGl6ZWRcIilcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgaW5zdGFuY2UgdHlwZSBvZiBhIG1vZGVsIGNsYXNzLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbENsYXNzPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPSB7XG4gIG5ldyAoaW5pdGlhbERhdGE6IGFueSk6IE1cblxuICBmcm9tU25hcHNob3RQcm9jZXNzb3I/KHNuOiBhbnkpOiBhbnlcbiAgdG9TbmFwc2hvdFByb2Nlc3Nvcj8oc246IGFueSwgbW9kZWxJbnN0YW5jZTogYW55KTogYW55XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGluc3RhbmNlIHR5cGUgb2YgYW4gYWJzdHJhY3QgbW9kZWwgY2xhc3MuXG4gKi9cbmV4cG9ydCB0eXBlIEFic3RyYWN0TW9kZWxDbGFzczxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+ID0gYWJzdHJhY3QgbmV3IChcbiAgaW5pdGlhbERhdGE6IGFueVxuKSA9PiBNXG5cbi8qKlxuICogVGhlIHByb3BzIG9mIGEgbW9kZWwuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNPZjxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+ID0gTVt0eXBlb2YgcHJvcHNUeXBlU3ltYm9sXVxuXG4vKipcbiAqIFRoZSBkYXRhIHR5cGUgb2YgYSBtb2RlbC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxEYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPSBGbGF0dGVuPE1bXCIkXCJdPlxuXG4vKipcbiAqIFRoZSBjcmVhdGlvbiBkYXRhIHR5cGUgb2YgYSBtb2RlbC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxDcmVhdGlvbkRhdGE8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IE1vZGVsUHJvcHNUb0NyZWF0aW9uRGF0YTxcbiAgTW9kZWxQcm9wc09mPE0+XG4+XG5cbi8qKlxuICogVGhlIHRyYW5zZm9ybWVkIGRhdGEgdHlwZSBvZiBhIG1vZGVsLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbFRyYW5zZm9ybWVkRGF0YTxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+ID0gTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhPFxuICBNb2RlbFByb3BzT2Y8TT5cbj5cblxuLyoqXG4gKiBUaGUgdHJhbnNmb3JtZWQgY3JlYXRpb24gZGF0YSB0eXBlIG9mIGEgbW9kZWwuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9XG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE1vZGVsUHJvcHNPZjxNPj5cblxuLyoqXG4gKiBUaGUgZnJvbSBzbmFwc2hvdCB0eXBlIG9mIGEgbW9kZWwuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFNuYXBzaG90SW5PZjxNb2RlbD4gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxGcm9tU25hcHNob3Q8TSBleHRlbmRzIEFueU1vZGVsPiA9IElzTmV2ZXJUeXBlPFxuICBNW3R5cGVvZiBmcm9tU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YTxNb2RlbFByb3BzT2Y8TT4+LFxuICBNW3R5cGVvZiBmcm9tU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdXG4+ICYgeyBbbW9kZWxUeXBlS2V5XT86IHN0cmluZyB9XG5cbi8qKlxuICogVGhlIHRvIHNuYXBzaG90IHR5cGUgb2YgYSBtb2RlbC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU25hcHNob3RPdXRPZjxNb2RlbD4gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxUb1NuYXBzaG90PE0gZXh0ZW5kcyBBbnlNb2RlbD4gPSBJc05ldmVyVHlwZTxcbiAgTVt0eXBlb2YgdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF0sXG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90RGF0YTxNb2RlbFByb3BzT2Y8TT4+LFxuICBNW3R5cGVvZiB0b1NuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXVxuPiAmIHsgW21vZGVsVHlwZUtleV0/OiBzdHJpbmcgfVxuXG4vKipcbiAqIFRyaWNrcyBUeXBlU2NyaXB0IGludG8gYWNjZXB0aW5nIGEgcGFydGljdWxhciBraW5kIG9mIGdlbmVyaWMgY2xhc3MgYXMgYSBwYXJhbWV0ZXIgZm9yIGBFeHRlbmRlZE1vZGVsYC5cbiAqIERvZXMgbm90aGluZyBpbiBydW50aW1lLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBHZW5lcmljIG1vZGVsIGNsYXNzIHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBHZW5lcmljIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsQ2xhc3M8VCBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPih0eXBlOiB7XG4gIHByb3RvdHlwZTogVFxufSk6IE1vZGVsQ2xhc3M8VD4ge1xuICByZXR1cm4gdHlwZSBhcyBhbnlcbn1cbiIsImltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuL0Jhc2VNb2RlbFNoYXJlZFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxJbmZvIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPlxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJbmZvQnlOYW1lOiB7XG4gIFtuYW1lOiBzdHJpbmddOiBNb2RlbEluZm9cbn0gPSB7fVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJbmZvQnlDbGFzcyA9IG5ldyBNYXA8TW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4sIE1vZGVsSW5mbz4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxJbmZvRm9yTmFtZShuYW1lOiBzdHJpbmcpOiBNb2RlbEluZm8gfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxJbmZvQnlOYW1lW25hbWVdXG59XG4iLCJ0eXBlIEFueU1hcDxWID0gYW55PiA9IE1hcDxhbnksIFY+IHwgV2Vha01hcDxhbnksIFY+XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZTxLLCBWLCBDID0gVj4obWFwOiBNYXA8SywgVj4sIGtleTogSywgY3JlYXRlOiAoKSA9PiBDKTogVlxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yQ3JlYXRlPEsgZXh0ZW5kcyBvYmplY3QsIFYsIEMgPSBWPihcbiAgbWFwOiBXZWFrTWFwPEssIFY+LFxuICBrZXk6IEssXG4gIGNyZWF0ZTogKCkgPT4gQ1xuKTogVlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JDcmVhdGU8Vj4obWFwOiBBbnlNYXA8Vj4sIGtleTogYW55LCBjcmVhdGU6ICgpID0+IFYpIHtcbiAgbGV0IHZhbHVlID0gbWFwLmdldChrZXkpXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSBjcmVhdGUoKVxuICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cbiIsImltcG9ydCB7IGNyZWF0ZUF0b20sIElBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi9wYXRoXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG9iamVjdFBhcmVudHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFBhcmVudFBhdGg8b2JqZWN0PiB8IHVuZGVmaW5lZD4oKVxuXG5jb25zdCBvYmplY3RQYXJlbnRzQXRvbXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJlbnRQYXRoRXF1YWxzKFxuICBwYXJlbnRQYXRoMTogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkLFxuICBwYXJlbnRQYXRoMjogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkLFxuICBjb21wYXJlUGF0aCA9IHRydWVcbikge1xuICBpZiAoIXBhcmVudFBhdGgxICYmICFwYXJlbnRQYXRoMikgcmV0dXJuIHRydWVcbiAgaWYgKCFwYXJlbnRQYXRoMSB8fCAhcGFyZW50UGF0aDIpIHJldHVybiBmYWxzZVxuICBjb25zdCBwYXJlbnRFcXVhbHMgPSBwYXJlbnRQYXRoMS5wYXJlbnQgPT09IHBhcmVudFBhdGgyLnBhcmVudFxuICBpZiAoIXBhcmVudEVxdWFscykgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBjb21wYXJlUGF0aCA/IHBhcmVudFBhdGgxLnBhdGggPT09IHBhcmVudFBhdGgyLnBhdGggOiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhcmVudFBhdGhBdG9tKG9iajogb2JqZWN0KSB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShvYmplY3RQYXJlbnRzQXRvbXMsIG9iaiwgKCkgPT4gY3JlYXRlQXRvbShcInBhcmVudEF0b21cIikpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRQYXJlbnRQYXRoT2JzZXJ2ZWQobm9kZTogb2JqZWN0KSB7XG4gIGNyZWF0ZVBhcmVudFBhdGhBdG9tKG5vZGUpLnJlcG9ydE9ic2VydmVkKClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydFBhcmVudFBhdGhDaGFuZ2VkKG5vZGU6IG9iamVjdCkge1xuICBjcmVhdGVQYXJlbnRQYXRoQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRhdGFPYmplY3RQYXJlbnQgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdD4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YVRvTW9kZWxOb2RlPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQpOiBUIHtcbiAgY29uc3QgbW9kZWxOb2RlID0gZGF0YU9iamVjdFBhcmVudC5nZXQobm9kZSlcbiAgcmV0dXJuIChtb2RlbE5vZGUgYXMgVCkgPz8gbm9kZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxUb0RhdGFOb2RlPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQpOiBUIHtcbiAgcmV0dXJuIGlzTW9kZWwobm9kZSkgPyBub2RlLiQgOiBub2RlXG59XG4iLCJpbXBvcnQgeyBydW5JbkFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGRhdGFPYmplY3RQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgdHdlYWtlZE9iamVjdHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIHVuZGVmaW5lZCB8ICgoKSA9PiB2b2lkKT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUd2Vha2VkT2JqZWN0KHZhbHVlOiB1bmtub3duLCBjYW5CZURhdGFPYmplY3Q6IGJvb2xlYW4pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICBpZiAoIWNhbkJlRGF0YU9iamVjdCAmJiBkYXRhT2JqZWN0UGFyZW50Lmhhcyh2YWx1ZSBhcyBvYmplY3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHR3ZWFrZWRPYmplY3RzLmhhcyh2YWx1ZSBhcyBvYmplY3QpXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gb2JqZWN0IGlzIG5vdyBhIHRyZWUgbm9kZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IGlzIGEgdHJlZSBub2RlLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyZWVOb2RlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICFpc1ByaW1pdGl2ZSh2YWx1ZSkgJiYgaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCBmYWxzZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR3ZWFrZWRPYmplY3QoXG4gIHRyZWVOb2RlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcsXG4gIGNhbkJlRGF0YU9iamVjdCA9IGZhbHNlXG4pOiBhc3NlcnRzIHRyZWVOb2RlIGlzIG9iamVjdCB7XG4gIGlmICghY2FuQmVEYXRhT2JqZWN0ICYmIGRhdGFPYmplY3RQYXJlbnQuaGFzKHRyZWVOb2RlIGFzIG9iamVjdCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgdGhlIG1vZGVsIG9iamVjdCBpbnN0YW5jZSBpbnN0ZWFkIG9mIHRoZSAnJCcgc3ViLW9iamVjdGApXG4gIH1cbiAgaWYgKGlzUHJpbWl0aXZlKHRyZWVOb2RlKSB8fCAhaXNUd2Vha2VkT2JqZWN0KHRyZWVOb2RlLCB0cnVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgJHthcmdOYW1lfSBtdXN0IGJlIGEgdHJlZSBub2RlICh1c3VhbGx5IGEgbW9kZWwgb3IgYSBzaGFsbG93IC8gZGVlcCBjaGlsZCBwYXJ0IG9mIGEgbW9kZWwgJ2RhdGEnIG9iamVjdClgXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyBhIGdpdmVuIG9iamVjdCBpcyBub3cgYSB0cmVlIG5vZGUsIG9yIHRocm93cyBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIGFyZ05hbWUgQXJndW1lbnQgbmFtZSwgcGFydCBvZiB0aGUgdGhyb3duIGVycm9yIGRlc2NyaXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNUcmVlTm9kZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZyA9IFwiYXJndW1lbnRcIlxuKTogYXNzZXJ0cyB2YWx1ZSBpcyBvYmplY3Qge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBhcmdOYW1lLCBmYWxzZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGxldCBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyhmbjogKCkgPT4gdm9pZCkge1xuICBjb25zdCBvbGQgPSBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzXG4gIHJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgPSB0cnVlXG4gIHRyeSB7XG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgZm4oKVxuICAgIH0pXG4gIH0gZmluYWxseSB7XG4gICAgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyA9IG9sZFxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgbW9kZWxNZXRhZGF0YVN5bWJvbCA9IFN5bWJvbChcIm1vZGVsTWV0YWRhdGFcIilcbmV4cG9ydCBjb25zdCBtb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sID0gU3ltYm9sKFwibW9kZWxVbndyYXBwZWRDbGFzc1wiKVxuZXhwb3J0IGNvbnN0IHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wgPSBTeW1ib2woXCJydW5BZnRlck1vZGVsRGVjb3JhdG9yXCIpXG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsTWV0YWRhdGFTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBpc01vZGVsLCBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQXNzb2NpYXRlZCBtb2RlbCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEFzc29jaWF0ZWQgZGF0YSB0eXBlIGZvciBydW50aW1lIGNoZWNraW5nIChpZiBhbnkpLlxuICAgKi9cbiAgZGF0YVR5cGU/OiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IHVzZWQgYXMgbW9kZWwgaWQuXG4gICAqL1xuICBtb2RlbElkUHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBBIHZhbHVlIHR5cGUgd2lsbCBiZSBjbG9uZWQgYXV0b21hdGljYWxseSB3aGVuIGJlaW5nIGF0dGFjaGVkIHRvIGEgbmV3IHRyZWUuXG4gICAqL1xuICB2YWx1ZVR5cGU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGZvciBhIG1vZGVsIGluc3RhbmNlIG9yIGNsYXNzLlxuICpcbiAqIEBwYXJhbSBtb2RlbENsYXNzT3JJbnN0YW5jZSBNb2RlbCBjbGFzcyBvciBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxNZXRhZGF0YShcbiAgbW9kZWxDbGFzc09ySW5zdGFuY2U6IEFueU1vZGVsIHwgTW9kZWxDbGFzczxBbnlNb2RlbD5cbik6IE1vZGVsTWV0YWRhdGEge1xuICBpZiAoaXNNb2RlbChtb2RlbENsYXNzT3JJbnN0YW5jZSkpIHtcbiAgICByZXR1cm4gKG1vZGVsQ2xhc3NPckluc3RhbmNlIGFzIGFueSkuY29uc3RydWN0b3JbbW9kZWxNZXRhZGF0YVN5bWJvbF1cbiAgfSBlbHNlIGlmIChpc01vZGVsQ2xhc3MobW9kZWxDbGFzc09ySW5zdGFuY2UpKSB7XG4gICAgcmV0dXJuIChtb2RlbENsYXNzT3JJbnN0YW5jZSBhcyBhbnkpW21vZGVsTWV0YWRhdGFTeW1ib2xdXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgbW9kZWxDbGFzc09ySW5zdGFuY2UgbXVzdCBiZSBhIG1vZGVsIGNsYXNzIG9yIGluc3RhbmNlYClcbiAgfVxufVxuXG5jb25zdCBtb2RlbElkUHJvcGVydHlOYW1lQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZyB8IHVuZGVmaW5lZD4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShcbiAgICBtb2RlbElkUHJvcGVydHlOYW1lQ2FjaGUsXG4gICAgbW9kZWxDbGFzcyxcbiAgICAoKSA9PiBnZXRNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhc3MpLm1vZGVsSWRQcm9wZXJ0eVxuICApXG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BzIH0gZnJvbSBcIi4vcHJvcFwiXG5cbmNvbnN0IG1vZGVsUHJvcGVydGllc1N5bWJvbCA9IFN5bWJvbChcIm1vZGVsUHJvcGVydGllc1wiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEdldHMgdGhlIGluZm8gcmVsYXRlZCB0byBhIG1vZGVsIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIG1vZGVsQ2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD5cbik6IE1vZGVsUHJvcHMge1xuICByZXR1cm4gKG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbFByb3BlcnRpZXNTeW1ib2xdXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogU2V0cyB0aGUgaW5mbyByZWxhdGVkIHRvIGEgbW9kZWwgY2xhc3MgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gbW9kZWxDbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPixcbiAgcHJvcHM6IE1vZGVsUHJvcHNcbik6IHZvaWQge1xuICA7KG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbFByb3BlcnRpZXNTeW1ib2xdID0gcHJvcHNcbn1cbiIsImltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mLCBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4uL3NuYXBzaG90L1NuYXBzaG90T2ZcIlxuaW1wb3J0IHR5cGUgeyBMYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB0eXBlIHsgRmxhdHRlbiwgSXNOZXZlclR5cGUsIElzT3B0aW9uYWxWYWx1ZSB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3Qgbm9EZWZhdWx0VmFsdWUgPSBTeW1ib2woXCJub0RlZmF1bHRWYWx1ZVwiKVxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxQcm9wPFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gIFRUcmFuc2Zvcm1lZFZhbHVlLFxuICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICBUSXNSZXF1aXJlZCxcbiAgVElzSWQgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gIFRIYXNTZXR0ZXIgPSBuZXZlcixcbiAgVEZyb21TbmFwc2hvdE92ZXJyaWRlID0gbmV2ZXIsXG4gIFRUb1NuYXBzaG90T3ZlcnJpZGUgPSBuZXZlclxuPiB7XG4gIF9pbnRlcm5hbDoge1xuICAgICR2YWx1ZVR5cGU6IFRQcm9wVmFsdWVcbiAgICAkY3JlYXRpb25WYWx1ZVR5cGU6IFRQcm9wQ3JlYXRpb25WYWx1ZVxuICAgICR0cmFuc2Zvcm1lZFZhbHVlVHlwZTogVFRyYW5zZm9ybWVkVmFsdWVcbiAgICAkdHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlVHlwZTogVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVxuICAgICRpc1JlcXVpcmVkOiBUSXNSZXF1aXJlZFxuICAgICRpc0lkOiBUSXNJZFxuICAgICRoYXNTZXR0ZXI6IFRIYXNTZXR0ZXJcbiAgICAkZnJvbVNuYXBzaG90T3ZlcnJpZGU6IFRGcm9tU25hcHNob3RPdmVycmlkZVxuICAgICR0b1NuYXBzaG90T3ZlcnJpZGU6IFRUb1NuYXBzaG90T3ZlcnJpZGVcblxuICAgIGRlZmF1bHRGbjogKCgpID0+IFRQcm9wVmFsdWUpIHwgdHlwZW9mIG5vRGVmYXVsdFZhbHVlXG4gICAgZGVmYXVsdFZhbHVlOiBUUHJvcFZhbHVlIHwgdHlwZW9mIG5vRGVmYXVsdFZhbHVlXG4gICAgdHlwZUNoZWNrZXI6IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyIHwgdW5kZWZpbmVkXG4gICAgc2V0dGVyOiBib29sZWFuIHwgXCJhc3NpZ25cIlxuICAgIGlzSWQ6IGJvb2xlYW5cbiAgICB0cmFuc2Zvcm06XG4gICAgICB8IHtcbiAgICAgICAgICB0cmFuc2Zvcm0oXG4gICAgICAgICAgICBvcmlnaW5hbDogdW5rbm93bixcbiAgICAgICAgICAgIG1vZGVsOiBvYmplY3QsXG4gICAgICAgICAgICBwcm9wTmFtZTogUHJvcGVydHlLZXksXG4gICAgICAgICAgICBzZXRPcmlnaW5hbFZhbHVlOiAobmV3T3JpZ2luYWxWYWx1ZTogdW5rbm93bikgPT4gdm9pZFxuICAgICAgICAgICk6IHVua25vd25cbiAgICAgICAgICB1bnRyYW5zZm9ybSh0cmFuc2Zvcm1lZDogdW5rbm93biwgbW9kZWw6IG9iamVjdCwgcHJvcE5hbWU6IFByb3BlcnR5S2V5KTogdW5rbm93blxuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZFxuICAgIGZyb21TbmFwc2hvdFByb2Nlc3Nvcj8oc246IHVua25vd24pOiB1bmtub3duXG4gICAgdG9TbmFwc2hvdFByb2Nlc3Nvcj8oc246IHVua25vd24pOiB1bmtub3duXG4gIH1cblxuICB3aXRoU2V0dGVyKCk6IE1vZGVsUHJvcDxcbiAgICBUUHJvcFZhbHVlLFxuICAgIFRQcm9wQ3JlYXRpb25WYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIHN0cmluZyxcbiAgICBURnJvbVNuYXBzaG90T3ZlcnJpZGUsXG4gICAgVFRvU25hcHNob3RPdmVycmlkZVxuICA+XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTZXR0ZXIgbWV0aG9kcyBhcmUgcHJlZmVycmVkLlxuICAgKi9cbiAgd2l0aFNldHRlcihcbiAgICBtb2RlOiBcImFzc2lnblwiXG4gICk6IE1vZGVsUHJvcDxcbiAgICBUUHJvcFZhbHVlLFxuICAgIFRQcm9wQ3JlYXRpb25WYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIHN0cmluZyxcbiAgICBURnJvbVNuYXBzaG90T3ZlcnJpZGUsXG4gICAgVFRvU25hcHNob3RPdmVycmlkZVxuICA+XG5cbiAgLyoqXG4gICAqIFNldHMgYSB0cmFuc2Zvcm0gZm9yIHRoZSBwcm9wZXJ0eSBpbnN0YW5jZSB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGVwYXJhbSBUVFYgVHJhbnNmb3JtZWQgdmFsdWUgdHlwZS5cbiAgICogQHBhcmFtIHRyYW5zZm9ybSBUcmFuc2Zvcm0gdG8gYmUgdXNlZC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHdpdGhUcmFuc2Zvcm08VFRWPihcbiAgICB0cmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxOb25OdWxsYWJsZTxUUHJvcFZhbHVlPiwgVFRWPlxuICApOiBNb2RlbFByb3A8XG4gICAgVFByb3BWYWx1ZSxcbiAgICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gICAgVFRWIHwgRXh0cmFjdDxUUHJvcFZhbHVlLCBudWxsIHwgdW5kZWZpbmVkPixcbiAgICBUVFYgfCBFeHRyYWN0PFRQcm9wQ3JlYXRpb25WYWx1ZSwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gICAgVElzUmVxdWlyZWQsXG4gICAgVElzSWQsXG4gICAgVEhhc1NldHRlcixcbiAgICBURnJvbVNuYXBzaG90T3ZlcnJpZGUsXG4gICAgVFRvU25hcHNob3RPdmVycmlkZVxuICA+XG5cbiAgd2l0aFNuYXBzaG90UHJvY2Vzc29yPFxuICAgIEZTID0gVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRTID0gVFRvU25hcHNob3RPdmVycmlkZSxcbiAgICBUaGlzIGV4dGVuZHMgQW55TW9kZWxQcm9wID0gdGhpc1xuICA+KHByb2Nlc3Nvcjoge1xuICAgIGZyb21TbmFwc2hvdD8oc246IEZTKTogTW9kZWxQcm9wRnJvbVNuYXBzaG90PFRoaXM+XG4gICAgdG9TbmFwc2hvdD8oc246IE1vZGVsUHJvcFRvU25hcHNob3Q8VGhpcz4pOiBUU1xuICB9KTogTW9kZWxQcm9wPFxuICAgIFRQcm9wVmFsdWUsXG4gICAgVFByb3BDcmVhdGlvblZhbHVlLFxuICAgIFRUcmFuc2Zvcm1lZFZhbHVlLFxuICAgIFRUcmFuc2Zvcm1lZENyZWF0aW9uVmFsdWUsXG4gICAgVElzUmVxdWlyZWQsXG4gICAgVElzSWQsXG4gICAgVEhhc1NldHRlcixcbiAgICBGUyxcbiAgICBUU1xuICA+XG59XG5cbi8qKlxuICogVGhlIHNuYXBzaG90IGluIHR5cGUgb2YgYSBtb2RlbCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wRnJvbVNuYXBzaG90PE1QIGV4dGVuZHMgQW55TW9kZWxQcm9wPiA9IElzTmV2ZXJUeXBlPFxuICBNUFtcIl9pbnRlcm5hbFwiXVtcIiRmcm9tU25hcHNob3RPdmVycmlkZVwiXSxcbiAgU25hcHNob3RJbk9mPE1QW1wiX2ludGVybmFsXCJdW1wiJGNyZWF0aW9uVmFsdWVUeXBlXCJdPixcbiAgTVBbXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl1cbj5cblxuLyoqXG4gKiBUaGUgc25hcHNob3Qgb3V0IHR5cGUgb2YgYSBtb2RlbCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wVG9TbmFwc2hvdDxNUCBleHRlbmRzIEFueU1vZGVsUHJvcD4gPSBJc05ldmVyVHlwZTxcbiAgTVBbXCJfaW50ZXJuYWxcIl1bXCIkdG9TbmFwc2hvdE92ZXJyaWRlXCJdLFxuICBTbmFwc2hvdE91dE9mPE1QW1wiX2ludGVybmFsXCJdW1wiJHZhbHVlVHlwZVwiXT4sXG4gIE1QW1wiX2ludGVybmFsXCJdW1wiJHRvU25hcHNob3RPdmVycmlkZVwiXVxuPlxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcCB0cmFuc2Zvcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxQcm9wVHJhbnNmb3JtPFRPcmlnaW5hbCwgVFRyYW5zZm9ybWVkPiB7XG4gIHRyYW5zZm9ybShwYXJhbXM6IHtcbiAgICBvcmlnaW5hbFZhbHVlOiBUT3JpZ2luYWxcbiAgICBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiBUVHJhbnNmb3JtZWQgfCB1bmRlZmluZWRcbiAgICBzZXRPcmlnaW5hbFZhbHVlKHZhbHVlOiBUT3JpZ2luYWwpOiB2b2lkXG4gIH0pOiBUVHJhbnNmb3JtZWRcblxuICB1bnRyYW5zZm9ybShwYXJhbXM6IHsgdHJhbnNmb3JtZWRWYWx1ZTogVFRyYW5zZm9ybWVkOyBjYWNoZVRyYW5zZm9ybWVkVmFsdWUoKTogdm9pZCB9KTogVE9yaWdpbmFsXG59XG5cbi8qKlxuICogQW55IG1vZGVsIHByb3BlcnR5LlxuICovXG5leHBvcnQgdHlwZSBBbnlNb2RlbFByb3AgPSBNb2RlbFByb3A8YW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueT5cblxuLyoqXG4gKiBNb2RlbCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJvcHMge1xuICBbazogc3RyaW5nXTogQW55TW9kZWxQcm9wXG59XG5cbmV4cG9ydCB0eXBlIFJlcXVpcmVkTW9kZWxQcm9wczxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0ge1xuICBbSyBpbiBrZXlvZiBNUF06IE1QW0tdW1wiX2ludGVybmFsXCJdW1wiJGlzUmVxdWlyZWRcIl0gJiBLXG59W2tleW9mIE1QXVxuXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9EYXRhPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBGbGF0dGVuPHtcbiAgW2sgaW4ga2V5b2YgTVBdOiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiR2YWx1ZVR5cGVcIl1cbn0+XG5cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1NuYXBzaG90RGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjx7XG4gIFtrIGluIGtleW9mIE1QXTogTW9kZWxQcm9wVG9TbmFwc2hvdDxNUFtrXT4gZXh0ZW5kcyBpbmZlciBSID8gUiA6IG5ldmVyXG59PlxuXG4vLyB3ZSBkb24ndCB1c2UgTy5PcHRpb25hbCBhbnltb3JlIHNpbmNlIGl0IGdlbmVyYXRlcyB1bmlvbnMgdG9vIGhlYXZ5XG4vLyBhbHNvIGlmIHdlIHVzZSBwaWNrIG92ZXIgdGhlIG9wdGlvbmFsIHByb3BzIHdlIHdpbGwgbG9vc2UgdGhlIGFiaWxpdHlcbi8vIHRvIGluZmVyIGdlbmVyaWNzXG4vLyB3ZSBhbHNvIGRvbid0IHVzZSBGbGF0dGVuIGJlY2F1c2UgaWYgd2UgZG8gc29tZSBnZW5lcmljcyB3b24ndCB3b3JrXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9DcmVhdGlvbkRhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IHtcbiAgW2sgaW4ga2V5b2YgTVBdPzogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkY3JlYXRpb25WYWx1ZVR5cGVcIl1cbn0gJiB7XG4gIFtrIGluIFJlcXVpcmVkTW9kZWxQcm9wczxNUD5dOiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiRjcmVhdGlvblZhbHVlVHlwZVwiXVxufVxuXG4vLyB3ZSBkb24ndCB1c2UgTy5PcHRpb25hbCBhbnltb3JlIHNpbmNlIGl0IGdlbmVyYXRlcyB1bmlvbnMgdG9vIGhlYXZ5XG4vLyBhbHNvIGlmIHdlIHVzZSBwaWNrIG92ZXIgdGhlIG9wdGlvbmFsIHByb3BzIHdlIHdpbGwgbG9vc2UgdGhlIGFiaWxpdHlcbi8vIHRvIGluZmVyIGdlbmVyaWNzXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjxcbiAge1xuICAgIFtrIGluIGtleW9mIE1QXT86IE1vZGVsUHJvcEZyb21TbmFwc2hvdDxNUFtrXT4gZXh0ZW5kcyBpbmZlciBSID8gUiA6IG5ldmVyXG4gIH0gJiB7XG4gICAgW2sgaW4ge1xuICAgICAgW0sgaW4ga2V5b2YgTVBdOiBJc05ldmVyVHlwZTxcbiAgICAgICAgTVBbS11bXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl0sXG4gICAgICAgIE1QW0tdW1wiX2ludGVybmFsXCJdW1wiJGlzUmVxdWlyZWRcIl0gJiBLLCAvLyBubyBvdmVycmlkZVxuICAgICAgICBJc09wdGlvbmFsVmFsdWU8TVBbS11bXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl0sIG5ldmVyLCBLPiAvLyB3aXRoIG92ZXJyaWRlXG4gICAgICA+XG4gICAgfVtrZXlvZiBNUF1dOiBNb2RlbFByb3BGcm9tU25hcHNob3Q8TVBba10+IGV4dGVuZHMgaW5mZXIgUiA/IFIgOiBuZXZlclxuICB9XG4+XG5cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjx7XG4gIFtrIGluIGtleW9mIE1QXTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdHJhbnNmb3JtZWRWYWx1ZVR5cGVcIl1cbn0+XG5cbi8vIHdlIGRvbid0IHVzZSBPLk9wdGlvbmFsIGFueW1vcmUgc2luY2UgaXQgZ2VuZXJhdGVzIHVuaW9ucyB0b28gaGVhdnlcbi8vIGFsc28gaWYgd2UgdXNlIHBpY2sgb3ZlciB0aGUgb3B0aW9uYWwgcHJvcHMgd2Ugd2lsbCBsb29zZSB0aGUgYWJpbGl0eVxuLy8gdG8gaW5mZXIgZ2VuZXJpY3Ncbi8vIHdlIGFsc28gZG9uJ3QgdXNlIEZsYXR0ZW4gYmVjYXVzZSBpZiB3ZSBkbyBzb21lIGdlbmVyaWNzIHdvbid0IHdvcmtcbi8vIHdlIGFsc28gZG9uJ3QgdXNlIE9taXQgYmVjYXVzZSBpZiB3ZSBkbyBzb21lIGdlbmVyaWNzIHdvbid0IHdvcmtcbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSB7XG4gIFtrIGluIGtleW9mIE1QXT86IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJHRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVR5cGVcIl1cbn0gJiB7XG4gIFtrIGluIFJlcXVpcmVkTW9kZWxQcm9wczxNUD5dOiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiR0cmFuc2Zvcm1lZENyZWF0aW9uVmFsdWVUeXBlXCJdXG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1NldHRlcjxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjx7XG4gIFtrIGluIGtleW9mIE1QIGFzIE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJGhhc1NldHRlclwiXSAmIGBzZXQke0NhcGl0YWxpemU8ayAmIHN0cmluZz59YF06IChcbiAgICB2YWx1ZTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdHJhbnNmb3JtZWRWYWx1ZVR5cGVcIl1cbiAgKSA9PiB2b2lkXG59PlxuXG5leHBvcnQgdHlwZSBNb2RlbElkUHJvcCA9IE1vZGVsUHJvcDxcbiAgc3RyaW5nLFxuICBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHN0cmluZyxcbiAgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBuZXZlciwgLy8gbm90IHJlcXVpcmVkXG4gIHRydWVcbj5cblxuLyoqXG4gKiBBIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGFzIG1vZGVsIGlkLCBhY2Nlc3NpYmxlIHRocm91Z2ggJG1vZGVsSWQuXG4gKiBDYW4gb25seSBiZSB1c2VkIGluIG1vZGVscyBhbmQgdGhlcmUgY2FuIGJlIG9ubHkgb25lIHBlciBtb2RlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlkUHJvcCA9IHtcbiAgX2ludGVybmFsOiB7XG4gICAgc2V0dGVyOiBmYWxzZSxcbiAgICBpc0lkOiB0cnVlLFxuICB9LFxuXG4gIHdpdGhTZXR0ZXIobW9kZT86IGJvb2xlYW4gfCBcImFzc2lnblwiKSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcywgX2ludGVybmFsOiB7IC4uLnRoaXMuX2ludGVybmFsLCBzZXR0ZXI6IG1vZGUgPz8gdHJ1ZSB9IH1cbiAgfSxcbn0gYXMgYW55IGFzIE1vZGVsSWRQcm9wXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgdHlwZSBPbmx5UHJpbWl0aXZlczxUPiA9IEV4Y2x1ZGU8VCwgb2JqZWN0PlxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcCB0aGF0IG1heWJlIC8gbWF5YmUgbm90IGlzIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gaWYgdGhlIHZhbHVlIGNhbiB0YWtlIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWF5YmVPcHRpb25hbE1vZGVsUHJvcDxUUHJvcFZhbHVlPiA9IE1vZGVsUHJvcDxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSxcbiAgSXNPcHRpb25hbFZhbHVlPFRQcm9wVmFsdWUsIG5ldmVyLCBzdHJpbmc+IC8vIGNhbGN1bGF0ZSBpZiByZXF1aXJlZFxuPlxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcCB0aGF0IGlzIGRlZmluaXRlbHkgb3B0aW9uYWwuXG4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvbmFsTW9kZWxQcm9wPFRQcm9wVmFsdWU+ID0gTW9kZWxQcm9wPFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgVFByb3BWYWx1ZSxcbiAgVFByb3BWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG5ldmVyIC8vIG5vdCByZXF1aXJlZFxuPlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSwgd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgdmFsdWVcbiAqIGlmIHRoZSBpbnB1dCBzbmFwc2hvdCAvIG1vZGVsIGNyZWF0aW9uIGRhdGEgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogcHJvcCgoKSA9PiAxMCkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiAxMFxuICogeDogcHJvcDxudW1iZXJbXT4oKCkgPT4gW10pIC8vIGFuIG9wdGlvbmFsIG51bWJlciBhcnJheSwgd2l0aCBhIGRlZmF1bHQgZW1wdHkgYXJyYXlcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFZhbHVlIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gZGVmYXVsdEZuIERlZmF1bHQgdmFsdWUgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3A8VFZhbHVlPihkZWZhdWx0Rm46ICgpID0+IFRWYWx1ZSk6IE9wdGlvbmFsTW9kZWxQcm9wPFRWYWx1ZT5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbW9kZWwgcHJvcGVydHksIHdpdGggYW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZVxuICogaWYgdGhlIGlucHV0IHNuYXBzaG90IC8gbW9kZWwgY3JlYXRpb24gZGF0YSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKiBZb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgd2l0aCBwcmltaXRpdmUgdmFsdWVzIGFuZCBuZXZlciB3aXRoIG9iamVjdCB2YWx1ZXNcbiAqIChhcnJheSwgbW9kZWwsIG9iamVjdCwgZXRjKS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHByb3AoMTApIC8vIGFuIG9wdGlvbmFsIG51bWJlciwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgMTBcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFZhbHVlIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgcHJpbWl0aXZlIHZhbHVlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3A8VFZhbHVlPihkZWZhdWx0VmFsdWU6IE9ubHlQcmltaXRpdmVzPFRWYWx1ZT4pOiBPcHRpb25hbE1vZGVsUHJvcDxUVmFsdWU+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5IHdpdGggbm8gZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHByb3A8bnVtYmVyPigpIC8vIGEgcmVxdWlyZWQgbnVtYmVyXG4gKiB4OiBwcm9wPG51bWJlciB8IHVuZGVmaW5lZD4oKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdoaWNoIGRlZmF1bHRzIHRvIHVuZGVmaW5lZFxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUVmFsdWUgVmFsdWUgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wPFRWYWx1ZT4oKTogTWF5YmVPcHRpb25hbE1vZGVsUHJvcDxUVmFsdWU+XG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBwcm9wKGRlZj86IGFueSk6IEFueU1vZGVsUHJvcCB7XG4gIGxldCBoYXNEZWZhdWx0VmFsdWUgPSBmYWxzZVxuXG4gIC8vIGRlZmF1bHRcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMSkge1xuICAgIGhhc0RlZmF1bHRWYWx1ZSA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IGlzRGVmRm4gPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCJcblxuICBjb25zdCBvYmo6IEFueU1vZGVsUHJvcCA9IHtcbiAgICBfaW50ZXJuYWw6IHtcbiAgICAgICR2YWx1ZVR5cGU6IG51bGwgYXMgYW55LFxuICAgICAgJGNyZWF0aW9uVmFsdWVUeXBlOiBudWxsIGFzIGFueSxcbiAgICAgICR0cmFuc2Zvcm1lZFZhbHVlVHlwZTogbnVsbCBhcyBhbnksXG4gICAgICAkdHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlVHlwZTogbnVsbCBhcyBhbnksXG4gICAgICAkaXNSZXF1aXJlZDogbnVsbCBhcyBuZXZlcixcbiAgICAgICRpc0lkOiBudWxsIGFzIG5ldmVyLFxuICAgICAgJGhhc1NldHRlcjogbnVsbCBhcyBuZXZlcixcbiAgICAgICRmcm9tU25hcHNob3RPdmVycmlkZTogbnVsbCBhcyBuZXZlcixcbiAgICAgICR0b1NuYXBzaG90T3ZlcnJpZGU6IG51bGwgYXMgbmV2ZXIsXG5cbiAgICAgIGRlZmF1bHRGbjogaGFzRGVmYXVsdFZhbHVlICYmIGlzRGVmRm4gPyBkZWYgOiBub0RlZmF1bHRWYWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogaGFzRGVmYXVsdFZhbHVlICYmICFpc0RlZkZuID8gZGVmIDogbm9EZWZhdWx0VmFsdWUsXG4gICAgICB0eXBlQ2hlY2tlcjogdW5kZWZpbmVkLFxuICAgICAgc2V0dGVyOiBmYWxzZSxcbiAgICAgIGlzSWQ6IGZhbHNlLFxuICAgICAgdHJhbnNmb3JtOiB1bmRlZmluZWQsXG4gICAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IHVuZGVmaW5lZCxcbiAgICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IHVuZGVmaW5lZCxcbiAgICB9LFxuXG4gICAgd2l0aFNldHRlcihtb2RlPzogYm9vbGVhbiB8IFwiYXNzaWduXCIpIHtcbiAgICAgIHJldHVybiB7IC4uLnRoaXMsIF9pbnRlcm5hbDogeyAuLi50aGlzLl9pbnRlcm5hbCwgc2V0dGVyOiBtb2RlID8/IHRydWUgfSB9XG4gICAgfSxcblxuICAgIHdpdGhUcmFuc2Zvcm0odHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICAgIHJldHVybiB7IC4uLnRoaXMsIF9pbnRlcm5hbDogeyAuLi50aGlzLl9pbnRlcm5hbCwgdHJhbnNmb3JtOiB0b0Z1bGxUcmFuc2Zvcm0odHJhbnNmb3JtKSB9IH1cbiAgICB9LFxuXG4gICAgd2l0aFNuYXBzaG90UHJvY2Vzc29yKHsgZnJvbVNuYXBzaG90LCB0b1NuYXBzaG90IH0pIHtcbiAgICAgIGxldCBuZXdGcm9tU25hcHNob3RcblxuICAgICAgaWYgKHRoaXMuX2ludGVybmFsLmZyb21TbmFwc2hvdFByb2Nlc3NvciAmJiBmcm9tU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgb2xkRm4gPSB0aGlzLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgICAgICAgY29uc3QgbmV3Rm4gPSBmcm9tU25hcHNob3RcbiAgICAgICAgbmV3RnJvbVNuYXBzaG90ID0gKHNuOiBhbnkpID0+IG9sZEZuKG5ld0ZuKHNuKSlcbiAgICAgIH0gZWxzZSBpZiAoZnJvbVNuYXBzaG90KSB7XG4gICAgICAgIG5ld0Zyb21TbmFwc2hvdCA9IGZyb21TbmFwc2hvdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RnJvbVNuYXBzaG90ID0gdGhpcy5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdUb1NuYXBzaG90XG5cbiAgICAgIGlmICh0aGlzLl9pbnRlcm5hbC50b1NuYXBzaG90UHJvY2Vzc29yICYmIHRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgb2xkRm46IGFueSA9IHRoaXMuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgICAgICAgY29uc3QgbmV3Rm4gPSB0b1NuYXBzaG90XG4gICAgICAgIG5ld1RvU25hcHNob3QgPSAoc246IGFueSkgPT4gbmV3Rm4ob2xkRm4oc24pKVxuICAgICAgfSBlbHNlIGlmICh0b1NuYXBzaG90KSB7XG4gICAgICAgIG5ld1RvU25hcHNob3QgPSB0b1NuYXBzaG90XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdUb1NuYXBzaG90ID0gdGhpcy5faW50ZXJuYWwudG9TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLFxuICAgICAgICBfaW50ZXJuYWw6IHtcbiAgICAgICAgICAuLi50aGlzLl9pbnRlcm5hbCxcbiAgICAgICAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IG5ld0Zyb21TbmFwc2hvdCxcbiAgICAgICAgICB0b1NuYXBzaG90UHJvY2Vzc29yOiBuZXdUb1NuYXBzaG90LFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmxldCBjYWNoZVRyYW5zZm9ybVJlc3VsdCA9IGZhbHNlXG5jb25zdCBjYWNoZVRyYW5zZm9ybWVkVmFsdWVGbiA9ICgpID0+IHtcbiAgY2FjaGVUcmFuc2Zvcm1SZXN1bHQgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIHRvRnVsbFRyYW5zZm9ybSh0cmFuc2Zvcm1PYmplY3Q6IE1vZGVsUHJvcFRyYW5zZm9ybTx1bmtub3duLCB1bmtub3duPikge1xuICBjb25zdCBjYWNoZSA9IG5ldyBXZWFrTWFwPFxuICAgIG9iamVjdCxcbiAgICBNYXA8UHJvcGVydHlLZXksIHsgb3JpZ2luYWxWYWx1ZTogdW5rbm93bjsgdHJhbnNmb3JtZWRWYWx1ZTogdW5rbm93biB9PlxuICA+KClcblxuICBjb25zdCB0cmFuc2Zvcm0gPSAocGFyYW1zOiB7XG4gICAgb3JpZ2luYWxWYWx1ZTogdW5rbm93blxuICAgIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWU6IHVua25vd25cbiAgICBzZXRPcmlnaW5hbFZhbHVlKG5ld09yaWdpbmFsVmFsdWU6IHVua25vd24pOiB2b2lkXG4gIH0pID0+IChwYXJhbXMub3JpZ2luYWxWYWx1ZSA9PSBudWxsID8gcGFyYW1zLm9yaWdpbmFsVmFsdWUgOiB0cmFuc2Zvcm1PYmplY3QudHJhbnNmb3JtKHBhcmFtcykpXG5cbiAgY29uc3QgdW50cmFuc2Zvcm0gPSAocGFyYW1zOiB7IHRyYW5zZm9ybWVkVmFsdWU6IHVua25vd247IGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSgpOiB2b2lkIH0pID0+XG4gICAgcGFyYW1zLnRyYW5zZm9ybWVkVmFsdWUgPT0gbnVsbCA/IHBhcmFtcy50cmFuc2Zvcm1lZFZhbHVlIDogdHJhbnNmb3JtT2JqZWN0LnVudHJhbnNmb3JtKHBhcmFtcylcblxuICByZXR1cm4ge1xuICAgIHRyYW5zZm9ybShcbiAgICAgIG9yaWdpbmFsVmFsdWU6IHVua25vd24sXG4gICAgICBtb2RlbDogb2JqZWN0LFxuICAgICAgcHJvcE5hbWU6IFByb3BlcnR5S2V5LFxuICAgICAgc2V0T3JpZ2luYWxWYWx1ZTogKG5ld09yaWdpbmFsVmFsdWU6IHVua25vd24pID0+IHZvaWRcbiAgICApIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2FjaGUgPSBnZXRPckNyZWF0ZShjYWNoZSwgbW9kZWwsICgpID0+IG5ldyBNYXAoKSlcblxuICAgICAgbGV0IHByb3BDYWNoZSA9IG1vZGVsQ2FjaGUuZ2V0KHByb3BOYW1lKVxuICAgICAgaWYgKHByb3BDYWNoZT8ub3JpZ2luYWxWYWx1ZSAhPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAvLyBvcmlnaW5hbCBjaGFuZ2VkLCBpbnZhbGlkYXRlIGNhY2hlXG4gICAgICAgIG1vZGVsQ2FjaGUuZGVsZXRlKHByb3BOYW1lKVxuICAgICAgICBwcm9wQ2FjaGUgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybSh7XG4gICAgICAgIG9yaWdpbmFsVmFsdWUsXG4gICAgICAgIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWU6IHByb3BDYWNoZT8udHJhbnNmb3JtZWRWYWx1ZSxcbiAgICAgICAgc2V0T3JpZ2luYWxWYWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIG1vZGVsQ2FjaGUuc2V0KHByb3BOYW1lLCB7XG4gICAgICAgIG9yaWdpbmFsVmFsdWUsXG4gICAgICAgIHRyYW5zZm9ybWVkVmFsdWUsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gdHJhbnNmb3JtZWRWYWx1ZVxuICAgIH0sXG5cbiAgICB1bnRyYW5zZm9ybSh0cmFuc2Zvcm1lZFZhbHVlOiB1bmtub3duLCBtb2RlbDogb2JqZWN0LCBwcm9wTmFtZTogUHJvcGVydHlLZXkpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2FjaGUgPSBnZXRPckNyZWF0ZShjYWNoZSwgbW9kZWwsICgpID0+IG5ldyBNYXAoKSlcblxuICAgICAgY2FjaGVUcmFuc2Zvcm1SZXN1bHQgPSBmYWxzZVxuICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHVudHJhbnNmb3JtKHtcbiAgICAgICAgdHJhbnNmb3JtZWRWYWx1ZSxcbiAgICAgICAgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlOiBjYWNoZVRyYW5zZm9ybWVkVmFsdWVGbixcbiAgICAgIH0pXG4gICAgICBpZiAoY2FjaGVUcmFuc2Zvcm1SZXN1bHQpIHtcbiAgICAgICAgbW9kZWxDYWNoZS5zZXQocHJvcE5hbWUsIHsgb3JpZ2luYWxWYWx1ZSwgdHJhbnNmb3JtZWRWYWx1ZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kZWxDYWNoZS5kZWxldGUocHJvcE5hbWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbFZhbHVlXG4gICAgfSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlIH0gZnJvbSBcIi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuL3NjaGVtYXNcIlxuaW1wb3J0IHR5cGUgeyBMYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyLCBUeXBlSW5mbyB9IGZyb20gXCIuL1R5cGVDaGVja2VyXCJcblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIGluZm8gb2YgYSBnaXZlbiB0eXBlLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgdG8gZ2V0IHRoZSBpbmZvIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUluZm8odHlwZTogQW55VHlwZSk6IFR5cGVJbmZvIHtcbiAgY29uc3Qgc3RkVHlwZSA9IHJlc29sdmVTdGFuZGFyZFR5cGUodHlwZSlcbiAgY29uc3QgdHlwZUluZm8gPSAoc3RkVHlwZSBhcyBhbnkgYXMgVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXIpLnR5cGVJbmZvXG4gIGlmICghdHlwZUluZm8pIHtcbiAgICB0aHJvdyBmYWlsdXJlKGB0eXBlIGluZm8gbm90IGZvdW5kIGZvciAke3R5cGV9YClcbiAgfVxuICByZXR1cm4gdHlwZUluZm9cbn1cbiIsImltcG9ydCB7IGdldFJvb3RQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgdHlwZSBjaGVja2luZyBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVDaGVja0Vycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVHlwZUVycm9yLlxuICAgKiBAcGFyYW0gcGF0aCBTdWItcGF0aCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC5cbiAgICogQHBhcmFtIGV4cGVjdGVkVHlwZU5hbWUgTmFtZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZS5cbiAgICogQHBhcmFtIGFjdHVhbFZhbHVlIEFjdHVhbCB2YWx1ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHBhdGg6IFBhdGgsIHJlYWRvbmx5IGV4cGVjdGVkVHlwZU5hbWU6IHN0cmluZywgcmVhZG9ubHkgYWN0dWFsVmFsdWU6IGFueSkge31cblxuICAvKipcbiAgICogVGhyb3dzIHRoZSB0eXBlIGNoZWNrIGVycm9yIGFzIGFuIGFjdHVhbCBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHR5cGVDaGVja2VkVmFsdWUgVXN1YWxseSB0aGUgdmFsdWUgd2hlcmUgdGhlIHR5cGUgY2hlY2sgd2FzIGludm9rZWQuXG4gICAqL1xuICB0aHJvdyh0eXBlQ2hlY2tlZFZhbHVlOiBhbnkpOiBuZXZlciB7XG4gICAgbGV0IG1zZyA9IFwiVHlwZUNoZWNrRXJyb3I6IFwiXG4gICAgbGV0IHJvb3RQYXRoOiBQYXRoID0gW11cbiAgICBpZiAoaXNUd2Vha2VkT2JqZWN0KHR5cGVDaGVja2VkVmFsdWUsIHRydWUpKSB7XG4gICAgICByb290UGF0aCA9IGdldFJvb3RQYXRoKHR5cGVDaGVja2VkVmFsdWUpLnBhdGhcbiAgICB9XG5cbiAgICBtc2cgKz0gXCJbL1wiICsgWy4uLnJvb3RQYXRoLCAuLi50aGlzLnBhdGhdLmpvaW4oXCIvXCIpICsgXCJdIFwiXG5cbiAgICBtc2cgKz0gXCJFeHBlY3RlZDogXCIgKyB0aGlzLmV4cGVjdGVkVHlwZU5hbWVcblxuICAgIHRocm93IGZhaWx1cmUobXNnKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmYXN0R2V0UGFyZW50SW5jbHVkaW5nRGF0YU9iamVjdHMgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBpc0FycmF5LCBpc09iamVjdCwgaXNQcmltaXRpdmUsIGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4vVHlwZUNoZWNrRXJyb3JcIlxuXG50eXBlIENoZWNrRnVuY3Rpb24gPSAodmFsdWU6IGFueSwgcGF0aDogUGF0aCkgPT4gVHlwZUNoZWNrRXJyb3IgfCBudWxsXG5cbmNvbnN0IGVtcHR5UGF0aDogUGF0aCA9IFtdXG5cbnR5cGUgQ2hlY2tSZXN1bHQgPSBUeXBlQ2hlY2tFcnJvciB8IG51bGxcbnR5cGUgQ2hlY2tSZXN1bHRDYWNoZSA9IFdlYWtNYXA8b2JqZWN0LCBDaGVja1Jlc3VsdD5cblxuY29uc3QgdHlwZUNoZWNrZXJzV2l0aENhY2hlZFJlc3VsdHNPZk9iamVjdCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU2V0PFR5cGVDaGVja2VyPj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZW51bSBUeXBlQ2hlY2tlckJhc2VUeXBlIHtcbiAgT2JqZWN0ID0gXCJvYmplY3RcIixcbiAgQXJyYXkgPSBcImFycmF5XCIsXG4gIFByaW1pdGl2ZSA9IFwicHJpbWl0aXZlXCIsXG4gIEFueSA9IFwiYW55XCIsXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ2hlY2tlckJhc2VUeXBlRnJvbVZhbHVlKHZhbHVlOiBhbnkpOiBUeXBlQ2hlY2tlckJhc2VUeXBlIHtcbiAgLy8gYXJyYXkgbXVzdCBiZSBiZWZvcmUgb2JqZWN0IHNpbmNlIGFycmF5cyBhcmUgYWxzbyBvYmplY3RzXG4gIGlmIChpc0FycmF5KHZhbHVlKSkgcmV0dXJuIFR5cGVDaGVja2VyQmFzZVR5cGUuQXJyYXlcbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0XG4gIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHJldHVybiBUeXBlQ2hlY2tlckJhc2VUeXBlLlByaW1pdGl2ZVxuICByZXR1cm4gVHlwZUNoZWNrZXJCYXNlVHlwZS5Bbnlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRhdGVDYWNoZWRUeXBlQ2hlY2tlclJlc3VsdChvYmo6IG9iamVjdCkge1xuICAvLyB3ZSBuZWVkIHRvIGludmFsaWRhdGUgaXQgZm9yIHRoZSBvYmplY3QgYW5kIGFsbCBpdHMgcGFyZW50c1xuICBsZXQgY3VycmVudDogYW55ID0gb2JqXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgY29uc3Qgc2V0ID0gdHlwZUNoZWNrZXJzV2l0aENhY2hlZFJlc3VsdHNPZk9iamVjdC5nZXQoY3VycmVudClcbiAgICBpZiAoc2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHR5cGVDaGVja2VyIG9mIHNldCkge1xuICAgICAgICB0eXBlQ2hlY2tlci5pbnZhbGlkYXRlQ2FjaGVkUmVzdWx0KGN1cnJlbnQpXG4gICAgICB9XG4gICAgICB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkUmVzdWx0c09mT2JqZWN0LmRlbGV0ZShjdXJyZW50KVxuICAgIH1cblxuICAgIGN1cnJlbnQgPSBmYXN0R2V0UGFyZW50SW5jbHVkaW5nRGF0YU9iamVjdHMoY3VycmVudClcbiAgfVxufVxuXG5jb25zdCB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkU25hcHNob3RQcm9jZXNzb3JSZXN1bHRzT2ZPYmplY3QgPSBuZXcgV2Vha01hcDxcbiAgb2JqZWN0LFxuICBTZXQ8VHlwZUNoZWNrZXI+XG4+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRhdGVDYWNoZWRUb1NuYXBzaG90UHJvY2Vzc29yUmVzdWx0KG9iajogb2JqZWN0KSB7XG4gIGNvbnN0IHNldCA9IHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRTbmFwc2hvdFByb2Nlc3NvclJlc3VsdHNPZk9iamVjdC5nZXQob2JqKVxuXG4gIGlmIChzZXQpIHtcbiAgICBzZXQuZm9yRWFjaCgodHlwZUNoZWNrZXIpID0+IHR5cGVDaGVja2VyLmludmFsaWRhdGVTbmFwc2hvdFByb2Nlc3NvckNhY2hlZFJlc3VsdChvYmopKVxuICAgIHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRTbmFwc2hvdFByb2Nlc3NvclJlc3VsdHNPZk9iamVjdC5kZWxldGUob2JqKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlQ2hlY2tlciB7XG4gIHByaXZhdGUgY2hlY2tSZXN1bHRDYWNoZT86IENoZWNrUmVzdWx0Q2FjaGVcblxuICB1bmNoZWNrZWQ6IGJvb2xlYW5cblxuICBwcml2YXRlIGNyZWF0ZUNhY2hlSWZOZWVkZWQoKTogQ2hlY2tSZXN1bHRDYWNoZSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrUmVzdWx0Q2FjaGUpIHtcbiAgICAgIHRoaXMuY2hlY2tSZXN1bHRDYWNoZSA9IG5ldyBXZWFrTWFwKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXN1bHRDYWNoZVxuICB9XG5cbiAgc2V0Q2FjaGVkUmVzdWx0KG9iajogb2JqZWN0LCBuZXdDYWNoZVZhbHVlOiBDaGVja1Jlc3VsdCkge1xuICAgIHRoaXMuY3JlYXRlQ2FjaGVJZk5lZWRlZCgpLnNldChvYmosIG5ld0NhY2hlVmFsdWUpXG5cbiAgICAvLyByZWdpc3RlciB0aGlzIHR5cGUgY2hlY2tlciBhcyBsaXN0ZW5lciBvZiB0aGF0IG9iamVjdCBjaGFuZ2VzXG4gICAgY29uc3QgdHlwZUNoZWNrZXJTZXQgPSBnZXRPckNyZWF0ZSh0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkUmVzdWx0c09mT2JqZWN0LCBvYmosICgpID0+IG5ldyBTZXQoKSlcblxuICAgIHR5cGVDaGVja2VyU2V0LmFkZCh0aGlzKVxuICB9XG5cbiAgaW52YWxpZGF0ZUNhY2hlZFJlc3VsdChvYmo6IG9iamVjdCkge1xuICAgIHRoaXMuY2hlY2tSZXN1bHRDYWNoZT8uZGVsZXRlKG9iailcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FjaGVkUmVzdWx0KG9iajogb2JqZWN0KTogQ2hlY2tSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzdWx0Q2FjaGU/LmdldChvYmopXG4gIH1cblxuICBjaGVjayh2YWx1ZTogYW55LCBwYXRoOiBQYXRoKTogVHlwZUNoZWNrRXJyb3IgfCBudWxsIHtcbiAgICBpZiAodGhpcy51bmNoZWNrZWQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKCFpc1R3ZWFrZWRPYmplY3QodmFsdWUsIHRydWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2shKHZhbHVlLCBwYXRoKVxuICAgIH1cblxuICAgIC8vIG9wdGltaXplZCBjaGVja2luZyB3aXRoIGNhY2hlZCB2YWx1ZXNcblxuICAgIGxldCBjYWNoZWRSZXN1bHQgPSB0aGlzLmdldENhY2hlZFJlc3VsdCh2YWx1ZSlcblxuICAgIGlmIChjYWNoZWRSZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gd2Ugc2V0IHRoZSBwYXRoIGVtcHR5IHNpbmNlIHRoZSByZXN1bHQgY291bGQgYmUgdXNlZCBmb3IgcGF0aHMgb3RoZXIgdGhhbiB0aGlzIGJhc2VcbiAgICAgIGNhY2hlZFJlc3VsdCA9IHRoaXMuX2NoZWNrISh2YWx1ZSwgZW1wdHlQYXRoKVxuICAgICAgdGhpcy5zZXRDYWNoZWRSZXN1bHQodmFsdWUsIGNhY2hlZFJlc3VsdClcbiAgICB9XG5cbiAgICBpZiAoY2FjaGVkUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKFxuICAgICAgICBbLi4ucGF0aCwgLi4uY2FjaGVkUmVzdWx0LnBhdGhdLFxuICAgICAgICBjYWNoZWRSZXN1bHQuZXhwZWN0ZWRUeXBlTmFtZSxcbiAgICAgICAgY2FjaGVkUmVzdWx0LmFjdHVhbFZhbHVlXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGVkVHlwZUluZm9HZW46IFR5cGVJbmZvR2VuXG5cbiAgZ2V0IHR5cGVJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWRUeXBlSW5mb0dlbih0aGlzIGFzIGFueSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGJhc2VUeXBlOiBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoZWNrOiBDaGVja0Z1bmN0aW9uIHwgbnVsbCxcbiAgICByZWFkb25seSBnZXRUeXBlTmFtZTogKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4gc3RyaW5nLFxuICAgIHJlYWRvbmx5IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbixcbiAgICByZWFkb25seSBzbmFwc2hvdFR5cGU6IChzbjogdW5rbm93bikgPT4gVHlwZUNoZWNrZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Zyb21TbmFwc2hvdFByb2Nlc3NvcjogKHNuOiBhbnkpID0+IHVua25vd24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdG9TbmFwc2hvdFByb2Nlc3NvcjogKHNuOiBhbnkpID0+IHVua25vd25cbiAgKSB7XG4gICAgdGhpcy51bmNoZWNrZWQgPSAhX2NoZWNrXG4gICAgdGhpcy5fY2FjaGVkVHlwZUluZm9HZW4gPSBsYXp5KHR5cGVJbmZvR2VuKVxuICB9XG5cbiAgZnJvbVNuYXBzaG90UHJvY2Vzc29yID0gKHNuOiBhbnkpOiB1bmtub3duID0+IHtcbiAgICAvLyB3ZSBjYW5ub3QgY2FjaGUgZnJvbVNuYXBzaG90UHJvY2Vzc29yIHNpbmNlIG5vYm9keSBlbnN1cmVzIHVzXG4gICAgLy8gdGhlIG9yaWdpbmFsIHNuYXBzaG90IHdvbid0IGJlIHR3ZWFrZWQgYWZ0ZXIgdXNlXG4gICAgcmV0dXJuIHRoaXMuX2Zyb21TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgdW5rbm93bj4oKVxuXG4gIGludmFsaWRhdGVTbmFwc2hvdFByb2Nlc3NvckNhY2hlZFJlc3VsdChvYmo6IG9iamVjdCkge1xuICAgIHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZS5kZWxldGUob2JqKVxuICB9XG5cbiAgdG9TbmFwc2hvdFByb2Nlc3NvciA9IChzbjogYW55KTogdW5rbm93biA9PiB7XG4gICAgaWYgKHR5cGVvZiBzbiAhPT0gXCJvYmplY3RcIiB8fCBzbiA9PT0gbnVsbCkge1xuICAgICAgLy8gbm90IGNhY2hlYWJsZVxuICAgICAgcmV0dXJuIHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZS5oYXMoc24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdG9TbmFwc2hvdFByb2Nlc3NvckNhY2hlLmdldChzbilcbiAgICB9XG5cbiAgICBjb25zdCB2YWwgPSB0aGlzLl90b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgIHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3JDYWNoZS5zZXQoc24sIHZhbClcblxuICAgIC8vIHJlZ2lzdGVyIHRoaXMgdHlwZSBjaGVja2VyIGFzIGxpc3RlbmVyIG9mIHRoYXQgc24gY2hhbmdlc1xuICAgIGNvbnN0IHR5cGVDaGVja2VyU2V0ID0gZ2V0T3JDcmVhdGUoXG4gICAgICB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkU25hcHNob3RQcm9jZXNzb3JSZXN1bHRzT2ZPYmplY3QsXG4gICAgICBzbixcbiAgICAgICgpID0+IG5ldyBTZXQoKVxuICAgIClcblxuICAgIHR5cGVDaGVja2VyU2V0LmFkZCh0aGlzKVxuXG4gICAgcmV0dXJuIHZhbFxuICB9XG59XG5cbmNvbnN0IGxhdGVUeXBlQ2hlY2tlclN5bWJvbCA9IFN5bWJvbChcImxhdGVUeXBlQ2hla2VyXCIpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZVR5cGVDaGVja2VyIHtcbiAgW2xhdGVUeXBlQ2hlY2tlclN5bWJvbF06IHRydWVcbiAgKCk6IFR5cGVDaGVja2VyXG4gIHR5cGVJbmZvOiBUeXBlSW5mb1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF0ZVR5cGVDaGVja2VyKGZuOiAoKSA9PiBUeXBlQ2hlY2tlciwgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuKTogTGF0ZVR5cGVDaGVja2VyIHtcbiAgbGV0IGNhY2hlZDogVHlwZUNoZWNrZXIgfCB1bmRlZmluZWRcbiAgY29uc3QgbHRjID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRcbiAgICB9XG5cbiAgICBjYWNoZWQgPSBmbigpXG4gICAgcmV0dXJuIGNhY2hlZFxuICB9XG4gIDsobHRjIGFzIExhdGVUeXBlQ2hlY2tlcilbbGF0ZVR5cGVDaGVja2VyU3ltYm9sXSA9IHRydWVcblxuICBjb25zdCBjYWNoZWRUeXBlSW5mb0dlbiA9IGxhenkodHlwZUluZm9HZW4pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGx0YywgXCJ0eXBlSW5mb1wiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFR5cGVJbmZvR2VuKGx0YyBhcyBhbnkpXG4gICAgfSxcbiAgfSlcblxuICByZXR1cm4gbHRjIGFzIExhdGVUeXBlQ2hlY2tlclxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYXRlVHlwZUNoZWNrZXIobHRjOiB1bmtub3duKTogbHRjIGlzIExhdGVUeXBlQ2hlY2tlciB7XG4gIHJldHVybiB0eXBlb2YgbHRjID09PSBcImZ1bmN0aW9uXCIgJiYgbGF0ZVR5cGVDaGVja2VyU3ltYm9sIGluIGx0Y1xufVxuXG4vKipcbiAqIFR5cGUgaW5mbyBiYXNlIGNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZUluZm8ge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSB0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7fVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBUeXBlSW5mb0dlbiA9ICh0OiBBbnlTdGFuZGFyZFR5cGUpID0+IFR5cGVJbmZvXG4iLCJpbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi8uLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi8uLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi8uLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8gfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHsgbm9EZWZhdWx0VmFsdWUgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBpc09iamVjdCwgbGF6eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQgeyByZWdpc3RlclN0YW5kYXJkVHlwZVJlc29sdmVyLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBNb2RlbFR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5cbmNvbnN0IGNhY2hlZE1vZGVsVHlwZUNoZWNrZXIgPSBuZXcgV2Vha01hcDxNb2RlbENsYXNzPEFueU1vZGVsPiwgVHlwZUNoZWNrZXI+KClcblxudHlwZSBfQ2xhc3M8VD4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG50eXBlIF9DbGFzc09yT2JqZWN0PE0sIEs+ID0gSyBleHRlbmRzIE0gPyBvYmplY3QgOiBfQ2xhc3M8Sz4gfCAoKCkgPT4gX0NsYXNzPEs+KVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBtb2RlbC4gVGhlIHR5cGUgcmVmZXJlbmNlZCBpbiB0aGUgbW9kZWwgZGVjb3JhdG9yIHdpbGwgYmUgdXNlZCBmb3IgdHlwZSBjaGVja2luZy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IHNvbWVNb2RlbFR5cGUgPSB0eXBlcy5tb2RlbChTb21lTW9kZWwpXG4gKiAvLyBvciBmb3IgcmVjdXJzaXZlIG1vZGVsc1xuICogY29uc3Qgc29tZU1vZGVsVHlwZSA9IHR5cGVzLm1vZGVsPFNvbWVNb2RlbD4oKCkgPT4gU29tZU1vZGVsKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBNIE1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxDbGFzcyBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc01vZGVsPE0gPSBuZXZlciwgSyA9IE0+KG1vZGVsQ2xhc3M6IF9DbGFzc09yT2JqZWN0PE0sIEs+KTogTW9kZWxUeXBlPEs+IHtcbiAgLy8gaWYgd2UgdHlwZSBpdCBhbnkgc3Ryb25nZXIgdGhlbiByZWN1cnNpdmUgZGVmcyBhbmQgc28gb24gc3RvcCB3b3JraW5nXG5cbiAgaWYgKCFpc01vZGVsQ2xhc3MobW9kZWxDbGFzcykgJiYgdHlwZW9mIG1vZGVsQ2xhc3MgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIHJlc29sdmUgbGF0ZXJcbiAgICBjb25zdCBtb2RlbENsYXNzRm4gPSBtb2RlbENsYXNzIGFzICgpID0+IE1vZGVsQ2xhc3M8QW55TW9kZWw+XG4gICAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBNb2RlbFR5cGVJbmZvKHQsIG1vZGVsQ2xhc3NGbigpKVxuICAgIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4gdHlwZXNNb2RlbChtb2RlbENsYXNzRm4oKSkgYXMgYW55LCB0eXBlSW5mb0dlbikgYXMgYW55XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbW9kZWxDbGF6ejogTW9kZWxDbGFzczxBbnlNb2RlbD4gPSBtb2RlbENsYXNzIGFzIGFueVxuXG4gICAgY29uc3QgY2FjaGVkVHlwZUNoZWNrZXIgPSBjYWNoZWRNb2RlbFR5cGVDaGVja2VyLmdldChtb2RlbENsYXp6KVxuICAgIGlmIChjYWNoZWRUeXBlQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIGNhY2hlZFR5cGVDaGVja2VyIGFzIGFueVxuICAgIH1cblxuICAgIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgTW9kZWxUeXBlSW5mbyh0LCBtb2RlbENsYXp6KVxuXG4gICAgY29uc3QgdGMgPSBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGF6eikhXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGBNb2RlbCgke21vZGVsSW5mby5uYW1lfSlgXG5cbiAgICAgIGNvbnN0IGRhdGFUeXBlQ2hlY2tlciA9IGdldE1vZGVsTWV0YWRhdGEobW9kZWxDbGF6eikuZGF0YVR5cGVcbiAgICAgIGNvbnN0IHJlc29sdmVkRGF0YVR5cGVDaGVja2VyID0gZGF0YVR5cGVDaGVja2VyXG4gICAgICAgID8gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAgICAgKHZhbHVlLCBwYXRoKSA9PiB7XG4gICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBtb2RlbENsYXp6KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCB0eXBlTmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmVkRGF0YVR5cGVDaGVja2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuY2hlY2sodmFsdWUuJCwgcGF0aClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlW21vZGVsVHlwZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gZmFzdCBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlW21vZGVsVHlwZUtleV0gPT09IG1vZGVsSW5mby5uYW1lID8gdGhpc1RjIDogbnVsbFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZlZERhdGFUeXBlQ2hlY2tlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLnNuYXBzaG90VHlwZSh2YWx1ZSkgPyB0aGlzVGMgOiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbm90IGVub3VnaCBpbmZvIHRvIGJlIGFibGUgdG8gdGVsbFxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG5cbiAgICAgICAgKHNuKSA9PiB7XG4gICAgICAgICAgaWYgKHNuW21vZGVsVHlwZUtleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5zbixcbiAgICAgICAgICAgICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAoc24pID0+IHNuXG4gICAgICApXG5cbiAgICAgIHJldHVybiB0aGlzVGNcbiAgICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG5cbiAgICBjYWNoZWRNb2RlbFR5cGVDaGVja2VyLnNldChtb2RlbENsYXp6LCB0YylcblxuICAgIHJldHVybiB0YyBhcyBhbnlcbiAgfVxufVxuXG4vKipcbiAqIGB0eXBlcy5tb2RlbGAgdHlwZSBpbmZvIGZvciBhIG1vZGVsIHByb3BzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsVHlwZUluZm9Qcm9wcyB7XG4gIHJlYWRvbmx5IFtwcm9wTmFtZTogc3RyaW5nXTogUmVhZG9ubHk8e1xuICAgIHR5cGU6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZFxuICAgIHR5cGVJbmZvOiBUeXBlSW5mbyB8IHVuZGVmaW5lZFxuICAgIGhhc0RlZmF1bHQ6IGJvb2xlYW5cbiAgICBkZWZhdWx0OiBhbnlcbiAgfT5cbn1cblxuLyoqXG4gKiBgdHlwZXMubW9kZWxgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIHByaXZhdGUgX3Byb3BzID0gbGF6eSgoKSA9PiB7XG4gICAgY29uc3Qgb2JqU2NoZW1hID0gZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKHRoaXMubW9kZWxDbGFzcylcblxuICAgIGNvbnN0IHByb3BUeXBlczogTy5Xcml0YWJsZTxNb2RlbFR5cGVJbmZvUHJvcHM+ID0ge31cbiAgICBPYmplY3Qua2V5cyhvYmpTY2hlbWEpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG4gICAgICBjb25zdCBwcm9wRGF0YSA9IG9ialNjaGVtYVtwcm9wTmFtZV1cblxuICAgICAgY29uc3QgdHlwZSA9IHByb3BEYXRhLl9pbnRlcm5hbC50eXBlQ2hlY2tlciBhcyBhbnkgYXMgQW55U3RhbmRhcmRUeXBlXG5cbiAgICAgIGxldCB0eXBlSW5mbzogVHlwZUluZm8gfCB1bmRlZmluZWRcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIHR5cGVJbmZvID0gZ2V0VHlwZUluZm8odHlwZSlcbiAgICAgIH1cblxuICAgICAgbGV0IGhhc0RlZmF1bHQgPSBmYWxzZVxuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55XG4gICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGblxuICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdFZhbHVlXG4gICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHByb3BUeXBlc1twcm9wTmFtZV0gPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHR5cGVJbmZvLFxuICAgICAgICBoYXNEZWZhdWx0LFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcHJvcFR5cGVzXG4gIH0pXG5cbiAgZ2V0IHByb3BzKCk6IE1vZGVsVHlwZUluZm9Qcm9wcyB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzKClcbiAgfVxuXG4gIGdldCBtb2RlbFR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldCh0aGlzLm1vZGVsQ2xhc3MpIVxuICAgIHJldHVybiBtb2RlbEluZm8ubmFtZVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbD4pIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2RlbFN0YW5kYXJkVHlwZVJlc29sdmVyKCkge1xuICByZWdpc3RlclN0YW5kYXJkVHlwZVJlc29sdmVyKCh2KSA9PiAoaXNNb2RlbENsYXNzKHYpID8gdHlwZXNNb2RlbCh2KSA6IHVuZGVmaW5lZCkpXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRJc1ByaW1pdGl2ZSwgaWRlbnRpdHlGbiB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFByaW1pdGl2ZVZhbHVlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3R5cGVzXCJcbmltcG9ydCB7IHJlZ2lzdGVyU3RhbmRhcmRUeXBlUmVzb2x2ZXIsIFN0YW5kYXJkVHlwZVJlc29sdmVyRm4gfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQgeyBUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXJCYXNlVHlwZSwgVHlwZUluZm8sIFR5cGVJbmZvR2VuIH0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcblxuY29uc3Qgc3RhbmRhcmRUeXBlUmVzb2x2ZXJzOiBTdGFuZGFyZFR5cGVSZXNvbHZlckZuW10gPSBbXVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBjZXJ0YWluIHZhbHVlIG9mIGEgcHJpbWl0aXZlIChmb3IgZXhhbXBsZSBhbiAqZXhhY3QqIG51bWJlciBvciBzdHJpbmcpLlxuICpcbiAqIEV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBoaVR5cGUgPSB0eXBlcy5saXRlcmFsKFwiaGlcIikgLy8gdGhlIHN0cmluZyB3aXRoIHZhbHVlIFwiaGlcIlxuICogY29uc3QgbnVtYmVyNVR5cGUgPSB0eXBlcy5saXRlcmFsKDUpIC8vIHRoZSBudW1iZXIgd2l0aCB2YWx1ZSA1XG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgTGl0ZXJhbCB2YWx1ZSB0eXBlLlxuICogQHBhcmFtIGxpdGVyYWwgTGl0ZXJhbCB2YWx1ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0xpdGVyYWw8VCBleHRlbmRzIFByaW1pdGl2ZVZhbHVlPihsaXRlcmFsOiBUKTogSWRlbnRpdHlUeXBlPFQ+IHtcbiAgYXNzZXJ0SXNQcmltaXRpdmUobGl0ZXJhbCwgXCJsaXRlcmFsXCIpXG4gIGxldCB0eXBlTmFtZTogc3RyaW5nXG4gIHN3aXRjaCAobGl0ZXJhbCkge1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgdHlwZU5hbWUgPSBcInVuZGVmaW5lZFwiXG4gICAgICBicmVha1xuICAgIGNhc2UgbnVsbDpcbiAgICAgIHR5cGVOYW1lID0gXCJudWxsXCJcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHR5cGVOYW1lID0gSlNPTi5zdHJpbmdpZnkobGl0ZXJhbClcbiAgICAgIGJyZWFrXG4gIH1cblxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IExpdGVyYWxUeXBlSW5mbyh0LCBsaXRlcmFsKVxuXG4gIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5QcmltaXRpdmUsXG5cbiAgICAodmFsdWUsIHBhdGgpID0+ICh2YWx1ZSA9PT0gbGl0ZXJhbCA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgdHlwZU5hbWUsIHZhbHVlKSksXG5cbiAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICB0eXBlSW5mb0dlbixcblxuICAgICh2YWx1ZSkgPT4gKHZhbHVlID09PSBsaXRlcmFsID8gdGhpc1RjIDogbnVsbCksXG4gICAgaWRlbnRpdHlGbixcbiAgICBpZGVudGl0eUZuXG4gIClcblxuICByZXR1cm4gdGhpc1RjIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5saXRlcmFsYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBMaXRlcmFsVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IGxpdGVyYWw6IFByaW1pdGl2ZVZhbHVlKSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB1bmRlZmluZWQuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5saXRlcmFsKHVuZGVmaW5lZClgLlxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy51bmRlZmluZWRcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNVbmRlZmluZWQgPSB0eXBlc0xpdGVyYWwodW5kZWZpbmVkKVxuXG5zdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaCgodikgPT4gKHYgPT09IHVuZGVmaW5lZCA/IHR5cGVzVW5kZWZpbmVkIDogdW5kZWZpbmVkKSlcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBudWxsLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMubGl0ZXJhbChudWxsKWAuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLm51bGxcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNOdWxsID0gdHlwZXNMaXRlcmFsKG51bGwpXG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gbnVsbCA/IHR5cGVzTnVsbCA6IHVuZGVmaW5lZCkpXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbnkgYm9vbGVhbiB2YWx1ZS5cbiAqXG4gKiBgYGB0c1xuICogdHlwZXMuYm9vbGVhblxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc0Jvb2xlYW46IElkZW50aXR5VHlwZTxib29sZWFuPiA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZS5QcmltaXRpdmUsXG5cbiAgKHZhbHVlLCBwYXRoKSA9PiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgXCJib29sZWFuXCIsIHZhbHVlKSksXG5cbiAgKCkgPT4gXCJib29sZWFuXCIsXG4gICh0KSA9PiBuZXcgQm9vbGVhblR5cGVJbmZvKHQpLFxuXG4gICh2YWx1ZSkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgPyAodHlwZXNCb29sZWFuIGFzIGFueSkgOiBudWxsKSxcbiAgaWRlbnRpdHlGbixcbiAgaWRlbnRpdHlGblxuKSBhcyBhbnlcblxuc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLnB1c2goKHYpID0+ICh2ID09PSBCb29sZWFuID8gdHlwZXNCb29sZWFuIDogdW5kZWZpbmVkKSlcblxuLyoqXG4gKiBgdHlwZXMuYm9vbGVhbmAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgQm9vbGVhblR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBudW1iZXIgdmFsdWUuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLm51bWJlclxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc051bWJlcjogSWRlbnRpdHlUeXBlPG51bWJlcj4gPSBuZXcgVHlwZUNoZWNrZXIoXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUuUHJpbWl0aXZlLFxuXG4gICh2YWx1ZSwgcGF0aCkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgXCJudW1iZXJcIiwgdmFsdWUpKSxcblxuICAoKSA9PiBcIm51bWJlclwiLFxuICAodCkgPT4gbmV3IE51bWJlclR5cGVJbmZvKHQpLFxuXG4gICh2YWx1ZSkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/ICh0eXBlc051bWJlciBhcyBhbnkpIDogbnVsbCksXG4gIGlkZW50aXR5Rm4sXG4gIGlkZW50aXR5Rm5cbikgYXMgYW55XG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gTnVtYmVyID8gdHlwZXNOdW1iZXIgOiB1bmRlZmluZWQpKVxuXG4vKipcbiAqIGB0eXBlcy5udW1iZXJgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bWJlclR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBzdHJpbmcgdmFsdWUuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLnN0cmluZ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc1N0cmluZzogSWRlbnRpdHlUeXBlPHN0cmluZz4gPSBuZXcgVHlwZUNoZWNrZXIoXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUuUHJpbWl0aXZlLFxuXG4gICh2YWx1ZSwgcGF0aCkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IG51bGwgOiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgXCJzdHJpbmdcIiwgdmFsdWUpKSxcblxuICAoKSA9PiBcInN0cmluZ1wiLFxuICAodCkgPT4gbmV3IFN0cmluZ1R5cGVJbmZvKHQpLFxuXG4gICh2YWx1ZSkgPT4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/ICh0eXBlc1N0cmluZyBhcyBhbnkpIDogbnVsbCksXG4gIGlkZW50aXR5Rm4sXG4gIGlkZW50aXR5Rm5cbikgYXMgYW55XG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gU3RyaW5nID8gdHlwZXNTdHJpbmcgOiB1bmRlZmluZWQpKVxuXG4vKipcbiAqIGB0eXBlcy5zdHJpbmdgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1R5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUHJpbWl0aXZlU3RhbmRhcmRUeXBlUmVzb2x2ZXJzKCkge1xuICBzdGFuZGFyZFR5cGVSZXNvbHZlcnMuZm9yRWFjaCgoc3RyKSA9PiB7XG4gICAgcmVnaXN0ZXJTdGFuZGFyZFR5cGVSZXNvbHZlcihzdHIpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3Rlck1vZGVsU3RhbmRhcmRUeXBlUmVzb2x2ZXIgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc01vZGVsXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHJpbWl0aXZlU3RhbmRhcmRUeXBlUmVzb2x2ZXJzIH0gZnJvbSBcIi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuXG5sZXQgZGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzKCkge1xuICBpZiAoZGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVyc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzUmVnaXN0ZXJlZCA9IHRydWVcblxuICByZWdpc3Rlck1vZGVsU3RhbmRhcmRUeXBlUmVzb2x2ZXIoKVxuICByZWdpc3RlclByaW1pdGl2ZVN0YW5kYXJkVHlwZVJlc29sdmVycygpXG59XG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVycyB9IGZyb20gXCIuL3JlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVyc1wiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSB9IGZyb20gXCIuL3NjaGVtYXNcIlxuaW1wb3J0IHsgaXNMYXRlVHlwZUNoZWNrZXIsIExhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi9UeXBlQ2hlY2tlclwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFN0YW5kYXJkVHlwZVJlc29sdmVyRm4gPSAodmFsdWU6IGFueSkgPT4gQW55U3RhbmRhcmRUeXBlIHwgdW5kZWZpbmVkXG5cbmNvbnN0IHN0YW5kYXJkVHlwZVJlc29sdmVyczogU3RhbmRhcmRUeXBlUmVzb2x2ZXJGbltdID0gW11cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU3RhbmRhcmRUeXBlUmVzb2x2ZXIocmVzb2x2ZXJGbjogU3RhbmRhcmRUeXBlUmVzb2x2ZXJGbikge1xuICBzdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaChyZXNvbHZlckZuKVxufVxuXG5mdW5jdGlvbiBmaW5kU3RhbmRhcmRUeXBlKHZhbHVlOiBhbnkpOiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWQge1xuICByZWdpc3RlckRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnMoKVxuXG4gIGZvciAoY29uc3QgcmVzb2x2ZXJGbiBvZiBzdGFuZGFyZFR5cGVSZXNvbHZlcnMpIHtcbiAgICBjb25zdCB0YyA9IHJlc29sdmVyRm4odmFsdWUpXG4gICAgaWYgKHRjKSByZXR1cm4gdGNcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHlwZUNoZWNrZXIodjogQW55VHlwZSB8IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyKTogVHlwZUNoZWNrZXIge1xuICBsZXQgbmV4dDogVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXIgPSB2IGFzIGFueVxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVHlwZUNoZWNrZXIpIHtcbiAgICAgIHJldHVybiBuZXh0XG4gICAgfSBlbHNlIGlmIChpc0xhdGVUeXBlQ2hlY2tlcihuZXh0KSkge1xuICAgICAgbmV4dCA9IG5leHQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YyA9IGZpbmRTdGFuZGFyZFR5cGUodilcbiAgICAgIGlmICh0Yykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVR5cGVDaGVja2VyKHRjKVxuICAgICAgfVxuICAgICAgdGhyb3cgZmFpbHVyZShcInR5cGUgY2hlY2tlciBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTdGFuZGFyZFR5cGVOb1Rocm93KFxuICB2OiBBbnlUeXBlIHwgVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXJcbik6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2IGluc3RhbmNlb2YgVHlwZUNoZWNrZXIgfHwgaXNMYXRlVHlwZUNoZWNrZXIodikpIHtcbiAgICByZXR1cm4gdiBhcyBhbnlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0YyA9IGZpbmRTdGFuZGFyZFR5cGUodilcbiAgICBpZiAodGMpIHtcbiAgICAgIHJldHVybiB0Y1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTdGFuZGFyZFR5cGUodjogQW55VHlwZSB8IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyKTogQW55U3RhbmRhcmRUeXBlIHtcbiAgY29uc3QgdGMgPSByZXNvbHZlU3RhbmRhcmRUeXBlTm9UaHJvdyh2KVxuICBpZiAodGMpIHtcbiAgICByZXR1cm4gdGNcbiAgfVxuICB0aHJvdyBmYWlsdXJlKFwic3RhbmRhcmQgdHlwZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcIilcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgY3JlYXRlQXRvbSwgSUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aCwgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBpbnZhbGlkYXRlQ2FjaGVkVG9TbmFwc2hvdFByb2Nlc3NvclJlc3VsdCB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBQcmltaXRpdmVWYWx1ZSB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFNuYXBzaG90VHJhbnNmb3JtRm4gPSAoc246IHVua25vd24pID0+IHVua25vd25cblxuaW50ZXJmYWNlIFNuYXBzaG90RGF0YSB7XG4gIHVudHJhbnNmb3JtZWQ6IGFueVxuICByZWFkb25seSB0cmFuc2Zvcm1GbjogU25hcHNob3RUcmFuc2Zvcm1GbiB8IHVuZGVmaW5lZFxuICB0cmFuc2Zvcm1lZDogYW55XG4gIHJlYWRvbmx5IGF0b206IElBdG9tXG59XG5cbmNvbnN0IHNuYXBzaG90cyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU25hcHNob3REYXRhPigpXG5cbi8vIHRydWUgaWYgaXQgaGFzIGJlZW4gYWNjZXNzZWQgcHVibGljbHkgYW5kIHRoZXJlZm9yZSBzaG91bGQgYmUgY2xvbmVkXG4vLyByYXRoZXIgdGhhbiBtb2RpZmllZCBpbiBwbGFjZVxuY29uc3QgZnJvemVuU3RhdGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIGJvb2xlYW4+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsU25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4oXG4gIHZhbHVlOiBUXG4pOiBSZWFkb25seTxTbmFwc2hvdERhdGE+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNuYXBzaG90cy5nZXQodmFsdWUpXG59XG5cbmludGVyZmFjZSBJbnRlcm5hbFNuYXBzaG90UGFyZW50IHtcbiAgcGFyZW50U25hcHNob3Q6IFNuYXBzaG90RGF0YSB8IHVuZGVmaW5lZFxuICBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT5cbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxTbmFwc2hvdFBhcmVudChcbiAgc246IFJlYWRvbmx5PFNuYXBzaG90RGF0YT4gfCB1bmRlZmluZWQsXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuKTogSW50ZXJuYWxTbmFwc2hvdFBhcmVudCB8IHVuZGVmaW5lZCB7XG4gIGlmICghcGFyZW50UGF0aCB8fCAhc24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBwYXJlbnRTbiA9IGdldEludGVybmFsU25hcHNob3QocGFyZW50UGF0aC5wYXJlbnQpXG4gIGlmICghcGFyZW50U24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcmVudFNuYXBzaG90OiBwYXJlbnRTbixcbiAgICBwYXJlbnRQYXRoOiBwYXJlbnRQYXRoLFxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNldEludGVybmFsU25hcHNob3QgPSBhY3Rpb24oXCJ1bnNldEludGVybmFsU25hcHNob3RcIiwgKHZhbHVlOiBhbnkpID0+IHtcbiAgY29uc3Qgb2xkU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbHVlKVxuXG4gIGlmIChvbGRTbikge1xuICAgIHNuYXBzaG90cy5kZWxldGUodmFsdWUpXG4gICAgb2xkU24uYXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxufSlcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE5ld0ludGVybmFsU25hcHNob3QgPSBhY3Rpb24oXG4gIFwic2V0TmV3SW50ZXJuYWxTbmFwc2hvdFwiLFxuICA8VCBleHRlbmRzIG9iamVjdD4oXG4gICAgdmFsdWU6IGFueSxcbiAgICB1bnRyYW5zZm9ybWVkOiBULFxuICAgIHRyYW5zZm9ybUZuOiBTbmFwc2hvdFRyYW5zZm9ybUZuIHwgdW5kZWZpbmVkLFxuICAgIG1hcmtBc0Zyb3plbiA9IGZhbHNlXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHNuOiBTbmFwc2hvdERhdGEgPSB7XG4gICAgICB1bnRyYW5zZm9ybWVkLFxuICAgICAgdHJhbnNmb3JtRm4sXG4gICAgICB0cmFuc2Zvcm1lZDogdHJhbnNmb3JtRm4gPyB0cmFuc2Zvcm1Gbih1bnRyYW5zZm9ybWVkKSA6IHVudHJhbnNmb3JtZWQsXG4gICAgICBhdG9tOiBjcmVhdGVBdG9tKFwic25hcHNob3RcIiksXG4gICAgfVxuICAgIGZyb3plblN0YXRlLnNldChzbi51bnRyYW5zZm9ybWVkLCBtYXJrQXNGcm96ZW4pXG4gICAgZnJvemVuU3RhdGUuc2V0KHNuLnRyYW5zZm9ybWVkLCBtYXJrQXNGcm96ZW4pXG5cbiAgICBzbmFwc2hvdHMuc2V0KHZhbHVlLCBzbilcblxuICAgIHNuLmF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cbilcblxudHlwZSBNdXRhdGVJbnRlcm5hbFNuYXBzaG90Rm48VD4gPSAocHJldlNuOiBUKSA9PiB2b2lkXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVJbnRlcm5hbFNuYXBzaG90ID0gYWN0aW9uKFxuICBcInVwZGF0ZUludGVybmFsU25hcHNob3RcIixcbiAgPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBhbnksIG11dGF0ZTogTXV0YXRlSW50ZXJuYWxTbmFwc2hvdEZuPFQ+KTogdm9pZCA9PiB7XG4gICAgY29uc3Qgc24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbHVlKSEgYXMgU25hcHNob3REYXRhXG5cbiAgICBsZXQgdW50cmFuc2Zvcm1lZCA9IHNuLnVudHJhbnNmb3JtZWRcbiAgICBjb25zdCBzbkZyb3plbiA9IGZyb3plblN0YXRlLmdldCh1bnRyYW5zZm9ybWVkKSFcbiAgICBpZiAoc25Gcm96ZW4pIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVudHJhbnNmb3JtZWQpKSB7XG4gICAgICAgIHVudHJhbnNmb3JtZWQgPSB1bnRyYW5zZm9ybWVkLnNsaWNlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVudHJhbnNmb3JtZWQgPSBPYmplY3QuYXNzaWduKHt9LCB1bnRyYW5zZm9ybWVkKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGUgcHJvY2Vzc29yIGNhY2hlZCByZXN1bHQgaXMgbm8gbG9uZ2VyIHZhbGlkIHNpbmNlIHdlIHdpbGxcbiAgICAgIC8vIG11dGF0ZSB0aGUgb2JqZWN0XG4gICAgICBpbnZhbGlkYXRlQ2FjaGVkVG9TbmFwc2hvdFByb2Nlc3NvclJlc3VsdCh1bnRyYW5zZm9ybWVkKVxuICAgIH1cblxuICAgIG11dGF0ZSh1bnRyYW5zZm9ybWVkKVxuXG4gICAgc24udW50cmFuc2Zvcm1lZCA9IHVudHJhbnNmb3JtZWRcbiAgICBzbi50cmFuc2Zvcm1lZCA9IHNuLnRyYW5zZm9ybUZuID8gc24udHJhbnNmb3JtRm4odW50cmFuc2Zvcm1lZCkgOiB1bnRyYW5zZm9ybWVkXG5cbiAgICBmcm96ZW5TdGF0ZS5zZXQoc24udW50cmFuc2Zvcm1lZCwgZmFsc2UpXG4gICAgZnJvemVuU3RhdGUuc2V0KHNuLnRyYW5zZm9ybWVkLCBmYWxzZSlcblxuICAgIHNuLmF0b20ucmVwb3J0Q2hhbmdlZCgpXG5cbiAgICAvLyBhbHNvIHVwZGF0ZSBwYXJlbnQocykgc25hcHNob3QocykgaWYgbmVlZGVkXG4gICAgY29uc3QgcGFyZW50ID0gZ2V0SW50ZXJuYWxTbmFwc2hvdFBhcmVudChzbiwgZmFzdEdldFBhcmVudFBhdGgodmFsdWUpKVxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGNvbnN0IHsgcGFyZW50U25hcHNob3QsIHBhcmVudFBhdGggfSA9IHBhcmVudFxuICAgICAgLy8gbWlnaHQgYmUgZmFsc2UgaW4gdGhlIGNhc2VzIHdoZXJlIHRoZSBwYXJlbnQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkXG4gICAgICBpZiAocGFyZW50U25hcHNob3QpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcmVudFBhdGgucGF0aFxuXG4gICAgICAgIC8vIHBhdGNoZXMgZm9yIHBhcmVudCBjaGFuZ2VzIHNob3VsZCBub3QgYmUgZW1pdHRlZFxuICAgICAgICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90KHBhcmVudFBhdGgucGFyZW50LCAob2JqT3JBcnJheTogYW55KSA9PiB7XG4gICAgICAgICAgb2JqT3JBcnJheVtwYXRoXSA9IHNuLnRyYW5zZm9ybWVkXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG4pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRJbnRlcm5hbFNuYXBzaG90T2JzZXJ2ZWQoc246IFNuYXBzaG90RGF0YSkge1xuICBzbi5hdG9tLnJlcG9ydE9ic2VydmVkKClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyZWV6ZUludGVybmFsU25hcHNob3Q8VCBleHRlbmRzIFByaW1pdGl2ZVZhbHVlIHwgb2JqZWN0PihkYXRhOiBUKTogVCB7XG4gIGlmIChpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvLyB0aGlzIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZGF0YSBjb21lcyBmcm9tIGV4YW1wbGUgZnJvbSB0cmFuc2Zvcm1zXG4gIGNvbnN0IGlzRnJvemVuID0gZnJvemVuU3RhdGUuZ2V0KGRhdGEpXG5cbiAgaWYgKGlzRnJvemVuID09PSB1bmRlZmluZWQgfHwgaXNGcm96ZW4gPT09IHRydWUpIHtcbiAgICAvLyBhbHJlYWR5IGZyb3plbiBvciBhbiBleHRlcm5hbCBkYXRhIChlLmcuIGZyb20gYSB0cmFuc2Zvcm0pXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmcmVlemVJbnRlcm5hbFNuYXBzaG90KGRhdGFbaV0pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdCgoZGF0YSBhcyBhbnkpW2tleXNbaV1dKVxuICAgIH1cbiAgfVxuXG4gIGZyb3plblN0YXRlLnNldChkYXRhLCB0cnVlKVxuXG4gIHJldHVybiBkYXRhXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXHJcbmltcG9ydCB7IHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9yZXNvbHZlVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgeyBBbnlUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4uL3R5cGVzL3NjaGVtYXNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlLCBpZGVudGl0eUZuLCBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXHJcbmltcG9ydCB7XHJcbiAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdCxcclxuICBnZXRJbnRlcm5hbFNuYXBzaG90LFxyXG4gIHJlcG9ydEludGVybmFsU25hcHNob3RPYnNlcnZlZCxcclxufSBmcm9tIFwiLi9pbnRlcm5hbFwiXHJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbiBpbW11dGFibGUgc25hcHNob3QgZm9yIGEgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqIFNpbmNlIHJldHVybmVkIHNuYXBzaG90cyBhcmUgaW1tdXRhYmxlIHRoZXkgd2lsbCByZXNwZWN0IHNoYWxsb3cgZXF1YWxpdHksIHRoaXMgaXMsXHJcbiAqIGlmIG5vIGNoYW5nZXMgYXJlIG1hZGUgdGhlbiB0aGUgc25hcHNob3Qgd2lsbCBiZSBrZXB0IHRoZSBzYW1lLlxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXHJcbiAqIEBwYXJhbSBub2RlT3JQcmltaXRpdmUgRGF0YSBzdHJ1Y3R1cmUsIGluY2x1ZGluZyBwcmltdGl2ZXMuXHJcbiAqIEByZXR1cm5zIFRoZSBzbmFwc2hvdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTbmFwc2hvdDxUIGV4dGVuZHMgQW55VHlwZT4oXHJcbiAgdHlwZTogVCxcclxuICBub2RlT3JQcmltaXRpdmU6IFR5cGVUb0RhdGE8VD5cclxuKTogU25hcHNob3RPdXRPZjxUeXBlVG9EYXRhPFQ+PlxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbiBpbW11dGFibGUgc25hcHNob3QgZm9yIGEgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqIFNpbmNlIHJldHVybmVkIHNuYXBzaG90cyBhcmUgaW1tdXRhYmxlIHRoZXkgd2lsbCByZXNwZWN0IHNoYWxsb3cgZXF1YWxpdHksIHRoaXMgaXMsXHJcbiAqIGlmIG5vIGNoYW5nZXMgYXJlIG1hZGUgdGhlbiB0aGUgc25hcHNob3Qgd2lsbCBiZSBrZXB0IHRoZSBzYW1lLlxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXHJcbiAqIEBwYXJhbSBub2RlT3JQcmltaXRpdmUgRGF0YSBzdHJ1Y3R1cmUsIGluY2x1ZGluZyBwcmltdGl2ZXMuXHJcbiAqIEByZXR1cm5zIFRoZSBzbmFwc2hvdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTbmFwc2hvdDxUPihub2RlT3JQcmltaXRpdmU6IFQpOiBTbmFwc2hvdE91dE9mPFQ+XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U25hcHNob3QoYXJnMTogYW55LCBhcmcyPzogYW55KTogYW55IHtcclxuICBsZXQgdG9TbmFwc2hvdFByb2Nlc3NvciA9IGlkZW50aXR5Rm4gYXMgKHNuOiBhbnkpID0+IHVua25vd25cclxuICBsZXQgbm9kZU9yUHJpbWl0aXZlOiBhbnlcclxuXHJcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xyXG4gICAgdG9TbmFwc2hvdFByb2Nlc3NvciA9IHJlc29sdmVUeXBlQ2hlY2tlcihhcmcxKS50b1NuYXBzaG90UHJvY2Vzc29yXHJcbiAgICBub2RlT3JQcmltaXRpdmUgPSBhcmcyXHJcbiAgfSBlbHNlIHtcclxuICAgIG5vZGVPclByaW1pdGl2ZSA9IGFyZzFcclxuICB9XHJcblxyXG4gIGlmIChpc1ByaW1pdGl2ZShub2RlT3JQcmltaXRpdmUpKSB7XHJcbiAgICByZXR1cm4gdG9TbmFwc2hvdFByb2Nlc3Nvcihub2RlT3JQcmltaXRpdmUpXHJcbiAgfVxyXG5cclxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGVPclByaW1pdGl2ZSwgXCJub2RlT3JQcmltaXRpdmVcIilcclxuXHJcbiAgY29uc3Qgc25hcHNob3QgPSBnZXRJbnRlcm5hbFNuYXBzaG90KG5vZGVPclByaW1pdGl2ZSlcclxuICBpZiAoIXNuYXBzaG90KSB7XHJcbiAgICB0aHJvdyBmYWlsdXJlKFwiZ2V0U25hcHNob3QgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBraW5kIG9mIG9iamVjdFwiKVxyXG4gIH1cclxuXHJcbiAgZnJlZXplSW50ZXJuYWxTbmFwc2hvdChzbmFwc2hvdC50cmFuc2Zvcm1lZClcclxuICByZXBvcnRJbnRlcm5hbFNuYXBzaG90T2JzZXJ2ZWQoc25hcHNob3QpXHJcbiAgcmV0dXJuIHRvU25hcHNob3RQcm9jZXNzb3Ioc25hcHNob3QudHJhbnNmb3JtZWQpXHJcbn1cclxuIiwiaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4vc2NoZW1hc1wiXHJcbmltcG9ydCB0eXBlIHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi9UeXBlQ2hlY2tFcnJvclwiXHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgdmFsdWUgY29uZm9ybXMgdG8gYSBnaXZlbiB0eXBlLlxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cclxuICogQHBhcmFtIHR5cGUgVHlwZSB0byBjaGVjayBmb3IuXHJcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBjaGVjay5cclxuICogQHJldHVybnMgQSBUeXBlRXJyb3IgaWYgdGhlIGNoZWNrIGZhaWxzIG9yIG51bGwgaWYgbm8gZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZUNoZWNrPFQgZXh0ZW5kcyBBbnlUeXBlPih0eXBlOiBULCB2YWx1ZTogVHlwZVRvRGF0YTxUPik6IFR5cGVDaGVja0Vycm9yIHwgbnVsbCB7XHJcbiAgY29uc3QgdHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodHlwZSlcclxuXHJcbiAgaWYgKHR5cGVDaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgcmV0dXJuIG51bGxcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHR5cGVDaGVja2VyLmNoZWNrKHZhbHVlLCBbXSlcclxuICB9XHJcbn1cclxuIiwibGV0IHVybEFscGhhYmV0ID1cbiAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5sZXQgY3VzdG9tQWxwaGFiZXQgPSAoYWxwaGFiZXQsIGRlZmF1bHRTaXplID0gMjEpID0+IHtcbiAgcmV0dXJuIChzaXplID0gZGVmYXVsdFNpemUpID0+IHtcbiAgICBsZXQgaWQgPSAnJ1xuICAgIGxldCBpID0gc2l6ZVxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlkICs9IGFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogYWxwaGFiZXQubGVuZ3RoKSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxuICB9XG59XG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSAnJ1xuICBsZXQgaSA9IHNpemVcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgfVxuICByZXR1cm4gaWRcbn1cbmV4cG9ydCB7IG5hbm9pZCwgY3VzdG9tQWxwaGFiZXQgfVxuIiwiaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZC9ub24tc2VjdXJlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogTW9kZWwgYXV0byB0eXBlLWNoZWNraW5nIG1vZGUuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGUge1xuICAvKipcbiAgICogQXV0byB0eXBlIGNoZWNrIG1vZGVscyBvbmx5IGluIGRldiBtb2RlXG4gICAqL1xuICBEZXZNb2RlT25seSA9IFwiZGV2TW9kZU9ubHlcIixcbiAgLyoqXG4gICAqIEF1dG8gdHlwZSBjaGVjayBtb2RlbHMgbm8gbWF0dGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50XG4gICAqL1xuICBBbHdheXNPbiA9IFwiYWx3YXlzT25cIixcbiAgLyoqXG4gICAqIERvIG5vdCBhdXRvIHR5cGUgY2hlY2sgbW9kZWxzIG5vIG1hdHRlciB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICAgKi9cbiAgQWx3YXlzT2ZmID0gXCJhbHdheXNPZmZcIixcbn1cblxuLyoqXG4gKiBHbG9iYWwgY29uZmlnIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxDb25maWcge1xuICAvKipcbiAgICogTW9kZWwgYXV0byB0eXBlLWNoZWNraW5nIG1vZGUuXG4gICAqL1xuICBtb2RlbEF1dG9UeXBlQ2hlY2tpbmc6IE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGVcblxuICAvKipcbiAgICogSUQgZ2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBtb2RlbCBpZHMuXG4gICAqL1xuICBtb2RlbElkR2VuZXJhdG9yKCk6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBbGxvdyBhcnJheSBlbGVtZW50cyB0byBiZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGFsbG93VW5kZWZpbmVkQXJyYXlFbGVtZW50czogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIHdhcm5pbmdzIHJlbGF0ZWQgdG8gZHVwbGljYXRlZCBtb2RlbCBuYW1lcyAoZGVmYXVsdHMgdG8gYHRydWVgKS5cbiAgICogVXN1YWxseSBzZXQgdG8gZmFsc2UgaW4gdGVzdCBlbnZpcm9ubWVudHMgKGUuZy4gamVzdCkuXG4gICAqL1xuICBzaG93RHVwbGljYXRlTW9kZWxOYW1lV2FybmluZ3M6IGJvb2xlYW5cbn1cblxubGV0IGxvY2FsSWQgPSAwXG5jb25zdCBsb2NhbEJhc2VJZCA9IG5hbm9pZCgpXG5cbmZ1bmN0aW9uIGRlZmF1bHRNb2RlbElkR2VuZXJhdG9yKCk6IHN0cmluZyB7XG4gIC8vIHdlIHVzZSBiYXNlIDM2IGZvciBsb2NhbCBpZCBzaW5jZSBpdCBpcyBzaG9ydCBhbmQgZmFzdFxuICBjb25zdCBpZCA9IGxvY2FsSWQudG9TdHJpbmcoMzYpICsgXCItXCIgKyBsb2NhbEJhc2VJZFxuICBsb2NhbElkKytcbiAgcmV0dXJuIGlkXG59XG5cbi8vIGRlZmF1bHRzXG5sZXQgZ2xvYmFsQ29uZmlnOiBHbG9iYWxDb25maWcgPSB7XG4gIG1vZGVsQXV0b1R5cGVDaGVja2luZzogTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZS5EZXZNb2RlT25seSxcbiAgbW9kZWxJZEdlbmVyYXRvcjogZGVmYXVsdE1vZGVsSWRHZW5lcmF0b3IsXG4gIGFsbG93VW5kZWZpbmVkQXJyYXlFbGVtZW50czogZmFsc2UsXG4gIHNob3dEdXBsaWNhdGVNb2RlbE5hbWVXYXJuaW5nczogdHJ1ZSxcbn1cblxuLyoqXG4gKiBQYXJ0aWFsbHkgc2V0cyB0aGUgY3VycmVudCBnbG9iYWwgY29uZmlnLlxuICpcbiAqIEBwYXJhbSBjb25maWcgUGFydGlhbCBvYmplY3Qgd2l0aCB0aGUgbmV3IGNvbmZpZ3VyYXRpb25zLiBPcHRpb25zIG5vdCBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0IHdvbid0IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRHbG9iYWxDb25maWcoY29uZmlnOiBQYXJ0aWFsPEdsb2JhbENvbmZpZz4pIHtcbiAgZ2xvYmFsQ29uZmlnID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4uZ2xvYmFsQ29uZmlnLFxuICAgIC4uLmNvbmZpZyxcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGdsb2JhbCBjb25maWcgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxDb25maWcoKTogUmVhZG9ubHk8R2xvYmFsQ29uZmlnPiB7XG4gIHJldHVybiBnbG9iYWxDb25maWdcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBSZXR1cm5zIGlmIHRoZSBhdXRvIHR5cGUgY2hlY2tpbmcgZm9yIG1vZGVscyBpcyBlbmFibGVkLlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSB7XG4gIHN3aXRjaCAoZ2V0R2xvYmFsQ29uZmlnKCkubW9kZWxBdXRvVHlwZUNoZWNraW5nKSB7XG4gICAgY2FzZSBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlLkRldk1vZGVPbmx5OlxuICAgICAgcmV0dXJuIGluRGV2TW9kZSgpXG4gICAgY2FzZSBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlLkFsd2F5c09mZjpcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIGNhc2UgTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZS5BbHdheXNPbjpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkICdtb2RlbEF1dG9UeXBlQ2hlY2tpbmcnIGNvbmZpZyB2YWx1ZSAtICR7Z2xvYmFsQ29uZmlnLm1vZGVsQXV0b1R5cGVDaGVja2luZ31gXG4gICAgICApXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuL0Jhc2VNb2RlbFNoYXJlZFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBtb2RlbEluaXRpYWxpemVyc1N5bWJvbCA9IFN5bWJvbChcIm1vZGVsSW5pdGlhbGl6ZXJzXCIpXG5cbnR5cGUgTW9kZWxDbGFzc0luaXRpYWxpemVyID0gKG1vZGVsSW5zdGFuY2U6IEFueU1vZGVsIHwgQW55RGF0YU1vZGVsKSA9PiB2b2lkXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRNb2RlbENsYXNzSW5pdGlhbGl6ZXIoXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+LFxuICBpbml0OiBNb2RlbENsYXNzSW5pdGlhbGl6ZXJcbikge1xuICBsZXQgaW5pdGlhbGl6ZXJzID0gKG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbEluaXRpYWxpemVyc1N5bWJvbF1cbiAgaWYgKCFpbml0aWFsaXplcnMpIHtcbiAgICBpbml0aWFsaXplcnMgPSBbXVxuICAgIDsobW9kZWxDbGFzcyBhcyBhbnkpW21vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sXSA9IGluaXRpYWxpemVyc1xuICB9XG4gIGluaXRpYWxpemVycy5wdXNoKGluaXQpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbENsYXNzSW5pdGlhbGl6ZXJzKFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPlxuKTogTW9kZWxDbGFzc0luaXRpYWxpemVyW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gKG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbEluaXRpYWxpemVyc1N5bWJvbF1cbn1cbiIsImltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgZ2V0TW9kZWxDbGFzc0luaXRpYWxpemVycyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbENsYXNzSW5pdGlhbGl6ZXJcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2RlbEluaXRpYWxpemVycyhcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4sXG4gIG1vZGVsT2JqOiBhbnlcbikge1xuICBjb25zdCBpbml0aWFsaXplcnMgPSBnZXRNb2RlbENsYXNzSW5pdGlhbGl6ZXJzKG1vZGVsQ2xhc3MpXG4gIGlmIChpbml0aWFsaXplcnMpIHtcbiAgICBjb25zdCBsZW4gPSBpbml0aWFsaXplcnMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgaW5pdCA9IGluaXRpYWxpemVyc1tpXVxuICAgICAgaW5pdChtb2RlbE9iailcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcblxuZnVuY3Rpb24gY2FuV3JpdGUoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZ2V0QWN0aW9uUHJvdGVjdGlvbigpIHx8ICEhZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2FuV3JpdGUoKSB7XG4gIGlmICghY2FuV3JpdGUoKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJkYXRhIGNoYW5nZXMgbXVzdCBiZSBwZXJmb3JtZWQgaW5zaWRlIG1vZGVsIGFjdGlvbnNcIilcbiAgfVxufVxuXG5sZXQgYWN0aW9uUHJvdGVjdGlvbiA9IHRydWVcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBHZXRzIGlmIHRoZSBhY3Rpb24gcHJvdGVjdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZCBvciBub3QuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvblByb3RlY3Rpb24oKSB7XG4gIHJldHVybiBhY3Rpb25Qcm90ZWN0aW9uXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogU2V0cyBpZiB0aGUgYWN0aW9uIHByb3RlY3Rpb24gaXMgY3VycmVudGx5IGVuYWJsZWQgb3Igbm90LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aW9uUHJvdGVjdGlvbihwcm90ZWN0aW9uOiBib29sZWFuKSB7XG4gIGFjdGlvblByb3RlY3Rpb24gPSBwcm90ZWN0aW9uXG59XG4iLCJpbXBvcnQgeyBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgZ2V0QWN0aW9uUHJvdGVjdGlvbiB9IGZyb20gXCIuL3Byb3RlY3Rpb25cIlxuXG5jb25zdCBwZW5kaW5nQWN0aW9uczogKCgpID0+IHZvaWQpW10gPSBbXVxuXG5mdW5jdGlvbiBpc0FjdGlvblJ1bm5pbmcoKSB7XG4gIHJldHVybiAhZ2V0QWN0aW9uUHJvdGVjdGlvbigpIHx8IGdldEN1cnJlbnRBY3Rpb25Db250ZXh0KClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVucXVldWVQZW5kaW5nQWN0aW9uKGFjdGlvbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAvLyBkZWxheSBhY3Rpb24gdW50aWwgYWxsIGN1cnJlbnQgYWN0aW9ucyBhcmUgZmluaXNoZWRcbiAgaWYgKGlzQWN0aW9uUnVubmluZygpKSB7XG4gICAgcGVuZGluZ0FjdGlvbnMucHVzaChhY3Rpb24pXG4gIH0gZWxzZSB7XG4gICAgYWN0aW9uKClcbiAgfVxufVxuXG5sZXQgcGVuZGluZ0FjdGlvbnNSdW5uaW5nID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVJ1blBlbmRpbmdBY3Rpb25zKCk6IHZvaWQge1xuICBpZiAoaXNBY3Rpb25SdW5uaW5nKCkgfHwgcGVuZGluZ0FjdGlvbnNSdW5uaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBwZW5kaW5nQWN0aW9uc1J1bm5pbmcgPSB0cnVlXG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAocGVuZGluZ0FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV4dEFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLnNoaWZ0KCkhXG4gICAgICBuZXh0QWN0aW9uKClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcGVuZGluZ0FjdGlvbnNSdW5uaW5nID0gZmFsc2VcbiAgfVxufVxuIiwiLyoqXG4gKiBBIGhvb2sgYWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBIb29rQWN0aW9uIHtcbiAgLyoqXG4gICAqIG9uSW5pdCBob29rXG4gICAqL1xuICBPbkluaXQgPSBcIiQkb25Jbml0XCIsXG4gIC8qKlxuICAgKiBvbkxhenlJbml0IGhvb2tcbiAgICovXG4gIE9uTGF6eUluaXQgPSBcIiQkb25MYXp5SW5pdFwiLFxuICAvKipcbiAgICogb25BdHRhY2hlZFRvUm9vdFN0b3JlIGhvb2tcbiAgICovXG4gIE9uQXR0YWNoZWRUb1Jvb3RTdG9yZSA9IFwiJCRvbkF0dGFjaGVkVG9Sb290U3RvcmVcIixcbiAgLyoqXG4gICAqIGRpc3Bvc2VyIGZvciBvbkF0dGFjaGVkVG9Sb290U3RvcmUgaG9va1xuICAgKi9cbiAgT25BdHRhY2hlZFRvUm9vdFN0b3JlRGlzcG9zZXIgPSBcIiQkb25BdHRhY2hlZFRvUm9vdFN0b3JlRGlzcG9zZXJcIixcbn1cblxuY29uc3QgaG9va0FjdGlvblZhbHVlczogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoT2JqZWN0LnZhbHVlcyhIb29rQWN0aW9uKSlcblxuLyoqXG4gKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gYWN0aW9uIG5hbWUgY29ycmVzcG9uZHMgdG8gYSBob29rLCB0aGlzIGlzLCBvbmUgb2Y6XG4gKiAtIG9uSW5pdCgpIGhvb2tcbiAqIC0gb25MYXp5SW5pdCgpIGhvb2tcbiAqIC0gb25BdHRhY2hlZFRvUm9vdFN0b3JlKCkgaG9va1xuICogLSBkaXNwb3NlciByZXR1cm5lZCBieSBhIG9uQXR0YWNoZWRUb1Jvb3RTdG9yZSgpIGhvb2tcbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBBY3Rpb24gbmFtZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBob29rLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hvb2tBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nKTogYWN0aW9uTmFtZSBpcyBIb29rQWN0aW9uIHtcbiAgcmV0dXJuIGhvb2tBY3Rpb25WYWx1ZXMuaGFzKGFjdGlvbk5hbWUpXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNyZWF0ZUF0b20sIElBdG9tLCBvYnNlcnZhYmxlLCBPYnNlcnZhYmxlU2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudCB9IGZyb20gXCIuL3BhdGhcIlxuXG5jb25zdCBkZWZhdWx0T2JzZXJ2YWJsZVNldE9wdGlvbnMgPSB7IGRlZXA6IGZhbHNlIH1cblxuaW50ZXJmYWNlIERlZXBPYmplY3RDaGlsZHJlbiB7XG4gIGRlZXA6IFNldDxvYmplY3Q+XG5cbiAgZXh0ZW5zaW9uc0RhdGE6IFdlYWtNYXA8U3ltYm9sLCBhbnk+XG59XG5cbmludGVyZmFjZSBPYmplY3RDaGlsZHJlbkRhdGEgZXh0ZW5kcyBEZWVwT2JqZWN0Q2hpbGRyZW4ge1xuICBzaGFsbG93OiBPYnNlcnZhYmxlU2V0PG9iamVjdD5cblxuICBkZWVwRGlydHk6IGJvb2xlYW5cbiAgZGVlcEF0b206IElBdG9tXG59XG5cbmNvbnN0IG9iamVjdENoaWxkcmVuID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBPYmplY3RDaGlsZHJlbkRhdGE+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVPYmplY3RDaGlsZHJlbihub2RlOiBvYmplY3QpIHtcbiAgaWYgKG9iamVjdENoaWxkcmVuLmhhcyhub2RlKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgb2JqZWN0Q2hpbGRyZW4uc2V0KG5vZGUsIHtcbiAgICBzaGFsbG93OiBvYnNlcnZhYmxlLnNldCh1bmRlZmluZWQsIGRlZmF1bHRPYnNlcnZhYmxlU2V0T3B0aW9ucyksXG5cbiAgICBkZWVwOiBuZXcgU2V0KCksXG4gICAgZXh0ZW5zaW9uc0RhdGE6IGluaXRFeHRlbnNpb25zRGF0YSgpLFxuXG4gICAgZGVlcERpcnR5OiB0cnVlLFxuICAgIGRlZXBBdG9tOiBjcmVhdGVBdG9tKFwiZGVlcENoaWxkcmVuQXRvbVwiKSxcbiAgfSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdENoaWxkcmVuKG5vZGU6IG9iamVjdCk6IE9iamVjdENoaWxkcmVuRGF0YVtcInNoYWxsb3dcIl0ge1xuICByZXR1cm4gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIS5zaGFsbG93XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWVwT2JqZWN0Q2hpbGRyZW4obm9kZTogb2JqZWN0KTogRGVlcE9iamVjdENoaWxkcmVuIHtcbiAgY29uc3Qgb2JqID0gb2JqZWN0Q2hpbGRyZW4uZ2V0KG5vZGUpIVxuXG4gIGlmIChvYmouZGVlcERpcnR5KSB7XG4gICAgdXBkYXRlRGVlcE9iamVjdENoaWxkcmVuKG5vZGUpXG4gIH1cblxuICBvYmouZGVlcEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gYWRkTm9kZVRvRGVlcExpc3RzKG5vZGU6IGFueSwgZGF0YTogRGVlcE9iamVjdENoaWxkcmVuKSB7XG4gIGRhdGEuZGVlcC5hZGQobm9kZSlcbiAgZXh0ZW5zaW9ucy5mb3JFYWNoKChleHRlbnNpb24sIGRhdGFTeW1ib2wpID0+IHtcbiAgICBleHRlbnNpb24uYWRkTm9kZShub2RlLCBkYXRhLmV4dGVuc2lvbnNEYXRhLmdldChkYXRhU3ltYm9sKSlcbiAgfSlcbn1cblxuY29uc3QgdXBkYXRlRGVlcE9iamVjdENoaWxkcmVuID0gYWN0aW9uKChub2RlOiBvYmplY3QpOiBEZWVwT2JqZWN0Q2hpbGRyZW4gPT4ge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG4gIGlmICghb2JqLmRlZXBEaXJ0eSkge1xuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGNvbnN0IGRhdGE6IERlZXBPYmplY3RDaGlsZHJlbiA9IHtcbiAgICBkZWVwOiBuZXcgU2V0KCksXG4gICAgZXh0ZW5zaW9uc0RhdGE6IGluaXRFeHRlbnNpb25zRGF0YSgpLFxuICB9XG5cbiAgY29uc3QgY2hpbGRyZW5JdGVyID0gZ2V0T2JqZWN0Q2hpbGRyZW4obm9kZSkhLnZhbHVlcygpXG4gIGxldCBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgd2hpbGUgKCFjaC5kb25lKSB7XG4gICAgYWRkTm9kZVRvRGVlcExpc3RzKGNoLnZhbHVlLCBkYXRhKVxuXG4gICAgY29uc3QgcmV0ID0gdXBkYXRlRGVlcE9iamVjdENoaWxkcmVuKGNoLnZhbHVlKS5kZWVwXG4gICAgY29uc3QgcmV0SXRlciA9IHJldC52YWx1ZXMoKVxuICAgIGxldCByZXRDdXIgPSByZXRJdGVyLm5leHQoKVxuICAgIHdoaWxlICghcmV0Q3VyLmRvbmUpIHtcbiAgICAgIGFkZE5vZGVUb0RlZXBMaXN0cyhyZXRDdXIudmFsdWUsIGRhdGEpXG4gICAgICByZXRDdXIgPSByZXRJdGVyLm5leHQoKVxuICAgIH1cblxuICAgIGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB9XG5cbiAgT2JqZWN0LmFzc2lnbihvYmosIGRhdGEpXG5cbiAgb2JqLmRlZXBEaXJ0eSA9IGZhbHNlXG4gIG9iai5kZWVwQXRvbS5yZXBvcnRDaGFuZ2VkKClcblxuICByZXR1cm4gb2JqXG59KVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYWRkT2JqZWN0Q2hpbGQgPSBhY3Rpb24oKG5vZGU6IG9iamVjdCwgY2hpbGQ6IG9iamVjdCkgPT4ge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG4gIG9iai5zaGFsbG93LmFkZChjaGlsZClcblxuICBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKG5vZGUpXG59KVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlT2JqZWN0Q2hpbGQgPSBhY3Rpb24oKG5vZGU6IG9iamVjdCwgY2hpbGQ6IG9iamVjdCkgPT4ge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG4gIG9iai5zaGFsbG93LmRlbGV0ZShjaGlsZClcblxuICBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKG5vZGUpXG59KVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKG5vZGU6IG9iamVjdCkge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG5cbiAgaWYgKCFvYmouZGVlcERpcnR5KSB7XG4gICAgb2JqLmRlZXBEaXJ0eSA9IHRydWVcbiAgICBvYmouZGVlcEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBjb25zdCBwYXJlbnQgPSBmYXN0R2V0UGFyZW50KG5vZGUpXG4gIGlmIChwYXJlbnQpIHtcbiAgICBpbnZhbGlkYXRlRGVlcENoaWxkcmVuKHBhcmVudClcbiAgfVxufVxuXG5jb25zdCBleHRlbnNpb25zID0gbmV3IE1hcDxTeW1ib2wsIERlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbjxhbnk+PigpXG5cbmludGVyZmFjZSBEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248RD4ge1xuICBpbml0RGF0YSgpOiBEXG4gIGFkZE5vZGUobm9kZTogYW55LCBkYXRhOiBEKTogdm9pZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248RD4oZXh0ZW5zaW9uOiBEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248RD4pIHtcbiAgY29uc3QgZGF0YVN5bWJvbCA9IFN5bWJvbChcImRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvblwiKVxuICBleHRlbnNpb25zLnNldChkYXRhU3ltYm9sLCBleHRlbnNpb24pXG5cbiAgcmV0dXJuIChkYXRhOiBEZWVwT2JqZWN0Q2hpbGRyZW4pOiBEID0+IHtcbiAgICByZXR1cm4gZGF0YS5leHRlbnNpb25zRGF0YS5nZXQoZGF0YVN5bWJvbCkgYXMgRFxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRFeHRlbnNpb25zRGF0YSgpIHtcbiAgY29uc3QgZXh0ZW5zaW9uc0RhdGEgPSBuZXcgTWFwPFN5bWJvbCwgYW55PigpXG5cbiAgZXh0ZW5zaW9ucy5mb3JFYWNoKChleHRlbnNpb24sIGRhdGFTeW1ib2wpID0+IHtcbiAgICBleHRlbnNpb25zRGF0YS5zZXQoZGF0YVN5bWJvbCwgZXh0ZW5zaW9uLmluaXREYXRhKCkpXG4gIH0pXG5cbiAgcmV0dXJuIGV4dGVuc2lvbnNEYXRhXG59XG4iLCJpbXBvcnQgeyBjb21wdXRlZCwgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBnZXRPYmplY3RDaGlsZHJlbiB9IGZyb20gXCIuL2NvcmVPYmplY3RDaGlsZHJlblwiXG5cbi8qKlxuICogTW9kZSBmb3IgdGhlIGB3YWxrVHJlZWAgbWV0aG9kLlxuICovXG5leHBvcnQgZW51bSBXYWxrVHJlZU1vZGUge1xuICAvKipcbiAgICogVGhlIHdhbGsgd2lsbCBiZSBkb25lIHBhcmVudCAocm9vdHMpIGZpcnN0LCB0aGVuIGNoaWxkcmVuLlxuICAgKi9cbiAgUGFyZW50Rmlyc3QgPSBcInBhcmVudEZpcnN0XCIsXG4gIC8qKlxuICAgKiBUaGUgd2FsayB3aWxsIGJlIGRvbmUgY2hpbGRyZW4gKGxlYWZzKSBmaXJzdCwgdGhlbiBwYXJlbnRzLlxuICAgKi9cbiAgQ2hpbGRyZW5GaXJzdCA9IFwiY2hpbGRyZW5GaXJzdFwiLFxufVxuXG4vKipcbiAqIFdhbGtzIGEgdHJlZSwgcnVubmluZyB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIHJldHVybnMgc29tZXRoaW5nIG90aGVyIHRoYW4gdW5kZWZpbmVkLFxuICogdGhlbiB0aGUgd2FsayB3aWxsIGJlIHN0b3BwZWQgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgcmV0dXJuZWQgdmFsdWUuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybmVkIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byB2b2lkLlxuICogQHBhcmFtIHJvb3QgU3VidHJlZSByb290IG9iamVjdC5cbiAqIEBwYXJhbSB2aXNpdCBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgcnVuIGZvciBlYWNoIG5vZGUgb2YgdGhlIHRyZWUuXG4gKiBAcGFyYW0gbW9kZSBNb2RlIHRvIHdhbGsgdGhlIHRyZWUsIGFzIGRlZmluZWQgaW4gYFdhbGtUcmVlTW9kZWAuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd2Fsa1RyZWU8VCA9IHZvaWQ+KFxuICByb290OiBvYmplY3QsXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBUIHwgdW5kZWZpbmVkLFxuICBtb2RlOiBXYWxrVHJlZU1vZGVcbik6IFQgfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHJvb3QsIFwicm9vdFwiKVxuXG4gIGlmIChtb2RlID09PSBXYWxrVHJlZU1vZGUuUGFyZW50Rmlyc3QpIHtcbiAgICByZXR1cm4gd2Fsa1RyZWVQYXJlbnRGaXJzdChyb290LCB2aXNpdClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gd2Fsa1RyZWVDaGlsZHJlbkZpcnN0KHJvb3QsIHZpc2l0KVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhbGtUcmVlUGFyZW50Rmlyc3Q8VCA9IHZvaWQ+KFxuICByb290OiBvYmplY3QsXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhY2s6IG9iamVjdFtdID0gW3Jvb3RdXG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhXG5cbiAgICBjb25zdCByZXQgPSB2aXNpdChub2RlKVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0T2JqZWN0Q2hpbGRyZW4obm9kZSkhXG5cbiAgICBzdGFjay5sZW5ndGggKz0gY2hpbGRyZW4uc2l6ZVxuICAgIGxldCBpID0gc3RhY2subGVuZ3RoIC0gMVxuXG4gICAgY29uc3QgY2hpbGRyZW5JdGVyID0gY2hpbGRyZW4hLnZhbHVlcygpXG4gICAgbGV0IGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICAgIHdoaWxlICghY2guZG9uZSkge1xuICAgICAgc3RhY2tbaS0tXSA9IGNoLnZhbHVlXG4gICAgICBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHdhbGtUcmVlQ2hpbGRyZW5GaXJzdDxUID0gdm9pZD4oXG4gIHJvb3Q6IG9iamVjdCxcbiAgdmlzaXQ6IChub2RlOiBvYmplY3QpID0+IFQgfCB1bmRlZmluZWRcbik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaGlsZHJlbkl0ZXIgPSBnZXRPYmplY3RDaGlsZHJlbihyb290KSEudmFsdWVzKClcbiAgbGV0IGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB3aGlsZSAoIWNoLmRvbmUpIHtcbiAgICBjb25zdCByZXQgPSB3YWxrVHJlZUNoaWxkcmVuRmlyc3QoY2gudmFsdWUsIHZpc2l0KVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgICBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcbiAgfVxuXG4gIGNvbnN0IHJldCA9IHZpc2l0KHJvb3QpXG4gIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPFI+IHtcbiAgd2Fsayh0YXJnZXQ6IG9iamVjdCk6IE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGdldENvbXB1dGVkVHJlZVJlc3VsdDxSPihcbiAgY29tcHV0ZWRGbnM6IFdlYWtNYXA8b2JqZWN0LCBJQ29tcHV0ZWRWYWx1ZTxNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZD4+LFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gUiB8IHVuZGVmaW5lZCxcbiAgdHJlZTogb2JqZWN0XG4pOiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjbXB0ZWQgPSBjb21wdXRlZEZucy5nZXQodHJlZSlcbiAgaWYgKCFjbXB0ZWQpIHtcbiAgICBjbXB0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gd2Fsa1RyZWVBZ2dyZWdhdGUodHJlZSwgdmlzaXQsIChjaCkgPT4gZ2V0Q29tcHV0ZWRUcmVlUmVzdWx0KGNvbXB1dGVkRm5zLCB2aXNpdCwgY2gpKVxuICAgIH0pXG4gICAgY29tcHV0ZWRGbnMuc2V0KHRyZWUsIGNtcHRlZClcbiAgfVxuICByZXR1cm4gY21wdGVkLmdldCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPFI+KFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gUiB8IHVuZGVmaW5lZFxuKTogQ29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZTxSPiB7XG4gIGNvbnN0IGNvbXB1dGVkRm5zID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQ29tcHV0ZWRWYWx1ZTxNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZD4+KClcblxuICByZXR1cm4ge1xuICAgIHdhbGs6IChuKSA9PiBnZXRDb21wdXRlZFRyZWVSZXN1bHQoY29tcHV0ZWRGbnMsIHZpc2l0LCBuKSxcbiAgfVxufVxuXG5mdW5jdGlvbiB3YWxrVHJlZUFnZ3JlZ2F0ZTxSPihcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBSIHwgdW5kZWZpbmVkLFxuICByZWN1cnNlOiAobm9kZTogb2JqZWN0KSA9PiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZFxuKTogTWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWQge1xuICBsZXQgbWFwOiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZFxuICBjb25zdCByb290VmFsID0gdmlzaXQodGFyZ2V0KVxuXG4gIGNvbnN0IGNoaWxkcmVuTWFwID0gZ2V0T2JqZWN0Q2hpbGRyZW4odGFyZ2V0KSFcbiAgY29uc3QgY2hpbGRyZW5JdGVyID0gY2hpbGRyZW5NYXAhLnZhbHVlcygpXG4gIGxldCBjaCA9IGNoaWxkcmVuSXRlci5uZXh0KClcblxuICAvLyBzbWFsbCBvcHRpbWl6YXRpb24sIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNoaWxkIGFuZCB0aGlzXG4gIC8vIG9iamVjdCBwcm92aWRlcyBubyB2YWx1ZSB3ZSBjYW4ganVzdCByZXVzZSB0aGUgY2hpbGQgb25lc1xuICBpZiAocm9vdFZhbCA9PT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuTWFwLnNpemUgPT09IDEpIHtcbiAgICByZXR1cm4gcmVjdXJzZShjaC52YWx1ZSlcbiAgfVxuXG4gIHdoaWxlICghY2guZG9uZSkge1xuICAgIGNvbnN0IGNoaWxkTWFwID0gcmVjdXJzZShjaC52YWx1ZSlcblxuICAgIGlmIChjaGlsZE1hcCkge1xuICAgICAgaWYgKCFtYXApIHtcbiAgICAgICAgbWFwID0gbmV3IE1hcCgpXG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBjaGlsZCBtYXAga2V5cy92YWx1ZXMgdG8gb3duIG1hcFxuICAgICAgY29uc3QgbWFwSXRlciA9IGNoaWxkTWFwLmtleXMoKVxuXG4gICAgICBsZXQgbWFwQ3VyID0gbWFwSXRlci5uZXh0KClcbiAgICAgIHdoaWxlICghbWFwQ3VyLmRvbmUpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWFwQ3VyLnZhbHVlXG4gICAgICAgIGNvbnN0IHZhbCA9IGNoaWxkTWFwLmdldChrZXkpIVxuICAgICAgICBtYXAuc2V0KGtleSwgdmFsKVxuICAgICAgICBtYXBDdXIgPSBtYXBJdGVyLm5leHQoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB9XG5cbiAgLy8gYWRkIGl0IGF0IHRoZSBlbmQgc28gcGFyZW50IHJlc29sdXRpb25zIGhhdmUgaGlnaGVyXG4gIC8vIHByaW9yaXR5IHRoYW4gY2hpbGQgb25lc1xuICBpZiAocm9vdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFtYXApIHtcbiAgICAgIG1hcCA9IG5ldyBNYXAoKVxuICAgIH1cbiAgICBtYXAuc2V0KHJvb3RWYWwsIHRhcmdldClcbiAgfVxuXG4gIHJldHVybiBtYXBcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IEhvb2tBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2hvb2tBY3Rpb25zXCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiwgd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZCB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB7IEFueU1vZGVsLCBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IHdhbGtUcmVlLCBXYWxrVHJlZU1vZGUgfSBmcm9tIFwiLi4vcGFyZW50L3dhbGtUcmVlXCJcblxuY29uc3Qgb25BdHRhY2hlZERpc3Bvc2VycyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgKCkgPT4gdm9pZD4oKVxuY29uc3QgYXR0YWNoZWRUb1Jvb3RTdG9yZSA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYXR0YWNoVG9Sb290U3RvcmUgPSBhY3Rpb24oXG4gIFwiYXR0YWNoVG9Sb290U3RvcmVcIixcbiAgKHJvb3RTdG9yZTogb2JqZWN0LCBjaGlsZDogb2JqZWN0KTogdm9pZCA9PiB7XG4gICAgLy8gd2UgdXNlIGFuIGFycmF5IHRvIGVuc3VyZSB0aGV5IHdpbGwgZ2V0IGNhbGxlZCBldmVuIGlmIHRoZSBhY3R1YWwgaG9vayBtb2RpZmllcyB0aGUgdHJlZVxuICAgIGNvbnN0IGNoaWxkcmVuVG9DYWxsOiBBbnlNb2RlbFtdID0gW11cblxuICAgIHdhbGtUcmVlKFxuICAgICAgY2hpbGQsXG4gICAgICAoY2gpID0+IHtcbiAgICAgICAgLy8gd2UgdXNlIHRoaXMgdG8gYXZvaWQgY2FsbGluZyBvbkF0dGFjaGVkVG9Sb290U3RvcmVcbiAgICAgICAgLy8gdHdpY2VcbiAgICAgICAgaWYgKGF0dGFjaGVkVG9Sb290U3RvcmUuaGFzKGNoKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGF0dGFjaGVkVG9Sb290U3RvcmUuYWRkKGNoKVxuXG4gICAgICAgIGlmIChjaCBpbnN0YW5jZW9mIEJhc2VNb2RlbCAmJiAoY2ggYXMgYW55KS5vbkF0dGFjaGVkVG9Sb290U3RvcmUpIHtcbiAgICAgICAgICB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkKFxuICAgICAgICAgICAgY2ggYXMgYW55LFxuICAgICAgICAgICAgXCJvbkF0dGFjaGVkVG9Sb290U3RvcmVcIixcbiAgICAgICAgICAgIEhvb2tBY3Rpb24uT25BdHRhY2hlZFRvUm9vdFN0b3JlXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY2hpbGRyZW5Ub0NhbGwucHVzaChjaCBhcyBBbnlNb2RlbClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFdhbGtUcmVlTW9kZS5QYXJlbnRGaXJzdFxuICAgIClcblxuICAgIGNvbnN0IGNoaWxkcmVuVG9DYWxsTGVuID0gY2hpbGRyZW5Ub0NhbGwubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlblRvQ2FsbExlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjaCA9IGNoaWxkcmVuVG9DYWxsW2ldXG5cbiAgICAgIGNvbnN0IGRpc3Bvc2VyID0gKGNoIGFzIGFueSkub25BdHRhY2hlZFRvUm9vdFN0b3JlIShyb290U3RvcmUpXG4gICAgICBpZiAoZGlzcG9zZXIpIHtcbiAgICAgICAgb25BdHRhY2hlZERpc3Bvc2Vycy5zZXQoY2gsIGRpc3Bvc2VyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGV0YWNoRnJvbVJvb3RTdG9yZSA9IGFjdGlvbihcImRldGFjaEZyb21Sb290U3RvcmVcIiwgKGNoaWxkOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgLy8gd2UgdXNlIGFuIGFycmF5IHRvIGVuc3VyZSB0aGV5IHdpbGwgZ2V0IGNhbGxlZCBldmVuIGlmIHRoZSBhY3R1YWwgaG9vayBtb2RpZmllcyB0aGUgdHJlZVxuICBjb25zdCBkaXNwb3NlcnNUb0NhbGw6ICgoKSA9PiB2b2lkKVtdID0gW11cblxuICB3YWxrVHJlZShcbiAgICBjaGlsZCxcbiAgICAoY2gpID0+IHtcbiAgICAgIGlmICghYXR0YWNoZWRUb1Jvb3RTdG9yZS5kZWxldGUoY2gpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXNwb3NlciA9IG9uQXR0YWNoZWREaXNwb3NlcnMuZ2V0KGNoKVxuICAgICAgaWYgKGRpc3Bvc2VyKSB7XG4gICAgICAgIC8vIHdyYXAgZGlzcG9zZXIgaW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IGRpc3Bvc2VyQWN0aW9uID0gd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICBuYW1lT3JOYW1lRm46IEhvb2tBY3Rpb24uT25BdHRhY2hlZFRvUm9vdFN0b3JlRGlzcG9zZXIsXG4gICAgICAgICAgZm46IGRpc3Bvc2VyLFxuICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gICAgICAgIH0pLmJpbmQoY2gpXG4gICAgICAgIG9uQXR0YWNoZWREaXNwb3NlcnMuZGVsZXRlKGNoKVxuXG4gICAgICAgIGRpc3Bvc2Vyc1RvQ2FsbC5wdXNoKGRpc3Bvc2VyQWN0aW9uKVxuICAgICAgfVxuICAgIH0sXG4gICAgV2Fsa1RyZWVNb2RlLkNoaWxkcmVuRmlyc3RcbiAgKVxuXG4gIGNvbnN0IGRpc3Bvc2Vyc1RvQ2FsbExlbiA9IGRpc3Bvc2Vyc1RvQ2FsbC5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwb3NlcnNUb0NhbGxMZW47IGkrKykge1xuICAgIGRpc3Bvc2Vyc1RvQ2FsbFtpXSgpXG4gIH1cbn0pXG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNyZWF0ZUF0b20sIElBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZmFzdEdldFJvb3QsIGlzUm9vdCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB7IGF0dGFjaFRvUm9vdFN0b3JlLCBkZXRhY2hGcm9tUm9vdFN0b3JlIH0gZnJvbSBcIi4vYXR0YWNoRGV0YWNoXCJcblxuY29uc3Qgcm9vdFN0b3JlcyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuY29uc3Qgcm9vdFN0b3JlQXRvbXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIElBdG9tPigpXG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgbW9kZWwgLyB0cmVlIG5vZGUgb2JqZWN0IGFzIGEgcm9vdCBzdG9yZSB0cmVlLlxuICogTWFya2luZyBhIG1vZGVsIG9iamVjdCBhcyBhIHJvb3Qgc3RvcmUgdHJlZSBzZXJ2ZXMgc2V2ZXJhbCBwdXJwb3NlczpcbiAqIC0gSXQgYWxsb3dzIHRoZSBgb25BdHRhY2hlZFRvUm9vdFN0b3JlYCBob29rIChwbHVzIGRpc3Bvc2VyKSB0byBiZSBpbnZva2VkIG9uIG1vZGVscyBvbmNlIHRoZXkgYmVjb21lIHBhcnQgb2YgdGhpcyB0cmVlLlxuICogICBUaGVzZSBob29rcyBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBhdHRhY2ggZWZmZWN0cyBhbmQgc2VydmUgYXMgc29tZSBzb3J0IG9mIGluaXRpYWxpemF0aW9uLlxuICogLSBJdCBhbGxvd3MgYXV0byBkZXRhY2hhYmxlIHJlZmVyZW5jZXMgdG8gd29yayBwcm9wZXJseS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBOb2RlIG9iamVjdCB0byByZWdpc3RlciBhcyByb290IHN0b3JlLlxuICogQHJldHVybnMgVGhlIHNhbWUgbW9kZWwgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyUm9vdFN0b3JlOiA8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCkgPT4gVCA9IGFjdGlvbihcbiAgXCJyZWdpc3RlclJvb3RTdG9yZVwiLFxuICAobm9kZSkgPT4ge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICBpZiAocm9vdFN0b3Jlcy5oYXMobm9kZSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJvYmplY3QgYWxyZWFkeSByZWdpc3RlcmVkIGFzIHJvb3Qgc3RvcmVcIilcbiAgICB9XG5cbiAgICBpZiAoIWlzUm9vdChub2RlKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcm9vdCBzdG9yZSBtdXN0IG5vdCBoYXZlIGEgcGFyZW50XCIpXG4gICAgfVxuXG4gICAgcm9vdFN0b3Jlcy5hZGQobm9kZSlcblxuICAgIGF0dGFjaFRvUm9vdFN0b3JlKG5vZGUsIG5vZGUpXG5cbiAgICBnZXRPckNyZWF0ZVJvb3RTdG9yZUF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG4gICAgcmV0dXJuIG5vZGVcbiAgfVxuKVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIGFuIG9iamVjdCB0byBtYXJrIGl0IGFzIG5vIGxvbmdlciBhIHJvb3Qgc3RvcmUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSBvYmplY3QgdG8gdW5yZWdpc3RlciBhcyByb290IHN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgdW5yZWdpc3RlclJvb3RTdG9yZTogKG5vZGU6IG9iamVjdCkgPT4gdm9pZCA9IGFjdGlvbihcInVucmVnaXN0ZXJSb290U3RvcmVcIiwgKG5vZGUpID0+IHtcbiAgaWYgKCFpc1Jvb3RTdG9yZShub2RlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJub3QgYSByb290IHN0b3JlXCIpXG4gIH1cblxuICByb290U3RvcmVzLmRlbGV0ZShub2RlKVxuXG4gIGRldGFjaEZyb21Sb290U3RvcmUobm9kZSlcblxuICBnZXRPckNyZWF0ZVJvb3RTdG9yZUF0b20obm9kZSkucmVwb3J0Q2hhbmdlZCgpXG59KVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIG9iamVjdCBpcyBtYXJrZWQgYXMgYSByb290IHN0b3JlLlxuICpcbiAqIEBwYXJhbSBub2RlIE9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jvb3RTdG9yZShub2RlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICByZXR1cm4gZmFzdElzUm9vdFN0b3JlKG5vZGUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0SXNSb290U3RvcmUobm9kZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGdldE9yQ3JlYXRlUm9vdFN0b3JlQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG4gIHJldHVybiByb290U3RvcmVzLmhhcyhub2RlKVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHJvb3Qgc3RvcmUgb2YgYSBnaXZlbiB0cmVlIGNoaWxkLCBvciB1bmRlZmluZWQgaWYgbm9uZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUm9vdCBzdG9yZSB0eXBlLlxuICogQHBhcmFtIG5vZGUgVGFyZ2V0IHRvIGZpbmQgdGhlIHJvb3Qgc3RvcmUgZm9yLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3RTdG9yZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBvYmplY3QpOiBUIHwgdW5kZWZpbmVkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICByZXR1cm4gZmFzdEdldFJvb3RTdG9yZShub2RlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFJvb3RTdG9yZTxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBvYmplY3QpOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IGZhc3RHZXRSb290KG5vZGUpXG4gIHJldHVybiBmYXN0SXNSb290U3RvcmUocm9vdCkgPyByb290IDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlUm9vdFN0b3JlQXRvbShub2RlOiBvYmplY3QpOiBJQXRvbSB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShyb290U3RvcmVBdG9tcywgbm9kZSwgKCkgPT4gY3JlYXRlQXRvbShcInJvb3RTdG9yZVwiKSlcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgaXNBY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGhFbGVtZW50IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiwgZGVsZXRlRnJvbUFycmF5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi9QYXRjaFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIge1xuICBwYXRjaGVzITogUGF0Y2hbXVxuICBpbnZQYXRjaGVzITogUGF0Y2hbXVxuXG4gIHJlY29yZChwYXRjaGVzOiBQYXRjaFtdLCBpbnZQYXRjaGVzOiBQYXRjaFtdKSB7XG4gICAgdGhpcy5wYXRjaGVzID0gcGF0Y2hlc1xuICAgIHRoaXMuaW52UGF0Y2hlcyA9IGludlBhdGNoZXNcbiAgfVxuXG4gIGVtaXQob2JqOiBvYmplY3QpIHtcbiAgICBlbWl0UGF0Y2gob2JqLCB0aGlzLnBhdGNoZXMsIHRoaXMuaW52UGF0Y2hlcywgdHJ1ZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuIGEgcGF0Y2ggaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgT25QYXRjaGVzTGlzdGVuZXIgPSAocGF0Y2hlczogUGF0Y2hbXSwgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW10pID0+IHZvaWRcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiBhIGdsb2JhbCBwYXRjaCBpcyBlbWl0dGVkLlxuICovXG5leHBvcnQgdHlwZSBPbkdsb2JhbFBhdGNoZXNMaXN0ZW5lciA9IChcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIHBhdGNoZXM6IFBhdGNoW10sXG4gIGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG4pID0+IHZvaWRcblxuLyoqXG4gKiBEaXNwb3NlciBmdW5jdGlvbiB0byBzdG9wIGxpc3RlbmluZyB0byBwYXRjaGVzLlxuICovXG5leHBvcnQgdHlwZSBPblBhdGNoZXNEaXNwb3NlciA9ICgpID0+IHZvaWRcblxuY29uc3QgcGF0Y2hMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcDxvYmplY3QsIE9uUGF0Y2hlc0xpc3RlbmVyW10+KClcbmNvbnN0IGdsb2JhbFBhdGNoTGlzdGVuZXJzOiBPbkdsb2JhbFBhdGNoZXNMaXN0ZW5lcltdID0gW11cblxuLyoqXG4gKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgcGF0Y2ggaXMgZ2VuZXJhdGVkIGZvciB0aGUgdHJlZSBvZiB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IG9iamVjdCBvZiB0aGUgcGF0Y2ggbGlzdGVuZXIuXG4gKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgZXZlcnl0aW1lIGEgcGF0Y2ggaXMgZ2VuZXJhdGVkIGZvciB0aGUgb2JqZWN0IG9yIGl0cyBjaGlsZHJlbi5cbiAqIEByZXR1cm5zIEEgZGlzcG9zZXIgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gcGF0Y2hlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uUGF0Y2hlcyhzdWJ0cmVlUm9vdDogb2JqZWN0LCBsaXN0ZW5lcjogT25QYXRjaGVzTGlzdGVuZXIpOiBPblBhdGNoZXNEaXNwb3NlciB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcbiAgYXNzZXJ0SXNGdW5jdGlvbihsaXN0ZW5lciwgXCJsaXN0ZW5lclwiKVxuXG4gIGlmICghaXNBY3Rpb24obGlzdGVuZXIpKSB7XG4gICAgbGlzdGVuZXIgPSBhY3Rpb24obGlzdGVuZXIubmFtZSB8fCBcIm9uUGF0Y2hlc0xpc3RlbmVyXCIsIGxpc3RlbmVyKVxuICB9XG5cbiAgbGV0IGxpc3RlbmVyc0Zvck9iamVjdCA9IHBhdGNoTGlzdGVuZXJzLmdldChzdWJ0cmVlUm9vdClcbiAgaWYgKCFsaXN0ZW5lcnNGb3JPYmplY3QpIHtcbiAgICBsaXN0ZW5lcnNGb3JPYmplY3QgPSBbXVxuICAgIHBhdGNoTGlzdGVuZXJzLnNldChzdWJ0cmVlUm9vdCwgbGlzdGVuZXJzRm9yT2JqZWN0KVxuICB9XG5cbiAgbGlzdGVuZXJzRm9yT2JqZWN0LnB1c2gobGlzdGVuZXIpXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZGVsZXRlRnJvbUFycmF5KGxpc3RlbmVyc0Zvck9iamVjdCEsIGxpc3RlbmVyKVxuICB9XG59XG5cbi8qKlxuICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIHBhdGNoIGlzIGdlbmVyYXRlZCBhbnl3aGVyZS5cbiAqIFVzdWFsbHkgcHJlZmVyIHVzaW5nIGBvblBhdGNoZXNgLlxuICpcbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBldmVyeXRpbWUgYSBwYXRjaCBpcyBnZW5lcmF0ZWQgYW55d2hlcmUuXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHBhdGNoZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkdsb2JhbFBhdGNoZXMobGlzdGVuZXI6IE9uR2xvYmFsUGF0Y2hlc0xpc3RlbmVyKTogT25QYXRjaGVzRGlzcG9zZXIge1xuICBhc3NlcnRJc0Z1bmN0aW9uKGxpc3RlbmVyLCBcImxpc3RlbmVyXCIpXG5cbiAgaWYgKCFpc0FjdGlvbihsaXN0ZW5lcikpIHtcbiAgICBsaXN0ZW5lciA9IGFjdGlvbihsaXN0ZW5lci5uYW1lIHx8IFwib25HbG9iYWxQYXRjaGVzTGlzdGVuZXJcIiwgbGlzdGVuZXIpXG4gIH1cblxuICBnbG9iYWxQYXRjaExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKVxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRlbGV0ZUZyb21BcnJheShnbG9iYWxQYXRjaExpc3RlbmVycywgbGlzdGVuZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFBhdGNoKFxuICBvYmo6IG9iamVjdCxcbiAgcGF0Y2hlczogUGF0Y2hbXSxcbiAgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW10sXG4gIGVtaXRHbG9iYWxseTogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChwYXRjaGVzLmxlbmd0aCA8PSAwICYmIGludmVyc2VQYXRjaGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBmaXJzdCBlbWl0IGdsb2JhbCBsaXN0ZW5lcnNcbiAgaWYgKGVtaXRHbG9iYWxseSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2xvYmFsUGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gZ2xvYmFsUGF0Y2hMaXN0ZW5lcnNbaV1cbiAgICAgIGxpc3RlbmVyKG9iaiwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpXG4gICAgfVxuICB9XG5cbiAgLy8gdGhlbiBwZXIgc3VidHJlZSBsaXN0ZW5lcnNcbiAgY29uc3QgbGlzdGVuZXJzRm9yT2JqZWN0ID0gcGF0Y2hMaXN0ZW5lcnMuZ2V0KG9iailcbiAgaWYgKGxpc3RlbmVyc0Zvck9iamVjdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzRm9yT2JqZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGxpc3RlbmVyc0Zvck9iamVjdFtpXVxuICAgICAgbGlzdGVuZXIocGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpXG4gICAgfVxuICB9XG5cbiAgLy8gYW5kIGFsc28gZW1pdCBzdWJ0cmVlIGxpc3RlbmVycyBhbGwgdGhlIHdheSB0byB0aGUgcm9vdFxuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgob2JqKVxuICBpZiAocGFyZW50UGF0aCkge1xuICAgIC8vIHR3ZWFrIHBhdGNoZXMgc28gdGhleSBpbmNsdWRlIHRoZSBjaGlsZCBwYXRoXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcGFyZW50UGF0aC5wYXRoXG4gICAgY29uc3QgbmV3UGF0Y2hlcyA9IHBhdGNoZXMubWFwKChwKSA9PiBhZGRQYXRoVG9QYXRjaChwLCBjaGlsZFBhdGgpKVxuICAgIGNvbnN0IG5ld0ludmVyc2VQYXRjaGVzID0gaW52ZXJzZVBhdGNoZXMubWFwKChwKSA9PiBhZGRQYXRoVG9QYXRjaChwLCBjaGlsZFBhdGgpKVxuXG4gICAgLy8gZmFsc2UgdG8gYXZvaWQgZW1pdHRpbmcgZ2xvYmFsIHBhdGNoZXMgYWdhaW4gZm9yIHRoZSBzYW1lIGNoYW5nZVxuICAgIGVtaXRQYXRjaChwYXJlbnRQYXRoLnBhcmVudCwgbmV3UGF0Y2hlcywgbmV3SW52ZXJzZVBhdGNoZXMsIGZhbHNlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBhdGhUb1BhdGNoKHBhdGNoOiBQYXRjaCwgcGF0aDogUGF0aEVsZW1lbnQpOiBQYXRjaCB7XG4gIHJldHVybiB7XG4gICAgLi4ucGF0Y2gsXG4gICAgcGF0aDogW3BhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsTWV0YWRhdGFTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsLCBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEFzc29jaWF0ZWQgZGF0YSBtb2RlbCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhTW9kZWxNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBBc3NvY2lhdGVkIGRhdGEgdHlwZSBmb3IgcnVudGltZSBjaGVja2luZyAoaWYgYW55KS5cbiAgICovXG4gIGRhdGFUeXBlPzogQW55VHlwZVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgZm9yIGEgZGF0YSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gbW9kZWxDbGFzc09ySW5zdGFuY2UgRGF0YSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YU1vZGVsTWV0YWRhdGEoXG4gIG1vZGVsQ2xhc3NPckluc3RhbmNlOiBBbnlEYXRhTW9kZWwgfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbik6IERhdGFNb2RlbE1ldGFkYXRhIHtcbiAgaWYgKGlzRGF0YU1vZGVsKG1vZGVsQ2xhc3NPckluc3RhbmNlKSkge1xuICAgIHJldHVybiAobW9kZWxDbGFzc09ySW5zdGFuY2UgYXMgYW55KS5jb25zdHJ1Y3Rvclttb2RlbE1ldGFkYXRhU3ltYm9sXVxuICB9IGVsc2UgaWYgKGlzRGF0YU1vZGVsQ2xhc3MobW9kZWxDbGFzc09ySW5zdGFuY2UpKSB7XG4gICAgcmV0dXJuIChtb2RlbENsYXNzT3JJbnN0YW5jZSBhcyBhbnkpW21vZGVsTWV0YWRhdGFTeW1ib2xdXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgbW9kZWxDbGFzc09ySW5zdGFuY2UgbXVzdCBiZSBhIG1vZGVsIGNsYXNzIG9yIGluc3RhbmNlYClcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uLy4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IGdldERhdGFNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL2RhdGFNb2RlbC9nZXREYXRhTW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4uLy4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MsIE1vZGVsRGF0YSB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsUHJvcHNJbmZvXCJcbmltcG9ydCB7IG5vRGVmYXVsdFZhbHVlIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgZmFpbHVyZSwgbGF6eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXG5pbXBvcnQgeyByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5cbmNvbnN0IGNhY2hlZERhdGFNb2RlbFR5cGVDaGVja2VyID0gbmV3IFdlYWtNYXA8TW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LCBUeXBlQ2hlY2tlcj4oKVxuXG50eXBlIF9DbGFzczxUPiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbnR5cGUgX0NsYXNzT3JPYmplY3Q8TSwgSz4gPSBLIGV4dGVuZHMgTSA/IG9iamVjdCA6IF9DbGFzczxLPiB8ICgoKSA9PiBfQ2xhc3M8Sz4pXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGRhdGEgbW9kZWwgZGF0YS5cbiAqIFRoZSB0eXBlIHJlZmVyZW5jZWQgaW4gdGhlIG1vZGVsIGRlY29yYXRvciB3aWxsIGJlIHVzZWQgZm9yIHR5cGUgY2hlY2tpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBzb21lRGF0YU1vZGVsRGF0YVR5cGUgPSB0eXBlcy5kYXRhTW9kZWxEYXRhKFNvbWVNb2RlbClcbiAqIC8vIG9yIGZvciByZWN1cnNpdmUgbW9kZWxzXG4gKiBjb25zdCBzb21lRGF0YU1vZGVsRGF0YVR5cGUgPSB0eXBlcy5kYXRhTW9kZWxEYXRhPFNvbWVNb2RlbD4oKCkgPT4gU29tZU1vZGVsKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBNIERhdGEgbW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbENsYXNzIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzRGF0YU1vZGVsRGF0YTxNID0gbmV2ZXIsIEsgPSBNPihcbiAgbW9kZWxDbGFzczogX0NsYXNzT3JPYmplY3Q8TSwgSz5cbik6IElkZW50aXR5VHlwZTxcbiAgTW9kZWxEYXRhPEsgZXh0ZW5kcyBNID8gKE0gZXh0ZW5kcyBBbnlEYXRhTW9kZWwgPyBNIDogbmV2ZXIpIDogSyBleHRlbmRzIEFueURhdGFNb2RlbCA/IEsgOiBuZXZlcj5cbj4ge1xuICAvLyBpZiB3ZSB0eXBlIGl0IGFueSBzdHJvbmdlciB0aGVuIHJlY3Vyc2l2ZSBkZWZzIGFuZCBzbyBvbiBzdG9wIHdvcmtpbmdcblxuICBpZiAoIWlzRGF0YU1vZGVsQ2xhc3MobW9kZWxDbGFzcykgJiYgdHlwZW9mIG1vZGVsQ2xhc3MgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIHJlc29sdmUgbGF0ZXJcbiAgICBjb25zdCBtb2RlbENsYXNzRm4gPSBtb2RlbENsYXNzIGFzICgpID0+IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPlxuICAgIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgRGF0YU1vZGVsRGF0YVR5cGVJbmZvKHQsIG1vZGVsQ2xhc3NGbigpKVxuICAgIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4gdHlwZXNEYXRhTW9kZWxEYXRhKG1vZGVsQ2xhc3NGbigpKSBhcyBhbnksIHR5cGVJbmZvR2VuKSBhcyBhbnlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtb2RlbENsYXp6OiBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4gPSBtb2RlbENsYXNzIGFzIGFueVxuXG4gICAgY29uc3QgY2FjaGVkVHlwZUNoZWNrZXIgPSBjYWNoZWREYXRhTW9kZWxUeXBlQ2hlY2tlci5nZXQobW9kZWxDbGF6eilcbiAgICBpZiAoY2FjaGVkVHlwZUNoZWNrZXIpIHtcbiAgICAgIHJldHVybiBjYWNoZWRUeXBlQ2hlY2tlciBhcyBhbnlcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IERhdGFNb2RlbERhdGFUeXBlSW5mbyh0LCBtb2RlbENsYXp6KVxuXG4gICAgY29uc3QgdGMgPSBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGF6eikhXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGBEYXRhTW9kZWxEYXRhKCR7bW9kZWxJbmZvLm5hbWV9KWBcblxuICAgICAgY29uc3QgZGF0YVR5cGVDaGVja2VyID0gZ2V0RGF0YU1vZGVsTWV0YWRhdGEobW9kZWxDbGF6eikuZGF0YVR5cGVcbiAgICAgIGlmICghZGF0YVR5cGVDaGVja2VyKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYHR5cGUgY2hlY2tpbmcgY2Fubm90IGJlIHBlcmZvcm1lZCBvdmVyIGRhdGEgbW9kZWwgZGF0YSBvZiB0eXBlICcke21vZGVsSW5mby5uYW1lfScgc2luY2UgdGhhdCBtb2RlbCB0eXBlIGhhcyBubyBkYXRhIHR5cGUgZGVjbGFyZWQsIGNvbnNpZGVyIGFkZGluZyBhIGRhdGEgdHlwZSBvciB1c2luZyB0eXBlcy51bmNoZWNrZWQoKSBpbnN0ZWFkYFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc29sdmVkRGF0YVR5cGVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcblxuICAgICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAgICAgKHZhbHVlLCBwYXRoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLmNoZWNrKHZhbHVlLCBwYXRoKVxuICAgICAgICB9LFxuXG4gICAgICAgICgpID0+IHR5cGVOYW1lLFxuICAgICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuc25hcHNob3RUeXBlKHZhbHVlKSA/IHRoaXNUYyA6IG51bGxcbiAgICAgICAgfSxcblxuICAgICAgICAoc246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICAgICAgfSxcblxuICAgICAgICAoc246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLnRvU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICAgIH1cbiAgICAgIClcblxuICAgICAgcmV0dXJuIHRoaXNUY1xuICAgIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcblxuICAgIGNhY2hlZERhdGFNb2RlbFR5cGVDaGVja2VyLnNldChtb2RlbENsYXp6LCB0YylcblxuICAgIHJldHVybiB0YyBhcyBhbnlcbiAgfVxufVxuXG4vKipcbiAqIGB0eXBlcy5kYXRhTW9kZWxEYXRhYCB0eXBlIGluZm8gZm9yIGEgbW9kZWwgcHJvcHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YU1vZGVsRGF0YVR5cGVJbmZvUHJvcHMge1xuICByZWFkb25seSBbcHJvcE5hbWU6IHN0cmluZ106IFJlYWRvbmx5PHtcbiAgICB0eXBlOiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWRcbiAgICB0eXBlSW5mbzogVHlwZUluZm8gfCB1bmRlZmluZWRcbiAgICBoYXNEZWZhdWx0OiBib29sZWFuXG4gICAgZGVmYXVsdDogYW55XG4gIH0+XG59XG5cbi8qKlxuICogYHR5cGVzLmRhdGFNb2RlbERhdGFgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFNb2RlbERhdGFUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgcHJpdmF0ZSBfcHJvcHMgPSBsYXp5KCgpID0+IHtcbiAgICBjb25zdCBvYmpTY2hlbWEgPSBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8odGhpcy5tb2RlbENsYXNzKVxuXG4gICAgY29uc3QgcHJvcFR5cGVzOiBPLldyaXRhYmxlPERhdGFNb2RlbERhdGFUeXBlSW5mb1Byb3BzPiA9IHt9XG4gICAgT2JqZWN0LmtleXMob2JqU2NoZW1hKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcHJvcERhdGEgPSBvYmpTY2hlbWFbcHJvcE5hbWVdXG5cbiAgICAgIGNvbnN0IHR5cGUgPSBwcm9wRGF0YS5faW50ZXJuYWwudHlwZUNoZWNrZXIgYXMgYW55IGFzIEFueVN0YW5kYXJkVHlwZVxuXG4gICAgICBsZXQgdHlwZUluZm86IFR5cGVJbmZvIHwgdW5kZWZpbmVkXG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICB0eXBlSW5mbyA9IGdldFR5cGVJbmZvKHR5cGUpXG4gICAgICB9XG5cbiAgICAgIGxldCBoYXNEZWZhdWx0ID0gZmFsc2VcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueVxuICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm5cbiAgICAgICAgaGFzRGVmYXVsdCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZSAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZVxuICAgICAgICBoYXNEZWZhdWx0ID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBwcm9wVHlwZXNbcHJvcE5hbWVdID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICB0eXBlSW5mbyxcbiAgICAgICAgaGFzRGVmYXVsdCxcbiAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlLFxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHByb3BUeXBlc1xuICB9KVxuXG4gIGdldCBwcm9wcygpOiBEYXRhTW9kZWxEYXRhVHlwZUluZm9Qcm9wcyB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzKClcbiAgfVxuXG4gIGdldCBtb2RlbFR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldCh0aGlzLm1vZGVsQ2xhc3MpIVxuICAgIHJldHVybiBtb2RlbEluZm8ubmFtZVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+KSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgeyBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsRGF0YSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgYXBwbHlNb2RlbEluaXRpYWxpemVycyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9uZXdNb2RlbFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIG1ha2VQcm9wUmVhZG9ubHkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4vRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGdldERhdGFNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4vZ2V0RGF0YU1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgYXNzZXJ0SXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGludGVybmFsTmV3RGF0YU1vZGVsID0gYWN0aW9uKFxuICBcIm5ld01vZGVsXCIsXG4gIDxNIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgICBvcmlnTW9kZWxPYmo6IE0sXG4gICAgdHdlYWtlZERhdGE6IE1vZGVsRGF0YTxNPixcbiAgICBvcHRpb25zOiBQaWNrPERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucywgXCJtb2RlbENsYXNzXCI+XG4gICk6IE0gPT4ge1xuICAgIGNvbnN0IHsgbW9kZWxDbGFzczogX21vZGVsQ2xhc3MgfSA9IG9wdGlvbnNcbiAgICBjb25zdCBtb2RlbENsYXNzID0gX21vZGVsQ2xhc3MhXG5cbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIGFzc2VydElzRGF0YU1vZGVsQ2xhc3MobW9kZWxDbGFzcywgXCJtb2RlbENsYXNzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxPYmogPSBvcmlnTW9kZWxPYmogYXMgTy5Xcml0YWJsZTxNPlxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGFzcylcbiAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYG5vIG1vZGVsIGluZm8gZm9yIGNsYXNzICR7bW9kZWxDbGFzcy5uYW1lfSBjb3VsZCBiZSBmb3VuZCAtIGRpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQG1vZGVsIGRlY29yYXRvcj9gXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gbGluayBpdCwgYW5kIG1ha2UgaXQgcmVhZG9ubHlcbiAgICBtb2RlbE9iai4kID0gdHdlYWtlZERhdGFcbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIG1ha2VQcm9wUmVhZG9ubHkobW9kZWxPYmosIFwiJFwiLCB0cnVlKVxuICAgIH1cblxuICAgIC8vIHR5cGUgY2hlY2sgaXQgaWYgbmVlZGVkXG4gICAgaWYgKGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCgpICYmIGdldERhdGFNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhc3MpLmRhdGFUeXBlKSB7XG4gICAgICBjb25zdCBlcnIgPSBtb2RlbE9iai50eXBlQ2hlY2soKVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBlcnIudGhyb3cobW9kZWxPYmopXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcnVuIGFueSBleHRyYSBpbml0aWFsaXplcnMgZm9yIHRoZSBjbGFzcyBhcyBuZWVkZWRcbiAgICBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzKG1vZGVsQ2xhc3MsIG1vZGVsT2JqKVxuXG4gICAgcmV0dXJuIG1vZGVsT2JqIGFzIE1cbiAgfVxuKVxuIiwiaW1wb3J0IHsgTW9kZWxDbGFzcywgcHJvcHNUeXBlU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHtcbiAgTW9kZWxQcm9wcyxcbiAgTW9kZWxQcm9wc1RvQ3JlYXRpb25EYXRhLFxuICBNb2RlbFByb3BzVG9EYXRhLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbiAgbm9EZWZhdWx0VmFsdWUsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGlzVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IHRvVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyB0eXBlc0RhdGFNb2RlbERhdGEgfSBmcm9tIFwiLi4vdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNEYXRhTW9kZWxEYXRhXCJcbmltcG9ydCB7IHR5cGVDaGVjayB9IGZyb20gXCIuLi90eXBlcy90eXBlQ2hlY2tcIlxuaW1wb3J0IHR5cGUgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuL0RhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyBpbnRlcm5hbE5ld0RhdGFNb2RlbCB9IGZyb20gXCIuL25ld0RhdGFNb2RlbFwiXG5cbmNvbnN0IGRhdGFNb2RlbEluc3RhbmNlQ2FjaGUgPSBuZXcgV2Vha01hcDxNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sIFdlYWtNYXA8YW55LCBBbnlEYXRhTW9kZWw+PigpXG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0YSBtb2RlbHMuIFVzZSBgRGF0YU1vZGVsYCBpbnN0ZWFkIHdoZW4gZXh0ZW5kaW5nLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkxhenlJbml0YCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gRGF0YSBQcm9wcyBkYXRhIHR5cGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+IHtcbiAgLy8ganVzdCB0byBtYWtlIHR5cGluZyB3b3JrIHByb3Blcmx5XG4gIFtwcm9wc1R5cGVTeW1ib2xdITogVFByb3BzXG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZCB3aGVuIHRoZXJlJ3MgdGhlIGZpcnN0IGNhbGwgdG8gYGZuKE0sIGRhdGEpYC5cbiAgICovXG4gIHByb3RlY3RlZCBvbkxhenlJbml0PygpOiB2b2lkXG5cbiAgLyoqXG4gICAqIERhdGEgcGFydCBvZiB0aGUgbW9kZWwsIHdoaWNoIGlzIG9ic2VydmFibGUgYW5kIHdpbGwgYmUgc2VyaWFsaXplZCBpbiBzbmFwc2hvdHMuXG4gICAqIFVzZSBpdCBpZiBvbmUgb2YgdGhlIGRhdGEgcHJvcGVydGllcyBtYXRjaGVzIG9uZSBvZiB0aGUgbW9kZWwgcHJvcGVydGllcy9mdW5jdGlvbnMuXG4gICAqIFRoaXMgYWxzbyBhbGxvd3MgYWNjZXNzIHRvIHRoZSBiYWNrZWQgdmFsdWVzIG9mIHRyYW5zZm9ybWVkIHByb3BlcnRpZXMuXG4gICAqL1xuICByZWFkb25seSAkITogTW9kZWxQcm9wc1RvRGF0YTxUUHJvcHM+XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgdHlwZSBjaGVjayBvdmVyIHRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogRm9yIHRoaXMgdG8gd29yayBhIGRhdGEgdHlwZSBoYXMgdG8gYmUgZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbW9kZWwgcHJvcGVydGllcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBgVHlwZUNoZWNrRXJyb3JgIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBlcnJvci5cbiAgICovXG4gIHR5cGVDaGVjaygpOiBUeXBlQ2hlY2tFcnJvciB8IG51bGwge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc0RhdGFNb2RlbERhdGE8dGhpcz4odGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpXG4gICAgcmV0dXJuIHR5cGVDaGVjayh0eXBlLCB0aGlzLiQgYXMgYW55KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBkYXRhIG1vZGVsLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YTogTW9kZWxQcm9wc1RvQ3JlYXRpb25EYXRhPFRQcm9wcz4gfCBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+XG4gICkge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJkYXRhIG1vZGVscyBjYW4gb25seSB3b3JrIG92ZXIgZGF0YSBvYmplY3RzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgeyBtb2RlbENsYXNzOiBfbW9kZWxDbGFzcyB9OiBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgPSBhcmd1bWVudHNbMV0gYXMgYW55XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IF9tb2RlbENsYXNzIVxuXG4gICAgdHlwZSBEYXRhID0gTW9kZWxQcm9wc1RvRGF0YTxUUHJvcHM+XG4gICAgbGV0IHR3ZWFrZWREYXRhOiBEYXRhXG4gICAgaWYgKGlzVHJlZU5vZGUoZGF0YSkpIHtcbiAgICAgIC8vIGluIHRoZW9yeSBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICB0d2Vha2VkRGF0YSA9IGRhdGEgYXMgYW55IGFzIERhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGFzcylcbiAgICAgIGlmICghbW9kZWxJbmZvKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYG5vIG1vZGVsIGluZm8gZm9yIGNsYXNzICR7bW9kZWxDbGFzcy5uYW1lfSBjb3VsZCBiZSBmb3VuZCAtIGRpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQG1vZGVsIGRlY29yYXRvcj9gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZWxQcm9wcyA9IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhtb2RlbENsYXNzKVxuXG4gICAgICBjb25zdCBpbml0aWFsRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpXG5cbiAgICAgIGNvbnN0IG1vZGVsUHJvcHNLZXlzID0gT2JqZWN0LmtleXMobW9kZWxQcm9wcylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kZWxQcm9wc0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IG1vZGVsUHJvcHNLZXlzW2ldXG4gICAgICAgIGNvbnN0IHByb3BEYXRhID0gbW9kZWxQcm9wc1trXVxuXG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IGluaXRpYWxEYXRhIVtrXVxuICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG5cbiAgICAgICAgLy8gYXBwbHkgdW50cmFuc2Zvcm0gKGlmIGFueSlcbiAgICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC50cmFuc2Zvcm0pIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgIG5ld1ZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLnRyYW5zZm9ybS51bnRyYW5zZm9ybShuZXdWYWx1ZSwgdGhpcywgaylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFwcGx5IGRlZmF1bHQgdmFsdWUgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4oKVxuICAgICAgICAgIH0gZWxzZSBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZSAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgIGluaXRpYWxEYXRhW2tdID0gbmV3VmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0d2Vha2VkRGF0YSA9IHRvVHJlZU5vZGUoaW5pdGlhbERhdGEgYXMgRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZXNGb3JNb2RlbENsYXNzID0gZ2V0T3JDcmVhdGUoXG4gICAgICBkYXRhTW9kZWxJbnN0YW5jZUNhY2hlLFxuICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICgpID0+IG5ldyBXZWFrTWFwKClcbiAgICApXG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc0Zvck1vZGVsQ2xhc3MuZ2V0KHR3ZWFrZWREYXRhKVxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuXG4gICAgaW5zdGFuY2VzRm9yTW9kZWxDbGFzcy5zZXQodHdlYWtlZERhdGEsIHRoaXMpXG5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbW9kZWxDbGFzcy5wcm90b3R5cGUpXG5cbiAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBhbnlcblxuICAgIC8vIGRlbGV0ZSB1bm5lY2Vzc2FyeSBwcm9wc1xuICAgIGRlbGV0ZSBzZWxmW3Byb3BzVHlwZVN5bWJvbF1cblxuICAgIGludGVybmFsTmV3RGF0YU1vZGVsKHRoaXMsIHR3ZWFrZWREYXRhIGFzIGFueSwge1xuICAgICAgbW9kZWxDbGFzcyxcbiAgICB9KVxuICB9XG5cbiAgdG9TdHJpbmcob3B0aW9ucz86IHsgd2l0aERhdGE/OiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSB7XG4gICAgICB3aXRoRGF0YTogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpXG5cbiAgICBjb25zdCBmaXJzdFBhcnQgPSBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IyR7bW9kZWxJbmZvIS5uYW1lfWBcblxuICAgIHJldHVybiBmaW5hbE9wdGlvbnMud2l0aERhdGFcbiAgICAgID8gYFske2ZpcnN0UGFydH0gJHtKU09OLnN0cmluZ2lmeShnZXRTbmFwc2hvdCh0aGlzKSl9XWBcbiAgICAgIDogYFske2ZpcnN0UGFydH1dYFxuICB9XG59XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgdHlwZSBCYXNlRGF0YU1vZGVsS2V5cyA9IGtleW9mIEFueURhdGFNb2RlbCB8IFwib25MYXp5SW5pdFwiXG5cbi8vIHRoZXNlIHByb3BzIHdpbGwgbmV2ZXIgYmUgaG9pc3RlZCB0byB0aGlzXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYmFzZURhdGFNb2RlbFByb3BOYW1lcyA9IG5ldyBTZXQ8QmFzZURhdGFNb2RlbEtleXM+KFtcIm9uTGF6eUluaXRcIiwgXCIkXCIsIFwidHlwZUNoZWNrXCJdKVxuXG4vKipcbiAqIEFueSBraW5kIG9mIGRhdGEgbW9kZWwgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW55RGF0YU1vZGVsIGV4dGVuZHMgQmFzZURhdGFNb2RlbDxhbnk+IHt9XG5cbi8qKlxuICogQSBkYXRhIG1vZGVsIGNsYXNzIGRlY2xhcmF0aW9uLCBtYWRlIG9mIGEgYmFzZSBtb2RlbCBhbmQgdGhlIG1vZGVsIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YU1vZGVsQ2xhc3NEZWNsYXJhdGlvbjxCYXNlTW9kZWxDbGFzcywgTW9kZWxJbnRlcmZhY2U+ID0gQmFzZU1vZGVsQ2xhc3MgJiB7XG4gICguLi5hcmdzOiBhbnlbXSk6IE1vZGVsSW50ZXJmYWNlXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IEJhc2VEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgZGF0YSBtb2RlbCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gbW9kZWxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFNb2RlbChtb2RlbDogdW5rbm93bik6IG1vZGVsIGlzIEFueURhdGFNb2RlbCB7XG4gIHJldHVybiBtb2RlbCBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBhY3R1YWxseSBhIGRhdGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcGFyYW0gYXJnTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNEYXRhTW9kZWwoXG4gIG1vZGVsOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcsXG4gIGN1c3RvbUVyck1zZyA9IFwibXVzdCBiZSBhIGRhdGEgbW9kZWwgaW5zdGFuY2VcIlxuKTogYXNzZXJ0cyBtb2RlbCBpcyBBbnlEYXRhTW9kZWwge1xuICBpZiAoIWlzRGF0YU1vZGVsKG1vZGVsKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gJHtjdXN0b21FcnJNc2d9YClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhTW9kZWxDbGFzcyhtb2RlbENsYXNzOiB1bmtub3duKTogbW9kZWxDbGFzcyBpcyBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4ge1xuICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKG1vZGVsQ2xhc3MgIT09IEJhc2VEYXRhTW9kZWwgJiYgIShtb2RlbENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNEYXRhTW9kZWxDbGFzcyhcbiAgbW9kZWxDbGFzczogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nXG4pOiBhc3NlcnRzIG1vZGVsQ2xhc3MgaXMgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+IHtcbiAgaWYgKHR5cGVvZiBtb2RlbENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBjbGFzc2ApXG4gIH1cblxuICBpZiAobW9kZWxDbGFzcyAhPT0gQmFzZURhdGFNb2RlbCAmJiAhKG1vZGVsQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgQmFzZURhdGFNb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgZXh0ZW5kIERhdGFNb2RlbGApXG4gIH1cbn1cbiIsImltcG9ydCB7IGdldEdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZGcm96ZW4gfSBmcm9tIFwiLi4vc25hcHNob3RcIlxuaW1wb3J0IHsgdHdlYWsgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzUGxhaW5PYmplY3QsIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBTaG91bGQgZnJlZXplIGFuZCBwbGFpbiBqc29uIGNoZWNrcyBiZSBkb25lIHdoZW4gY3JlYXRpbmcgdGhlIGZyb3plbiBvYmplY3Q/XG4gKi9cbmV4cG9ydCBlbnVtIEZyb3plbkNoZWNrTW9kZSB7XG4gIC8qKiBPbmx5IHdoZW4gaW4gZGV2IG1vZGUgKi9cbiAgRGV2TW9kZU9ubHkgPSBcImRldk1vZGVPbmx5XCIsXG4gIC8qKiBBbHdheXMgKi9cbiAgT24gPSBcIm9uXCIsXG4gIC8qKiBOZXZlciAqL1xuICBPZmYgPSBcIm9mZlwiLFxufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IGZyb3plbktleSA9IFwiJGZyb3plblwiXG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGNvbnRhaW5zIGZyb3plbiBkYXRhLlxuICogVXNlIGBmcm96ZW5gIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBEYXRhIHR5cGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGcm96ZW48VD4ge1xuICAvKipcbiAgICogRnJvemVuIGRhdGEsIGRlZXBseSBpbW11dGFibGUuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBUXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRnJvemVuLlxuICAgKiBEbyBub3QgdXNlIGRpcmVjdGx5LCB1c2UgYGZyb3plbmAgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFUb0ZyZWV6ZVxuICAgKiBAcGFyYW0gY2hlY2tNb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhVG9GcmVlemU6IFQsIGNoZWNrTW9kZTogRnJvemVuQ2hlY2tNb2RlID0gRnJvemVuQ2hlY2tNb2RlLkRldk1vZGVPbmx5KSB7XG4gICAgY29uc3QgY2hlY2sgPVxuICAgICAgY2hlY2tNb2RlID09PSBGcm96ZW5DaGVja01vZGUuT24gfHwgKGNoZWNrTW9kZSA9PT0gRnJvemVuQ2hlY2tNb2RlLkRldk1vZGVPbmx5ICYmIGluRGV2TW9kZSgpKVxuICAgIGlmIChjaGVjaykge1xuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUoZGF0YVRvRnJlZXplKVxuICAgIH1cblxuICAgIHRoaXMuZGF0YSA9IGRhdGFUb0ZyZWV6ZVxuXG4gICAgaWYgKGNoZWNrKSB7XG4gICAgICBPYmplY3QuZnJlZXplKHRoaXMuZGF0YSlcbiAgICB9XG5cbiAgICB0d2Vhayh0aGlzLCB1bmRlZmluZWQpXG4gIH1cbn1cblxuLyoqXG4gKiBNYXJrcyBzb21lIGRhdGEgYXMgZnJvemVuLiBGcm96ZW4gZGF0YSBiZWNvbWVzIGltbXV0YWJsZSAoYXQgbGVhc3QgaW4gZGV2IG1vZGUpLCBhbmQgaXMgbm90IGVuaGFuY2VkXG4gKiB3aXRoIGNhcGFiaWxpdGllcyBzdWNoIGFzIGdldHRpbmcgdGhlIHBhcmVudCBvZiB0aGUgb2JqZWN0cyAoZXhjZXB0IGZvciB0aGUgcm9vdCBvYmplY3QpLCBpdCBpcyBub3RcbiAqIG1hZGUgZGVlcGx5IG9ic2VydmFibGUgKHRob3VnaCB0aGUgcm9vdCBvYmplY3QgaXMgb2JzZXJ2YWJsZSBieSByZWZlcmVuY2UpLCBldGMuXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBtZWFucyBpdCB3aWxsIGJlIG11Y2ggZmFzdGVyIHRvIGNyZWF0ZS9hY2Nlc3MuIFVzZSB0aGlzIGZvciBiaWcgZGF0YSBwaWVjZXNcbiAqIHRoYXQgYXJlIHVubGlrZWx5IHRvIGNoYW5nZSB1bmxlc3MgYWxsIG9mIHRoZW0gY2hhbmdlIChmb3IgZXhhbXBsZSBsaXN0cyBvZiBwb2ludHMgZm9yIGEgcG9seWdvbiwgZXRjKS5cbiAqXG4gKiBOb3RlIHRoYXQgZGF0YSBwYXNzZWQgdG8gZnJvemVuIG11c3QgYmUgc2VyaWFsaXphYmxlIHRvIEpTT04sIHRoaXMgaXM6XG4gKiAtIHByaW1pdGl2ZSwgcGxhaW4gb2JqZWN0LCBvciBhcnJheVxuICogLSB3aXRob3V0IGN5Y2xlc1xuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcGFyYW0gY2hlY2tNb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm96ZW48VD4oXG4gIGRhdGE6IFQsXG4gIGNoZWNrTW9kZTogRnJvemVuQ2hlY2tNb2RlID0gRnJvemVuQ2hlY2tNb2RlLkRldk1vZGVPbmx5XG4pOiBGcm96ZW48VD4ge1xuICByZXR1cm4gbmV3IEZyb3plbjxUPihkYXRhLCBjaGVja01vZGUpXG59XG5cbmZ1bmN0aW9uIGNoZWNrRGF0YUlzU2VyaWFsaXphYmxlQW5kRnJlZXplKGRhdGE6IGFueSkge1xuICAvLyBUT0RPOiBkZXRlY3QgY3ljbGVzIGFuZCB0aHJvdyBpZiBwcmVzZW50P1xuXG4gIC8vIHByaW1pdGl2ZXMgYXJlIG9rXG4gIGlmIChpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBjb25zdCBhcnJMZW4gPSBkYXRhLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHYgPSBkYXRhW2ldXG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkICYmICFnZXRHbG9iYWxDb25maWcoKS5hbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHMpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBcInVuZGVmaW5lZCBpcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhcnJheXMgc2luY2UgaXQgaXMgbm90IHNlcmlhbGl6YWJsZSBpbiBKU09OLCBjb25zaWRlciB1c2luZyBudWxsIGluc3RlYWRcIlxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjaGVja0RhdGFJc1NlcmlhbGl6YWJsZUFuZEZyZWV6ZSh2KVxuICAgIH1cbiAgICBPYmplY3QuZnJlZXplKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgICBjb25zdCBkYXRhS2V5c0xlbiA9IGRhdGFLZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUtleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGRhdGFLZXlzW2ldXG4gICAgICBjb25zdCB2ID0gZGF0YVtrXVxuXG4gICAgICBjaGVja0RhdGFJc1NlcmlhbGl6YWJsZUFuZEZyZWV6ZShrKVxuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUodilcbiAgICB9XG4gICAgT2JqZWN0LmZyZWV6ZShkYXRhKVxuICAgIHJldHVyblxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShgZnJvemVuIGRhdGEgbXVzdCBiZSBwbGFpbmx5IHNlcmlhbGl6YWJsZSB0byBKU09OLCBidXQgJHtkYXRhfSBpcyBub3RgKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIENoZWNrcyBpZiBhbiBzbmFwc2hvdCBpcyBhbiBzbmFwc2hvdCBmb3IgYSBmcm96ZW4gZGF0YS5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3RcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb3plblNuYXBzaG90KHNuYXBzaG90OiB1bmtub3duKTogc25hcHNob3QgaXMgU25hcHNob3RJbk9mRnJvemVuPEZyb3plbjxhbnk+PiB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHNuYXBzaG90KSAmJiBmcm96ZW5LZXkgaW4gc25hcHNob3Rcbn1cbiIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBlbnVtIFR3ZWFrZXJQcmlvcml0eSB7XG4gIE1vZGVsLFxuICBBcnJheSxcbiAgUGxhaW5PYmplY3QsXG4gIEZyb3plbixcbn1cbiIsImltcG9ydCB7IEZyb3plbiwgZnJvemVuS2V5IH0gZnJvbSBcIi4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHR5cGUgeyBQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IHNldFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvc2V0UGFyZW50XCJcbmltcG9ydCB7IHNldE5ld0ludGVybmFsU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxuaW1wb3J0IHsgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyVHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrXCJcbmltcG9ydCB7IFR3ZWFrZXJQcmlvcml0eSB9IGZyb20gXCIuL1R3ZWFrZXJQcmlvcml0eVwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d2Vha0Zyb3plbjxUIGV4dGVuZHMgRnJvemVuPGFueT4+KFxuICBmcm96ZW5PYmo6IFQsXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuKTogVCB7XG4gIHR3ZWFrZWRPYmplY3RzLnNldChmcm96ZW5PYmosIHVuZGVmaW5lZClcbiAgc2V0UGFyZW50KHtcbiAgICB2YWx1ZTogZnJvemVuT2JqLFxuICAgIHBhcmVudFBhdGgsXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxuICAgIC8vIGEgZnJvemVuIGlzIG5vdCBhIHZhbHVlLXR5cGVcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXG4gIH0pXG5cbiAgLy8gd2UgRE9OJ1Qgd2FudCBkYXRhIHByb3hpZmllZCwgYnV0IHRoZSBzbmFwc2hvdCBpcyB0aGUgZGF0YSBpdHNlbGZcbiAgc2V0TmV3SW50ZXJuYWxTbmFwc2hvdChmcm96ZW5PYmosIHsgW2Zyb3plbktleV06IHRydWUsIGRhdGE6IGZyb3plbk9iai5kYXRhIH0sIHVuZGVmaW5lZCwgdHJ1ZSlcblxuICByZXR1cm4gZnJvemVuT2JqXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZyb3plblR3ZWFrZXIoKSB7XG4gIHJlZ2lzdGVyVHdlYWtlcihUd2Vha2VyUHJpb3JpdHkuRnJvemVuLCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGcm96ZW4pIHtcbiAgICAgIHJldHVybiB0d2Vha0Zyb3plbih2YWx1ZSwgcGFyZW50UGF0aClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGgsIFBhcmVudFBhdGggfSBmcm9tIFwiLi9wYXRoXCJcbmltcG9ydCB0eXBlIHsgUGF0aCwgV3JpdGFibGVQYXRoIH0gZnJvbSBcIi4vcGF0aFR5cGVzXCJcblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB0aGUgcGFyZW50cyAoZnJvbSB0aGUgbmVhcmVzdCB1bnRpbCB0aGUgcm9vdClcbiAqIHVudGlsIG9uZSBvZiB0aGVtIG1hdGNoZXMgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAqIElmIHRoZSBwcmVkaWNhdGUgaXMgbWF0Y2hlZCBpdCB3aWxsIHJldHVybiB0aGUgZm91bmQgbm9kZS5cbiAqIElmIG5vbmUgaXMgZm91bmQgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQYXJlbnQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gY2hpbGQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biBmb3IgZXZlcnkgcGFyZW50IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBmcm9tIGltbWVkaWF0ZSBwYXJlbnQgdG8gdGhlIHJvb3QuXG4gKiBAcGFyYW0gbWF4RGVwdGggTWF4IGRlcHRoLCBvciAwIGZvciBpbmZpbml0ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGFyZW50PFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICBjaGlsZDogb2JqZWN0LFxuICBwcmVkaWNhdGU6IChwYXJlbnROb2RlOiBvYmplY3QpID0+IGJvb2xlYW4sXG4gIG1heERlcHRoID0gMFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZvdW5kUGFyZW50UGF0aCA9IGZpbmRQYXJlbnRQYXRoKGNoaWxkLCBwcmVkaWNhdGUsIG1heERlcHRoKVxuICByZXR1cm4gZm91bmRQYXJlbnRQYXRoID8gZm91bmRQYXJlbnRQYXRoLnBhcmVudCA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBgZmluZFBhcmVudFBhdGhgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUGFyZW50UGF0aDxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBGb3VuZCBwYXJlbnQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50OiBUXG5cbiAgLyoqXG4gICAqIFBhdGggZnJvbSB0aGUgZm91bmQgcGFyZW50IHRvIHRoZSBjaGlsZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IFBhdGhcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB0aGUgcGFyZW50cyAoZnJvbSB0aGUgbmVhcmVzdCB1bnRpbCB0aGUgcm9vdClcbiAqIHVudGlsIG9uZSBvZiB0aGVtIG1hdGNoZXMgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAqIElmIHRoZSBwcmVkaWNhdGUgaXMgbWF0Y2hlZCBpdCB3aWxsIHJldHVybiB0aGUgZm91bmQgbm9kZSBwbHVzIHRoZVxuICogcGF0aCB0byBnZXQgZnJvbSB0aGUgcGFyZW50IHRvIHRoZSBjaGlsZC5cbiAqIElmIG5vbmUgaXMgZm91bmQgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQYXJlbnQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gY2hpbGQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biBmb3IgZXZlcnkgcGFyZW50IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBmcm9tIGltbWVkaWF0ZSBwYXJlbnQgdG8gdGhlIHJvb3QuXG4gKiBAcGFyYW0gbWF4RGVwdGggTWF4IGRlcHRoLCBvciAwIGZvciBpbmZpbml0ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGFyZW50UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgY2hpbGQ6IG9iamVjdCxcbiAgcHJlZGljYXRlOiAocGFyZW50Tm9kZTogb2JqZWN0KSA9PiBib29sZWFuLFxuICBtYXhEZXB0aCA9IDBcbik6IEZvdW5kUGFyZW50UGF0aDxUPiB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QoY2hpbGQsIFwiY2hpbGRcIilcblxuICBjb25zdCBwYXRoOiBXcml0YWJsZVBhdGggPSBbXVxuXG4gIGxldCBjdXJyZW50OiBhbnkgPSBjaGlsZFxuICBsZXQgZGVwdGggPSAwXG5cbiAgbGV0IHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuICB3aGlsZSAoKHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aChjdXJyZW50KSkpIHtcbiAgICBwYXRoLnVuc2hpZnQocGFyZW50UGF0aC5wYXRoKVxuICAgIGN1cnJlbnQgPSBwYXJlbnRQYXRoLnBhcmVudFxuICAgIGlmIChwcmVkaWNhdGUoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmVudDogY3VycmVudCxcbiAgICAgICAgcGF0aCxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZXB0aCsrXG4gICAgaWYgKG1heERlcHRoID4gMCAmJiBkZXB0aCA9PT0gbWF4RGVwdGgpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldERlZXBPYmplY3RDaGlsZHJlbiwgZ2V0T2JqZWN0Q2hpbGRyZW4gfSBmcm9tIFwiLi9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuXG4vKipcbiAqIFJldHVybnMgYWxsIHRoZSBjaGlsZHJlbiBvYmplY3RzICh0aGlzIGlzLCBleGNsdWRpbmcgcHJpbWl0aXZlcykgb2YgYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBub2RlIE9iamVjdCB0byBnZXQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gZnJvbS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gQW4gb3B0aW9uYWwgb2JqZWN0IHdpdGggdGhlIGBkZWVwYCBvcHRpb24gKGRlZmF1bHRzIHRvIGZhbHNlKSB0byB0cnVlIHRvIGdldFxuICogdGhlIGNoaWxkcmVuIGRlZXBseSBvciBmYWxzZSB0byBnZXQgdGhlbSBzaGFsbG93bHkuXG4gKiBAcmV0dXJucyBBIHJlYWRvbmx5IG9ic2VydmFibGUgc2V0IHdpdGggdGhlIGNoaWxkcmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRyZW5PYmplY3RzKFxuICBub2RlOiBvYmplY3QsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVlcD86IGJvb2xlYW5cbiAgfVxuKTogUmVhZG9ubHlTZXQ8b2JqZWN0PiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmRlZXApIHtcbiAgICByZXR1cm4gZ2V0T2JqZWN0Q2hpbGRyZW4obm9kZSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0RGVlcE9iamVjdENoaWxkcmVuKG5vZGUpLmRlZXBcbiAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0Q2hpbGRyZW5PYmplY3RzIH0gZnJvbSBcIi4vZ2V0Q2hpbGRyZW5PYmplY3RzXCJcblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCBjaGlsZHJlbiBhbmQgY29sbGVjdHMgdGhlbSBpbiBhIHNldCBpZiB0aGVcbiAqIGdpdmVuIHByZWRpY2F0ZSBtYXRjaGVzLlxuICpcbiAqIEBwYXJhbSByb290IFJvb3Qgb2JqZWN0IHRvIGdldCB0aGUgbWF0Y2hpbmcgY2hpbGRyZW4gZnJvbS5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biBmb3IgZXZlcnkgY2hpbGQgb2YgdGhlIHJvb3Qgb2JqZWN0LlxuICogQHBhcmFtIFtvcHRpb25zXSBBbiBvcHRpb25hbCBvYmplY3Qgd2l0aCB0aGUgYGRlZXBgIG9wdGlvbiAoZGVmYXVsdHMgdG8gYGZhbHNlYCkgc2V0IHRvIGB0cnVlYCB0b1xuICogZ2V0IHRoZSBjaGlsZHJlbiBkZWVwbHkgb3IgYGZhbHNlYCB0byBnZXQgdGhlbSBzaGFsbG93bHkuXG4gKiBAcmV0dXJucyBBIHJlYWRvbmx5IG9ic2VydmFibGUgc2V0IHdpdGggdGhlIG1hdGNoaW5nIGNoaWxkcmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENoaWxkcmVuPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICByb290OiBvYmplY3QsXG4gIHByZWRpY2F0ZTogKG5vZGU6IG9iamVjdCkgPT4gYm9vbGVhbixcbiAgb3B0aW9ucz86IHtcbiAgICBkZWVwPzogYm9vbGVhblxuICB9XG4pOiBSZWFkb25seVNldDxUPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5PYmplY3RzKHJvb3QsIG9wdGlvbnMpXG5cbiAgY29uc3Qgc2V0ID0gbmV3IFNldDxhbnk+KClcblxuICBjb25zdCBpdGVyID0gY2hpbGRyZW4udmFsdWVzKClcbiAgbGV0IGN1ciA9IGl0ZXIubmV4dCgpXG4gIHdoaWxlICghY3VyLmRvbmUpIHtcbiAgICBpZiAocHJlZGljYXRlKGN1ci52YWx1ZSkpIHtcbiAgICAgIHNldC5hZGQoY3VyLnZhbHVlKVxuICAgIH1cbiAgICBjdXIgPSBpdGVyLm5leHQoKVxuICB9XG5cbiAgcmV0dXJuIHNldFxufVxuIiwiaW1wb3J0IHsgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldENoaWxkcmVuT2JqZWN0cyB9IGZyb20gXCIuL2dldENoaWxkcmVuT2JqZWN0c1wiXG5cbi8qKlxuICogUnVucyBhIGNhbGxiYWNrIGV2ZXJ5dGltZSBhIG5ldyBvYmplY3QgaXMgYXR0YWNoZWQgdG8gYSBnaXZlbiBub2RlLlxuICogVGhlIGNhbGxiYWNrIGNhbiBvcHRpb25hbGx5IHJldHVybiBhIGRpc3Bvc2VyIHdoaWNoIHdpbGwgYmUgcnVuIHdoZW4gdGhlIGNoaWxkIGlzIGRldGFjaGVkLlxuICpcbiAqIFRoZSBvcHRpb25hbCBvcHRpb25zIHBhcmFtZXRlciBhY2NlcHRzIGFuZCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gKiAtIGBkZWVwOiBib29sZWFuYCAoZGVmYXVsdDogYGZhbHNlYCkgLSB0cnVlIGlmIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgcnVuIGZvciBhbGwgY2hpbGRyZW4gZGVlcGx5XG4gKiBvciBmYWxzZSBpZiBpdCBpdCBzaG91bGQgb25seSBydW4gZm9yIHNoYWxsb3cgY2hpbGRyZW4uXG4gKiAtIGBmaXJlRm9yQ3VycmVudENoaWxkcmVuOiBib29sZWFuYCAoZGVmYXVsdDogYHRydWVgKSAtIHRydWUgaWYgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBpbW1lZGlhdGVseVxuICogY2FsbGVkIGZvciBjdXJyZW50bHkgYXR0YWNoZWQgY2hpbGRyZW4sIGZhbHNlIGlmIG9ubHkgZm9yIGZ1dHVyZSBhdHRhY2htZW50cy5cbiAqXG4gKiBSZXR1cm5zIGEgZGlzcG9zZXIsIHdoaWNoIGhhcyBhIGJvb2xlYW4gcGFyYW1ldGVyIHdoaWNoIHNob3VsZCBiZSB0cnVlIGlmIHBlbmRpbmcgZGV0YWNobWVudFxuICogY2FsbGJhY2tzIHNob3VsZCBiZSBydW4gb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBvYmplY3Qgd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIHRyYWNrZWQuXG4gKiBAcGFyYW0gZm4gQ2FsbGJhY2sgY2FsbGVkIHdoZW4gYSBjaGlsZCBpcyBhdHRhY2hlZCB0byB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBbb3B0aW9uc11cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkNoaWxkQXR0YWNoZWRUbyhcbiAgdGFyZ2V0OiAoKSA9PiBvYmplY3QsXG4gIGZuOiAoY2hpbGQ6IG9iamVjdCkgPT4gKCgpID0+IHZvaWQpIHwgdm9pZCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWVwPzogYm9vbGVhblxuICAgIGZpcmVGb3JDdXJyZW50Q2hpbGRyZW4/OiBib29sZWFuXG4gIH1cbik6IChydW5EZXRhY2hEaXNwb3NlcnM6IGJvb2xlYW4pID0+IHZvaWQge1xuICBhc3NlcnRJc0Z1bmN0aW9uKHRhcmdldCwgXCJ0YXJnZXRcIilcbiAgYXNzZXJ0SXNGdW5jdGlvbihmbiwgXCJmblwiKVxuXG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgZGVlcDogZmFsc2UsXG4gICAgcnVuRm9yQ3VycmVudENoaWxkcmVuOiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cblxuICBjb25zdCBkZXRhY2hEaXNwb3NlcnMgPSBuZXcgV2Vha01hcDxvYmplY3QsICgpID0+IHZvaWQ+KClcblxuICBjb25zdCBydW5EZXRhY2hEaXNwb3NlciA9IChuOiBvYmplY3QpID0+IHtcbiAgICBjb25zdCBkZXRhY2hEaXNwb3NlciA9IGRldGFjaERpc3Bvc2Vycy5nZXQobilcbiAgICBpZiAoZGV0YWNoRGlzcG9zZXIpIHtcbiAgICAgIGRldGFjaERpc3Bvc2Vycy5kZWxldGUobilcbiAgICAgIGRldGFjaERpc3Bvc2VyKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhZGREZXRhY2hEaXNwb3NlciA9IChuOiBvYmplY3QsIGRpc3Bvc2VyOiAoKCkgPT4gdm9pZCkgfCB2b2lkKSA9PiB7XG4gICAgaWYgKGRpc3Bvc2VyKSB7XG4gICAgICBkZXRhY2hEaXNwb3NlcnMuc2V0KG4sIGRpc3Bvc2VyKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdldENoaWxkcmVuT2JqZWN0T3B0cyA9IHsgZGVlcDogb3B0cy5kZWVwIH1cbiAgY29uc3QgZ2V0Q3VycmVudENoaWxkcmVuID0gKCkgPT4ge1xuICAgIGxldCB0ID0gdGFyZ2V0KClcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KHQsIFwidGFyZ2V0KClcIilcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5PYmplY3RzKHQsIGdldENoaWxkcmVuT2JqZWN0T3B0cylcblxuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8b2JqZWN0PigpXG5cbiAgICBjb25zdCBpdGVyID0gY2hpbGRyZW4udmFsdWVzKClcbiAgICBsZXQgY3VyID0gaXRlci5uZXh0KClcbiAgICB3aGlsZSAoIWN1ci5kb25lKSB7XG4gICAgICBzZXQuYWRkKGN1ci52YWx1ZSlcbiAgICAgIGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNldFxuICB9XG5cbiAgY29uc3QgY3VycmVudENoaWxkcmVuID0gb3B0cy5ydW5Gb3JDdXJyZW50Q2hpbGRyZW4gPyBuZXcgU2V0PG9iamVjdD4oKSA6IGdldEN1cnJlbnRDaGlsZHJlbigpXG5cbiAgY29uc3QgZGlzcG9zZXIgPSByZWFjdGlvbihcbiAgICAoKSA9PiBnZXRDdXJyZW50Q2hpbGRyZW4oKSxcbiAgICAobmV3Q2hpbGRyZW4pID0+IHtcbiAgICAgIGNvbnN0IGRpc3Bvc2Vyc1RvUnVuOiBvYmplY3RbXSA9IFtdXG5cbiAgICAgIC8vIGZpbmQgZGVhZFxuICAgICAgY29uc3QgY3VycmVudENoaWxkcmVuSXRlciA9IGN1cnJlbnRDaGlsZHJlbi52YWx1ZXMoKVxuICAgICAgbGV0IGN1cnJlbnRDaGlsZHJlbkN1ciA9IGN1cnJlbnRDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB3aGlsZSAoIWN1cnJlbnRDaGlsZHJlbkN1ci5kb25lKSB7XG4gICAgICAgIGNvbnN0IG4gPSBjdXJyZW50Q2hpbGRyZW5DdXIudmFsdWVcbiAgICAgICAgaWYgKCFuZXdDaGlsZHJlbi5oYXMobikpIHtcbiAgICAgICAgICBjdXJyZW50Q2hpbGRyZW4uZGVsZXRlKG4pXG5cbiAgICAgICAgICAvLyB3ZSBzaG91bGQgcnVuIGl0IGluIGludmVyc2Ugb3JkZXJcbiAgICAgICAgICBkaXNwb3NlcnNUb1J1bi5wdXNoKG4pXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50Q2hpbGRyZW5DdXIgPSBjdXJyZW50Q2hpbGRyZW5JdGVyLm5leHQoKVxuICAgICAgfVxuXG4gICAgICBpZiAoZGlzcG9zZXJzVG9SdW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gZGlzcG9zZXJzVG9SdW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBydW5EZXRhY2hEaXNwb3NlcihkaXNwb3NlcnNUb1J1bltpXSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIG5ld1xuICAgICAgY29uc3QgbmV3Q2hpbGRyZW5JdGVyID0gbmV3Q2hpbGRyZW4udmFsdWVzKClcbiAgICAgIGxldCBuZXdDaGlsZHJlbkN1ciA9IG5ld0NoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIHdoaWxlICghbmV3Q2hpbGRyZW5DdXIuZG9uZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3Q2hpbGRyZW5DdXIudmFsdWVcbiAgICAgICAgaWYgKCFjdXJyZW50Q2hpbGRyZW4uaGFzKG4pKSB7XG4gICAgICAgICAgY3VycmVudENoaWxkcmVuLmFkZChuKVxuXG4gICAgICAgICAgYWRkRGV0YWNoRGlzcG9zZXIobiwgZm4obikpXG4gICAgICAgIH1cblxuICAgICAgICBuZXdDaGlsZHJlbkN1ciA9IG5ld0NoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcbiAgICB9XG4gIClcblxuICByZXR1cm4gKHJ1bkRldGFjaERpc3Bvc2VyczogYm9vbGVhbikgPT4ge1xuICAgIGRpc3Bvc2VyKClcblxuICAgIGlmIChydW5EZXRhY2hEaXNwb3NlcnMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGlsZHJlbkl0ZXIgPSBjdXJyZW50Q2hpbGRyZW4udmFsdWVzKClcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRyZW5DdXIgPSBjdXJyZW50Q2hpbGRyZW5JdGVyLm5leHQoKVxuICAgICAgd2hpbGUgKCFjdXJyZW50Q2hpbGRyZW5DdXIuZG9uZSkge1xuICAgICAgICBjb25zdCBuID0gY3VycmVudENoaWxkcmVuQ3VyLnZhbHVlXG4gICAgICAgIHJ1bkRldGFjaERpc3Bvc2VyKG4pXG5cbiAgICAgICAgY3VycmVudENoaWxkcmVuQ3VyID0gY3VycmVudENoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY3VycmVudENoaWxkcmVuLmNsZWFyKClcbiAgfVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZ2V0RGVlcE9iamVjdENoaWxkcmVuIH0gZnJvbSBcIi4vY29yZU9iamVjdENoaWxkcmVuXCJcblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSB0YXJnZXQgaXMgYSBcImNoaWxkXCIgb2YgdGhlIHRyZWUgb2YgdGhlIGdpdmVuIFwicGFyZW50XCIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBjaGlsZCBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHBhcmVudCBQYXJlbnQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRPZlBhcmVudChjaGlsZDogb2JqZWN0LCBwYXJlbnQ6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KGNoaWxkLCBcImNoaWxkXCIpXG4gIGFzc2VydFR3ZWFrZWRPYmplY3QocGFyZW50LCBcInBhcmVudFwiKVxuXG4gIHJldHVybiBnZXREZWVwT2JqZWN0Q2hpbGRyZW4ocGFyZW50KS5kZWVwLmhhcyhjaGlsZClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSB0YXJnZXQgaXMgYSBcInBhcmVudFwiIHRoYXQgaGFzIGluIGl0cyB0cmVlIHRoZSBnaXZlbiBcImNoaWxkXCIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwYXJlbnQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBjaGlsZCBDaGlsZCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJlbnRPZkNoaWxkKHBhcmVudDogb2JqZWN0LCBjaGlsZDogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0NoaWxkT2ZQYXJlbnQoY2hpbGQsIHBhcmVudClcbn1cbiIsImxldCB0eXBlQ2hlY2tpbmdBbGxvd2VkID0gdHJ1ZVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dFR5cGVDaGVja2luZyhmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBsZXQgb2xkVHlwZUNoZWNraW5nQWxsb3dlZCA9IHR5cGVDaGVja2luZ0FsbG93ZWRcbiAgdHlwZUNoZWNraW5nQWxsb3dlZCA9IGZhbHNlXG5cbiAgdHJ5IHtcbiAgICBmbigpXG4gIH0gZmluYWxseSB7XG4gICAgdHlwZUNoZWNraW5nQWxsb3dlZCA9IG9sZFR5cGVDaGVja2luZ0FsbG93ZWRcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlQ2hlY2tpbmdBbGxvd2VkKCkge1xuICByZXR1cm4gdHlwZUNoZWNraW5nQWxsb3dlZFxufVxuIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGVudW0gU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkge1xuICBBcnJheSxcbiAgRnJvemVuLFxuICBNb2RlbCxcbiAgUGxhaW5PYmplY3QsXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuLi90d2Vha2VyL3R5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyB3aXRob3V0VHlwZUNoZWNraW5nIH0gZnJvbSBcIi4uL3R3ZWFrZXIvd2l0aG91dFR5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgZGV0YWNoSWZOZWVkZWQsIHJlY29uY2lsZVNuYXBzaG90LCByZWdpc3RlclJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVTbmFwc2hvdFwiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZk9iamVjdCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIHJlY29uY2lsZUFycmF5U25hcHNob3QoXG4gIHZhbHVlOiBhbnksXG4gIHNuOiBTbmFwc2hvdEluT2ZPYmplY3Q8YW55W10+LFxuICBtb2RlbFBvb2w6IE1vZGVsUG9vbFxuKTogYW55W10ge1xuICBpZiAoIWlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICByZXR1cm4gZnJvbVNuYXBzaG90KHNuKVxuICB9XG5cbiAgY29uc3Qgc25hcHNob3RCZWZvcmVDaGFuZ2VzID0gZ2V0U25hcHNob3QodmFsdWUpXG5cbiAgd2l0aG91dFR5cGVDaGVja2luZygoKSA9PiB7XG4gICAgLy8gcmVtb3ZlIGV4Y2VzcyBpdGVtc1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBzbi5sZW5ndGgpIHtcbiAgICAgIHZhbHVlLnNwbGljZShzbi5sZW5ndGgsIHZhbHVlLmxlbmd0aCAtIHNuLmxlbmd0aClcbiAgICB9XG5cbiAgICAvLyByZWNvbmNpbGUgcHJlc2VudCBpdGVtc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdmFsdWVbaV1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3Qob2xkVmFsdWUsIHNuW2ldLCBtb2RlbFBvb2wsIHZhbHVlKVxuXG4gICAgICBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZSwgb2xkVmFsdWUsIG1vZGVsUG9vbClcblxuICAgICAgc2V0KHZhbHVlLCBpLCBuZXdWYWx1ZSlcbiAgICB9XG5cbiAgICAvLyBhZGQgZXhjZXNzIGl0ZW1zXG4gICAgZm9yIChsZXQgaSA9IHZhbHVlLmxlbmd0aDsgaSA8IHNuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZS5wdXNoKHJlY29uY2lsZVNuYXBzaG90KHVuZGVmaW5lZCwgc25baV0sIG1vZGVsUG9vbCwgdmFsdWUpKVxuICAgIH1cbiAgfSlcblxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSh2YWx1ZSwgdW5kZWZpbmVkLCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMpXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFycmF5U25hcHNob3RSZWNvbmNpbGVyKCkge1xuICByZWdpc3RlclJlY29uY2lsZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuQXJyYXksICh2YWx1ZSwgc24sIG1vZGVsUG9vbCkgPT4ge1xuICAgIGlmIChpc0FycmF5KHNuKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZUFycmF5U25hcHNob3QodmFsdWUsIHNuLCBtb2RlbFBvb2wpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IEZyb3plbiwgZnJvemVuLCBpc0Zyb3plblNuYXBzaG90IH0gZnJvbSBcIi4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHsgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZGcm96ZW4gfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiByZWNvbmNpbGVGcm96ZW5TbmFwc2hvdCh2YWx1ZTogYW55LCBzbjogU25hcHNob3RJbk9mRnJvemVuPEZyb3plbjxhbnk+Pik6IEZyb3plbjxhbnk+IHtcbiAgLy8gcmVjb25jaWxpYXRpb24gaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgdGFyZ2V0IGlzIGEgRnJvemVuIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgZGF0YSAoYnkgcmVmKVxuICAvLyBpbiB0aGVvcnkgd2UgY291bGQgY29tcGFyZSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBib3RoIGRhdGFzIG9yIGRvIGEgZGVlcCBjb21wYXJpc29uLCBidXQgdGhhdCdkIGJlIHRvbyBzbG93XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZyb3plbiAmJiB2YWx1ZS5kYXRhID09PSBzbi5kYXRhKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgcmV0dXJuIGZyb3plbihzbi5kYXRhKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm96ZW5TbmFwc2hvdFJlY29uY2lsZXIoKSB7XG4gIHJlZ2lzdGVyUmVjb25jaWxlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5Gcm96ZW4sICh2YWx1ZSwgc24pID0+IHtcbiAgICBpZiAoaXNGcm96ZW5TbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVGcm96ZW5TbmFwc2hvdCh2YWx1ZSwgc24pXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuICB2YXIgZW52SGFzQmlnSW50NjRBcnJheSA9IHR5cGVvZiBCaWdJbnQ2NEFycmF5ICE9PSAndW5kZWZpbmVkJztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgaWYgKChhIGluc3RhbmNlb2YgTWFwKSAmJiAoYiBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgICAgIGlmICghZXF1YWwoaVsxXSwgYi5nZXQoaVswXSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoKGEgaW5zdGFuY2VvZiBTZXQpICYmIChiIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgICAgIGlmICghYi5oYXMoaVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghZXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB0cnVlIGlmIGJvdGggTmFOLCBmYWxzZSBvdGhlcndpc2VcbiAgcmV0dXJuIGEhPT1hICYmIGIhPT1iO1xufTtcbiIsImltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbElkS2V5LCBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCwgaXNNb2RlbFNuYXBzaG90IH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGRhdGFPYmplY3RQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHtcbiAgZ2V0RGVlcE9iamVjdENoaWxkcmVuLFxuICByZWdpc3RlckRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbixcbn0gZnJvbSBcIi4uL3BhcmVudC9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuXG5mdW5jdGlvbiBieU1vZGVsVHlwZUFuZElkS2V5KG1vZGVsVHlwZTogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG1vZGVsVHlwZSArIFwiIFwiICsgbW9kZWxJZFxufVxuXG5leHBvcnQgY2xhc3MgTW9kZWxQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBSZWFkb25seU1hcDxzdHJpbmcsIEFueU1vZGVsPlxuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IG9iamVjdCkge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgdGhlIHN1Yi1kYXRhICQgb2JqZWN0XG4gICAgcm9vdCA9IGRhdGFPYmplY3RQYXJlbnQuZ2V0KHJvb3QpID8/IHJvb3RcblxuICAgIHRoaXMucG9vbCA9IGdldERlZXBDaGlsZHJlbk1vZGVscyhnZXREZWVwT2JqZWN0Q2hpbGRyZW4ocm9vdCkpXG4gIH1cblxuICBmaW5kTW9kZWxCeVR5cGVBbmRJZChtb2RlbFR5cGU6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQW55TW9kZWwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtb2RlbElkID8gdGhpcy5wb29sLmdldChieU1vZGVsVHlwZUFuZElkS2V5KG1vZGVsVHlwZSwgbW9kZWxJZCkpIDogdW5kZWZpbmVkXG4gIH1cblxuICBmaW5kTW9kZWxGb3JTbmFwc2hvdChzbjogYW55KTogQW55TW9kZWwgfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNNb2RlbFNuYXBzaG90KHNuKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IHNuW21vZGVsVHlwZUtleV1cbiAgICBjb25zdCBtb2RlbEluZm8gPSBnZXRNb2RlbEluZm9Gb3JOYW1lKG1vZGVsVHlwZSkhXG4gICAgY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZSA9IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUobW9kZWxJbmZvLmNsYXNzIGFzIE1vZGVsQ2xhc3M8QW55TW9kZWw+KVxuXG4gICAgcmV0dXJuIG1vZGVsSWRQcm9wZXJ0eU5hbWVcbiAgICAgID8gdGhpcy5maW5kTW9kZWxCeVR5cGVBbmRJZChzblttb2RlbFR5cGVLZXldLCAoc24gYXMgYW55KVttb2RlbElkUHJvcGVydHlOYW1lXSlcbiAgICAgIDogdW5kZWZpbmVkXG4gIH1cbn1cblxuY29uc3QgZ2V0RGVlcENoaWxkcmVuTW9kZWxzID0gcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248TWFwPHN0cmluZywgQW55TW9kZWw+Pih7XG4gIGluaXREYXRhKCkge1xuICAgIHJldHVybiBuZXcgTWFwKClcbiAgfSxcblxuICBhZGROb2RlKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoaXNNb2RlbChub2RlKSkge1xuICAgICAgY29uc3QgaWQgPSBub2RlW21vZGVsSWRLZXldXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgZGF0YS5zZXQoYnlNb2RlbFR5cGVBbmRJZEtleShub2RlW21vZGVsVHlwZUtleV0sIGlkKSwgbm9kZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlT2JqZWN0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgaXNGcm96ZW5TbmFwc2hvdCB9IGZyb20gXCIuLi9mcm96ZW4vRnJvemVuXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbElkS2V5LCBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCwgaXNNb2RlbFNuYXBzaG90IH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJbmZvRm9yTmFtZSwgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUsIGluRGV2TW9kZSwgaXNBcnJheSwgaXNQbGFpbk9iamVjdCwgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IHJlY29uY2lsZVNuYXBzaG90IH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2YsIFNuYXBzaG90T3V0T2YgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcblxuLyoqXG4gKiBBcHBsaWVzIGEgZnVsbCBzbmFwc2hvdCBvdmVyIGFuIG9iamVjdCwgcmVjb25jaWxpbmcgaXQgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlIFRhcmdldCBvYmplY3QgKG1vZGVsIG9iamVjdCwgb2JqZWN0IG9yIGFycmF5KS5cbiAqIEBwYXJhbSBzbmFwc2hvdCBTbmFwc2hvdCB0byBhcHBseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCwgc25hcHNob3Q6IFNuYXBzaG90SW5PZjxUPik6IHZvaWRcblxuLyoqXG4gKiBBcHBsaWVzIGEgZnVsbCBzbmFwc2hvdCBvdmVyIGFuIG9iamVjdCwgcmVjb25jaWxpbmcgaXQgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlIFRhcmdldCBvYmplY3QgKG1vZGVsIG9iamVjdCwgb2JqZWN0IG9yIGFycmF5KS5cbiAqIEBwYXJhbSBzbmFwc2hvdCBTbmFwc2hvdCB0byBhcHBseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCwgc25hcHNob3Q6IFNuYXBzaG90T3V0T2Y8VD4pOiB2b2lkXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNuYXBzaG90KG5vZGU6IG9iamVjdCwgc25hcHNob3Q6IHVua25vd24pOiB2b2lkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcbiAgYXNzZXJ0SXNPYmplY3Qoc25hcHNob3QsIFwic25hcHNob3RcIilcblxuICB3cmFwcGVkSW50ZXJuYWxBcHBseVNuYXBzaG90KCkuY2FsbChub2RlLCBzbmFwc2hvdClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlTbmFwc2hvdDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgdGhpczogVCxcbiAgc246IFNuYXBzaG90SW5PZjxUPiB8IFNuYXBzaG90T3V0T2Y8VD5cbik6IHZvaWQge1xuICBjb25zdCBvYmogPSB0aGlzXG5cbiAgY29uc3QgcmVjb25jaWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsUG9vbCA9IG5ldyBNb2RlbFBvb2wob2JqKVxuICAgIGNvbnN0IHJldCA9IHJlY29uY2lsZVNuYXBzaG90KG9iaiwgc24sIG1vZGVsUG9vbCwgdW5kZWZpbmVkKVxuXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAocmV0ICE9PSBvYmopIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcImFzc2VydGlvbiBmYWlsZWQ6IHJlY29uY2lsZWQgb2JqZWN0IGhhcyB0byBiZSB0aGUgc2FtZVwiKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc0FycmF5KHNuKSkge1xuICAgIGlmICghaXNBcnJheShvYmopKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiaWYgdGhlIHNuYXBzaG90IGlzIGFuIGFycmF5IHRoZSB0YXJnZXQgbXVzdCBiZSBhbiBhcnJheSB0b29cIilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb25jaWxlKClcbiAgfVxuXG4gIGlmIChpc0Zyb3plblNuYXBzaG90KHNuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhcHBseVNuYXBzaG90IGNhbm5vdCBiZSB1c2VkIG92ZXIgZnJvemVuIG9iamVjdHNcIilcbiAgfVxuXG4gIC8vIGFkYXB0IHNuYXBzaG90IHRvIHRhcmdldCBtb2RlbCBpZiBwb3NzaWJsZVxuICBpZiAoaXNQbGFpbk9iamVjdChzbikgJiYgKHNuIGFzIGFueSlbbW9kZWxUeXBlS2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzTW9kZWwob2JqKSkge1xuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KChvYmogYXMgYW55KS5jb25zdHJ1Y3RvcikhXG4gICAgc24gPSB7IC4uLnNuLCBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUgfVxuICB9XG5cbiAgaWYgKGlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICBjb25zdCB0eXBlID0gc25bbW9kZWxUeXBlS2V5XVxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZSh0eXBlKVxuICAgIGlmICghbW9kZWxJbmZvKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBtb2RlbCB3aXRoIG5hbWUgXCIke3R5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gICAgfVxuXG4gICAgLy8gd2UgZG9uJ3QgY2hlY2sgYnkgYWN0dWFsIGluc3RhbmNlIHNpbmNlIHRoZSBjbGFzcyBtaWdodCBiZSBhIGRpZmZlcmVudCBvbmUgZHVlIHRvIGhvdCByZWxvYWRpbmdcbiAgICBpZiAoIWlzTW9kZWwob2JqKSkge1xuICAgICAgLy8gbm90IGEgbW9kZWwgaW5zdGFuY2UsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICB0aHJvdyBmYWlsdXJlKGB0aGUgdGFyZ2V0IGZvciBhIG1vZGVsIHNuYXBzaG90IG11c3QgYmUgYSBtb2RlbCBpbnN0YW5jZWApXG4gICAgfVxuXG4gICAgaWYgKG9ialttb2RlbFR5cGVLZXldICE9PSB0eXBlKSB7XG4gICAgICAvLyBkaWZmZXJlbnQga2luZCBvZiBtb2RlbCwgbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBzbmFwc2hvdCBtb2RlbCB0eXBlICcke3R5cGV9JyBkb2VzIG5vdCBtYXRjaCB0YXJnZXQgbW9kZWwgdHlwZSAnJHtcbiAgICAgICAgICAob2JqIGFzIGFueSlbbW9kZWxUeXBlS2V5XVxuICAgICAgICB9J2BcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbElkUHJvcGVydHlOYW1lID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pXG4gICAgaWYgKG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgIGNvbnN0IGlkID0gKHNuIGFzIGFueSlbbW9kZWxJZFByb3BlcnR5TmFtZV1cbiAgICAgIGlmIChvYmpbbW9kZWxJZEtleV0gIT09IGlkKSB7XG4gICAgICAgIC8vIGRpZmZlcmVudCBpZCwgbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgc25hcHNob3QgbW9kZWwgaWQgJyR7aWR9JyBkb2VzIG5vdCBtYXRjaCB0YXJnZXQgbW9kZWwgaWQgJyR7b2JqW21vZGVsSWRLZXldfSdgXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb25jaWxlKClcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHNuKSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChvYmopICYmICFpc09ic2VydmFibGVPYmplY3Qob2JqKSkge1xuICAgICAgLy8gbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICAgIHRocm93IGZhaWx1cmUoXCJpZiB0aGUgc25hcHNob3QgaXMgYW4gb2JqZWN0IHRoZSB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QgdG9vXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgpXG4gIH1cblxuICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBzbmFwc2hvdCAtICR7c259YClcbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlTbmFwc2hvdCA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlTbmFwc2hvdCxcbiAgICBmbjogaW50ZXJuYWxBcHBseVNuYXBzaG90LFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG4iLCJpbXBvcnQgeyByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5cbi8qKlxuICogTGlzdGVuZXIgZnVuY3Rpb24gZm9yIG9uU25hcHNob3QuXG4gKi9cbmV4cG9ydCB0eXBlIE9uU25hcHNob3RMaXN0ZW5lcjxUPiA9IChzbjogU25hcHNob3RPdXRPZjxUPiwgcHJldlNuOiBTbmFwc2hvdE91dE9mPFQ+KSA9PiB2b2lkXG5cbi8qKlxuICogRGlzcG9zZXIgZnVuY3Rpb24gZm9yIG9uU25hcHNob3QuXG4gKi9cbmV4cG9ydCB0eXBlIE9uU25hcHNob3REaXNwb3NlciA9ICgpID0+IHZvaWRcblxuLyoqXG4gKiBBZGRzIGEgcmVhY3Rpb24gdGhhdCB3aWxsIHRyaWdnZXIgZXZlcnkgdGltZSBhbiBzbmFwc2hvdCBjaGFuZ2VzLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlT3JGbiBPYmplY3QgdG8gZ2V0IHRoZSBzbmFwc2hvdCBmcm9tIG9yIGEgZnVuY3Rpb24gdG8gZ2V0IGl0LlxuICogQHBhcmFtIGxpc3RlbmVyIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgc25hcHNob3QgY2hhbmdlcy5cbiAqIEByZXR1cm5zIEEgZGlzcG9zZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblNuYXBzaG90PFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBub2RlT3JGbjogVCB8ICgoKSA9PiBUKSxcbiAgbGlzdGVuZXI6IE9uU25hcHNob3RMaXN0ZW5lcjxUPlxuKTogT25TbmFwc2hvdERpc3Bvc2VyIHtcbiAgY29uc3Qgbm9kZUZuID0gdHlwZW9mIG5vZGVPckZuID09PSBcImZ1bmN0aW9uXCIgPyAobm9kZU9yRm4gYXMgKCkgPT4gVCkgOiAoKSA9PiBub2RlT3JGblxuXG4gIGNvbnN0IG5vZGUgPSBub2RlRm4oKVxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGxldCBjdXJyZW50U25hcHNob3QgPSBnZXRTbmFwc2hvdChub2RlKVxuXG4gIHJldHVybiByZWFjdGlvbihcbiAgICAoKSA9PiBnZXRTbmFwc2hvdChub2RlRm4oKSksXG4gICAgKG5ld1NuYXBzaG90KSA9PiB7XG4gICAgICBjb25zdCBwcmV2U24gPSBjdXJyZW50U25hcHNob3RcbiAgICAgIGN1cnJlbnRTbmFwc2hvdCA9IG5ld1NuYXBzaG90XG4gICAgICBsaXN0ZW5lcihuZXdTbmFwc2hvdCwgcHJldlNuKVxuICAgIH1cbiAgKVxufVxuIiwiaW1wb3J0IGZhc3REZWVwRXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbC9lczZcIlxuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCB0b0pTIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3RcIlxuaW1wb3J0IHsgaXNUcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyXCJcbmltcG9ydCB7IGdldE1vYnhWZXJzaW9uIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBEZWVwbHkgY29tcGFyZXMgdHdvIHZhbHVlcy5cbiAqXG4gKiBTdXBwb3J0ZWQgdmFsdWVzIGFyZTpcbiAqIC0gUHJpbWl0aXZlc1xuICogLSBCb3hlZCBvYnNlcnZhYmxlc1xuICogLSBPYmplY3RzLCBvYnNlcnZhYmxlIG9iamVjdHNcbiAqIC0gQXJyYXlzLCBvYnNlcnZhYmxlIGFycmF5c1xuICogLSBUeXBlZCBhcnJheXNcbiAqIC0gTWFwcywgb2JzZXJ2YWJsZSBtYXBzXG4gKiAtIFNldHMsIG9ic2VydmFibGUgc2V0c1xuICogLSBUcmVlIG5vZGVzIChvcHRpbWl6ZWQgYnkgdXNpbmcgc25hcHNob3QgY29tcGFyaXNvbiBpbnRlcm5hbGx5KVxuICpcbiAqIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBtb2RlbHMgdGhlIHJlc3VsdCB3aWxsIGJlIGZhbHNlIGlmIHRoZWlyIG1vZGVsIElEcyBhcmUgZGlmZmVyZW50LlxuICpcbiAqIEBwYXJhbSBhIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gYiBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGV5IGFyZSB0aGUgZXF1aXZhbGVudCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWxzKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIC8vIHF1aWNrIGNoZWNrIGZvciByZWZlcmVuY2VcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gdXNlIHNuYXBzaG90cyB0byBjb21wYXJlIGlmIHBvc3NpYmxlXG4gIC8vIHNpbmNlIHNuYXBzaG90cyB1c2Ugc3RydWN0dXJhbCBzaGFyaW5nIGl0IGlzIG1vcmUgbGlrZWx5XG4gIC8vIHRvIHNwZWVkIHVwIGNvbXBhcmlzb25zXG4gIGlmIChpc1RyZWVOb2RlKGEpKSB7XG4gICAgYSA9IGdldFNuYXBzaG90KGEpXG4gIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKGEpKSB7XG4gICAgYSA9IHRvSlMoYSwgdG9KU09wdGlvbnMpXG4gIH1cbiAgaWYgKGlzVHJlZU5vZGUoYikpIHtcbiAgICBiID0gZ2V0U25hcHNob3QoYilcbiAgfSBlbHNlIGlmIChpc09ic2VydmFibGUoYikpIHtcbiAgICBiID0gdG9KUyhiLCB0b0pTT3B0aW9ucylcbiAgfVxuXG4gIHJldHVybiBmYXN0RGVlcEVxdWFsKGEsIGIpXG59XG5cbmNvbnN0IHRvSlNPcHRpb25zID1cbiAgZ2V0TW9ieFZlcnNpb24oKSA+PSA2XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHtcbiAgICAgICAgZXhwb3J0TWFwc0FzT2JqZWN0czogZmFsc2UsXG4gICAgICAgIHJlY3Vyc2VFdmVyeXRoaW5nOiBmYWxzZSxcbiAgICAgIH1cbiIsImltcG9ydCB7IHJlbW92ZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGlzUmVzZXJ2ZWRNb2RlbEtleSwgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwsIGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGRlZXBFcXVhbHMgfSBmcm9tIFwiLi4vdHJlZVV0aWxzL2RlZXBFcXVhbHNcIlxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi4vdHdlYWtlci90eXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgd2l0aG91dFR5cGVDaGVja2luZyB9IGZyb20gXCIuLi90d2Vha2VyL3dpdGhvdXRUeXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNBcnJheSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgZGV0YWNoSWZOZWVkZWQsIHJlY29uY2lsZVNuYXBzaG90LCByZWdpc3RlclJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVTbmFwc2hvdFwiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZk1vZGVsIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gcmVjb25jaWxlTW9kZWxTbmFwc2hvdChcbiAgdmFsdWU6IGFueSxcbiAgc246IFNuYXBzaG90SW5PZk1vZGVsPEFueU1vZGVsPixcbiAgbW9kZWxQb29sOiBNb2RlbFBvb2wsXG4gIHBhcmVudDogYW55XG4pOiBBbnlNb2RlbCB7XG4gIGNvbnN0IHR5cGUgPSBzblttb2RlbFR5cGVLZXldIVxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUodHlwZSlcbiAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBtb2RlbCB3aXRoIG5hbWUgXCIke3R5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gIH1cblxuICAvLyB0cnkgdG8gdXNlIG1vZGVsIGZyb20gcG9vbCBpZiBwb3NzaWJsZVxuICBjb25zdCBtb2RlbEluUG9vbCA9IG1vZGVsUG9vbC5maW5kTW9kZWxGb3JTbmFwc2hvdChzbilcbiAgaWYgKG1vZGVsSW5Qb29sKSB7XG4gICAgdmFsdWUgPSBtb2RlbEluUG9vbFxuICB9XG5cbiAgLy8gd2UgZG9uJ3QgY2hlY2sgYnkgYWN0dWFsIGluc3RhbmNlIHNpbmNlIHRoZSBjbGFzcyBtaWdodCBiZSBhIGRpZmZlcmVudCBvbmUgZHVlIHRvIGhvdCByZWxvYWRpbmdcbiAgaWYgKCFpc01vZGVsKHZhbHVlKSB8fCB2YWx1ZVttb2RlbFR5cGVLZXldICE9PSB0eXBlKSB7XG4gICAgLy8gZGlmZmVyZW50IGtpbmQgb2YgbW9kZWwgdHlwZSwgbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICByZXR1cm4gZnJvbVNuYXBzaG90PEFueU1vZGVsPihzbilcbiAgfVxuXG4gIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPilcbiAgaWYgKG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICBjb25zdCBpZCA9IHNuW21vZGVsSWRQcm9wZXJ0eU5hbWVdXG5cbiAgICBpZiAodmFsdWVbbW9kZWxJZEtleV0gIT09IGlkKSB7XG4gICAgICAvLyBkaWZmZXJlbnQgaWQsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90PEFueU1vZGVsPihzbilcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNBcnJheShwYXJlbnQpKSB7XG4gICAgLy8gbm8gaWQgYW5kIGluc2lkZSBhbiBhcnJheT8gbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGUsXG4gICAgLy8gdW5sZXNzIHRoZSBzbmFwc2hvdHMgYXJlIGVxdWl2YWxlbnQgKG5vdGUgZGVlcCBlcXVhbHMgd2lsbCB1c2UgdGhlIHNuYXBzaG90IG9mIHZhbHVlIGF1dG8pXG4gICAgaWYgKCFkZWVwRXF1YWxzKHZhbHVlLCBzbikpIHtcbiAgICAgIHJldHVybiBmcm9tU25hcHNob3Q8QW55TW9kZWw+KHNuKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1vZGVsT2JqOiBBbnlNb2RlbCA9IHZhbHVlXG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlQ2hhbmdlcyA9IGdldFNuYXBzaG90KG1vZGVsT2JqKVxuXG4gIHdpdGhvdXRUeXBlQ2hlY2tpbmcoKCkgPT4ge1xuICAgIGxldCBwcm9jZXNzZWRTbjogYW55ID0gc25cbiAgICBjb25zdCBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsPiA9IChtb2RlbE9iaiBhcyBhbnkpLmNvbnN0cnVjdG9yXG4gICAgaWYgKG1vZGVsQ2xhc3MuZnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICBwcm9jZXNzZWRTbiA9IG1vZGVsQ2xhc3MuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBtb2RlbE9iai4kXG5cbiAgICAvLyByZW1vdmUgZXhjZXNzIHByb3BzXG4gICAgY29uc3QgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhKVxuICAgIGNvbnN0IGRhdGFLZXlzTGVuID0gZGF0YUtleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gZGF0YUtleXNbaV1cbiAgICAgIGlmICghKGsgaW4gcHJvY2Vzc2VkU24pKSB7XG4gICAgICAgIHJlbW92ZShkYXRhLCBrKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY29uY2lsZSB0aGUgcmVzdFxuICAgIGNvbnN0IHByb2Nlc3NlZFNuS2V5cyA9IE9iamVjdC5rZXlzKHByb2Nlc3NlZFNuKVxuICAgIGNvbnN0IHByb2Nlc3NlZFNuS2V5c0xlbiA9IHByb2Nlc3NlZFNuS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZFNuS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gcHJvY2Vzc2VkU25LZXlzW2ldXG4gICAgICBpZiAoIWlzUmVzZXJ2ZWRNb2RlbEtleShrKSkge1xuICAgICAgICBjb25zdCB2ID0gcHJvY2Vzc2VkU25ba11cblxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGRhdGFba11cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdChvbGRWYWx1ZSwgdiwgbW9kZWxQb29sLCBtb2RlbE9iailcblxuICAgICAgICBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZSwgb2xkVmFsdWUsIG1vZGVsUG9vbClcblxuICAgICAgICBzZXQoZGF0YSwgaywgbmV3VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKG1vZGVsT2JqLCB1bmRlZmluZWQsIHNuYXBzaG90QmVmb3JlQ2hhbmdlcylcblxuICByZXR1cm4gbW9kZWxPYmpcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kZWxTbmFwc2hvdFJlY29uY2lsZXIoKSB7XG4gIHJlZ2lzdGVyUmVjb25jaWxlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5Nb2RlbCwgKHZhbHVlLCBzbiwgbW9kZWxQb29sLCBwYXJlbnQpID0+IHtcbiAgICBpZiAoaXNNb2RlbFNuYXBzaG90KHNuKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZU1vZGVsU25hcHNob3QodmFsdWUsIHNuLCBtb2RlbFBvb2wsIHBhcmVudClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlT2JqZWN0LCByZW1vdmUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IHdpdGhvdXRUeXBlQ2hlY2tpbmcgfSBmcm9tIFwiLi4vdHdlYWtlci93aXRob3V0VHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGRldGFjaElmTmVlZGVkLCByZWNvbmNpbGVTbmFwc2hvdCwgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZPYmplY3QgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiByZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90KFxuICB2YWx1ZTogYW55LFxuICBzbjogU25hcHNob3RJbk9mT2JqZWN0PGFueT4sXG4gIG1vZGVsUG9vbDogTW9kZWxQb29sXG4pOiBvYmplY3Qge1xuICAvLyBwbGFpbiBvYmpcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHZhbHVlKSkge1xuICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgcmV0dXJuIGZyb21TbmFwc2hvdChzbilcbiAgfVxuXG4gIGNvbnN0IHBsYWluT2JqID0gdmFsdWVcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVDaGFuZ2VzID0gZ2V0U25hcHNob3QocGxhaW5PYmopXG5cbiAgd2l0aG91dFR5cGVDaGVja2luZygoKSA9PiB7XG4gICAgLy8gcmVtb3ZlIGV4Y2VzcyBwcm9wc1xuICAgIGNvbnN0IHBsYWluT2JqS2V5cyA9IE9iamVjdC5rZXlzKHBsYWluT2JqKVxuICAgIGNvbnN0IHBsYWluT2JqS2V5c0xlbiA9IHBsYWluT2JqS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWluT2JqS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gcGxhaW5PYmpLZXlzW2ldXG4gICAgICBpZiAoIShrIGluIHNuKSkge1xuICAgICAgICByZW1vdmUocGxhaW5PYmosIGspXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVjb25jaWxlIHRoZSByZXN0XG4gICAgY29uc3Qgc25LZXlzID0gT2JqZWN0LmtleXMoc24pXG4gICAgY29uc3Qgc25LZXlzTGVuID0gc25LZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc25LZXlzTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBzbktleXNbaV1cbiAgICAgIGNvbnN0IHYgPSBzbltrXVxuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHBsYWluT2JqW2tdXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KG9sZFZhbHVlLCB2LCBtb2RlbFBvb2wsIHBsYWluT2JqKVxuXG4gICAgICBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZSwgb2xkVmFsdWUsIG1vZGVsUG9vbClcblxuICAgICAgc2V0KHBsYWluT2JqLCBrLCBuZXdWYWx1ZSlcbiAgICB9XG4gIH0pXG5cbiAgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UocGxhaW5PYmosIHVuZGVmaW5lZCwgc25hcHNob3RCZWZvcmVDaGFuZ2VzKVxuXG4gIHJldHVybiBwbGFpbk9ialxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJQbGFpbk9iamVjdFNuYXBzaG90UmVjb25jaWxlcigpIHtcbiAgcmVnaXN0ZXJSZWNvbmNpbGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LlBsYWluT2JqZWN0LCAodmFsdWUsIHNuLCBtb2RlbFBvb2wpID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90KHZhbHVlLCBzbiwgbW9kZWxQb29sKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3RlckFycmF5U25hcHNob3RSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlQXJyYXlTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckZyb3plblNuYXBzaG90UmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZUZyb3plblNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyTW9kZWxTbmFwc2hvdFJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVNb2RlbFNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyUGxhaW5PYmplY3RTbmFwc2hvdFJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90XCJcblxubGV0IGRlZmF1bHRSZWNvbmNpbGVyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0UmVjb25jaWxlcnMoKSB7XG4gIGlmIChkZWZhdWx0UmVjb25jaWxlcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdFJlY29uY2lsZXJzUmVnaXN0ZXJlZCA9IHRydWVcblxuICByZWdpc3RlckFycmF5U25hcHNob3RSZWNvbmNpbGVyKClcbiAgcmVnaXN0ZXJGcm96ZW5TbmFwc2hvdFJlY29uY2lsZXIoKVxuICByZWdpc3Rlck1vZGVsU25hcHNob3RSZWNvbmNpbGVyKClcbiAgcmVnaXN0ZXJQbGFpbk9iamVjdFNuYXBzaG90UmVjb25jaWxlcigpXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbElkS2V5LCBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzIH0gZnJvbSBcIi4uL3BhcmVudFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc01hcCwgaXNQcmltaXRpdmUsIGlzU2V0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxQb29sIH0gZnJvbSBcIi4uL3V0aWxzL01vZGVsUG9vbFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzIH0gZnJvbSBcIi4vcmVnaXN0ZXJEZWZhdWx0UmVjb25jaWxlcnNcIlxuXG50eXBlIFJlY29uY2lsZXIgPSAodmFsdWU6IGFueSwgc246IGFueSwgbW9kZWxQb29sOiBNb2RlbFBvb2wsIHBhcmVudDogYW55KSA9PiBhbnkgfCB1bmRlZmluZWRcblxuY29uc3QgcmVjb25jaWxlcnM6IHsgcHJpb3JpdHk6IG51bWJlcjsgcmVjb25jaWxlcjogUmVjb25jaWxlciB9W10gPSBbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZWNvbmNpbGVyKHByaW9yaXR5OiBudW1iZXIsIHJlY29uY2lsZXI6IFJlY29uY2lsZXIpOiB2b2lkIHtcbiAgcmVjb25jaWxlcnMucHVzaCh7IHByaW9yaXR5LCByZWNvbmNpbGVyIH0pXG4gIHJlY29uY2lsZXJzLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlU25hcHNob3QodmFsdWU6IGFueSwgc246IGFueSwgbW9kZWxQb29sOiBNb2RlbFBvb2wsIHBhcmVudDogYW55KTogYW55IHtcbiAgaWYgKGlzUHJpbWl0aXZlKHNuKSkge1xuICAgIHJldHVybiBzblxuICB9XG5cbiAgLy8gaWYgdGhlIHNuYXBzaG90IHBhc3NlZCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG9uZVxuICAvLyB0aGVuIGl0IGlzIGFscmVhZHkgcmVjb25jaWxlZFxuICBpZiAoZ2V0U25hcHNob3QodmFsdWUpID09PSBzbikge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmVnaXN0ZXJEZWZhdWx0UmVjb25jaWxlcnMoKVxuXG4gIGNvbnN0IHJlY29uY2lsZXJzTGVuID0gcmVjb25jaWxlcnMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjb25jaWxlcnNMZW47IGkrKykge1xuICAgIGNvbnN0IHsgcmVjb25jaWxlciB9ID0gcmVjb25jaWxlcnNbaV1cbiAgICBjb25zdCByZXQgPSByZWNvbmNpbGVyKHZhbHVlLCBzbiwgbW9kZWxQb29sLCBwYXJlbnQpXG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTWFwKHNuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhIHNuYXBzaG90IG11c3Qgbm90IGNvbnRhaW4gbWFwc1wiKVxuICB9XG5cbiAgaWYgKGlzU2V0KHNuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhIHNuYXBzaG90IG11c3Qgbm90IGNvbnRhaW4gc2V0c1wiKVxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgc25hcHNob3QgLSAke3NufWApXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZTogYW55LCBvbGRWYWx1ZTogYW55LCBtb2RlbFBvb2w6IE1vZGVsUG9vbCkge1xuICAvLyBlZGdlIGNhc2UgZm9yIHdoZW4gd2UgYXJlIHN3YXBwaW5nIG1vZGVscyBhcm91bmQgdGhlIHRyZWVcblxuICBpZiAobmV3VmFsdWUgPT09IG9sZFZhbHVlKSB7XG4gICAgLy8gYWxyZWFkeSB3aGVyZSBpdCBzaG91bGQgYmVcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChcbiAgICBpc01vZGVsKG5ld1ZhbHVlKSAmJlxuICAgIG1vZGVsUG9vbC5maW5kTW9kZWxCeVR5cGVBbmRJZChuZXdWYWx1ZVttb2RlbFR5cGVLZXldLCBuZXdWYWx1ZVttb2RlbElkS2V5XSlcbiAgKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoSW5jbHVkaW5nRGF0YU9iamVjdHMobmV3VmFsdWUpXG4gICAgaWYgKHBhcmVudFBhdGgpIHtcbiAgICAgIHNldChwYXJlbnRQYXRoLnBhcmVudCwgcGFyZW50UGF0aC5wYXRoLCBudWxsKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVtb3ZlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL3dyYXBJbkFjdGlvblwiXG5pbXBvcnQgeyBtb2RlbFRvRGF0YU5vZGUgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBQYXRoRWxlbWVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi4vcGF0Y2gvUGF0Y2hcIlxuaW1wb3J0IHsgcmVjb25jaWxlU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlLCBpc0FycmF5LCBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGdpdmVuIHBhdGNoZXMgdG8gdGhlIGdpdmVuIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIG5vZGUgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwYXRjaGVzIExpc3Qgb2YgcGF0Y2hlcyB0byBhcHBseS5cbiAqIEBwYXJhbSByZXZlcnNlIFdoZXRoZXIgcGF0Y2hlcyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaGVzKFxuICBub2RlOiBvYmplY3QsXG4gIHBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+IHwgUmVhZG9ubHlBcnJheTxSZWFkb25seUFycmF5PFBhdGNoPj4sXG4gIHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZVxuKTogdm9pZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgaWYgKHBhdGNoZXMubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyYXBwZWRJbnRlcm5hbEFwcGx5UGF0Y2hlcygpLmNhbGwobm9kZSwgcGF0Y2hlcywgcmV2ZXJzZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlQYXRjaGVzKFxuICB0aGlzOiBvYmplY3QsXG4gIHBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+IHwgUmVhZG9ubHlBcnJheTxSZWFkb25seUFycmF5PFBhdGNoPj4sXG4gIHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZVxuKTogdm9pZCB7XG4gIGNvbnN0IG9iaiA9IHRoaXNcbiAgY29uc3QgbW9kZWxQb29sID0gbmV3IE1vZGVsUG9vbChvYmopXG5cbiAgaWYgKHJldmVyc2UpIHtcbiAgICBsZXQgaSA9IHBhdGNoZXMubGVuZ3RoXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3QgcCA9IHBhdGNoZXNbaV1cbiAgICAgIGlmICghaXNBcnJheShwKSkge1xuICAgICAgICBhcHBseVNpbmdsZVBhdGNoKG9iaiwgcCBhcyBQYXRjaCwgbW9kZWxQb29sKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGogPSBwLmxlbmd0aFxuICAgICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgICAgYXBwbHlTaW5nbGVQYXRjaChvYmosIHBbal0sIG1vZGVsUG9vbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsZW4gPSBwYXRjaGVzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRjaGVzW2ldXG4gICAgICBpZiAoIWlzQXJyYXkocCkpIHtcbiAgICAgICAgYXBwbHlTaW5nbGVQYXRjaChvYmosIHAgYXMgUGF0Y2gsIG1vZGVsUG9vbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxlbjIgPSBwLmxlbmd0aFxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbjI7IGorKykge1xuICAgICAgICAgIGFwcGx5U2luZ2xlUGF0Y2gob2JqLCBwW2pdLCBtb2RlbFBvb2wpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlQYXRjaGVzID0gbGF6eSgoKSA9PlxuICB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogQnVpbHRJbkFjdGlvbi5BcHBseVBhdGNoZXMsXG4gICAgZm46IGludGVybmFsQXBwbHlQYXRjaGVzLFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG5cbmZ1bmN0aW9uIGFwcGx5U2luZ2xlUGF0Y2gob2JqOiBvYmplY3QsIHBhdGNoOiBQYXRjaCwgbW9kZWxQb29sOiBNb2RlbFBvb2wpOiB2b2lkIHtcbiAgY29uc3QgeyB0YXJnZXQsIHByb3AgfSA9IHBhdGhBcnJheVRvT2JqZWN0QW5kUHJvcChvYmosIHBhdGNoLnBhdGgpXG5cbiAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICBjb25zdCBpbmRleCA9ICtwcm9wIVxuICAgICAgICAvLyByZWNvbmNpbGUgZnJvbSB0aGUgcG9vbCBpZiBwb3NzaWJsZVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KHVuZGVmaW5lZCwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICB0YXJnZXQuc3BsaWNlKGluZGV4LCAwLCBuZXdWYWx1ZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gK3Byb3AhXG4gICAgICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uLCByZW1vdmluZ1xuICAgICAgICB0YXJnZXQuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgIGlmIChwcm9wID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgdGFyZ2V0Lmxlbmd0aCA9IHBhdGNoLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSArcHJvcCFcbiAgICAgICAgICAvLyB0cnkgdG8gcmVjb25jaWxlXG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdCh0YXJnZXRbaW5kZXhdLCBwYXRjaC52YWx1ZSwgbW9kZWxQb29sLCB0YXJnZXQpXG4gICAgICAgICAgc2V0KHRhcmdldCwgaW5kZXggYXMgYW55LCBuZXdWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246ICR7KHBhdGNoIGFzIGFueSkub3B9YClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgIC8vIHJlY29uY2lsZSBmcm9tIHRoZSBwb29sIGlmIHBvc3NpYmxlXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3QodW5kZWZpbmVkLCBwYXRjaC52YWx1ZSwgbW9kZWxQb29sLCB0YXJnZXQpXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3AsIG5ld1ZhbHVlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgLy8gbm8gcmVjb25jaWxpYXRpb24sIHJlbW92aW5nXG4gICAgICAgIHJlbW92ZSh0YXJnZXQsIHByb3ApXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgLy8gdHJ5IHRvIHJlY29uY2lsZVxuICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHR3ZWFrIHRoZSBwb29sIHNpbmNlIHJlY29uY2lsZVNuYXBzaG90IHdpbGwgZG8gdGhhdCBmb3IgdXNcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdCh0YXJnZXRbcHJvcCFdLCBwYXRjaC52YWx1ZSwgbW9kZWxQb29sLCB0YXJnZXQpXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3AsIG5ld1ZhbHVlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246ICR7KHBhdGNoIGFzIGFueSkub3B9YClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0aEFycmF5VG9PYmplY3RBbmRQcm9wKFxuICBvYmo6IG9iamVjdCxcbiAgcGF0aDogUGF0Y2hbXCJwYXRoXCJdXG4pOiB7IHRhcmdldDogYW55OyBwcm9wPzogUGF0aEVsZW1lbnQgfSB7XG4gIGlmIChpbkRldk1vZGUoKSkge1xuICAgIGlmICghaXNBcnJheShwYXRoKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRoOiAke3BhdGh9YClcbiAgICB9XG4gIH1cblxuICBsZXQgdGFyZ2V0OiBhbnkgPSBtb2RlbFRvRGF0YU5vZGUob2JqKVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQsXG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gcGF0aC5sZW5ndGggLSAyOyBpKyspIHtcbiAgICB0YXJnZXQgPSBtb2RlbFRvRGF0YU5vZGUodGFyZ2V0W3BhdGhbaV1dKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0YXJnZXQsXG4gICAgcHJvcDogcGF0aFtwYXRoLmxlbmd0aCAtIDFdLFxuICB9XG59XG4iLCJpbXBvcnQgeyBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBkYXRhVG9Nb2RlbE5vZGUgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHsgZmluZFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvZmluZFBhcmVudFwiXG5pbXBvcnQgeyBpbnRlcm5hbEFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaC9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgSW50ZXJuYWxQYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoL2VtaXRQYXRjaFwiXG5pbXBvcnQgeyBpbnRlcm5hbEFwcGx5U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvYXBwbHlTbmFwc2hvdFwiXG5pbXBvcnQgeyBpbnZhbGlkYXRlQ2FjaGVkVHlwZUNoZWNrZXJSZXN1bHQgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgcnVuV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzIH0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgeyBpc1R5cGVDaGVja2luZ0FsbG93ZWQgfSBmcm9tIFwiLi93aXRob3V0VHlwZUNoZWNraW5nXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKFxuICBvYmo6IG9iamVjdCxcbiAgcGF0Y2hSZWNvcmRlcjogSW50ZXJuYWxQYXRjaFJlY29yZGVyIHwgdW5kZWZpbmVkLFxuICBzbmFwc2hvdEJlZm9yZUNoYW5nZXM/OiBvYmplY3Rcbikge1xuICBpZiAoIWlzVHlwZUNoZWNraW5nQWxsb3dlZCgpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBpbnZhbGlkYXRlIHR5cGUgY2hlY2sgY2FjaGVkIHJlc3VsdFxuICBpbnZhbGlkYXRlQ2FjaGVkVHlwZUNoZWNrZXJSZXN1bHQob2JqKVxuXG4gIGlmIChpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSkge1xuICAgIGNvbnN0IHBhcmVudE1vZGVsV2l0aFR5cGVDaGVja2VyID0gZmluZE5lYXJlc3RQYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlcihvYmopXG4gICAgaWYgKHBhcmVudE1vZGVsV2l0aFR5cGVDaGVja2VyKSB7XG4gICAgICBjb25zdCBlcnIgPSBwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlci50eXBlQ2hlY2soKVxuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBxdWlldGx5IGFwcGx5IGludmVyc2UgcGF0Y2hlcyAoZG8gbm90IGdlbmVyYXRlIHBhdGNoZXMsIHNuYXBzaG90cywgYWN0aW9ucywgZXRjKVxuICAgICAgICBydW5XaXRob3V0U25hcHNob3RPclBhdGNoZXMoKCkgPT4ge1xuICAgICAgICAgIGlmIChwYXRjaFJlY29yZGVyKSB7XG4gICAgICAgICAgICBpbnRlcm5hbEFwcGx5UGF0Y2hlcy5jYWxsKG9iaiwgcGF0Y2hSZWNvcmRlci5pbnZQYXRjaGVzLCB0cnVlKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc25hcHNob3RCZWZvcmVDaGFuZ2VzKSB7XG4gICAgICAgICAgICBpbnRlcm5hbEFwcGx5U25hcHNob3QuY2FsbChvYmosIHNuYXBzaG90QmVmb3JlQ2hhbmdlcylcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgYXBwbHkgcGF0Y2hlcyBpdCB3aWxsIGJlIHR5cGUgY2hlY2tlZCBhZ2FpbiBhbmQgaXRzIHJlc3VsdCBjYWNoZWQgb25jZSBtb3JlXG4gICAgICAgIGVyci50aHJvdyhwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlcilcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBGaW5kcyB0aGUgY2xvc2VzdCBwYXJlbnQgbW9kZWwgdGhhdCBoYXMgYSB0eXBlIGNoZWNrZXIgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gY2hpbGRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGZpbmROZWFyZXN0UGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIoY2hpbGQ6IG9iamVjdCk6IEFueU1vZGVsIHwgdW5kZWZpbmVkIHtcbiAgLy8gY2hpbGQgbWlnaHQgYmUgLiQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHBhcmVudCBtb2RlbCBpbiB0aGF0IGNhc2VcbiAgY29uc3QgYWN0dWFsQ2hpbGQgPSBkYXRhVG9Nb2RlbE5vZGUoY2hpbGQpXG5cbiAgaWYgKGNoaWxkICE9PSBhY3R1YWxDaGlsZCkge1xuICAgIGNoaWxkID0gYWN0dWFsQ2hpbGRcbiAgICBpZiAoaXNNb2RlbChjaGlsZCkgJiYgISFnZXRNb2RlbE1ldGFkYXRhKGNoaWxkKS5kYXRhVHlwZSkge1xuICAgICAgcmV0dXJuIGNoaWxkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbmRQYXJlbnQoY2hpbGQsIChwYXJlbnQpID0+IHtcbiAgICByZXR1cm4gaXNNb2RlbChwYXJlbnQpICYmICEhZ2V0TW9kZWxNZXRhZGF0YShwYXJlbnQpLmRhdGFUeXBlXG4gIH0pXG59XG4iLCJpbXBvcnQge1xuICBpbnRlcmNlcHQsXG4gIElPYmplY3REaWRDaGFuZ2UsXG4gIElPYmplY3RXaWxsQ2hhbmdlLFxuICBpc09ic2VydmFibGVPYmplY3QsXG4gIG9ic2VydmFibGUsXG4gIG9ic2VydmUsXG4gIHNldCxcbn0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0Q2FuV3JpdGUgfSBmcm9tIFwiLi4vYWN0aW9uL3Byb3RlY3Rpb25cIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJbmZvRm9yTmFtZSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgZGF0YVRvTW9kZWxOb2RlIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIgfSBmcm9tIFwiLi4vcGF0Y2gvZW1pdFBhdGNoXCJcbmltcG9ydCB7XG4gIGZyZWV6ZUludGVybmFsU25hcHNob3QsXG4gIGdldEludGVybmFsU25hcHNob3QsXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QsXG4gIFNuYXBzaG90VHJhbnNmb3JtRm4sXG4gIHVwZGF0ZUludGVybmFsU25hcHNob3QsXG59IGZyb20gXCIuLi9zbmFwc2hvdC9pbnRlcm5hbFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzLCB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgcmVnaXN0ZXJUd2Vha2VyLCB0cnlVbnR3ZWFrLCB0d2VhayB9IGZyb20gXCIuL3R3ZWFrXCJcbmltcG9ydCB7IFR3ZWFrZXJQcmlvcml0eSB9IGZyb20gXCIuL1R3ZWFrZXJQcmlvcml0eVwiXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuL3R5cGVDaGVja2luZ1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d2Vha1BsYWluT2JqZWN0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgdmFsdWU6IFQsXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcbiAgc25hcHNob3RNb2RlbFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZG9Ob3RUd2Vha0NoaWxkcmVuOiBib29sZWFuLFxuICBpc0RhdGFPYmplY3Q6IGJvb2xlYW5cbik6IFQge1xuICBjb25zdCBvcmlnaW5hbE9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHZhbHVlXG4gIGNvbnN0IHR3ZWFrZWRPYmogPSBpc09ic2VydmFibGVPYmplY3Qob3JpZ2luYWxPYmopXG4gICAgPyBvcmlnaW5hbE9ialxuICAgIDogb2JzZXJ2YWJsZS5vYmplY3Qoe30sIHVuZGVmaW5lZCwgb2JzZXJ2YWJsZU9wdGlvbnMpXG5cbiAgbGV0IGludGVyY2VwdERpc3Bvc2VyOiAoKSA9PiB2b2lkXG4gIGxldCBvYnNlcnZlRGlzcG9zZXI6ICgpID0+IHZvaWRcblxuICBjb25zdCB1bnR3ZWFrID0gKCkgPT4ge1xuICAgIGludGVyY2VwdERpc3Bvc2VyKClcbiAgICBvYnNlcnZlRGlzcG9zZXIoKVxuICB9XG5cbiAgdHdlYWtlZE9iamVjdHMuc2V0KHR3ZWFrZWRPYmosIHVudHdlYWspXG4gIHNldFBhcmVudCh7XG4gICAgdmFsdWU6IHR3ZWFrZWRPYmosXG4gICAgcGFyZW50UGF0aCxcbiAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgIGlzRGF0YU9iamVjdCxcbiAgICAvLyBhbiBvYmplY3Qgc2hvdWxkbid0IGJlIGNsb25lZFxuICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcbiAgfSlcblxuICBsZXQgdW50cmFuc2Zvcm1lZFNuOiBhbnkgPSB7fVxuXG4gIC8vIHN1YnN0aXR1dGUgaW5pdGlhbCB2YWx1ZXMgYnkgdHdlYWtlZCB2YWx1ZXNcbiAgY29uc3Qgb3JpZ2luYWxPYmpLZXlzID0gT2JqZWN0LmtleXMob3JpZ2luYWxPYmopXG4gIGNvbnN0IG9yaWdpbmFsT2JqS2V5c0xlbiA9IG9yaWdpbmFsT2JqS2V5cy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5hbE9iaktleXNMZW47IGkrKykge1xuICAgIGNvbnN0IGsgPSBvcmlnaW5hbE9iaktleXNbaV1cbiAgICBjb25zdCB2ID0gb3JpZ2luYWxPYmpba11cblxuICAgIGlmIChpc1ByaW1pdGl2ZSh2KSkge1xuICAgICAgaWYgKCFkb05vdFR3ZWFrQ2hpbGRyZW4pIHtcbiAgICAgICAgc2V0KHR3ZWFrZWRPYmosIGssIHYpXG4gICAgICB9XG4gICAgICB1bnRyYW5zZm9ybWVkU25ba10gPSB2XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhdGggPSB7IHBhcmVudDogdHdlYWtlZE9iaiwgcGF0aDogayB9XG5cbiAgICAgIGxldCB0d2Vha2VkVmFsdWVcbiAgICAgIGlmIChkb05vdFR3ZWFrQ2hpbGRyZW4pIHtcbiAgICAgICAgdHdlYWtlZFZhbHVlID0gdlxuICAgICAgICBzZXRQYXJlbnQoe1xuICAgICAgICAgIHZhbHVlOiB0d2Vha2VkVmFsdWUsXG4gICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgICAgICAgLy8gdGhlIHZhbHVlIGlzIGFscmVhZHkgYSBuZXcgdmFsdWUgKHRoZSByZXN1bHQgb2YgYSBmcm9tU25hcHNob3QpXG4gICAgICAgICAgY2xvbmVJZkFwcGxpY2FibGU6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHdlYWtlZFZhbHVlID0gdHdlYWsodiwgcGF0aClcbiAgICAgICAgc2V0KHR3ZWFrZWRPYmosIGssIHR3ZWFrZWRWYWx1ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWVTbiA9IGdldEludGVybmFsU25hcHNob3QodHdlYWtlZFZhbHVlKSFcbiAgICAgIHVudHJhbnNmb3JtZWRTbltrXSA9IHZhbHVlU24udHJhbnNmb3JtZWRcbiAgICB9XG4gIH1cblxuICBsZXQgdHJhbnNmb3JtRm46IFNuYXBzaG90VHJhbnNmb3JtRm4gfCB1bmRlZmluZWRcbiAgaWYgKHNuYXBzaG90TW9kZWxUeXBlKSB7XG4gICAgdW50cmFuc2Zvcm1lZFNuW21vZGVsVHlwZUtleV0gPSBzbmFwc2hvdE1vZGVsVHlwZVxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZShzbmFwc2hvdE1vZGVsVHlwZSlcbiAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShgbW9kZWwgd2l0aCBuYW1lIFwiJHtzbmFwc2hvdE1vZGVsVHlwZX1cIiBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5YClcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFRyYW5zZm9ybUZuID0gKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPikudG9TbmFwc2hvdFByb2Nlc3NvclxuICAgIGlmIChvcmlnaW5hbFRyYW5zZm9ybUZuKSB7XG4gICAgICB0cmFuc2Zvcm1GbiA9IChzbikgPT4gb3JpZ2luYWxUcmFuc2Zvcm1GbihzbiwgZGF0YVRvTW9kZWxOb2RlKHR3ZWFrZWRPYmopKVxuICAgIH1cbiAgfVxuXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QoXG4gICAgaXNEYXRhT2JqZWN0ID8gZGF0YVRvTW9kZWxOb2RlKHR3ZWFrZWRPYmopIDogdHdlYWtlZE9iaixcbiAgICB1bnRyYW5zZm9ybWVkU24sXG4gICAgdHJhbnNmb3JtRm5cbiAgKVxuXG4gIGludGVyY2VwdERpc3Bvc2VyID0gaW50ZXJjZXB0KHR3ZWFrZWRPYmosIGludGVyY2VwdE9iamVjdE11dGF0aW9uKVxuICBvYnNlcnZlRGlzcG9zZXIgPSBvYnNlcnZlKHR3ZWFrZWRPYmosIG9iamVjdERpZENoYW5nZSlcblxuICByZXR1cm4gdHdlYWtlZE9iaiBhcyBhbnlcbn1cblxuY29uc3Qgb2JzZXJ2YWJsZU9wdGlvbnMgPSB7XG4gIGRlZXA6IGZhbHNlLFxufVxuXG5mdW5jdGlvbiBvYmplY3REaWRDaGFuZ2UoY2hhbmdlOiBJT2JqZWN0RGlkQ2hhbmdlKTogdm9pZCB7XG4gIGNvbnN0IG9iaiA9IGNoYW5nZS5vYmplY3RcbiAgY29uc3QgYWN0dWFsTm9kZSA9IGRhdGFUb01vZGVsTm9kZShvYmopXG4gIGxldCB7IHVudHJhbnNmb3JtZWQ6IG9sZFVudHJhbnNmb3JtZWRTbiB9ID0gZ2V0SW50ZXJuYWxTbmFwc2hvdChhY3R1YWxOb2RlKSFcblxuICBjb25zdCBwYXRjaFJlY29yZGVyID0gbmV3IEludGVybmFsUGF0Y2hSZWNvcmRlcigpXG5cbiAgbGV0IG11dGF0ZTogKChzbjogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICBjYXNlIFwiYWRkXCI6XG4gICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAge1xuICAgICAgICBjb25zdCBrID0gY2hhbmdlLm5hbWVcbiAgICAgICAgY29uc3QgdmFsID0gY2hhbmdlLm5ld1ZhbHVlXG5cbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2xkVW50cmFuc2Zvcm1lZFNuW2tdXG5cbiAgICAgICAgbGV0IG5ld1ZhbDogYW55XG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWwpKSB7XG4gICAgICAgICAgbmV3VmFsID0gdmFsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVTbiA9IGdldEludGVybmFsU25hcHNob3QodmFsKSFcbiAgICAgICAgICBuZXdWYWwgPSB2YWx1ZVNuLnRyYW5zZm9ybWVkXG4gICAgICAgIH1cblxuICAgICAgICBtdXRhdGUgPSAoc24pID0+IHtcbiAgICAgICAgICBzbltrXSA9IG5ld1ZhbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IFtrIGFzIHN0cmluZ11cbiAgICAgICAgaWYgKGNoYW5nZS50eXBlID09PSBcImFkZFwiKSB7XG4gICAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG5ld1ZhbCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG9sZFZhbCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcInJlbW92ZVwiOlxuICAgICAge1xuICAgICAgICBjb25zdCBrID0gY2hhbmdlLm5hbWVcbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2xkVW50cmFuc2Zvcm1lZFNuW2tdXG4gICAgICAgIG11dGF0ZSA9IChzbikgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBzbltrXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IFtrIGFzIHN0cmluZ11cblxuICAgICAgICBwYXRjaFJlY29yZGVyLnJlY29yZChcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG9sZFZhbCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgfVxuXG4gIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKG9iaiwgcGF0Y2hSZWNvcmRlcilcblxuICBpZiAoIXJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgJiYgbXV0YXRlISkge1xuICAgIHVwZGF0ZUludGVybmFsU25hcHNob3QoYWN0dWFsTm9kZSwgbXV0YXRlKVxuICAgIHBhdGNoUmVjb3JkZXIuZW1pdChhY3R1YWxOb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyY2VwdE9iamVjdE11dGF0aW9uKGNoYW5nZTogSU9iamVjdFdpbGxDaGFuZ2UpIHtcbiAgYXNzZXJ0Q2FuV3JpdGUoKVxuXG4gIGlmICh0eXBlb2YgY2hhbmdlLm5hbWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwic3ltYm9sIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIilcbiAgfVxuXG4gIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICBjYXNlIFwiYWRkXCI6XG4gICAgICBjaGFuZ2UubmV3VmFsdWUgPSB0d2VhayhjaGFuZ2UubmV3VmFsdWUsIHtcbiAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxuICAgICAgICBwYXRoOiBcIlwiICsgY2hhbmdlLm5hbWUsXG4gICAgICB9KVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgY29uc3Qgb2xkVmFsID0gY2hhbmdlLm9iamVjdFtjaGFuZ2UubmFtZV1cbiAgICAgIHR3ZWFrKG9sZFZhbCwgdW5kZWZpbmVkKVxuICAgICAgdHJ5VW50d2VhayhvbGRWYWwpXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgY29uc3Qgb2xkVmFsID0gY2hhbmdlLm9iamVjdFtjaGFuZ2UubmFtZV1cbiAgICAgIHR3ZWFrKG9sZFZhbCwgdW5kZWZpbmVkKVxuICAgICAgdHJ5VW50d2VhayhvbGRWYWwpXG5cbiAgICAgIGNoYW5nZS5uZXdWYWx1ZSA9IHR3ZWFrKGNoYW5nZS5uZXdWYWx1ZSwge1xuICAgICAgICBwYXJlbnQ6IGNoYW5nZS5vYmplY3QsXG4gICAgICAgIHBhdGg6IFwiXCIgKyBjaGFuZ2UubmFtZSxcbiAgICAgIH0pXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2Vcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGxhaW5PYmplY3RUd2Vha2VyKCkge1xuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5LlBsYWluT2JqZWN0LCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcbiAgICAvLyBwbGFpbiBvYmplY3RcbiAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHR3ZWFrUGxhaW5PYmplY3QodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PiwgcGFyZW50UGF0aCwgdW5kZWZpbmVkLCBmYWxzZSwgZmFsc2UpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyQXJyYXlUd2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtBcnJheVwiXG5pbXBvcnQgeyByZWdpc3RlckZyb3plblR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha0Zyb3plblwiXG5pbXBvcnQgeyByZWdpc3Rlck1vZGVsVHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrTW9kZWxcIlxuaW1wb3J0IHsgcmVnaXN0ZXJQbGFpbk9iamVjdFR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha1BsYWluT2JqZWN0XCJcblxubGV0IGRlZmF1bHRUd2Vha2Vyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnMoKSB7XG4gIGlmIChkZWZhdWx0VHdlYWtlcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdFR3ZWFrZXJzUmVnaXN0ZXJlZCA9IHRydWVcblxuICByZWdpc3RlckFycmF5VHdlYWtlcigpXG4gIHJlZ2lzdGVyRnJvemVuVHdlYWtlcigpXG4gIHJlZ2lzdGVyTW9kZWxUd2Vha2VyKClcbiAgcmVnaXN0ZXJQbGFpbk9iamVjdFR3ZWFrZXIoKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCB9IGZyb20gXCIuLi9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB7IGdldE9iamVjdENoaWxkcmVuIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudCwgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyB1bnNldEludGVybmFsU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZUNoZWNrXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNNYXAsIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNTZXQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0LCB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnMgfSBmcm9tIFwiLi9yZWdpc3RlckRlZmF1bHRUd2Vha2Vyc1wiXG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IChhcnJheSwgcGxhaW4gb2JqZWN0KSBpbnRvIGEgdHJlZSBub2RlLFxuICogd2hpY2ggdGhlbiBjYW4gYWNjZXB0IGNhbGxzIHRvIGBnZXRQYXJlbnRgLCBgZ2V0U25hcHNob3RgLCBldGMuXG4gKiBJZiBhIHRyZWUgbm9kZSBpcyBwYXNzZWQgaXQgd2lsbCByZXR1cm4gdGhlIHBhc3NlZCBhcmd1bWVudCBkaXJlY3RseS5cbiAqIEFkZGl0aW9uYWxseSB0aGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgdHlwZSBwYXNzZWQgdG8gY2hlY2sgdGhlIHZhbHVlXG4gKiBjb25mb3JtcyB0byB0aGUgdHlwZSB3aGVuIG1vZGVsIGF1dG8gdHlwZSBjaGVja2luZyBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gdHVybiBpbnRvIGEgdHJlZSBub2RlLlxuICogQHJldHVybnMgVGhlIG9iamVjdCBhcyBhIHRyZWUgbm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVHJlZU5vZGU8VFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUsIFYgZXh0ZW5kcyBUeXBlVG9EYXRhPFRUeXBlPj4oXG4gIHR5cGU6IFRUeXBlLFxuICB2YWx1ZTogVlxuKTogVlxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCAoYXJyYXksIHBsYWluIG9iamVjdCkgaW50byBhIHRyZWUgbm9kZSxcbiAqIHdoaWNoIHRoZW4gY2FuIGFjY2VwdCBjYWxscyB0byBgZ2V0UGFyZW50YCwgYGdldFNuYXBzaG90YCwgZXRjLlxuICogSWYgYSB0cmVlIG5vZGUgaXMgcGFzc2VkIGl0IHdpbGwgcmV0dXJuIHRoZSBwYXNzZWQgYXJndW1lbnQgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHZhbHVlIE9iamVjdCB0byB0dXJuIGludG8gYSB0cmVlIG5vZGUuXG4gKiBAcmV0dXJucyBUaGUgb2JqZWN0IGFzIGEgdHJlZSBub2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UcmVlTm9kZTxUIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVCk6IFRcblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIHRvVHJlZU5vZGUoYXJnMTogYW55LCBhcmcyPzogYW55KTogYW55IHtcbiAgbGV0IHZhbHVlOiBvYmplY3QsIHR5cGU6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZFxuICBsZXQgaGFzVHlwZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGhhc1R5cGUgPSBmYWxzZVxuICAgIHZhbHVlID0gYXJnMVxuICB9IGVsc2Uge1xuICAgIHR5cGUgPSBhcmcxXG4gICAgaGFzVHlwZSA9IHRydWVcbiAgICB2YWx1ZSA9IGFyZzJcbiAgfVxuXG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm9ubHkgb2JqZWN0cyBjYW4gYmUgdHVybmVkIGludG8gdHJlZSBub2Rlc1wiKVxuICB9XG5cbiAgaWYgKGhhc1R5cGUgJiYgaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkKCkpIHtcbiAgICBjb25zdCBlcnJvcnMgPSB0eXBlQ2hlY2sodHlwZSwgdmFsdWUpXG4gICAgaWYgKGVycm9ycykge1xuICAgICAgZXJyb3JzLnRocm93KHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCB0cnVlKSkge1xuICAgIHJldHVybiB0d2Vhayh2YWx1ZSwgdW5kZWZpbmVkKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBUd2Vha2VyPFQ+ID0gKHZhbHVlOiBULCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQpID0+IFQgfCB1bmRlZmluZWRcblxuY29uc3QgdHdlYWtlcnM6IHsgcHJpb3JpdHk6IG51bWJlcjsgdHdlYWtlcjogVHdlYWtlcjxhbnk+IH1bXSA9IFtdXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclR3ZWFrZXI8VD4ocHJpb3JpdHk6IG51bWJlciwgdHdlYWtlcjogVHdlYWtlcjxUPik6IHZvaWQge1xuICB0d2Vha2Vycy5wdXNoKHsgcHJpb3JpdHksIHR3ZWFrZXIgfSlcbiAgdHdlYWtlcnMuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpXG59XG5cbmZ1bmN0aW9uIGludGVybmFsVHdlYWs8VD4odmFsdWU6IFQsIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCk6IFQge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyBhbHJlYWR5IHR3ZWFrZWRcbiAgaWYgKGlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgdHJ1ZSkpIHtcbiAgICB2YWx1ZSA9IHNldFBhcmVudCh7XG4gICAgICB2YWx1ZSxcbiAgICAgIHBhcmVudFBhdGgsXG4gICAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiB0cnVlLFxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyB1bnN1cHBvcnRlZCAobXVzdCBnbyBiZWZvcmUgcGxhaW4gb2JqZWN0IHR3ZWFrZXIpXG4gIGlmIChpc0RhdGFNb2RlbCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgXCJkYXRhIG1vZGVscyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZC4geW91IG1heSBpbnNlcnQgdGhlIGRhdGEgaW4gdGhlIHRyZWUgaW5zdGVhZCAoJyQnIHByb3BlcnR5KS5cIlxuICAgIClcbiAgfVxuXG4gIHJlZ2lzdGVyRGVmYXVsdFR3ZWFrZXJzKClcblxuICBjb25zdCB0d2Vha2Vyc0xlbiA9IHR3ZWFrZXJzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHR3ZWFrZXJzTGVuOyBpKyspIHtcbiAgICBjb25zdCB7IHR3ZWFrZXIgfSA9IHR3ZWFrZXJzW2ldXG4gICAgY29uc3QgdHdlYWtlZFZhbCA9IHR3ZWFrZXIodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgaWYgKHR3ZWFrZWRWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHR3ZWFrZWRWYWxcbiAgICB9XG4gIH1cblxuICAvLyB1bnN1cHBvcnRlZFxuICBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm1hcHMgYXJlIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQuIGNvbnNpZGVyIHVzaW5nICdPYmplY3RNYXAnIC8gJ2FzTWFwJyBpbnN0ZWFkLlwiKVxuICB9XG5cbiAgLy8gdW5zdXBwb3J0ZWRcbiAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJzZXRzIGFyZSBub3QgZGlyZWN0bHkgc3VwcG9ydGVkLiBjb25zaWRlciB1c2luZyAnQXJyYXlTZXQnIC8gJ2FzU2V0JyBpbnN0ZWFkLlwiKVxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShcbiAgICBgdHdlYWsgY2FuIG9ubHkgd29yayBvdmVyIG1vZGVscywgb2JzZXJ2YWJsZSBvYmplY3RzL2FycmF5cywgb3IgcHJpbWl0aXZlcywgYnV0IGdvdCAke3ZhbHVlfSBpbnN0ZWFkYFxuICApXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCB0d2VhayA9IGFjdGlvbihcInR3ZWFrXCIsIGludGVybmFsVHdlYWspXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlVbnR3ZWFrKHZhbHVlOiBhbnkpIHtcbiAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICBpZiAoZmFzdEdldFBhcmVudCh2YWx1ZSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiBvYmplY3QgY2Fubm90IGJlIHVudHdlYWtlZCB3aGlsZSBpdCBoYXMgYSBwYXJlbnRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCB1bnR3ZWFrZXIgPSB0d2Vha2VkT2JqZWN0cy5nZXQodmFsdWUpXG4gIGlmICghdW50d2Vha2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB3ZSBoYXZlIHRvIG1ha2UgYSBjb3B5IHNpbmNlIGl0IHdpbGwgYmUgY2hhbmdlZFxuICAvLyB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3Vyc2VsdmVzIHNpbmNlIGl0IHNlZW1zIGxpa2UgYmFiZWwgZG9lcyBub3QgZG8gZG93bmxldmVsIGl0ZXJhdGlvblxuICBjb25zdCBjaGlsZHJlbiA9IFtdXG4gIGNvbnN0IGNoaWxkcmVuSXRlciA9IGdldE9iamVjdENoaWxkcmVuKHZhbHVlKSEudmFsdWVzKClcbiAgbGV0IGNoaWxkcmVuQ3VyID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB3aGlsZSAoIWNoaWxkcmVuQ3VyLmRvbmUpIHtcbiAgICBjaGlsZHJlbi5wdXNoKGNoaWxkcmVuQ3VyLnZhbHVlKVxuICAgIGNoaWxkcmVuQ3VyID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHNldFBhcmVudCh7XG4gICAgICB2YWx1ZTogY2hpbGRyZW5baV0sXG4gICAgICBwYXJlbnRQYXRoOiB1bmRlZmluZWQsXG4gICAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICAgIC8vIG5vIG5lZWQgdG8gY2xvbmUgaWYgdW5zZXR0aW5nIHRoZSBwYXJlbnRcbiAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcbiAgICB9KVxuICB9XG5cbiAgdW50d2Vha2VyKClcblxuICB0d2Vha2VkT2JqZWN0cy5kZWxldGUodmFsdWUpXG4gIHVuc2V0SW50ZXJuYWxTbmFwc2hvdCh2YWx1ZSlcbiAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCB7XHJcbiAgSUFycmF5V2lsbENoYW5nZSxcclxuICBJQXJyYXlXaWxsU3BsaWNlLFxyXG4gIGludGVyY2VwdCxcclxuICBJT2JzZXJ2YWJsZUFycmF5LFxyXG4gIGlzT2JzZXJ2YWJsZUFycmF5LFxyXG4gIG9ic2VydmFibGUsXHJcbiAgb2JzZXJ2ZSxcclxuICBzZXQsXHJcbn0gZnJvbSBcIm1vYnhcIlxyXG5pbXBvcnQgeyBhc3NlcnRDYW5Xcml0ZSB9IGZyb20gXCIuLi9hY3Rpb24vcHJvdGVjdGlvblwiXHJcbmltcG9ydCB7IGdldEdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9nbG9iYWxDb25maWdcIlxyXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxyXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXHJcbmltcG9ydCB7IEludGVybmFsUGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaC9lbWl0UGF0Y2hcIlxyXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4uL3BhdGNoL1BhdGNoXCJcclxuaW1wb3J0IHtcclxuICBmcmVlemVJbnRlcm5hbFNuYXBzaG90LFxyXG4gIGdldEludGVybmFsU25hcHNob3QsXHJcbiAgc2V0TmV3SW50ZXJuYWxTbmFwc2hvdCxcclxuICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90LFxyXG59IGZyb20gXCIuLi9zbmFwc2hvdC9pbnRlcm5hbFwiXHJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNBcnJheSwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzLCB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxyXG5pbXBvcnQgeyByZWdpc3RlclR3ZWFrZXIsIHRyeVVudHdlYWssIHR3ZWFrIH0gZnJvbSBcIi4vdHdlYWtcIlxyXG5pbXBvcnQgeyBUd2Vha2VyUHJpb3JpdHkgfSBmcm9tIFwiLi9Ud2Vha2VyUHJpb3JpdHlcIlxyXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuL3R5cGVDaGVja2luZ1wiXHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHdlYWtBcnJheTxUIGV4dGVuZHMgYW55W10+KFxyXG4gIHZhbHVlOiBULFxyXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcclxuICBkb05vdFR3ZWFrQ2hpbGRyZW46IGJvb2xlYW5cclxuKTogVCB7XHJcbiAgY29uc3Qgb3JpZ2luYWxBcnI6IFJlYWRvbmx5QXJyYXk8YW55PiA9IHZhbHVlXHJcbiAgY29uc3QgYXJyTG4gPSBvcmlnaW5hbEFyci5sZW5ndGhcclxuICBjb25zdCB0d2Vha2VkQXJyID0gaXNPYnNlcnZhYmxlQXJyYXkob3JpZ2luYWxBcnIpXHJcbiAgICA/IG9yaWdpbmFsQXJyXHJcbiAgICA6IG9ic2VydmFibGUuYXJyYXkoW10sIG9ic2VydmFibGVPcHRpb25zKVxyXG4gIGlmICh0d2Vha2VkQXJyICE9PSBvcmlnaW5hbEFycikge1xyXG4gICAgdHdlYWtlZEFyci5sZW5ndGggPSBvcmlnaW5hbEFyci5sZW5ndGhcclxuICB9XHJcblxyXG4gIGxldCBpbnRlcmNlcHREaXNwb3NlcjogKCkgPT4gdm9pZFxyXG4gIGxldCBvYnNlcnZlRGlzcG9zZXI6ICgpID0+IHZvaWRcclxuXHJcbiAgY29uc3QgdW50d2VhayA9ICgpID0+IHtcclxuICAgIGludGVyY2VwdERpc3Bvc2VyKClcclxuICAgIG9ic2VydmVEaXNwb3NlcigpXHJcbiAgfVxyXG5cclxuICB0d2Vha2VkT2JqZWN0cy5zZXQodHdlYWtlZEFyciwgdW50d2VhaylcclxuICBzZXRQYXJlbnQoe1xyXG4gICAgdmFsdWU6IHR3ZWFrZWRBcnIsXHJcbiAgICBwYXJlbnRQYXRoLFxyXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcclxuICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXHJcbiAgICAvLyBhcnJheXMgc2hvdWxkbid0IGJlIGNsb25lZCBhbnl3YXlcclxuICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcclxuICB9KVxyXG5cclxuICBjb25zdCB1bnRyYW5zZm9ybWVkU246IGFueVtdID0gW11cclxuICB1bnRyYW5zZm9ybWVkU24ubGVuZ3RoID0gYXJyTG5cclxuXHJcbiAgLy8gc3Vic3RpdHV0ZSBpbml0aWFsIHZhbHVlcyBieSBwcm94aWVkIHZhbHVlc1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyTG47IGkrKykge1xyXG4gICAgY29uc3QgdiA9IG9yaWdpbmFsQXJyW2ldXHJcblxyXG4gICAgaWYgKGlzUHJpbWl0aXZlKHYpKSB7XHJcbiAgICAgIGlmICghZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XHJcbiAgICAgICAgc2V0KHR3ZWFrZWRBcnIsIGksIHYpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHVudHJhbnNmb3JtZWRTbltpXSA9IHZcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBhdGggPSB7IHBhcmVudDogdHdlYWtlZEFyciwgcGF0aDogaSB9XHJcblxyXG4gICAgICBsZXQgdHdlYWtlZFZhbHVlXHJcbiAgICAgIGlmIChkb05vdFR3ZWFrQ2hpbGRyZW4pIHtcclxuICAgICAgICB0d2Vha2VkVmFsdWUgPSB2XHJcbiAgICAgICAgc2V0UGFyZW50KHtcclxuICAgICAgICAgIHZhbHVlOiB0d2Vha2VkVmFsdWUsXHJcbiAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxyXG4gICAgICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcclxuICAgICAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXHJcbiAgICAgICAgICAvLyB0aGUgdmFsdWUgaXMgYWxyZWFkeSBhIG5ldyB2YWx1ZSAodGhlIHJlc3VsdCBvZiBhIGZyb21TbmFwc2hvdClcclxuICAgICAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHR3ZWFrZWRWYWx1ZSA9IHR3ZWFrKHYsIHBhdGgpXHJcbiAgICAgICAgc2V0KHR3ZWFrZWRBcnIsIGksIHR3ZWFrZWRWYWx1ZSlcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdmFsdWVTbiA9IGdldEludGVybmFsU25hcHNob3QodHdlYWtlZFZhbHVlKSFcclxuICAgICAgdW50cmFuc2Zvcm1lZFNuW2ldID0gdmFsdWVTbi50cmFuc2Zvcm1lZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0TmV3SW50ZXJuYWxTbmFwc2hvdCh0d2Vha2VkQXJyLCB1bnRyYW5zZm9ybWVkU24sIHVuZGVmaW5lZClcclxuXHJcbiAgaW50ZXJjZXB0RGlzcG9zZXIgPSBpbnRlcmNlcHQodHdlYWtlZEFyciwgaW50ZXJjZXB0QXJyYXlNdXRhdGlvbi5iaW5kKHVuZGVmaW5lZCwgdHdlYWtlZEFycikpXHJcbiAgb2JzZXJ2ZURpc3Bvc2VyID0gb2JzZXJ2ZSh0d2Vha2VkQXJyLCBhcnJheURpZENoYW5nZSlcclxuXHJcbiAgcmV0dXJuIHR3ZWFrZWRBcnIgYXMgYW55XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5RGlkQ2hhbmdlKGNoYW5nZTogYW55IC8qSUFycmF5RGlkQ2hhbmdlKi8pIHtcclxuICBjb25zdCBhcnIgPSBjaGFuZ2Uub2JqZWN0XHJcbiAgbGV0IHsgdW50cmFuc2Zvcm1lZDogb2xkU25hcHNob3QgfSA9IGdldEludGVybmFsU25hcHNob3QoYXJyIGFzIEFycmF5PGFueT4pIVxyXG5cclxuICBjb25zdCBwYXRjaFJlY29yZGVyID0gbmV3IEludGVybmFsUGF0Y2hSZWNvcmRlcigpXHJcblxyXG4gIGxldCBtdXRhdGU6ICgoc246IGFueVtdKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxyXG5cclxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XHJcbiAgICBjYXNlIFwic3BsaWNlXCI6XHJcbiAgICAgIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNoYW5nZS5pbmRleFxyXG4gICAgICAgIGNvbnN0IGFkZGVkQ291bnQgPSBjaGFuZ2UuYWRkZWRDb3VudFxyXG4gICAgICAgIGNvbnN0IHJlbW92ZWRDb3VudCA9IGNoYW5nZS5yZW1vdmVkQ291bnRcclxuXHJcbiAgICAgICAgbGV0IGFkZGVkSXRlbXM6IGFueVtdID0gW11cclxuICAgICAgICBhZGRlZEl0ZW1zLmxlbmd0aCA9IGFkZGVkQ291bnRcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGVkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdiA9IGNoYW5nZS5hZGRlZFtpXVxyXG4gICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHYpKSB7XHJcbiAgICAgICAgICAgIGFkZGVkSXRlbXNbaV0gPSB2XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhZGRlZEl0ZW1zW2ldID0gZ2V0SW50ZXJuYWxTbmFwc2hvdCh2KSEudHJhbnNmb3JtZWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZExlbiA9IG9sZFNuYXBzaG90Lmxlbmd0aFxyXG4gICAgICAgIG11dGF0ZSA9IChuZXdTbmFwc2hvdCkgPT4ge1xyXG4gICAgICAgICAgbmV3U25hcHNob3Quc3BsaWNlKGluZGV4LCByZW1vdmVkQ291bnQsIC4uLmFkZGVkSXRlbXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgICAgICBjb25zdCBpbnZQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuXHJcbiAgICAgICAgLy8gb3B0aW1pemF0aW9uOiBpZiB3ZSBhZGQgYXMgbWFueSBhcyB3ZSByZW1vdmUgdGhlbiByZW1vdmUvcmVhZGQgaW5zdGVhZFxyXG5cclxuICAgICAgICAvLyB3ZSBjYW5ub3QgcmVwbGFjZSBzaW5jZSB3ZSBtaWdodCBlbmQgdXAgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIHNhbWUgbm9kZVxyXG4gICAgICAgIC8vIG1pZ2h0IGF0dGVtcHQgdG8gYmUgdGVtcG9yYXJpbHkgdHdpY2UgaW5zaWRlIHRoZSBzYW1lIHRyZWUgKGUuZy4gc29ydGluZylcclxuXHJcbiAgICAgICAgLy8gaXQgd291bGQgYmUgZmFzdGVyIHRvIGtlZXAgaG9sZXMgcmF0aGVyIHRoYW4gcmVtb3ZlL3JlYWRkLCBidXQgaWYgd2UgZG8gdGhhdCB0aGVuXHJcbiAgICAgICAgLy8gdmFsaWRhdGlvbiBtaWdodCBmYWlsXHJcblxyXG4gICAgICAgIGlmIChhZGRlZENvdW50ID09PSByZW1vdmVkQ291bnQpIHtcclxuICAgICAgICAgIGNvbnN0IHJlYWRkUGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICAgICAgICBjb25zdCByZWFkZEludlBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gICAgICAgICAgbGV0IHJlbW92ZWQgPSAwXHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRlZENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmVhbEluZGV4ID0gaW5kZXggKyBpXHJcblxyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWwgPSBnZXRWYWx1ZUFmdGVyU3BsaWNlKFxyXG4gICAgICAgICAgICAgIG9sZFNuYXBzaG90LFxyXG4gICAgICAgICAgICAgIHJlYWxJbmRleCxcclxuICAgICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgICByZW1vdmVkQ291bnQsXHJcbiAgICAgICAgICAgICAgYWRkZWRJdGVtc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFNuYXBzaG90W3JlYWxJbmRleF1cclxuXHJcbiAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG9sZFZhbCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZVBhdGggPSBbcmVhbEluZGV4IC0gcmVtb3ZlZF1cclxuICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiByZW1vdmVQYXRoLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgaW52UGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogcmVtb3ZlUGF0aCxcclxuICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICByZW1vdmVkKytcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgcmVhZGRQYXRoID0gW3JlYWxJbmRleF1cclxuICAgICAgICAgICAgICByZWFkZFBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IHJlYWRkUGF0aCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG5ld1ZhbCksXHJcbiAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgcmVhZGRJbnZQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiByZWFkZFBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goLi4ucmVhZGRQYXRjaGVzKVxyXG4gICAgICAgICAgaW52UGF0Y2hlcy5wdXNoKC4uLnJlYWRkSW52UGF0Y2hlcylcclxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmV2ZXJzZSBzaW5jZSBpbnZlcnNlIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZVxyXG4gICAgICAgICAgaW52UGF0Y2hlcy5yZXZlcnNlKClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaW50ZXJpbUxlbiA9IG9sZExlbiAtIHJlbW92ZWRDb3VudFxyXG5cclxuICAgICAgICAgIC8vIGZpcnN0IHJlbW92ZSBpdGVtc1xyXG4gICAgICAgICAgaWYgKHJlbW92ZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCB3aGVuIHJlbW92aW5nIGZyb20gdGhlIGVuZCBzZXQgdGhlIGxlbmd0aCBpbnN0ZWFkXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZVVzaW5nU2V0TGVuZ3RoID0gaW5kZXggPj0gaW50ZXJpbUxlblxyXG4gICAgICAgICAgICBpZiAocmVtb3ZlVXNpbmdTZXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogW1wibGVuZ3RoXCJdLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGludGVyaW1MZW4sXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlbW92ZWRDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVhbEluZGV4ID0gaW5kZXggKyBpXHJcbiAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IFtyZWFsSW5kZXhdXHJcblxyXG4gICAgICAgICAgICAgIGlmICghcmVtb3ZlVXNpbmdTZXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSAuLi4yLCAxLCAwXHJcbiAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBhZGQgMCwgMSwgMi4uLiBzaW5jZSBpbnZlcnNlIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZVxyXG4gICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRTbmFwc2hvdFtyZWFsSW5kZXhdKSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gdGhlbiBhZGQgaXRlbXNcclxuICAgICAgICAgIGlmIChhZGRlZENvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGZvciBpbnZlcnNlIHBhdGNoZXMsIHdoZW4gYWRkaW5nIGZyb20gdGhlIGVuZCBzZXQgdGhlIGxlbmd0aCB0byByZXN0b3JlIGluc3RlYWRcclxuICAgICAgICAgICAgY29uc3QgcmVzdG9yZVVzaW5nU2V0TGVuZ3RoID0gaW5kZXggPj0gaW50ZXJpbUxlblxyXG4gICAgICAgICAgICBpZiAocmVzdG9yZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgaW52UGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IFtcImxlbmd0aFwiXSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBpbnRlcmltTGVuLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkZWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVhbEluZGV4ID0gaW5kZXggKyBpXHJcbiAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IFtyZWFsSW5kZXhdXHJcblxyXG4gICAgICAgICAgICAgIC8vIGFkZCAwLCAxLCAyLi4uXHJcbiAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KFxyXG4gICAgICAgICAgICAgICAgICBnZXRWYWx1ZUFmdGVyU3BsaWNlKG9sZFNuYXBzaG90LCByZWFsSW5kZXgsIGluZGV4LCByZW1vdmVkQ291bnQsIGFkZGVkSXRlbXMpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSAuLi4yLCAxLCAwIHNpbmNlIGludmVyc2UgcGF0Y2hlcyBhcmUgYXBwbGllZCBpbiByZXZlcnNlXHJcbiAgICAgICAgICAgICAgaWYgKCFyZXN0b3JlVXNpbmdTZXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKHBhdGNoZXMsIGludlBhdGNoZXMpXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgIHtcclxuICAgICAgICBjb25zdCBrID0gY2hhbmdlLmluZGV4XHJcbiAgICAgICAgY29uc3QgdmFsID0gY2hhbmdlLm5ld1ZhbHVlXHJcbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2xkU25hcHNob3Rba11cclxuICAgICAgICBsZXQgbmV3VmFsOiBhbnlcclxuICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xyXG4gICAgICAgICAgbmV3VmFsID0gdmFsXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbCkhXHJcbiAgICAgICAgICBuZXdWYWwgPSB2YWx1ZVNuLnRyYW5zZm9ybWVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG11dGF0ZSA9IChuZXdTbmFwc2hvdCkgPT4ge1xyXG4gICAgICAgICAgbmV3U25hcHNob3Rba10gPSBuZXdWYWxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBba11cclxuXHJcbiAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG9sZFZhbCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShhcnIsIHBhdGNoUmVjb3JkZXIpXHJcblxyXG4gIGlmICghcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyAmJiBtdXRhdGUpIHtcclxuICAgIHVwZGF0ZUludGVybmFsU25hcHNob3QoYXJyLCBtdXRhdGUpXHJcbiAgICBwYXRjaFJlY29yZGVyLmVtaXQoYXJyKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgdW5kZWZpbmVkSW5zaWRlQXJyYXlFcnJvck1zZyA9XHJcbiAgXCJ1bmRlZmluZWQgaXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXJyYXlzIHNpbmNlIGl0IGlzIG5vdCBzZXJpYWxpemFibGUgaW4gSlNPTiwgY29uc2lkZXIgdXNpbmcgbnVsbCBpbnN0ZWFkXCJcclxuXHJcbi8vIFRPRE86IHJlbW92ZSBhcnJheSBwYXJhbWV0ZXIgYW5kIGp1c3QgdXNlIGNoYW5nZS5vYmplY3Qgb25jZSBtb2J4IHVwZGF0ZSBldmVudCBpcyBmaXhlZFxyXG5mdW5jdGlvbiBpbnRlcmNlcHRBcnJheU11dGF0aW9uKFxyXG4gIGFycmF5OiBJT2JzZXJ2YWJsZUFycmF5LFxyXG4gIGNoYW5nZTogSUFycmF5V2lsbENoYW5nZSB8IElBcnJheVdpbGxTcGxpY2VcclxuKSB7XHJcbiAgYXNzZXJ0Q2FuV3JpdGUoKVxyXG5cclxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XHJcbiAgICBjYXNlIFwic3BsaWNlXCI6XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaW5EZXZNb2RlKCkgJiYgIWdldEdsb2JhbENvbmZpZygpLmFsbG93VW5kZWZpbmVkQXJyYXlFbGVtZW50cykge1xyXG4gICAgICAgICAgY29uc3QgbGVuID0gY2hhbmdlLmFkZGVkLmxlbmd0aFxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2ID0gY2hhbmdlLmFkZGVkW2ldXHJcbiAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBmYWlsdXJlKHVuZGVmaW5lZEluc2lkZUFycmF5RXJyb3JNc2cpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLnJlbW92ZWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVkVmFsdWUgPSBjaGFuZ2Uub2JqZWN0W2NoYW5nZS5pbmRleCArIGldXHJcbiAgICAgICAgICB0d2VhayhyZW1vdmVkVmFsdWUsIHVuZGVmaW5lZClcclxuICAgICAgICAgIHRyeVVudHdlYWsocmVtb3ZlZFZhbHVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuYWRkZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNoYW5nZS5hZGRlZFtpXSA9IHR3ZWFrKGNoYW5nZS5hZGRlZFtpXSwge1xyXG4gICAgICAgICAgICBwYXJlbnQ6IGNoYW5nZS5vYmplY3QsXHJcbiAgICAgICAgICAgIHBhdGg6IGNoYW5nZS5pbmRleCArIGksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gd2UgbWlnaHQgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgcGFyZW50IG9mIHRoZSBuZXh0IGluZGV4ZXNcclxuICAgICAgICBjb25zdCBvbGROZXh0SW5kZXggPSBjaGFuZ2UuaW5kZXggKyBjaGFuZ2UucmVtb3ZlZENvdW50XHJcbiAgICAgICAgY29uc3QgbmV3TmV4dEluZGV4ID0gY2hhbmdlLmluZGV4ICsgY2hhbmdlLmFkZGVkLmxlbmd0aFxyXG5cclxuICAgICAgICBpZiAob2xkTmV4dEluZGV4ICE9PSBuZXdOZXh0SW5kZXgpIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSBvbGROZXh0SW5kZXgsIGogPSBuZXdOZXh0SW5kZXg7IGkgPCBjaGFuZ2Uub2JqZWN0Lmxlbmd0aDsgaSsrLCBqKyspIHtcclxuICAgICAgICAgICAgc2V0UGFyZW50KHtcclxuICAgICAgICAgICAgICB2YWx1ZTogY2hhbmdlLm9iamVjdFtpXSxcclxuICAgICAgICAgICAgICBwYXJlbnRQYXRoOiB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoYW5nZS5vYmplY3QsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBqLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiB0cnVlLFxyXG4gICAgICAgICAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgLy8ganVzdCByZS1pbmRleGluZ1xyXG4gICAgICAgICAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgIGlmIChcclxuICAgICAgICBpbkRldk1vZGUoKSAmJlxyXG4gICAgICAgICFnZXRHbG9iYWxDb25maWcoKS5hbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHMgJiZcclxuICAgICAgICBjaGFuZ2UubmV3VmFsdWUgPT09IHVuZGVmaW5lZFxyXG4gICAgICApIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKHVuZGVmaW5lZEluc2lkZUFycmF5RXJyb3JNc2cpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRPRE86IHNob3VsZCBiZSBjaGFuZ2Uub2JqZWN0LCBidXQgbW9ieCBpcyBidWdnZWQgYW5kIGRvZXNuJ3Qgc2VuZCB0aGUgcHJveHlcclxuICAgICAgY29uc3Qgb2xkVmFsID0gYXJyYXlbY2hhbmdlLmluZGV4XVxyXG4gICAgICB0d2VhayhvbGRWYWwsIHVuZGVmaW5lZCkgLy8gc2V0IG9sZCBwcm9wIG9iaiBwYXJlbnQgdG8gdW5kZWZpbmVkXHJcbiAgICAgIHRyeVVudHdlYWsob2xkVmFsKVxyXG5cclxuICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHdlYWsoY2hhbmdlLm5ld1ZhbHVlLCB7IHBhcmVudDogYXJyYXksIHBhdGg6IGNoYW5nZS5pbmRleCB9KVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuICByZXR1cm4gY2hhbmdlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFycmF5VHdlYWtlcigpIHtcclxuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5LkFycmF5LCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcclxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdHdlYWtBcnJheSh2YWx1ZSwgcGFyZW50UGF0aCwgZmFsc2UpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgb2JzZXJ2YWJsZU9wdGlvbnMgPSB7XHJcbiAgZGVlcDogZmFsc2UsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFZhbHVlQWZ0ZXJTcGxpY2U8VD4oXHJcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcclxuICBpOiBudW1iZXIsXHJcbiAgaW5kZXg6IG51bWJlcixcclxuICByZW1vdmU6IG51bWJlcixcclxuICBhZGRlZEl0ZW1zOiByZWFkb25seSBUW11cclxuKSB7XHJcbiAgY29uc3QgYmFzZSA9IGkgLSBpbmRleFxyXG4gIGlmIChiYXNlIDwgMCkge1xyXG4gICAgcmV0dXJuIGFycmF5W2ldXHJcbiAgfVxyXG5cclxuICBpZiAoYmFzZSA8IGFkZGVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gYWRkZWRJdGVtc1tiYXNlXVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGFycmF5W2kgLSBhZGRlZEl0ZW1zLmxlbmd0aCArIHJlbW92ZV1cclxufVxyXG4iLCJpbXBvcnQgeyBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgdHdlYWtBcnJheSB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrQXJyYXlcIlxuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQge1xuICBGcm9tU25hcHNob3RDb250ZXh0LFxuICBpbnRlcm5hbEZyb21TbmFwc2hvdCxcbiAgb2JzZXJ2YWJsZU9wdGlvbnMsXG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIsXG59IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBTbmFwc2hvdEluT2ZPYmplY3QgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiBmcm9tQXJyYXlTbmFwc2hvdChzbjogU25hcHNob3RJbk9mT2JqZWN0PGFueT4sIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCk6IGFueVtdIHtcbiAgY29uc3QgYXJyID0gb2JzZXJ2YWJsZS5hcnJheShbXSBhcyBhbnlbXSwgb2JzZXJ2YWJsZU9wdGlvbnMpXG4gIGNvbnN0IGxuID0gc24ubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG47IGkrKykge1xuICAgIGFyci5wdXNoKGludGVybmFsRnJvbVNuYXBzaG90KHNuW2ldLCBjdHgpKVxuICB9XG4gIHJldHVybiB0d2Vha0FycmF5KGFyciwgdW5kZWZpbmVkLCB0cnVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tQXJyYXlTbmFwc2hvdHRlcigpIHtcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5BcnJheSwgKHNuLCBjdHgpID0+IHtcbiAgICBpZiAoaXNBcnJheShzbikpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlTbmFwc2hvdChzbiwgY3R4KVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBmcm96ZW4sIGlzRnJvemVuU25hcHNob3QgfSBmcm9tIFwiLi4vZnJvemVuL0Zyb3plblwiXG5pbXBvcnQgeyByZWdpc3RlclNuYXBzaG90dGVyIH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tRnJvemVuU25hcHNob3R0ZXIoKSB7XG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuRnJvemVuLCAoc24pID0+IHtcbiAgICBpZiAoaXNGcm96ZW5TbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiBmcm96ZW4oc24uZGF0YSlcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHsgaXNNb2RlbFNuYXBzaG90IH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgRnJvbVNuYXBzaG90Q29udGV4dCwgcmVnaXN0ZXJTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBTbmFwc2hvdEluT2ZNb2RlbCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIGZyb21Nb2RlbFNuYXBzaG90KHNuOiBTbmFwc2hvdEluT2ZNb2RlbDxBbnlNb2RlbD4sIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCk6IEFueU1vZGVsIHtcbiAgY29uc3QgdHlwZSA9IHNuW21vZGVsVHlwZUtleV1cblxuICBpZiAoIXR5cGUpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBhIG1vZGVsIHNuYXBzaG90IG11c3QgY29udGFpbiBhIHR5cGUga2V5ICgke21vZGVsVHlwZUtleX0pLCBidXQgbm9uZSB3YXMgZm91bmRgKVxuICB9XG5cbiAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZSh0eXBlKVxuICBpZiAoIW1vZGVsSW5mbykge1xuICAgIHRocm93IGZhaWx1cmUoYG1vZGVsIHdpdGggbmFtZSBcIiR7dHlwZX1cIiBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5YClcbiAgfVxuXG4gIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPilcbiAgaWYgKG1vZGVsSWRQcm9wZXJ0eU5hbWUgJiYgKHNuIGFzIGFueSlbbW9kZWxJZFByb3BlcnR5TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgYSBtb2RlbCBzbmFwc2hvdCBvZiB0eXBlICcke3R5cGV9JyBtdXN0IGNvbnRhaW4gYW4gaWQga2V5ICgke21vZGVsSWRQcm9wZXJ0eU5hbWV9KSwgYnV0IG5vbmUgd2FzIGZvdW5kYFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBuZXcgKG1vZGVsSW5mby5jbGFzcyBhcyBhbnkpKHVuZGVmaW5lZCwge1xuICAgIHNuYXBzaG90SW5pdGlhbERhdGE6IHtcbiAgICAgIHVucHJvY2Vzc2VkU25hcHNob3Q6IHNuLFxuICAgICAgc25hcHNob3RUb0luaXRpYWxEYXRhOiBjdHguc25hcHNob3RUb0luaXRpYWxEYXRhLFxuICAgIH0sXG4gICAgZ2VuZXJhdGVOZXdJZHM6IGN0eC5vcHRpb25zLmdlbmVyYXRlTmV3SWRzLFxuICB9IGFzIE1vZGVsQ29uc3RydWN0b3JPcHRpb25zKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tTW9kZWxTbmFwc2hvdHRlcigpIHtcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5Nb2RlbCwgKHNuLCBjdHgpID0+IHtcbiAgICBpZiAoaXNNb2RlbFNuYXBzaG90KHNuKSkge1xuICAgICAgcmV0dXJuIGZyb21Nb2RlbFNuYXBzaG90KHNuLCBjdHgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IG9ic2VydmFibGUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHR3ZWFrUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1BsYWluT2JqZWN0XCJcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgRnJvbVNuYXBzaG90Q29udGV4dCxcbiAgaW50ZXJuYWxGcm9tU25hcHNob3QsXG4gIG9ic2VydmFibGVPcHRpb25zLFxuICByZWdpc3RlclNuYXBzaG90dGVyLFxufSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgU25hcHNob3RJbk9mT2JqZWN0IH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gZnJvbVBsYWluT2JqZWN0U25hcHNob3Qoc246IFNuYXBzaG90SW5PZk9iamVjdDxhbnk+LCBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQpOiBvYmplY3Qge1xuICBjb25zdCBwbGFpbk9iaiA9IG9ic2VydmFibGUub2JqZWN0KHt9LCB1bmRlZmluZWQsIG9ic2VydmFibGVPcHRpb25zKVxuXG4gIGNvbnN0IHNuS2V5cyA9IE9iamVjdC5rZXlzKHNuKVxuICBjb25zdCBzbktleXNMZW4gPSBzbktleXMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc25LZXlzTGVuOyBpKyspIHtcbiAgICBjb25zdCBrID0gc25LZXlzW2ldXG4gICAgY29uc3QgdiA9IHNuW2tdXG4gICAgc2V0KHBsYWluT2JqLCBrLCBpbnRlcm5hbEZyb21TbmFwc2hvdCh2LCBjdHgpKVxuICB9XG4gIHJldHVybiB0d2Vha1BsYWluT2JqZWN0KHBsYWluT2JqLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZyb21QbGFpbk9iamVjdFNuYXBzaG90dGVyKCkge1xuICByZWdpc3RlclNuYXBzaG90dGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LlBsYWluT2JqZWN0LCAoc24sIGN0eCkgPT4ge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHNuKSkge1xuICAgICAgcmV0dXJuIGZyb21QbGFpbk9iamVjdFNuYXBzaG90KHNuLCBjdHgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyRnJvbUFycmF5U25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tQXJyYXlTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckZyb21Gcm96ZW5TbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21Gcm96ZW5TbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckZyb21Nb2RlbFNuYXBzaG90dGVyIH0gZnJvbSBcIi4vZnJvbU1vZGVsU25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm9tUGxhaW5PYmplY3RTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21QbGFpbk9iamVjdFNuYXBzaG90XCJcblxubGV0IGRlZmF1bHRTbmFwc2hvdHRlcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVycygpIHtcbiAgaWYgKGRlZmF1bHRTbmFwc2hvdHRlcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdFNuYXBzaG90dGVyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgcmVnaXN0ZXJGcm9tQXJyYXlTbmFwc2hvdHRlcigpXG4gIHJlZ2lzdGVyRnJvbUZyb3plblNuYXBzaG90dGVyKClcbiAgcmVnaXN0ZXJGcm9tTW9kZWxTbmFwc2hvdHRlcigpXG4gIHJlZ2lzdGVyRnJvbVBsYWluT2JqZWN0U25hcHNob3R0ZXIoKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBvYnNlcnZhYmxlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBpc1Jlc2VydmVkTW9kZWxLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3R5cGVzL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcbmltcG9ydCB7IGlzTGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc01hcCwgaXNQcmltaXRpdmUsIGlzU2V0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVycyB9IGZyb20gXCIuL3JlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVyc1wiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZiwgU25hcHNob3RJbk9mTW9kZWwsIFNuYXBzaG90T3V0T2YgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgU25hcHNob3R0ZXIgPSAoc246IGFueSwgY3R4OiBGcm9tU25hcHNob3RDb250ZXh0KSA9PiBhbnkgfCB1bmRlZmluZWRcblxuY29uc3Qgc25hcHNob3R0ZXJzOiB7IHByaW9yaXR5OiBudW1iZXI7IHNuYXBzaG90dGVyOiBTbmFwc2hvdHRlciB9W10gPSBbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTbmFwc2hvdHRlcihwcmlvcml0eTogbnVtYmVyLCBzbmFwc2hvdHRlcjogU25hcHNob3R0ZXIpOiB2b2lkIHtcbiAgc25hcHNob3R0ZXJzLnB1c2goeyBwcmlvcml0eSwgc25hcHNob3R0ZXIgfSlcbiAgc25hcHNob3R0ZXJzLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxufVxuXG4vKipcbiAqIEZyb20gc25hcHNob3Qgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcm9tU25hcHNob3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhc3MgYHRydWVgIHRvIGdlbmVyYXRlIG5ldyBpbnRlcm5hbCBpZHMgZm9yIG1vZGVscyByYXRoZXIgdGhhbiByZXVzaW5nIHRoZW0uIChEZWZhdWx0IGlzIGBmYWxzZWApXG4gICAqL1xuICBnZW5lcmF0ZU5ld0lkczogYm9vbGVhblxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyb21TbmFwc2hvdENvbnRleHQge1xuICBvcHRpb25zOiBGcm9tU25hcHNob3RPcHRpb25zXG4gIHNuYXBzaG90VG9Jbml0aWFsRGF0YShwcm9jZXNzZWRTbjogU25hcHNob3RJbk9mTW9kZWw8QW55TW9kZWw+KTogYW55XG59XG5cbi8qKlxuICogR2l2ZW4gYSB0eXBlIGRlc2VyaWFsaXplcyBhIGRhdGEgc3RydWN0dXJlIGZyb20gaXRzIHNuYXBzaG90IGZvcm0uXG4gKlxuICogQHR5cGVwYXJhbSBUVHlwZSBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0eXBlIFR5cGUuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QsIGV2ZW4gaWYgYSBwcmltaXRpdmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU25hcHNob3Q8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbj4oXG4gIHR5cGU6IFRUeXBlLFxuICBzbmFwc2hvdDogU25hcHNob3RJbk9mPFR5cGVUb0RhdGE8VFR5cGU+PixcbiAgb3B0aW9ucz86IFBhcnRpYWw8RnJvbVNuYXBzaG90T3B0aW9ucz5cbik6IFR5cGVUb0RhdGE8VFR5cGU+XG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGEgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBpdHMgc25hcHNob3QgZm9ybS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QsIGV2ZW4gaWYgYSBwcmltaXRpdmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU25hcHNob3Q8VD4oXG4gIHNuYXBzaG90OiBTbmFwc2hvdEluT2Y8VD4gfCBTbmFwc2hvdE91dE9mPFQ+LFxuICBvcHRpb25zPzogUGFydGlhbDxGcm9tU25hcHNob3RPcHRpb25zPlxuKTogVFxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNuYXBzaG90PFQ+KGFyZzE6IGFueSwgYXJnMjogYW55LCBhcmczPzogYW55KTogVCB7XG4gIGxldCBzbmFwc2hvdDogYW55XG4gIGxldCBvcHRpb25zOiBQYXJ0aWFsPEZyb21TbmFwc2hvdE9wdGlvbnM+IHwgdW5kZWZpbmVkXG5cbiAgaWYgKGlzTGF0ZVR5cGVDaGVja2VyKGFyZzEpIHx8IGFyZzEgaW5zdGFuY2VvZiBUeXBlQ2hlY2tlciB8fCBpc01vZGVsQ2xhc3MoYXJnMSkpIHtcbiAgICBjb25zdCB0eXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihhcmcxKVxuICAgIHNuYXBzaG90ID0gdHlwZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yID8gdHlwZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKGFyZzIpIDogYXJnMlxuICAgIG9wdGlvbnMgPSBhcmczXG4gIH0gZWxzZSB7XG4gICAgc25hcHNob3QgPSBhcmcxXG4gICAgb3B0aW9ucyA9IGFyZzJcbiAgfVxuXG4gIHJldHVybiBmcm9tU25hcHNob3RBY3Rpb24oc25hcHNob3QsIG9wdGlvbnMpXG59XG5cbmNvbnN0IGZyb21TbmFwc2hvdEFjdGlvbiA9IGFjdGlvbihcbiAgXCJmcm9tU25hcHNob3RcIixcbiAgPFQ+KHNuYXBzaG90OiBTbmFwc2hvdEluT2Y8VD4sIG9wdGlvbnM/OiBQYXJ0aWFsPEZyb21TbmFwc2hvdE9wdGlvbnM+KTogVCA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGdlbmVyYXRlTmV3SWRzOiBmYWxzZSxcbiAgICAgIG92ZXJyaWRlUm9vdE1vZGVsSWQ6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgY3R4OiBQYXJ0aWFsPEZyb21TbmFwc2hvdENvbnRleHQ+ID0ge1xuICAgICAgb3B0aW9uczogb3B0cyxcbiAgICB9XG4gICAgY3R4LnNuYXBzaG90VG9Jbml0aWFsRGF0YSA9IHNuYXBzaG90VG9Jbml0aWFsRGF0YS5iaW5kKHVuZGVmaW5lZCwgY3R4IGFzIEZyb21TbmFwc2hvdENvbnRleHQpXG5cbiAgICByZXR1cm4gaW50ZXJuYWxGcm9tU25hcHNob3Q8VD4oc25hcHNob3QsIGN0eCBhcyBGcm9tU25hcHNob3RDb250ZXh0KVxuICB9XG4pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEZyb21TbmFwc2hvdDxUPihcbiAgc246IFNuYXBzaG90SW5PZjxUPiB8IFNuYXBzaG90T3V0T2Y8VD4sXG4gIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dFxuKTogVCB7XG4gIGlmIChpc1ByaW1pdGl2ZShzbikpIHtcbiAgICByZXR1cm4gc24gYXMgYW55XG4gIH1cblxuICByZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnMoKVxuXG4gIGNvbnN0IHNuYXBzaG90dGVyTGVuID0gc25hcHNob3R0ZXJzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNuYXBzaG90dGVyTGVuOyBpKyspIHtcbiAgICBjb25zdCB7IHNuYXBzaG90dGVyIH0gPSBzbmFwc2hvdHRlcnNbaV1cbiAgICBjb25zdCByZXQgPSBzbmFwc2hvdHRlcihzbiwgY3R4KVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgfVxuXG4gIGlmIChpc01hcChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIG1hcHNcIilcbiAgfVxuXG4gIGlmIChpc1NldChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIHNldHNcIilcbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIHNuYXBzaG90IC0gJHtzbn1gKVxufVxuXG5mdW5jdGlvbiBzbmFwc2hvdFRvSW5pdGlhbERhdGEoXG4gIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCxcbiAgcHJvY2Vzc2VkU246IFNuYXBzaG90SW5PZk1vZGVsPEFueU1vZGVsPlxuKTogYW55IHtcbiAgY29uc3QgaW5pdGlhbERhdGEgPSBvYnNlcnZhYmxlLm9iamVjdCh7fSwgdW5kZWZpbmVkLCBvYnNlcnZhYmxlT3B0aW9ucylcblxuICBjb25zdCBwcm9jZXNzZWRTbktleXMgPSBPYmplY3Qua2V5cyhwcm9jZXNzZWRTbilcbiAgY29uc3QgcHJvY2Vzc2VkU25LZXlzTGVuID0gcHJvY2Vzc2VkU25LZXlzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZFNuS2V5c0xlbjsgaSsrKSB7XG4gICAgY29uc3QgayA9IHByb2Nlc3NlZFNuS2V5c1tpXVxuICAgIGlmICghaXNSZXNlcnZlZE1vZGVsS2V5KGspKSB7XG4gICAgICBjb25zdCB2ID0gcHJvY2Vzc2VkU25ba11cbiAgICAgIHNldChpbml0aWFsRGF0YSwgaywgaW50ZXJuYWxGcm9tU25hcHNob3QodiwgY3R4KSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluaXRpYWxEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBvYnNlcnZhYmxlT3B0aW9ucyA9IHtcbiAgZGVlcDogZmFsc2UsXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmcm9tU25hcHNob3QgfSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi9nZXRTbmFwc2hvdFwiXG5cbi8qKlxuICogQ2xvbmUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbG9uZU9wdGlvbnMge1xuICAvKipcbiAgICogUGFzcyBgdHJ1ZWAgdG8gZ2VuZXJhdGUgbmV3IGludGVybmFsIGlkcyBmb3IgbW9kZWxzIHJhdGhlciB0aGFuIHJldXNpbmcgdGhlbS4gKERlZmF1bHQgaXMgYHRydWVgKVxuICAgKi9cbiAgZ2VuZXJhdGVOZXdJZHM6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDbG9uZXMgYW4gb2JqZWN0IGJ5IGRvaW5nIGEgYGZyb21TbmFwc2hvdChnZXRTbmFwc2hvdCh2YWx1ZSksIHsgZ2VuZXJhdGVOZXdJZHM6IHRydWUgfSlgLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlIE9iamVjdCB0byBjbG9uZS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBjbG9uZWQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmU8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCwgb3B0aW9ucz86IFBhcnRpYWw8Q2xvbmVPcHRpb25zPik6IFQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgZ2VuZXJhdGVOZXdJZHM6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxuXG4gIGNvbnN0IHNuID0gZ2V0U25hcHNob3Qobm9kZSlcbiAgcmV0dXJuIGZyb21TbmFwc2hvdChzbiwgb3B0cylcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGVucXVldWVQZW5kaW5nQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9wZW5kaW5nQWN0aW9uc1wiXG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGF0dGFjaFRvUm9vdFN0b3JlLCBkZXRhY2hGcm9tUm9vdFN0b3JlIH0gZnJvbSBcIi4uL3Jvb3RTdG9yZS9hdHRhY2hEZXRhY2hcIlxuaW1wb3J0IHsgaXNSb290U3RvcmUgfSBmcm9tIFwiLi4vcm9vdFN0b3JlL3Jvb3RTdG9yZVwiXG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gXCIuLi9zbmFwc2hvdC9jbG9uZVwiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgZGF0YU9iamVjdFBhcmVudCxcbiAgZGF0YVRvTW9kZWxOb2RlLFxuICBvYmplY3RQYXJlbnRzLFxuICBwYXJlbnRQYXRoRXF1YWxzLFxuICByZXBvcnRQYXJlbnRQYXRoQ2hhbmdlZCxcbn0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgeyBhZGRPYmplY3RDaGlsZCwgaW5pdGlhbGl6ZU9iamVjdENoaWxkcmVuLCByZW1vdmVPYmplY3RDaGlsZCB9IGZyb20gXCIuL2NvcmVPYmplY3RDaGlsZHJlblwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aCwgZmFzdEdldFJvb3QsIFBhcmVudFBhdGggfSBmcm9tIFwiLi9wYXRoXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFBhcmVudCA9IGFjdGlvbihcbiAgXCJzZXRQYXJlbnRcIixcbiAgKHtcbiAgICB2YWx1ZSxcbiAgICBwYXJlbnRQYXRoLFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZCxcbiAgICBpc0RhdGFPYmplY3QsXG4gICAgY2xvbmVJZkFwcGxpY2FibGUsXG4gIH06IHtcbiAgICB2YWx1ZTogYW55XG4gICAgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBib29sZWFuXG4gICAgaXNEYXRhT2JqZWN0OiBib29sZWFuXG4gICAgY2xvbmVJZkFwcGxpY2FibGU6IGJvb2xlYW5cbiAgfSk6IGFueSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoaW5kZXhDaGFuZ2VBbGxvd2VkICYmIGNsb25lSWZBcHBsaWNhYmxlKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgXCJhc3NlcnRpb24gZmFpbGVkOiAnaW5kZXhDaGFuZ2VBbGxvd2VkJyBhbmQgJ2Nsb25lSWZBcHBsaWNhYmxlJyBjYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWVcIlxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoYGFzc2VydGlvbiBmYWlsZWQ6IHZhbHVlIGNhbm5vdCBiZSBhIGZ1bmN0aW9uIG9yIGEgc3ltYm9sYClcbiAgICAgIH1cbiAgICAgIGlmICghaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCB0cnVlKSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBhc3NlcnRpb24gZmFpbGVkOiB2YWx1ZSBpcyBub3QgcmVhZHkgdG8gdGFrZSBhIHBhcmVudGApXG4gICAgICB9XG4gICAgICBpZiAocGFyZW50UGF0aCAmJiAhaXNUd2Vha2VkT2JqZWN0KHBhcmVudFBhdGgucGFyZW50LCB0cnVlKSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBhc3NlcnRpb24gZmFpbGVkOiBwYXJlbnQgaXMgbm90IHJlYWR5IHRvIHRha2UgY2hpbGRyZW5gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RhdGFPYmplY3QpIHtcbiAgICAgIGRhdGFPYmplY3RQYXJlbnQuc2V0KHZhbHVlLCBwYXJlbnRQYXRoIS5wYXJlbnQpXG4gICAgICAvLyBkYXRhIG9iamVjdCB3aWxsIHByb3h5IHRvIHVzZSB0aGUgYWN0dWFsIHBhcmVudCBtb2RlbCBmb3IgY2hpbGQvcGFyZW50IHN0dWZmXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBpbml0aWFsaXplT2JqZWN0Q2hpbGRyZW4odmFsdWUpXG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIG5ldyBwYXJlbnQgYWN0dWFsbHkgcG9pbnRzIHRvIG1vZGVscyB3aGVuIHdlIGdpdmUgbW9kZWwgZGF0YSBvYmpzXG4gICAgaWYgKHBhcmVudFBhdGgpIHtcbiAgICAgIGNvbnN0IGFjdHVhbFBhcmVudCA9IGRhdGFUb01vZGVsTm9kZShwYXJlbnRQYXRoLnBhcmVudClcbiAgICAgIGlmIChwYXJlbnRQYXRoLnBhcmVudCAhPT0gYWN0dWFsUGFyZW50KSB7XG4gICAgICAgIHBhcmVudFBhdGggPSB7XG4gICAgICAgICAgcGFyZW50OiBhY3R1YWxQYXJlbnQsXG4gICAgICAgICAgcGF0aDogcGFyZW50UGF0aC5wYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG9sZFBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSlcbiAgICBpZiAocGFyZW50UGF0aEVxdWFscyhvbGRQYXJlbnRQYXRoLCBwYXJlbnRQYXRoKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGlzUm9vdFN0b3JlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcInJvb3Qgc3RvcmVzIGNhbm5vdCBiZSBhdHRhY2hlZCB0byBhbnkgcGFyZW50c1wiKVxuICAgIH1cblxuICAgIC8vIHZhbHVlIHR5cGUgbW9kZWxzIHNob3VsZCBiZSBjbG9uZWQgd2hlbiB0aGV5IGFyZSBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBwYXJlbnRcbiAgICAvLyBhbmQgdGhleSBoYWQgb25lIHByZXZpb3VzbHlcbiAgICBpZiAoXG4gICAgICBjbG9uZUlmQXBwbGljYWJsZSAmJlxuICAgICAgcGFyZW50UGF0aD8ucGFyZW50ICYmXG4gICAgICBvbGRQYXJlbnRQYXRoPy5wYXJlbnQgJiZcbiAgICAgIGlzTW9kZWwodmFsdWUpICYmXG4gICAgICBnZXRNb2RlbE1ldGFkYXRhKHZhbHVlKS52YWx1ZVR5cGVcbiAgICApIHtcbiAgICAgIHZhbHVlID0gY2xvbmUodmFsdWUsIHsgZ2VuZXJhdGVOZXdJZHM6IHRydWUgfSlcbiAgICAgIG9sZFBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSlcbiAgICB9XG5cbiAgICBpZiAob2xkUGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoKSB7XG4gICAgICBpZiAob2xkUGFyZW50UGF0aC5wYXJlbnQgPT09IHBhcmVudFBhdGgucGFyZW50ICYmIGluZGV4Q2hhbmdlQWxsb3dlZCkge1xuICAgICAgICAvLyBqdXN0IGNoYW5naW5nIHRoZSBpbmRleFxuICAgICAgICBvYmplY3RQYXJlbnRzLnNldCh2YWx1ZSwgcGFyZW50UGF0aClcbiAgICAgICAgcmVwb3J0UGFyZW50UGF0aENoYW5nZWQodmFsdWUpXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcImFuIG9iamVjdCBjYW5ub3QgYmUgYXNzaWduZWQgYSBuZXcgcGFyZW50IHdoZW4gaXQgYWxyZWFkeSBoYXMgb25lXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNoVG9OZXdQYXJlbnQgPSAoKSA9PiB7XG4gICAgICAvLyBkZXRhY2ggZnJvbSBvbGRcbiAgICAgIGlmIChvbGRQYXJlbnRQYXRoPy5wYXJlbnQpIHtcbiAgICAgICAgcmVtb3ZlT2JqZWN0Q2hpbGQob2xkUGFyZW50UGF0aC5wYXJlbnQsIHZhbHVlKVxuICAgICAgfVxuXG4gICAgICAvLyBhdHRhY2ggdG8gbmV3XG4gICAgICBvYmplY3RQYXJlbnRzLnNldCh2YWx1ZSwgcGFyZW50UGF0aClcbiAgICAgIGlmIChwYXJlbnRQYXRoPy5wYXJlbnQpIHtcbiAgICAgICAgYWRkT2JqZWN0Q2hpbGQocGFyZW50UGF0aC5wYXJlbnQsIHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVwb3J0UGFyZW50UGF0aENoYW5nZWQodmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmFzZU1vZGVsKSB7XG4gICAgICBjb25zdCBvbGRSb290ID0gZmFzdEdldFJvb3QodmFsdWUpXG4gICAgICBjb25zdCBvbGRSb290U3RvcmUgPSBpc1Jvb3RTdG9yZShvbGRSb290KSA/IG9sZFJvb3QgOiB1bmRlZmluZWRcblxuICAgICAgYXR0YWNoVG9OZXdQYXJlbnQoKVxuXG4gICAgICBjb25zdCBuZXdSb290ID0gZmFzdEdldFJvb3QodmFsdWUpXG4gICAgICBjb25zdCBuZXdSb290U3RvcmUgPSBpc1Jvb3RTdG9yZShuZXdSb290KSA/IG5ld1Jvb3QgOiB1bmRlZmluZWRcblxuICAgICAgLy8gaW52b2tlIG1vZGVsIHJvb3Qgc3RvcmUgZXZlbnRzXG4gICAgICBpZiAob2xkUm9vdFN0b3JlICE9PSBuZXdSb290U3RvcmUgJiYgKG9sZFJvb3RTdG9yZSB8fCBuZXdSb290U3RvcmUpKSB7XG4gICAgICAgIGVucXVldWVQZW5kaW5nQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBpZiAob2xkUm9vdFN0b3JlKSB7XG4gICAgICAgICAgICBkZXRhY2hGcm9tUm9vdFN0b3JlKHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmV3Um9vdFN0b3JlKSB7XG4gICAgICAgICAgICBhdHRhY2hUb1Jvb3RTdG9yZShuZXdSb290U3RvcmUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXR0YWNoVG9OZXdQYXJlbnQoKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG4pXG4iLCJpbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgcmVnaXN0ZXJUd2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtcIlxuaW1wb3J0IHsgVHdlYWtlclByaW9yaXR5IH0gZnJvbSBcIi4vVHdlYWtlclByaW9yaXR5XCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR3ZWFrTW9kZWw8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IFQsIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCk6IFQge1xuICB0d2Vha2VkT2JqZWN0cy5zZXQodmFsdWUsIHVuZGVmaW5lZClcbiAgc2V0UGFyZW50KHtcbiAgICB2YWx1ZSxcbiAgICBwYXJlbnRQYXRoLFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXG4gICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogdHJ1ZSxcbiAgfSlcblxuICAvLyBub3RoaW5nIHRvIGRvIGZvciBtb2RlbHMsIGRhdGEgaXMgYWxyZWFkeSBwcm94aWZpZWQgYW5kIGl0cyBwYXJlbnQgaXMgc2V0XG4gIC8vIGZvciBzbmFwc2hvdHMgd2Ugd2lsbCB1c2UgaXRzIFwiJFwiIG9iamVjdCBzbmFwc2hvdCBkaXJlY3RseVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2RlbFR3ZWFrZXIoKSB7XG4gIHJlZ2lzdGVyVHdlYWtlcihUd2Vha2VyUHJpb3JpdHkuTW9kZWwsICh2YWx1ZSwgcGFyZW50UGF0aCkgPT4ge1xuICAgIGlmIChpc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHR3ZWFrTW9kZWwodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB7IGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCB9IGZyb20gXCIuLi9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxUcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsUHJvcHNJbmZvXCJcbmltcG9ydCB7IGFwcGx5TW9kZWxJbml0aWFsaXplcnMgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbmV3TW9kZWxcIlxuaW1wb3J0IHsgbm9EZWZhdWx0VmFsdWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyB0d2Vha01vZGVsIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtNb2RlbFwiXG5pbXBvcnQgeyB0d2Vha1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtQbGFpbk9iamVjdFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIG1ha2VQcm9wUmVhZG9ubHkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lLCBnZXRNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4vZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4vTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHsgYXNzZXJ0SXNNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaW50ZXJuYWxOZXdNb2RlbCA9IGFjdGlvbihcbiAgXCJuZXdNb2RlbFwiLFxuICA8TSBleHRlbmRzIEFueU1vZGVsPihcbiAgICBvcmlnTW9kZWxPYmo6IE0sXG4gICAgaW5pdGlhbERhdGE6IE1vZGVsVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8TT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogUGljazxNb2RlbENvbnN0cnVjdG9yT3B0aW9ucywgXCJtb2RlbENsYXNzXCIgfCBcInNuYXBzaG90SW5pdGlhbERhdGFcIiB8IFwiZ2VuZXJhdGVOZXdJZHNcIj5cbiAgKTogTSA9PiB7XG4gICAgY29uc3QgbW9kZSA9IGluaXRpYWxEYXRhID8gXCJuZXdcIiA6IFwiZnJvbVNuYXBzaG90XCJcbiAgICBjb25zdCB7IG1vZGVsQ2xhc3M6IF9tb2RlbENsYXNzLCBzbmFwc2hvdEluaXRpYWxEYXRhLCBnZW5lcmF0ZU5ld0lkcyB9ID0gb3B0aW9uc1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBfbW9kZWxDbGFzcyFcblxuICAgIGlmIChpbkRldk1vZGUoKSkge1xuICAgICAgYXNzZXJ0SXNNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIFwibW9kZWxDbGFzc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsT2JqID0gb3JpZ01vZGVsT2JqIGFzIE8uV3JpdGFibGU8TT5cblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpXG4gICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBubyBtb2RlbCBpbmZvIGZvciBjbGFzcyAke21vZGVsQ2xhc3MubmFtZX0gY291bGQgYmUgZm91bmQgLSBkaWQgeW91IGZvcmdldCB0byBhZGQgdGhlIEBtb2RlbCBkZWNvcmF0b3I/YFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsQ2xhc3MpXG4gICAgY29uc3QgbW9kZWxQcm9wcyA9IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhtb2RlbENsYXNzKVxuICAgIGNvbnN0IG1vZGVsSWRQcm9wRGF0YSA9IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPyBtb2RlbFByb3BzW21vZGVsSWRQcm9wZXJ0eU5hbWVdISA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGlkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBpZiAoc25hcHNob3RJbml0aWFsRGF0YSkge1xuICAgICAgbGV0IHNuID0gc25hcHNob3RJbml0aWFsRGF0YS51bnByb2Nlc3NlZFNuYXBzaG90XG5cbiAgICAgIGlmIChtb2RlbElkUHJvcERhdGEgJiYgbW9kZWxJZFByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoZ2VuZXJhdGVOZXdJZHMpIHtcbiAgICAgICAgICBpZCA9IChtb2RlbElkUHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiBhcyAoKSA9PiBzdHJpbmcpKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZCA9IHNuW21vZGVsSWRQcm9wZXJ0eU5hbWVdXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGVsQ2xhc3MuZnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICAgIHNuID0gbW9kZWxDbGFzcy5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICB9XG5cbiAgICAgIGluaXRpYWxEYXRhID0gc25hcHNob3RJbml0aWFsRGF0YS5zbmFwc2hvdFRvSW5pdGlhbERhdGEoc24pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBzeW1ib2wgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChtb2RlbElkUHJvcERhdGEgJiYgbW9kZWxJZFByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoaW5pdGlhbERhdGEhW21vZGVsSWRQcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgaWQgPSBpbml0aWFsRGF0YSFbbW9kZWxJZFByb3BlcnR5TmFtZV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZCA9IChtb2RlbElkUHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiBhcyAoKSA9PiBzdHJpbmcpKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG1vZGVsT2JqW21vZGVsVHlwZUtleV0gPSBtb2RlbEluZm8ubmFtZVxuXG4gICAgLy8gZmlsbCBpbiBkZWZhdWx0cyBpbiBpbml0aWFsIGRhdGFcbiAgICBjb25zdCBtb2RlbFByb3BzS2V5cyA9IE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RlbFByb3BzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IG1vZGVsUHJvcHNLZXlzW2ldXG5cbiAgICAgIC8vIGlkIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgYWJvdmVcbiAgICAgIGlmIChrID09PSBtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb3BEYXRhID0gbW9kZWxQcm9wc1trXVxuXG4gICAgICBsZXQgbmV3VmFsdWUgPSBpbml0aWFsRGF0YSFba11cbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcblxuICAgICAgLy8gYXBwbHkgdW50cmFuc2Zvcm0gKGlmIGFueSlcbiAgICAgIGlmIChtb2RlID09PSBcIm5ld1wiICYmIHByb3BEYXRhLl9pbnRlcm5hbC50cmFuc2Zvcm0pIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgbmV3VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwudHJhbnNmb3JtLnVudHJhbnNmb3JtKG5ld1ZhbHVlLCBtb2RlbE9iaiwgaylcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgZGVmYXVsdCB2YWx1ZSAoaWYgbmVlZGVkKVxuICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpIHtcbiAgICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4gIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4oKVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWUgIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWVcbiAgICAgICAgfSBlbHNlIGlmICghKFwia1wiIGluIGluaXRpYWxEYXRhISkpIHtcbiAgICAgICAgICAvLyBmb3IgbW9ieDQsIHdlIG5lZWQgdG8gc2V0IHVwIHByb3BlcnRpZXMgZXZlbiBpZiB0aGV5IGFyZSB1bmRlZmluZWRcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHNldChpbml0aWFsRGF0YSBhcyBhbnksIGssIG5ld1ZhbHVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICBzZXQoaW5pdGlhbERhdGEgYXMgYW55LCBtb2RlbElkUHJvcGVydHlOYW1lLCBpZClcbiAgICB9XG5cbiAgICB0d2Vha01vZGVsKG1vZGVsT2JqLCB1bmRlZmluZWQpXG5cbiAgICAvLyBjcmVhdGUgb2JzZXJ2YWJsZSBkYXRhIG9iamVjdCB3aXRoIGluaXRpYWwgZGF0YVxuICAgIGxldCBvYnNEYXRhID0gdHdlYWtQbGFpbk9iamVjdChcbiAgICAgIGluaXRpYWxEYXRhISxcbiAgICAgIHsgcGFyZW50OiBtb2RlbE9iaiwgcGF0aDogXCIkXCIgfSxcbiAgICAgIG1vZGVsT2JqW21vZGVsVHlwZUtleV0sXG4gICAgICBmYWxzZSxcbiAgICAgIHRydWVcbiAgICApXG5cbiAgICAvLyBsaW5rIGl0LCBhbmQgbWFrZSBpdCByZWFkb25seVxuICAgIG1vZGVsT2JqLiQgPSBvYnNEYXRhXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBtYWtlUHJvcFJlYWRvbmx5KG1vZGVsT2JqLCBcIiRcIiwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyB0eXBlIGNoZWNrIGl0IGlmIG5lZWRlZFxuICAgIGlmIChpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSAmJiBnZXRNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhc3MpLmRhdGFUeXBlKSB7XG4gICAgICBjb25zdCBlcnIgPSBtb2RlbE9iai50eXBlQ2hlY2soKVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBlcnIudGhyb3cobW9kZWxPYmopXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcnVuIGFueSBleHRyYSBpbml0aWFsaXplcnMgZm9yIHRoZSBjbGFzcyBhcyBuZWVkZWRcbiAgICBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzKG1vZGVsQ2xhc3MsIG1vZGVsT2JqKVxuXG4gICAgcmV0dXJuIG1vZGVsT2JqIGFzIE1cbiAgfVxuKVxuIiwiaW1wb3J0IHsgb2JzZXJ2YWJsZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIGZyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbCxcbiAgTW9kZWxDbGFzcyxcbiAgcHJvcHNUeXBlU3ltYm9sLFxuICB0b1NuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxQcm9wcyxcbiAgTW9kZWxQcm9wc1RvRGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mTW9kZWwsIFNuYXBzaG90T3V0T2ZNb2RlbCB9IGZyb20gXCIuLi9zbmFwc2hvdC9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IHR5cGVzTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNNb2RlbFwiXG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZUNoZWNrXCJcbmltcG9ydCB0eXBlIHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrRXJyb3JcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4vbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuL01vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGludGVybmFsTmV3TW9kZWwgfSBmcm9tIFwiLi9uZXdNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRJc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZVN5bWJvbCA9IFN5bWJvbChcIm1vZGVsSWRQcm9wZXJ0eU5hbWVcIilcblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBtb2RlbHMuIFVzZSBgTW9kZWxgIGluc3RlYWQgd2hlbiBleHRlbmRpbmcuXG4gKlxuICogTmV2ZXIgb3ZlcnJpZGUgdGhlIGNvbnN0cnVjdG9yLCB1c2UgYG9uSW5pdGAgb3IgYG9uQXR0YWNoZWRUb1Jvb3RTdG9yZWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIERhdGEgRGF0YSB0eXBlLlxuICogQHR5cGVwYXJhbSBDcmVhdGlvbkRhdGEgQ3JlYXRpb24gZGF0YSB0eXBlLlxuICogQHR5cGVwYXJhbSBNb2RlbElkUHJvcGVydHlOYW1lIE1vZGVsIGlkIHByb3BlcnR5IG5hbWUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIEZyb21TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVG9TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgTW9kZWxJZFByb3BlcnR5TmFtZSBleHRlbmRzIHN0cmluZyA9IG5ldmVyXG4+IHtcbiAgLy8ganVzdCB0byBtYWtlIHR5cGluZyB3b3JrIHByb3Blcmx5XG4gIFtwcm9wc1R5cGVTeW1ib2xdITogVFByb3BzO1xuICBbZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXSE6IEZyb21TbmFwc2hvdE92ZXJyaWRlO1xuICBbdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF0hOiBUb1NuYXBzaG90T3ZlcnJpZGU7XG4gIFttb2RlbElkUHJvcGVydHlOYW1lU3ltYm9sXSE6IE1vZGVsSWRQcm9wZXJ0eU5hbWU7XG5cbiAgLyoqXG4gICAqIE1vZGVsIHR5cGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IFttb2RlbFR5cGVLZXldITogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE1vZGVsIGludGVybmFsIGlkLiBDYW4gYmUgbW9kaWZpZWQgaW5zaWRlIGEgbW9kZWwgYWN0aW9uLlxuICAgKiBJdCB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCBpZiB0aGVyZSdzIG5vIGlkIHByb3Agc2V0LlxuICAgKi9cbiAgZ2V0IFttb2RlbElkS2V5XSgpOiBbTW9kZWxJZFByb3BlcnR5TmFtZV0gZXh0ZW5kcyBbbmV2ZXJdID8gbmV2ZXIgOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkUHJvcCA9IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpXG4gICAgcmV0dXJuIGlkUHJvcCA/IHRoaXMuJFtpZFByb3BdIDogKHVuZGVmaW5lZCBhcyBhbnkpXG4gIH1cblxuICBzZXQgW21vZGVsSWRLZXldKG5ld0lkOiBbTW9kZWxJZFByb3BlcnR5TmFtZV0gZXh0ZW5kcyBbbmV2ZXJdID8gbmV2ZXIgOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpZFByb3AgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiJG1vZGVsSWQgY2Fubm90IGJlIHNldCB3aGVuIHRoZXJlIGlzIG5vIGlkUHJvcCBzZXQgaW4gdGhlIG1vZGVsXCIpXG4gICAgfVxuICAgIDsodGhpcy4kIGFzIGFueSlbaWRQcm9wXSA9IG5ld0lkXG4gIH1cblxuICAvKipcbiAgICogQ2FuIGJlIG92ZXJyaWRkZW4gdG8gb2ZmZXIgYSByZWZlcmVuY2UgaWQgdG8gYmUgdXNlZCBpbiByZWZlcmVuY2UgcmVzb2x1dGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCB3aWxsIHVzZSB0aGUgYGlkUHJvcGAgaWYgYXZhaWxhYmxlIG9yIHJldHVybiBgdW5kZWZpbmVkYCBvdGhlcndpc2UuXG4gICAqL1xuICBnZXRSZWZJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzW21vZGVsSWRLZXldXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uSW5pdD8oKTogdm9pZFxuXG4gIC8qKlxuICAgKiBEYXRhIHBhcnQgb2YgdGhlIG1vZGVsLCB3aGljaCBpcyBvYnNlcnZhYmxlIGFuZCB3aWxsIGJlIHNlcmlhbGl6ZWQgaW4gc25hcHNob3RzLlxuICAgKiBVc2UgaXQgaWYgb25lIG9mIHRoZSBkYXRhIHByb3BlcnRpZXMgbWF0Y2hlcyBvbmUgb2YgdGhlIG1vZGVsIHByb3BlcnRpZXMvZnVuY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgJCE6IE1vZGVsUHJvcHNUb0RhdGE8VFByb3BzPlxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBob29rIHRoYXQgd2lsbCBydW4gb25jZSB0aGlzIG1vZGVsIGluc3RhbmNlIGlzIGF0dGFjaGVkIHRvIHRoZSB0cmVlIG9mIGEgbW9kZWwgbWFya2VkIGFzXG4gICAqIHJvb3Qgc3RvcmUgdmlhIGByZWdpc3RlclJvb3RTdG9yZWAuXG4gICAqIEJhc2ljYWxseSB0aGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB5b3Uga25vdyB0aGUgZnVsbCByb290IHN0b3JlIGlzIGNvbXBsZXRlIGFuZCB3aGVyZSB0aGluZ3Mgc3VjaCBhc1xuICAgKiBtaWRkbGV3YXJlcywgZWZmZWN0cyAocmVhY3Rpb25zLCBldGMpLCBhbmQgb3RoZXIgc2lkZSBlZmZlY3RzIHNob3VsZCBiZSByZWdpc3RlcmVkLCBzaW5jZSBpdCBtZWFuc1xuICAgKiB0aGF0IHRoZSBtb2RlbCBpcyBub3cgcGFydCBvZiB0aGUgYWN0aXZlIGFwcGxpY2F0aW9uIHN0YXRlLlxuICAgKlxuICAgKiBJdCBjYW4gcmV0dXJuIGEgZGlzcG9zZXIgdGhhdCB3aWxsIGJlIHJ1biBvbmNlIHRoaXMgbW9kZWwgaW5zdGFuY2UgaXMgZGV0YWNoZWQgZnJvbSBzdWNoIHJvb3Qgc3RvcmUgdHJlZS5cbiAgICpcbiAgICogQHBhcmFtIHJvb3RTdG9yZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJvdGVjdGVkIG9uQXR0YWNoZWRUb1Jvb3RTdG9yZT8ocm9vdFN0b3JlOiBvYmplY3QpOiAoKCkgPT4gdm9pZCkgfCB2b2lkXG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgdHlwZSBjaGVjayBvdmVyIHRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogRm9yIHRoaXMgdG8gd29yayBhIGRhdGEgdHlwZSBoYXMgdG8gYmUgZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbW9kZWwgcHJvcGVydGllcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBgVHlwZUNoZWNrRXJyb3JgIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBlcnJvci5cbiAgICovXG4gIHR5cGVDaGVjaygpOiBUeXBlQ2hlY2tFcnJvciB8IG51bGwge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc01vZGVsPHRoaXM+KHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuICAgIHJldHVybiB0eXBlQ2hlY2sodHlwZSwgdGhpcyBhcyBhbnkpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIG1vZGVsLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YTogTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPikge1xuICAgIGxldCBpbml0aWFsRGF0YSA9IGRhdGEgYXMgYW55XG4gICAgY29uc3QgeyBzbmFwc2hvdEluaXRpYWxEYXRhLCBtb2RlbENsYXNzLCBnZW5lcmF0ZU5ld0lkcyB9OiBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyA9XG4gICAgICBhcmd1bWVudHNbMV0gYXMgYW55XG5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbW9kZWxDbGFzcyEucHJvdG90eXBlKVxuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55XG5cbiAgICAvLyBkZWxldGUgdW5uZWNlc3NhcnkgcHJvcHNcbiAgICBkZWxldGUgc2VsZltwcm9wc1R5cGVTeW1ib2xdXG4gICAgZGVsZXRlIHNlbGZbZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXVxuICAgIGRlbGV0ZSBzZWxmW3RvU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdXG4gICAgZGVsZXRlIHNlbGZbbW9kZWxJZFByb3BlcnR5TmFtZVN5bWJvbF1cblxuICAgIGlmICghc25hcHNob3RJbml0aWFsRGF0YSkge1xuICAgICAgLy8gcGxhaW4gbmV3XG4gICAgICBhc3NlcnRJc09iamVjdChpbml0aWFsRGF0YSwgXCJpbml0aWFsRGF0YVwiKVxuXG4gICAgICBpbnRlcm5hbE5ld01vZGVsKHRoaXMsIG9ic2VydmFibGUub2JqZWN0KGluaXRpYWxEYXRhIGFzIGFueSwgdW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pLCB7XG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIGdlbmVyYXRlTmV3SWRzOiB0cnVlLFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZnJvbSBzbmFwc2hvdFxuICAgICAgaW50ZXJuYWxOZXdNb2RlbCh0aGlzLCB1bmRlZmluZWQsIHsgbW9kZWxDbGFzcywgc25hcHNob3RJbml0aWFsRGF0YSwgZ2VuZXJhdGVOZXdJZHMgfSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyhvcHRpb25zPzogeyB3aXRoRGF0YT86IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IGZpbmFsT3B0aW9ucyA9IHtcbiAgICAgIHdpdGhEYXRhOiB0cnVlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFBhcnQgPSBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpc1ttb2RlbFR5cGVLZXldfWBcblxuICAgIHJldHVybiBmaW5hbE9wdGlvbnMud2l0aERhdGFcbiAgICAgID8gYFske2ZpcnN0UGFydH0gJHtKU09OLnN0cmluZ2lmeShnZXRTbmFwc2hvdCh0aGlzKSl9XWBcbiAgICAgIDogYFske2ZpcnN0UGFydH1dYFxuICB9XG59XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgdHlwZSBCYXNlTW9kZWxLZXlzID0ga2V5b2YgQW55TW9kZWwgfCBcIm9uSW5pdFwiIHwgXCJvbkF0dGFjaGVkVG9Sb290U3RvcmVcIlxuXG4vLyB0aGVzZSBwcm9wcyB3aWxsIG5ldmVyIGJlIGhvaXN0ZWQgdG8gdGhpcyAoZXhjZXB0IGZvciBtb2RlbCBpZClcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlTW9kZWxQcm9wTmFtZXMgPSBuZXcgU2V0PEJhc2VNb2RlbEtleXM+KFtcbiAgbW9kZWxUeXBlS2V5LFxuICBtb2RlbElkS2V5LFxuICBcIm9uSW5pdFwiLFxuICBcIiRcIixcbiAgXCJnZXRSZWZJZFwiLFxuICBcIm9uQXR0YWNoZWRUb1Jvb3RTdG9yZVwiLFxuICBcInR5cGVDaGVja1wiLFxuXSlcblxuLyoqXG4gKiBBbnkga2luZCBvZiBtb2RlbCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbnlNb2RlbCBleHRlbmRzIEJhc2VNb2RlbDxhbnksIGFueSwgYW55LCBhbnk+IHt9XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2hvdWxkIG5vdCBiZSBuZWVkZWQgYW55bW9yZS5cbiAqXG4gKiBUcmlja3MgVHlwZVNjcmlwdCBpbnRvIGFjY2VwdGluZyBhYnN0cmFjdCBjbGFzc2VzIGFzIGEgcGFyYW1ldGVyIGZvciBgRXh0ZW5kZWRNb2RlbGAuXG4gKiBEb2VzIG5vdGhpbmcgaW4gcnVudGltZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgQWJzdHJhY3QgbW9kZWwgY2xhc3MgdHlwZS5cbiAqIEBwYXJhbSB0eXBlIEFic3RyYWN0IG1vZGVsIGNsYXNzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFic3RyYWN0TW9kZWxDbGFzczxUPih0eXBlOiBUKTogVCAmIE9iamVjdCB7XG4gIHJldHVybiB0eXBlIGFzIGFueVxufVxuXG4vKipcbiAqIFRoZSBtb2RlbCBpZCBwcm9wZXJ0eSBuYW1lLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbElkUHJvcGVydHlOYW1lPE0gZXh0ZW5kcyBBbnlNb2RlbD4gPSBNW3R5cGVvZiBtb2RlbElkUHJvcGVydHlOYW1lU3ltYm9sXVxuXG4vKipcbiAqIEFkZCBtaXNzaW5nIG1vZGVsIG1ldGFkYXRhIHRvIGEgbW9kZWwgY3JlYXRpb24gc25hcHNob3QgdG8gZ2VuZXJhdGUgYSBwcm9wZXIgbW9kZWwgc25hcHNob3QuXG4gKiBVc3VhbGx5IHVzZWQgYWxvbmdzaWRlIGBmcm9tU25hcHNob3RgLlxuICpcbiAqIEB0eXBlcGFyYW0gTSBNb2RlbCB0eXBlLlxuICogQHBhcmFtIG1vZGVsQ2xhc3MgTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gc25hcHNob3QgTW9kZWwgY3JlYXRpb24gc25hcHNob3Qgd2l0aG91dCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBtb2RlbCBzbmFwc2hvdCAoaW5jbHVkaW5nIG1ldGFkYXRhKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsU25hcHNob3RJbldpdGhNZXRhZGF0YTxNIGV4dGVuZHMgQW55TW9kZWw+KFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPE0+LFxuICBzbmFwc2hvdDogT21pdDxTbmFwc2hvdEluT2ZNb2RlbDxNPiwgdHlwZW9mIG1vZGVsVHlwZUtleT5cbik6IFNuYXBzaG90SW5PZk1vZGVsPE0+IHtcbiAgYXNzZXJ0SXNNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIFwibW9kZWxDbGFzc1wiKVxuICBhc3NlcnRJc09iamVjdChzbmFwc2hvdCwgXCJpbml0aWFsRGF0YVwiKVxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpIVxuXG4gIHJldHVybiB7XG4gICAgLi4uc25hcHNob3QsXG4gICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICB9IGFzIGFueVxufVxuXG4vKipcbiAqIEFkZCBtaXNzaW5nIG1vZGVsIG1ldGFkYXRhIHRvIGEgbW9kZWwgb3V0cHV0IHNuYXBzaG90IHRvIGdlbmVyYXRlIGEgcHJvcGVyIG1vZGVsIHNuYXBzaG90LlxuICogVXN1YWxseSB1c2VkIGFsb25nc2lkZSBgYXBwbHlTbmFwc2hvdGAuXG4gKlxuICogQHR5cGVwYXJhbSBNIE1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxDbGFzcyBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSBzbmFwc2hvdCBNb2RlbCBvdXRwdXQgc25hcHNob3Qgd2l0aG91dCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBtb2RlbCBzbmFwc2hvdCAoaW5jbHVkaW5nIG1ldGFkYXRhKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGE8TSBleHRlbmRzIEFueU1vZGVsPihcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxNPixcbiAgc25hcHNob3Q6IE9taXQ8U25hcHNob3RPdXRPZk1vZGVsPE0+LCB0eXBlb2YgbW9kZWxUeXBlS2V5PlxuKTogU25hcHNob3RPdXRPZk1vZGVsPE0+IHtcbiAgYXNzZXJ0SXNNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIFwibW9kZWxDbGFzc1wiKVxuICBhc3NlcnRJc09iamVjdChzbmFwc2hvdCwgXCJpbml0aWFsRGF0YVwiKVxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhc3MpIVxuXG4gIHJldHVybiB7XG4gICAgLi4uc25hcHNob3QsXG4gICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICB9IGFzIGFueVxufVxuXG4vKipcbiAqIEEgbW9kZWwgY2xhc3MgZGVjbGFyYXRpb24sIG1hZGUgb2YgYSBiYXNlIG1vZGVsIGFuZCB0aGUgbW9kZWwgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbENsYXNzRGVjbGFyYXRpb248QmFzZU1vZGVsQ2xhc3MsIE1vZGVsSW50ZXJmYWNlPiA9IEJhc2VNb2RlbENsYXNzICYge1xuICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogTW9kZWxJbnRlcmZhY2Vcbn1cbiIsImltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNQbGFpbk9iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBBbnlNb2RlbCwgQmFzZU1vZGVsIH0gZnJvbSBcIi4vQmFzZU1vZGVsXCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuL21ldGFkYXRhXCJcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWwgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbChtb2RlbDogdW5rbm93bik6IG1vZGVsIGlzIEFueU1vZGVsIHtcbiAgcmV0dXJuIG1vZGVsIGluc3RhbmNlb2YgQmFzZU1vZGVsXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogQXNzZXJ0cyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gbW9kZWxcbiAqIEBwYXJhbSBhcmdOYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc01vZGVsKFxuICBtb2RlbDogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nLFxuICBjdXN0b21FcnJNc2cgPSBcIm11c3QgYmUgYSBtb2RlbCBpbnN0YW5jZVwiXG4pOiBhc3NlcnRzIG1vZGVsIGlzIEFueU1vZGVsIHtcbiAgaWYgKCFpc01vZGVsKG1vZGVsKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gJHtjdXN0b21FcnJNc2d9YClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbENsYXNzKG1vZGVsQ2xhc3M6IHVua25vd24pOiBtb2RlbENsYXNzIGlzIE1vZGVsQ2xhc3M8QW55TW9kZWw+IHtcbiAgaWYgKHR5cGVvZiBtb2RlbENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChtb2RlbENsYXNzICE9PSBCYXNlTW9kZWwgJiYgIShtb2RlbENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VNb2RlbCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc01vZGVsQ2xhc3MoXG4gIG1vZGVsQ2xhc3M6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZ1xuKTogYXNzZXJ0cyBtb2RlbENsYXNzIGlzIE1vZGVsQ2xhc3M8QW55TW9kZWw+IHtcbiAgaWYgKHR5cGVvZiBtb2RlbENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBjbGFzc2ApXG4gIH1cblxuICBpZiAobW9kZWxDbGFzcyAhPT0gQmFzZU1vZGVsICYmICEobW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlTW9kZWwpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGV4dGVuZCBNb2RlbGApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxTbmFwc2hvdChzbjogdW5rbm93bik6IHNuIGlzIHsgW21vZGVsVHlwZUtleV06IHN0cmluZyB9IHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3Qoc24pICYmIG1vZGVsVHlwZUtleSBpbiBzblxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGlzQXJyYXksIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB7XG4gIGRhdGFPYmplY3RQYXJlbnQsXG4gIGRhdGFUb01vZGVsTm9kZSxcbiAgbW9kZWxUb0RhdGFOb2RlLFxuICBvYmplY3RQYXJlbnRzLFxuICByZXBvcnRQYXJlbnRQYXRoT2JzZXJ2ZWQsXG59IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBQYXRoLCBQYXRoRWxlbWVudCwgV3JpdGFibGVQYXRoIH0gZnJvbSBcIi4vcGF0aFR5cGVzXCJcblxuLyoqXG4gKiBQYXRoIGZyb20gYW4gb2JqZWN0IHRvIGl0cyBpbW1lZGlhdGUgcGFyZW50LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQYXJlbnQgb2JqZWN0IHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50UGF0aDxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBQYXJlbnQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50OiBUXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBuYW1lIChpZiB0aGUgcGFyZW50IGlzIGFuIG9iamVjdCkgb3IgaW5kZXggbnVtYmVyIChpZiB0aGUgcGFyZW50IGlzIGFuIGFycmF5KS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IFBhdGhFbGVtZW50XG59XG5cbi8qKlxuICogUGF0aCBmcm9tIGFuIG9iamVjdCB0byBpdHMgcm9vdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUm9vdCBvYmplY3QgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb290UGF0aDxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBSb290IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3Q6IFRcbiAgLyoqXG4gICAqIFBhdGggZnJvbSB0aGUgcm9vdCB0byB0aGUgZ2l2ZW4gdGFyZ2V0LCBhcyBhIHN0cmluZyBhcnJheS5cbiAgICogSWYgdGhlIHRhcmdldCBpcyBhIHJvb3QgaXRzZWxmIHRoZW4gdGhlIGFycmF5IHdpbGwgYmUgZW1wdHkuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBQYXRoXG5cbiAgLyoqXG4gICAqIE9iamVjdHMgaW4gdGhlIHBhdGgsIGZyb20gcm9vdCAoaW5jbHVkZWQpIHVudGlsIHRhcmdldCAoaW5jbHVkZWQpLlxuICAgKiBJZiB0aGUgdGFyZ2V0IGlzIGEgcm9vdCB0aGVuIG9ubHkgdGhlIHRhcmdldCB3aWxsIGJlIGluY2x1ZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9iamVjdHM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj5cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIHRhcmdldCBwbHVzIHRoZSBwYXRoIGZyb20gdGhlIHBhcmVudCB0byB0aGUgdGFyZ2V0LCBvciB1bmRlZmluZWQgaWYgaXQgaGFzIG5vIHBhcmVudC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHZhbHVlIFRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogUGFyZW50UGF0aDxUPiB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIilcblxuICByZXR1cm4gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0UGFyZW50UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgdmFsdWU6IG9iamVjdFxuKTogUGFyZW50UGF0aDxUPiB8IHVuZGVmaW5lZCB7XG4gIHJlcG9ydFBhcmVudFBhdGhPYnNlcnZlZCh2YWx1ZSlcbiAgcmV0dXJuIG9iamVjdFBhcmVudHMuZ2V0KHZhbHVlKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRQYXJlbnRQYXRoSW5jbHVkaW5nRGF0YU9iamVjdHM8VCBleHRlbmRzIG9iamVjdCA9IGFueT4oXG4gIHZhbHVlOiBvYmplY3Rcbik6IFBhcmVudFBhdGg8VD4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJlbnRNb2RlbCA9IGRhdGFPYmplY3RQYXJlbnQuZ2V0KHZhbHVlKVxuICBpZiAocGFyZW50TW9kZWwpIHtcbiAgICByZXR1cm4geyBwYXJlbnQ6IHBhcmVudE1vZGVsIGFzIFQsIHBhdGg6IFwiJFwiIH1cbiAgfVxuXG4gIGNvbnN0IHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSlcbiAgaWYgKHBhcmVudFBhdGggJiYgaXNNb2RlbChwYXJlbnRQYXRoLnBhcmVudCkpIHtcbiAgICByZXR1cm4geyBwYXJlbnQ6IHBhcmVudFBhdGgucGFyZW50LiQgYXMgVCwgcGF0aDogcGFyZW50UGF0aC5wYXRoIH1cbiAgfVxuICByZXR1cm4gcGFyZW50UGF0aFxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIHRhcmdldCBvYmplY3QsIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSdzIG5vIHBhcmVudC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHZhbHVlIFRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50PFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBUIHwgdW5kZWZpbmVkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgXCJ2YWx1ZVwiKVxuXG4gIHJldHVybiBmYXN0R2V0UGFyZW50KHZhbHVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFBhcmVudDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSlcblxuICByZXR1cm4gcGFyZW50UGF0aCA/IHBhcmVudFBhdGgucGFyZW50IDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0UGFyZW50SW5jbHVkaW5nRGF0YU9iamVjdHM8VCBleHRlbmRzIG9iamVjdCA9IGFueT4oXG4gIHZhbHVlOiBvYmplY3Rcbik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGhJbmNsdWRpbmdEYXRhT2JqZWN0cyh2YWx1ZSlcblxuICByZXR1cm4gcGFyZW50UGF0aCA/IHBhcmVudFBhdGgucGFyZW50IDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIG9iamVjdCBpcyBhIG1vZGVsIGludGVyaW0gZGF0YSBvYmplY3QgKGAkYCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIE9iamVjdCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgaXMsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxEYXRhT2JqZWN0KHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgXCJ2YWx1ZVwiLCB0cnVlKVxuXG4gIHJldHVybiBmYXN0SXNNb2RlbERhdGFPYmplY3QodmFsdWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0SXNNb2RlbERhdGFPYmplY3QodmFsdWU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGF0YU9iamVjdFBhcmVudC5oYXModmFsdWUpXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgdGFyZ2V0IHBsdXMgdGhlIHBhdGggZnJvbSB0aGUgcm9vdCB0byBnZXQgdG8gdGhlIHRhcmdldC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUm9vdCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3RQYXRoPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBSb290UGF0aDxUPiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIilcblxuICByZXR1cm4gZmFzdEdldFJvb3RQYXRoKHZhbHVlKVxufVxuXG4vLyB3ZSB1c2UgY29tcHV0ZWRzIHNvIHRoZXkgYXJlIGNhY2hlZCB3aGVuZXZlciBwb3NzaWJsZVxuY29uc3QgY29tcHV0ZWRzR2V0Um9vdFBhdGggPSBuZXcgV2Vha01hcDxvYmplY3QsIElDb21wdXRlZFZhbHVlPFJvb3RQYXRoPGFueT4+PigpXG5cbmZ1bmN0aW9uIGludGVybmFsR2V0Um9vdFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFJvb3RQYXRoPFQ+IHtcbiAgY29uc3Qgcm9vdFBhdGggPSB7XG4gICAgcm9vdDogdmFsdWUsXG4gICAgcGF0aDogW10gYXMgV3JpdGFibGVQYXRoLFxuICAgIHBhdGhPYmplY3RzOiBbdmFsdWVdIGFzIHVua25vd25bXSxcbiAgfVxuXG4gIGxldCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWRcbiAgd2hpbGUgKChwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgocm9vdFBhdGgucm9vdCkpKSB7XG4gICAgcm9vdFBhdGgucm9vdCA9IHBhcmVudFBhdGgucGFyZW50XG4gICAgcm9vdFBhdGgucGF0aC51bnNoaWZ0KHBhcmVudFBhdGgucGF0aClcbiAgICByb290UGF0aC5wYXRoT2JqZWN0cy51bnNoaWZ0KHBhcmVudFBhdGgucGFyZW50KVxuICB9XG5cbiAgcmV0dXJuIHJvb3RQYXRoIGFzIFJvb3RQYXRoPGFueT5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRSb290UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogUm9vdFBhdGg8VD4ge1xuICByZXR1cm4gZ2V0T3JDcmVhdGUoY29tcHV0ZWRzR2V0Um9vdFBhdGgsIHZhbHVlLCAoKSA9PlxuICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBpbnRlcm5hbEdldFJvb3RQYXRoKHZhbHVlKVxuICAgIH0pXG4gICkuZ2V0KClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBvciBpdHNlbGYgaWYgdGhlIHRhcmdldCBpcyBhIHJvb3QuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJvb3Qgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdmFsdWUgVGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290PFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBUIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgXCJ2YWx1ZVwiKVxuXG4gIHJldHVybiBmYXN0R2V0Um9vdCh2YWx1ZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRSb290PFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBUIHtcbiAgcmV0dXJuIGZhc3RHZXRSb290UGF0aCh2YWx1ZSkucm9vdFxufVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBvYmplY3QgaXMgYSByb290IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jvb3QodmFsdWU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIpXG5cbiAgcmV0dXJuICFmYXN0R2V0UGFyZW50KHZhbHVlKVxufVxuXG5jb25zdCB1bnJlc29sdmVkID0geyByZXNvbHZlZDogZmFsc2UgfSBhcyBjb25zdFxuXG4vKipcbiAqIFRyaWVzIHRvIHJlc29sdmUgYSBwYXRoIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZXR1cm5lZCB2YWx1ZSB0eXBlLlxuICogQHBhcmFtIHBhdGhSb290T2JqZWN0IE9iamVjdCB0aGF0IHNlcnZlcyBhcyBwYXRoIHJvb3QuXG4gKiBAcGFyYW0gcGF0aCBQYXRoIGFzIGFuIHN0cmluZyBvciBudW1iZXIgYXJyYXkuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBgeyByZXNvbHZlZDogdHJ1ZSwgdmFsdWU6IFQgfWAgb3IgYHsgcmVzb2x2ZWQ6IGZhbHNlIH1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGg8VCA9IGFueT4oXG4gIHBhdGhSb290T2JqZWN0OiBvYmplY3QsXG4gIHBhdGg6IFBhdGhcbik6XG4gIHwge1xuICAgICAgcmVzb2x2ZWQ6IHRydWVcbiAgICAgIHZhbHVlOiBUXG4gICAgfVxuICB8IHtcbiAgICAgIHJlc29sdmVkOiBmYWxzZVxuICAgICAgdmFsdWU/OiB1bmRlZmluZWRcbiAgICB9IHtcbiAgLy8gdW5pdCB0ZXN0cyByZWx5IG9uIHRoaXMgdG8gd29yayB3aXRoIGFueSBvYmplY3RcbiAgLy8gYXNzZXJ0VHdlYWtlZE9iamVjdChwYXRoUm9vdE9iamVjdCwgXCJwYXRoUm9vdE9iamVjdFwiKVxuXG4gIGxldCBjdXJyZW50OiBhbnkgPSBwYXRoUm9vdE9iamVjdFxuXG4gIGxldCBsZW4gPSBwYXRoLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKCFpc09iamVjdChjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIHVucmVzb2x2ZWRcbiAgICB9XG5cbiAgICBjb25zdCBwID0gcGF0aFtpXVxuXG4gICAgLy8gY2hlY2sganVzdCB0byBhdm9pZCBtb2J4IHdhcm5pbmdzIGFib3V0IHRyeWluZyB0byBhY2Nlc3Mgb3V0IG9mIGJvdW5kcyBpbmRleFxuICAgIGlmIChpc0FycmF5KGN1cnJlbnQpICYmICtwID49IGN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5yZXNvbHZlZFxuICAgIH1cblxuICAgIGlmIChpc01vZGVsKGN1cnJlbnQpKSB7XG4gICAgICBjb25zdCBkYXRhTm9kZSA9IG1vZGVsVG9EYXRhTm9kZShjdXJyZW50KVxuICAgICAgaWYgKHAgaW4gZGF0YU5vZGUpIHtcbiAgICAgICAgY3VycmVudCA9IGRhdGFOb2RlXG4gICAgICB9IGVsc2UgaWYgKCEocCBpbiBjdXJyZW50KSkge1xuICAgICAgICByZXR1cm4gdW5yZXNvbHZlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQgPSBjdXJyZW50W3BdXG4gIH1cblxuICByZXR1cm4geyByZXNvbHZlZDogdHJ1ZSwgdmFsdWU6IGN1cnJlbnQgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3Qgc2tpcElkQ2hlY2tpbmcgPSBTeW1ib2woXCJza2lwSWRDaGVja2luZ1wiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFRyaWVzIHRvIHJlc29sdmUgYSBwYXRoIGZyb20gYW4gb2JqZWN0IHdoaWxlIGNoZWNraW5nIGlkcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmV0dXJuZWQgdmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBwYXRoUm9vdE9iamVjdCBPYmplY3QgdGhhdCBzZXJ2ZXMgYXMgcGF0aCByb290LlxuICogQHBhcmFtIHBhdGggUGF0aCBhcyBhbiBzdHJpbmcgb3IgbnVtYmVyIGFycmF5LlxuICogQHBhcmFtIHBhdGhJZHMgQW4gYXJyYXkgb2YgaWRzIG9mIHRoZSBtb2RlbHMgdGhhdCBtdXN0IGJlIGNoZWNrZWQsIG51bGwgaWYgbm90IGEgbW9kZWwgb3IgYHNraXBJZENoZWNraW5nYCB0byBza2lwIGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYHsgcmVzb2x2ZWQ6IHRydWUsIHZhbHVlOiBUIH1gIG9yIGB7IHJlc29sdmVkOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoQ2hlY2tpbmdJZHM8VCA9IGFueT4oXG4gIHBhdGhSb290T2JqZWN0OiBvYmplY3QsXG4gIHBhdGg6IFBhdGgsXG4gIHBhdGhJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVsbCB8IHR5cGVvZiBza2lwSWRDaGVja2luZz5cbik6XG4gIHwge1xuICAgICAgcmVzb2x2ZWQ6IHRydWVcbiAgICAgIHZhbHVlOiBUXG4gICAgfVxuICB8IHtcbiAgICAgIHJlc29sdmVkOiBmYWxzZVxuICAgICAgdmFsdWU/OiB1bmRlZmluZWRcbiAgICB9IHtcbiAgLy8gdW5pdCB0ZXN0cyByZWx5IG9uIHRoaXMgdG8gd29yayB3aXRoIGFueSBvYmplY3RcbiAgLy8gYXNzZXJ0VHdlYWtlZE9iamVjdChwYXRoUm9vdE9iamVjdCwgXCJwYXRoUm9vdE9iamVjdFwiKVxuXG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbFRvRGF0YU5vZGUocGF0aFJvb3RPYmplY3QpXG4gIC8vIHJvb3QgaWQgaXMgbmV2ZXIgY2hlY2tlZFxuXG4gIGxldCBsZW4gPSBwYXRoLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKCFpc09iamVjdChjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIHsgcmVzb2x2ZWQ6IGZhbHNlIH1cbiAgICB9XG5cbiAgICBjb25zdCBwID0gcGF0aFtpXVxuXG4gICAgLy8gY2hlY2sganVzdCB0byBhdm9pZCBtb2J4IHdhcm5pbmdzIGFib3V0IHRyeWluZyB0byBhY2Nlc3Mgb3V0IG9mIGJvdW5kcyBpbmRleFxuICAgIGlmIChpc0FycmF5KGN1cnJlbnQpICYmICtwID49IGN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyByZXNvbHZlZDogZmFsc2UgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRNYXliZU1vZGVsID0gY3VycmVudFtwXVxuICAgIGN1cnJlbnQgPSBtb2RlbFRvRGF0YU5vZGUoY3VycmVudE1heWJlTW9kZWwgYXMgb2JqZWN0KVxuXG4gICAgY29uc3QgZXhwZWN0ZWRJZCA9IHBhdGhJZHNbaV1cbiAgICBpZiAoZXhwZWN0ZWRJZCAhPT0gc2tpcElkQ2hlY2tpbmcpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJZCA9IGlzTW9kZWwoY3VycmVudE1heWJlTW9kZWwpID8gY3VycmVudE1heWJlTW9kZWxbbW9kZWxJZEtleV0gPz8gbnVsbCA6IG51bGxcbiAgICAgIGlmIChleHBlY3RlZElkICE9PSBjdXJyZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVzb2x2ZWQ6IGZhbHNlIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyByZXNvbHZlZDogdHJ1ZSwgdmFsdWU6IGRhdGFUb01vZGVsTm9kZShjdXJyZW50KSB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcGF0aCB0byBnZXQgZnJvbSBhIHBhcmVudCB0byBhIGdpdmVuIGNoaWxkLlxuICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgY2hpbGQgaXMgYWN0dWFsbHkgdGhlIGdpdmVuIHBhcmVudCBvciB1bmRlZmluZWQgaWYgdGhlIGNoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBwYXJlbnQuXG4gKlxuICogQHBhcmFtIGZyb21QYXJlbnRcbiAqIEBwYXJhbSB0b0NoaWxkXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50VG9DaGlsZFBhdGgoZnJvbVBhcmVudDogb2JqZWN0LCB0b0NoaWxkOiBvYmplY3QpOiBQYXRoIHwgdW5kZWZpbmVkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChmcm9tUGFyZW50LCBcImZyb21QYXJlbnRcIilcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0b0NoaWxkLCBcInRvQ2hpbGRcIilcblxuICBpZiAoZnJvbVBhcmVudCA9PT0gdG9DaGlsZCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgcGF0aDogV3JpdGFibGVQYXRoID0gW11cblxuICBsZXQgY3VycmVudCA9IHRvQ2hpbGRcbiAgbGV0IHBhcmVudFBhdGhcbiAgd2hpbGUgKChwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgoY3VycmVudCkpKSB7XG4gICAgcGF0aC51bnNoaWZ0KHBhcmVudFBhdGgucGF0aClcblxuICAgIGN1cnJlbnQgPSBwYXJlbnRQYXRoLnBhcmVudFxuICAgIGlmIChjdXJyZW50ID09PSBmcm9tUGFyZW50KSB7XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCJpbXBvcnQgeyBmYXN0R2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGlzQ2hpbGRPZlBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aDJcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiwgYXNzZXJ0SXNPYmplY3QsIGRlbGV0ZUZyb21BcnJheSwgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IEFjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcblxuLyoqXG4gKiBBbiBhY3Rpb24gbWlkZGxld2FyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25NaWRkbGV3YXJlIHtcbiAgLyoqXG4gICAqIFN1YnRyZWUgcm9vdCBvYmplY3QgKG9iamVjdCBhbmQgY2hpbGQgb2JqZWN0cykgdGhpcyBtaWRkbGV3YXJlIHdpbGwgcnVuIGZvci5cbiAgICogVGhpcyB0YXJnZXQgXCJmaWx0ZXJcIiB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIGN1c3RvbSBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSBzdWJ0cmVlUm9vdDogb2JqZWN0XG5cbiAgLyoqXG4gICAqIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGRlY2lkZSBpZiBhbiBhY3Rpb24gbWlkZGxld2FyZSBmdW5jdGlvbiBzaG91bGQgYmUgcnVuIG9yIG5vdC5cbiAgICovXG4gIGZpbHRlcj8oY3R4OiBBY3Rpb25Db250ZXh0KTogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBbiBhY3Rpb24gbWlkZGxld2FyZSBmdW5jdGlvbi5cbiAgICogUmVtYmVyIHRvIGByZXR1cm4gbmV4dCgpYCBpZiB5b3Ugd2FudCB0byBjb250aW51ZSB0aGUgYWN0aW9uIG9yIHRocm93IGlmIHlvdSB3YW50IHRvIGNhbmNlbCBpdC5cbiAgICovXG4gIG1pZGRsZXdhcmUoY3R4OiBBY3Rpb25Db250ZXh0LCBuZXh0OiAoKSA9PiBhbnkpOiBhbnlcbn1cblxuLyoqXG4gKiBUaGUgZGlzcG9zZXIgb2YgYW4gYWN0aW9uIG1pZGRsZXdhcmUuXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciA9ICgpID0+IHZvaWRcblxudHlwZSBQYXJ0aWFsQWN0aW9uTWlkZGxld2FyZSA9IFBpY2s8QWN0aW9uTWlkZGxld2FyZSwgXCJmaWx0ZXJcIiB8IFwibWlkZGxld2FyZVwiPlxuXG5jb25zdCBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgUGFydGlhbEFjdGlvbk1pZGRsZXdhcmVbXT4oKVxuXG5pbnRlcmZhY2UgQWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvciBleHRlbmRzIEl0ZXJhYmxlPFBhcnRpYWxBY3Rpb25NaWRkbGV3YXJlPiB7fVxuXG5jb25zdCBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlc0l0ZXJhdG9yID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBBY3Rpb25NaWRkbGV3YXJlc0l0ZXJhdG9yPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogR2V0cyB0aGUgY3VycmVudCBhY3Rpb24gbWlkZGxld2FyZXMgdG8gYmUgcnVuIG92ZXIgYSBnaXZlbiBvYmplY3QgYXMgYW4gaXRlcmFibGUgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25NaWRkbGV3YXJlcyhvYmo6IG9iamVjdCk6IEFjdGlvbk1pZGRsZXdhcmVzSXRlcmF0b3Ige1xuICAvLyB3aGVuIHdlIGNhbGwgYSBtaWRkbGV3YXJlIHdlIHdpbGwgY2FsbCB0aGUgbWlkZGxld2FyZXMgb2YgdGhhdCBvYmplY3QgcGx1cyBhbGwgcGFyZW50IG9iamVjdHNcbiAgLy8gdGhlIHBhcmVudCBvYmplY3QgbWlkZGxld2FyZXMgYXJlIHJ1biBsYXN0XG5cbiAgLy8gc2luY2UgYW4gYXJyYXkgbGlrZSBbYSwgYiwgY10gd2lsbCBiZSBjYWxsZWQgbGlrZSBjKGIoYSgpKSkgdGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gcHV0XG4gIC8vIHRoZSBwYXJlbnQgb2JqZWN0IG9uZXMgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXlcblxuICBsZXQgaXRlcmFibGUgPSBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlc0l0ZXJhdG9yLmdldChvYmopXG4gIGlmICghaXRlcmFibGUpIHtcbiAgICBpdGVyYWJsZSA9IHtcbiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBsZXQgY3VycmVudDogYW55ID0gb2JqXG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0Q3VycmVudEl0ZXJhdG9yKCkge1xuICAgICAgICAgIGNvbnN0IG9iak13YXJlcyA9IGN1cnJlbnQgPyBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlcy5nZXQoY3VycmVudCkgOiB1bmRlZmluZWRcbiAgICAgICAgICBpZiAoIW9iak13YXJlcyB8fCBvYmpNd2FyZXMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iak13YXJlc1tTeW1ib2wuaXRlcmF0b3JdKClcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGZpbmROZXh0SXRlcmF0b3IoKSB7XG4gICAgICAgICAgbGV0IG5leHRJdGVyXG4gICAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgIW5leHRJdGVyKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gZmFzdEdldFBhcmVudChjdXJyZW50KVxuICAgICAgICAgICAgbmV4dEl0ZXIgPSBnZXRDdXJyZW50SXRlcmF0b3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV4dEl0ZXJcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpdGVyID0gZ2V0Q3VycmVudEl0ZXJhdG9yKClcbiAgICAgICAgaWYgKCFpdGVyKSB7XG4gICAgICAgICAgaXRlciA9IGZpbmROZXh0SXRlcmF0b3IoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3I6IEl0ZXJhdG9yPFBhcnRpYWxBY3Rpb25NaWRkbGV3YXJlPiA9IHtcbiAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgaWYgKCFpdGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gaXRlci5uZXh0KClcbiAgICAgICAgICAgIGlmICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVyID0gZmluZE5leHRJdGVyYXRvcigpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KClcbiAgICAgICAgICB9LFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yXG4gICAgICB9LFxuICAgIH1cbiAgICBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlc0l0ZXJhdG9yLnNldChvYmosIGl0ZXJhYmxlKVxuICB9XG4gIHJldHVybiBpdGVyYWJsZVxufVxuXG4vKipcbiAqIEFkZHMgYSBnbG9iYWwgYWN0aW9uIG1pZGRsZXdhcmUgdG8gYmUgcnVuIHdoZW4gYW4gYWN0aW9uIGlzIHBlcmZvcm1lZC5cbiAqIEl0IGlzIHVzdWFsbHkgcHJlZmVyYWJsZSB0byB1c2UgYG9uQWN0aW9uTWlkZGxld2FyZWAgaW5zdGVhZCB0byBsaW1pdCBpdCB0byBhIGdpdmVuIHRyZWUgYW5kIG9ubHkgdG8gdG9wbW9zdCBsZXZlbCBhY3Rpb25zXG4gKiBvciBgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlYCBmb3IgYSBzaW1wbGlmaWVkIG1pZGRsZXdhcmUuXG4gKlxuICogQHBhcmFtIG13YXJlIEFjdGlvbiBtaWRkbGV3YXJlIHRvIGJlIHJ1bi5cbiAqIEByZXR1cm5zIEEgZGlzcG9zZXIgdG8gY2FuY2VsIHRoZSBtaWRkbGV3YXJlLiBOb3RlIHRoYXQgaWYgeW91IGRvbid0IHBsYW4gdG8gZG8gYW4gZWFybHkgZGlzcG9zYWwgb2YgdGhlIG1pZGRsZXdhcmVcbiAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIG9wdGlvbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQWN0aW9uTWlkZGxld2FyZShtd2FyZTogQWN0aW9uTWlkZGxld2FyZSk6IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB7XG4gIGFzc2VydElzT2JqZWN0KG13YXJlLCBcIm1pZGRsZXdhcmVcIilcblxuICBsZXQgeyBtaWRkbGV3YXJlLCBmaWx0ZXIsIHN1YnRyZWVSb290IH0gPSBtd2FyZVxuXG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwibWlkZGxld2FyZS5zdWJ0cmVlUm9vdFwiKVxuICBhc3NlcnRJc0Z1bmN0aW9uKG1pZGRsZXdhcmUsIFwibWlkZGxld2FyZS5taWRkbGV3YXJlXCIpXG4gIGlmIChmaWx0ZXIgJiYgdHlwZW9mIGZpbHRlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm1pZGRsZXdhcmUuZmlsdGVyIG11c3QgYmUgYSBmdW5jdGlvbiBvciB1bmRlZmluZWRcIilcbiAgfVxuXG4gIC8vIHJlbWluZGVyOiBuZXZlciB0dXJuIG1pZGRsZXdhcmVzIGludG8gYWN0aW9ucyBvciBlbHNlXG4gIC8vIHJlYWN0aW9ucyB3aWxsIG5vdCBiZSBwaWNrZWQgdXAgYnkgdGhlIHVuZG8gbWFuYWdlclxuXG4gIGlmIChzdWJ0cmVlUm9vdCkge1xuICAgIGNvbnN0IHRhcmdldEZpbHRlciA9IChjdHg6IEFjdGlvbkNvbnRleHQpID0+XG4gICAgICBjdHgudGFyZ2V0ID09PSBzdWJ0cmVlUm9vdCB8fCBpc0NoaWxkT2ZQYXJlbnQoY3R4LnRhcmdldCwgc3VidHJlZVJvb3QhKVxuXG4gICAgaWYgKCFmaWx0ZXIpIHtcbiAgICAgIGZpbHRlciA9IHRhcmdldEZpbHRlclxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXN0b21GaWx0ZXIgPSBmaWx0ZXJcbiAgICAgIGZpbHRlciA9IChjdHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRhcmdldEZpbHRlcihjdHgpICYmIGN1c3RvbUZpbHRlcihjdHgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWN0dWFsTXdhcmUgPSB7IG1pZGRsZXdhcmUsIGZpbHRlciB9XG5cbiAgbGV0IG9iak13YXJlcyA9IHBlck9iamVjdEFjdGlvbk1pZGRsZXdhcmVzLmdldChzdWJ0cmVlUm9vdCkhXG4gIGlmICghb2JqTXdhcmVzKSB7XG4gICAgb2JqTXdhcmVzID0gW2FjdHVhbE13YXJlXVxuICAgIHBlck9iamVjdEFjdGlvbk1pZGRsZXdhcmVzLnNldChzdWJ0cmVlUm9vdCwgb2JqTXdhcmVzKVxuICB9IGVsc2Uge1xuICAgIG9iak13YXJlcy5wdXNoKGFjdHVhbE13YXJlKVxuICB9XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkZWxldGVGcm9tQXJyYXkob2JqTXdhcmVzLCBhY3R1YWxNd2FyZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7XG4gIEFjdGlvbkNvbnRleHQsXG4gIEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLFxuICBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCxcbiAgc2V0Q3VycmVudEFjdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgaXNNb2RlbEFjdGlvbiwgbW9kZWxBY3Rpb25TeW1ib2wgfSBmcm9tIFwiLi9pc01vZGVsQWN0aW9uXCJcbmltcG9ydCB7IGdldEFjdGlvbk1pZGRsZXdhcmVzIH0gZnJvbSBcIi4vbWlkZGxld2FyZVwiXG5pbXBvcnQgdHlwZSB7IEZsb3dGaW5pc2hlciB9IGZyb20gXCIuL21vZGVsRmxvd1wiXG5pbXBvcnQgeyB0cnlSdW5QZW5kaW5nQWN0aW9ucyB9IGZyb20gXCIuL3BlbmRpbmdBY3Rpb25zXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gPSAoY3R4OiBPLldyaXRhYmxlPEFjdGlvbkNvbnRleHQ+LCBzZWxmOiBhbnkpID0+IHZvaWRcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbkFjdGlvbjxUIGV4dGVuZHMgRnVuY3Rpb24+KHtcbiAgbmFtZU9yTmFtZUZuLFxuICBmbixcbiAgYWN0aW9uVHlwZSxcbiAgb3ZlcnJpZGVDb250ZXh0LFxuICBpc0Zsb3dGaW5pc2hlciA9IGZhbHNlLFxufToge1xuICBuYW1lT3JOYW1lRm46IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpXG4gIGZuOiBUXG4gIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlXG4gIG92ZXJyaWRlQ29udGV4dD86IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuXG4gIGlzRmxvd0ZpbmlzaGVyPzogYm9vbGVhblxufSk6IFQge1xuICBsZXQgZm5JbkFjdGlvbiA9IGZhbHNlXG5cbiAgY29uc3Qgd3JhcHBlZEFjdGlvbiA9IGZ1bmN0aW9uICh0aGlzOiBhbnkpIHtcbiAgICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVPck5hbWVGbiA9PT0gXCJmdW5jdGlvblwiID8gbmFtZU9yTmFtZUZuKCkgOiBuYW1lT3JOYW1lRm5cblxuICAgIGlmICghZm5JbkFjdGlvbikge1xuICAgICAgZm5JbkFjdGlvbiA9IHRydWVcblxuICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIG9ubHkgaW5uZXIgYWN0aW9ucyBhY3R1YWwgbW9ieCBhY3Rpb25zXG4gICAgICAvLyBzbyByZWFjdGlvbnMgKGUuZy4gcmVmZXJlbmNlIGRldGFjaGluZykgYXJlIHBpY2tlZCB1cCBpbiB0aGVcbiAgICAgIC8vIHJpZ2h0IGNvbnRleHRcbiAgICAgIGZuID0gYWN0aW9uKG5hbWUsIGZuKVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXNcblxuICAgIGNvbnN0IHBhcmVudENvbnRleHQgPSBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCgpXG5cbiAgICBjb25zdCBjb250ZXh0OiBPLldyaXRhYmxlPEFjdGlvbkNvbnRleHQ+ID0ge1xuICAgICAgYWN0aW9uTmFtZTogbmFtZSxcbiAgICAgIHR5cGU6IGFjdGlvblR5cGUsXG4gICAgICB0YXJnZXQsXG4gICAgICBhcmdzOiBBcnJheS5mcm9tKGFyZ3VtZW50cyksXG4gICAgICBwYXJlbnRDb250ZXh0LFxuICAgICAgZGF0YToge30sXG4gICAgICByb290Q29udGV4dDogdW5kZWZpbmVkIGFzIGFueSwgLy8gd2lsbCBiZSBzZXQgYWZ0ZXIgdGhlIG92ZXJyaWRlXG4gICAgfVxuICAgIGlmIChvdmVycmlkZUNvbnRleHQpIHtcbiAgICAgIG92ZXJyaWRlQ29udGV4dChjb250ZXh0LCB0aGlzKVxuICAgIH1cbiAgICBpZiAoIWNvbnRleHQucm9vdENvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0LnByZXZpb3VzQXN5bmNTdGVwQ29udGV4dCkge1xuICAgICAgICBjb250ZXh0LnJvb3RDb250ZXh0ID0gY29udGV4dC5wcmV2aW91c0FzeW5jU3RlcENvbnRleHQucm9vdENvbnRleHRcbiAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5wYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQucm9vdENvbnRleHQgPSBjb250ZXh0LnBhcmVudENvbnRleHQucm9vdENvbnRleHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQucm9vdENvbnRleHQgPSBjb250ZXh0XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudEFjdGlvbkNvbnRleHQoY29udGV4dClcblxuICAgIGxldCBtd2FyZUZuOiAoKSA9PiBhbnkgPSBmbi5iaW5kKHRhcmdldCwgLi4uYXJndW1lbnRzKVxuICAgIGNvbnN0IG13YXJlSXRlciA9IGdldEFjdGlvbk1pZGRsZXdhcmVzKGNvbnRleHQudGFyZ2V0KVtTeW1ib2wuaXRlcmF0b3JdKClcbiAgICBsZXQgbXdhcmVDdXIgPSBtd2FyZUl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFtd2FyZUN1ci5kb25lKSB7XG4gICAgICBjb25zdCBtd2FyZSA9IG13YXJlQ3VyLnZhbHVlXG5cbiAgICAgIGNvbnN0IGZpbHRlclBhc3NlZCA9IG13YXJlLmZpbHRlciA/IG13YXJlLmZpbHRlcihjb250ZXh0KSA6IHRydWVcbiAgICAgIGlmIChmaWx0ZXJQYXNzZWQpIHtcbiAgICAgICAgbXdhcmVGbiA9IG13YXJlLm1pZGRsZXdhcmUuYmluZCh1bmRlZmluZWQsIGNvbnRleHQsIG13YXJlRm4pXG4gICAgICB9XG5cbiAgICAgIG13YXJlQ3VyID0gbXdhcmVJdGVyLm5leHQoKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBtd2FyZUZuKClcblxuICAgICAgaWYgKGlzRmxvd0ZpbmlzaGVyKSB7XG4gICAgICAgIGNvbnN0IGZsb3dGaW5pc2hlciA9IHJldCBhcyBGbG93RmluaXNoZXJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmbG93RmluaXNoZXIudmFsdWVcbiAgICAgICAgaWYgKGZsb3dGaW5pc2hlci5yZXNvbHV0aW9uID09PSBcImFjY2VwdFwiKSB7XG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLmFjY2VwdGVyKHZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZsb3dGaW5pc2hlci5yZWplY3Rlcih2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgLy8gbm90IHN1cmUgaWYgdGhpcyBpcyBldmVuIG5lZWRlZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJldFxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50QWN0aW9uQ29udGV4dChjb250ZXh0LnBhcmVudENvbnRleHQpXG5cbiAgICAgIHRyeVJ1blBlbmRpbmdBY3Rpb25zKClcbiAgICB9XG4gIH1cbiAgOyh3cmFwcGVkQWN0aW9uIGFzIGFueSlbbW9kZWxBY3Rpb25TeW1ib2xdID0gdHJ1ZVxuXG4gIHJldHVybiB3cmFwcGVkQWN0aW9uIGFzIGFueVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1vZGVsTWV0aG9kSW5BY3Rpb25JZk5lZWRlZDxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcHJvcGVydHlLZXk6IGtleW9mIE0sXG4gIG5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IGZuID0gbW9kZWxbcHJvcGVydHlLZXldIGFzIGFueVxuICBpZiAoaXNNb2RlbEFjdGlvbihmbikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRGbiA9IHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgIGZuLFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICBjb25zdCBwcm90b0ZuID0gcHJvdG9bcHJvcGVydHlLZXldXG4gIGlmIChwcm90b0ZuID09PSBmbikge1xuICAgIHByb3RvW3Byb3BlcnR5S2V5XSA9IHdyYXBwZWRGblxuICB9IGVsc2Uge1xuICAgIG1vZGVsW3Byb3BlcnR5S2V5XSA9IHdyYXBwZWRGblxuICB9XG59XG4iLCJpbXBvcnQgeyBpc09ic2VydmFibGVBcnJheSwgaXNPYnNlcnZhYmxlT2JqZWN0LCByZW1vdmUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL3dyYXBJbkFjdGlvblwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnRQYXRoSW5jbHVkaW5nRGF0YU9iamVjdHMgfSBmcm9tIFwiLi9wYXRoXCJcblxuLyoqXG4gKiBEZXRhY2hlcyBhIGdpdmVuIG9iamVjdCBmcm9tIGEgdHJlZS5cbiAqIElmIHRoZSBwYXJlbnQgaXMgYW4gb2JqZWN0IC8gbW9kZWwsIGRldGFjaGluZyB3aWxsIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gKiBJZiB0aGUgcGFyZW50IGlzIGFuIGFycmF5IGRldGFjaGluZyB3aWxsIHJlbW92ZSB0aGUgbm9kZSBieSBzcGxpY2luZyBpdC5cbiAqIElmIHRoZXJlJ3Mgbm8gcGFyZW50IGl0IHdpbGwgdGhyb3cuXG4gKlxuICogQHBhcmFtIG5vZGUgT2JqZWN0IHRvIGJlIGRldGFjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0YWNoKG5vZGU6IG9iamVjdCk6IHZvaWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIHdyYXBwZWRJbnRlcm5hbERldGFjaCgpLmNhbGwobm9kZSlcbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsRGV0YWNoID0gbGF6eSgoKSA9PlxuICB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogQnVpbHRJbkFjdGlvbi5EZXRhY2gsXG4gICAgZm46IGludGVybmFsRGV0YWNoLFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG5cbmZ1bmN0aW9uIGludGVybmFsRGV0YWNoKHRoaXM6IG9iamVjdCk6IHZvaWQge1xuICBjb25zdCBub2RlID0gdGhpc1xuXG4gIGNvbnN0IHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzKG5vZGUpXG4gIGlmICghcGFyZW50UGF0aCkgcmV0dXJuXG5cbiAgY29uc3QgeyBwYXJlbnQsIHBhdGggfSA9IHBhcmVudFBhdGhcbiAgaWYgKGlzT2JzZXJ2YWJsZUFycmF5KHBhcmVudCkpIHtcbiAgICBwYXJlbnQuc3BsaWNlKCtwYXRoLCAxKVxuICB9IGVsc2UgaWYgKGlzT2JzZXJ2YWJsZU9iamVjdChwYXJlbnQpKSB7XG4gICAgcmVtb3ZlKHBhcmVudCwgXCJcIiArIHBhdGgpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShcInBhcmVudCBtdXN0IGJlIGFuIG9ic2VydmFibGUgb2JqZWN0IG9yIGFuIG9ic2VydmFibGUgYXJyYXlcIilcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tNb2RlbERlY29yYXRvckFyZ3MoZm5OYW1lOiBzdHJpbmcsIHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSB7XG4gIGlmICh0eXBlb2YgcHJvcGVydHlLZXkgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2ZuTmFtZX0gY2Fubm90IGJlIHVzZWQgb3ZlciBzeW1ib2wgcHJvcGVydGllc2ApXG4gIH1cblxuICBjb25zdCBlcnJNZXNzYWdlID0gYCR7Zm5OYW1lfSBtdXN0IGJlIHVzZWQgb3ZlciBtb2RlbCBjbGFzc2VzIG9yIGluc3RhbmNlc2BcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIC8vIGNoZWNrIHRhcmdldCBpcyBhIG1vZGVsIG9iamVjdCBvciBleHRlbmRlZCBjbGFzc1xuICBjb25zdCBpc01vZGVsID1cbiAgICB0YXJnZXQgaW5zdGFuY2VvZiBCYXNlTW9kZWwgfHwgdGFyZ2V0ID09PSBCYXNlTW9kZWwgfHwgdGFyZ2V0LnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VNb2RlbFxuICBpZiAoaXNNb2RlbCkgcmV0dXJuXG5cbiAgY29uc3QgaXNEYXRhTW9kZWwgPVxuICAgIHRhcmdldCBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWwgfHxcbiAgICB0YXJnZXQgPT09IEJhc2VEYXRhTW9kZWwgfHxcbiAgICB0YXJnZXQucHJvdG90eXBlIGluc3RhbmNlb2YgQmFzZURhdGFNb2RlbFxuICBpZiAoaXNEYXRhTW9kZWwpIHJldHVyblxuXG4gIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbn1cbiIsImltcG9ydCB7IHNldERhdGFNb2RlbEFjdGlvbiB9IGZyb20gXCIuLi9kYXRhTW9kZWwvYWN0aW9uc1wiXG5pbXBvcnQgeyBpc0RhdGFNb2RlbCwgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgcnVuQWZ0ZXJNb2RlbERlY29yYXRvclN5bWJvbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbFN5bWJvbHNcIlxuaW1wb3J0IHsgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24gfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uTmFtZUFuZENvbnRleHRPdmVycmlkZShcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmdcbik6IHtcbiAgYWN0aW9uTmFtZTogc3RyaW5nIHwgKCgpID0+IHN0cmluZylcbiAgb3ZlcnJpZGVDb250ZXh0OiBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGbiB8IHVuZGVmaW5lZFxufSB7XG4gIGxldCBhY3Rpb25OYW1lOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSA9IHByb3BlcnR5S2V5XG4gIGxldCBvdmVycmlkZUNvbnRleHQ6IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuIHwgdW5kZWZpbmVkXG5cbiAgaWYgKGlzRGF0YU1vZGVsQ2xhc3ModGFyZ2V0KSB8fCBpc0RhdGFNb2RlbCh0YXJnZXQpKSB7XG4gICAgb3ZlcnJpZGVDb250ZXh0ID0gKGN0eCwgc2VsZikgPT4ge1xuICAgICAgY3R4LnRhcmdldCA9IHNlbGYuJFxuICAgIH1cblxuICAgIGxldCBmdWxsQWN0aW9uTmFtZTogc3RyaW5nXG4gICAgYWN0aW9uTmFtZSA9ICgpID0+IGZ1bGxBY3Rpb25OYW1lXG5cbiAgICBjb25zdCBtb2RlbENsYXNzOiBhbnkgPSBpc0RhdGFNb2RlbENsYXNzKHRhcmdldCkgPyB0YXJnZXQgOiB0YXJnZXQuY29uc3RydWN0b3JcblxuICAgIGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uKG1vZGVsQ2xhc3MsIHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wsIChmaW5hbENsYXNzKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChmaW5hbENsYXNzKSFcbiAgICAgIGZ1bGxBY3Rpb25OYW1lID0gYGZuOjoke21vZGVsSW5mby5uYW1lfTo6JHtwcm9wZXJ0eUtleX1gXG4gICAgICBzZXREYXRhTW9kZWxBY3Rpb24oZnVsbEFjdGlvbk5hbWUsIG1vZGVsSW5mby5jbGFzcywgcHJvcGVydHlLZXkpXG4gICAgfSlcbiAgfVxuICByZXR1cm4geyBhY3Rpb25OYW1lLCBvdmVycmlkZUNvbnRleHQgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB7IGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL2NoZWNrTW9kZWxEZWNvcmF0b3JBcmdzXCJcbmltcG9ydCB7IGRlY29yYXRlV3JhcE1ldGhvZE9yRmllbGQsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0QWN0aW9uTmFtZUFuZENvbnRleHRPdmVycmlkZSB9IGZyb20gXCIuL2FjdGlvbkRlY29yYXRvclV0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHQsIEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLCBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZSB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uLCBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGbiB9IGZyb20gXCIuL3dyYXBJbkFjdGlvblwiXG5cbmNvbnN0IG1vZGVsRmxvd1N5bWJvbCA9IFN5bWJvbChcIm1vZGVsRmxvd1wiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxvdzxSLCBBcmdzIGV4dGVuZHMgYW55W10+KHtcbiAgbmFtZU9yTmFtZUZuLFxuICBnZW5lcmF0b3IsXG4gIG92ZXJyaWRlQ29udGV4dCxcbn06IHtcbiAgbmFtZU9yTmFtZUZuOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKVxuICBnZW5lcmF0b3I6ICguLi5hcmdzOiBBcmdzKSA9PiBJdGVyYWJsZUl0ZXJhdG9yPGFueT5cbiAgb3ZlcnJpZGVDb250ZXh0PzogV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm5cbn0pOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxhbnk+IHtcbiAgLy8gSW1wbGVtZW50YXRpb24gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3RqL2NvL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG4gIGNvbnN0IGZsb3dGbiA9IGZ1bmN0aW9uICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JOYW1lRm4gPT09IFwiZnVuY3Rpb25cIiA/IG5hbWVPck5hbWVGbigpIDogbmFtZU9yTmFtZUZuXG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzXG5cbiAgICBsZXQgcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0OiBBY3Rpb25Db250ZXh0IHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBjdHhPdmVycmlkZSA9IChzdGVwVHlwZTogQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUpOiBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGbiA9PiB7XG4gICAgICByZXR1cm4gKGN0eDogTy5Xcml0YWJsZTxBY3Rpb25Db250ZXh0Piwgc2VsZikgPT4ge1xuICAgICAgICBpZiAob3ZlcnJpZGVDb250ZXh0KSB7XG4gICAgICAgICAgb3ZlcnJpZGVDb250ZXh0KGN0eCwgc2VsZilcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5wcmV2aW91c0FzeW5jU3RlcENvbnRleHQgPSBwcmV2aW91c0FzeW5jU3RlcENvbnRleHRcbiAgICAgICAgY3R4LnNwYXduQXN5bmNTdGVwQ29udGV4dCA9IHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dFxuICAgICAgICAgID8gcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0LnNwYXduQXN5bmNTdGVwQ29udGV4dFxuICAgICAgICAgIDogY3R4XG4gICAgICAgIGN0eC5hc3luY1N0ZXBUeXBlID0gc3RlcFR5cGVcbiAgICAgICAgY3R4LmFyZ3MgPSBhcmdzXG5cbiAgICAgICAgcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0ID0gY3R4XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRvclJ1biA9IGZhbHNlXG4gICAgY29uc3QgZ2VuID0gd3JhcEluQWN0aW9uKHtcbiAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgIGZuOiAoKSA9PiB7XG4gICAgICAgIGdlbmVyYXRvclJ1biA9IHRydWVcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5hcHBseSh0YXJnZXQsIGFyZ3MgYXMgQXJncylcbiAgICAgIH0sXG4gICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuU3Bhd24pLFxuICAgIH0pLmFwcGx5KHRhcmdldClcblxuICAgIGlmICghZ2VuZXJhdG9yUnVuKSB7XG4gICAgICAvLyBtYXliZSBpdCBnb3Qgb3ZlcnJpZGRlbiBpbnRvIGEgc3luYyBhY3Rpb25cblxuICAgICAgcmV0dXJuIGdlbiBpbnN0YW5jZW9mIFByb21pc2UgPyBnZW4gOiBQcm9taXNlLnJlc29sdmUoZ2VuKVxuICAgIH1cblxuICAgIC8vIHVzZSBib3VuZCBmdW5jdGlvbnMgdG8gZml4IGVzNiBjb21waWxhdGlvblxuICAgIGNvbnN0IGdlbk5leHQgPSBnZW4ubmV4dC5iaW5kKGdlbilcbiAgICBjb25zdCBnZW5UaHJvdyA9IGdlbi50aHJvdyEuYmluZChnZW4pXG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8Uj4oZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gb25GdWxmaWxsZWQocmVzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJldFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldCA9IHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICAgICAgICBmbjogZ2VuTmV4dCxcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jLFxuICAgICAgICAgICAgb3ZlcnJpZGVDb250ZXh0OiBjdHhPdmVycmlkZShBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWUpLFxuICAgICAgICAgIH0pLmNhbGwodGFyZ2V0LCByZXMpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgICAgICAgICAgZm46IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSB1c2UgYSBmbG93IGZpbmlzaGVyIHRvIGFsbG93IG1pZGRsZXdhcmVzIHRvIHR3ZWFrIHRoZSByZXR1cm4gdmFsdWUgYmVmb3JlIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXJyLFxuICAgICAgICAgICAgICAgIHJlc29sdXRpb246IFwicmVqZWN0XCIsXG5cbiAgICAgICAgICAgICAgICBhY2NlcHRlcjogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3RlcjogcmVqZWN0LFxuICAgICAgICAgICAgICB9IGFzIEZsb3dGaW5pc2hlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jLFxuICAgICAgICAgICAgb3ZlcnJpZGVDb250ZXh0OiBjdHhPdmVycmlkZShBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5UaHJvdyksXG4gICAgICAgICAgICBpc0Zsb3dGaW5pc2hlcjogdHJ1ZSxcbiAgICAgICAgICB9KS5jYWxsKHRhcmdldCwgZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHQocmV0KVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlamVjdGVkKGVycjogYW55KTogdm9pZCB7XG4gICAgICAgIGxldCByZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgICAgICAgICAgZm46IGdlblRocm93LFxuICAgICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICAgICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJlc3VtZUVycm9yKSxcbiAgICAgICAgICB9KS5jYWxsKHRhcmdldCwgZXJyKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgICAgICAgIGZuOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgZmxvdyBmaW5pc2hlciB0byBhbGxvdyBtaWRkbGV3YXJlcyB0byB0d2VhayB0aGUgcmV0dXJuIHZhbHVlIGJlZm9yZSByZXNvbHV0aW9uXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVycixcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiBcInJlamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgYWNjZXB0ZXI6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0ZXI6IHJlamVjdCxcbiAgICAgICAgICAgICAgfSBhcyBGbG93RmluaXNoZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgICAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuVGhyb3cpLFxuICAgICAgICAgICAgaXNGbG93RmluaXNoZXI6IHRydWUsXG4gICAgICAgICAgfSkuY2FsbCh0YXJnZXQsIGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBuZXh0KHJldClcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbmV4dChyZXQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAocmV0ICYmIHR5cGVvZiByZXQudGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gYW4gYXN5bmMgaXRlcmF0b3JcbiAgICAgICAgICByZXQudGhlbihuZXh0LCByZWplY3QpXG4gICAgICAgIH0gZWxzZSBpZiAocmV0LmRvbmUpIHtcbiAgICAgICAgICAvLyBkb25lXG4gICAgICAgICAgd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgICAgICAgIGZuOiAodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgZmxvdyBmaW5pc2hlciB0byBhbGxvdyBtaWRkbGV3YXJlcyB0byB0d2VhayB0aGUgcmV0dXJuIHZhbHVlIGJlZm9yZSByZXNvbHV0aW9uXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiBcImFjY2VwdFwiLFxuXG4gICAgICAgICAgICAgICAgYWNjZXB0ZXI6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0ZXI6IHJlamVjdCxcbiAgICAgICAgICAgICAgfSBhcyBGbG93RmluaXNoZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgICAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmV0dXJuKSxcbiAgICAgICAgICAgIGlzRmxvd0ZpbmlzaGVyOiB0cnVlLFxuICAgICAgICAgIH0pLmNhbGwodGFyZ2V0LCByZXQudmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29udGludWVcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmV0LnZhbHVlKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9uRnVsZmlsbGVkKHVuZGVmaW5lZCkgLy8ga2ljayBvZmYgdGhlIHByb2Nlc3NcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuICA7KGZsb3dGbiBhcyBhbnkpW21vZGVsRmxvd1N5bWJvbF0gPSB0cnVlXG5cbiAgcmV0dXJuIGZsb3dGblxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dGaW5pc2hlciB7XG4gIHZhbHVlOiBhbnlcbiAgcmVzb2x1dGlvbjogXCJhY2NlcHRcIiB8IFwicmVqZWN0XCJcblxuICBhY2NlcHRlcih2YWx1ZTogYW55KTogdm9pZFxuICByZWplY3Rlcih2YWx1ZTogYW55KTogdm9pZFxufVxuXG4vKipcbiAqIFJldHVybnMgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIGEgbW9kZWwgZmxvdyBvciBub3QuXG4gKlxuICogQHBhcmFtIGZuIEZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxGbG93KGZuOiB1bmtub3duKSB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiAmJiBtb2RlbEZsb3dTeW1ib2wgaW4gZm5cbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCB0dXJucyBhIGZ1bmN0aW9uIGdlbmVyYXRvciBpbnRvIGEgbW9kZWwgZmxvdy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcHJvcGVydHlLZXlcbiAqIEBwYXJhbSBbYmFzZURlc2NyaXB0b3JdXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxGbG93KFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgYmFzZURlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3Jcbik6IHZvaWQge1xuICBjb25zdCB7IGFjdGlvbk5hbWUsIG92ZXJyaWRlQ29udGV4dCB9ID0gZ2V0QWN0aW9uTmFtZUFuZENvbnRleHRPdmVycmlkZSh0YXJnZXQsIHByb3BlcnR5S2V5KVxuXG4gIHJldHVybiBkZWNvcmF0ZVdyYXBNZXRob2RPckZpZWxkKFxuICAgIFwibW9kZWxGbG93XCIsXG4gICAge1xuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXksXG4gICAgICBiYXNlRGVzY3JpcHRvcixcbiAgICB9LFxuICAgIChkYXRhLCBmbikgPT4ge1xuICAgICAgaWYgKGlzTW9kZWxGbG93KGZuKSkge1xuICAgICAgICByZXR1cm4gZm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrTW9kZWxGbG93QXJncyhkYXRhLnRhcmdldCwgZGF0YS5wcm9wZXJ0eUtleSwgZm4pXG5cbiAgICAgICAgcmV0dXJuIGZsb3coeyBuYW1lT3JOYW1lRm46IGFjdGlvbk5hbWUsIGdlbmVyYXRvcjogZm4sIG92ZXJyaWRlQ29udGV4dCB9KVxuICAgICAgfVxuICAgIH1cbiAgKVxufVxuXG5mdW5jdGlvbiBjaGVja01vZGVsRmxvd0FyZ3ModGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm1vZGVsRmxvdyBoYXMgdG8gYmUgdXNlZCBvdmVyIGZ1bmN0aW9uc1wiKVxuICB9XG4gIGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzKFwibW9kZWxGbG93XCIsIHRhcmdldCwgcHJvcGVydHlLZXkpXG59XG5cbi8qKlxuICogVHJpY2tzIHRoZSBUUyBjb21waWxlciBpbnRvIHRoaW5raW5nIHRoYXQgYSBtb2RlbCBmbG93IGdlbmVyYXRvciBmdW5jdGlvbiBjYW4gYmUgYXdhaXRlZFxuICogKGlzIGEgcHJvbWlzZSkuXG4gKlxuICogQHR5cGVwYXJhbSBBIEZ1bmN0aW9uIGFyZ3VtZW50cy5cbiAqIEB0eXBlcGFyYW0gUiBSZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gZm4gRmxvdyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYXN5bmM8QSBleHRlbmRzIGFueVtdLCBSPihcbiAgZm46ICguLi5hcmdzOiBBKSA9PiBHZW5lcmF0b3I8YW55LCBSLCBhbnk+XG4pOiAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiB7XG4gIHJldHVybiBmbiBhcyBhbnlcbn1cblxuLyoqXG4gKiBNYWtlcyBhIHByb21pc2UgYSBmbG93LCBzbyBpdCBjYW4gYmUgYXdhaXRlZCB3aXRoIHlpZWxkKi5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUHJvbWlzZSByZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSBwcm9taXNlIFByb21pc2UuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gX2F3YWl0PFQ+KHByb21pc2U6IFByb21pc2U8VD4pOiBHZW5lcmF0b3I8UHJvbWlzZTxUPiwgVCwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvbWlzZUdlbmVyYXRvci5jYWxsKHByb21pc2UpXG59XG5cbi8qXG5mdW5jdGlvbiogcHJvbWlzZUdlbmVyYXRvcjxUPihcbiAgdGhpczogUHJvbWlzZTxUPlxuKSB7XG4gIGNvbnN0IHJldDogVCA9IHlpZWxkIHRoaXNcbiAgcmV0dXJuIHJldFxufVxuKi9cblxuLy8gYWJvdmUgY29kZSBidXQgY29tcGlsZWQgYnkgVFMgZm9yIEVTNVxuLy8gc28gd2UgZG9uJ3QgaW5jbHVkZSBhIGRlcGVuZGVuY3kgdG8gcmVnZW5lcmF0b3IgcnVudGltZVxuXG5jb25zdCBfX2dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnOiBhbnksIGJvZHk6IGFueSkge1xuICBsZXQgXzogYW55ID0ge1xuICAgICAgbGFiZWw6IDAsXG4gICAgICBzZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXVxuICAgICAgICByZXR1cm4gdFsxXVxuICAgICAgfSxcbiAgICAgIHRyeXM6IFtdLFxuICAgICAgb3BzOiBbXSxcbiAgICB9LFxuICAgIGY6IGFueSxcbiAgICB5OiBhbnksXG4gICAgdDogYW55LFxuICAgIGc6IGFueVxuICByZXR1cm4gKFxuICAgIChnID0geyBuZXh0OiB2ZXJiKDApLCB0aHJvdzogdmVyYigxKSwgcmV0dXJuOiB2ZXJiKDIpIH0pLFxuICAgIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgIH0pLFxuICAgIGdcbiAgKVxuICBmdW5jdGlvbiB2ZXJiKG46IGFueSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodjogYW55KSB7XG4gICAgICByZXR1cm4gc3RlcChbbiwgdl0pXG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHN0ZXAob3A6IGFueSkge1xuICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKVxuICAgIHdoaWxlIChfKVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgoZiA9IDEpLFxuICAgICAgICAgIHkgJiZcbiAgICAgICAgICAgICh0ID1cbiAgICAgICAgICAgICAgb3BbMF0gJiAyXG4gICAgICAgICAgICAgICAgPyB5W1wicmV0dXJuXCJdXG4gICAgICAgICAgICAgICAgOiBvcFswXVxuICAgICAgICAgICAgICAgID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMClcbiAgICAgICAgICAgICAgICA6IHkubmV4dCkgJiZcbiAgICAgICAgICAgICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gdFxuICAgICAgICBpZiAoKCh5ID0gMCksIHQpKSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdXG4gICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdCA9IG9wXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF8ubGFiZWwrK1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgXy5sYWJlbCsrXG4gICAgICAgICAgICB5ID0gb3BbMV1cbiAgICAgICAgICAgIG9wID0gWzBdXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKClcbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKCh0ID0gXy50cnlzKSwgKHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSkgJiZcbiAgICAgICAgICAgICAgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIF8gPSAwXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV1cbiAgICAgICAgICAgICAgdCA9IG9wXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXVxuICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpXG4gICAgICAgICAgICBfLnRyeXMucG9wKClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXylcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb3AgPSBbNiwgZV1cbiAgICAgICAgeSA9IDBcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGYgPSB0ID0gMFxuICAgICAgfVxuICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdXG4gICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb21pc2VHZW5lcmF0b3IodGhpczogUHJvbWlzZTxhbnk+KSB7XG4gIGxldCByZXRcbiAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uICh0aGlzOiBhbnksIF9hOiBhbnkpIHtcbiAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNdXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldCA9IF9hLnNlbnQoKVxuICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmV0XVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgaXNNb2RlbEFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vaXNNb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBmbG93LCBpc01vZGVsRmxvdyB9IGZyb20gXCIuLi9hY3Rpb24vbW9kZWxGbG93XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vd3JhcEluQWN0aW9uXCJcbmltcG9ydCB7IGFzc2VydElzVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzRnVuY3Rpb24sIGZhaWx1cmUsIGxvZ1dhcm5pbmcgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2l0aCBhbiBvYmplY3QgYXMgdGFyZ2V0LlxuICovXG50eXBlIFRhcmdldGVkQWN0aW9uID0gKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5cbmNvbnN0IHN0YW5kYWxvbmVBY3Rpb25SZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBUYXJnZXRlZEFjdGlvbj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhbG9uZUFjdGlvbihhY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0YW5kYWxvbmVBY3Rpb25SZWdpc3RyeS5nZXQoYWN0aW9uTmFtZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0YW5kYWxvbmVBY3Rpb24oZnVsbEFjdGlvbk5hbWU6IHN0cmluZywgZm46IFRhcmdldGVkQWN0aW9uLCBpc0Zsb3c6IGJvb2xlYW4pIHtcbiAgYXNzZXJ0SXNGdW5jdGlvbihmbiwgZnVsbEFjdGlvbk5hbWUpXG5cbiAgaWYgKHN0YW5kYWxvbmVBY3Rpb25SZWdpc3RyeS5oYXMoZnVsbEFjdGlvbk5hbWUpKSB7XG4gICAgbG9nV2FybmluZyhcbiAgICAgIFwid2FyblwiLFxuICAgICAgYGFuIHN0YW5kYWxvbmUgYWN0aW9uIHdpdGggbmFtZSBcIiR7ZnVsbEFjdGlvbk5hbWV9XCIgYWxyZWFkeSBleGlzdHMgKGlmIHlvdSBhcmUgdXNpbmcgaG90LXJlbG9hZGluZyB5b3UgbWF5IHNhZmVseSBpZ25vcmUgdGhpcyB3YXJuaW5nKWAsXG4gICAgICBgZHVwbGljYXRlQWN0aW9uTmFtZSAtICR7ZnVsbEFjdGlvbk5hbWV9YFxuICAgIClcbiAgfVxuXG4gIGlmIChpc01vZGVsQWN0aW9uKGZuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJ0aGUgc3RhbmRhbG9uZSBhY3Rpb24gbXVzdCBub3QgYmUgcHJldmlvdXNseSBtYXJrZWQgYXMgYW4gYWN0aW9uXCIpXG4gIH1cbiAgaWYgKGlzTW9kZWxGbG93KGZuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJ0aGUgc3RhbmRhbG9uZSBhY3Rpb24gbXVzdCBub3QgYmUgcHJldmlvdXNseSBtYXJrZWQgYXMgYSBmbG93IGFjdGlvblwiKVxuICB9XG5cbiAgY29uc3Qgd3JhcHBlZEFjdGlvbiA9IGlzRmxvd1xuICAgID8gZmxvdyh7IG5hbWVPck5hbWVGbjogZnVsbEFjdGlvbk5hbWUsIGdlbmVyYXRvcjogZm4gfSlcbiAgICA6IHdyYXBJbkFjdGlvbih7XG4gICAgICAgIG5hbWVPck5hbWVGbjogZnVsbEFjdGlvbk5hbWUsXG4gICAgICAgIGZuLFxuICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICAgICAgfSlcblxuICBjb25zdCBmaW5hbEFjdGlvbiA9ICh0YXJnZXQ6IGFueSwgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBhc3NlcnRJc1RyZWVOb2RlKHRhcmdldCwgXCJ0YXJnZXRcIilcblxuICAgIC8vIHdlIG5lZWQgdG8gcHV0IHRoZSB0YXJnZXQgaW50byB0aGlzXG4gICAgcmV0dXJuIHdyYXBwZWRBY3Rpb24uY2FsbCh0YXJnZXQsIHRhcmdldCwgLi4uYXJncylcbiAgfVxuXG4gIHN0YW5kYWxvbmVBY3Rpb25SZWdpc3RyeS5zZXQoZnVsbEFjdGlvbk5hbWUsIGZpbmFsQWN0aW9uKVxuICByZXR1cm4gZmluYWxBY3Rpb25cbn1cbiIsImltcG9ydCB7IHJlbW92ZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG4vKipcbiAqIERlbGV0ZXMgYW4gb2JqZWN0IGZpZWxkIHdyYXBwZWQgaW4gYW4gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSBub2RlICBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIGZpZWxkTmFtZSBGaWVsZCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWxldGU8TyBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIE8+KG5vZGU6IE8sIGZpZWxkTmFtZTogSyk6IHZvaWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiLCB0cnVlKVxuXG4gIHdyYXBwZWRJbnRlcm5hbEFwcGx5RGVsZXRlKCkuY2FsbChub2RlLCBmaWVsZE5hbWUgYXMgc3RyaW5nIHwgbnVtYmVyKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxBcHBseURlbGV0ZTxPIGV4dGVuZHMgb2JqZWN0Pih0aGlzOiBPLCBmaWVsZE5hbWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICByZW1vdmUodGhpcywgXCJcIiArIGZpZWxkTmFtZSlcbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlEZWxldGUgPSBsYXp5KCgpID0+XG4gIHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBCdWlsdEluQWN0aW9uLkFwcGx5RGVsZXRlLFxuICAgIGZuOiBpbnRlcm5hbEFwcGx5RGVsZXRlLFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG4iLCJpbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxudHlwZSBBbnlGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5cbi8qKlxuICogQ2FsbHMgYW4gb2JqZWN0IG1ldGhvZCB3cmFwcGVkIGluIGFuIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNZXRob2RDYWxsPE8gZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBPLCBGTiBleHRlbmRzIE9bS10+KFxuICBub2RlOiBPLFxuICBtZXRob2ROYW1lOiBLLFxuICAuLi5hcmdzOiBGTiBleHRlbmRzIEFueUZ1bmN0aW9uID8gUGFyYW1ldGVyczxGTj4gOiBuZXZlclxuKTogRk4gZXh0ZW5kcyBBbnlGdW5jdGlvbiA/IFJldHVyblR5cGU8Rk4+IDogbmV2ZXIge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIHJldHVybiB3cmFwcGVkSW50ZXJuYWxBcHBseU1ldGhvZENhbGwoKS5jYWxsKG5vZGUsIG1ldGhvZE5hbWUgYXMgc3RyaW5nIHwgbnVtYmVyLCBhcmdzKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxBcHBseU1ldGhvZENhbGwodGhpczogYW55LCBtZXRob2ROYW1lOiBzdHJpbmcgfCBudW1iZXIsIGFyZ3M6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0oLi4uYXJncylcbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlNZXRob2RDYWxsID0gbGF6eSgoKSA9PlxuICB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogQnVpbHRJbkFjdGlvbi5BcHBseU1ldGhvZENhbGwsXG4gICAgZm46IGludGVybmFsQXBwbHlNZXRob2RDYWxsLFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG4iLCJpbXBvcnQgeyBpc09ic2VydmFibGUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuL3dyYXBJbkFjdGlvblwiXG5cbi8qKlxuICogU2V0cyBhbiBvYmplY3QgZmllbGQgd3JhcHBlZCBpbiBhbiBhY3Rpb24uXG4gKlxuICogQHBhcmFtIG5vZGUgIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gZmllbGROYW1lIEZpZWxkIG5hbWUuXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZXQ8TyBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIE8sIFYgZXh0ZW5kcyBPW0tdPihcbiAgbm9kZTogTyxcbiAgZmllbGROYW1lOiBLLFxuICB2YWx1ZTogVlxuKTogdm9pZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIsIHRydWUpXG5cbiAgd3JhcHBlZEludGVybmFsQXBwbHlTZXQoKS5jYWxsKG5vZGUsIGZpZWxkTmFtZSBhcyBzdHJpbmcgfCBudW1iZXIsIHZhbHVlKVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbEFwcGx5U2V0PE8gZXh0ZW5kcyBvYmplY3Q+KHRoaXM6IE8sIGZpZWxkTmFtZTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgYSBtb2RlbCBzaW5jZSBtb2RlbHMgY2FuIGJlY29tZSBvYnNlcnZhYmxlIG9iamVjdHNcbiAgLy8gKGUuZy4gYnkgaGF2aW5nIGEgY29tcHV0ZWQgdmFsdWUpXG4gIGlmICghaXNNb2RlbCh0aGlzKSAmJiBpc09ic2VydmFibGUodGhpcykpIHtcbiAgICBzZXQodGhpcywgZmllbGROYW1lLCB2YWx1ZSlcbiAgfSBlbHNlIHtcbiAgICA7KHRoaXMgYXMgYW55KVtmaWVsZE5hbWVdID0gdmFsdWVcbiAgfVxufVxuXG5jb25zdCB3cmFwcGVkSW50ZXJuYWxBcHBseVNldCA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlTZXQsXG4gICAgZm46IGludGVybmFsQXBwbHlTZXQsXG4gICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgfSlcbilcbiIsImltcG9ydCB7IGdldERhdGFNb2RlbEFjdGlvbiB9IGZyb20gXCIuLi9kYXRhTW9kZWwvYWN0aW9uc1wiXG5pbXBvcnQgeyBkZXRhY2ggfSBmcm9tIFwiLi4vcGFyZW50L2RldGFjaFwiXG5pbXBvcnQgeyByZXNvbHZlUGF0aENoZWNraW5nSWRzIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IGFwcGx5U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvYXBwbHlTbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTdGFuZGFsb25lQWN0aW9uIH0gZnJvbSBcIi4uL3N0YW5kYXJkQWN0aW9ucy9hY3Rpb25zXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgYXBwbHlEZWxldGUgfSBmcm9tIFwiLi9hcHBseURlbGV0ZVwiXG5pbXBvcnQgeyBhcHBseU1ldGhvZENhbGwgfSBmcm9tIFwiLi9hcHBseU1ldGhvZENhbGxcIlxuaW1wb3J0IHsgYXBwbHlTZXQgfSBmcm9tIFwiLi9hcHBseVNldFwiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uLCBpc0J1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBpc0hvb2tBY3Rpb24gfSBmcm9tIFwiLi9ob29rQWN0aW9uc1wiXG5cbi8qKlxuICogQW4gYWN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uQ2FsbCB7XG4gIC8qKlxuICAgKiBBY3Rpb24gbmFtZSAobmFtZSBvZiB0aGUgZnVuY3Rpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEFjdGlvbiBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBhcmdzOiBSZWFkb25seUFycmF5PGFueT5cblxuICAvKipcbiAgICogUGF0aCB0byB0aGUgbW9kZWwgd2hlcmUgdGhlIGFjdGlvbiB3aWxsIGJlIHJ1biwgYXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHwgbnVtYmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aDogUGF0aFxuXG4gIC8qKlxuICAgKiBJZHMgb2YgbW9kZWxzIGFsb25nIHRoZSBwYXRoIHRvIHRoZSB0YXJnZXQsIG51bGwgaWYgaXQgaXMgbm90IGEgbW9kZWwuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoSWRzOiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bGw+XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoaXMgYWN0aW9uIGNhbGwgYXMgbm9uLXNlcmlhbGl6ZWQuXG4gICAqL1xuICByZWFkb25seSBzZXJpYWxpemVkPzogdW5kZWZpbmVkXG59XG5cbmNvbnN0IGJ1aWx0SW5BY3Rpb25Ub0Z1bmN0aW9uID0ge1xuICBbQnVpbHRJbkFjdGlvbi5BcHBseVNuYXBzaG90XTogYXBwbHlTbmFwc2hvdCxcbiAgW0J1aWx0SW5BY3Rpb24uQXBwbHlQYXRjaGVzXTogYXBwbHlQYXRjaGVzLFxuICBbQnVpbHRJbkFjdGlvbi5EZXRhY2hdOiBkZXRhY2gsXG4gIFtCdWlsdEluQWN0aW9uLkFwcGx5U2V0XTogYXBwbHlTZXQsXG4gIFtCdWlsdEluQWN0aW9uLkFwcGx5RGVsZXRlXTogYXBwbHlEZWxldGUsXG4gIFtCdWlsdEluQWN0aW9uLkFwcGx5TWV0aG9kQ2FsbF06IGFwcGx5TWV0aG9kQ2FsbCxcbn1cblxuLyoqXG4gKiBBcHBsaWVzIChydW5zKSBhbiBhY3Rpb24gb3ZlciBhIHRhcmdldCBvYmplY3QuXG4gKlxuICogSWYgeW91IGludGVuZCB0byBhcHBseSBzZXJpYWxpemVkIGFjdGlvbnMgY2hlY2sgb25lIG9mIHRoZSBgYXBwbHlTZXJpYWxpemVkQWN0aW9uYCBtZXRob2RzIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0IHRvIHJ1biB0aGUgYWN0aW9uIG92ZXIuXG4gKiBAcGFyYW0gY2FsbCBUaGUgYWN0aW9uLCB1c3VhbGx5IGFzIGNvbWluZyBmcm9tIGBvbkFjdGlvbk1pZGRsZXdhcmVgLlxuICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFjdGlvbjxUUmV0ID0gYW55PihzdWJ0cmVlUm9vdDogb2JqZWN0LCBjYWxsOiBBY3Rpb25DYWxsKTogVFJldCB7XG4gIGlmIChjYWxsLnNlcmlhbGl6ZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgXCJjYW5ub3QgYXBwbHkgYSBzZXJpYWxpemVkIGFjdGlvbiBjYWxsLCB1c2Ugb25lIG9mIHRoZSAnYXBwbHlTZXJpYWxpemVkQWN0aW9uJyBtZXRob2RzIGluc3RlYWRcIlxuICAgIClcbiAgfVxuXG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICAvLyByZXNvbHZlIHBhdGggd2hpbGUgY2hlY2tpbmcgaWRzXG4gIGNvbnN0IHsgdmFsdWU6IGN1cnJlbnQsIHJlc29sdmVkIH0gPSByZXNvbHZlUGF0aENoZWNraW5nSWRzKFxuICAgIHN1YnRyZWVSb290LFxuICAgIGNhbGwudGFyZ2V0UGF0aCxcbiAgICBjYWxsLnRhcmdldFBhdGhJZHNcbiAgKVxuICBpZiAoIXJlc29sdmVkKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcbiAgICAgIGBvYmplY3QgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KGNhbGwudGFyZ2V0UGF0aCl9IHdpdGggaWRzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGNhbGwudGFyZ2V0UGF0aElkc1xuICAgICAgKX0gY291bGQgbm90IGJlIHJlc29sdmVkYFxuICAgIClcbiAgfVxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KGN1cnJlbnQsIGByZXNvbHZlZCAke2N1cnJlbnR9YCwgdHJ1ZSlcblxuICBpZiAoaXNCdWlsdEluQWN0aW9uKGNhbGwuYWN0aW9uTmFtZSkpIHtcbiAgICBjb25zdCBmblRvQ2FsbDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPSBidWlsdEluQWN0aW9uVG9GdW5jdGlvbltjYWxsLmFjdGlvbk5hbWVdXG4gICAgaWYgKCFmblRvQ2FsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgYXNzZXJ0aW9uIGZhaWxlZDogdW5rbm93biBidWlsdC1pbiBhY3Rpb24gLSAke2NhbGwuYWN0aW9uTmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBmblRvQ2FsbC5hcHBseShjdXJyZW50LCBbY3VycmVudCwgLi4uY2FsbC5hcmdzXSlcbiAgfVxuXG4gIGlmIChpc0hvb2tBY3Rpb24oY2FsbC5hY3Rpb25OYW1lKSkge1xuICAgIHRocm93IGZhaWx1cmUoYGNhbGxzIHRvIGhvb2tzICgke2NhbGwuYWN0aW9uTmFtZX0pIGNhbm5vdCBiZSBhcHBsaWVkYClcbiAgfVxuXG4gIGNvbnN0IGRhdGFNb2RlbEFjdGlvbiA9IGdldERhdGFNb2RlbEFjdGlvbihjYWxsLmFjdGlvbk5hbWUpXG4gIGlmIChkYXRhTW9kZWxBY3Rpb24pIHtcbiAgICBjb25zdCBpbnN0YW5jZTogYW55ID0gbmV3IGRhdGFNb2RlbEFjdGlvbi5tb2RlbENsYXNzKGN1cnJlbnQpXG4gICAgcmV0dXJuIGluc3RhbmNlW2RhdGFNb2RlbEFjdGlvbi5mbk5hbWVdLmFwcGx5KGluc3RhbmNlLCBjYWxsLmFyZ3MpXG4gIH1cblxuICBjb25zdCBzdGFuZGFsb25lQWN0aW9uID0gZ2V0U3RhbmRhbG9uZUFjdGlvbihjYWxsLmFjdGlvbk5hbWUpXG4gIGlmIChzdGFuZGFsb25lQWN0aW9uKSB7XG4gICAgcmV0dXJuIHN0YW5kYWxvbmVBY3Rpb24uYXBwbHkoY3VycmVudCwgY2FsbC5hcmdzIGFzIGFueSlcbiAgfVxuXG4gIHJldHVybiAoY3VycmVudCBhcyBhbnkpW2NhbGwuYWN0aW9uTmFtZV0uYXBwbHkoY3VycmVudCwgY2FsbC5hcmdzKVxufVxuIiwiaW1wb3J0IHsgY2hlY2tNb2RlbERlY29yYXRvckFyZ3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvY2hlY2tNb2RlbERlY29yYXRvckFyZ3NcIlxuaW1wb3J0IHsgZGVjb3JhdGVXcmFwTWV0aG9kT3JGaWVsZCwgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRBY3Rpb25OYW1lQW5kQ29udGV4dE92ZXJyaWRlIH0gZnJvbSBcIi4vYWN0aW9uRGVjb3JhdG9yVXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IGlzTW9kZWxBY3Rpb24gfSBmcm9tIFwiLi9pc01vZGVsQWN0aW9uXCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuL3dyYXBJbkFjdGlvblwiXG5cbmZ1bmN0aW9uIGNoZWNrTW9kZWxBY3Rpb25BcmdzKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoXCJtb2RlbEFjdGlvbiBoYXMgdG8gYmUgdXNlZCBvdmVyIGZ1bmN0aW9uc1wiKVxuICB9XG4gIGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzKFwibW9kZWxBY3Rpb25cIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSlcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCB0dXJucyBhIGZ1bmN0aW9uIGludG8gYSBtb2RlbCBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHByb3BlcnR5S2V5XG4gKiBAcGFyYW0gW2Jhc2VEZXNjcmlwdG9yXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsQWN0aW9uKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgYmFzZURlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3Jcbik6IHZvaWQge1xuICBjb25zdCB7IGFjdGlvbk5hbWUsIG92ZXJyaWRlQ29udGV4dCB9ID0gZ2V0QWN0aW9uTmFtZUFuZENvbnRleHRPdmVycmlkZSh0YXJnZXQsIHByb3BlcnR5S2V5KVxuXG4gIHJldHVybiBkZWNvcmF0ZVdyYXBNZXRob2RPckZpZWxkKFxuICAgIFwibW9kZWxBY3Rpb25cIixcbiAgICB7XG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleSxcbiAgICAgIGJhc2VEZXNjcmlwdG9yLFxuICAgIH0sXG4gICAgKGRhdGEsIGZuKSA9PiB7XG4gICAgICBpZiAoaXNNb2RlbEFjdGlvbihmbikpIHtcbiAgICAgICAgcmV0dXJuIGZuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja01vZGVsQWN0aW9uQXJncyhkYXRhLnRhcmdldCwgZGF0YS5wcm9wZXJ0eUtleSwgZm4pXG5cbiAgICAgICAgcmV0dXJuIHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgbmFtZU9yTmFtZUZuOiBhY3Rpb25OYW1lLFxuICAgICAgICAgIGZuLFxuICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gICAgICAgICAgb3ZlcnJpZGVDb250ZXh0LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgdHJ5UnVuUGVuZGluZ0FjdGlvbnMgfSBmcm9tIFwiLi9wZW5kaW5nQWN0aW9uc1wiXG5pbXBvcnQgeyBnZXRBY3Rpb25Qcm90ZWN0aW9uLCBzZXRBY3Rpb25Qcm90ZWN0aW9uIH0gZnJvbSBcIi4vcHJvdGVjdGlvblwiXG5cbi8qKlxuICogUnVucyBhIGJsb2NrIGluIHVucHJvY3RlZCBtb2RlLCBhcyBpZiBpdCB3ZXJlIHJ1biBpbnNpZGUgYSBtb2RlbCBhY3Rpb24uXG4gKiBDb25zaWRlciB1c2luZyBhIHByb3BlciBtb2RlbCBhY3Rpb24gaW5zdGVhZCBzaW5jZSB0aGVzZSBraW5kIG9mIGFjdGlvbnMgYXJlIG5vdCByZWNvcmRlZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0gbmFtZSBNb2J4IGFjdGlvbiBuYW1lLlxuICogQHBhcmFtIGZuIEFjdGlvbiBibG9jay5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5VbnByb3RlY3RlZDxUPihuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBUKTogVFxuXG4vKipcbiAqIFJ1bnMgYSBibG9jayBpbiB1bnByb2N0ZWQgbW9kZSwgYXMgaWYgaXQgd2VyZSBydW4gaW5zaWRlIGEgbW9kZWwgYWN0aW9uLlxuICogQ29uc2lkZXIgdXNpbmcgYSBwcm9wZXIgbW9kZWwgYWN0aW9uIGluc3RlYWQgc2luY2UgdGhlc2Uga2luZCBvZiBhY3Rpb25zIGFyZSBub3QgcmVjb3JkZWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybiB0eXBlLlxuICogQHBhcmFtIGZuIEFjdGlvbiBibG9jay5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5VbnByb3RlY3RlZDxUPihmbjogKCkgPT4gVCk6IFRcblxuLy8gYmFzZSBjYXNlXG5leHBvcnQgZnVuY3Rpb24gcnVuVW5wcm90ZWN0ZWQ8VD4oYXJnMTogYW55LCBhcmcyPzogYW55KTogVCB7XG4gIGNvbnN0IG5hbWUgPSB0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIiA/IGFyZzEgOiB1bmRlZmluZWRcbiAgY29uc3QgZm46ICgpID0+IFQgPSB0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIiA/IGFyZzIgOiBhcmcxXG5cbiAgY29uc3QgaW5uZXJBY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3Qgb2xkQWN0aW9uUHJvdGVjdGlvbiA9IGdldEFjdGlvblByb3RlY3Rpb24oKVxuICAgIHNldEFjdGlvblByb3RlY3Rpb24oZmFsc2UpXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0QWN0aW9uUHJvdGVjdGlvbihvbGRBY3Rpb25Qcm90ZWN0aW9uKVxuXG4gICAgICB0cnlSdW5QZW5kaW5nQWN0aW9ucygpXG4gICAgfVxuICB9XG5cbiAgaWYgKG5hbWUpIHtcbiAgICByZXR1cm4gYWN0aW9uKG5hbWUsIGlubmVyQWN0aW9uKSgpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFjdGlvbihpbm5lckFjdGlvbikoKVxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgY2Fubm90U2VyaWFsaXplID0gU3ltYm9sKFwiY2Fubm90U2VyaWFsaXplXCIpXG5cbi8qKlxuICogU2VyaWFsaXplciBvZiBhY3Rpb24gY2FsbCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxUT3JpZ2luYWwsIFRTZXJpYWxpemVkPiB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVyIElELCBtdXN0IGJlIHVuaXF1ZS5cbiAgICovXG4gIGlkOiBzdHJpbmdcblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhbiBhY3Rpb24gY2FsbCBhcmd1bWVudCwgcmV0dXJuaW5nIGBjYW5ub3RTZXJpYWxpemVgIGlmIG5vdCBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS5cbiAgICogQHBhcmFtIHRhcmdldFJvb3QgVGFyZ2V0IHJvb3QsIGlmIHByb3ZpZGVkLlxuICAgKiBAcGFyYW0gc2VyaWFsaXplQ2hpbGQgU2VyaWFsaXplIGEgY2hpbGQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzZXJpYWxpemUoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2VyaWFsaXplQ2hpbGQ6ICh2OiB1bmtub3duKSA9PiB1bmtub3duLFxuICAgIHRhcmdldFJvb3Q6IG9iamVjdCB8IHVuZGVmaW5lZFxuICApOiBUU2VyaWFsaXplZCB8IHR5cGVvZiBjYW5ub3RTZXJpYWxpemVcblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIGFuIGFjdGlvbiBjYWxsIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gZGVzZXJpYWxpemUuXG4gICAqIEBwYXJhbSB0YXJnZXRSb290IFRhcmdldCByb290LCBpZiBwcm92aWRlZC5cbiAgICogQHBhcmFtIGRlc2VyaWFsaXplQ2hpbGQgRGVzZXJpYWxpemUgYSBjaGlsZC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGRlc2VyaWFsaXplKFxuICAgIHZhbHVlOiBUU2VyaWFsaXplZCxcbiAgICBkZXNlcmlhbGl6ZUNoaWxkOiAodjogdW5rbm93bikgPT4gdW5rbm93bixcbiAgICB0YXJnZXRSb290OiBvYmplY3QgfCB1bmRlZmluZWRcbiAgKTogVE9yaWdpbmFsXG59XG4iLCJpbXBvcnQgdHlwZSB7IElPYnNlcnZhYmxlQXJyYXkgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBpc0FycmF5LCBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBhcnJheVNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8YW55W10gfCBJT2JzZXJ2YWJsZUFycmF5PGFueT4sIGFueVtdPiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vYXJyYXlgLFxuXG4gIHNlcmlhbGl6ZSh2YWx1ZSwgc2VyaWFsaXplKSB7XG4gICAgaWYgKCFpc0FycmF5KHZhbHVlKSkgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuXG4gICAgLy8gdGhpcyB3aWxsIGFsc28gdHJhbnNmb3JtIG9ic2VydmFibGUgYXJyYXlzIGludG8gbm9uLW9ic2VydmFibGUgb25lc1xuICAgIHJldHVybiB2YWx1ZS5tYXAoc2VyaWFsaXplKVxuICB9LFxuXG4gIGRlc2VyaWFsaXplKGFyciwgZGVzZXJpYWxpemUpIHtcbiAgICByZXR1cm4gYXJyLm1hcChkZXNlcmlhbGl6ZSlcbiAgfSxcbn1cbiIsImltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IGRhdGVTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPERhdGUsIG51bWJlcj4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L2RhdGVBc1RpbWVzdGFtcGAsXG5cbiAgc2VyaWFsaXplKGRhdGUpIHtcbiAgICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIHJldHVybiBjYW5ub3RTZXJpYWxpemVcbiAgICByZXR1cm4gK2RhdGVcbiAgfSxcblxuICBkZXNlcmlhbGl6ZSh0aW1lc3RhbXApIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wKVxuICB9LFxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlTWFwLCBPYnNlcnZhYmxlTWFwIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3QgbWFwU2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxcbiAgTWFwPGFueSwgYW55PiB8IE9ic2VydmFibGVNYXA8YW55LCBhbnk+LFxuICBbYW55LCBhbnldW11cbj4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L21hcEFzQXJyYXlgLFxuXG4gIHNlcmlhbGl6ZShtYXAsIHNlcmlhbGl6ZSkge1xuICAgIGlmICghKG1hcCBpbnN0YW5jZW9mIE1hcCkgJiYgIWlzT2JzZXJ2YWJsZU1hcChtYXApKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICBjb25zdCBhcnI6IFthbnksIGFueV1bXSA9IFtdXG5cbiAgICBjb25zdCBpdGVyID0gbWFwLmtleXMoKVxuICAgIGxldCBjdXIgPSBpdGVyLm5leHQoKVxuICAgIHdoaWxlICghY3VyLmRvbmUpIHtcbiAgICAgIGNvbnN0IGsgPSBjdXIudmFsdWVcbiAgICAgIGNvbnN0IHYgPSBtYXAuZ2V0KGspXG4gICAgICBhcnIucHVzaChbc2VyaWFsaXplKGspLCBzZXJpYWxpemUodildKVxuICAgICAgY3VyID0gaXRlci5uZXh0KClcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUoYXJyLCBkZXNlcmlhbGl6ZSkge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKVxuXG4gICAgY29uc3QgbGVuID0gYXJyLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBhcnJbaV1bMF1cbiAgICAgIGNvbnN0IHYgPSBhcnJbaV1bMV1cbiAgICAgIG1hcC5zZXQoZGVzZXJpYWxpemUoayksIGRlc2VyaWFsaXplKHYpKVxuICAgIH1cblxuICAgIHJldHVybiBtYXBcbiAgfSxcbn1cbiIsImltcG9ydCB7IG1vZGVsSWRLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB0eXBlIHsgUGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RQYXRoVG9UYXJnZXRQYXRoSWRzKHJvb3RQYXRoOiBSb290UGF0aDxhbnk+KTogKHN0cmluZyB8IG51bGwpW10ge1xuICBjb25zdCB0YXJnZXRQYXRoSWRzOiAoc3RyaW5nIHwgbnVsbClbXSA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb290UGF0aC5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdGFyZ2V0T2JqID0gcm9vdFBhdGgucGF0aE9iamVjdHNbaSArIDFdIC8vIGZpcnN0IGlzIHJvb3QsIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRzIElEXG4gICAgY29uc3QgdGFyZ2V0T2JqSWQgPSBpc01vZGVsKHRhcmdldE9iaikgPyB0YXJnZXRPYmpbbW9kZWxJZEtleV0gPz8gbnVsbCA6IG51bGxcbiAgICB0YXJnZXRQYXRoSWRzLnB1c2godGFyZ2V0T2JqSWQpXG4gIH1cblxuICByZXR1cm4gdGFyZ2V0UGF0aElkc1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aFRvVGFyZ2V0UGF0aElkcyhyb290OiBhbnksIHBhdGg6IFBhdGgpOiAoc3RyaW5nIHwgbnVsbClbXSB7XG4gIGNvbnN0IHRhcmdldFBhdGhJZHM6IChzdHJpbmcgfCBudWxsKVtdID0gW11cbiAgbGV0IGN1cnJlbnQgPSByb290IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHJvb3QgSURcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXRoW2ldXVxuICAgIGNvbnN0IHRhcmdldE9iaklkID0gaXNNb2RlbChjdXJyZW50KSA/IGN1cnJlbnRbbW9kZWxJZEtleV0gPz8gbnVsbCA6IG51bGxcbiAgICB0YXJnZXRQYXRoSWRzLnB1c2godGFyZ2V0T2JqSWQpXG4gIH1cblxuICByZXR1cm4gdGFyZ2V0UGF0aElkc1xufVxuIiwiaW1wb3J0IHsgZmFzdEdldFJvb3RQYXRoLCByZXNvbHZlUGF0aENoZWNraW5nSWRzIH0gZnJvbSBcIi4uLy4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IFBhdGggfSBmcm9tIFwiLi4vLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyByb290UGF0aFRvVGFyZ2V0UGF0aElkcyB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuaW50ZXJmYWNlIE9iamVjdFBhdGgge1xuICB0YXJnZXRQYXRoOiBQYXRoXG4gIHRhcmdldFBhdGhJZHM6IChzdHJpbmcgfCBudWxsKVtdXG59XG5cbmV4cG9ydCBjb25zdCBvYmplY3RQYXRoU2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxvYmplY3QsIE9iamVjdFBhdGg+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9vYmplY3RQYXRoYCxcblxuICBzZXJpYWxpemUodmFsdWUsIF8sIHRhcmdldFJvb3QpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsIHx8ICFpc1R3ZWFrZWRPYmplY3QodmFsdWUsIGZhbHNlKSlcbiAgICAgIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIC8vIHRyeSB0byBzZXJpYWxpemUgYSByZWYgdG8gaXRzIHBhdGggaWYgcG9zc2libGUgaW5zdGVhZFxuICAgIGlmICh0YXJnZXRSb290KSB7XG4gICAgICBjb25zdCByb290UGF0aCA9IGZhc3RHZXRSb290UGF0aCh2YWx1ZSlcbiAgICAgIGlmIChyb290UGF0aC5yb290ID09PSB0YXJnZXRSb290KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGFyZ2V0UGF0aDogcm9vdFBhdGgucGF0aCxcbiAgICAgICAgICB0YXJnZXRQYXRoSWRzOiByb290UGF0aFRvVGFyZ2V0UGF0aElkcyhyb290UGF0aCksXG4gICAgICAgIH0gYXMgT2JqZWN0UGF0aFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjYW5ub3RTZXJpYWxpemVcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShyZWYsIF8sIHRhcmdldFJvb3QpIHtcbiAgICAvLyB0cnkgdG8gcmVzb2x2ZSB0aGUgbm9kZSBiYWNrXG4gICAgaWYgKHRhcmdldFJvb3QpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHModGFyZ2V0Um9vdCwgcmVmLnRhcmdldFBhdGgsIHJlZi50YXJnZXRQYXRoSWRzKVxuICAgICAgaWYgKHJlc3VsdC5yZXNvbHZlZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgZmFpbHVyZShcbiAgICAgIGBvYmplY3QgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHJlZi50YXJnZXRQYXRoKX0gd2l0aCBpZHMgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgcmVmLnRhcmdldFBhdGhJZHNcbiAgICAgICl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZGBcbiAgICApXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBmcm9tU25hcHNob3QgfSBmcm9tIFwiLi4vLi4vc25hcHNob3QvZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uLy4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGlzVHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi8uLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3Qgb2JqZWN0U25hcHNob3RTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPG9iamVjdCwgb2JqZWN0PiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vb2JqZWN0U25hcHNob3RgLFxuXG4gIHNlcmlhbGl6ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwgfHwgIWlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgZmFsc2UpKVxuICAgICAgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuXG4gICAgcmV0dXJuIGdldFNuYXBzaG90KHZhbHVlKVxuICB9LFxuXG4gIGRlc2VyaWFsaXplKHNuYXBzaG90KSB7XG4gICAgcmV0dXJuIGZyb21TbmFwc2hvdChzbmFwc2hvdClcbiAgfSxcbn1cbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZU9iamVjdCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QsIG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IHBsYWluT2JqZWN0U2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxvYmplY3QsIG9iamVjdD4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L3BsYWluT2JqZWN0YCxcblxuICBzZXJpYWxpemUodmFsdWUsIHNlcmlhbGl6ZSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgIWlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkpIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIC8vIHRoaXMgd2lsbCBtYWtlIG9ic2VydmFibGUgb2JqZWN0cyBub24tb2JzZXJ2YWJsZSBvbmVzXG4gICAgcmV0dXJuIG1hcE9iamVjdEZpZWxkcyh2YWx1ZSwgc2VyaWFsaXplKVxuICB9LFxuXG4gIGRlc2VyaWFsaXplKG9iaiwgc2VyaWFsaXplKSB7XG4gICAgcmV0dXJuIG1hcE9iamVjdEZpZWxkcyhvYmosIHNlcmlhbGl6ZSlcbiAgfSxcbn1cblxuZnVuY3Rpb24gbWFwT2JqZWN0RmllbGRzKG9yaWdpbmFsT2JqOiBhbnksIG1hcEZuOiAoeDogYW55KSA9PiBhbnkpOiBhbnkge1xuICBjb25zdCBvYmo6IGFueSA9IHt9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcmlnaW5hbE9iailcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgY29uc3QgdiA9IG9yaWdpbmFsT2JqW2tdXG4gICAgb2JqW2tdID0gbWFwRm4odilcbiAgfVxuICByZXR1cm4gb2JqXG59XG4iLCJpbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBwcmltaXRpdmVTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPFxuICBudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWQsXG4gIHN0cmluZ1xuPiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vcHJpbWl0aXZlQXNTdHJpbmdgLFxuXG4gIHNlcmlhbGl6ZSh2YWx1ZSkge1xuICAgIC8vIG51bWJlclxuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gXCJuYW5cIlxuICAgIH1cbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlICtJbmZpbml0eTpcbiAgICAgICAgcmV0dXJuIFwiK2luZlwiXG4gICAgICBjYXNlIC1JbmZpbml0eTpcbiAgICAgICAgcmV0dXJuIFwiLWluZlwiXG4gICAgfVxuXG4gICAgLy8gYmlnaW50XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICAvLyB1bmRlZmluZWRcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCJcbiAgICB9XG5cbiAgICByZXR1cm4gY2Fubm90U2VyaWFsaXplXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUoc3RyKSB7XG4gICAgc3dpdGNoIChzdHIpIHtcbiAgICAgIGNhc2UgXCJuYW5cIjpcbiAgICAgICAgcmV0dXJuIE5hTlxuICAgICAgY2FzZSBcIitpbmZcIjpcbiAgICAgICAgcmV0dXJuICtJbmZpbml0eVxuICAgICAgY2FzZSBcIi1pbmZcIjpcbiAgICAgICAgcmV0dXJuIC1JbmZpbml0eVxuICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gQmlnSW50KHN0cilcbiAgICB9XG4gIH0sXG59XG4iLCJpbXBvcnQgdHlwZSB7IE9ic2VydmFibGVTZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBzZXRTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPFNldDxhbnk+IHwgT2JzZXJ2YWJsZVNldDxhbnk+LCBhbnlbXT4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L3NldEFzQXJyYXlgLFxuXG4gIHNlcmlhbGl6ZShzZXQsIHNlcmlhbGl6ZSkge1xuICAgIGlmICghKHNldCBpbnN0YW5jZW9mIFNldCkpIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIGNvbnN0IGFycjogYW55W10gPSBbXVxuXG4gICAgY29uc3QgaXRlciA9IHNldC5rZXlzKClcbiAgICBsZXQgY3VyID0gaXRlci5uZXh0KClcbiAgICB3aGlsZSAoIWN1ci5kb25lKSB7XG4gICAgICBjb25zdCBrID0gY3VyLnZhbHVlXG4gICAgICBhcnIucHVzaChzZXJpYWxpemUoaykpXG4gICAgICBjdXIgPSBpdGVyLm5leHQoKVxuICAgIH1cblxuICAgIHJldHVybiBhcnJcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShhcnIsIGRlc2VyaWFsaXplKSB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCgpXG5cbiAgICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGFycltpXVxuICAgICAgc2V0LmFkZChkZXNlcmlhbGl6ZShrKSlcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0XG4gIH0sXG59XG4iLCJpbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25DYWxsIH0gZnJvbSBcIi4uLy4uL2FjdGlvbi9hcHBseUFjdGlvblwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc0pTT05QcmltaXRpdmUsIGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBKU09OUHJpbWl0aXZlVmFsdWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdHlwZXNcIlxuaW1wb3J0IHsgYXJyYXlTZXJpYWxpemVyIH0gZnJvbSBcIi4vYXJyYXlTZXJpYWxpemVyXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgZGF0ZVNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9kYXRlU2VyaWFsaXplclwiXG5pbXBvcnQgeyBtYXBTZXJpYWxpemVyIH0gZnJvbSBcIi4vbWFwU2VyaWFsaXplclwiXG5pbXBvcnQgeyBvYmplY3RQYXRoU2VyaWFsaXplciB9IGZyb20gXCIuL29iamVjdFBhdGhTZXJpYWxpemVyXCJcbmltcG9ydCB7IG9iamVjdFNuYXBzaG90U2VyaWFsaXplciB9IGZyb20gXCIuL29iamVjdFNuYXBzaG90U2VyaWFsaXplclwiXG5pbXBvcnQgeyBwbGFpbk9iamVjdFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9wbGFpbk9iamVjdFNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgcHJpbWl0aXZlU2VyaWFsaXplciB9IGZyb20gXCIuL3ByaW1pdGl2ZVNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgc2V0U2VyaWFsaXplciB9IGZyb20gXCIuL3NldFNlcmlhbGl6ZXJcIlxuXG5jb25zdCBzZXJpYWxpemVyc0FycmF5OiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPGFueSwgYW55PltdID0gW11cbmNvbnN0IHNlcmlhbGl6ZXJzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8YW55LCBhbnk+PigpXG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgbmV3IGFjdGlvbiBjYWxsIGFyZ3VtZW50IHNlcmlhbGl6ZXJzLlxuICogU2VyaWFsaXplcnMgYXJlIGNhbGxlZCBpbiB0aGUgaW52ZXJzZSBvcmRlciB0aGV5IGFyZSByZWdpc3RlcmVkLCBtZWFuaW5nIHRoZVxuICogbGF0ZXN0IG9uZSByZWdpc3RlcmVkIHdpbGwgYmUgY2FsbGVkIGZpcnN0LlxuICpcbiAqIEBwYXJhbSBzZXJpYWxpemVyIFNlcmlhbGl6ZXIgdG8gcmVnaXN0ZXIuXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyIHRvIHVucmVnaXN0ZXIgdGhlIHNlcmlhbGl6ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIoXG4gIHNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8YW55LCBhbnk+XG4pOiAoKSA9PiB2b2lkIHtcbiAgcmVnaXN0ZXJEZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnMoKVxuXG4gIGlmIChzZXJpYWxpemVyc0FycmF5LmluY2x1ZGVzKHNlcmlhbGl6ZXIpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImFjdGlvbiBjYWxsIGFyZ3VtZW50IHNlcmlhbGl6ZXIgYWxyZWFkeSByZWdpc3RlcmVkXCIpXG4gIH1cbiAgaWYgKHNlcmlhbGl6ZXJzTWFwLmhhcyhzZXJpYWxpemVyLmlkKSkge1xuICAgIHRocm93IGZhaWx1cmUoYGFjdGlvbiBjYWxsIGFyZ3VtZW50IHNlcmlhbGl6ZXIgd2l0aCBpZCAnJHtzZXJpYWxpemVyLmlkfScgYWxyZWFkeSByZWdpc3RlcmVkYClcbiAgfVxuXG4gIHNlcmlhbGl6ZXJzQXJyYXkudW5zaGlmdChzZXJpYWxpemVyKVxuICBzZXJpYWxpemVyc01hcC5zZXQoc2VyaWFsaXplci5pZCwgc2VyaWFsaXplcilcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gc2VyaWFsaXplcnNBcnJheS5pbmRleE9mKHNlcmlhbGl6ZXIpXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHNlcmlhbGl6ZXJzQXJyYXkuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgICBzZXJpYWxpemVyc01hcC5kZWxldGUoc2VyaWFsaXplci5pZClcbiAgfVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwgYXJndW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudCB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVyIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgJG1vYnhLZXlzdG9uZVNlcmlhbGl6ZXI6IHN0cmluZ1xuICAvKipcbiAgICogU2VyaWFsaXplZCB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBhbnlcbn1cblxuLyoqXG4gKiBBIHNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZEFjdGlvbkNhbGwgZXh0ZW5kcyBPbWl0PEFjdGlvbkNhbGwsIFwic2VyaWFsaXplZFwiPiB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGFjdGlvbiBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBhcmdzOiBSZWFkb25seUFycmF5PFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnQgfCBKU09OUHJpbWl0aXZlVmFsdWU+XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoaXMgYWN0aW9uIGNhbGwgYXMgc2VyaWFsaXplZC5cbiAgICovXG4gIHNlcmlhbGl6ZWQ6IHRydWVcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGFuIGFjdGlvbiBjYWxsIGFyZ3VtZW50IGJ5IHJldHVybmluZyBhIGBTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50YC5cbiAqIFRoZSBmb2xsb3dpbmcgYXJlIHN1cHBvcnRlZCBvdXQgb2YgdGhlIGJveDpcbiAqIC0gUHJpbWl0aXZlcy5cbiAqIC0gTm9kZXMgdGhhdCBhcmUgdW5kZXIgdGhlIHNhbWUgcm9vdCBub2RlIGFzIHRoZSB0YXJnZXQgcm9vdCAod2hlbiBwcm92aWRlZCkgd2lsbCBiZSBzZXJpYWxpemVkXG4gKiAgIGFzIGEgcGF0aC5cbiAqIC0gTm9kZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZSBzYW1lIHJvb3Qgbm9kZSBhcyB0aGUgdGFyZ2V0IHJvb3Qgd2lsbCBiZSBzZXJpYWxpemVkIGFzIHRoZWlyIHNuYXBzaG90LlxuICogLSBBcnJheXMgKG9ic2VydmFibGUgb3Igbm90KS5cbiAqIC0gRGF0ZXMuXG4gKiAtIE1hcHMgKG9ic2VydmFibGUgb3Igbm90KS5cbiAqIC0gU2V0cyAob2JzZXJ2YWJsZSBvciBub3QpLlxuICogLSBQbGFpbiBvYmplY3RzIChvYnNlcnZhYmxlIG9yIG5vdCkuXG4gKlxuICogSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBzZXJpYWxpemVkIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICpcbiAqIEBwYXJhbSBhcmdWYWx1ZSBBcmd1bWVudCB2YWx1ZSB0byBiZSB0cmFuc2Zvcm1lZCBpbnRvIGl0cyBzZXJpYWxpemFibGUgZm9ybS5cbiAqIEBwYXJhbSBbdGFyZ2V0Um9vdF0gVGFyZ2V0IHJvb3Qgbm9kZSBvZiB0aGUgbW9kZWwgd2hlcmUgdGhpcyBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLlxuICogQHJldHVybnMgVGhlIHNlcmlhbGl6YWJsZSBmb3JtIG9mIHRoZSBwYXNzZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQoXG4gIGFyZ1ZhbHVlOiBhbnksXG4gIHRhcmdldFJvb3Q/OiBvYmplY3Rcbik6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnQgfCBKU09OUHJpbWl0aXZlVmFsdWUge1xuICByZWdpc3RlckRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVycygpXG5cbiAgaWYgKGlzSlNPTlByaW1pdGl2ZShhcmdWYWx1ZSkpIHtcbiAgICByZXR1cm4gYXJnVmFsdWVcbiAgfVxuXG4gIGNvbnN0IG9yaWdWYWx1ZSA9IGFyZ1ZhbHVlXG5cbiAgY29uc3Qgc2VyaWFsaXplID0gKHY6IGFueSkgPT4gc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KHYsIHRhcmdldFJvb3QpXG5cbiAgLy8gdHJ5IHNlcmlhbGl6ZXJzXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VyaWFsaXplcnNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyc0FycmF5W2ldXG4gICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplci5zZXJpYWxpemUoYXJnVmFsdWUsIHNlcmlhbGl6ZSwgdGFyZ2V0Um9vdClcbiAgICBpZiAoc2VyaWFsaXplZFZhbHVlICE9PSBjYW5ub3RTZXJpYWxpemUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICRtb2J4S2V5c3RvbmVTZXJpYWxpemVyOiBzZXJpYWxpemVyLmlkLFxuICAgICAgICB2YWx1ZTogc2VyaWFsaXplZFZhbHVlLFxuICAgICAgfSBhcyBTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShgc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50IGNvdWxkIG5vdCBzZXJpYWxpemUgdGhlIGdpdmVuIHZhbHVlOiAke29yaWdWYWx1ZX1gKVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhbiBhY3Rpb24gY2FsbCBpcyBzZXJpYWxpemFibGUgYnkgbWFwcGluZyB0aGUgYWN0aW9uIGFyZ3VtZW50cyBpbnRvIGl0c1xuICogc2VyaWFsaXphYmxlIHZlcnNpb24gYnkgdXNpbmcgYHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudGAuXG4gKlxuICogQHBhcmFtIGFjdGlvbkNhbGwgQWN0aW9uIGNhbGwgdG8gY29udmVydC5cbiAqIEBwYXJhbSBbdGFyZ2V0Um9vdF0gVGFyZ2V0IHJvb3Qgbm9kZSBvZiB0aGUgbW9kZWwgd2hlcmUgdGhpcyBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLlxuICogQHJldHVybnMgVGhlIHNlcmlhbGl6YWJsZSBhY3Rpb24gY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUFjdGlvbkNhbGwoXG4gIGFjdGlvbkNhbGw6IEFjdGlvbkNhbGwsXG4gIHRhcmdldFJvb3Q/OiBvYmplY3Rcbik6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsIHtcbiAgaWYgKGFjdGlvbkNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3Qgc2VyaWFsaXplIGFuIGFscmVhZHkgc2VyaWFsaXplZCBhY3Rpb24gY2FsbFwiKVxuICB9XG5cbiAgaWYgKHRhcmdldFJvb3QgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3QodGFyZ2V0Um9vdCwgXCJ0YXJnZXRSb290XCIpXG4gIH1cblxuICBjb25zdCBzZXJpYWxpemUgPSAodjogYW55KSA9PiBzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQodiwgdGFyZ2V0Um9vdClcblxuICByZXR1cm4ge1xuICAgIC4uLmFjdGlvbkNhbGwsXG4gICAgc2VyaWFsaXplZDogdHJ1ZSxcbiAgICBhcmdzOiBhY3Rpb25DYWxsLmFyZ3MubWFwKHNlcmlhbGl6ZSksXG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGFuIGFjdGlvbiBjYWxsIGFyZ3VtZW50IGJ5IHJldHVybmluZyBpdHMgZGVzZXJpYWxpemVkIGVxdWl2YWxlbnQuXG4gKlxuICogQHBhcmFtIGFyZ1ZhbHVlIEFyZ3VtZW50IHZhbHVlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gaXRzIGRlc2VyaWFsaXplZCBmb3JtLlxuICogQHBhcmFtIFt0YXJnZXRSb290XSBUYXJnZXQgcm9vdCBub2RlIG9mIHRoZSBtb2RlbCB3aGVyZSB0aGlzIGFjdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQuXG4gKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIGZvcm0gb2YgdGhlIHBhc3NlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KFxuICBhcmdWYWx1ZTogU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudCB8IEpTT05QcmltaXRpdmVWYWx1ZSxcbiAgdGFyZ2V0Um9vdD86IG9iamVjdFxuKTogYW55IHtcbiAgcmVnaXN0ZXJEZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnMoKVxuXG4gIGlmIChpc0pTT05QcmltaXRpdmUoYXJnVmFsdWUpKSB7XG4gICAgcmV0dXJuIGFyZ1ZhbHVlXG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoYXJnVmFsdWUpIHx8IHR5cGVvZiBhcmdWYWx1ZS4kbW9ieEtleXN0b25lU2VyaWFsaXplciAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IGZhaWx1cmUoXCJpbnZhbGlkIHNlcmlhbGl6ZWQgYWN0aW9uIGNhbGwgYXJndW1lbnRcIilcbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZXJJZCA9IGFyZ1ZhbHVlLiRtb2J4S2V5c3RvbmVTZXJpYWxpemVyXG4gIGNvbnN0IHNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyc01hcC5nZXQoc2VyaWFsaXplcklkKVxuXG4gIGlmICghc2VyaWFsaXplcikge1xuICAgIHRocm93IGZhaWx1cmUoYGEgc2VyaWFsaXplciB3aXRoIGlkICcke3NlcmlhbGl6ZXJJZH0nIGNvdWxkIG5vdCBiZSBmb3VuZGApXG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBhcmdWYWx1ZSBhcyBTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50XG5cbiAgY29uc3QgZGVzZXJpYWxpemUgPSAodjogYW55KSA9PiBkZXNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudCh2LCB0YXJnZXRSb290KVxuICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShzZXJpYWxpemVkVmFsdWUudmFsdWUsIGRlc2VyaWFsaXplLCB0YXJnZXRSb290KVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhbiBhY3Rpb24gY2FsbCBpcyBkZXNlcmlhbGl6ZWQgYnkgbWFwcGluZyB0aGUgYWN0aW9uIGFyZ3VtZW50cyBpbnRvIGl0c1xuICogZGVzZXJpYWxpemVkIHZlcnNpb24gYnkgdXNpbmcgYGRlc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50YC5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uQ2FsbCBBY3Rpb24gY2FsbCB0byBjb252ZXJ0LlxuICogQHBhcmFtIFt0YXJnZXRSb290XSBUYXJnZXQgcm9vdCBub2RlIG9mIHRoZSBtb2RlbCB3aGVyZSB0aGlzIGFjdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQuXG4gKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIGFjdGlvbiBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVBY3Rpb25DYWxsKFxuICBhY3Rpb25DYWxsOiBTZXJpYWxpemVkQWN0aW9uQ2FsbCxcbiAgdGFyZ2V0Um9vdD86IG9iamVjdFxuKTogQWN0aW9uQ2FsbCB7XG4gIGlmICghYWN0aW9uQ2FsbC5zZXJpYWxpemVkKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBkZXNlcmlhbGl6ZSBhIG5vbi1zZXJpYWxpemVkIGFjdGlvbiBjYWxsXCIpXG4gIH1cblxuICBpZiAodGFyZ2V0Um9vdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0YXJnZXRSb290LCBcInRhcmdldFJvb3RcIilcbiAgfVxuXG4gIGNvbnN0IGRlc2VyaWFsaXplID0gKHY6IGFueSkgPT4gZGVzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQodiwgdGFyZ2V0Um9vdClcbiAgY29uc3QgZGVzZXJpYWxpemVkQWN0aW9uQ2FsbDogQWN0aW9uQ2FsbCA9IHtcbiAgICAuLi5hY3Rpb25DYWxsLFxuICAgIHNlcmlhbGl6ZWQ6IHVuZGVmaW5lZCxcbiAgICBhcmdzOiBhY3Rpb25DYWxsLmFyZ3MubWFwKGRlc2VyaWFsaXplKSxcbiAgfVxuICBkZWxldGUgKGRlc2VyaWFsaXplZEFjdGlvbkNhbGwgYXMgTy5Xcml0YWJsZTxBY3Rpb25DYWxsPikuc2VyaWFsaXplZFxuICByZXR1cm4gZGVzZXJpYWxpemVkQWN0aW9uQ2FsbFxufVxuXG5sZXQgZGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzUmVnaXN0ZXJlZCA9IGZhbHNlXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzKCkge1xuICBpZiAoZGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgLy8gc2VyaWFsaXplciByZWdpc3RyYXRpb24gKGZyb20gbG93IHByaW9yaXR5IHRvIGhpZ2ggcHJpb3JpdHkpXG5cbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKHByaW1pdGl2ZVNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihwbGFpbk9iamVjdFNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihzZXRTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIobWFwU2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKGRhdGVTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIoYXJyYXlTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIob2JqZWN0U25hcHNob3RTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIob2JqZWN0UGF0aFNlcmlhbGl6ZXIpXG59XG4iLCJpbXBvcnQgeyBydW5JbkFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFwcGx5QWN0aW9uIH0gZnJvbSBcIi4uLy4uL2FjdGlvbi9hcHBseUFjdGlvblwiXG5pbXBvcnQgeyBmcm96ZW5LZXkgfSBmcm9tIFwiLi4vLi4vZnJvemVuL0Zyb3plblwiXG5pbXBvcnQgeyBnZXRNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4uLy4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi8uLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyByZXNvbHZlUGF0aCB9IGZyb20gXCIuLi8uLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFdyaXRhYmxlUGF0aCB9IGZyb20gXCIuLi8uLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi8uLi9wYXRjaC9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgb25QYXRjaGVzIH0gZnJvbSBcIi4uLy4uL3BhdGNoL2VtaXRQYXRjaFwiXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4uLy4uL3BhdGNoL1BhdGNoXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGRlc2VyaWFsaXplQWN0aW9uQ2FsbCwgU2VyaWFsaXplZEFjdGlvbkNhbGwgfSBmcm9tIFwiLi9hY3Rpb25TZXJpYWxpemF0aW9uXCJcblxuLyoqXG4gKiBTZXJpYWxpemVkIGFjdGlvbiBjYWxsIHdpdGggbW9kZWwgSUQgb3ZlcnJpZGVzLlxuICogQ2FuIGJlIGdlbmVyYXRlZCB3aXRoIGBhcHBseVNlcmlhbGl6ZWRBY3Rpb25BbmRUcmFja05ld01vZGVsSWRzYC5cbiAqIFRvIGJlIGFwcGxpZWQgd2l0aCBgYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kU3luY05ld01vZGVsSWRzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkQWN0aW9uQ2FsbFdpdGhNb2RlbElkT3ZlcnJpZGVzIGV4dGVuZHMgU2VyaWFsaXplZEFjdGlvbkNhbGwge1xuICAvKipcbiAgICogTW9kZWwgSWQgb3ZlcnJpZGVzIHRvIGJlIGFwcGxpZWQgYXQgdGhlIGVuZCBvZiBhcHBseWluZyB0aGUgYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWxJZE92ZXJyaWRlczogUmVhZG9ubHlBcnJheTxQYXRjaD5cbn1cblxuLyoqXG4gKiBBcHBsaWVzIChydW5zKSBhIHNlcmlhbGl6ZWQgYWN0aW9uIG92ZXIgYSB0YXJnZXQgb2JqZWN0LlxuICogSW4gdGhpcyBtb2RlIG5ld2x5IGdlbmVyYXRlZCAvIG1vZGlmaWVkIG1vZGVsIElEcyB3aWxsIGJlIHRyYWNrZWRcbiAqIHNvIHRoZXkgY2FuIGJlIGxhdGVyIHN5bmNocm9uaXplZCB3aGVuIGFwcGx5aW5nIGl0IG9uIGFub3RoZXIgbWFjaGluZVxuICogdmlhIGBhcHBseVNlcmlhbGl6ZWRBY3Rpb25BbmRTeW5jTmV3TW9kZWxJZHNgLlxuICogVGhpcyBtZWFucyB0aGlzIG1ldGhvZCBpcyB1c3VhbGx5IHVzZWQgb24gdGhlIHNlcnZlciBzaWRlLlxuICpcbiAqIElmIHlvdSBpbnRlbmQgdG8gYXBwbHkgbm9uLXNlcmlhbGl6ZWQgYWN0aW9ucyBjaGVjayBgYXBwbHlBY3Rpb25gIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0IHRvIHJ1biB0aGUgYWN0aW9uIG92ZXIuXG4gKiBAcGFyYW0gY2FsbCBUaGUgc2VyaWFsaXplZCBhY3Rpb24sIHVzdWFsbHkgYXMgY29taW5nIGZyb20gdGhlIHNlcnZlci9jbGllbnQuXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24sIGlmIGFueSwgcGx1cyBhIG5ldyBzZXJpYWxpemVkIGFjdGlvblxuICogd2l0aCBtb2RlbCBvdmVycmlkZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlcmlhbGl6ZWRBY3Rpb25BbmRUcmFja05ld01vZGVsSWRzPFRSZXQgPSBhbnk+KFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0LFxuICBjYWxsOiBTZXJpYWxpemVkQWN0aW9uQ2FsbFxuKToge1xuICByZXR1cm5WYWx1ZTogVFJldFxuICBzZXJpYWxpemVkQWN0aW9uQ2FsbDogU2VyaWFsaXplZEFjdGlvbkNhbGxXaXRoTW9kZWxJZE92ZXJyaWRlc1xufSB7XG4gIGlmICghY2FsbC5zZXJpYWxpemVkKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBhcHBseSBhIG5vbi1zZXJpYWxpemVkIGFjdGlvbiBjYWxsLCB1c2UgJ2FwcGx5QWN0aW9uJyBpbnN0ZWFkXCIpXG4gIH1cblxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgY29uc3QgZGVzZXJpYWxpemVkQ2FsbCA9IGRlc2VyaWFsaXplQWN0aW9uQ2FsbChjYWxsLCBzdWJ0cmVlUm9vdClcblxuICBjb25zdCBtb2RlbElkT3ZlcnJpZGVzOiBQYXRjaFtdID0gW11cblxuICAvLyBzZXQgYSBwYXRjaCBsaXN0ZW5lciB0byB0cmFjayBjaGFuZ2VzIHRvIG1vZGVsIGlkc1xuICBjb25zdCBwYXRjaERpc3Bvc2VyID0gb25QYXRjaGVzKHN1YnRyZWVSb290LCAocGF0Y2hlcykgPT4ge1xuICAgIHNjYW5QYXRjaGVzRm9yTW9kZWxJZENoYW5nZXMoc3VidHJlZVJvb3QsIG1vZGVsSWRPdmVycmlkZXMsIHBhdGNoZXMpXG4gIH0pXG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGFwcGx5QWN0aW9uKHN1YnRyZWVSb290LCBkZXNlcmlhbGl6ZWRDYWxsKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJldHVyblZhbHVlLFxuICAgICAgc2VyaWFsaXplZEFjdGlvbkNhbGw6IHtcbiAgICAgICAgLi4uY2FsbCxcbiAgICAgICAgbW9kZWxJZE92ZXJyaWRlcyxcbiAgICAgIH0sXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHBhdGNoRGlzcG9zZXIoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjYW5QYXRjaGVzRm9yTW9kZWxJZENoYW5nZXMocm9vdDogb2JqZWN0LCBtb2RlbElkT3ZlcnJpZGVzOiBQYXRjaFtdLCBwYXRjaGVzOiBQYXRjaFtdKSB7XG4gIGNvbnN0IGxlbiA9IHBhdGNoZXMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBwYXRjaCA9IHBhdGNoZXNbaV1cbiAgICBpZiAocGF0Y2gub3AgPT09IFwicmVwbGFjZVwiIHx8IHBhdGNoLm9wID09PSBcImFkZFwiKSB7XG4gICAgICBkZWVwU2NhblZhbHVlRm9yTW9kZWxJZENoYW5nZXMoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIG1vZGVsSWRPdmVycmlkZXMsXG4gICAgICAgIHBhdGNoLnZhbHVlLFxuICAgICAgICBwYXRjaC5wYXRoIGFzIFdyaXRhYmxlUGF0aFxuICAgICAgKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWVwU2NhblZhbHVlRm9yTW9kZWxJZENoYW5nZXMoXG4gIHJvb3Q6IG9iamVjdCxcbiAgbW9kZWxJZE92ZXJyaWRlczogUGF0Y2hbXSxcbiAgdmFsdWU6IGFueSxcbiAgcGF0aDogV3JpdGFibGVQYXRoXG4pIHtcbiAgaWYgKHBhdGgubGVuZ3RoID49IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gZW5zdXJlIHRoZSBwYXJlbnQgaXMgYW4gYWN0dWFsIG1vZGVsXG4gICAgY29uc3QgcGFyZW50ID0gcmVzb2x2ZVBhdGgocm9vdCwgcGF0aC5zbGljZSgwLCBwYXRoLmxlbmd0aCAtIDEpKS52YWx1ZVxuXG4gICAgaWYgKGlzTW9kZWwocGFyZW50KSkge1xuICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdXG4gICAgICBpZiAocHJvcGVydHlOYW1lID09PSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKHBhcmVudC5jb25zdHJ1Y3RvciBhcyBhbnkpKSB7XG4gICAgICAgIC8vIGZvdW5kIG9uZVxuICAgICAgICBtb2RlbElkT3ZlcnJpZGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICBwYXRoOiBwYXRoLnNsaWNlKCksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGxlbiA9IHZhbHVlLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHBhdGgucHVzaChpKVxuICAgICAgZGVlcFNjYW5WYWx1ZUZvck1vZGVsSWRDaGFuZ2VzKHJvb3QsIG1vZGVsSWRPdmVycmlkZXMsIHZhbHVlW2ldLCBwYXRoKVxuICAgICAgcGF0aC5wb3AoKVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAvLyBza2lwIGZyb3plbiB2YWx1ZXNcbiAgICBpZiAoIXZhbHVlW2Zyb3plbktleV0pIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSlcbiAgICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0ga2V5c1tpXVxuICAgICAgICBjb25zdCBwcm9wVmFsdWUgPSB2YWx1ZVtwcm9wTmFtZV1cblxuICAgICAgICBwYXRoLnB1c2gocHJvcE5hbWUpXG4gICAgICAgIGRlZXBTY2FuVmFsdWVGb3JNb2RlbElkQ2hhbmdlcyhyb290LCBtb2RlbElkT3ZlcnJpZGVzLCBwcm9wVmFsdWUsIHBhdGgpXG4gICAgICAgIHBhdGgucG9wKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIChydW5zKSBhIHNlcmlhbGl6ZWQgYWN0aW9uIG92ZXIgYSB0YXJnZXQgb2JqZWN0LlxuICogSW4gdGhpcyBtb2RlIG5ld2x5IGdlbmVyYXRlZCAvIG1vZGlmaWVkIG1vZGVsIElEcyBwcmV2aW91c2x5IHRyYWNrZWRcbiAqIGJ5IGBhcHBseVNlcmlhbGl6ZWRBY3Rpb25BbmRUcmFja05ld01vZGVsSWRzYCB3aWxsIGJlIHN5bmNocm9uaXplZCBhZnRlclxuICogdGhlIGFjdGlvbiBpcyBhcHBsaWVkLlxuICogVGhpcyBtZWFucyB0aGlzIG1ldGhvZCBpcyB1c3VhbGx5IHVzZWQgb24gdGhlIGNsaWVudCBzaWRlLlxuICpcbiAqIElmIHlvdSBpbnRlbmQgdG8gYXBwbHkgbm9uLXNlcmlhbGl6ZWQgYWN0aW9ucyBjaGVjayBgYXBwbHlBY3Rpb25gIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0IHRvIHJ1biB0aGUgYWN0aW9uIG92ZXIuXG4gKiBAcGFyYW0gY2FsbCBUaGUgc2VyaWFsaXplZCBhY3Rpb24sIHVzdWFsbHkgYXMgY29taW5nIGZyb20gdGhlIHNlcnZlci9jbGllbnQuXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24sIGlmIGFueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2VyaWFsaXplZEFjdGlvbkFuZFN5bmNOZXdNb2RlbElkczxUUmV0ID0gYW55PihcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgY2FsbDogU2VyaWFsaXplZEFjdGlvbkNhbGxXaXRoTW9kZWxJZE92ZXJyaWRlc1xuKTogVFJldCB7XG4gIGlmICghY2FsbC5zZXJpYWxpemVkKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBhcHBseSBhIG5vbi1zZXJpYWxpemVkIGFjdGlvbiBjYWxsLCB1c2UgJ2FwcGx5QWN0aW9uJyBpbnN0ZWFkXCIpXG4gIH1cblxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgY29uc3QgZGVzZXJpYWxpemVkQ2FsbCA9IGRlc2VyaWFsaXplQWN0aW9uQ2FsbChjYWxsLCBzdWJ0cmVlUm9vdClcblxuICBsZXQgcmV0dXJuVmFsdWU6IGFueVxuICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgcmV0dXJuVmFsdWUgPSBhcHBseUFjdGlvbihzdWJ0cmVlUm9vdCwgZGVzZXJpYWxpemVkQ2FsbClcblxuICAgIC8vIGFwcGx5IG1vZGVsIGlkIG92ZXJyaWRlc1xuICAgIGFwcGx5UGF0Y2hlcyhzdWJ0cmVlUm9vdCwgY2FsbC5tb2RlbElkT3ZlcnJpZGVzKVxuICB9KVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZVxufVxuIiwiaW1wb3J0IHtcbiAgQWN0aW9uQ29udGV4dCxcbiAgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUsXG4gIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLFxufSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHtcbiAgQWN0aW9uTWlkZGxld2FyZSxcbiAgQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyLFxuICBhZGRBY3Rpb25NaWRkbGV3YXJlLFxufSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHR5cGUgeyBGbG93RmluaXNoZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsRmxvd1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBTaW1wbGlmaWVkIHZlcnNpb24gb2YgYWN0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlQWN0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBBY3Rpb24gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBBY3Rpb24gdHlwZSwgc3luYyBvciBhc3luYy5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlXG4gIC8qKlxuICAgKiBBY3Rpb24gdGFyZ2V0IG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBBbnlNb2RlbFxuICAvKipcbiAgICogQXJyYXkgb2YgYWN0aW9uIGFyZ3VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M6IFJlYWRvbmx5QXJyYXk8YW55PlxuICAvKipcbiAgICogUGFyZW50IGFjdGlvbiBjb250ZXh0LCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRDb250ZXh0PzogU2ltcGxlQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogUm9vdCBhY3Rpb24gY29udGV4dCwgb3IgaXRzZWxmIGlmIHRoZSByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdENvbnRleHQ6IFNpbXBsZUFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIEN1c3RvbSBkYXRhIGZvciB0aGUgYWN0aW9uIGNvbnRleHQgdG8gYmUgc2V0IGJ5IG1pZGRsZXdhcmVzLCBhbiBvYmplY3QuXG4gICAqIFN5bWJvbHMgbXVzdCBiZSB1c2VkIGFzIGtleXMgdG8gYXZvaWQgbmFtZSBjbGFzaGluZyBiZXR3ZWVuIG1pZGRsZXdhcmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogUmVjb3JkPHN5bWJvbCwgYW55PlxufVxuXG4vKipcbiAqIEFjdGlvbiB0cmFja2luZyBtaWRkbGV3YXJlIGZpbmlzaCByZXN1bHQuXG4gKi9cbmV4cG9ydCBlbnVtIEFjdGlvblRyYWNraW5nUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gcmV0dXJuZWQgbm9ybWFsbHkgKHdpdGhvdXQgdGhyb3dpbmcpLlxuICAgKi9cbiAgUmV0dXJuID0gXCJyZXR1cm5cIixcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gdGhyZXcgYW4gZXJyb3IuXG4gICAqL1xuICBUaHJvdyA9IFwidGhyb3dcIixcbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJhY2tpbmcgbWlkZGxld2FyZSBob29rcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25UcmFja2luZ01pZGRsZXdhcmUge1xuICAvKipcbiAgICogRmlsdGVyIGZ1bmN0aW9uIGNhbGxlZCB3aGVuZXZlciBlYWNoIGFjdGlvbiBzdGFydHMsIGFuZCBvbmx5IHRoZW4uXG4gICAqXG4gICAqIElmIHRoZSBhY3Rpb24gaXMgYWNjZXB0ZWQgdGhlbiBgb25TdGFydGAsIGBvblJlc3VtZWAsIGBvblN1c3BlbmRgIGFuZCBgb25GaW5pc2hgXG4gICAqIGZvciB0aGF0IHBhcnRpY3VsYXIgYWN0aW9uIHdpbGwgYmUgY2FsbGVkLlxuICAgKlxuICAgKiBBbGwgYWN0aW9ucyBhcmUgYWNjZXB0ZWQgYnkgZGVmYXVsdCBpZiBubyBmaWx0ZXIgZnVuY3Rpb24gaXMgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIGN0eCBTaW1wbGlmaWVkIGFjdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB0cnVlIHRvIGFjY2VwdCB0aGUgYWN0aW9uLCBmYWxzZSB0byBza2lwIGl0LlxuICAgKi9cbiAgZmlsdGVyPyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBqdXN0IHN0YXJ0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICogQHJldHVybnMgQ2FuIG9wdGlvbmFsbHkgcmV0dXJuIGEgcmVzdWx0IHRoYXQgd2lsbCBjYW5jZWwgdGhlIG9yaWdpbmFsIGFjdGlvbiBhbmQgZmluaXNoIGl0XG4gICAqIHdpdGggdGhlIHJldHVybmVkIHZhbHVlIC8gZXJyb3IgdG8gYmUgdGhyb3duLiBJbiBlaXRoZXIgY2FzZSBjYXNlIHJlc3VtZSAvIHN1c3BlbmQgLyBmaW5pc2ggd2lsbFxuICAgKiBzdGlsbCBiZSBjYWxsZWQgbm9ybWFsbHkuXG4gICAqL1xuICBvblN0YXJ0PyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiB2b2lkIHwgQWN0aW9uVHJhY2tpbmdSZXR1cm5cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIGp1c3QgcmVzdW1lZCBhIHN5bmNocm9ub3VzIHBpZWNlIG9mIGNvZGUgZXhlY3V0aW9uLlxuICAgKiBHZXRzIGNhbGxlZCBvbmNlIGZvciBzeW5jIGFjdGlvbnMgYW5kIG11bHRpcGxlIHRpbWVzIGZvciBmbG93cy5cbiAgICpcbiAgICogQHBhcmFtIGN0eCBTaW1wbGlmaWVkIGFjdGlvbiBjb250ZXh0LlxuICAgKi9cbiAgb25SZXN1bWU/KGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IHZvaWRcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIGp1c3QgZmluaXNoZWQgYSBzeW5jaHJvbm91cyBwaWNlIG9mIGNvZGUgZXhlY3V0aW9uLlxuICAgKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIGFjdGlvbiBpcyBmaW5pc2hlZC5cbiAgICogR2V0cyBjYWxsZWQgb25jZSBmb3Igc3luYyBhY3Rpb25zIGFuZCBtdWx0aXBsZSB0aW1lcyBmb3IgZmxvd3MuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICovXG4gIG9uU3VzcGVuZD8oY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogdm9pZFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24ganVzdCBmaW5pc2hlZCwgZWl0aGVyIGJ5IHJldHVybmluZyBub3JtYWxseSBvciBieSB0aHJvd2luZyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIGN0eCBTaW1wbGlmaWVkIGFjdGlvbiBjb250ZXh0LlxuICAgKiBAcGFyYW0gcmV0IEFjdGlvbiByZXR1cm4gcmVzdWx0LlxuICAgKiBAcmV0dXJucyBDYW4gb3B0aW9uYWxseSByZXR1cm4gYSBuZXcgcmVzdWx0IHRoYXQgd2lsbCBvdmVycmlkZSB0aGUgb3JpZ2luYWwgb25lLlxuICAgKi9cbiAgb25GaW5pc2g/KGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCwgcmV0OiBBY3Rpb25UcmFja2luZ1JldHVybik6IHZvaWQgfCBBY3Rpb25UcmFja2luZ1JldHVyblxufVxuXG4vKipcbiAqIFJldHVybiByZXN1bHQgb2YgYW4gYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvblRyYWNraW5nUmV0dXJuIHtcbiAgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdFxuICB2YWx1ZTogYW55XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3Rpb24gdHJhY2tpbmcgbWlkZGxld2FyZSwgd2hpY2ggaXMgYSBzaW1wbGlmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBzdGFuZGFyZCBhY3Rpb24gbWlkZGxld2FyZS5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gaG9va3MgTWlkZGxld2FyZSBob29rcy5cbiAqIEByZXR1cm5zIFRoZSBtaWRkbGV3YXJlIGRpc3Bvc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlKFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0LFxuICBob29rczogQWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlXG4pOiBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgY29uc3QgZGF0YVN5bWJvbCA9IFN5bWJvbChcImFjdGlvblRyYWNraW5nTWlkZGxld2FyZURhdGFcIilcblxuICBlbnVtIFN0YXRlIHtcbiAgICBJZGxlID0gXCJpZGxlXCIsXG4gICAgU3RhcnRlZCA9IFwic3RhcnRlZFwiLFxuICAgIFJlYWxSZXN1bWVkID0gXCJyZWFsUmVzdW1lZFwiLFxuICAgIEZha2VSZXN1bWVkID0gXCJmYWtlUmVzdW1lZFwiLFxuICAgIFN1c3BlbmRlZCA9IFwic3VzcGVuZGVkXCIsXG4gICAgRmluaXNoZWQgPSBcImZpbmlzaGVkXCIsXG4gIH1cblxuICBpbnRlcmZhY2UgRGF0YSB7XG4gICAgc3RhcnRBY2NlcHRlZDogYm9vbGVhblxuICAgIHN0YXRlOiBTdGF0ZVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q3R4RGF0YShjdHg6IEFjdGlvbkNvbnRleHQgfCBTaW1wbGVBY3Rpb25Db250ZXh0KTogRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGN0eC5kYXRhW2RhdGFTeW1ib2xdXG4gIH1cblxuICBmdW5jdGlvbiBzZXRDdHhEYXRhKGN0eDogQWN0aW9uQ29udGV4dCB8IFNpbXBsZUFjdGlvbkNvbnRleHQsIHBhcnRpYWxEYXRhOiBQYXJ0aWFsPERhdGE+KSB7XG4gICAgbGV0IGN1cnJlbnREYXRhID0gY3R4LmRhdGFbZGF0YVN5bWJvbF1cbiAgICBpZiAoIWN1cnJlbnREYXRhKSB7XG4gICAgICBjdHguZGF0YVtkYXRhU3ltYm9sXSA9IHBhcnRpYWxEYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY3VycmVudERhdGEsIHBhcnRpYWxEYXRhKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVzZXJGaWx0ZXI6IEFjdGlvbk1pZGRsZXdhcmVbXCJmaWx0ZXJcIl0gPSAoY3R4KSA9PiB7XG4gICAgaWYgKGhvb2tzLmZpbHRlcikge1xuICAgICAgcmV0dXJuIGhvb2tzLmZpbHRlcihzaW1wbGlmeUFjdGlvbkNvbnRleHQoY3R4KSlcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgcmVzdW1lU3VzcGVuZFN1cHBvcnQgPSAhIWhvb2tzLm9uUmVzdW1lIHx8ICEhaG9va3Mub25TdXNwZW5kXG5cbiAgY29uc3QgZmlsdGVyOiBBY3Rpb25NaWRkbGV3YXJlW1wiZmlsdGVyXCJdID0gKGN0eCkgPT4ge1xuICAgIGlmIChjdHgudHlwZSA9PT0gQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYykge1xuICAgICAgLy8gc3RhcnQgYW5kIGZpbmlzaCBpcyBvbiB0aGUgc2FtZSBjb250ZXh0XG4gICAgICBjb25zdCBhY2NlcHRlZCA9IHVzZXJGaWx0ZXIoY3R4KVxuICAgICAgaWYgKGFjY2VwdGVkKSB7XG4gICAgICAgIHNldEN0eERhdGEoY3R4LCB7XG4gICAgICAgICAgc3RhcnRBY2NlcHRlZDogdHJ1ZSxcbiAgICAgICAgICBzdGF0ZTogU3RhdGUuSWRsZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NlcHRlZFxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGN0eC5hc3luY1N0ZXBUeXBlKSB7XG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuU3Bhd246XG4gICAgICAgICAgY29uc3QgYWNjZXB0ZWQgPSB1c2VyRmlsdGVyKGN0eClcbiAgICAgICAgICBpZiAoYWNjZXB0ZWQpIHtcbiAgICAgICAgICAgIHNldEN0eERhdGEoY3R4LCB7XG4gICAgICAgICAgICAgIHN0YXJ0QWNjZXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHN0YXRlOiBTdGF0ZS5JZGxlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY2VwdGVkXG5cbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXR1cm46XG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuVGhyb3c6XG4gICAgICAgICAgLy8gZGVwZW5kcyBpZiB0aGUgc3Bhd24gb25lIHdhcyBhY2NlcHRlZCBvciBub3RcbiAgICAgICAgICBjb25zdCBkYXRhID0gZ2V0Q3R4RGF0YShjdHguc3Bhd25Bc3luY1N0ZXBDb250ZXh0ISlcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGEuc3RhcnRBY2NlcHRlZCA6IGZhbHNlXG5cbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWU6XG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lRXJyb3I6XG4gICAgICAgICAgaWYgKCFyZXN1bWVTdXNwZW5kU3VwcG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRlcGVuZHMgaWYgdGhlIHNwYXduIG9uZSB3YXMgYWNjZXB0ZWQgb3Igbm90XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gZ2V0Q3R4RGF0YShjdHguc3Bhd25Bc3luY1N0ZXBDb250ZXh0ISlcbiAgICAgICAgICAgIHJldHVybiBkYXRhID8gZGF0YS5zdGFydEFjY2VwdGVkIDogZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGFydCA9IChzaW1wbGVDdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiBBY3Rpb25UcmFja2luZ1JldHVybiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgc2V0Q3R4RGF0YShzaW1wbGVDdHgsIHtcbiAgICAgIHN0YXRlOiBTdGF0ZS5TdGFydGVkLFxuICAgIH0pXG4gICAgaWYgKGhvb2tzLm9uU3RhcnQpIHtcbiAgICAgIHJldHVybiBob29rcy5vblN0YXJ0KHNpbXBsZUN0eCkgfHwgdW5kZWZpbmVkXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGZpbmlzaCA9IChcbiAgICBzaW1wbGVDdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQsXG4gICAgcmV0OiBBY3Rpb25UcmFja2luZ1JldHVyblxuICApOiBBY3Rpb25UcmFja2luZ1JldHVybiA9PiB7XG4gICAgLy8gZmFrZWx5IHJlc3VtZSBhbmQgc3VzcGVuZCB0aGUgcGFyZW50IGlmIG5lZWRlZFxuICAgIGNvbnN0IHBhcmVudEN0eCA9IHNpbXBsZUN0eC5wYXJlbnRDb250ZXh0XG4gICAgbGV0IHBhcmVudFJlc3VtZWQgPSBmYWxzZVxuICAgIGlmIChwYXJlbnRDdHgpIHtcbiAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBnZXRDdHhEYXRhKHBhcmVudEN0eClcbiAgICAgIGlmIChwYXJlbnREYXRhICYmIHBhcmVudERhdGEuc3RhcnRBY2NlcHRlZCAmJiBwYXJlbnREYXRhLnN0YXRlID09PSBTdGF0ZS5TdXNwZW5kZWQpIHtcbiAgICAgICAgcGFyZW50UmVzdW1lZCA9IHRydWVcbiAgICAgICAgcmVzdW1lKHBhcmVudEN0eCwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0Q3R4RGF0YShzaW1wbGVDdHgsIHtcbiAgICAgIHN0YXRlOiBTdGF0ZS5GaW5pc2hlZCxcbiAgICB9KVxuXG4gICAgaWYgKGhvb2tzLm9uRmluaXNoKSB7XG4gICAgICByZXQgPSBob29rcy5vbkZpbmlzaChzaW1wbGVDdHgsIHJldCkgfHwgcmV0XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudFJlc3VtZWQpIHtcbiAgICAgIHN1c3BlbmQocGFyZW50Q3R4ISlcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBjb25zdCByZXN1bWUgPSAoc2ltcGxlQ3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LCByZWFsOiBib29sZWFuKSA9PiB7XG4gICAgLy8gZW5zdXJlIHBhcmVudHMgYXJlIHJlc3VtZWRcbiAgICBjb25zdCBwYXJlbnRDdHggPSBzaW1wbGVDdHgucGFyZW50Q29udGV4dFxuICAgIGlmIChwYXJlbnRDdHgpIHtcbiAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBnZXRDdHhEYXRhKHBhcmVudEN0eClcbiAgICAgIGlmIChwYXJlbnREYXRhICYmIHBhcmVudERhdGEuc3RhcnRBY2NlcHRlZCAmJiBwYXJlbnREYXRhLnN0YXRlID09PSBTdGF0ZS5TdXNwZW5kZWQpIHtcbiAgICAgICAgcmVzdW1lKHBhcmVudEN0eCwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0Q3R4RGF0YShzaW1wbGVDdHgsIHtcbiAgICAgIHN0YXRlOiByZWFsID8gU3RhdGUuUmVhbFJlc3VtZWQgOiBTdGF0ZS5GYWtlUmVzdW1lZCxcbiAgICB9KVxuICAgIGlmIChob29rcy5vblJlc3VtZSkge1xuICAgICAgaG9va3Mub25SZXN1bWUoc2ltcGxlQ3R4KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1c3BlbmQgPSAoc2ltcGxlQ3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KSA9PiB7XG4gICAgc2V0Q3R4RGF0YShzaW1wbGVDdHgsIHtcbiAgICAgIHN0YXRlOiBTdGF0ZS5TdXNwZW5kZWQsXG4gICAgfSlcbiAgICBpZiAoaG9va3Mub25TdXNwZW5kKSB7XG4gICAgICBob29rcy5vblN1c3BlbmQoc2ltcGxlQ3R4KVxuICAgIH1cblxuICAgIC8vIGVuc3VyZSBwYXJlbnRzIGFyZSBzdXNwZW5kZWQgaWYgdGhleSB3ZXJlIGZha2VseSByZXN1bWVkXG4gICAgY29uc3QgcGFyZW50Q3R4ID0gc2ltcGxlQ3R4LnBhcmVudENvbnRleHRcbiAgICBpZiAocGFyZW50Q3R4KSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gZ2V0Q3R4RGF0YShwYXJlbnRDdHgpXG4gICAgICBpZiAocGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLnN0YXJ0QWNjZXB0ZWQgJiYgcGFyZW50RGF0YS5zdGF0ZSA9PT0gU3RhdGUuRmFrZVJlc3VtZWQpIHtcbiAgICAgICAgc3VzcGVuZChwYXJlbnRDdHgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbXdhcmU6IEFjdGlvbk1pZGRsZXdhcmVbXCJtaWRkbGV3YXJlXCJdID0gKGN0eCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHNpbXBsZUN0eCA9IHNpbXBsaWZ5QWN0aW9uQ29udGV4dChjdHgpXG5cbiAgICBjb25zdCBvcmlnTmV4dCA9IG5leHRcbiAgICBuZXh0ID0gKCkgPT4ge1xuICAgICAgcmVzdW1lKHNpbXBsZUN0eCwgdHJ1ZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvcmlnTmV4dCgpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzdXNwZW5kKHNpbXBsZUN0eClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3R4LnR5cGUgPT09IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMpIHtcbiAgICAgIGxldCByZXRPYmogPSBzdGFydChzaW1wbGVDdHgpXG5cbiAgICAgIGlmIChyZXRPYmopIHtcbiAgICAgICAgLy8gYWN0aW9uIGNhbmNlbGVkIC8gb3ZlcnJpZGRlbiBieSBvblN0YXJ0XG4gICAgICAgIHJlc3VtZShzaW1wbGVDdHgsIHRydWUpXG4gICAgICAgIHN1c3BlbmQoc2ltcGxlQ3R4KVxuICAgICAgICByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCByZXRPYmopXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldE9iaiA9IGZpbmlzaChzaW1wbGVDdHgsIHsgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdC5SZXR1cm4sIHZhbHVlOiBuZXh0KCkgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwgeyByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93LCB2YWx1ZTogZXJyIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVybk9yVGhyb3dBY3Rpb25UcmFja2luZ1JldHVybihyZXRPYmopXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFzeW5jXG5cbiAgICAgIHN3aXRjaCAoY3R4LmFzeW5jU3RlcFR5cGUpIHtcbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5TcGF3bjoge1xuICAgICAgICAgIGxldCByZXRPYmogPSBzdGFydChzaW1wbGVDdHgpXG4gICAgICAgICAgaWYgKHJldE9iaikge1xuICAgICAgICAgICAgLy8gYWN0aW9uIGNhbmNlbGVkIC8gb3ZlcnJpZGRlbiBieSBvblN0YXJ0XG4gICAgICAgICAgICByZXN1bWUoc2ltcGxlQ3R4LCB0cnVlKVxuICAgICAgICAgICAgc3VzcGVuZChzaW1wbGVDdHgpXG4gICAgICAgICAgICByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCByZXRPYmopXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuT3JUaHJvd0FjdGlvblRyYWNraW5nUmV0dXJuKHJldE9iailcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmV0dXJuOiB7XG4gICAgICAgICAgY29uc3QgZmxvd0ZpbmlzaGVyOiBGbG93RmluaXNoZXIgPSBuZXh0KClcbiAgICAgICAgICBjb25zdCByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCB7XG4gICAgICAgICAgICByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0LlJldHVybixcbiAgICAgICAgICAgIHZhbHVlOiBmbG93RmluaXNoZXIudmFsdWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBmbG93RmluaXNoZXIucmVzb2x1dGlvbiA9XG4gICAgICAgICAgICByZXRPYmoucmVzdWx0ID09PSBBY3Rpb25UcmFja2luZ1Jlc3VsdC5SZXR1cm4gPyBcImFjY2VwdFwiIDogXCJyZWplY3RcIlxuICAgICAgICAgIGZsb3dGaW5pc2hlci52YWx1ZSA9IHJldE9iai52YWx1ZVxuICAgICAgICAgIHJldHVybiBmbG93RmluaXNoZXJcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuVGhyb3c6IHtcbiAgICAgICAgICBjb25zdCBmbG93RmluaXNoZXI6IEZsb3dGaW5pc2hlciA9IG5leHQoKVxuICAgICAgICAgIGNvbnN0IHJldE9iaiA9IGZpbmlzaChzaW1wbGVDdHgsIHtcbiAgICAgICAgICAgIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQuVGhyb3csXG4gICAgICAgICAgICB2YWx1ZTogZmxvd0ZpbmlzaGVyLnZhbHVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLnJlc29sdXRpb24gPVxuICAgICAgICAgICAgcmV0T2JqLnJlc3VsdCA9PT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuID8gXCJhY2NlcHRcIiA6IFwicmVqZWN0XCJcbiAgICAgICAgICBmbG93RmluaXNoZXIudmFsdWUgPSByZXRPYmoudmFsdWVcbiAgICAgICAgICByZXR1cm4gZmxvd0ZpbmlzaGVyXG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJlc3VtZTpcbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWVFcnJvcjpcbiAgICAgICAgICBpZiAocmVzdW1lU3VzcGVuZFN1cHBvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICAgICAgYGFzc2VydGlvbiBlcnJvcjogYXN5bmMgc3RlcCBzaG91bGQgaGF2ZSBiZWVuIGZpbHRlcmVkIG91dCAtICR7Y3R4LmFzeW5jU3RlcFR5cGV9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgICBgYXNzZXJ0aW9uIGVycm9yOiBhc3luYyBzdGVwIHNob3VsZCBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0IC0gJHtjdHguYXN5bmNTdGVwVHlwZX1gXG4gICAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhZGRBY3Rpb25NaWRkbGV3YXJlKHsgbWlkZGxld2FyZTogbXdhcmUsIGZpbHRlciwgc3VidHJlZVJvb3Q6IHN1YnRyZWVSb290IH0pXG59XG5cbmZ1bmN0aW9uIHJldHVybk9yVGhyb3dBY3Rpb25UcmFja2luZ1JldHVybihyZXRPYmo6IEFjdGlvblRyYWNraW5nUmV0dXJuKSB7XG4gIGlmIChyZXRPYmoucmVzdWx0ID09PSBBY3Rpb25UcmFja2luZ1Jlc3VsdC5SZXR1cm4pIHtcbiAgICByZXR1cm4gcmV0T2JqLnZhbHVlXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgcmV0T2JqLnZhbHVlXG4gIH1cbn1cblxuY29uc3Qgc2ltcGxlRGF0YUNvbnRleHRTeW1ib2wgPSBTeW1ib2woXCJzaW1wbGVEYXRhQ29udGV4dFwiKVxuXG4vKipcbiAqIFNpbXBsaWZpZXMgYW4gYWN0aW9uIGNvbnRleHQgYnkgY29udmVydGluZyBhbiBhc3luYyBjYWxsIGhpZXJhcmNoeSBpbnRvIGEgc2ltcGxlciBvbmUuXG4gKlxuICogQHBhcmFtIGN0eCBBY3Rpb24gY29udGV4dCB0byBjb252ZXJ0LlxuICogQHJldHVybnMgU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbXBsaWZ5QWN0aW9uQ29udGV4dChjdHg6IEFjdGlvbkNvbnRleHQpOiBTaW1wbGVBY3Rpb25Db250ZXh0IHtcbiAgd2hpbGUgKGN0eC5wcmV2aW91c0FzeW5jU3RlcENvbnRleHQpIHtcbiAgICBjdHggPSBjdHgucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0XG4gIH1cblxuICBsZXQgc2ltcGxlQ3R4ID0gY3R4LmRhdGFbc2ltcGxlRGF0YUNvbnRleHRTeW1ib2xdXG4gIGlmICghc2ltcGxlQ3R4KSB7XG4gICAgY29uc3QgcGFyZW50Q29udGV4dCA9IGN0eC5wYXJlbnRDb250ZXh0ID8gc2ltcGxpZnlBY3Rpb25Db250ZXh0KGN0eC5wYXJlbnRDb250ZXh0KSA6IHVuZGVmaW5lZFxuXG4gICAgc2ltcGxlQ3R4ID0ge1xuICAgICAgYWN0aW9uTmFtZTogY3R4LmFjdGlvbk5hbWUsXG4gICAgICB0eXBlOiBjdHgudHlwZSxcbiAgICAgIHRhcmdldDogY3R4LnRhcmdldCxcbiAgICAgIGFyZ3M6IGN0eC5hcmdzLFxuICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICBwYXJlbnRDb250ZXh0LFxuICAgIH1cbiAgICBzaW1wbGVDdHgucm9vdENvbnRleHQgPSBwYXJlbnRDb250ZXh0ID8gcGFyZW50Q29udGV4dC5yb290Q29udGV4dCA6IHNpbXBsZUN0eFxuXG4gICAgY3R4LmRhdGFbc2ltcGxlRGF0YUNvbnRleHRTeW1ib2xdID0gc2ltcGxlQ3R4XG4gIH1cbiAgcmV0dXJuIHNpbXBsZUN0eFxufVxuIiwiaW1wb3J0IHR5cGUgeyBBY3Rpb25DYWxsIH0gZnJvbSBcIi4uL2FjdGlvbi9hcHBseUFjdGlvblwiXG5pbXBvcnQgeyBpc0hvb2tBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2hvb2tBY3Rpb25zXCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIH0gZnJvbSBcIi4uL2FjdGlvbi9taWRkbGV3YXJlXCJcbmltcG9ydCB7IGZhc3RHZXRSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQge1xuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUsXG4gIEFjdGlvblRyYWNraW5nUmV0dXJuLFxuICBTaW1wbGVBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi9hY3Rpb25UcmFja2luZ01pZGRsZXdhcmVcIlxuaW1wb3J0IHsgcm9vdFBhdGhUb1RhcmdldFBhdGhJZHMgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQXR0YWNoZXMgYW4gYWN0aW9uIG1pZGRsZXdhcmUgdGhhdCBpbnZva2VzIGEgbGlzdGVuZXIgZm9yIGFsbCBhY3Rpb25zIG9mIGEgZ2l2ZW4gdHJlZS5cbiAqIE5vdGUgdGhhdCB0aGUgbGlzdGVuZXIgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIHRoZSB0b3Btb3N0IGxldmVsIGFjdGlvbnMsIHNvIGl0IHdvbid0IHJ1biBmb3IgY2hpbGQgYWN0aW9ucyBvciBpbnRlcm1lZGlhcnkgZmxvdyBzdGVwcy5cbiAqIEFsc28gaXQgd29uJ3QgdHJpZ2dlciB0aGUgbGlzdGVuZXIgZm9yIGNhbGxzIHRvIGhvb2tzIHN1Y2ggYXMgYG9uQXR0YWNoZWRUb1Jvb3RTdG9yZWAgb3IgaXRzIHJldHVybmVkIGRpc3Bvc2VyLlxuICpcbiAqIEl0cyBtYWluIHVzZSBpcyB0byBrZWVwIHRyYWNrIG9mIHRvcCBsZXZlbCBhY3Rpb25zIHRoYXQgY2FuIGJlIGxhdGVyIHJlcGxpY2F0ZWQgdmlhIGBhcHBseUFjdGlvbmAgc29tZXdoZXJlIGVsc2UgKGFub3RoZXIgbWFjaGluZSwgZXRjLikuXG4gKlxuICogVGhlcmUgYXJlIHR3byBraW5kIG9mIHBvc3NpYmxlIGxpc3RlbmVycywgYG9uU3RhcnRgIGFuZCBgb25GaW5pc2hgIGxpc3RlbmVycy5cbiAqIGBvblN0YXJ0YCBsaXN0ZW5lcnMgYXJlIGNhbGxlZCBiZWZvcmUgdGhlIGFjdGlvbiBleGVjdXRlcyBhbmQgYWxsb3cgY2FuY2VsbGF0aW9uIGJ5IHJldHVybmluZyBhIG5ldyByZXR1cm4gdmFsdWUgKHdoaWNoIG1pZ2h0IGJlIGEgcmV0dXJuIG9yIGEgdGhyb3cpLlxuICogYG9uRmluaXNoYCBsaXN0ZW5lcnMgYXJlIGNhbGxlZCBhZnRlciB0aGUgYWN0aW9uIGV4ZWN1dGVzLCBoYXZlIGFjY2VzcyB0byB0aGUgYWN0aW9uIGFjdHVhbCByZXR1cm4gdmFsdWUgYW5kIGFsbG93IG92ZXJyaWRpbmcgYnkgcmV0dXJuaW5nIGFcbiAqIG5ldyByZXR1cm4gdmFsdWUgKHdoaWNoIG1pZ2h0IGJlIGEgcmV0dXJuIG9yIGEgdGhyb3cpLlxuICpcbiAqIElmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBhY3R1YWwgYWN0aW9uIGNhbGxzIGFyZSBzZXJpYWxpemFibGUgeW91IHNob3VsZCB1c2UgZWl0aGVyIGBzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnRgIG92ZXIgdGhlIGFyZ3VtZW50c1xuICogb3IgYHNlcmlhbGl6ZUFjdGlvbkNhbGxgIG92ZXIgdGhlIHdob2xlIGFjdGlvbiBiZWZvcmUgc2VuZGluZyB0aGUgYWN0aW9uIGNhbGwgb3ZlciB0aGUgd2lyZSAvIHN0b3JpbmcgdGhlbSAuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIGxpc3RlbmVycyBMaXN0ZW5lciBmdW5jdGlvbnMgdGhhdCB3aWxsIGJlIGludm9rZWQgZXZlcnl0aW1lIGEgdG9wbW9zdCBhY3Rpb24gaXMgaW52b2tlZCBvbiB0aGUgbW9kZWwgb3IgYW55IGNoaWxkcmVuLlxuICogQHJldHVybnMgVGhlIG1pZGRsZXdhcmUgZGlzcG9zZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFjdGlvbk1pZGRsZXdhcmUoXG4gIHN1YnRyZWVSb290OiBvYmplY3QsXG4gIGxpc3RlbmVyczoge1xuICAgIG9uU3RhcnQ/OiAoXG4gICAgICBhY3Rpb25DYWxsOiBBY3Rpb25DYWxsLFxuICAgICAgYWN0aW9uQ29udGV4dDogU2ltcGxlQWN0aW9uQ29udGV4dFxuICAgICkgPT4gdm9pZCB8IEFjdGlvblRyYWNraW5nUmV0dXJuXG4gICAgb25GaW5pc2g/OiAoXG4gICAgICBhY3Rpb25DYWxsOiBBY3Rpb25DYWxsLFxuICAgICAgYWN0aW9uQ29udGV4dDogU2ltcGxlQWN0aW9uQ29udGV4dCxcbiAgICAgIHJldDogQWN0aW9uVHJhY2tpbmdSZXR1cm5cbiAgICApID0+IHZvaWQgfCBBY3Rpb25UcmFja2luZ1JldHVyblxuICB9XG4pOiBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG4gIGFzc2VydElzT2JqZWN0KGxpc3RlbmVycywgXCJsaXN0ZW5lcnNcIilcblxuICByZXR1cm4gYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlKHN1YnRyZWVSb290LCB7XG4gICAgZmlsdGVyKGN0eCkge1xuICAgICAgaWYgKGN0eC5wYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIC8vIHN1Yi1hY3Rpb24sIGRvIG5vdGhpbmdcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIHNraXAgaG9va3NcbiAgICAgIGlmIChpc0hvb2tBY3Rpb24oY3R4LmFjdGlvbk5hbWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBvblN0YXJ0KGN0eCkge1xuICAgICAgaWYgKGxpc3RlbmVycy5vblN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkNhbGwgPSBhY3Rpb25Db250ZXh0VG9BY3Rpb25DYWxsKGN0eClcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVycy5vblN0YXJ0KGFjdGlvbkNhbGwsIGN0eClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25GaW5pc2goY3R4LCByZXQpIHtcbiAgICAgIGlmIChsaXN0ZW5lcnMub25GaW5pc2gpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uQ2FsbCA9IGFjdGlvbkNvbnRleHRUb0FjdGlvbkNhbGwoY3R4KVxuICAgICAgICByZXR1cm4gbGlzdGVuZXJzLm9uRmluaXNoKGFjdGlvbkNhbGwsIGN0eCwgcmV0KVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGFjdGlvbkNvbnRleHRUb0FjdGlvbkNhbGwoY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogQWN0aW9uQ2FsbCB7XG4gIGNvbnN0IHJvb3RQYXRoID0gZmFzdEdldFJvb3RQYXRoKGN0eC50YXJnZXQpXG5cbiAgcmV0dXJuIHtcbiAgICBhY3Rpb25OYW1lOiBjdHguYWN0aW9uTmFtZSxcbiAgICBhcmdzOiBjdHguYXJncyxcbiAgICB0YXJnZXRQYXRoOiByb290UGF0aC5wYXRoLFxuICAgIHRhcmdldFBhdGhJZHM6IHJvb3RQYXRoVG9UYXJnZXRQYXRoSWRzKHJvb3RQYXRoKSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNIb29rQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9ob29rQWN0aW9uc1wiXG5pbXBvcnQgdHlwZSB7IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB9IGZyb20gXCIuLi9hY3Rpb24vbWlkZGxld2FyZVwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZSxcbiAgQWN0aW9uVHJhY2tpbmdSZXN1bHQsXG4gIFNpbXBsZUFjdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL2FjdGlvblRyYWNraW5nTWlkZGxld2FyZVwiXG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHJlYWRvbmx5IG1pZGRsZXdhcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZG9ubHlNaWRkbGV3YXJlUmV0dXJuIHtcbiAgYWxsb3dXcml0ZTxSPihmbjogKCkgPT4gUik6IFJcblxuICBkaXNwb3NlOiBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXJcbn1cblxuLyoqXG4gKiBBdHRhY2hlcyBhbiBhY3Rpb24gbWlkZGxld2FyZSB0aGF0IHdpbGwgdGhyb3cgd2hlbiBhbnkgYWN0aW9uIGlzIHN0YXJ0ZWRcbiAqIG92ZXIgdGhlIG5vZGUgb3IgYW55IG9mIHRoZSBjaGlsZCBub2RlcywgdGh1cyBlZmZlY3RpdmVseSBtYWtpbmcgdGhlIHN1YnRyZWVcbiAqIHJlYWRvbmx5LlxuICpcbiAqIEl0IHdpbGwgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGEgYGRpc3Bvc2VgIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGUgbWlkZGxld2FyZSBhbmQgYSBgYWxsb3dXcml0ZWAgZnVuY3Rpb25cbiAqIHRoYXQgd2lsbCBhbGxvdyBhY3Rpb25zIHRvIGJlIHN0YXJ0ZWQgaW5zaWRlIHRoZSBwcm92aWRlZCBjb2RlIGJsb2NrLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogLy8gZ2l2ZW4gYSBtb2RlbCBpbnN0YW5jZSBuYW1lZCB0b2RvXG4gKiBjb25zdCB7IGRpc3Bvc2UsIGFsbG93V3JpdGUgfSA9IHJlYWRvbmx5TWlkZGxld2FyZSh0b2RvKVxuICpcbiAqIC8vIHRoaXMgd2lsbCB0aHJvd1xuICogdG9kby5zZXREb25lKGZhbHNlKVxuICogYXdhaXQgdG9kby5zZXREb25lQXN5bmMoZmFsc2UpXG4gKlxuICogLy8gdGhpcyB3aWxsIHdvcmtcbiAqIGFsbG93V3JpdGUoKCkgPT4gdG9kby5zZXREb25lKGZhbHNlKSlcbiAqIC8vIG5vdGU6IGZvciBhc3luYyBhbHdheXMgdXNlIG9uZSBhY3Rpb24gaW52b2NhdGlvbiBwZXIgYWxsb3dXcml0ZSFcbiAqIGF3YWl0IGFsbG93V3JpdGUoKCkgPT4gdG9kby5zZXREb25lQXN5bmMoZmFsc2UpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIG1pZGRsZXdhcmUgZGlzcG9zZXIgKGBkaXNwb3NlYCkgYW5kIGEgYGFsbG93V3JpdGVgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHlNaWRkbGV3YXJlKHN1YnRyZWVSb290OiBvYmplY3QpOiBSZWFkb25seU1pZGRsZXdhcmVSZXR1cm4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgbGV0IHdyaXRhYmxlID0gZmFsc2VcbiAgY29uc3Qgd3JpdGFibGVTeW1ib2wgPSBTeW1ib2woXCJ3cml0YWJsZVwiKVxuXG4gIGNvbnN0IGRpc3Bvc2VyID0gYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlKHN1YnRyZWVSb290LCB7XG4gICAgZmlsdGVyKGN0eCkge1xuICAgICAgLy8gc2tpcCBob29rc1xuICAgICAgaWYgKGlzSG9va0FjdGlvbihjdHguYWN0aW9uTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGFyZSBpbnNpZGUgYWxsb3dXcml0ZSBpdCBpcyB3cml0YWJsZVxuICAgICAgbGV0IGN1cnJlbnRseVdyaXRhYmxlID0gd3JpdGFibGVcblxuICAgICAgaWYgKCFjdXJyZW50bHlXcml0YWJsZSkge1xuICAgICAgICAvLyBpZiBhIHBhcmVudCBjb250ZXh0IHdhcyB3cml0YWJsZSB0aGVuIHRoZSBjaGlsZCBzaG91bGQgYmUgYXMgd2VsbFxuICAgICAgICBsZXQgY3VycmVudEN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCA9IGN0eFxuICAgICAgICB3aGlsZSAoY3VycmVudEN0eCAmJiAhY3VycmVudGx5V3JpdGFibGUpIHtcbiAgICAgICAgICBjdXJyZW50bHlXcml0YWJsZSA9ICEhY3VycmVudEN0eC5kYXRhW3dyaXRhYmxlU3ltYm9sXVxuICAgICAgICAgIGN1cnJlbnRDdHggPSBjdXJyZW50Q3R4LnBhcmVudENvbnRleHRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudGx5V3JpdGFibGUpIHtcbiAgICAgICAgY3R4LmRhdGFbd3JpdGFibGVTeW1ib2xdID0gdHJ1ZVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgb25TdGFydChjdHgpIHtcbiAgICAgIC8vIGlmIHdlIGdldCBoZXJlICh3YXNuJ3QgZmlsdGVyZWQgb3V0KSBpdCBpcyBub3Qgd3JpdGFibGVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQuVGhyb3csXG4gICAgICAgIHZhbHVlOiBmYWlsdXJlKGB0cmllZCB0byBpbnZva2UgYWN0aW9uICcke2N0eC5hY3Rpb25OYW1lfScgb3ZlciBhIHJlYWRvbmx5IG5vZGVgKSxcbiAgICAgIH1cbiAgICB9LFxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgZGlzcG9zZTogZGlzcG9zZXIsXG4gICAgYWxsb3dXcml0ZShmbikge1xuICAgICAgY29uc3Qgb2xkV3JpdGFibGUgPSB3cml0YWJsZVxuICAgICAgd3JpdGFibGUgPSB0cnVlXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3JpdGFibGUgPSBvbGRXcml0YWJsZVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuL1BhdGNoXCJcblxuZXhwb3J0IHR5cGUgSnNvblBhdGNoID1cbiAgfCBKc29uUGF0Y2hBZGRPcGVyYXRpb248YW55PlxuICB8IEpzb25QYXRjaFJlbW92ZU9wZXJhdGlvblxuICB8IEpzb25QYXRjaFJlcGxhY2VPcGVyYXRpb248YW55PlxuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25QYXRjaEJhc2VPcGVyYXRpb24ge1xuICBwYXRoOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKc29uUGF0Y2hBZGRPcGVyYXRpb248VD4gZXh0ZW5kcyBKc29uUGF0Y2hCYXNlT3BlcmF0aW9uIHtcbiAgb3A6IFwiYWRkXCJcbiAgdmFsdWU6IFRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKc29uUGF0Y2hSZW1vdmVPcGVyYXRpb24gZXh0ZW5kcyBKc29uUGF0Y2hCYXNlT3BlcmF0aW9uIHtcbiAgb3A6IFwicmVtb3ZlXCJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKc29uUGF0Y2hSZXBsYWNlT3BlcmF0aW9uPFQ+IGV4dGVuZHMgSnNvblBhdGNoQmFzZU9wZXJhdGlvbiB7XG4gIG9wOiBcInJlcGxhY2VcIlxuICB2YWx1ZTogVFxufVxuXG4vKipcbiAqIEVzY2FwZXMgYSBqc29uIHBvaW50ZXIgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcmF3IHBvaW50ZXJcbiAqIEByZXR1cm4gdGhlIEVzY2FwZWQgcGF0aFxuICovXG5mdW5jdGlvbiBlc2NhcGVQYXRoQ29tcG9uZW50KHBhdGg6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBcIlwiICsgcGF0aFxuICB9XG4gIGlmIChwYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSAmJiBwYXRoLmluZGV4T2YoXCJ+XCIpID09PSAtMSkge1xuICAgIHJldHVybiBwYXRoXG4gIH1cbiAgcmV0dXJuIHBhdGgucmVwbGFjZSgvfi9nLCBcIn4wXCIpLnJlcGxhY2UoL1xcLy9nLCBcIn4xXCIpXG59XG5cbi8qKlxuICogVW5lc2NhcGVzIGEganNvbiBwb2ludGVyIHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIGVzY2FwZWQgcG9pbnRlclxuICogQHJldHVybiBUaGUgdW5lc2NhcGVkIHBhdGhcbiAqL1xuZnVuY3Rpb24gdW5lc2NhcGVQYXRoQ29tcG9uZW50KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIilcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBhdGggaW50byBhIEpTT04gcG9pbnRlci5cbiAqXG4gKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBDb252ZXJ0ZWQgSlNPTiBwb2ludGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aFRvSnNvblBvaW50ZXIocGF0aDogUGF0aCk6IHN0cmluZyB7XG4gIGlmIChwYXRoLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuICByZXR1cm4gXCIvXCIgKyBwYXRoLm1hcChlc2NhcGVQYXRoQ29tcG9uZW50KS5qb2luKFwiL1wiKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgSlNPTiBwb2ludGVyIGludG8gYSBwYXRoLlxuICpcbiAqIEBwYXJhbSBqc29uUG9pbnRlciBKU09OIHBvaW50ZXIgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIENvbnZlcnRlZCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblBvaW50ZXJUb1BhdGgoanNvblBvaW50ZXI6IHN0cmluZyk6IFBhdGgge1xuICBpZiAoanNvblBvaW50ZXIgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBpZiAoIWpzb25Qb2ludGVyLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImEgSlNPTiBwb2ludGVyIG11c3Qgc3RhcnQgd2l0aCAnLycgb3IgYmUgZW1wdHlcIilcbiAgfVxuICBqc29uUG9pbnRlciA9IGpzb25Qb2ludGVyLnNsaWNlKDEpXG4gIHJldHVybiBqc29uUG9pbnRlci5zcGxpdChcIi9cIikubWFwKHVuZXNjYXBlUGF0aENvbXBvbmVudClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcGF0Y2ggaW50byBhIEpTT04gcGF0Y2guXG4gKlxuICogQHBhcmFtIHBhdGNoIEEgcGF0Y2guXG4gKiBAcmV0dXJucyBBIEpTT04gcGF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFRvSnNvblBhdGNoKHBhdGNoOiBQYXRjaCk6IEpzb25QYXRjaCB7XG4gIHJldHVybiB7XG4gICAgLi4ucGF0Y2gsXG4gICAgcGF0aDogcGF0aFRvSnNvblBvaW50ZXIocGF0Y2gucGF0aCksXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIEpTT04gcGF0Y2ggaW50byBhIHBhdGNoLlxuICpcbiAqIEBwYXJhbSBqc29uUGF0Y2ggQSBKU09OIHBhdGNoLlxuICogQHJldHVybnMgQSBwYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25QYXRjaFRvUGF0Y2goanNvblBhdGNoOiBKc29uUGF0Y2gpOiBQYXRjaCB7XG4gIHJldHVybiB7XG4gICAgLi4uanNvblBhdGNoLFxuICAgIHBhdGg6IGpzb25Qb2ludGVyVG9QYXRoKGpzb25QYXRjaC5wYXRoKSxcbiAgfVxufVxuIiwiaW1wb3J0IHsgb2JzZXJ2YWJsZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IG9uR2xvYmFsUGF0Y2hlcywgb25QYXRjaGVzLCBPblBhdGNoZXNEaXNwb3NlciwgT25QYXRjaGVzTGlzdGVuZXIgfSBmcm9tIFwiLi9lbWl0UGF0Y2hcIlxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuL1BhdGNoXCJcblxuLyoqXG4gKiBQYXRjaCByZWNvcmRlciBldmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRjaFJlY29yZGVyRXZlbnQge1xuICAvKipcbiAgICogVGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldDogb2JqZWN0XG4gIC8qKlxuICAgKiBSZWNvcmRlZCBwYXRjaGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0Y2hlczogUGF0Y2hbXVxuICAvKipcbiAgICogUmVjb3JkZWQgaW52ZXJzZSBwYXRjaGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW11cbn1cblxuLyoqXG4gKiBQYXRjaCByZWNvcmRlciBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hSZWNvcmRlciB7XG4gIC8qKlxuICAgKiBHZXRzL3NldHMgaWYgdGhlIHBhdGNoIHJlY29yZGVyIGlzIGN1cnJlbnRseSByZWNvcmRpbmcuXG4gICAqL1xuICByZWNvcmRpbmc6IGJvb2xlYW5cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBhcnJheSBvZiBwYXRjaGluZyBldmVudHMuXG4gICAqL1xuICByZWFkb25seSBldmVudHM6IFBhdGNoUmVjb3JkZXJFdmVudFtdXG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgdGhlIHBhdGNoIHJlY29yZGVyLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkXG59XG5cbi8qKlxuICogUGF0Y2ggcmVjb3JkZXIgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRjaFJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGUgcGF0Y2ggcmVjb3JkZXIgaXMgaW5pdGlhbGx5IHJlY29yZGluZyB3aGVuIGNyZWF0ZWQuXG4gICAqL1xuICByZWNvcmRpbmc/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZpbHRlciB0byBzZWxlY3Qgd2ljaCBwYXRjaGVzIHRvIHJlY29yZC9za2lwLlxuICAgKiBJdCB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgZXZlbnQgaXMgYWRkZWQgdG8gdGhlIGV2ZW50cyBsaXN0LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0Y2hlcyBQYXRjaGVzIGFib3V0IHRvIGJlIHJlY29yZGVkLlxuICAgKiBAcGFyYW0gaW52ZXJzZVBhdGNoZXMgSW52ZXJzZSBwYXRjaGVzIGFib3V0IHRvIGJlIHJlY29yZGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVjb3JkIHRoZSBwYXRjaCwgYGZhbHNlYCB0byBza2lwIGl0LlxuICAgKi9cbiAgZmlsdGVyPyhwYXRjaGVzOiBQYXRjaFtdLCBpbnZlcnNlUGF0Y2hlczogUGF0Y2hbXSk6IGJvb2xlYW5cblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgY2FsbGJhY2sgcnVuIG9uY2UgYSBwYXRjaCBpcyByZWNvcmRlZC5cbiAgICogSXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgZXZlbnQgaXMgYWRkZWQgdG8gdGhlIGV2ZW50cyBsaXN0LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0Y2hlcyBQYXRjaGVzIGp1c3QgcmVjb3JkZWQuXG4gICAqIEBwYXJhbSBpbnZlcnNlUGF0Y2hlcyBJbnZlcnNlIHBhdGNoZXMganVzdCByZWNvcmRlZC5cbiAgICovXG4gIG9uUGF0Y2hlcz86IE9uUGF0Y2hlc0xpc3RlbmVyXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHBhdGNoIHJlY29yZGVyLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdFxuICogQHBhcmFtIFtvcHRzXVxuICogQHJldHVybnMgVGhlIHBhdGNoIHJlY29yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hSZWNvcmRlcihzdWJ0cmVlUm9vdDogb2JqZWN0LCBvcHRzPzogUGF0Y2hSZWNvcmRlck9wdGlvbnMpOiBQYXRjaFJlY29yZGVyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIHJldHVybiBpbnRlcm5hbFBhdGNoUmVjb3JkZXIoc3VidHJlZVJvb3QsIG9wdHMpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogQ3JlYXRlcyBhIGdsb2JhbCBvciBsb2NhbCBwYXRjaCByZWNvcmRlci5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3RcbiAqIEBwYXJhbSBbb3B0c11cbiAqIEByZXR1cm5zIFRoZSBwYXRjaCByZWNvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsUGF0Y2hSZWNvcmRlcihcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IFBhdGNoUmVjb3JkZXJPcHRpb25zXG4pOiBQYXRjaFJlY29yZGVyIHtcbiAgbGV0IHsgcmVjb3JkaW5nLCBmaWx0ZXIgfSA9IHtcbiAgICByZWNvcmRpbmc6IHRydWUsXG4gICAgZmlsdGVyOiBhbHdheXNBY2NlcHRGaWx0ZXIsXG4gICAgLi4ub3B0cyxcbiAgfVxuXG4gIGNvbnN0IGV2ZW50cyA9IG9ic2VydmFibGUuYXJyYXk8UGF0Y2hSZWNvcmRlckV2ZW50PihbXSwge1xuICAgIGRlZXA6IGZhbHNlLFxuICB9KVxuXG4gIGxldCBvblBhdGNoZXNEaXNwb3NlcjogT25QYXRjaGVzRGlzcG9zZXJcblxuICBpZiAoc3VidHJlZVJvb3QpIHtcbiAgICBvblBhdGNoZXNEaXNwb3NlciA9IG9uUGF0Y2hlcyhzdWJ0cmVlUm9vdCwgKHAsIGludlApID0+IHtcbiAgICAgIGlmIChyZWNvcmRpbmcgJiYgZmlsdGVyKHAsIGludlApKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IHN1YnRyZWVSb290LFxuICAgICAgICAgIHBhdGNoZXM6IHAsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXM6IGludlAsXG4gICAgICAgIH0pXG4gICAgICAgIG9wdHM/Lm9uUGF0Y2hlcz8uKHAsIGludlApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBvblBhdGNoZXNEaXNwb3NlciA9IG9uR2xvYmFsUGF0Y2hlcygodGFyZ2V0LCBwLCBpbnZQKSA9PiB7XG4gICAgICBpZiAocmVjb3JkaW5nICYmIGZpbHRlcihwLCBpbnZQKSkge1xuICAgICAgICBldmVudHMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHBhdGNoZXM6IHAsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXM6IGludlAsXG4gICAgICAgIH0pXG4gICAgICAgIG9wdHM/Lm9uUGF0Y2hlcz8uKHAsIGludlApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0IHJlY29yZGluZygpIHtcbiAgICAgIHJldHVybiByZWNvcmRpbmdcbiAgICB9LFxuICAgIHNldCByZWNvcmRpbmcoZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgcmVjb3JkaW5nID0gZW5hYmxlZFxuICAgIH0sXG4gICAgZ2V0IGV2ZW50cygpIHtcbiAgICAgIHJldHVybiBldmVudHNcbiAgICB9LFxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICBvblBhdGNoZXNEaXNwb3NlcigpXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBhbHdheXNBY2NlcHRGaWx0ZXIgPSAoKSA9PiB0cnVlXG4iLCJpbXBvcnQgdHlwZSB7IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB9IGZyb20gXCIuLi9hY3Rpb24vbWlkZGxld2FyZVwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRJc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL2NoZWNrTW9kZWxEZWNvcmF0b3JBcmdzXCJcbmltcG9ydCB7IGFkZE1vZGVsQ2xhc3NJbml0aWFsaXplciB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbENsYXNzSW5pdGlhbGl6ZXJcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzIH0gZnJvbSBcIi4uL3BhdGNoXCJcbmltcG9ydCB7IGludGVybmFsUGF0Y2hSZWNvcmRlciwgUGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaC9wYXRjaFJlY29yZGVyXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7XG4gIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZSxcbiAgQWN0aW9uVHJhY2tpbmdSZXN1bHQsXG4gIFNpbXBsZUFjdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL2FjdGlvblRyYWNraW5nTWlkZGxld2FyZVwiXG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyYW5zYWN0aW9uIG1pZGRsZXdhcmUsIHdoaWNoIHJldmVydHMgY2hhbmdlcyBtYWRlIGJ5IGFuIGFjdGlvbiAvIGNoaWxkXG4gKiBhY3Rpb25zIHdoZW4gdGhlIHJvb3QgYWN0aW9uIHRocm93cyBhbiBleGNlcHRpb24gYnkgYXBwbHlpbmcgaW52ZXJzZSBwYXRjaGVzLlxuICpcbiAqIEB0eXBlcGFyYW0gTSBNb2RlbFxuICogQHBhcmFtIHRhcmdldCBPYmplY3Qgd2l0aCB0aGUgcm9vdCB0YXJnZXQgbW9kZWwgb2JqZWN0IChgbW9kZWxgKSBhbmQgcm9vdCBhY3Rpb24gbmFtZSAoYGFjdGlvbk5hbWVgKS5cbiAqIEByZXR1cm5zIFRoZSBtaWRkbGV3YXJlIGRpc3Bvc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25NaWRkbGV3YXJlPE0gZXh0ZW5kcyBBbnlNb2RlbD4odGFyZ2V0OiB7XG4gIG1vZGVsOiBNXG4gIGFjdGlvbk5hbWU6IGtleW9mIE1cbn0pOiBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIge1xuICBhc3NlcnRJc09iamVjdCh0YXJnZXQsIFwidGFyZ2V0XCIpXG5cbiAgY29uc3QgeyBtb2RlbCwgYWN0aW9uTmFtZSB9ID0gdGFyZ2V0XG5cbiAgYXNzZXJ0SXNNb2RlbChtb2RlbCwgXCJ0YXJnZXQubW9kZWxcIilcblxuICBpZiAodHlwZW9mIGFjdGlvbk5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwidGFyZ2V0LmFjdGlvbk5hbWUgbXVzdCBiZSBhIHN0cmluZ1wiKVxuICB9XG5cbiAgY29uc3QgcGF0Y2hSZWNvcmRlclN5bWJvbCA9IFN5bWJvbChcInBhdGNoUmVjb3JkZXJcIilcbiAgZnVuY3Rpb24gaW5pdFBhdGNoUmVjb3JkZXIoY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KSB7XG4gICAgY3R4LnJvb3RDb250ZXh0LmRhdGFbcGF0Y2hSZWNvcmRlclN5bWJvbF0gPSBpbnRlcm5hbFBhdGNoUmVjb3JkZXIodW5kZWZpbmVkLCB7XG4gICAgICByZWNvcmRpbmc6IGZhbHNlLFxuICAgIH0pXG4gIH1cbiAgZnVuY3Rpb24gZ2V0UGF0Y2hSZWNvcmRlcihjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiBQYXRjaFJlY29yZGVyIHtcbiAgICByZXR1cm4gY3R4LnJvb3RDb250ZXh0LmRhdGFbcGF0Y2hSZWNvcmRlclN5bWJvbF1cbiAgfVxuXG4gIHJldHVybiBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUobW9kZWwsIHtcbiAgICBmaWx0ZXIoY3R4KSB7XG4gICAgICAvLyB0aGUgcHJpbWFyeSBhY3Rpb24gbXVzdCBiZSBvbiB0aGUgcm9vdCBvYmplY3RcbiAgICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gY3R4LnJvb3RDb250ZXh0XG4gICAgICByZXR1cm4gcm9vdENvbnRleHQudGFyZ2V0ID09PSBtb2RlbCAmJiByb290Q29udGV4dC5hY3Rpb25OYW1lID09PSBhY3Rpb25OYW1lXG4gICAgfSxcbiAgICBvblN0YXJ0KGN0eCkge1xuICAgICAgaWYgKGN0eCA9PT0gY3R4LnJvb3RDb250ZXh0KSB7XG4gICAgICAgIGluaXRQYXRjaFJlY29yZGVyKGN0eClcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uUmVzdW1lKGN0eCkge1xuICAgICAgZ2V0UGF0Y2hSZWNvcmRlcihjdHgpLnJlY29yZGluZyA9IHRydWVcbiAgICB9LFxuICAgIG9uU3VzcGVuZChjdHgpIHtcbiAgICAgIGdldFBhdGNoUmVjb3JkZXIoY3R4KS5yZWNvcmRpbmcgPSBmYWxzZVxuICAgIH0sXG4gICAgb25GaW5pc2goY3R4LCByZXQpIHtcbiAgICAgIGlmIChjdHggPT09IGN0eC5yb290Q29udGV4dCkge1xuICAgICAgICBjb25zdCBwYXRjaFJlY29yZGVyID0gZ2V0UGF0Y2hSZWNvcmRlcihjdHgpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmV0LnJlc3VsdCA9PT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuVGhyb3cpIHtcbiAgICAgICAgICAgIC8vIHVuZG8gY2hhbmdlcyAoYmFja3dhcmRzIGZvciBpbnZlcnNlIHBhdGNoZXMpXG4gICAgICAgICAgICBjb25zdCB7IGV2ZW50cyB9ID0gcGF0Y2hSZWNvcmRlclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpXVxuICAgICAgICAgICAgICBhcHBseVBhdGNoZXMoZXZlbnQudGFyZ2V0LCBldmVudC5pbnZlcnNlUGF0Y2hlcywgdHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcGF0Y2hSZWNvcmRlci5kaXNwb3NlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gbWlkZGxld2FyZSBhcyBhIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcHJvcGVydHlLZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCB7XG4gIGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzKFwidHJhbnNhY3Rpb25cIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSlcblxuICBhZGRNb2RlbENsYXNzSW5pdGlhbGl6ZXIodGFyZ2V0LmNvbnN0cnVjdG9yLCAobW9kZWxJbnN0YW5jZSkgPT4ge1xuICAgIHRyYW5zYWN0aW9uTWlkZGxld2FyZSh7XG4gICAgICBtb2RlbDogbW9kZWxJbnN0YW5jZSBhcyBBbnlNb2RlbCxcbiAgICAgIGFjdGlvbk5hbWU6IHByb3BlcnR5S2V5IGFzIGFueSxcbiAgICB9KVxuICB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcclxuaW1wb3J0IHsgRnJvemVuIH0gZnJvbSBcIi4uLy4uL2Zyb3plbi9Gcm96ZW5cIlxyXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uLCBhc3NlcnRJc09iamVjdCwgaXNPYmplY3QsIGxhenkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXHJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgdHlwZSB7XHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIEFueVR5cGUsXHJcbiAgTW9kZWxUeXBlLFxyXG4gIE9iamVjdFR5cGVGdW5jdGlvbixcclxuICBUeXBlVG9EYXRhLFxyXG59IGZyb20gXCIuLi9zY2hlbWFzXCJcclxuaW1wb3J0IHtcclxuICBsYXRlVHlwZUNoZWNrZXIsXHJcbiAgTGF0ZVR5cGVDaGVja2VyLFxyXG4gIFR5cGVDaGVja2VyLFxyXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXHJcbiAgVHlwZUluZm8sXHJcbiAgVHlwZUluZm9HZW4sXHJcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcclxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxyXG5cclxuZnVuY3Rpb24gdHlwZXNPYmplY3RIZWxwZXI8Uz4ob2JqRm46IFMsIGZyb3plbjogYm9vbGVhbiwgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuKTogUyB7XHJcbiAgYXNzZXJ0SXNGdW5jdGlvbihvYmpGbiwgXCJvYmpGblwiKVxyXG5cclxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcclxuICAgIGNvbnN0IG9iamVjdFNjaGVtYToge1xyXG4gICAgICBbazogc3RyaW5nXTogVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXJcclxuICAgIH0gPSAob2JqRm4gYXMgYW55KSgpXHJcbiAgICBhc3NlcnRJc09iamVjdChvYmplY3RTY2hlbWEsIFwib2JqZWN0U2NoZW1hXCIpXHJcblxyXG4gICAgY29uc3Qgc2NoZW1hRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdFNjaGVtYSlcclxuXHJcbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+IHtcclxuICAgICAgY29uc3QgcHJvcHNNc2c6IHN0cmluZ1tdID0gW11cclxuICAgICAgZm9yIChjb25zdCBbaywgdW5yZXNvbHZlZFRjXSBvZiBzY2hlbWFFbnRyaWVzKSB7XHJcbiAgICAgICAgY29uc3QgdGMgPSByZXNvbHZlVHlwZUNoZWNrZXIodW5yZXNvbHZlZFRjKVxyXG4gICAgICAgIGxldCBwcm9wVHlwZW5hbWUgPSBcIi4uLlwiXHJcbiAgICAgICAgaWYgKCFyZWN1cnNpdmVUeXBlQ2hlY2tlcnMuaW5jbHVkZXModGMpKSB7XHJcbiAgICAgICAgICBwcm9wVHlwZW5hbWUgPSB0Yy5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIHRjKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9wc01zZy5wdXNoKGAke2t9OiAke3Byb3BUeXBlbmFtZX07YClcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGB7ICR7cHJvcHNNc2cuam9pbihcIiBcIil9IH1gXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXBwbHlTbmFwc2hvdFByb2Nlc3NvciA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtb2RlOiBcImZyb21cIiB8IFwidG9cIikgPT4ge1xyXG4gICAgICBjb25zdCBuZXdPYmo6IHR5cGVvZiBvYmogPSB7fVxyXG5cclxuICAgICAgLy8gbm90ZTogd2UgYWxsb3cgZXhjZXNzIHByb3BlcnRpZXMgd2hlbiBjaGVja2luZyBvYmplY3RzXHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXHJcbiAgICAgICAgY29uc3QgdW5yZXNvbHZlZFRjID0gb2JqZWN0U2NoZW1hW2tdXHJcbiAgICAgICAgaWYgKHVucmVzb2x2ZWRUYykge1xyXG4gICAgICAgICAgY29uc3QgdGMgPSByZXNvbHZlVHlwZUNoZWNrZXIodW5yZXNvbHZlZFRjKVxyXG4gICAgICAgICAgbmV3T2JqW2tdID1cclxuICAgICAgICAgICAgbW9kZSA9PT0gXCJmcm9tXCIgPyB0Yy5mcm9tU25hcHNob3RQcm9jZXNzb3Iob2JqW2tdKSA6IHRjLnRvU25hcHNob3RQcm9jZXNzb3Iob2JqW2tdKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyB1bmtub3duIHByb3AsIGNvcHkgYXMgaXNcclxuICAgICAgICAgIG5ld09ialtrXSA9IG9ialtrXVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG5ld09ialxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LFxyXG5cclxuICAgICAgKG9iaiwgcGF0aCkgPT4ge1xyXG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSB8fCAoZnJvemVuICYmICEob2JqIGluc3RhbmNlb2YgRnJvemVuKSkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgb2JqKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbm90ZTogd2UgYWxsb3cgZXhjZXNzIHByb3BlcnRpZXMgd2hlbiBjaGVja2luZyBvYmplY3RzXHJcbiAgICAgICAgZm9yIChjb25zdCBbaywgdW5yZXNvbHZlZFRjXSBvZiBzY2hlbWFFbnRyaWVzKSB7XHJcbiAgICAgICAgICBjb25zdCB0YyA9IHJlc29sdmVUeXBlQ2hlY2tlcih1bnJlc29sdmVkVGMpXHJcbiAgICAgICAgICBjb25zdCBvYmpWYWwgPSBvYmpba11cclxuXHJcbiAgICAgICAgICBjb25zdCB2YWx1ZUVycm9yID0gdGMuY2hlY2sob2JqVmFsLCBbLi4ucGF0aCwga10pXHJcbiAgICAgICAgICBpZiAodmFsdWVFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVFcnJvclxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGdldFR5cGVOYW1lLFxyXG4gICAgICB0eXBlSW5mb0dlbixcclxuXHJcbiAgICAgIChvYmopID0+IHtcclxuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcclxuICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBub3RlOiB3ZSBhbGxvdyBleGNlc3MgcHJvcGVydGllcyB3aGVuIGNoZWNraW5nIG9iamVjdHNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB1bnJlc29sdmVkVGNdIG9mIHNjaGVtYUVudHJpZXMpIHtcclxuICAgICAgICAgIGNvbnN0IHRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKHVucmVzb2x2ZWRUYylcclxuICAgICAgICAgIGNvbnN0IG9ialZhbCA9IG9ialtrXVxyXG5cclxuICAgICAgICAgIGNvbnN0IHZhbHVlQWN0dWFsQ2hlY2tlciA9IHRjLnNuYXBzaG90VHlwZShvYmpWYWwpXHJcbiAgICAgICAgICBpZiAoIXZhbHVlQWN0dWFsQ2hlY2tlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXNUY1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcclxuICAgICAgICByZXR1cm4gYXBwbHlTbmFwc2hvdFByb2Nlc3NvcihvYmosIFwiZnJvbVwiKVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcclxuICAgICAgICByZXR1cm4gYXBwbHlTbmFwc2hvdFByb2Nlc3NvcihvYmosIFwidG9cIilcclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiB0aGlzVGNcclxuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgcGxhaW4gb2JqZWN0LlxyXG4gKiBOb3RlIHRoYXQgdGhlIHBhcmFtZXRlciBtdXN0IGJlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIG9iamVjdC4gVGhpcyBpcyBkb25lIHNvIG9iamVjdHMgY2FuIHN1cHBvcnQgc2VsZiAvIGNyb3NzIHR5cGVzLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiAvLyBub3RpY2UgdGhlICh7IC4uLiB9KSwgbm90IGp1c3QgeyAuLi4gfVxyXG4gKiBjb25zdCBwb2ludFR5cGUgPSB0eXBlcy5vYmplY3QoKCkgPT4gKHtcclxuICogICB4OiB0eXBlcy5udW1iZXIsXHJcbiAqICAgeTogdHlwZXMubnVtYmVyXHJcbiAqIH0pKVxyXG4gKiBgYGBcclxuICpcclxuICogQHR5cGVwYXJhbSBUIFR5cGUuXHJcbiAqIEBwYXJhbSBvYmplY3RGdW5jdGlvbiBGdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhbiBvYmplY3Qgd2l0aCB0eXBlcy5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlc09iamVjdDxUPihvYmplY3RGdW5jdGlvbjogVCk6IFQge1xyXG4gIC8vIHdlIGNhbid0IHR5cGUgdGhpcyBmdW5jdGlvbiBvciBlbHNlIHdlIHdvbid0IGJlIGFibGUgdG8gbWFrZSBpdCB3b3JrIHJlY3Vyc2l2ZWx5XHJcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBPYmplY3RUeXBlSW5mbyh0LCBvYmplY3RGdW5jdGlvbiBhcyBhbnkpXHJcblxyXG4gIHJldHVybiB0eXBlc09iamVjdEhlbHBlcihvYmplY3RGdW5jdGlvbiwgZmFsc2UsIHR5cGVJbmZvR2VuKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy5vYmplY3RgIHR5cGUgaW5mbyBmb3IgYW4gb2JqZWN0IHByb3BzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RUeXBlSW5mb1Byb3BzIHtcclxuICByZWFkb25seSBbcHJvcE5hbWU6IHN0cmluZ106IFJlYWRvbmx5PHtcclxuICAgIHR5cGU6IEFueVN0YW5kYXJkVHlwZVxyXG4gICAgdHlwZUluZm86IFR5cGVJbmZvXHJcbiAgfT5cclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy5vYmplY3RgIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBPYmplY3RUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcclxuICAvLyBtZW1vaXplIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgb2JqZWN0XHJcbiAgcHJpdmF0ZSBfcHJvcHMgPSBsYXp5KCgpID0+IHtcclxuICAgIGNvbnN0IG9ialNjaGVtYSA9IHRoaXMuX29ialR5cGVGbigpXHJcblxyXG4gICAgY29uc3QgcHJvcFR5cGVzOiBPLldyaXRhYmxlPE9iamVjdFR5cGVJbmZvUHJvcHM+ID0ge31cclxuICAgIE9iamVjdC5rZXlzKG9ialNjaGVtYSkuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcclxuICAgICAgY29uc3QgdHlwZSA9IHJlc29sdmVTdGFuZGFyZFR5cGUob2JqU2NoZW1hW3Byb3BOYW1lXSlcclxuICAgICAgcHJvcFR5cGVzW3Byb3BOYW1lXSA9IHsgdHlwZSwgdHlwZUluZm86IGdldFR5cGVJbmZvKHR5cGUpIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJvcFR5cGVzXHJcbiAgfSlcclxuXHJcbiAgZ2V0IHByb3BzKCk6IE9iamVjdFR5cGVJbmZvUHJvcHMge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzKClcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHByaXZhdGUgX29ialR5cGVGbjogT2JqZWN0VHlwZUZ1bmN0aW9uKSB7XHJcbiAgICBzdXBlcih0aGlzVHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGZyb3plbiBkYXRhLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCBmcm96ZW5OdW1iZXJUeXBlID0gdHlwZXMuZnJvemVuKHR5cGVzLm51bWJlcilcclxuICogY29uc3QgZnJvemVuQW55VHlwZSA9IHR5cGVzLmZyb3plbih0eXBlcy51bmNoZWNrZWQ8YW55PigpKVxyXG4gKiBjb25zdCBmcm96ZW5OdW1iZXJBcnJheVR5cGUgPSB0eXBlcy5mcm96ZW4odHlwZXMuYXJyYXkodHlwZXMubnVtYmVyKSlcclxuICogY29uc3QgZnJvemVuVW5jaGVja2VkTnVtYmVyQXJyYXlUeXBlID0gdHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDxudW1iZXJbXT4oKSlcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxyXG4gKiBAcGFyYW0gZGF0YVR5cGUgVHlwZSBvZiB0aGUgZnJvemVuIGRhdGEuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNGcm96ZW48VCBleHRlbmRzIEFueVR5cGU+KGRhdGFUeXBlOiBUKTogTW9kZWxUeXBlPEZyb3plbjxUeXBlVG9EYXRhPFQ+Pj4ge1xyXG4gIHJldHVybiB0eXBlc09iamVjdEhlbHBlcihcclxuICAgICgpID0+ICh7XHJcbiAgICAgIGRhdGE6IGRhdGFUeXBlLFxyXG4gICAgfSksXHJcbiAgICB0cnVlLFxyXG4gICAgKHQpID0+IG5ldyBGcm96ZW5UeXBlSW5mbyh0LCByZXNvbHZlU3RhbmRhcmRUeXBlKGRhdGFUeXBlKSlcclxuICApIGFzIGFueVxyXG59XHJcblxyXG4vKipcclxuICogYHR5cGVzLmZyb3plbmAgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEZyb3plblR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xyXG4gIGdldCBkYXRhVHlwZUluZm8oKTogVHlwZUluZm8ge1xyXG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMuZGF0YVR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBkYXRhVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XHJcbiAgICBzdXBlcih0aGlzVHlwZSlcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgaWRlbnRpdHlGbiB9IGZyb20gXCIuLi8uLi91dGlsc1wiXHJcbmltcG9ydCB0eXBlIHsgSWRlbnRpdHlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxyXG5pbXBvcnQgeyBUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXJCYXNlVHlwZSwgVHlwZUluZm8gfSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxyXG5cclxuY29uc3QgdW5jaGVja2VkOiBJZGVudGl0eVR5cGU8YW55PiA9IG5ldyBUeXBlQ2hlY2tlcihcclxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLkFueSxcclxuICBudWxsLFxyXG4gICgpID0+IFwiYW55XCIsXHJcbiAgKHQpID0+IG5ldyBVbmNoZWNrZWRUeXBlSW5mbyh0KSxcclxuXHJcbiAgKCkgPT4gdW5jaGVja2VkIGFzIGFueSxcclxuXHJcbiAgaWRlbnRpdHlGbixcclxuICBpZGVudGl0eUZuXHJcbikgYXMgYW55XHJcblxyXG4vKipcclxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGdpdmVuIHZhbHVlIHRoYXQgd29uJ3QgYmUgdHlwZSBjaGVja2VkLlxyXG4gKiBUaGlzIGlzIGJhc2ljYWxseSBhIHdheSB0byBiYWlsIG91dCBvZiB0aGUgcnVudGltZSB0eXBlIGNoZWNraW5nIHN5c3RlbS5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3QgdW5jaGVja2VkU29tZU1vZGVsID0gdHlwZXMudW5jaGVja2VkPFNvbWVNb2RlbD4oKVxyXG4gKiBjb25zdCBhbnlUeXBlID0gdHlwZXMudW5jaGVja2VkPGFueT4oKVxyXG4gKiBjb25zdCBjdXN0b21VbmNoZWNrZWRUeXBlID0gdHlwZXMudW5jaGVja2VkPChBICYgQikgfCBDPigpXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgVHlwZSBvZiB0aGUgdmFsdWUsIG9yIHVua293biBpZiBub3QgZ2l2ZW4uXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNVbmNoZWNrZWQ8VCA9IG5ldmVyPigpOiBJZGVudGl0eVR5cGU8VD4ge1xyXG4gIHJldHVybiB1bmNoZWNrZWRcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy51bmNoZWNrZWRgIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBVbmNoZWNrZWRUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHt9XHJcbiIsImltcG9ydCB7IGZhaWx1cmUsIGxhenkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHtcbiAgcmVzb2x2ZVN0YW5kYXJkVHlwZSxcbiAgcmVzb2x2ZVN0YW5kYXJkVHlwZU5vVGhyb3csXG4gIHJlc29sdmVUeXBlQ2hlY2tlcixcbn0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGdldFR5cGVDaGVja2VyQmFzZVR5cGVGcm9tVmFsdWUsXG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkIH0gZnJvbSBcIi4vdHlwZXNVbmNoZWNrZWRcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHVuaW9uIG9mIHNldmVyYWwgb3RoZXIgdHlwZXMgKGEgfCBiIHwgYyB8IC4uLikuXG4gKiBBY2NlcHRzIGEgZGlzcGF0Y2hlciB0aGF0LCBnaXZlbiBhIHNuYXBzaG90LCByZXR1cm5zIHRoZSB0eXBlXG4gKiB0aGF0IHNuYXBzaG90IGlzLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxuICogQHBhcmFtIGRpc3BhdGNoZXIgRnVuY3Rpb24gdGhhdCBnaXZlbiBhIHNuYXBzaG90IHJldHVybnMgdGhlIHR5cGUuXG4gKiBAcGFyYW0gb3JUeXBlcyBQb3NzaWJsZSB0eXBlcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc09yPFQgZXh0ZW5kcyBBbnlUeXBlW10+KFxuICBkaXNwYXRjaGVyOiAoc246IGFueSkgPT4gVFtudW1iZXJdLFxuICAuLi5vclR5cGVzOiBUXG4pOiBUW251bWJlcl1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSB1bmlvbiBvZiBzZXZlcmFsIG90aGVyIHR5cGVzIChhIHwgYiB8IGMgfCAuLi4pLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgYm9vbGVhbk9yTnVtYmVyVHlwZSA9IHR5cGVzLm9yKHR5cGVzLmJvb2xlYW4sIHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxuICogQHBhcmFtIG9yVHlwZXMgUG9zc2libGUgdHlwZXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPcjxUIGV4dGVuZHMgQW55VHlwZVtdPiguLi5vclR5cGVzOiBUKTogVFtudW1iZXJdXG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc09yKFxuICBkaXNwYXRjaGVyT3JUeXBlOiAoKHNuOiBhbnkpID0+IEFueVR5cGUpIHwgQW55VHlwZSxcbiAgLi4ubW9yZU9yVHlwZXM6IEFueVR5cGVbXVxuKTogQW55VHlwZSB7XG4gIGNvbnN0IG9yVHlwZXMgPSBtb3JlT3JUeXBlcy5zbGljZSgpXG4gIGxldCBmaW5hbERpc3BhdGNoZXI6ICgoc246IGFueSkgPT4gVHlwZUNoZWNrZXIpIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgZmlyc3RUeXBlQ2hlY2tlciA9IHJlc29sdmVTdGFuZGFyZFR5cGVOb1Rocm93KGRpc3BhdGNoZXJPclR5cGUgYXMgQW55VHlwZSlcblxuICBpZiAoZmlyc3RUeXBlQ2hlY2tlcikge1xuICAgIG9yVHlwZXMudW5zaGlmdChmaXJzdFR5cGVDaGVja2VyKVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyT3JUeXBlIGFzIChzbjogYW55KSA9PiBBbnlUeXBlXG4gICAgZmluYWxEaXNwYXRjaGVyID0gKHNuOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBkaXNwYXRjaGVyKHNuKVxuICAgICAgY29uc3QgdHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodHlwZSlcbiAgICAgIHJldHVybiB0eXBlQ2hlY2tlclxuICAgIH1cbiAgfVxuXG4gIGlmIChvclR5cGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm9yIHR5cGUgbXVzdCBoYXZlIGF0IGxlYXN0IDEgcG9zc2libGUgdHlwZVwiKVxuICB9XG5cbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBPclR5cGVJbmZvKHQsIG9yVHlwZXMubWFwKHJlc29sdmVTdGFuZGFyZFR5cGUpKVxuXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgIGNvbnN0IGNoZWNrZXJzID0gb3JUeXBlcy5tYXAocmVzb2x2ZVR5cGVDaGVja2VyKVxuXG4gICAgLy8gaWYgdGhlIG9yIGluY2x1ZGVzIHVuY2hlY2tlZCB0aGVuIGl0IGlzIHVuY2hlY2tlZFxuICAgIGlmIChjaGVja2Vycy5zb21lKCh0YykgPT4gdGMudW5jaGVja2VkKSkge1xuICAgICAgcmV0dXJuIHR5cGVzVW5jaGVja2VkKCkgYXMgYW55XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlTmFtZXMgPSBjaGVja2Vycy5tYXAoKHRjKSA9PiB7XG4gICAgICAgIGlmIChyZWN1cnNpdmVUeXBlQ2hlY2tlcnMuaW5jbHVkZXModGMpKSB7XG4gICAgICAgICAgcmV0dXJuIFwiLi4uXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGMuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB0YylcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB0eXBlTmFtZXMuam9pbihcIiB8IFwiKVxuICAgIH1cblxuICAgIGxldCB0aGlzVGNCYXNlVHlwZTogVHlwZUNoZWNrZXJCYXNlVHlwZVxuICAgIGlmIChjaGVja2Vycy5zb21lKChjKSA9PiBjLmJhc2VUeXBlICE9PSBjaGVja2Vyc1swXS5iYXNlVHlwZSkpIHtcbiAgICAgIHRoaXNUY0Jhc2VUeXBlID0gVHlwZUNoZWNrZXJCYXNlVHlwZS5BbnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1RjQmFzZVR5cGUgPSBjaGVja2Vyc1swXS5iYXNlVHlwZVxuICAgIH1cblxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICB0aGlzVGNCYXNlVHlwZSxcblxuICAgICAgKHZhbHVlLCBwYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvbWVNYXRjaGluZ1R5cGUgPSBjaGVja2Vycy5zb21lKCh0YykgPT4gIXRjLmNoZWNrKHZhbHVlLCBwYXRoKSlcbiAgICAgICAgaWYgKHNvbWVNYXRjaGluZ1R5cGUpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGdldFR5cGVOYW1lLFxuICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUJhc2VUeXBlID0gZ2V0VHlwZUNoZWNrZXJCYXNlVHlwZUZyb21WYWx1ZSh2YWx1ZSlcblxuICAgICAgICBjb25zdCBjaGVja2VyRm9yQmFzZVR5cGUgPSBjaGVja2Vycy5maWx0ZXIoXG4gICAgICAgICAgKGMpID0+IGMuYmFzZVR5cGUgPT09IHZhbHVlQmFzZVR5cGUgfHwgYy5iYXNlVHlwZSA9PT0gVHlwZUNoZWNrZXJCYXNlVHlwZS5BbnlcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChjaGVja2VyRm9yQmFzZVR5cGUubGVuZ3RoID09PSAxICYmIGNoZWNrZXJGb3JCYXNlVHlwZVswXS5iYXNlVHlwZSA9PT0gdmFsdWVCYXNlVHlwZSkge1xuICAgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdmFsaWQgb3B0aW9uIGFjY2VwdCBpdCB3aXRob3V0IGFza2luZ1xuICAgICAgICAgIC8vIHRoaXMgaXMgZG9uZSBiZWNhdXNlOlxuICAgICAgICAgIC8vIDEpIHBlcmZvcm1hbmNlIChhdm9pZCBjaGVja2luZyBzdHJ1Y3R1cmUgaWYgbm90IG5lZWRlZClcbiAgICAgICAgICAvLyAyKSBzbyB3ZSBjYW4gYWNjZXB0IHVudHlwZWQgbW9kZWxzIHdoZW4gcGFpcmVkIHdpdGggdW5kZWZpbmVkIHwgbnVsbFxuICAgICAgICAgIHJldHVybiBjaGVja2VyRm9yQmFzZVR5cGVbMF1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tlckZvckJhc2VUeXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hpbmdUeXBlID0gY2hlY2tlckZvckJhc2VUeXBlW2ldLnNuYXBzaG90VHlwZSh2YWx1ZSlcbiAgICAgICAgICBpZiAobWF0Y2hpbmdUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdUeXBlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0sXG5cbiAgICAgIChzbikgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gZmluYWxEaXNwYXRjaGVyID8gZmluYWxEaXNwYXRjaGVyKHNuKSA6IHRoaXNUYy5zbmFwc2hvdFR5cGUoc24pXG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgICBgc25hcHNob3QgJyR7SlNPTi5zdHJpbmdpZnkoc24pfScgZG9lcyBub3QgbWF0Y2ggdGhlIGZvbGxvd2luZyB0eXBlOiAke2dldFR5cGVOYW1lKFxuICAgICAgICAgICAgICB0aGlzVGNcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICAgIH0sXG5cbiAgICAgIChzbikgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gZmluYWxEaXNwYXRjaGVyID8gZmluYWxEaXNwYXRjaGVyKHNuKSA6IHRoaXNUYy5zbmFwc2hvdFR5cGUoc24pXG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgICBgc25hcHNob3QgJyR7SlNPTi5zdHJpbmdpZnkoc24pfScgZG9lcyBub3QgbWF0Y2ggdGhlIGZvbGxvd2luZyB0eXBlOiAke2dldFR5cGVOYW1lKFxuICAgICAgICAgICAgICB0aGlzVGNcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlLnRvU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICB9XG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXNUY1xuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG59XG5cbi8qKlxuICogYHR5cGVzLm9yYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBPclR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICAvLyBtZW1vaXplIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgYXJyYXkgb24gdGhlIGdldHRlclxuICBwcml2YXRlIF9vclR5cGVJbmZvcyA9IGxhenkoKCkgPT4gdGhpcy5vclR5cGVzLm1hcChnZXRUeXBlSW5mbykpXG5cbiAgZ2V0IG9yVHlwZUluZm9zKCk6IFJlYWRvbmx5QXJyYXk8VHlwZUluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5fb3JUeXBlSW5mb3MoKVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgb3JUeXBlczogUmVhZG9ubHlBcnJheTxBbnlTdGFuZGFyZFR5cGU+KSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IEFueU1vZGVsUHJvcCwgTWF5YmVPcHRpb25hbE1vZGVsUHJvcCwgT3B0aW9uYWxNb2RlbFByb3AsIHByb3AgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQge1xuICB0eXBlc0Jvb2xlYW4sXG4gIHR5cGVzTnVsbCxcbiAgdHlwZXNOdW1iZXIsXG4gIHR5cGVzU3RyaW5nLFxuICB0eXBlc1VuZGVmaW5lZCxcbn0gZnJvbSBcIi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuL3NjaGVtYXNcIlxuaW1wb3J0IHsgTGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciB9IGZyb20gXCIuL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IHR5cGVzT3IgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzT3JcIlxuXG4vKipcbiAqIERlZmluZXMgYSBzdHJpbmcgbW9kZWwgcHJvcGVydHkgd2l0aCBhIGRlZmF1bHQgdmFsdWUuXG4gKiBFcXVpdmFsZW50IHRvIGB0UHJvcCh0eXBlcy5zdHJpbmcsIGRlZmF1bHRWYWx1ZSlgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AoXCJmb29cIikgLy8gYW4gb3B0aW9uYWwgc3RyaW5nIHRoYXQgd2lsbCB0YWtlIHRoZSB2YWx1ZSBgXCJmb29cImAgd2hlbiB1bmRlZmluZWQuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdFByb3AoZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBPcHRpb25hbE1vZGVsUHJvcDxzdHJpbmc+XG5cbi8qKlxuICogRGVmaW5lcyBhIG51bWJlciBtb2RlbCBwcm9wZXJ0eSB3aXRoIGEgZGVmYXVsdCB2YWx1ZS5cbiAqIEVxdWl2YWxlbnQgdG8gYHRQcm9wKHR5cGVzLm51bWJlciwgZGVmYXVsdFZhbHVlKWAuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiB0UHJvcCg0MikgLy8gYW4gb3B0aW9uYWwgbnVtYmVyIHRoYXQgd2lsbCB0YWtlIHRoZSB2YWx1ZSBgNDJgIHdoZW4gdW5kZWZpbmVkLlxuICogYGBgXG4gKlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wKGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogT3B0aW9uYWxNb2RlbFByb3A8bnVtYmVyPlxuXG4vKipcbiAqIERlZmluZXMgYSBib29sZWFuIG1vZGVsIHByb3BlcnR5IHdpdGggYSBkZWZhdWx0IHZhbHVlLlxuICogRXF1aXZhbGVudCB0byBgdFByb3AodHlwZXMuYm9vbGVhbiwgZGVmYXVsdFZhbHVlKWAuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiB0UHJvcCh0cnVlKSAvLyBhbiBvcHRpb25hbCBib29sZWFuIHRoYXQgd2lsbCB0YWtlIHRoZSB2YWx1ZSBgdHJ1ZWAgd2hlbiB1bmRlZmluZWQuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0gb3B0aW9ucyBNb2RlbCBwcm9wZXJ0eSBvcHRpb25zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wKGRlZmF1bHRWYWx1ZTogYm9vbGVhbik6IE9wdGlvbmFsTW9kZWxQcm9wPGJvb2xlYW4+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5LCB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgZGVmYXVsdCB2YWx1ZVxuICogaWYgdGhlIGlucHV0IHNuYXBzaG90IC8gbW9kZWwgY3JlYXRpb24gZGF0YSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYW5kIHdpdGggYW4gYXNzb2NpYXRlZCB0eXBlIGNoZWNrZXIuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiB0UHJvcCh0eXBlcy5udW1iZXIsICgpID0+IDEwKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mIDEwXG4gKiB4OiB0UHJvcCh0eXBlcy5hcnJheSh0eXBlcy5udW1iZXIpLCAoKSA9PiBbXSkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyIGFycmF5LCB3aXRoIGEgZGVmYXVsdCBlbXB0eSBhcnJheVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUVHlwZSBUeXBlIGNoZWNrZXIgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUeXBlIGNoZWNrZXIuXG4gKiBAcGFyYW0gZGVmYXVsdEZuIERlZmF1bHQgdmFsdWUgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wPFRUeXBlIGV4dGVuZHMgQW55VHlwZT4oXG4gIHR5cGU6IFRUeXBlLFxuICBkZWZhdWx0Rm46ICgpID0+IFR5cGVUb0RhdGE8VFR5cGU+XG4pOiBPcHRpb25hbE1vZGVsUHJvcDxUeXBlVG9EYXRhPFRUeXBlPj5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbW9kZWwgcHJvcGVydHksIHdpdGggYW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZVxuICogaWYgdGhlIGlucHV0IHNuYXBzaG90IC8gbW9kZWwgY3JlYXRpb24gZGF0YSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYW5kIHdpdGggYW4gYXNzb2NpYXRlZCB0eXBlIGNoZWNrZXIuXG4gKiBZb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgd2l0aCBwcmltaXRpdmUgdmFsdWVzIGFuZCBuZXZlciB3aXRoIG9iamVjdCB2YWx1ZXNcbiAqIChhcnJheSwgbW9kZWwsIG9iamVjdCwgZXRjKS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHRQcm9wKHR5cGVzLm51bWJlciwgMTApIC8vIGFuIG9wdGlvbmFsIG51bWJlciwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgMTBcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFR5cGUgVHlwZSBjaGVja2VyIHR5cGUuXG4gKlxuICogQHBhcmFtIHR5cGUgVHlwZSBjaGVja2VyLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcDxUVHlwZSBleHRlbmRzIEFueVR5cGU+KFxuICB0eXBlOiBUVHlwZSxcbiAgZGVmYXVsdFZhbHVlOiBUeXBlVG9EYXRhPFRUeXBlPlxuKTogT3B0aW9uYWxNb2RlbFByb3A8VHlwZVRvRGF0YTxUVHlwZT4+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5IHdpdGggbm8gZGVmYXVsdCB2YWx1ZSBhbmQgYW4gYXNzb2NpYXRlZCB0eXBlIGNoZWNrZXIuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiB0UHJvcCh0eXBlcy5udW1iZXIpIC8vIGEgcmVxdWlyZWQgbnVtYmVyXG4gKiB4OiB0UHJvcCh0eXBlcy5tYXliZSh0eXBlcy5udW1iZXIpKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdoaWNoIGRlZmF1bHRzIHRvIHVuZGVmaW5lZFxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUVHlwZSBUeXBlIGNoZWNrZXIgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUeXBlIGNoZWNrZXIuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdFByb3A8VFR5cGUgZXh0ZW5kcyBBbnlUeXBlPih0eXBlOiBUVHlwZSk6IE1heWJlT3B0aW9uYWxNb2RlbFByb3A8VHlwZVRvRGF0YTxUVHlwZT4+XG5cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcCh0eXBlT3JEZWZhdWx0VmFsdWU6IGFueSwgZGVmPzogYW55KTogQW55TW9kZWxQcm9wIHtcbiAgbGV0IGhhc0RlZmF1bHRWYWx1ZSA9IGZhbHNlXG5cbiAgc3dpdGNoICh0eXBlb2YgdHlwZU9yRGVmYXVsdFZhbHVlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIHRQcm9wKHR5cGVzU3RyaW5nLCB0eXBlT3JEZWZhdWx0VmFsdWUpXG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIHRQcm9wKHR5cGVzTnVtYmVyLCB0eXBlT3JEZWZhdWx0VmFsdWUpXG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiB0UHJvcCh0eXBlc0Jvb2xlYW4sIHR5cGVPckRlZmF1bHRWYWx1ZSlcbiAgfVxuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAvLyB0eXBlLCBkZWZhdWx0XG4gICAgaGFzRGVmYXVsdFZhbHVlID0gdHJ1ZVxuICB9XG5cbiAgY29uc3QgbmV3UHJvcCA9IGhhc0RlZmF1bHRWYWx1ZSA/IHByb3AoZGVmKSA6IHByb3AoKVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcmVzb2x2ZVN0YW5kYXJkVHlwZSh0eXBlT3JEZWZhdWx0VmFsdWUpIGFzIHVua25vd24gYXNcbiAgICB8IFR5cGVDaGVja2VyXG4gICAgfCBMYXRlVHlwZUNoZWNrZXJcblxuICBjb25zdCBmcm9tU25hcHNob3RUeXBlQ2hlY2tlciA9IGhhc0RlZmF1bHRWYWx1ZVxuICAgID8gdHlwZXNPcih0eXBlQ2hlY2tlciBhcyB1bmtub3duIGFzIEFueVR5cGUsIHR5cGVzVW5kZWZpbmVkLCB0eXBlc051bGwpXG4gICAgOiB0eXBlQ2hlY2tlclxuXG4gIHJldHVybiB7XG4gICAgLi4ubmV3UHJvcCxcbiAgICBfaW50ZXJuYWw6IHtcbiAgICAgIC4uLm5ld1Byb3AuX2ludGVybmFsLFxuXG4gICAgICB0eXBlQ2hlY2tlcixcblxuICAgICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiAoc24pID0+IHtcbiAgICAgICAgY29uc3QgZnNucCA9IHJlc29sdmVUeXBlQ2hlY2tlcihmcm9tU25hcHNob3RUeXBlQ2hlY2tlcikuZnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gICAgICAgIHJldHVybiBmc25wID8gZnNucChzbikgOiBzblxuICAgICAgfSxcblxuICAgICAgdG9TbmFwc2hvdFByb2Nlc3NvcjogKHNuKSA9PiB7XG4gICAgICAgIGNvbnN0IHRzbnAgPSByZXNvbHZlVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgICAgICAgcmV0dXJuIHRzbnAgPyB0c25wKHNuKSA6IHNuXG4gICAgICB9LFxuICAgIH0sXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjaGFpbkZuczxGIGV4dGVuZHMgRnVuY3Rpb24+KC4uLmZuczogKEYgfCB1bmRlZmluZWQpW10pOiBGIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmaW5lZEZucyA9IGZucy5maWx0ZXIoKGZuKSA9PiAhIWZuKVxuICBpZiAoZGVmaW5lZEZucy5sZW5ndGggPD0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGNoYWluZWRGbiA9ICh2OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgbGV0IHJldCA9IHZcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVmaW5lZEZucy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0ID0gZGVmaW5lZEZuc1tpXSEocmV0LCAuLi5hcmdzKVxuICAgIH1cblxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIHJldHVybiBjaGFpbmVkRm4gYXMgdW5rbm93biBhcyBGXG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi9CYXNlTW9kZWxTaGFyZWRcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEFzc2VydHMgc29tZXRoaW5nIGlzIGFjdHVhbGx5IGEgY2xhc3Mgb3IgZGF0YSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gbW9kZWxcbiAqIEBwYXJhbSBhcmdOYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc0NsYXNzT3JEYXRhTW9kZWxDbGFzcyhcbiAgbW9kZWw6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZyxcbiAgY3VzdG9tRXJyTXNnID0gXCJtdXN0IGJlIGEgY2xhc3Mgb3IgZGF0YSBtb2RlbCBjbGFzc1wiXG4pOiBhc3NlcnRzIG1vZGVsIGlzIE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+IHtcbiAgaWYgKCFpc01vZGVsQ2xhc3MobW9kZWwpICYmICFpc0RhdGFNb2RlbENsYXNzKG1vZGVsKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gJHtjdXN0b21FcnJNc2d9YClcbiAgfVxufVxuIiwiaW1wb3J0IHsgYXBwbHlTZXQgfSBmcm9tIFwiLi4vYWN0aW9uL2FwcGx5U2V0XCJcbmltcG9ydCB7IGdldEN1cnJlbnRBY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IG1vZGVsQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBBbnlEYXRhTW9kZWwsIEJhc2VEYXRhTW9kZWwsIGJhc2VEYXRhTW9kZWxQcm9wTmFtZXMgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0RhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9nZXREYXRhTW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgeyBBbnlNb2RlbCwgQmFzZU1vZGVsLCBiYXNlTW9kZWxQcm9wTmFtZXMgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IHR5cGVzT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL29iamVjdEJhc2VkL3R5cGVzT2JqZWN0XCJcbmltcG9ydCB7IHR5cGVzU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcbmltcG9ydCB7IHRQcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3RQcm9wXCJcbmltcG9ydCB0eXBlIHsgTGF0ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkIH0gZnJvbSBcIi4uL3R5cGVzL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWRcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUsIHByb3BOYW1lVG9TZXR0ZXJOYW1lIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGNoYWluRm5zIH0gZnJvbSBcIi4uL3V0aWxzL2NoYWluRm5zXCJcbmltcG9ydCB7IE1vZGVsQ2xhc3MsIG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wgfSBmcm9tIFwiLi9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbml0aWFsaXplcnNTeW1ib2wgfSBmcm9tIFwiLi9tb2RlbENsYXNzSW5pdGlhbGl6ZXJcIlxuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvLCBzZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8gfSBmcm9tIFwiLi9tb2RlbFByb3BzSW5mb1wiXG5pbXBvcnQgeyBtb2RlbE1ldGFkYXRhU3ltYm9sLCBtb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sIH0gZnJvbSBcIi4vbW9kZWxTeW1ib2xzXCJcbmltcG9ydCB7IEFueU1vZGVsUHJvcCwgTW9kZWxQcm9wcywgcHJvcCB9IGZyb20gXCIuL3Byb3BcIlxuaW1wb3J0IHsgYXNzZXJ0SXNDbGFzc09yRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbmZ1bmN0aW9uIF9fZXh0ZW5kcyhzdWJDbGFzczogYW55LCBzdXBlckNsYXNzOiBhbnkpIHtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKVxuICBmdW5jdGlvbiBfXyh0aGlzOiBhbnkpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3NcbiAgfVxuICBfXy5wcm90b3R5cGUgPSBzdXBlckNsYXNzLnByb3RvdHlwZVxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBuZXcgKF9fIGFzIGFueSkoKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNb2RlbFByb3BEZXNjcmlwdG9yKFxuICBtb2RlbFByb3BOYW1lOiBzdHJpbmcsXG4gIG1vZGVsUHJvcDogQW55TW9kZWxQcm9wIHwgdW5kZWZpbmVkLFxuICBlbnVtZXJhYmxlOiBib29sZWFuXG4pOiBQcm9wZXJ0eURlc2NyaXB0b3Ige1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldCh0aGlzOiBBbnlNb2RlbCB8IEFueURhdGFNb2RlbCkge1xuICAgICAgcmV0dXJuIGdldE1vZGVsSW5zdGFuY2VEYXRhRmllbGQodGhpcywgbW9kZWxQcm9wLCBtb2RlbFByb3BOYW1lKVxuICAgIH0sXG4gICAgc2V0KHRoaXM6IEFueU1vZGVsIHwgQW55RGF0YU1vZGVsLCB2PzogYW55KSB7XG4gICAgICAvLyBoYWNrIHRvIG9ubHkgcGVybWl0IHNldHRpbmcgdGhlc2UgdmFsdWVzIG9uY2UgZnVsbHkgY29uc3RydWN0ZWRcbiAgICAgIC8vIHRoaXMgaXMgdG8gaWdub3JlIGFic3RyYWN0IHByb3BlcnRpZXMgYmVpbmcgc2V0IGJ5IGJhYmVsXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3hhdmllcmdvbnovbW9ieC1rZXlzdG9uZS9pc3N1ZXMvMThcbiAgICAgIGlmICghKG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wgaW4gdGhpcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzZXRNb2RlbEluc3RhbmNlRGF0YUZpZWxkKHRoaXMsIG1vZGVsUHJvcCwgbW9kZWxQcm9wTmFtZSwgdilcbiAgICB9LFxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vZGVsSW5zdGFuY2VEYXRhRmllbGQ8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIG1vZGVsUHJvcDogQW55TW9kZWxQcm9wIHwgdW5kZWZpbmVkLFxuICBtb2RlbFByb3BOYW1lOiBzdHJpbmdcbik6IGFueSB7XG4gIC8vIG5vIG5lZWQgdG8gdXNlIGdldCBzaW5jZSB0aGVzZSB2YXJzIGFsd2F5cyBnZXQgb24gdGhlIGluaXRpYWwgJFxuICBjb25zdCB2YWx1ZSA9IG1vZGVsLiRbbW9kZWxQcm9wTmFtZV1cblxuICBpZiAobW9kZWxQcm9wPy5faW50ZXJuYWwudHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIG1vZGVsUHJvcC5faW50ZXJuYWwudHJhbnNmb3JtLnRyYW5zZm9ybSh2YWx1ZSwgbW9kZWwsIG1vZGVsUHJvcE5hbWUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgLy8gdXNlIGFwcGx5IHNldCBpbnN0ZWFkIHRvIHdyYXAgaXQgaW4gYW4gYWN0aW9uXG4gICAgICAvLyBzZXQgdGhlICQgb2JqZWN0IHRvIHNldCB0aGUgb3JpZ2luYWwgdmFsdWUgZGlyZWN0bHlcbiAgICAgIGFwcGx5U2V0KG1vZGVsLiQsIG1vZGVsUHJvcE5hbWUsIG5ld1ZhbHVlKVxuICAgIH0pIGFzIGFueVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmZ1bmN0aW9uIHNldE1vZGVsSW5zdGFuY2VEYXRhRmllbGQ8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIG1vZGVsUHJvcDogQW55TW9kZWxQcm9wIHwgdW5kZWZpbmVkLFxuICBtb2RlbFByb3BOYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnlcbik6IHZvaWQge1xuICBpZiAobW9kZWxQcm9wPy5faW50ZXJuYWwuc2V0dGVyID09PSBcImFzc2lnblwiICYmICFnZXRDdXJyZW50QWN0aW9uQ29udGV4dCgpKSB7XG4gICAgLy8gdXNlIGFwcGx5IHNldCBpbnN0ZWFkIHRvIHdyYXAgaXQgaW4gYW4gYWN0aW9uXG4gICAgYXBwbHlTZXQobW9kZWwsIG1vZGVsUHJvcE5hbWUgYXMgYW55LCB2YWx1ZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSBtb2RlbFByb3A/Ll9pbnRlcm5hbC50cmFuc2Zvcm1cbiAgICA/IG1vZGVsUHJvcC5faW50ZXJuYWwudHJhbnNmb3JtLnVudHJhbnNmb3JtKHZhbHVlLCBtb2RlbCwgbW9kZWxQcm9wTmFtZSlcbiAgICA6IHZhbHVlXG4gIC8vIG5vIG5lZWQgdG8gdXNlIHNldCBzaW5jZSB0aGVzZSB2YXJzIGFsd2F5cyBnZXQgb24gdGhlIGluaXRpYWwgJFxuICBtb2RlbC4kW21vZGVsUHJvcE5hbWVdID0gdHJhbnNmb3JtZWRWYWx1ZVxufVxuXG5jb25zdCBpZEdlbmVyYXRvciA9ICgpID0+IGdldEdsb2JhbENvbmZpZygpLm1vZGVsSWRHZW5lcmF0b3IoKVxuY29uc3QgdFByb3BGb3JJZCA9IHRQcm9wKHR5cGVzU3RyaW5nLCBpZEdlbmVyYXRvcilcbnRQcm9wRm9ySWQuX2ludGVybmFsLmlzSWQgPSB0cnVlXG5jb25zdCBwcm9wRm9ySWQgPSBwcm9wKGlkR2VuZXJhdG9yKVxucHJvcEZvcklkLl9pbnRlcm5hbC5pc0lkID0gdHJ1ZVxuXG50eXBlIEZyb21TbmFwc2hvdFByb2Nlc3NvckZuID0gKHNuOiBhbnkpID0+IGFueVxudHlwZSBUb1NuYXBzaG90UHJvY2Vzc29yRm4gPSAoc246IGFueSwgaW5zdGFuY2U6IGFueSkgPT4gYW55XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWRJbnRlcm5hbE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBUQmFzZU1vZGVsIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWxcbj4oe1xuICBtb2RlbFByb3BzLFxuICBiYXNlTW9kZWwsXG4gIHR5cGUsXG4gIHZhbHVlVHlwZSxcbiAgZnJvbVNuYXBzaG90UHJvY2Vzc29yLFxuICB0b1NuYXBzaG90UHJvY2Vzc29yLFxufToge1xuICBtb2RlbFByb3BzOiBUUHJvcHNcbiAgYmFzZU1vZGVsOiBNb2RlbENsYXNzPFRCYXNlTW9kZWw+IHwgdW5kZWZpbmVkXG4gIHR5cGU6IFwiY2xhc3NcIiB8IFwiZGF0YVwiXG4gIHZhbHVlVHlwZTogYm9vbGVhblxuICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IEZyb21TbmFwc2hvdFByb2Nlc3NvckZuIHwgdW5kZWZpbmVkXG4gIHRvU25hcHNob3RQcm9jZXNzb3I6IFRvU25hcHNob3RQcm9jZXNzb3JGbiB8IHVuZGVmaW5lZFxufSk6IGFueSB7XG4gIGFzc2VydElzT2JqZWN0KG1vZGVsUHJvcHMsIFwibW9kZWxQcm9wc1wiKVxuICBpZiAoYmFzZU1vZGVsKSB7XG4gICAgYXNzZXJ0SXNDbGFzc09yRGF0YU1vZGVsQ2xhc3MoYmFzZU1vZGVsLCBcImJhc2VNb2RlbFwiKVxuXG4gICAgLy8gaWYgdGhlIGJhc2VNb2RlbCBpcyB3cmFwcGVkIHdpdGggdGhlIG1vZGVsIGRlY29yYXRvciBnZXQgdGhlIG9yaWdpbmFsIG9uZVxuICAgIGNvbnN0IHVud3JhcHBlZENsYXNzID0gKGJhc2VNb2RlbCBhcyBhbnkpW21vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2xdXG4gICAgaWYgKHVud3JhcHBlZENsYXNzKSB7XG4gICAgICBiYXNlTW9kZWwgPSB1bndyYXBwZWRDbGFzc1xuICAgICAgYXNzZXJ0SXNDbGFzc09yRGF0YU1vZGVsQ2xhc3MoYmFzZU1vZGVsLCBcImJhc2VNb2RlbFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV4dHJhRGVzY3JpcHRvcnM6IFByb3BlcnR5RGVzY3JpcHRvck1hcCA9IHt9XG5cbiAgY29uc3QgY29tcG9zZWRNb2RlbFByb3BzOiBNb2RlbFByb3BzID0gbW9kZWxQcm9wc1xuICBpZiAoYmFzZU1vZGVsKSB7XG4gICAgY29uc3Qgb2xkTW9kZWxQcm9wcyA9IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhiYXNlTW9kZWwpXG4gICAgZm9yIChjb25zdCBvbGRNb2RlbFByb3BLZXkgb2YgT2JqZWN0LmtleXMob2xkTW9kZWxQcm9wcykpIHtcbiAgICAgIGlmIChtb2RlbFByb3BzW29sZE1vZGVsUHJvcEtleV0pIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgZXh0ZW5kZWQgbW9kZWwgY2Fubm90IHJlZGVjbGFyZSBiYXNlIG1vZGVsIHByb3BlcnR5IG5hbWVkICcke29sZE1vZGVsUHJvcEtleX0nYFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb21wb3NlZE1vZGVsUHJvcHNbb2xkTW9kZWxQcm9wS2V5XSA9IG9sZE1vZGVsUHJvcHNbb2xkTW9kZWxQcm9wS2V5XVxuICAgIH1cbiAgfVxuXG4gIC8vIGxvb2sgZm9yIGlkIGtleXNcbiAgY29uc3QgaWRLZXlzID0gT2JqZWN0LmtleXMoY29tcG9zZWRNb2RlbFByb3BzKS5maWx0ZXIoKGspID0+IHtcbiAgICBjb25zdCBwID0gY29tcG9zZWRNb2RlbFByb3BzW2tdXG4gICAgcmV0dXJuIHAuX2ludGVybmFsLmlzSWRcbiAgfSlcbiAgaWYgKHR5cGUgPT09IFwiY2xhc3NcIikge1xuICAgIGlmIChpZEtleXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgZXhwZWN0ZWQgYXQgbW9zdCBvbmUgaWRQcm9wIGJ1dCBnb3QgbWFueTogJHtKU09OLnN0cmluZ2lmeShpZEtleXMpfWApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpZEtleXMubGVuZ3RoID49IDEpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYGV4cGVjdGVkIG5vIGlkUHJvcCBidXQgZ290IHNvbWU6ICR7SlNPTi5zdHJpbmdpZnkoaWRLZXlzKX1gKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5lZWRzVHlwZUNoZWNrZXIgPSBPYmplY3QudmFsdWVzKGNvbXBvc2VkTW9kZWxQcm9wcykuc29tZShcbiAgICAobXApID0+ICEhbXAuX2ludGVybmFsLnR5cGVDaGVja2VyXG4gIClcblxuICAvLyB0cmFuc2Zvcm0gaWQga2V5cyAob25seSBvbmUgcmVhbGx5KVxuICBsZXQgaWRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBpZiAoaWRLZXlzLmxlbmd0aCA+PSAxKSB7XG4gICAgaWRLZXkgPSBpZEtleXNbMF1cbiAgICBjb25zdCBpZFByb3AgPSBjb21wb3NlZE1vZGVsUHJvcHNbaWRLZXldXG4gICAgbGV0IGJhc2VQcm9wOiBBbnlNb2RlbFByb3AgPSBuZWVkc1R5cGVDaGVja2VyID8gdFByb3BGb3JJZCA6IHByb3BGb3JJZFxuICAgIHN3aXRjaCAoaWRQcm9wPy5faW50ZXJuYWwuc2V0dGVyKSB7XG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIGJhc2VQcm9wID0gYmFzZVByb3Aud2l0aFNldHRlcigpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiYXNzaWduXCI6XG4gICAgICAgIGJhc2VQcm9wID0gYmFzZVByb3Aud2l0aFNldHRlcihcImFzc2lnblwiKVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gICAgY29tcG9zZWRNb2RlbFByb3BzW2lkS2V5XSA9IGJhc2VQcm9wXG4gIH1cblxuICAvLyBjcmVhdGUgdHlwZSBjaGVja2VyIGlmIG5lZWRlZFxuICBsZXQgZGF0YVR5cGVDaGVja2VyOiBMYXRlVHlwZUNoZWNrZXIgfCB1bmRlZmluZWRcbiAgaWYgKG5lZWRzVHlwZUNoZWNrZXIpIHtcbiAgICBjb25zdCB0eXBlQ2hlY2tlck9iajoge1xuICAgICAgW2s6IHN0cmluZ106IGFueVxuICAgIH0gPSB7fVxuICAgIGZvciAoY29uc3QgW2ssIG1wXSBvZiBPYmplY3QuZW50cmllcyhjb21wb3NlZE1vZGVsUHJvcHMpKSB7XG4gICAgICB0eXBlQ2hlY2tlck9ialtrXSA9ICFtcC5faW50ZXJuYWwudHlwZUNoZWNrZXIgPyB0eXBlc1VuY2hlY2tlZCgpIDogbXAuX2ludGVybmFsLnR5cGVDaGVja2VyXG4gICAgfVxuICAgIGRhdGFUeXBlQ2hlY2tlciA9IHR5cGVzT2JqZWN0KCgpID0+IHR5cGVDaGVja2VyT2JqKSBhcyBhbnlcbiAgfVxuXG4gIGNvbnN0IGJhc2VQcm9wTmFtZXMgPSB0eXBlID09PSBcImNsYXNzXCIgPyBiYXNlTW9kZWxQcm9wTmFtZXMgOiBiYXNlRGF0YU1vZGVsUHJvcE5hbWVzXG5cbiAgLy8gc2tpcCBwcm9wcyB0aGF0IGFyZSBvbiBiYXNlIG1vZGVsLCB0aGVzZSBoYXZlIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggJFxuICAvLyB3ZSBvbmx5IG5lZWQgdG8gcHJveHkgbmV3IHByb3BzLCBub3Qgb2xkIG9uZXNcbiAgZm9yIChjb25zdCBtb2RlbFByb3BOYW1lIG9mIE9iamVjdC5rZXlzKG1vZGVsUHJvcHMpLmZpbHRlcihcbiAgICAobXApID0+ICFiYXNlUHJvcE5hbWVzLmhhcyhtcCBhcyBhbnkpXG4gICkpIHtcbiAgICBleHRyYURlc2NyaXB0b3JzW21vZGVsUHJvcE5hbWVdID0gY3JlYXRlTW9kZWxQcm9wRGVzY3JpcHRvcihcbiAgICAgIG1vZGVsUHJvcE5hbWUsXG4gICAgICBtb2RlbFByb3BzW21vZGVsUHJvcE5hbWVdLFxuICAgICAgZmFsc2VcbiAgICApXG4gIH1cblxuICBjb25zdCBleHRyYVByb3BOYW1lcyA9IE9iamVjdC5rZXlzKGV4dHJhRGVzY3JpcHRvcnMpXG4gIGNvbnN0IGV4dHJhUHJvcE5hbWVzTGVuID0gZXh0cmFQcm9wTmFtZXMubGVuZ3RoXG5cbiAgY29uc3QgYmFzZTogYW55ID0gYmFzZU1vZGVsID8/ICh0eXBlID09PSBcImNsYXNzXCIgPyBCYXNlTW9kZWwgOiBCYXNlRGF0YU1vZGVsKVxuXG4gIC8vIHdlIHVzZSB0aGlzIHdlaXJkIGhhY2sgcmF0aGVyIHRoYW4ganVzdCBjbGFzcyBDdXN0b21CYXNlTW9kZWwgZXh0ZW5kcyBiYXNlIHt9XG4gIC8vIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggRVM1IGNsYXNzZXMgZXh0ZW5kaW5nIEVTNiBjbGFzc2VzXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20veGF2aWVyZ29uei9tb2J4LWtleXN0b25lL2lzc3Vlcy8xNVxuICBjb25zdCBDdXN0b21CYXNlTW9kZWw6IGFueSA9IChmdW5jdGlvbiAoX2Jhc2UpIHtcbiAgICBfX2V4dGVuZHMoQ3VzdG9tQmFzZU1vZGVsLCBfYmFzZSlcblxuICAgIGZ1bmN0aW9uIEN1c3RvbUJhc2VNb2RlbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGluaXRpYWxEYXRhOiBhbnksXG4gICAgICBjb25zdHJ1Y3Rvck9wdGlvbnM/OiBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB8IERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9uc1xuICAgICkge1xuICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IGNvbnN0cnVjdG9yT3B0aW9ucz8ubW9kZWxDbGFzcyA/PyB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICBjb25zdCBiYXNlTW9kZWwgPSBuZXcgX2Jhc2UoaW5pdGlhbERhdGEsIHtcbiAgICAgICAgLi4uY29uc3RydWN0b3JPcHRpb25zLFxuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgfSBhcyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyAmIERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucylcblxuICAgICAgLy8gbWFrZSBzdXJlIGFic3RyYWN0IGNsYXNzZXMgZG8gbm90IG92ZXJyaWRlIHByb3RvdHlwZSBwcm9wc1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRyYVByb3BOYW1lc0xlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhUHJvcE5hbWUgPSBleHRyYVByb3BOYW1lc1tpXVxuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlTW9kZWwsIGV4dHJhUHJvcE5hbWUpKSB7XG4gICAgICAgICAgZGVsZXRlIGJhc2VNb2RlbFtleHRyYVByb3BOYW1lXVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYXNlTW9kZWxcbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tQmFzZU1vZGVsXG4gIH0pKGJhc2UpXG5cbiAgY29uc3QgaW5pdGlhbGl6ZXJzID0gYmFzZVttb2RlbEluaXRpYWxpemVyc1N5bWJvbF1cbiAgaWYgKGluaXRpYWxpemVycykge1xuICAgIEN1c3RvbUJhc2VNb2RlbFttb2RlbEluaXRpYWxpemVyc1N5bWJvbF0gPSBpbml0aWFsaXplcnMuc2xpY2UoKVxuICB9XG5cbiAgc2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKEN1c3RvbUJhc2VNb2RlbCwgY29tcG9zZWRNb2RlbFByb3BzKVxuXG4gIGlmICh0eXBlID09PSBcImNsYXNzXCIpIHtcbiAgICBjb25zdCBtZXRhZGF0YTogTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIGRhdGFUeXBlOiBkYXRhVHlwZUNoZWNrZXIgYXMgdW5rbm93biBhcyBBbnlUeXBlIHwgdW5kZWZpbmVkLFxuICAgICAgbW9kZWxJZFByb3BlcnR5OiBpZEtleSxcbiAgICAgIHZhbHVlVHlwZSxcbiAgICB9XG4gICAgQ3VzdG9tQmFzZU1vZGVsW21vZGVsTWV0YWRhdGFTeW1ib2xdID0gbWV0YWRhdGFcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtZXRhZGF0YTogRGF0YU1vZGVsTWV0YWRhdGEgPSB7XG4gICAgICBkYXRhVHlwZTogZGF0YVR5cGVDaGVja2VyIGFzIHVua25vd24gYXMgQW55VHlwZSB8IHVuZGVmaW5lZCxcbiAgICB9XG4gICAgQ3VzdG9tQmFzZU1vZGVsW21vZGVsTWV0YWRhdGFTeW1ib2xdID0gbWV0YWRhdGFcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEN1c3RvbUJhc2VNb2RlbC5wcm90b3R5cGUsIGV4dHJhRGVzY3JpcHRvcnMpXG5cbiAgLy8gYWRkIHNldHRlciBhY3Rpb25zIHRvIHByb3RvdHlwZVxuICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcERhdGFdIG9mIE9iamVjdC5lbnRyaWVzKG1vZGVsUHJvcHMpKSB7XG4gICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5zZXR0ZXIgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHNldHRlck5hbWUgPSBwcm9wTmFtZVRvU2V0dGVyTmFtZShwcm9wTmFtZSlcblxuICAgICAgQ3VzdG9tQmFzZU1vZGVsLnByb3RvdHlwZVtzZXR0ZXJOYW1lXSA9IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpc1twcm9wTmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdQcm9wRGVzY3JpcHRvcjogYW55ID0gbW9kZWxBY3Rpb24oXG4gICAgICAgIEN1c3RvbUJhc2VNb2RlbC5wcm90b3R5cGUsXG4gICAgICAgIHNldHRlck5hbWUsXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ3VzdG9tQmFzZU1vZGVsLnByb3RvdHlwZSwgc2V0dGVyTmFtZSlcbiAgICAgIClcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEN1c3RvbUJhc2VNb2RlbC5wcm90b3R5cGUsIHNldHRlck5hbWUsIG5ld1Byb3BEZXNjcmlwdG9yKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1vZGVsUHJvcHNGcm9tU25hcHNob3RQcm9jZXNzb3IgPSBnZXRNb2RlbFByb3BzRnJvbVNuYXBzaG90UHJvY2Vzc29yKGNvbXBvc2VkTW9kZWxQcm9wcylcblxuICBjb25zdCBtb2RlbFByb3BzVG9TbmFwc2hvdFByb2Nlc3NvciA9IGdldE1vZGVsUHJvcHNUb1NuYXBzaG90UHJvY2Vzc29yKGNvbXBvc2VkTW9kZWxQcm9wcylcblxuICBpZiAoZnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgY29uc3QgZm4gPSBmcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgICBmcm9tU25hcHNob3RQcm9jZXNzb3IgPSAoc24pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmZuKHNuKSxcbiAgICAgICAgW21vZGVsVHlwZUtleV06IHNuW21vZGVsVHlwZUtleV0sXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRvU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICBjb25zdCBmbiA9IHRvU25hcHNob3RQcm9jZXNzb3JcbiAgICB0b1NuYXBzaG90UHJvY2Vzc29yID0gKHNuLCBtb2RlbEluc3RhbmNlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5mbihzbiwgbW9kZWxJbnN0YW5jZSksXG4gICAgICAgIFttb2RlbFR5cGVLZXldOiBzblttb2RlbFR5cGVLZXldLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEN1c3RvbUJhc2VNb2RlbC5mcm9tU25hcHNob3RQcm9jZXNzb3IgPSBjaGFpbkZucyhcbiAgICBmcm9tU25hcHNob3RQcm9jZXNzb3IsXG4gICAgbW9kZWxQcm9wc0Zyb21TbmFwc2hvdFByb2Nlc3NvclxuICApXG4gIEN1c3RvbUJhc2VNb2RlbC50b1NuYXBzaG90UHJvY2Vzc29yID0gY2hhaW5GbnMobW9kZWxQcm9wc1RvU25hcHNob3RQcm9jZXNzb3IsIHRvU25hcHNob3RQcm9jZXNzb3IpXG5cbiAgcmV0dXJuIEN1c3RvbUJhc2VNb2RlbFxufVxuXG5mdW5jdGlvbiBnZXRNb2RlbFByb3BzRnJvbVNuYXBzaG90UHJvY2Vzc29yKFxuICBjb21wb3NlZE1vZGVsUHJvcHM6IE1vZGVsUHJvcHNcbik6IEZyb21TbmFwc2hvdFByb2Nlc3NvckZuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvcHNXaXRoRnJvbVNuYXBzaG90UHJvY2Vzc29yID0gT2JqZWN0LmVudHJpZXMoY29tcG9zZWRNb2RlbFByb3BzKS5maWx0ZXIoXG4gICAgKFtfcHJvcE5hbWUsIHByb3BEYXRhXSkgPT4gcHJvcERhdGEuX2ludGVybmFsLmZyb21TbmFwc2hvdFByb2Nlc3NvclxuICApXG4gIGlmIChwcm9wc1dpdGhGcm9tU25hcHNob3RQcm9jZXNzb3IubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4gKHNuKSA9PiB7XG4gICAgY29uc3QgbmV3U24gPSB7IC4uLnNuIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcERhdGFdIG9mIHByb3BzV2l0aEZyb21TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICAgICAgbmV3U25bcHJvcE5hbWVdID0gcHJvcERhdGEuX2ludGVybmFsLmZyb21TbmFwc2hvdFByb2Nlc3Nvcihzbltwcm9wTmFtZV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdTblxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vZGVsUHJvcHNUb1NuYXBzaG90UHJvY2Vzc29yKFxuICBjb21wb3NlZE1vZGVsUHJvcHM6IE1vZGVsUHJvcHNcbik6IFRvU25hcHNob3RQcm9jZXNzb3JGbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb3BzV2l0aFRvU25hcHNob3RQcm9jZXNzb3IgPSBPYmplY3QuZW50cmllcyhjb21wb3NlZE1vZGVsUHJvcHMpLmZpbHRlcihcbiAgICAoW19wcm9wTmFtZSwgcHJvcERhdGFdKSA9PiBwcm9wRGF0YS5faW50ZXJuYWwudG9TbmFwc2hvdFByb2Nlc3NvclxuICApXG5cbiAgaWYgKHByb3BzV2l0aFRvU25hcHNob3RQcm9jZXNzb3IubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4gKHNuKSA9PiB7XG4gICAgY29uc3QgbmV3U24gPSB7IC4uLnNuIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcERhdGFdIG9mIHByb3BzV2l0aFRvU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwudG9TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgICAgICBuZXdTbltwcm9wTmFtZV0gPSBwcm9wRGF0YS5faW50ZXJuYWwudG9TbmFwc2hvdFByb2Nlc3Nvcihzbltwcm9wTmFtZV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdTblxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFic3RyYWN0TW9kZWxDbGFzcyxcbiAgTW9kZWxDbGFzcyxcbiAgTW9kZWxUcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUHJvcHMsXG4gIE1vZGVsUHJvcHNUb1NldHRlcixcbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90RGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgc2hhcmVkSW50ZXJuYWxNb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9zaGFyZWRJbnRlcm5hbE1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwsIEJhc2VNb2RlbCwgQmFzZU1vZGVsS2V5cywgTW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRJc01vZGVsQ2xhc3MsIGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IHR5cGUgX0NvbXBvc2VkQ3JlYXRpb25EYXRhPFxuICBTdXBlck1vZGVsLFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzXG4+ID0gU3VwZXJNb2RlbCBleHRlbmRzIEFueU1vZGVsXG4gID8gTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPiAmIE1vZGVsVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8U3VwZXJNb2RlbD5cbiAgOiBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgdHlwZSB1c2VkIGJ5IGZyb21TbmFwc2hvdCBiZWZvcmUgcHJvY2Vzc29ycyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgRnJvbVNuYXBzaG90RGVmYXVsdFR5cGU8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4gPVxuICBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YTxUUHJvcHM+XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgdHlwZSB1c2VkIGJ5IGdldFNuYXBzaG90IGJlZm9yZSBwcm9jZXNzb3JzIGFyZSBhcHBsaWVkLlxuICovXG5leHBvcnQgdHlwZSBUb1NuYXBzaG90RGVmYXVsdFR5cGU8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGE8VFByb3BzPlxuXG5leHBvcnQgdHlwZSBfTW9kZWxJZDxTdXBlck1vZGVsLCBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IFN1cGVyTW9kZWwgZXh0ZW5kcyBBbnlNb2RlbFxuICA/IE1vZGVsSWRQcm9wZXJ0eU5hbWU8U3VwZXJNb2RlbD5cbiAgOiBFeHRyYWN0TW9kZWxJZFByb3A8VFByb3BzPiAmIHN0cmluZ1xuXG5leHBvcnQgaW50ZXJmYWNlIF9Nb2RlbDxcbiAgU3VwZXJNb2RlbCxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgRnJvbVNuYXBzaG90T3ZlcnJpZGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUb1NuYXBzaG90T3ZlcnJpZGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+IHtcbiAgbmV3IChkYXRhOiBfQ29tcG9zZWRDcmVhdGlvbkRhdGE8U3VwZXJNb2RlbCwgVFByb3BzPik6IFN1cGVyTW9kZWwgJlxuICAgIEJhc2VNb2RlbDxUUHJvcHMsIEZyb21TbmFwc2hvdE92ZXJyaWRlLCBUb1NuYXBzaG90T3ZlcnJpZGUsIF9Nb2RlbElkPFN1cGVyTW9kZWwsIFRQcm9wcz4+ICZcbiAgICBPbWl0PE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YTxUUHJvcHM+LCBCYXNlTW9kZWxLZXlzPiAmXG4gICAgTW9kZWxQcm9wc1RvU2V0dGVyPFRQcm9wcz5cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBtb2RlbCBpZCBwcm9wZXJ0eSBmcm9tIHRoZSBtb2RlbCBwcm9wcy5cbiAqL1xuZXhwb3J0IHR5cGUgRXh0cmFjdE1vZGVsSWRQcm9wPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID0ge1xuICBbSyBpbiBrZXlvZiBUUHJvcHNdOiBUUHJvcHNbS11bXCJfaW50ZXJuYWxcIl1bXCIkaXNJZFwiXSBleHRlbmRzIHRydWUgPyBLIDogbmV2ZXJcbn1ba2V5b2YgVFByb3BzXVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscyB0aGF0IGV4dGVuZHMgYW5vdGhlciBtb2RlbC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBOZXcgbW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHR5cGVwYXJhbSBUTW9kZWxDbGFzcyBNb2RlbCBjbGFzcyB0eXBlLlxuICogQHBhcmFtIGdlbkZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYmFzZSBtb2RlbCBhbmQgbW9kZWwgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtb2RlbE9wdGlvbnMgTW9kZWwgb3B0aW9ucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFeHRlbmRlZE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBUTW9kZWxDbGFzcyBleHRlbmRzIEFic3RyYWN0TW9kZWxDbGFzczxBbnlNb2RlbD4sXG4gIEEgZXh0ZW5kcyBbXSxcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KFxuICBnZW5GbjogKC4uLmFyZ3M6IEEpID0+IHtcbiAgICBiYXNlTW9kZWw6IFRNb2RlbENsYXNzXG4gICAgcHJvcHM6IFRQcm9wc1xuICB9LFxuICBtb2RlbE9wdGlvbnM/OiBNb2RlbE9wdGlvbnM8VFByb3BzLCBGUywgVFM+XG4pOiBfTW9kZWw8SW5zdGFuY2VUeXBlPFRNb2RlbENsYXNzPiwgVFByb3BzLCBGUywgVFM+XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgbW9kZWxzIHRoYXQgZXh0ZW5kcyBhbm90aGVyIG1vZGVsLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE5ldyBtb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAdHlwZXBhcmFtIFRNb2RlbENsYXNzIE1vZGVsIGNsYXNzIHR5cGUuXG4gKiBAcGFyYW0gYmFzZU1vZGVsIEJhc2UgbW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFByb3BzIE1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWRNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ2xhc3M8QW55TW9kZWw+LFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oXG4gIGJhc2VNb2RlbDogVE1vZGVsQ2xhc3MsXG4gIG1vZGVsUHJvcHM6IFRQcm9wcyxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPEluc3RhbmNlVHlwZTxUTW9kZWxDbGFzcz4sIFRQcm9wcywgRlMsIFRTPiAmIHtcbiAgW1AgaW4gRXhjbHVkZTxrZXlvZiBUTW9kZWxDbGFzcywgXCJwcm90b3R5cGVcIj5dOiBUTW9kZWxDbGFzc1tQXVxufVxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWRNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ2xhc3M8QW55TW9kZWw+LFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oLi4uYXJnczogYW55W10pOiBfTW9kZWw8SW5zdGFuY2VUeXBlPFRNb2RlbENsYXNzPiwgVFByb3BzLCBGUywgVFM+IHtcbiAgbGV0IGJhc2VNb2RlbFxuICBsZXQgbW9kZWxQcm9wc1xuICBsZXQgbW9kZWxPcHRpb25zXG4gIGlmIChpc01vZGVsQ2xhc3MoYXJnc1swXSkpIHtcbiAgICBiYXNlTW9kZWwgPSBhcmdzWzBdXG4gICAgbW9kZWxQcm9wcyA9IGFyZ3NbMV1cbiAgICBtb2RlbE9wdGlvbnMgPSBhcmdzWzJdXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZ2VuID0gYXJnc1swXSgpXG5cbiAgICBiYXNlTW9kZWwgPSBnZW4uYmFzZU1vZGVsXG4gICAgbW9kZWxQcm9wcyA9IGdlbi5wcm9wc1xuICAgIG1vZGVsT3B0aW9ucyA9IGFyZ3NbMV1cbiAgfVxuXG4gIGFzc2VydElzTW9kZWxDbGFzcyhiYXNlTW9kZWwsIFwiYmFzZU1vZGVsXCIpXG5cbiAgcmV0dXJuIGludGVybmFsTW9kZWwobW9kZWxQcm9wcywgYmFzZU1vZGVsIGFzIGFueSwgbW9kZWxPcHRpb25zKVxufVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25Jbml0YCBvciBgb25BdHRhY2hlZFRvUm9vdFN0b3JlYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEBwYXJhbSBmbk1vZGVsUHJvcHMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgbW9kZWwgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtb2RlbE9wdGlvbnMgTW9kZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBBIGV4dGVuZHMgW10sXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgZm5Nb2RlbFByb3BzOiAoLi4uYXJnczogQSkgPT4gVFByb3BzLFxuICBtb2RlbE9wdGlvbnM/OiBNb2RlbE9wdGlvbnM8VFByb3BzLCBGUywgVFM+XG4pOiBfTW9kZWw8dW5rbm93biwgVFByb3BzLCBGUywgVFM+XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgbW9kZWxzLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkluaXRgIG9yIGBvbkF0dGFjaGVkVG9Sb290U3RvcmVgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHBhcmFtIG1vZGVsUHJvcHMgTW9kZWwgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtb2RlbE9wdGlvbnMgTW9kZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4obW9kZWxQcm9wczogVFByb3BzLCBtb2RlbE9wdGlvbnM/OiBNb2RlbE9wdGlvbnM8VFByb3BzLCBGUywgVFM+KTogX01vZGVsPHVua25vd24sIFRQcm9wcywgRlMsIFRTPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzOiAoKCkgPT4gVFByb3BzKSB8IFRQcm9wcyxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPHVua25vd24sIFRQcm9wcywgRlMsIFRTPiB7XG4gIGNvbnN0IG1vZGVsUHJvcHMgPVxuICAgIHR5cGVvZiBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHMoKVxuICAgICAgOiBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHNcbiAgcmV0dXJuIGludGVybmFsTW9kZWwobW9kZWxQcm9wcywgdW5kZWZpbmVkLCBtb2RlbE9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGludGVybmFsTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRCYXNlTW9kZWwgZXh0ZW5kcyBBbnlNb2RlbCxcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KFxuICBtb2RlbFByb3BzOiBUUHJvcHMsXG4gIGJhc2VNb2RlbDogTW9kZWxDbGFzczxUQmFzZU1vZGVsPiB8IHVuZGVmaW5lZCxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPFRCYXNlTW9kZWwsIFRQcm9wcywgRlMsIFRTPiB7XG4gIHJldHVybiBzaGFyZWRJbnRlcm5hbE1vZGVsKHtcbiAgICBtb2RlbFByb3BzLFxuICAgIGJhc2VNb2RlbCxcbiAgICB0eXBlOiBcImNsYXNzXCIsXG4gICAgdmFsdWVUeXBlOiBtb2RlbE9wdGlvbnM/LnZhbHVlVHlwZSA/PyBmYWxzZSxcbiAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IG1vZGVsT3B0aW9ucz8uZnJvbVNuYXBzaG90UHJvY2Vzc29yLFxuICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IG1vZGVsT3B0aW9ucz8udG9TbmFwc2hvdFByb2Nlc3NvcixcbiAgfSlcbn1cblxuLyoqXG4gKiBNb2RlbCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsT3B0aW9uczxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLCBGUywgVFM+IHtcbiAgLyoqXG4gICAqIEEgdmFsdWUgdHlwZSB3aWxsIGJlIGNsb25lZCBhdXRvbWF0aWNhbGx5IHdoZW4gYmVpbmcgYXR0YWNoZWQgdG8gYSBuZXcgdHJlZS5cbiAgICogVGhlIGRlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIHZhbHVlVHlwZT86IGJvb2xlYW5cblxuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gdGhhdCB3aWxsIGJlIHJ1biB3aGVuIGNvbnZlcnRpbmcgZnJvbSBhIHNuYXBzaG90IHRvIHRoZSBkYXRhIHBhcnQgb2YgdGhlIG1vZGVsLlxuICAgKiBVc2VmdWwgZm9yIGV4YW1wbGUgdG8gZG8gdmVyc2lvbmluZyBhbmQga2VlcCB0aGUgZGF0YSBwYXJ0IHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0gc24gVGhlIGN1c3RvbSBpbnB1dCBzbmFwc2hvdC5cbiAgICogQHJldHVybnMgQW4gaW5wdXQgc25hcHNob3QgdGhhdCBtdXN0IG1hdGNoIHRoZSBleHBlY3RlZCBtb2RlbCBpbnB1dCBzbmFwc2hvdC5cbiAgICovXG4gIGZyb21TbmFwc2hvdFByb2Nlc3Nvcj8oc246IEZTKTogRnJvbVNuYXBzaG90RGVmYXVsdFR5cGU8VFByb3BzPlxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiB0aGF0IHdpbGwgYmUgcnVuIHdoZW4gY29udmVydGluZyB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBtb2RlbCBpbnRvIGEgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBzbiBUaGUgb3V0cHV0IHNuYXBzaG90LlxuICAgKiBAcGFyYW0gbW9kZWxJbnN0YW5jZSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zICBhIGN1c3RvbSBvdXRwdXQgc25hcHNob3QuXG4gICAqL1xuICB0b1NuYXBzaG90UHJvY2Vzc29yPyhzbjogVG9TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcz4sIG1vZGVsSW5zdGFuY2U6IGFueSk6IFRTXG59XG4iLCJpbXBvcnQgeyBIb29rQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9ob29rQWN0aW9uc1wiXG5pbXBvcnQgeyB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsQ2xhc3MsIG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MsIG1vZGVsSW5mb0J5TmFtZSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHtcbiAgbW9kZWxVbndyYXBwZWRDbGFzc1N5bWJvbCxcbiAgcnVuQWZ0ZXJNb2RlbERlY29yYXRvclN5bWJvbCxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQge1xuICBhZGRIaWRkZW5Qcm9wLFxuICBmYWlsdXJlLFxuICBnZXRNb2J4VmVyc2lvbixcbiAgbG9nV2FybmluZyxcbiAgbW9ieDYsXG4gIHJ1bkFmdGVyTmV3U3ltYm9sLFxuICBydW5CZWZvcmVPbkluaXRTeW1ib2wsXG4gIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyxcbn0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBtYXJrcyB0aGlzIGNsYXNzICh3aGljaCBNVVNUIGluaGVyaXQgZnJvbSB0aGUgYE1vZGVsYCBvciBgRGF0YU1vZGVsYCBhYnN0cmFjdCBjbGFzc2VzKVxuICogYXMgYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gbmFtZSBVbmlxdWUgbmFtZSBmb3IgdGhlIG1vZGVsIHR5cGUuIE5vdGUgdGhhdCB0aGlzIG5hbWUgbXVzdCBiZSB1bmlxdWUgZm9yIHlvdXIgd2hvbGVcbiAqIGFwcGxpY2F0aW9uLCBzbyBpdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvIHVzZSBzb21lIHByZWZpeCB1bmlxdWUgdG8geW91ciBhcHBsaWNhdGlvbiBkb21haW4uXG4gKi9cbmV4cG9ydCBjb25zdCBtb2RlbCA9XG4gIChuYW1lOiBzdHJpbmcpID0+XG4gIDxNQyBleHRlbmRzIE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+PihjbGF6ejogTUMpOiBNQyA9PiB7XG4gICAgcmV0dXJuIGludGVybmFsTW9kZWwobmFtZSkoY2xhenopXG4gIH1cblxuY29uc3QgaW50ZXJuYWxNb2RlbCA9XG4gIChuYW1lOiBzdHJpbmcpID0+XG4gIDxNQyBleHRlbmRzIE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+PihjbGF6ejogTUMpOiBNQyA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGlzTW9kZWxDbGFzcyhjbGF6eikgPyBcImNsYXNzXCIgOiBpc0RhdGFNb2RlbENsYXNzKGNsYXp6KSA/IFwiZGF0YVwiIDogdW5kZWZpbmVkXG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBjbGF6eiBtdXN0IGJlIGEgY2xhc3MgdGhhdCBleHRlbmRzIGZyb20gTW9kZWwvRGF0YU1vZGVsYClcbiAgICB9XG5cbiAgICBpZiAobW9kZWxJbmZvQnlOYW1lW25hbWVdKSB7XG4gICAgICBpZiAoZ2V0R2xvYmFsQ29uZmlnKCkuc2hvd0R1cGxpY2F0ZU1vZGVsTmFtZVdhcm5pbmdzKSB7XG4gICAgICAgIGxvZ1dhcm5pbmcoXG4gICAgICAgICAgXCJ3YXJuXCIsXG4gICAgICAgICAgYGEgbW9kZWwgd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzIChpZiB5b3UgYXJlIHVzaW5nIGhvdC1yZWxvYWRpbmcgeW91IG1heSBzYWZlbHkgaWdub3JlIHRoaXMgd2FybmluZylgLFxuICAgICAgICAgIGBkdXBsaWNhdGVNb2RlbE5hbWUgLSAke25hbWV9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2wgaW4gY2xhenopIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIGNsYXNzIGFscmVhZHkgZGVjb3JhdGVkIHdpdGggYEBtb2RlbGAgY2Fubm90IGJlIHJlLWRlY29yYXRlZFwiKVxuICAgIH1cblxuICAgIC8vIHRyYWNrIGlmIHdlIGZhaWwgc28gd2Ugb25seSB0cnkgaXQgb25jZSBwZXIgY2xhc3NcbiAgICBsZXQgbWFrZU9ic2VydmFibGVGYWlsZWQgPSBmYWxzZVxuXG4gICAgLy8gdHJpY2sgc28gcGxhaW4gbmV3IHdvcmtzXG4gICAgY29uc3QgbmV3Q2xheno6IGFueSA9IGZ1bmN0aW9uICh0aGlzOiBhbnksIGluaXRpYWxEYXRhOiBhbnksIG1vZGVsQ29uc3RydWN0b3JPcHRpb25zOiBhbnkpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IChjbGF6eiBhcyBhbnkpKGluaXRpYWxEYXRhLCBtb2RlbENvbnN0cnVjdG9yT3B0aW9ucylcblxuICAgICAgLy8gc2V0IG9yIGVsc2UgaXQgcG9pbnRzIHRvIHRoZSB1bmRlY29yYXRlZCBjbGFzc1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBuZXdDbGF6eixcbiAgICAgIH0pXG5cbiAgICAgIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyhpbnN0YW5jZSwgcnVuQWZ0ZXJOZXdTeW1ib2wpXG5cbiAgICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBtb2J4IDZcbiAgICAgIGlmICghbWFrZU9ic2VydmFibGVGYWlsZWQgJiYgZ2V0TW9ieFZlcnNpb24oKSA+PSA2KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbW9ieDYubWFrZU9ic2VydmFibGUoaW5zdGFuY2UpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBzYWRseSB3ZSBuZWVkIHRvIHVzZSB0aGlzIGhhY2sgc2luY2UgdGhlIFBSIHRvIGRvIHRoaXMgdGhlIHByb3BlciB3YXlcbiAgICAgICAgICAvLyB3YXMgcmVqZWN0ZWQgb24gdGhlIG1vYnggc2lkZVxuICAgICAgICAgIG1ha2VPYnNlcnZhYmxlRmFpbGVkID0gdHJ1ZVxuXG4gICAgICAgICAgY29uc3QgZXJyID0gZSBhcyBFcnJvclxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVyci5tZXNzYWdlICE9PVxuICAgICAgICAgICAgICBcIltNb2JYXSBObyBhbm5vdGF0aW9ucyB3ZXJlIHBhc3NlZCB0byBtYWtlT2JzZXJ2YWJsZSwgYnV0IG5vIGRlY29yYXRvciBtZW1iZXJzIGhhdmUgYmVlbiBmb3VuZCBlaXRoZXJcIiAmJlxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgIT09XG4gICAgICAgICAgICAgIFwiW01vYlhdIE5vIGFubm90YXRpb25zIHdlcmUgcGFzc2VkIHRvIG1ha2VPYnNlcnZhYmxlLCBidXQgbm8gZGVjb3JhdGVkIG1lbWJlcnMgaGF2ZSBiZWVuIGZvdW5kIGVpdGhlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdGhlIG9iamVjdCBpcyByZWFkeVxuICAgICAgYWRkSGlkZGVuUHJvcChpbnN0YW5jZSwgbW9kZWxJbml0aWFsaXplZFN5bWJvbCwgdHJ1ZSwgZmFsc2UpXG5cbiAgICAgIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyhpbnN0YW5jZSwgcnVuQmVmb3JlT25Jbml0U3ltYm9sKVxuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjbGFzc1wiICYmIGluc3RhbmNlLm9uSW5pdCkge1xuICAgICAgICB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkKGluc3RhbmNlLCBcIm9uSW5pdFwiLCBIb29rQWN0aW9uLk9uSW5pdClcblxuICAgICAgICBpbnN0YW5jZS5vbkluaXQoKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gXCJkYXRhXCIgJiYgaW5zdGFuY2Uub25MYXp5SW5pdCkge1xuICAgICAgICB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkKGluc3RhbmNlLCBcIm9uTGF6eUluaXRcIiwgSG9va0FjdGlvbi5PbkxhenlJbml0KVxuXG4gICAgICAgIGluc3RhbmNlLm9uTGF6eUluaXQoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICB9XG5cbiAgICBjbGF6ei50b1N0cmluZyA9ICgpID0+IGBjbGFzcyAke2NsYXp6Lm5hbWV9IyR7bmFtZX1gXG4gICAgaWYgKHR5cGUgPT09IFwiY2xhc3NcIikge1xuICAgICAgOyhjbGF6eiBhcyBhbnkpW21vZGVsVHlwZUtleV0gPSBuYW1lXG4gICAgfVxuXG4gICAgLy8gdGhpcyBhbHNvIGdpdmVzIGFjY2VzcyB0byBtb2RlbEluaXRpYWxpemVyc1N5bWJvbCwgbW9kZWxQcm9wZXJ0aWVzU3ltYm9sLCBtb2RlbERhdGFUeXBlQ2hlY2tlclN5bWJvbFxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdDbGF6eiwgY2xhenopXG4gICAgbmV3Q2xhenoucHJvdG90eXBlID0gY2xhenoucHJvdG90eXBlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q2xhenosIFwibmFtZVwiLCB7XG4gICAgICAuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5ld0NsYXp6LCBcIm5hbWVcIiksXG4gICAgICB2YWx1ZTogY2xhenoubmFtZSxcbiAgICB9KVxuICAgIG5ld0NsYXp6W21vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2xdID0gY2xhenpcblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBjbGFzczogbmV3Q2xhenosXG4gICAgfVxuXG4gICAgbW9kZWxJbmZvQnlOYW1lW25hbWVdID0gbW9kZWxJbmZvXG5cbiAgICBtb2RlbEluZm9CeUNsYXNzLnNldChuZXdDbGF6eiwgbW9kZWxJbmZvKVxuICAgIG1vZGVsSW5mb0J5Q2xhc3Muc2V0KGNsYXp6LCBtb2RlbEluZm8pXG5cbiAgICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMoY2xhenosIHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wpXG5cbiAgICByZXR1cm4gbmV3Q2xhenpcbiAgfVxuXG4vLyBiYXNpY2FsbHkgdGFrZW4gZnJvbSBUU1xuZnVuY3Rpb24gdHNEZWNvcmF0ZShkZWNvcmF0b3JzOiBhbnksIHRhcmdldDogYW55LCBrZXk6IGFueSwgZGVzYzogYW55KSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICByID1cbiAgICAgIGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpIDogZGVzYyxcbiAgICBkXG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKFJlZmxlY3QgYXMgYW55KS5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSAoUmVmbGVjdCBhcyBhbnkpLmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKVxuICBlbHNlXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICBpZiAoKGQgPSBkZWNvcmF0b3JzW2ldKSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlcXVlbmNlc1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByXG59XG5cbi8qKlxuICogTWFya3MgYSBjbGFzcyAod2hpY2ggTVVTVCBpbmhlcml0IGZyb20gdGhlIGBNb2RlbGAgYWJzdHJhY3QgY2xhc3MpXG4gKiBhcyBhIG1vZGVsIGFuZCBkZWNvcmF0ZXMgc29tZSBvZiBpdHMgbWV0aG9kcy9wcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBuYW1lIFVuaXF1ZSBuYW1lIGZvciB0aGUgbW9kZWwgdHlwZS4gTm90ZSB0aGF0IHRoaXMgbmFtZSBtdXN0IGJlIHVuaXF1ZSBmb3IgeW91ciB3aG9sZVxuICogYXBwbGljYXRpb24sIHNvIGl0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgdG8gdXNlIHNvbWUgcHJlZml4IHVuaXF1ZSB0byB5b3VyIGFwcGxpY2F0aW9uIGRvbWFpbi5cbiAqIElmIHlvdSBkb24ndCB3YW50IHRvIGFzc2lnbiBhIG5hbWUgeWV0IChlLmcuIGZvciBhIGJhc2UgbW9kZWwpIHBhc3MgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0gY2xhenogTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGVkTW9kZWw8TSwgTUMgZXh0ZW5kcyBhYnN0cmFjdCBuZXcgKC4uLmFnczogYW55KSA9PiBNPihcbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjbGF6ejogTUMsXG4gIGRlY29yYXRvcnM6IHtcbiAgICBbayBpbiBrZXlvZiBNXT86ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBSZWFkb25seUFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gYW55PlxuICB9XG4pOiBNQyB7XG4gIC8vIGRlY29yYXRlIGNsYXNzIG1lbWJlcnNcbiAgZm9yIChjb25zdCBbaywgZGVjb3JhdG9yXSBvZiBPYmplY3QuZW50cmllcyhkZWNvcmF0b3JzKSkge1xuICAgIGNvbnN0IHByb3RvdHlwZVZhbHVlRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2xhenoucHJvdG90eXBlLCBrKVxuICAgIC8vIFRTIHNlZW1zIHRvIHNlbmQgbnVsbCBmb3IgbWV0aG9kcyBpbiB0aGUgcHJvdG90eXBlXG4gICAgLy8gKHdoaWNoIHdlIHN1YnN0aXR1dGUgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGF2b2lkIGEgZG91YmxlIGxvb2stdXApIGFuZCB2b2lkIDAgKHVuZGVmaW5lZCkgZm9yIHByb3BzXG4gICAgdHNEZWNvcmF0ZShcbiAgICAgIEFycmF5LmlzQXJyYXkoZGVjb3JhdG9yKSA/IGRlY29yYXRvciA6IFtkZWNvcmF0b3JdLFxuICAgICAgY2xhenoucHJvdG90eXBlLFxuICAgICAgayxcbiAgICAgIHByb3RvdHlwZVZhbHVlRGVzYyA/IHByb3RvdHlwZVZhbHVlRGVzYyA6IHZvaWQgMFxuICAgIClcbiAgfVxuXG4gIHJldHVybiAobmFtZSA/IG1vZGVsKG5hbWUpKGNsYXp6IGFzIHVua25vd24gYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pIDogY2xhenopIGFzIE1DXG59XG4iLCJpbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcclxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxyXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIEFycmF5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcclxuaW1wb3J0IHtcclxuICBsYXRlVHlwZUNoZWNrZXIsXHJcbiAgVHlwZUNoZWNrZXIsXHJcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcclxuICBUeXBlSW5mbyxcclxuICBUeXBlSW5mb0dlbixcclxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXHJcblxyXG4vKipcclxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgYSBnaXZlbiB0eXBlLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCBudW1iZXJBcnJheVR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5udW1iZXIpXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgSXRlbSB0eXBlLlxyXG4gKiBAcGFyYW0gaXRlbVR5cGUgVHlwZSBvZiBpbm5lciBpdGVtcy5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0FycmF5PFQgZXh0ZW5kcyBBbnlUeXBlPihpdGVtVHlwZTogVCk6IEFycmF5VHlwZTxUW10+IHtcclxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IEFycmF5VHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZShpdGVtVHlwZSkpXHJcblxyXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoaXRlbVR5cGUpXHJcblxyXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PlxyXG4gICAgICBgQXJyYXk8JHtpdGVtQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIGl0ZW1DaGVja2VyKX0+YFxyXG5cclxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuQXJyYXksXHJcblxyXG4gICAgICAoYXJyYXksIHBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWlzQXJyYXkoYXJyYXkpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIGFycmF5KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpdGVtQ2hlY2tlci51bmNoZWNrZWQpIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUVycm9yID0gaXRlbUNoZWNrZXIuY2hlY2soYXJyYXlbaV0sIFsuLi5wYXRoLCBpXSlcclxuICAgICAgICAgICAgaWYgKGl0ZW1FcnJvcikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtRXJyb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgfSxcclxuICAgICAgZ2V0VHlwZU5hbWUsXHJcbiAgICAgIHR5cGVJbmZvR2VuLFxyXG5cclxuICAgICAgKGFycmF5KSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXRlbUNoZWNrZXIudW5jaGVja2VkKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BY3R1YWxDaGVja2VyID0gaXRlbUNoZWNrZXIuc25hcHNob3RUeXBlKGFycmF5W2ldKVxyXG4gICAgICAgICAgICBpZiAoIWl0ZW1BY3R1YWxDaGVja2VyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXNUY1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgKHNuOiB1bmtub3duW10pID0+IHtcclxuICAgICAgICBpZiAoaXRlbUNoZWNrZXIudW5jaGVja2VkKSB7XHJcbiAgICAgICAgICByZXR1cm4gc25cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzbi5tYXAoKGl0ZW0pID0+IGl0ZW1DaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihpdGVtKSlcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChzbjogdW5rbm93bltdKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW1DaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc24ubWFwKChpdGVtKSA9PiBpdGVtQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKGl0ZW0pKVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuIHRoaXNUY1xyXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy5hcnJheWAgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEFycmF5VHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XHJcbiAgZ2V0IGl0ZW1UeXBlSW5mbygpOiBUeXBlSW5mbyB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy5pdGVtVHlwZSlcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IGl0ZW1UeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHtcclxuICAgIHN1cGVyKHRoaXNUeXBlKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNvbXB1dGVkIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHsgbW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsQWN0aW9uXCJcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCJcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsRGVjb3JhdG9yXCJcbmltcG9ydCB7IGZhc3RHZXRSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMsIFBhdGNoLCBwYXRjaFJlY29yZGVyLCBQYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IHR5cGVzQXJyYXkgfSBmcm9tIFwiLi4vdHlwZXMvYXJyYXlCYXNlZC90eXBlc0FycmF5XCJcbmltcG9ydCB7IHRQcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3RQcm9wXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkIH0gZnJvbSBcIi4uL3R5cGVzL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWRcIlxuaW1wb3J0IHsgZmFpbHVyZSwgZ2V0TW9ieFZlcnNpb24sIG1vYng2LCBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLCBTaW1wbGVBY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlXCJcblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gZXZlbnQgd2l0aG91dCBhdHRhY2hlZCBzdGF0ZS5cbiAqL1xuZXhwb3J0IHR5cGUgVW5kb0V2ZW50V2l0aG91dEF0dGFjaGVkU3RhdGUgPSBVbmRvU2luZ2xlRXZlbnQgfCBVbmRvRXZlbnRHcm91cFxuXG4vKipcbiAqIEFuIHVuZG8vcmVkbyBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgVW5kb0V2ZW50ID0gVW5kb0V2ZW50V2l0aG91dEF0dGFjaGVkU3RhdGUgJiB7XG4gIC8qKlxuICAgKiBUaGUgc3RhdGUgc2F2ZWQgYmVmb3JlIHRoZSBldmVudCBhY3Rpb25zIHN0YXJ0ZWQgLyBhZnRlciB0aGUgZXZlbnQgYWN0aW9ucyBmaW5pc2hlZC5cbiAgICovXG4gIGF0dGFjaGVkU3RhdGU6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgc2F2ZWQgYmVmb3JlIHRoZSBldmVudCBhY3Rpb25zIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgYmVmb3JlRXZlbnQ/OiB1bmtub3duXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIHNhdmVkIGFmdGVyIHRoZSBldmVudCBhY3Rpb25zIGZpbmlzaGVkLlxuICAgICAqL1xuICAgIGFmdGVyRXZlbnQ/OiB1bmtub3duXG4gIH1cbn1cblxuLyoqXG4gKiBVbmRvIGV2ZW50IHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIFVuZG9FdmVudFR5cGUge1xuICBTaW5nbGUgPSBcInNpbmdsZVwiLFxuICBHcm91cCA9IFwiZ3JvdXBcIixcbn1cblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gc2luZ2xlIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuZG9TaW5nbGVFdmVudCB7XG4gIC8qKlxuICAgKiBFeHByZXNzZXMgdGhpcyBpcyBhIHNpbmdsZSBldmVudC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFVuZG9FdmVudFR5cGUuU2luZ2xlXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBvYmplY3QgdGhhdCBpbnZva2VkIHRoZSBhY3Rpb24gZnJvbSBpdHMgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGg6IFBhdGhcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IHdhcyBpbnZva2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdpdGggY2hhbmdlcyBkb25lIGluc2lkZSB0aGUgYWN0aW9uLlxuICAgKiBVc2UgYHJlZG8oKWAgaW4gdGhlIGBVbmRvTWFuYWdlcmAgdG8gYXBwbHkgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+XG4gIC8qKlxuICAgKiBQYXRjaGVzIHRvIHVuZG8gdGhlIGNoYW5nZXMgZG9uZSBpbnNpZGUgdGhlIGFjdGlvbi5cbiAgICogVXNlIGB1bmRvKClgIGluIHRoZSBgVW5kb01hbmFnZXJgIHRvIGFwcGx5IHRoZW0uXG4gICAqL1xuICByZWFkb25seSBpbnZlcnNlUGF0Y2hlczogUmVhZG9ubHlBcnJheTxQYXRjaD5cbn1cblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gZXZlbnQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5kb0V2ZW50R3JvdXAge1xuICAvKipcbiAgICogRXhwcmVzc2VzIHRoaXMgaXMgYW4gZXZlbnQgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBVbmRvRXZlbnRUeXBlLkdyb3VwXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBncm91cCAoaWYgYW55KS5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3VwTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogRXZlbnRzIHRoYXQgY29uZm9ybSB0aGlzIGdyb3VwIChtaWdodCBiZSBzaW5nbGUgZXZlbnRzIG9yIG90aGVyIG5lc3RlZCBncm91cHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzOiBSZWFkb25seUFycmF5PFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlPlxufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUV2ZW50cyhcbiAgZXZlbnQ6IFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlLFxuICByZXZlcnNlOiBib29sZWFuXG4pOiBSZWFkb25seUFycmF5PFVuZG9TaW5nbGVFdmVudD4ge1xuICBpZiAoZXZlbnQudHlwZSA9PT0gVW5kb0V2ZW50VHlwZS5TaW5nbGUpIHJldHVybiBbZXZlbnRdXG4gIGVsc2Uge1xuICAgIGNvbnN0IGFycmF5OiBVbmRvU2luZ2xlRXZlbnRbXSA9IFtdXG4gICAgZm9yIChjb25zdCBlIG9mIGV2ZW50LmV2ZW50cykge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgYXJyYXkudW5zaGlmdCguLi50b1NpbmdsZUV2ZW50cyhlLCB0cnVlKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5LnB1c2goLi4udG9TaW5nbGVFdmVudHMoZSwgZmFsc2UpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlcbiAgfVxufVxuXG4vKipcbiAqIFN0b3JlIG1vZGVsIGluc3RhbmNlIGZvciB1bmRvL3JlZG8gYWN0aW9ucy5cbiAqIERvIG5vdCBtYW5pcHVsYXRlIGRpcmVjdGx5LCBvdGhlciB0aGF0IGNyZWF0aW5nIGl0LlxuICovXG5AbW9kZWwoYCR7bmFtZXNwYWNlfS9VbmRvU3RvcmVgKVxuZXhwb3J0IGNsYXNzIFVuZG9TdG9yZSBleHRlbmRzIE1vZGVsKHtcbiAgLy8gVE9ETzogYWRkIHByb3BlciB0eXBlIGNoZWNraW5nIHRvIHVuZG8gc3RvcmVcbiAgdW5kb0V2ZW50czogdFByb3AodHlwZXNBcnJheSh0eXBlc1VuY2hlY2tlZDxVbmRvRXZlbnQ+KCkpLCAoKSA9PiBbXSksXG4gIHJlZG9FdmVudHM6IHRQcm9wKHR5cGVzQXJyYXkodHlwZXNVbmNoZWNrZWQ8VW5kb0V2ZW50PigpKSwgKCkgPT4gW10pLFxufSkge1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQG1vZGVsQWN0aW9uXG4gIF9jbGVhclVuZG8oKSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgdGhpcy51bmRvRXZlbnRzLmxlbmd0aCA9IDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfY2xlYXJSZWRvKCkge1xuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIHRoaXMucmVkb0V2ZW50cy5sZW5ndGggPSAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAbW9kZWxBY3Rpb25cbiAgX3VuZG8oKSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnVuZG9FdmVudHMucG9wKCkhXG4gICAgICB0aGlzLnJlZG9FdmVudHMucHVzaChldmVudClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfcmVkbygpIHtcbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHRoaXMucmVkb0V2ZW50cy5wb3AoKSFcbiAgICAgIHRoaXMudW5kb0V2ZW50cy5wdXNoKGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQG1vZGVsQWN0aW9uXG4gIF9hZGRVbmRvKGV2ZW50OiBVbmRvRXZlbnQpIHtcbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0aGlzLnVuZG9FdmVudHMucHVzaChldmVudClcbiAgICAgIC8vIG9uY2UgYW4gdW5kbyBldmVudCBpcyBhZGRlZCByZWRvIHF1ZXVlIGlzIG5vIGxvbmdlciB2YWxpZFxuICAgICAgdGhpcy5yZWRvRXZlbnRzLmxlbmd0aCA9IDBcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBfZ3JvdXBTdGFjazogVW5kb0V2ZW50R3JvdXBbXSA9IFtdXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIF9hZGRVbmRvVG9QYXJlbnRHcm91cChwYXJlbnRHcm91cDogVW5kb0V2ZW50R3JvdXAsIGV2ZW50OiBVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZSkge1xuICAgIDsocGFyZW50R3JvdXAuZXZlbnRzIGFzIFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlW10pLnB1c2goZXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ2V0IF9jdXJyZW50R3JvdXAoKTogVW5kb0V2ZW50R3JvdXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ncm91cFN0YWNrW3RoaXMuX2dyb3VwU3RhY2subGVuZ3RoIC0gMV1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBfc3RhcnRHcm91cChcbiAgICBncm91cE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdGFydFJ1bm5pbmc6IGJvb2xlYW4sXG4gICAgb3B0aW9uczogVW5kb01pZGRsZXdhcmVPcHRpb25zPHVua25vd24+IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGxldCBydW5uaW5nID0gZmFsc2VcbiAgICBsZXQgZW5kZWQgPSBmYWxzZVxuICAgIGNvbnN0IHBhcmVudEdyb3VwID0gdGhpcy5fY3VycmVudEdyb3VwXG5cbiAgICBjb25zdCBncm91cDogVW5kb0V2ZW50R3JvdXAgPSB7XG4gICAgICB0eXBlOiBVbmRvRXZlbnRUeXBlLkdyb3VwLFxuICAgICAgZ3JvdXBOYW1lLFxuICAgICAgZXZlbnRzOiBbXSxcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQgPSBwYXJlbnRHcm91cCA/IHVuZGVmaW5lZCA6IG9wdGlvbnM/LmF0dGFjaGVkU3RhdGU/LnNhdmUoKVxuXG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgcGF1c2U6ICgpID0+IHtcbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBwYXVzZSBhIGdyb3VwIHdoZW4gaXQgaXMgYWxyZWFkeSBlbmRlZFwiKVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVubmluZykge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcGF1c2UgYSBncm91cCB3aGVuIGl0IGlzIG5vdCBydW5uaW5nXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRHcm91cCAhPT0gZ3JvdXApIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiZ3JvdXAgb3V0IG9mIG9yZGVyXCIpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ3JvdXBTdGFjay5wb3AoKVxuICAgICAgICBydW5uaW5nID0gZmFsc2VcbiAgICAgIH0sXG4gICAgICByZXN1bWU6ICgpID0+IHtcbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCByZXN1bWUgYSBncm91cCB3aGVuIGl0IGlzIGFscmVhZHkgZW5kZWRcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVzdW1lIGEgZ3JvdXAgd2hlbiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmdcIilcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ncm91cFN0YWNrLnB1c2goZ3JvdXApXG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlXG4gICAgICB9LFxuICAgICAgZW5kOiAoKSA9PiB7XG4gICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgYXBpLnBhdXNlKClcbiAgICAgICAgfVxuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgaWYgKHBhcmVudEdyb3VwKSB7XG4gICAgICAgICAgdGhpcy5fYWRkVW5kb1RvUGFyZW50R3JvdXAocGFyZW50R3JvdXAsIGdyb3VwKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2FkZFVuZG8oe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBhdHRhY2hlZFN0YXRlOiB7XG4gICAgICAgICAgICAgIGJlZm9yZUV2ZW50OiBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICAgIGFmdGVyRXZlbnQ6IG9wdGlvbnM/LmF0dGFjaGVkU3RhdGU/LnNhdmUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRSdW5uaW5nKSB7XG4gICAgICBhcGkucmVzdW1lKClcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpXG4gIH1cbn1cblxuLyoqXG4gKiBNYW5hZ2VyIGNsYXNzIHJldHVybmVkIGJ5IGB1bmRvTWlkZGxld2FyZWAgdGhhdCBhbGxvd3MgeW91IHRvIHBlcmZvcm0gdW5kby9yZWRvIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmRvTWFuYWdlciB7XG4gIC8qKlxuICAgKiBUaGUgc3RvcmUgY3VycmVudGx5IGJlaW5nIHVzZWQgdG8gc3RvcmUgdW5kby9yZWRvIGFjdGlvbiBldmVudHMuXG4gICAqL1xuICByZWFkb25seSBzdG9yZTogVW5kb1N0b3JlXG5cbiAgLyoqXG4gICAqIFRoZSB1bmRvIHN0YWNrLCB3aGVyZSB0aGUgZmlyc3Qgb3BlcmF0aW9uIHRvIHVuZG8gd2lsbCBiZSB0aGUgbGFzdCBvZiB0aGUgYXJyYXkuXG4gICAqIERvIG5vdCBtYW5pcHVsYXRlIHRoaXMgYXJyYXkgZGlyZWN0bHkuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHVuZG9RdWV1ZSgpOiBSZWFkb25seUFycmF5PFVuZG9FdmVudD4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnVuZG9FdmVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkbyBzdGFjaywgd2hlcmUgdGhlIGZpcnN0IG9wZXJhdGlvbiB0byByZWRvIHdpbGwgYmUgdGhlIGxhc3Qgb2YgdGhlIGFycmF5LlxuICAgKiBEbyBub3QgbWFuaXB1bGF0ZSB0aGlzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCByZWRvUXVldWUoKTogUmVhZG9ubHlBcnJheTxVbmRvRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5yZWRvRXZlbnRzXG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB1bmRvIGFjdGlvbnMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB1bmRvTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnVuZG9RdWV1ZS5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB1bmRvIGNhbiBiZSBwZXJmb3JtZWQgKGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB1bmRvIGFjdGlvbiBhdmFpbGFibGUpLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCBjYW5VbmRvKCkge1xuICAgIHJldHVybiB0aGlzLnVuZG9MZXZlbHMgPiAwXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSB1bmRvIHF1ZXVlLlxuICAgKi9cbiAgQGFjdGlvblxuICBjbGVhclVuZG8oKSB7XG4gICAgdGhpcy5zdG9yZS5fY2xlYXJVbmRvKClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJlZG8gYWN0aW9ucyBhdmFpbGFibGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHJlZG9MZXZlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVkb1F1ZXVlLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIElmIHJlZG8gY2FuIGJlIHBlcmZvcm1lZCAoaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZG8gYWN0aW9uIGF2YWlsYWJsZSlcbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgY2FuUmVkbygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWRvTGV2ZWxzID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcmVkbyBxdWV1ZS5cbiAgICovXG4gIEBhY3Rpb25cbiAgY2xlYXJSZWRvKCkge1xuICAgIHRoaXMuc3RvcmUuX2NsZWFyUmVkbygpXG4gIH1cblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbi5cbiAgICogV2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBubyBhY3Rpb24gdG8gdW5kby5cbiAgICovXG4gIEBhY3Rpb25cbiAgdW5kbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuVW5kbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIm5vdGhpbmcgdG8gdW5kb1wiKVxuICAgIH1cbiAgICBjb25zdCBldmVudCA9IHRoaXMudW5kb1F1ZXVlW3RoaXMudW5kb1F1ZXVlLmxlbmd0aCAtIDFdXG5cbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0b1NpbmdsZUV2ZW50cyhldmVudCwgdHJ1ZSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdCwgZS5pbnZlcnNlUGF0Y2hlcywgdHJ1ZSlcbiAgICAgIH0pXG5cbiAgICAgIC8vIHJlc3RvcmUgdGhlIGF0dGFjaGVkIHN0YXRlIGJlZm9yZSB0aGUgb3BlcmF0aW9uIHdhcyBtYWRlXG4gICAgICBpZiAoZXZlbnQuYXR0YWNoZWRTdGF0ZT8uYmVmb3JlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5yZXN0b3JlKGV2ZW50LmF0dGFjaGVkU3RhdGUuYmVmb3JlRXZlbnQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuc3RvcmUuX3VuZG8oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgcHJldmlvdXMgYWN0aW9uLlxuICAgKiBXaWxsIHRocm93IGlmIHRoZXJlIGlzIG5vIGFjdGlvbiB0byByZWRvLlxuICAgKi9cbiAgQGFjdGlvblxuICByZWRvKCkge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwibm90aGluZyB0byByZWRvXCIpXG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5yZWRvUXVldWVbdGhpcy5yZWRvUXVldWUubGVuZ3RoIC0gMV1cblxuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIHRvU2luZ2xlRXZlbnRzKGV2ZW50LCBmYWxzZSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdCwgZS5wYXRjaGVzKVxuICAgICAgfSlcblxuICAgICAgLy8gcmVzdG9yZSB0aGUgYXR0YWNoZWQgc3RhdGUgYWZ0ZXIgdGhlIG9wZXJhdGlvbiB3YXMgbWFkZVxuICAgICAgaWYgKGV2ZW50LmF0dGFjaGVkU3RhdGU/LmFmdGVyRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5yZXN0b3JlKGV2ZW50LmF0dGFjaGVkU3RhdGUuYWZ0ZXJFdmVudClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5zdG9yZS5fcmVkbygpXG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIHVuZG8gbWlkZGxld2FyZS5cbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5kaXNwb3NlcigpXG4gIH1cblxuICBwcml2YXRlIF9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFJldHVybnMgaWYgdW5kbyByZWNvcmRpbmcgaXMgY3VycmVudGx5IGRpc2FibGVkIG9yIG5vdCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGBVbmRvTWFuYWdlcmAuXG4gICAqL1xuICBnZXQgaXNVbmRvUmVjb3JkaW5nRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkXG4gIH1cblxuICAvKipcbiAgICogU2tpcHMgdGhlIHVuZG8gcmVjb3JkaW5nIG1lY2hhbmlzbSBmb3IgdGhlIGNvZGUgYmxvY2sgdGhhdCBnZXRzIHJ1biBzeW5jaHJvbm91c2x5IGluc2lkZS5cbiAgICpcbiAgICogQHR5cGVwYXJhbSBUIENvZGUgYmxvY2sgcmV0dXJuIHR5cGUuXG4gICAqIEBwYXJhbSBmbiBDb2RlIGJsb2NrIHRvIHJ1bi5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgd2l0aG91dFVuZG88VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBzYXZlZFVuZG9EaXNhYmxlZCA9IHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkXG4gICAgdGhpcy5faXNVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSB0cnVlXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gc2F2ZWRVbmRvRGlzYWJsZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBncm91cCB0aGF0IGNhbiBiZSBjb250aW51ZWQgbXVsdGlwbGUgdGltZXMgYW5kIHRoZW4gZW5kZWQuXG4gICAqIEBwYXJhbSBncm91cE5hbWUgT3B0aW9uYWwgZ3JvdXAgbmFtZS5cbiAgICogQHJldHVybnMgQW4gQVBJIHRvIGNvbnRpbnVlL2VuZCB0aGUgZ3JvdXAuXG4gICAqL1xuICBjcmVhdGVHcm91cChncm91cE5hbWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuc3RvcmUuX3N0YXJ0R3JvdXAoZ3JvdXBOYW1lLCBmYWxzZSwgdGhpcy5vcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRpbnVlPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgICAgIGdyb3VwLnJlc3VtZSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZuKClcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBncm91cC5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVuZCgpIHtcbiAgICAgICAgZ3JvdXAuZW5kKClcbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeW5jaHJvbm91cyBjb2RlIGJsb2NrIGFzIGFuIHVuZG8gZ3JvdXAuXG4gICAqIE5vdGUgdGhhdCBuZXN0ZWQgZ3JvdXBzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JvdXBOYW1lIEdyb3VwIG5hbWUuXG4gICAqIEBwYXJhbSBmbiBDb2RlIGJsb2NrLlxuICAgKiBAcmV0dXJucyBDb2RlIGJsb2NrIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHdpdGhHcm91cDxUPihncm91cE5hbWU6IHN0cmluZywgZm46ICgpID0+IFQpOiBUXG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeW5jaHJvbm91cyBjb2RlIGJsb2NrIGFzIGFuIHVuZG8gZ3JvdXAuXG4gICAqIE5vdGUgdGhhdCBuZXN0ZWQgZ3JvdXBzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAcGFyYW0gZm4gQ29kZSBibG9jay5cbiAgICogQHJldHVybnMgQ29kZSBibG9jayByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB3aXRoR3JvdXA8VD4oZm46ICgpID0+IFQpOiBUXG5cbiAgd2l0aEdyb3VwPFQ+KGFyZzE6IGFueSwgYXJnMj86IGFueSk6IFQge1xuICAgIGxldCBncm91cE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGxldCBmbjogKCkgPT4gVFxuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZ3JvdXBOYW1lID0gYXJnMVxuICAgICAgZm4gPSBhcmcyXG4gICAgfSBlbHNlIHtcbiAgICAgIGZuID0gYXJnMVxuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5zdG9yZS5fc3RhcnRHcm91cChncm91cE5hbWUsIHRydWUsIHRoaXMub3B0aW9ucylcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ3JvdXAuZW5kKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhbiBhc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwTmFtZSBHcm91cCBuYW1lLlxuICAgKiBAcGFyYW0gZm4gRmxvdyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgRmxvdyBmdW5jdGlvbiByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB3aXRoR3JvdXBGbG93PFI+KGdyb3VwTmFtZTogc3RyaW5nLCBmbjogKCkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55Pik6IFByb21pc2U8Uj5cblxuICAvKipcbiAgICogUnVucyBhbiBhc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGZuIEZsb3cgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIEZsb3cgZnVuY3Rpb24gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgd2l0aEdyb3VwRmxvdzxSPihmbjogKCkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55Pik6IFByb21pc2U8Uj5cblxuICB3aXRoR3JvdXBGbG93PFI+KGFyZzE6IGFueSwgYXJnMj86IGFueSk6IFByb21pc2U8Uj4ge1xuICAgIGxldCBncm91cE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGxldCBmbjogKCkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55PlxuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZ3JvdXBOYW1lID0gYXJnMVxuICAgICAgZm4gPSBhcmcyXG4gICAgfSBlbHNlIHtcbiAgICAgIGZuID0gYXJnMVxuICAgIH1cblxuICAgIGNvbnN0IGdlbiA9IGZuKClcblxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5zdG9yZS5fc3RhcnRHcm91cChncm91cE5hbWUsIGZhbHNlLCB0aGlzLm9wdGlvbnMpXG5cbiAgICAvLyB1c2UgYm91bmQgZnVuY3Rpb25zIHRvIGZpeCBlczYgY29tcGlsYXRpb25cbiAgICBjb25zdCBnZW5OZXh0ID0gZ2VuLm5leHQuYmluZChnZW4pXG4gICAgY29uc3QgZ2VuVGhyb3cgPSBnZW4udGhyb3chLmJpbmQoZ2VuKVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFI+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbGVkKHJlczogYW55KTogdm9pZCB7XG4gICAgICAgIGdyb3VwLnJlc3VtZSgpXG4gICAgICAgIGxldCByZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBnZW5OZXh0KHJlcylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGdyb3VwLmVuZCgpXG4gICAgICAgICAgcmVqZWN0KGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBncm91cC5wYXVzZSgpXG4gICAgICAgIG5leHQocmV0KVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlamVjdGVkKGVycjogYW55KTogdm9pZCB7XG4gICAgICAgIGdyb3VwLnJlc3VtZSgpXG4gICAgICAgIGxldCByZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBnZW5UaHJvdyhlcnIpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBncm91cC5lbmQoKVxuICAgICAgICAgIHJlamVjdChlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXAucGF1c2UoKVxuICAgICAgICBuZXh0KHJldClcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbmV4dChyZXQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAocmV0ICYmIHR5cGVvZiByZXQudGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gYW4gYXN5bmMgaXRlcmF0b3JcbiAgICAgICAgICByZXQudGhlbihuZXh0LCByZWplY3QpXG4gICAgICAgIH0gZWxzZSBpZiAocmV0LmRvbmUpIHtcbiAgICAgICAgICAvLyBkb25lXG4gICAgICAgICAgZ3JvdXAuZW5kKClcbiAgICAgICAgICByZXNvbHZlKHJldC52YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb250aW51ZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXQudmFsdWUpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb25GdWxmaWxsZWQodW5kZWZpbmVkKSAvLyBraWNrIG9mZiB0aGUgcHJvY2Vzc1xuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFVuZG9NYW5hZ2VyYC5cbiAgICogRG8gbm90IHVzZSBkaXJlY3RseSwgdXNlIGB1bmRvTWlkZGxld2FyZWAgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIGRpc3Bvc2VyXG4gICAqIEBwYXJhbSBzdWJ0cmVlUm9vdFxuICAgKiBAcGFyYW0gW3N0b3JlXVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNwb3NlcjogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgICBzdG9yZTogVW5kb1N0b3JlIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVW5kb01pZGRsZXdhcmVPcHRpb25zPHVua25vd24+IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGlmIChnZXRNb2J4VmVyc2lvbigpID49IDYpIHtcbiAgICAgIG1vYng2Lm1ha2VPYnNlcnZhYmxlKHRoaXMpXG4gICAgfVxuXG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlID8/IG5ldyBVbmRvU3RvcmUoe30pXG4gIH1cbn1cblxuLyoqXG4gKiBVbmRvIG1pZGRsZXdhcmUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmRvTWlkZGxld2FyZU9wdGlvbnM8Uz4ge1xuICBhdHRhY2hlZFN0YXRlPzoge1xuICAgIHNhdmUoKTogU1xuICAgIHJlc3RvcmUoczogUyk6IHZvaWRcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gdW5kbyBtaWRkbGV3YXJlLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbCBgVW5kb1N0b3JlYCB3aGVyZSB0byBzdG9yZSB0aGUgdW5kby9yZWRvIHF1ZXVlcy4gVXNlIHRoaXMgaWYgeW91IHdhbnQgdG9cbiAqIHN0b3JlIHN1Y2ggcXVldWVzIHNvbWV3aGVyZSBpbiB5b3VyIG1vZGVscy4gSWYgbm9uZSBpcyBwcm92aWRlZCBpdCB3aWxsIHJlc2lkZSBpbiBtZW1vcnkuXG4gKiBAcGFyYW0gb3B0aW9ucyBFeHRyYSBvcHRpb25zLCBzdWNoIGFzIGhvdyB0byBzYXZlIC8gcmVzdG9yZSBjZXJ0YWluIHNuYXBzaG90IG9mIHRoZSBzdGF0ZSB0byBiZSByZXN0b3JlZCB3aGVuIHVuZG9pbmcvcmVkb2luZy5cbiAqIEByZXR1cm5zIEFuIGBVbmRvTWFuYWdlcmAgd2hpY2ggYWxsb3dzIHlvdSB0byBkbyB0aGUgbWFuYWdlIHRoZSB1bmRvL3JlZG8gb3BlcmF0aW9ucyBhbmQgZGlzcG9zZSBvZiB0aGUgbWlkZGxld2FyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuZG9NaWRkbGV3YXJlPFM+KFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0LFxuICBzdG9yZT86IFVuZG9TdG9yZSxcbiAgb3B0aW9ucz86IFVuZG9NaWRkbGV3YXJlT3B0aW9uczxTPlxuKTogVW5kb01hbmFnZXIge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgbGV0IG1hbmFnZXI6IFVuZG9NYW5hZ2VyXG5cbiAgaW50ZXJmYWNlIFBhdGNoUmVjb3JkZXJEYXRhIHtcbiAgICByZWNvcmRlcjogUGF0Y2hSZWNvcmRlclxuICAgIHJlY29yZGVyU3RhY2s6IG51bWJlclxuICAgIHVuZG9Sb290Q29udGV4dDogU2ltcGxlQWN0aW9uQ29udGV4dFxuICAgIGdyb3VwOiBVbmRvRXZlbnRHcm91cCB8IHVuZGVmaW5lZFxuICAgIGF0dGFjaGVkU3RhdGVCZWZvcmVFdmVudDogUyB8IHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGF0Y2hSZWNvcmRlclN5bWJvbCA9IFN5bWJvbChcInBhdGNoUmVjb3JkZXJcIilcblxuICBmdW5jdGlvbiBpbml0UGF0Y2hSZWNvcmRlcihjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpIHtcbiAgICBjb25zdCBncm91cCA9IG1hbmFnZXIuc3RvcmUuX2N1cnJlbnRHcm91cFxuXG4gICAgY29uc3QgcGF0Y2hSZWNvcmRlckRhdGE6IFBhdGNoUmVjb3JkZXJEYXRhID0ge1xuICAgICAgcmVjb3JkZXI6IHBhdGNoUmVjb3JkZXIoc3VidHJlZVJvb3QsIHtcbiAgICAgICAgcmVjb3JkaW5nOiBmYWxzZSxcbiAgICAgICAgZmlsdGVyOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICFfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQgJiYgIW1hbmFnZXIuaXNVbmRvUmVjb3JkaW5nRGlzYWJsZWRcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgcmVjb3JkZXJTdGFjazogMCxcbiAgICAgIHVuZG9Sb290Q29udGV4dDogY3R4LFxuICAgICAgZ3JvdXAsXG5cbiAgICAgIGF0dGFjaGVkU3RhdGVCZWZvcmVFdmVudDogb3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8uc2F2ZSgpLFxuICAgIH1cblxuICAgIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdID0gcGF0Y2hSZWNvcmRlckRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IFBhdGNoUmVjb3JkZXJEYXRhIHtcbiAgICByZXR1cm4gY3R4LnJvb3RDb250ZXh0LmRhdGFbcGF0Y2hSZWNvcmRlclN5bWJvbF1cbiAgfVxuXG4gIGNvbnN0IG1pZGRsZXdhcmVEaXNwb3NlciA9IGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShzdWJ0cmVlUm9vdCwge1xuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICBpZiAoIWdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eCkpIHtcbiAgICAgICAgaW5pdFBhdGNoUmVjb3JkZXIoY3R4KVxuICAgICAgfVxuICAgIH0sXG4gICAgb25SZXN1bWUoY3R4KSB7XG4gICAgICBjb25zdCBwYXRjaFJlY29yZGVyRGF0YSA9IGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eClcbiAgICAgIHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyU3RhY2srK1xuICAgICAgcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXIucmVjb3JkaW5nID0gcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJTdGFjayA+IDBcbiAgICB9LFxuICAgIG9uU3VzcGVuZChjdHgpIHtcbiAgICAgIGNvbnN0IHBhdGNoUmVjb3JkZXJEYXRhID0gZ2V0UGF0Y2hSZWNvcmRlckRhdGEoY3R4KVxuICAgICAgcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJTdGFjay0tXG4gICAgICBwYXRjaFJlY29yZGVyRGF0YS5yZWNvcmRlci5yZWNvcmRpbmcgPSBwYXRjaFJlY29yZGVyRGF0YS5yZWNvcmRlclN0YWNrID4gMFxuICAgIH0sXG4gICAgb25GaW5pc2goY3R4KSB7XG4gICAgICBjb25zdCBwYXRjaFJlY29yZGVyRGF0YSA9IGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eClcbiAgICAgIGlmIChwYXRjaFJlY29yZGVyRGF0YSAmJiBwYXRjaFJlY29yZGVyRGF0YS51bmRvUm9vdENvbnRleHQgPT09IGN0eCkge1xuICAgICAgICBjb25zdCBwYXRjaFJlY29yZGVyID0gcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJcblxuICAgICAgICBpZiAocGF0Y2hSZWNvcmRlci5ldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgICAgICAgIGNvbnN0IGludmVyc2VQYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgcGF0Y2hSZWNvcmRlci5ldmVudHMpIHtcbiAgICAgICAgICAgIHBhdGNoZXMucHVzaCguLi5ldmVudC5wYXRjaGVzKVxuICAgICAgICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCguLi5ldmVudC5pbnZlcnNlUGF0Y2hlcylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFVuZG9FdmVudFR5cGUuU2luZ2xlLFxuICAgICAgICAgICAgdGFyZ2V0UGF0aDogZmFzdEdldFJvb3RQYXRoKGN0eC50YXJnZXQpLnBhdGgsXG4gICAgICAgICAgICBhY3Rpb25OYW1lOiBjdHguYWN0aW9uTmFtZSxcbiAgICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgICBpbnZlcnNlUGF0Y2hlcyxcbiAgICAgICAgICB9IGFzIGNvbnN0XG5cbiAgICAgICAgICBjb25zdCBwYXJlbnRHcm91cCA9IHBhdGNoUmVjb3JkZXJEYXRhLmdyb3VwXG5cbiAgICAgICAgICBpZiAocGFyZW50R3JvdXApIHtcbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmUuX2FkZFVuZG9Ub1BhcmVudEdyb3VwKHBhcmVudEdyb3VwLCBldmVudClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFuYWdlci5zdG9yZS5fYWRkVW5kbyh7XG4gICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgICBhdHRhY2hlZFN0YXRlOiB7XG4gICAgICAgICAgICAgICAgYmVmb3JlRXZlbnQ6IHBhdGNoUmVjb3JkZXJEYXRhLmF0dGFjaGVkU3RhdGVCZWZvcmVFdmVudCxcbiAgICAgICAgICAgICAgICBhZnRlckV2ZW50OiBvcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5zYXZlKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBhdGNoUmVjb3JkZXIuZGlzcG9zZSgpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcblxuICBtYW5hZ2VyID0gbmV3IFVuZG9NYW5hZ2VyKG1pZGRsZXdhcmVEaXNwb3Nlciwgc3VidHJlZVJvb3QsIHN0b3JlLCBvcHRpb25zKVxuICByZXR1cm4gbWFuYWdlclxufVxuXG5sZXQgX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gZmFsc2VcblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSB1bmRvIHJlY29yZGluZyBtZWNoYW5pc20gaXMgY3VycmVudGx5IGRpc2FibGVkLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQoKSB7XG4gIHJldHVybiBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWRcbn1cblxuLyoqXG4gKiBHbG9iYWxseSBza2lwcyB0aGUgdW5kbyByZWNvcmRpbmcgbWVjaGFuaXNtIGZvciB0aGUgY29kZSBibG9jayB0aGF0IGdldHMgcnVuIHN5bmNocm9ub3VzbHkgaW5zaWRlLlxuICogQ29uc2lkZXIgdXNpbmcgdGhlIGB3aXRob3V0VW5kb2AgbWV0aG9kIG9mIGEgcGFydGljdWxhciBgVW5kb01hbmFnZXJgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIENvZGUgYmxvY2sgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0gZm4gQ29kZSBibG9jayB0byBydW4uXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGNvZGUgYmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0VW5kbzxUPihmbjogKCkgPT4gVCk6IFQge1xuICBjb25zdCBzYXZlZFVuZG9EaXNhYmxlZCA9IF9pc0dsb2JhbFVuZG9SZWNvcmRpbmdEaXNhYmxlZFxuICBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSB0cnVlXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKClcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSBzYXZlZFVuZG9EaXNhYmxlZFxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBJQXRvbSwgSUNvbXB1dGVkVmFsdWUsIG9ic2VydmFibGUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QsIGlzVHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuXG4vKipcbiAqIEEgY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0PFQ+IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRleHQgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldERlZmF1bHQoKTogVFxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb250ZXh0IGRlZmF1bHQgdmFsdWUuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc2V0RGVmYXVsdCh2YWx1ZTogVCk6IHZvaWRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCBkZWZhdWx0IHZhbHVlIHJlc29sdmVyLlxuICAgKiBAcGFyYW0gdmFsdWVGblxuICAgKi9cbiAgc2V0RGVmYXVsdENvbXB1dGVkKHZhbHVlRm46ICgpID0+IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRleHQgdmFsdWUgZm9yIGEgZ2l2ZW4gbm9kZS5cbiAgICogQHBhcmFtIG5vZGVcbiAgICovXG4gIGdldChub2RlOiBvYmplY3QpOiBUXG5cbiAgLyoqXG4gICAqIEdldHMgbm9kZSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgaXQgY29tZXMgZnJvbSB0aGUgZGVmYXVsdC5cbiAgICogQHBhcmFtIG5vZGVcbiAgICovXG4gIGdldFByb3ZpZGVyTm9kZShub2RlOiBvYmplY3QpOiBvYmplY3QgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCB2YWx1ZSBmb3IgYSBnaXZlbiBub2RlLCBlZmZlY3RpdmVseSBtYWtpbmcgaXQgYSBwcm92aWRlci5cbiAgICogQHBhcmFtIG5vZGVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzZXQobm9kZTogb2JqZWN0LCB2YWx1ZTogVCk6IHZvaWRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCB2YWx1ZSByZXNvbHZlciBmb3IgYSBnaXZlbiBub2RlLCBlZmZlY3RpdmVseSBtYWtpbmcgaXQgYSBwcm92aWRlci5cbiAgICogQHBhcmFtIG5vZGVcbiAgICogQHBhcmFtIHZhbHVlRm5cbiAgICovXG4gIHNldENvbXB1dGVkKG5vZGU6IG9iamVjdCwgdmFsdWVGbjogKCkgPT4gVCk6IHZvaWRcblxuICAvKipcbiAgICogVW5zZXRzIHRoZSBjb250ZXh0IHZhbHVlIGZvciBhIGdpdmVuIG5vZGUsIHRoZXJlZm9yZSBpdCB3b24ndCBiZSBhIHByb3ZpZGVyIGFueW1vcmUuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICB1bnNldChub2RlOiBvYmplY3QpOiB2b2lkXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSB2YWx1ZSBvdmVycmlkZSB3aGlsZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgcnVubmluZyBhbmQsIGlmIGEgbm9kZSBpcyByZXR1cm5lZCxcbiAgICogc2V0cyB0aGUgbm9kZSBhcyBhIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGVwYXJhbSBSXG4gICAqIEBwYXJhbSBmbiBGdW5jdGlvbiB0byBydW4uXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhcHBseS5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgYXBwbHk8Uj4oZm46ICgpID0+IFIsIHZhbHVlOiBUKTogUlxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgY29tcHV0ZWQgdmFsdWUgb3ZlcnJpZGUgd2hpbGUgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIHJ1bm5pbmcgYW5kLCBpZiBhIG5vZGUgaXMgcmV0dXJuZWQsXG4gICAqIHNldHMgdGhlIG5vZGUgYXMgYSBwcm92aWRlciBvZiB0aGUgY29tcHV0ZWQgdmFsdWUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gUlxuICAgKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gcnVuLlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIGFwcGx5Q29tcHV0ZWQ8Uj4oZm46ICgpID0+IFIsIHZhbHVlRm46ICgpID0+IFQpOiBSXG59XG5cbnR5cGUgQ29udGV4dFZhbHVlPFQ+ID1cbiAgfCB7XG4gICAgICB0eXBlOiBcInZhbHVlXCJcbiAgICAgIHZhbHVlOiBUXG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6IFwiY29tcHV0ZWRcIlxuICAgICAgdmFsdWU6IElDb21wdXRlZFZhbHVlPFQ+XG4gICAgfVxuXG5mdW5jdGlvbiByZXNvbHZlQ29udGV4dFZhbHVlPFQ+KGNvbnRleHRWYWx1ZTogQ29udGV4dFZhbHVlPFQ+KTogVCB7XG4gIGlmIChjb250ZXh0VmFsdWUudHlwZSA9PT0gXCJ2YWx1ZVwiKSB7XG4gICAgcmV0dXJuIGNvbnRleHRWYWx1ZS52YWx1ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250ZXh0VmFsdWUudmFsdWUuZ2V0KClcbiAgfVxufVxuXG5jbGFzcyBDb250ZXh0Q2xhc3M8VD4gaW1wbGVtZW50cyBDb250ZXh0PFQ+IHtcbiAgcHJpdmF0ZSBkZWZhdWx0Q29udGV4dFZhbHVlID0gb2JzZXJ2YWJsZS5ib3g8Q29udGV4dFZhbHVlPFQ+Pih1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSlcblxuICBwcml2YXRlIG92ZXJyaWRlQ29udGV4dFZhbHVlID0gb2JzZXJ2YWJsZS5ib3g8Q29udGV4dFZhbHVlPFQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHtcbiAgICBkZWVwOiBmYWxzZSxcbiAgfSlcblxuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVDb250ZXh0VmFsdWUgPSBuZXcgV2Vha01hcDxvYmplY3QsIENvbnRleHRWYWx1ZTxUPj4oKVxuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVBdG9tID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQXRvbT4oKVxuXG4gIHByaXZhdGUgZ2V0Tm9kZUF0b20obm9kZTogb2JqZWN0KSB7XG4gICAgcmV0dXJuIGdldE9yQ3JlYXRlKHRoaXMubm9kZUF0b20sIG5vZGUsICgpID0+IGNyZWF0ZUF0b20oXCJjb250ZXh0VmFsdWVcIikpXG4gIH1cblxuICBwcml2YXRlIGZhc3RHZXQobm9kZTogb2JqZWN0KTogVCB7XG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBvYnNGb3JOb2RlID0gdGhpcy5ub2RlQ29udGV4dFZhbHVlLmdldChub2RlKVxuICAgIGlmIChvYnNGb3JOb2RlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUNvbnRleHRWYWx1ZShvYnNGb3JOb2RlKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGZhc3RHZXRQYXJlbnQobm9kZSlcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVWYWx1ZSA9IHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuZ2V0KClcbiAgICAgIGlmIChvdmVycmlkZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29udGV4dFZhbHVlKG92ZXJyaWRlVmFsdWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0R2V0KHBhcmVudClcbiAgfVxuXG4gIGdldChub2RlOiBvYmplY3QpIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gICAgcmV0dXJuIHRoaXMuZmFzdEdldChub2RlKVxuICB9XG5cbiAgcHJpdmF0ZSBmYXN0R2V0UHJvdmlkZXJOb2RlKG5vZGU6IG9iamVjdCk6IG9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBvYnNGb3JOb2RlID0gdGhpcy5ub2RlQ29udGV4dFZhbHVlLmdldChub2RlKVxuICAgIGlmIChvYnNGb3JOb2RlKSB7XG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGZhc3RHZXRQYXJlbnQobm9kZSlcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZhc3RHZXRQcm92aWRlck5vZGUocGFyZW50KVxuICB9XG5cbiAgZ2V0UHJvdmlkZXJOb2RlKG5vZGU6IG9iamVjdCk6IG9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHJldHVybiB0aGlzLmZhc3RHZXRQcm92aWRlck5vZGUobm9kZSlcbiAgfVxuXG4gIGdldERlZmF1bHQoKTogVCB7XG4gICAgcmV0dXJuIHJlc29sdmVDb250ZXh0VmFsdWUodGhpcy5kZWZhdWx0Q29udGV4dFZhbHVlLmdldCgpISlcbiAgfVxuXG4gIHNldERlZmF1bHQgPSBhY3Rpb24oKHZhbHVlOiBUKSA9PiB7XG4gICAgdGhpcy5kZWZhdWx0Q29udGV4dFZhbHVlLnNldCh7XG4gICAgICB0eXBlOiBcInZhbHVlXCIsXG4gICAgICB2YWx1ZSxcbiAgICB9KVxuICB9KVxuXG4gIHNldERlZmF1bHRDb21wdXRlZCA9IGFjdGlvbigodmFsdWVGbjogKCkgPT4gVCkgPT4ge1xuICAgIHRoaXMuZGVmYXVsdENvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJjb21wdXRlZFwiLFxuICAgICAgdmFsdWU6IGNvbXB1dGVkKHZhbHVlRm4pLFxuICAgIH0pXG4gIH0pXG5cbiAgc2V0ID0gYWN0aW9uKChub2RlOiBvYmplY3QsIHZhbHVlOiBUKSA9PiB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHRoaXMubm9kZUNvbnRleHRWYWx1ZS5zZXQobm9kZSwge1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiLFxuICAgICAgdmFsdWUsXG4gICAgfSlcbiAgICB0aGlzLmdldE5vZGVBdG9tKG5vZGUpLnJlcG9ydENoYW5nZWQoKVxuICB9KVxuXG4gIHByaXZhdGUgX3NldENvbXB1dGVkKG5vZGU6IG9iamVjdCwgY29tcHV0ZWRWYWx1ZUZuOiBJQ29tcHV0ZWRWYWx1ZTxUPikge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICB0aGlzLm5vZGVDb250ZXh0VmFsdWUuc2V0KG5vZGUsIHsgdHlwZTogXCJjb21wdXRlZFwiLCB2YWx1ZTogY29tcHV0ZWRWYWx1ZUZuIH0pXG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuXG4gIHNldENvbXB1dGVkID0gYWN0aW9uKChub2RlOiBvYmplY3QsIHZhbHVlRm46ICgpID0+IFQpID0+IHtcbiAgICB0aGlzLl9zZXRDb21wdXRlZChub2RlLCBjb21wdXRlZCh2YWx1ZUZuKSlcbiAgfSlcblxuICB1bnNldCA9IGFjdGlvbigobm9kZTogb2JqZWN0KSA9PiB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHRoaXMubm9kZUNvbnRleHRWYWx1ZS5kZWxldGUobm9kZSlcbiAgICB0aGlzLmdldE5vZGVBdG9tKG5vZGUpLnJlcG9ydENoYW5nZWQoKVxuICB9KVxuXG4gIGFwcGx5ID0gYWN0aW9uKDxSPihmbjogKCkgPT4gUiwgdmFsdWU6IFQpOiBSID0+IHtcbiAgICBjb25zdCBvbGQgPSB0aGlzLm92ZXJyaWRlQ29udGV4dFZhbHVlLmdldCgpXG4gICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiLFxuICAgICAgdmFsdWUsXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBmbigpXG4gICAgICBpZiAoaXNUd2Vha2VkT2JqZWN0KHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy5zZXQocmV0LCB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQob2xkKVxuICAgIH1cbiAgfSlcblxuICBhcHBseUNvbXB1dGVkID0gYWN0aW9uKDxSPihmbjogKCkgPT4gUiwgdmFsdWVGbjogKCkgPT4gVCk6IFIgPT4ge1xuICAgIGNvbnN0IGNvbXB1dGVkVmFsdWVGbiA9IGNvbXB1dGVkKHZhbHVlRm4pXG5cbiAgICBjb25zdCBvbGQgPSB0aGlzLm92ZXJyaWRlQ29udGV4dFZhbHVlLmdldCgpXG4gICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJjb21wdXRlZFwiLFxuICAgICAgdmFsdWU6IGNvbXB1dGVkVmFsdWVGbixcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKClcbiAgICAgIGlmIChpc1R3ZWFrZWRPYmplY3QocmV0LCB0cnVlKSkge1xuICAgICAgICB0aGlzLl9zZXRDb21wdXRlZChyZXQsIGNvbXB1dGVkVmFsdWVGbilcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQob2xkKVxuICAgIH1cbiAgfSlcblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU/OiBUKSB7XG4gICAgdGhpcy5zZXREZWZhdWx0KGRlZmF1bHRWYWx1ZSBhcyBUKVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IHdpdGggbm8gZGVmYXVsdCB2YWx1ZSwgdGh1cyBtYWtpbmcgaXRzIGRlZmF1bHQgdmFsdWUgdW5kZWZpbmVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBDb250ZXh0IHZhbHVlIHR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUPigpOiBDb250ZXh0PFQgfCB1bmRlZmluZWQ+XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IHdpdGggYSBkZWZhdWx0IHZhbHVlLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBDb250ZXh0IHZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUPihkZWZhdWx0VmFsdWU6IFQpOiBDb250ZXh0PFQ+XG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQ+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0Q2xhc3MoZGVmYXVsdFZhbHVlKVxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgcmVhZG9ubHlNaWRkbGV3YXJlIH0gZnJvbSBcIi4uL2FjdGlvbk1pZGRsZXdhcmVzL3JlYWRvbmx5TWlkZGxld2FyZVwiXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHQvY29udGV4dFwiXG5pbXBvcnQgeyBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgaXNUcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgdHJ5VW50d2VhaywgdHdlYWsgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyBhZGRMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbiwgZmFpbHVyZSwgcnVuQmVmb3JlT25Jbml0U3ltYm9sIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcblxuY29uc3QgY29tcHV0ZWRUcmVlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoZmFsc2UpXG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIG5vZGUgaXMgYSBjb21wdXRlZCB0cmVlIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBhIGNvbXB1dGVkIHRyZWUgbm9kZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXB1dGVkVHJlZU5vZGUobm9kZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wdXRlZFRyZWVDb250ZXh0LmdldChub2RlKVxufVxuXG5jb25zdCB0d2Vha2VkQ29tcHV0ZWRUcmVlTm9kZXMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcblxuZnVuY3Rpb24gdHdlYWtDb21wdXRlZFRyZWVOb2RlPFQ+KG5ld1ZhbHVlOiBULCBwYXJlbnQ6IHVua25vd24sIHBhdGg6IHN0cmluZyk6IFQge1xuICBjb25zdCB0d2Vha2VkVmFsdWUgPSB0d2VhayhuZXdWYWx1ZSwgeyBwYXJlbnQsIHBhdGggfSlcbiAgaWYgKGlzVHJlZU5vZGUodHdlYWtlZFZhbHVlKSAmJiAhdHdlYWtlZENvbXB1dGVkVHJlZU5vZGVzLmhhcyh0d2Vha2VkVmFsdWUpKSB7XG4gICAgdHdlYWtlZENvbXB1dGVkVHJlZU5vZGVzLmFkZCh0d2Vha2VkVmFsdWUpXG4gICAgcmVhZG9ubHlNaWRkbGV3YXJlKHR3ZWFrZWRWYWx1ZSlcbiAgICBjb21wdXRlZFRyZWVDb250ZXh0LnNldCh0d2Vha2VkVmFsdWUsIHRydWUpXG4gIH1cbiAgcmV0dXJuIHR3ZWFrZWRWYWx1ZVxufVxuXG5jb25zdCBjb21wdXRlZFRyZWVOb2RlSW5mbyA9IG5ldyBXZWFrTWFwPFxuICBvYmplY3QsXG4gIE1hcDxzdHJpbmcsIHsgY29tcHV0ZWQ6IElDb21wdXRlZFZhbHVlPHVua25vd24+OyB2YWx1ZTogdW5rbm93bjsgdHdlYWtlZFZhbHVlOiB1bmtub3duIH0+XG4+KClcblxuZnVuY3Rpb24gZ2V0T3JDcmVhdGVDb21wdXRlZFRyZWVOb2RlSW5mbyhpbnN0YW5jZTogb2JqZWN0KSB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShjb21wdXRlZFRyZWVOb2RlSW5mbywgaW5zdGFuY2UsICgpID0+IG5ldyBNYXAoKSlcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIHR1cm5pbmcgYSBjb21wdXRlZCBwcm9wZXJ0eSBpbnRvIGEgY29tcHV0ZWQgdHJlZSB3aGljaCBzdXBwb3J0cyB0cmVlIHRyYXZlcnNhbFxuICogZnVuY3Rpb25zLCBjb250ZXh0cywgcmVmZXJlbmNlcywgZXRjLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgUHJvdG90eXBlIG9mIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSBOYW1lIG9mIHRoZSBtZW1iZXIuXG4gKiBAcGFyYW0gZGVzY3JpcHRvciBQcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgbWVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWRUcmVlKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4pOiB2b2lkIHtcbiAgaWYgKCFkZXNjcmlwdG9yLmdldCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJAY29tcHV0ZWRUcmVlIHJlcXVpcmVzIGEgJ2dldCcgYWNjZXNzb3JcIilcbiAgfVxuXG4gIGNvbnN0IHRhcmdldENsYXNzID0gdGFyZ2V0LmNvbnN0cnVjdG9yXG4gIGlmICghaXNNb2RlbENsYXNzKHRhcmdldENsYXNzKSAmJiAhaXNEYXRhTW9kZWxDbGFzcyh0YXJnZXRDbGFzcykpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiQGNvbXB1dGVkVHJlZSBjYW4gb25seSBkZWNvcmF0ZSAnZ2V0JyBhY2Nlc3NvcnMgb2YgY2xhc3Mgb3IgZGF0YSBtb2RlbHNcIilcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsID0gZGVzY3JpcHRvci5nZXRcblxuICBkZXNjcmlwdG9yLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbnRyeSA9IGdldE9yQ3JlYXRlQ29tcHV0ZWRUcmVlTm9kZUluZm8odGhpcykuZ2V0KHByb3BlcnR5S2V5KSFcblxuICAgIGNvbnN0IG9sZFZhbHVlID0gZW50cnkudmFsdWVcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGVudHJ5LmNvbXB1dGVkLmdldCgpXG5cbiAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZW50cnkudHdlYWtlZFZhbHVlXG4gICAgfVxuXG4gICAgdHdlYWsob2xkVmFsdWUsIHVuZGVmaW5lZClcbiAgICB0cnlVbnR3ZWFrKG9sZFZhbHVlKVxuXG4gICAgY29uc3QgdHdlYWtlZFZhbHVlID0gdHdlYWtDb21wdXRlZFRyZWVOb2RlKG5ld1ZhbHVlLCB0aGlzLCBwcm9wZXJ0eUtleSlcbiAgICBlbnRyeS52YWx1ZSA9IG5ld1ZhbHVlXG4gICAgZW50cnkudHdlYWtlZFZhbHVlID0gdHdlYWtlZFZhbHVlXG4gICAgcmV0dXJuIHR3ZWFrZWRWYWx1ZVxuICB9XG5cbiAgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24odGFyZ2V0LCBydW5CZWZvcmVPbkluaXRTeW1ib2wsIChpbnN0YW5jZSkgPT4ge1xuICAgIGNvbnN0IGMgPSBjb21wdXRlZCgoKSA9PiBvcmlnaW5hbC5jYWxsKGluc3RhbmNlKSwgeyBrZWVwQWxpdmU6IHRydWUgfSlcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGMuZ2V0KClcbiAgICBjb25zdCB0d2Vha2VkVmFsdWUgPSB0d2Vha0NvbXB1dGVkVHJlZU5vZGUobmV3VmFsdWUsIGluc3RhbmNlLCBwcm9wZXJ0eUtleSlcblxuICAgIGdldE9yQ3JlYXRlQ29tcHV0ZWRUcmVlTm9kZUluZm8oaW5zdGFuY2UpLnNldChwcm9wZXJ0eUtleSwge1xuICAgICAgY29tcHV0ZWQ6IGMsXG4gICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICB0d2Vha2VkVmFsdWUsXG4gICAgfSlcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQWJzdHJhY3RNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzLFxuICBNb2RlbENyZWF0aW9uRGF0YSxcbiAgTW9kZWxUcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUHJvcHMsXG4gIE1vZGVsUHJvcHNUb0NyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvU2V0dGVyLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBzaGFyZWRJbnRlcm5hbE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3NoYXJlZEludGVybmFsTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwsIEJhc2VEYXRhTW9kZWwsIEJhc2VEYXRhTW9kZWxLZXlzIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRJc0RhdGFNb2RlbENsYXNzLCBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG5leHBvcnQgdHlwZSBfQ29tcG9zZWREYXRhPFN1cGVyTW9kZWwsIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID0gU3VwZXJNb2RlbCBleHRlbmRzIEFueURhdGFNb2RlbFxuICA/XG4gICAgICB8IChNb2RlbFByb3BzVG9DcmVhdGlvbkRhdGE8VFByb3BzPiAmIE1vZGVsQ3JlYXRpb25EYXRhPFN1cGVyTW9kZWw+KVxuICAgICAgfCAoTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPiAmIE1vZGVsVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8U3VwZXJNb2RlbD4pXG4gIDogTW9kZWxQcm9wc1RvQ3JlYXRpb25EYXRhPFRQcm9wcz4gfCBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+XG5cbmV4cG9ydCBpbnRlcmZhY2UgX0RhdGFNb2RlbDxTdXBlck1vZGVsLCBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiB7XG4gIG5ldyAoZGF0YTogX0NvbXBvc2VkRGF0YTxTdXBlck1vZGVsLCBUUHJvcHM+KTogU3VwZXJNb2RlbCAmXG4gICAgQmFzZURhdGFNb2RlbDxUUHJvcHM+ICZcbiAgICBPbWl0PE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YTxUUHJvcHM+LCBCYXNlRGF0YU1vZGVsS2V5cz4gJlxuICAgIE1vZGVsUHJvcHNUb1NldHRlcjxUUHJvcHM+XG59XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0YSBtb2RlbHMgdGhhdCBleHRlbmRzIGFub3RoZXIgbW9kZWwuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTmV3IG1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEB0eXBlcGFyYW0gVE1vZGVsIE1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gZ2VuRm4gRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBiYXNlIG1vZGVsIGFuZCBtb2RlbCBwcm9wZXJ0aWVzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEV4dGVuZGVkRGF0YU1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBUTW9kZWwgZXh0ZW5kcyBBbnlEYXRhTW9kZWwsXG4gIEEgZXh0ZW5kcyBbXVxuPihcbiAgZ2VuRm46ICguLi5hcmdzOiBBKSA9PiB7XG4gICAgYmFzZU1vZGVsOiBBYnN0cmFjdE1vZGVsQ2xhc3M8VE1vZGVsPlxuICAgIHByb3BzOiBUUHJvcHNcbiAgfVxuKTogX0RhdGFNb2RlbDxUTW9kZWwsIFRQcm9wcz5cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBkYXRhIG1vZGVscyB0aGF0IGV4dGVuZHMgYW5vdGhlciBtb2RlbC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBOZXcgbW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHR5cGVwYXJhbSBUTW9kZWwgTW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBiYXNlTW9kZWwgQmFzZSBtb2RlbCB0eXBlLlxuICogQHBhcmFtIG1vZGVsUHJvcHMgTW9kZWwgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFeHRlbmRlZERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLCBUTW9kZWwgZXh0ZW5kcyBBbnlEYXRhTW9kZWw+KFxuICBiYXNlTW9kZWw6IEFic3RyYWN0TW9kZWxDbGFzczxUTW9kZWw+LFxuICBtb2RlbFByb3BzOiBUUHJvcHNcbik6IF9EYXRhTW9kZWw8VE1vZGVsLCBUUHJvcHM+XG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBFeHRlbmRlZERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLCBUTW9kZWwgZXh0ZW5kcyBBbnlEYXRhTW9kZWw+KFxuICAuLi5hcmdzOiBhbnlbXVxuKTogX0RhdGFNb2RlbDxUTW9kZWwsIFRQcm9wcz4ge1xuICBsZXQgYmFzZU1vZGVsXG4gIGxldCBtb2RlbFByb3BzXG4gIGlmIChpc0RhdGFNb2RlbENsYXNzKGFyZ3NbMF0pKSB7XG4gICAgYmFzZU1vZGVsID0gYXJnc1swXVxuICAgIG1vZGVsUHJvcHMgPSBhcmdzWzFdXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZ2VuID0gYXJnc1swXSgpXG5cbiAgICBiYXNlTW9kZWwgPSBnZW4uYmFzZU1vZGVsXG4gICAgbW9kZWxQcm9wcyA9IGdlbi5wcm9wc1xuICB9XG5cbiAgYXNzZXJ0SXNEYXRhTW9kZWxDbGFzcyhiYXNlTW9kZWwsIFwiYmFzZU1vZGVsXCIpXG5cbiAgcmV0dXJuIGludGVybmFsRGF0YU1vZGVsKG1vZGVsUHJvcHMsIGJhc2VNb2RlbCBhcyBhbnkpXG59XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0YSBtb2RlbHMuXG4gKlxuICogTmV2ZXIgb3ZlcnJpZGUgdGhlIGNvbnN0cnVjdG9yLCB1c2UgYG9uTGF6eUluaXRgIG9yIGBvbkxhenlBdHRhY2hlZFRvUm9vdFN0b3JlYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEBwYXJhbSBmbk1vZGVsUHJvcHMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgbW9kZWwgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLCBBIGV4dGVuZHMgW10+KFxuICBmbk1vZGVsUHJvcHM6ICguLi5hcmdzOiBBKSA9PiBUUHJvcHNcbik6IF9EYXRhTW9kZWw8dW5rbm93biwgVFByb3BzPlxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGEgbW9kZWxzLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkxhenlJbml0YCBvciBgb25MYXp5QXR0YWNoZWRUb1Jvb3RTdG9yZWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+KFxuICBtb2RlbFByb3BzOiBUUHJvcHNcbik6IF9EYXRhTW9kZWw8dW5rbm93biwgVFByb3BzPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+KFxuICBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHM6ICgoKSA9PiBUUHJvcHMpIHwgVFByb3BzXG4pOiBfRGF0YU1vZGVsPHVua25vd24sIFRQcm9wcz4ge1xuICBjb25zdCBtb2RlbFByb3BzID1cbiAgICB0eXBlb2YgZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzKClcbiAgICAgIDogZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzXG4gIHJldHVybiBpbnRlcm5hbERhdGFNb2RlbChtb2RlbFByb3BzLCB1bmRlZmluZWQpXG59XG5cbmZ1bmN0aW9uIGludGVybmFsRGF0YU1vZGVsPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsIFRCYXNlTW9kZWwgZXh0ZW5kcyBBbnlEYXRhTW9kZWw+KFxuICBtb2RlbFByb3BzOiBUUHJvcHMsXG4gIGJhc2VNb2RlbDogTW9kZWxDbGFzczxUQmFzZU1vZGVsPiB8IHVuZGVmaW5lZFxuKTogX0RhdGFNb2RlbDxUQmFzZU1vZGVsLCBUUHJvcHM+IHtcbiAgcmV0dXJuIHNoYXJlZEludGVybmFsTW9kZWwoe1xuICAgIG1vZGVsUHJvcHMsXG4gICAgYmFzZU1vZGVsLFxuICAgIHR5cGU6IFwiZGF0YVwiLFxuICAgIHZhbHVlVHlwZTogZmFsc2UsXG4gICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiB1bmRlZmluZWQsXG4gICAgdG9TbmFwc2hvdFByb2Nlc3NvcjogdW5kZWZpbmVkLFxuICB9KVxufVxuIiwiaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uXCJcbmltcG9ydCB7XG4gIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZSxcbiAgQWN0aW9uVHJhY2tpbmdSZXN1bHQsXG4gIFNpbXBsZUFjdGlvbkNvbnRleHQsXG59IGZyb20gXCIuLi9hY3Rpb25NaWRkbGV3YXJlc1wiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdFBhdGgsIFJvb3RQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGFwcGx5U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvYXBwbHlTbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5cbi8qKlxuICogQ29ubmVjdHMgYSB0cmVlIG5vZGUgdG8gYSByZWR1eCBkZXYgdG9vbHMgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHJlbW90ZWRldlBhY2thZ2UgVGhlIHJlbW90ZWRldiBwYWNrYWdlICh1c3VhbGx5IHRoZSByZXN1bHQgb2YgYHJlcXVpcmUoXCJyZW1vdGVEZXZcIilgKSAoaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvcmVtb3RlZGV2KS5cbiAqIEBwYXJhbSByZW1vdGVkZXZDb25uZWN0aW9uIFRoZSByZXN1bHQgb2YgYSBjb25uZWN0IG1ldGhvZCBmcm9tIHRoZSByZW1vdGVkZXYgcGFja2FnZSAodXN1YWxseSB0aGUgcmVzdWx0IG9mIGByZW1vdGVEZXYuY29ubmVjdFZpYUV4dGVuc2lvbiguLi4pYCkuXG4gKiBAcGFyYW0gdGFyZ2V0IE9iamVjdCB0byB1c2UgYXMgcm9vdC5cbiAqIEBwYXJhbSBzdG9yZU5hbWUgTmFtZSB0byBiZSBzaG93biBpbiB0aGUgcmVkdXggZGV2IHRvb2xzLlxuICogQHBhcmFtIFtvcHRpb25zXSBPcHRpb25hbCBvcHRpb25zIG9iamVjdC4gYGxvZ0FyZ3NOZWFyTmFtZWAgaWYgaXQgc2hvdWxkIHNob3cgdGhlIGFyZ3VtZW50cyBuZWFyIHRoZSBhY3Rpb24gbmFtZSAoZGVmYXVsdCBpcyBgdHJ1ZWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdFJlZHV4RGV2VG9vbHMoXG4gIHJlbW90ZWRldlBhY2thZ2U6IGFueSxcbiAgcmVtb3RlZGV2Q29ubmVjdGlvbjogYW55LFxuICB0YXJnZXQ6IG9iamVjdCxcbiAgb3B0aW9ucz86IHtcbiAgICBsb2dBcmdzTmVhck5hbWU/OiBib29sZWFuXG4gIH1cbikge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcblxuICBjb25zdCBvcHRzID0ge1xuICAgIGxvZ0FyZ3NOZWFyTmFtZTogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgbGV0IGhhbmRsaW5nTW9uaXRvckFjdGlvbiA9IDBcblxuICAvLyBzdWJzY3JpYmUgdG8gY2hhbmdlIHN0YXRlIChpZiBuZWVkIG1vcmUgdGhhbiBqdXN0IGxvZ2dpbmcpXG4gIHJlbW90ZWRldkNvbm5lY3Rpb24uc3Vic2NyaWJlKChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcIkRJU1BBVENIXCIpIHtcbiAgICAgIGhhbmRsZU1vbml0b3JBY3Rpb25zKHJlbW90ZWRldkNvbm5lY3Rpb24sIHRhcmdldCwgbWVzc2FnZSlcbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gZ2V0U25hcHNob3QodGFyZ2V0KVxuICByZW1vdGVkZXZDb25uZWN0aW9uLmluaXQoaW5pdGlhbFN0YXRlKVxuXG4gIGxldCBjdXJyZW50QWN0aW9uSWQgPSAwXG4gIGNvbnN0IGFjdGlvbklkU3ltYm9sID0gU3ltYm9sKFwiYWN0aW9uSWRcIilcblxuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUodGFyZ2V0LCB7XG4gICAgb25TdGFydChjdHgpIHtcbiAgICAgIGN0eC5kYXRhW2FjdGlvbklkU3ltYm9sXSA9IGN1cnJlbnRBY3Rpb25JZCsrXG4gICAgfSxcbiAgICBvblJlc3VtZShjdHgpIHtcbiAgICAgIC8vIGdpdmUgYSBjaGFuY2UgdG8gdGhlIHBhcmVudCB0byBsb2cgaXRzIG93biBjaGFuZ2VzIGJlZm9yZSB0aGUgY2hpbGQgc3RhcnRzXG4gICAgICBpZiAoY3R4LnBhcmVudENvbnRleHQpIHtcbiAgICAgICAgbG9nKGN0eC5wYXJlbnRDb250ZXh0LCB1bmRlZmluZWQpXG4gICAgICB9XG4gICAgICBsb2coY3R4LCB1bmRlZmluZWQpXG4gICAgfSxcbiAgICBvblN1c3BlbmQoY3R4KSB7XG4gICAgICBsb2coY3R4LCB1bmRlZmluZWQpXG4gICAgfSxcbiAgICBvbkZpbmlzaChjdHgsIHJldCkge1xuICAgICAgbG9nKGN0eCwgcmV0LnJlc3VsdClcbiAgICB9LFxuICB9KVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU1vbml0b3JBY3Rpb25zKHJlbW90ZWRldjI6IGFueSwgdGFyZ2V0MjogYW55LCBtZXNzYWdlOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxpbmdNb25pdG9yQWN0aW9uKytcblxuICAgICAgc3dpdGNoIChtZXNzYWdlLnBheWxvYWQudHlwZSkge1xuICAgICAgICBjYXNlIFwiUkVTRVRcIjpcbiAgICAgICAgICBhcHBseVNuYXBzaG90KHRhcmdldDIsIGluaXRpYWxTdGF0ZSlcbiAgICAgICAgICByZXR1cm4gcmVtb3RlZGV2Mi5pbml0KGluaXRpYWxTdGF0ZSlcbiAgICAgICAgY2FzZSBcIkNPTU1JVFwiOlxuICAgICAgICAgIHJldHVybiByZW1vdGVkZXYyLmluaXQoZ2V0U25hcHNob3QodGFyZ2V0MikpXG4gICAgICAgIGNhc2UgXCJST0xMQkFDS1wiOlxuICAgICAgICAgIHJldHVybiByZW1vdGVkZXYyLmluaXQocmVtb3RlZGV2UGFja2FnZS5leHRyYWN0U3RhdGUobWVzc2FnZSkpXG4gICAgICAgIGNhc2UgXCJKVU1QX1RPX1NUQVRFXCI6XG4gICAgICAgIGNhc2UgXCJKVU1QX1RPX0FDVElPTlwiOlxuICAgICAgICAgIGFwcGx5U25hcHNob3QodGFyZ2V0MiwgcmVtb3RlZGV2UGFja2FnZS5leHRyYWN0U3RhdGUobWVzc2FnZSkpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIGNhc2UgXCJJTVBPUlRfU1RBVEVcIjpcbiAgICAgICAgICBjb25zdCBuZXh0TGlmdGVkU3RhdGUgPSBtZXNzYWdlLnBheWxvYWQubmV4dExpZnRlZFN0YXRlXG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRTdGF0ZXMgPSBuZXh0TGlmdGVkU3RhdGUuY29tcHV0ZWRTdGF0ZXNcbiAgICAgICAgICBhcHBseVNuYXBzaG90KHRhcmdldDIsIGNvbXB1dGVkU3RhdGVzW2NvbXB1dGVkU3RhdGVzLmxlbmd0aCAtIDFdLnN0YXRlKVxuICAgICAgICAgIHJlbW90ZWRldjIuc2VuZChudWxsLCBuZXh0TGlmdGVkU3RhdGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGhhbmRsaW5nTW9uaXRvckFjdGlvbi0tXG4gICAgfVxuICB9XG5cbiAgbGV0IGxhc3RMb2dnZWRTbmFwc2hvdCA9IGluaXRpYWxTdGF0ZVxuXG4gIGZ1bmN0aW9uIGxvZyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQsIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaGFuZGxpbmdNb25pdG9yQWN0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzbiA9IGdldFNuYXBzaG90KHRhcmdldClcblxuICAgIC8vIGlnbm9yZSBhY3Rpb25zIHRoYXQgZG9uJ3QgY2hhbmdlIGFueXRoaW5nICh1bmxlc3MgaXQgaXMgYSB0aHJvdylcbiAgICBpZiAoc24gPT09IGxhc3RMb2dnZWRTbmFwc2hvdCAmJiByZXN1bHQgIT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGFzdExvZ2dlZFNuYXBzaG90ID0gc25cblxuICAgIGNvbnN0IHJvb3RQYXRoID0gZmFzdEdldFJvb3RQYXRoKGN0eC50YXJnZXQpXG4gICAgY29uc3QgbmFtZSA9IGdldEFjdGlvbkNvbnRleHROYW1lQW5kVHlwZVBhdGgoY3R4LCByb290UGF0aCwgcmVzdWx0KVxuXG4gICAgY29uc3QgY29weSA9IHtcbiAgICAgIHR5cGU6IG5hbWUsXG4gICAgICBwYXRoOiByb290UGF0aC5wYXRoLFxuICAgICAgYXJnczogY3R4LmFyZ3MsXG4gICAgfVxuXG4gICAgcmVtb3RlZGV2Q29ubmVjdGlvbi5zZW5kKGNvcHksIHNuKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QWN0aW9uQ29udGV4dE5hbWVBbmRUeXBlUGF0aChcbiAgICBjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQsXG4gICAgcm9vdFBhdGg6IFJvb3RQYXRoPGFueT4sXG4gICAgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdCB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBjb25zdCBwYXRoU3RyID0gXCJbL1wiICsgcm9vdFBhdGgucGF0aC5qb2luKFwiL1wiKSArIFwiXSBcIlxuICAgIGxldCBuYW1lID0gcGF0aFN0ciArIGN0eC5hY3Rpb25OYW1lXG5cbiAgICBpZiAob3B0cy5sb2dBcmdzTmVhck5hbWUpIHtcbiAgICAgIGxldCBhcmdzID0gY3R4LmFyZ3NcbiAgICAgICAgLm1hcCgoYSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYSlcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBcIioqdW5zZXJpYWxpemFibGUqKlwiXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDY0KSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzLnNsaWNlKDAsIDY0KSArIFwiLi4uXCJcbiAgICAgIH1cblxuICAgICAgbmFtZSArPSBgKCR7YXJnc30pYFxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbklkID0gY3R4LmRhdGFbYWN0aW9uSWRTeW1ib2xdXG5cbiAgICBuYW1lICs9IGAgKGlkICR7YWN0aW9uSWQgIT09IHVuZGVmaW5lZCA/IGFjdGlvbklkIDogXCI/XCJ9YFxuICAgIGlmIChjdHgudHlwZSA9PT0gQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMpIHtcbiAgICAgIG5hbWUgKz0gXCIsIGFzeW5jXCJcbiAgICB9XG4gICAgbmFtZSArPSBcIilcIlxuXG4gICAgaWYgKHJlc3VsdCA9PT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuVGhyb3cpIHtcbiAgICAgIG5hbWUgKz0gXCIgLWVycm9yIHRocm93bi1cIlxuICAgIH1cblxuICAgIGlmIChjdHgucGFyZW50Q29udGV4dCkge1xuICAgICAgY29uc3QgcGFyZW50TmFtZSA9IGdldEFjdGlvbkNvbnRleHROYW1lQW5kVHlwZVBhdGgoXG4gICAgICAgIGN0eC5wYXJlbnRDb250ZXh0LFxuICAgICAgICBmYXN0R2V0Um9vdFBhdGgoY3R4LnBhcmVudENvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApXG4gICAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgICBuYW1lID0gYCR7cGFyZW50TmFtZX0gPj4+ICR7bmFtZX1gXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aW9uQ2FsbCwgYXBwbHlBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uXCJcclxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvZ2V0U25hcHNob3RcIlxyXG5pbXBvcnQgeyBvblNuYXBzaG90LCBPblNuYXBzaG90RGlzcG9zZXIsIE9uU25hcHNob3RMaXN0ZW5lciB9IGZyb20gXCIuLi9zbmFwc2hvdC9vblNuYXBzaG90XCJcclxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4uL3NuYXBzaG90L1NuYXBzaG90T2ZcIlxyXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXHJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNvbnN0IHJlZHV4QWN0aW9uVHlwZSA9IFwiYXBwbHlBY3Rpb25cIlxyXG5cclxuLyoqXHJcbiAqIEEgcmVkdXggYWN0aW9uIGZvciBtb2J4LWtleXN0b25lLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZWR1eEFjdGlvbiB7XHJcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIHJlZHV4QWN0aW9uVHlwZVxyXG4gIHJlYWRvbmx5IHBheWxvYWQ6IEFjdGlvbkNhbGxcclxufVxyXG5cclxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgYW4gYWN0aW9uIGNhbGwgaW50byBhIHJlZHV4IGFjdGlvbi5cclxuICpcclxuICogQHBhcmFtIGFjdGlvbkNhbGwgQWN0aW9uIGNhbGwuXHJcbiAqIEByZXR1cm5zIEEgcmVkdXggYWN0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFjdGlvbkNhbGxUb1JlZHV4QWN0aW9uKGFjdGlvbkNhbGw6IEFjdGlvbkNhbGwpOiBSZWR1eEFjdGlvbiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6IHJlZHV4QWN0aW9uVHlwZSxcclxuICAgIHBheWxvYWQ6IGFjdGlvbkNhbGwsXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSByZWR1eCBzdG9yZSBmb3IgbW9ieC1rZXlzdG9uZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVkdXhTdG9yZTxUPiB7XHJcbiAgZ2V0U3RhdGUoKTogU25hcHNob3RPdXRPZjxUPlxyXG4gIGRpc3BhdGNoKGFjdGlvbjogUmVkdXhBY3Rpb24pOiBSZWR1eEFjdGlvblxyXG4gIHN1YnNjcmliZShsaXN0ZW5lcjogT25TbmFwc2hvdExpc3RlbmVyPFQ+KTogT25TbmFwc2hvdERpc3Bvc2VyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHJlZHV4IHJ1bm5lciBmb3IgbW9ieC1rZXlzdG9uZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVkdXhSdW5uZXI8VD4ge1xyXG4gIChuZXh0OiBSZWR1eFN0b3JlPFQ+W1wiZGlzcGF0Y2hcIl0pOiAoYWN0aW9uOiBSZWR1eEFjdGlvbikgPT4gUmVkdXhBY3Rpb25cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcmVkdXggbWlkZGxld2FyZSBmb3IgbW9ieC1rZXlzdG9uZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVkdXhNaWRkbGV3YXJlPFQ+IHtcclxuICAoc3RvcmU6IFJlZHV4U3RvcmU8VD4pOiBSZWR1eFJ1bm5lcjxUPlxyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgcmVkdXggY29tcGF0aWJsZSBzdG9yZSBvdXQgb2YgYSBtb2J4LWtleXN0b25lIG9iamVjdC5cclxuICpcclxuICogQHR5cGVwYXJhbSBUIE9iamVjdCB0eXBlLlxyXG4gKiBAcGFyYW0gdGFyZ2V0IFJvb3Qgb2JqZWN0LlxyXG4gKiBAcGFyYW0gbWlkZGxld2FyZXMgT3B0aW9uYWwgbGlzdCBvZiByZWR1eCBtaWRkbGV3YXJlcy5cclxuICogQHJldHVybnMgQSByZWR1eCBjb21wYXRpYmxlIHN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFzUmVkdXhTdG9yZTxUIGV4dGVuZHMgb2JqZWN0PihcclxuICB0YXJnZXQ6IFQsXHJcbiAgLi4ubWlkZGxld2FyZXM6IFJlZHV4TWlkZGxld2FyZTxUPltdXHJcbik6IFJlZHV4U3RvcmU8VD4ge1xyXG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodGFyZ2V0LCBcInRhcmdldFwiKVxyXG5cclxuICBjb25zdCBkZWZhdWx0RGlzcGF0Y2ggPSAoYWN0aW9uOiBSZWR1eEFjdGlvbikgPT4ge1xyXG4gICAgaWYgKGFjdGlvbi50eXBlICE9PSByZWR1eEFjdGlvblR5cGUpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICBgYWN0aW9uIHR5cGUgd2FzIGV4cGVjdGVkIHRvIGJlICcke3JlZHV4QWN0aW9uVHlwZX0nLCBidXQgaXQgd2FzICcke2FjdGlvbi50eXBlfSdgXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUFjdGlvbih0YXJnZXQsIGFjdGlvbi5wYXlsb2FkKVxyXG4gICAgcmV0dXJuIGFjdGlvblxyXG4gIH1cclxuXHJcbiAgbGV0IHN0b3JlOiBSZWR1eFN0b3JlPFQ+ID0ge1xyXG4gICAgZ2V0U3RhdGUoKSB7XHJcbiAgICAgIHJldHVybiBnZXRTbmFwc2hvdCh0YXJnZXQpXHJcbiAgICB9LFxyXG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBydW5NaWRkbGV3YXJlcyhhY3Rpb24sIHJ1bm5lcnMsIGRlZmF1bHREaXNwYXRjaClcclxuICAgIH0sXHJcbiAgICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcclxuICAgICAgcmV0dXJuIG9uU25hcHNob3QodGFyZ2V0LCBsaXN0ZW5lcilcclxuICAgIH0sXHJcbiAgfVxyXG5cclxuICBjb25zdCBydW5uZXJzID0gbWlkZGxld2FyZXMubWFwKChtdykgPT4gbXcoc3RvcmUpKVxyXG5cclxuICByZXR1cm4gc3RvcmVcclxufVxyXG5cclxuZnVuY3Rpb24gcnVuTWlkZGxld2FyZXM8VD4oXHJcbiAgaW5pdGlhbEFjdGlvbjogUmVkdXhBY3Rpb24sXHJcbiAgcnVubmVyczogUmVhZG9ubHlBcnJheTxSZWR1eFJ1bm5lcjxUPj4sXHJcbiAgbmV4dDogUmVkdXhTdG9yZTxUPltcImRpc3BhdGNoXCJdXHJcbik6IFJlZHV4QWN0aW9uIHtcclxuICBsZXQgaSA9IDBcclxuXHJcbiAgZnVuY3Rpb24gcnVuTmV4dE1pZGRsZXdhcmUoYWN0aW9uOiBSZWR1eEFjdGlvbik6IFJlZHV4QWN0aW9uIHtcclxuICAgIGNvbnN0IHJ1bm5lciA9IHJ1bm5lcnNbaV1cclxuICAgIGkrK1xyXG4gICAgaWYgKHJ1bm5lcikge1xyXG4gICAgICByZXR1cm4gcnVubmVyKHJ1bk5leHRNaWRkbGV3YXJlKShhY3Rpb24pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbmV4dChhY3Rpb24pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcnVuTmV4dE1pZGRsZXdhcmUoaW5pdGlhbEFjdGlvbilcclxufVxyXG4iLCJpbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IHR5cGVzU3RyaW5nIH0gZnJvbSBcIi4uL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB7IHRQcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3RQcm9wXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgcmVmZXJlbmNlIG1vZGVsIGJhc2UgdHlwZS5cbiAqIFVzZSBgY3VzdG9tUmVmYCB0byBjcmVhdGUgYSBjdXN0b20gcmVmIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVmPFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgTW9kZWwoe1xuICAvKipcbiAgICogUmVmZXJlbmNlIGlkLlxuICAgKi9cbiAgaWQ6IHRQcm9wKHR5cGVzU3RyaW5nKSxcbn0pIHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlc29sdmUoKTogVCB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHRoaXMgcmVmZXJlbmNlIHBvaW50cyB0bywgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHJlZmVyZW5jZSBpcyBjdXJyZW50bHkgaW52YWxpZC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgbWF5YmVDdXJyZW50KCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSByZWZlcmVuY2UgaXMgY3VycmVudGx5IHZhbGlkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMubWF5YmVDdXJyZW50XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0aGlzIHJlZmVyZW5jZSBwb2ludHMgdG8sIG9yIHRocm93cyBpZiBpbnZhbGlkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCBjdXJyZW50KCk6IFQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm1heWJlQ3VycmVudFxuXG4gICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgYSByZWZlcmVuY2Ugb2YgdHlwZSAnJHt0aGlzW21vZGVsVHlwZUtleV19JyBjb3VsZCBub3QgcmVzb2x2ZSBhbiBvYmplY3Qgd2l0aCBpZCAnJHt0aGlzLmlkfSdgXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGJhY2sgcmVmZXJlbmNlcyBmb3IgdGhpcyByZWYgYXJlIHVwIHRvIGRhdGUuXG4gICAqIFRoaXMgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgaWYgeW91IG5lZWQgdG8gZ2V0IHRoZSBtb3N0IHVwIHRvIGRhdGVcbiAgICogYmFjayByZWZlcmVuY2VzIHdoaWxlIGJvdGggc3RpbGwgaW5zaWRlIGFuIGFjdGlvbiBhbmQgd2hpbGUgdGhlIHJlZmVyZW5jZVxuICAgKiBpcyBub3QgYSBjaGlsZCBvZiB0aGUgc2FtZSByb290IHRoYW4gdGhlIHRhcmdldC5cbiAgICovXG4gIGFic3RyYWN0IGZvcmNlVXBkYXRlQmFja1JlZnMoKTogdm9pZFxufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgY3VzdG9tUmVmVHlwZVN5bWJvbDogdW5pcXVlIHN5bWJvbFxuXG4vKiogQSByZWYgY29uc3RydWN0b3IgZm9yIGN1c3RvbSByZWZzICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZkNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgPFRFIGV4dGVuZHMgVD4odmFsdWVPcklEOiBURSB8IHN0cmluZyk6IFJlZjxURT5cblxuICByZWZDbGFzczogTW9kZWxDbGFzczxSZWY8VD4+XG5cbiAgW2N1c3RvbVJlZlR5cGVTeW1ib2xdOiBUIC8vIGp1c3QgZm9yIHR5cGluZ3Ncbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSByZWYgb2JqZWN0IGlzIG9mIGEgZ2l2ZW4gcmVmIHR5cGUuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJlZmVyZW5jZWQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gcmVmIFJlZmVyZW5jZSBvYmplY3QuXG4gKiBAcGFyYW0gcmVmVHlwZSBSZWZlcmVuY2UgdHlwZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBvZiB0aGUgZ2l2ZW4gdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZPZlR5cGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIHJlZjogUmVmPG9iamVjdD4sXG4gIHJlZlR5cGU6IFJlZkNvbnN0cnVjdG9yPFQ+XG4pOiByZWYgaXMgUmVmPFQ+IHtcbiAgcmV0dXJuIHJlZiBpbnN0YW5jZW9mIHJlZlR5cGUucmVmQ2xhc3Ncbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgb2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZVNldCwgcmVhY3Rpb24sIHdoZW4gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxEZWNvcmF0b3JcIlxuaW1wb3J0IHtcbiAgZ2V0RGVlcE9iamVjdENoaWxkcmVuLFxuICByZWdpc3RlckRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbixcbn0gZnJvbSBcIi4uL3BhcmVudC9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuaW1wb3J0IHsgZ2V0Um9vdCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBDb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlLCBjb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlIH0gZnJvbSBcIi4uL3BhcmVudC93YWxrVHJlZVwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc09iamVjdCwgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgeyBSZWYsIFJlZkNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vUmVmXCJcblxuaW50ZXJmYWNlIEJhY2tSZWZzPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgYWxsOiBPYnNlcnZhYmxlU2V0PFJlZjxUPj5cbiAgYnlUeXBlOiBXZWFrTWFwPFJlZkNvbnN0cnVjdG9yPFQ+LCBPYnNlcnZhYmxlU2V0PFJlZjxUPj4+XG59XG5cbi8qKlxuICogQmFjay1yZWZlcmVuY2VzIGZyb20gb2JqZWN0IHRvIHRoZSByZWZlcmVuY2VzIHRoYXQgcG9pbnQgdG8gaXQuXG4gKi9cbmNvbnN0IG9iamVjdEJhY2tSZWZzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBCYWNrUmVmczxhbnk+PigpXG5cbi8qKlxuICogUmVmZXJlbmNlIHJlc29sdmVyIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZlJlc29sdmVyPFQgZXh0ZW5kcyBvYmplY3Q+ID0gKHJlZjogUmVmPFQ+KSA9PiBUIHwgdW5kZWZpbmVkXG5cbi8qKlxuICogUmVmZXJlbmNlIElEIHJlc29sdmVyIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZklkUmVzb2x2ZXIgPSAodGFyZ2V0OiBvYmplY3QpID0+IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4vKipcbiAqIFR5cGUgZm9yIHRoZSBjYWxsYmFjayBjYWxsZWQgd2hlbiBhIHJlZmVyZW5jZSByZXNvbHZlZCB2YWx1ZSBjaGFuZ2VzLlxuICovXG5leHBvcnQgdHlwZSBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2U8VCBleHRlbmRzIG9iamVjdD4gPSAoXG4gIHJlZjogUmVmPFQ+LFxuICBuZXdWYWx1ZTogVCB8IHVuZGVmaW5lZCxcbiAgb2xkVmFsdWU6IFQgfCB1bmRlZmluZWRcbikgPT4gdm9pZFxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxDdXN0b21SZWY8VCBleHRlbmRzIG9iamVjdD4oXG4gIG1vZGVsVHlwZUlkOiBzdHJpbmcsXG4gIHJlc29sdmVyR2VuOiAocmVmOiBSZWY8VD4pID0+IFJlZlJlc29sdmVyPFQ+LFxuICBnZXRJZDogUmVmSWRSZXNvbHZlcixcbiAgb25SZXNvbHZlZFZhbHVlQ2hhbmdlOiBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2U8VD4gfCB1bmRlZmluZWRcbik6IFJlZkNvbnN0cnVjdG9yPFQ+IHtcbiAgQG1vZGVsKG1vZGVsVHlwZUlkKVxuICBjbGFzcyBDdXN0b21SZWYgZXh0ZW5kcyBSZWY8VD4ge1xuICAgIHByaXZhdGUgcmVzb2x2ZXI/OiBSZWZSZXNvbHZlcjxUPlxuXG4gICAgcmVzb2x2ZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICghdGhpcy5yZXNvbHZlcikge1xuICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXJHZW4odGhpcylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXIodGhpcylcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhdmVkT2xkVGFyZ2V0OiBUIHwgdW5kZWZpbmVkXG5cbiAgICBwcml2YXRlIGludGVybmFsRm9yY2VVcGRhdGVCYWNrUmVmcyhuZXdUYXJnZXQ6IFQgfCB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9sZFRhcmdldCA9IHRoaXMuc2F2ZWRPbGRUYXJnZXRcbiAgICAgIC8vIHVwZGF0ZSBlYXJseSBpbiBjYXNlIG9mIHRocm93biBleGNlcHRpb25zXG4gICAgICB0aGlzLnNhdmVkT2xkVGFyZ2V0ID0gbmV3VGFyZ2V0XG5cbiAgICAgIHVwZGF0ZUJhY2tSZWZzKHRoaXMsIHRoaXNSZWZDb25zdHJ1Y3RvciwgbmV3VGFyZ2V0LCBvbGRUYXJnZXQpXG4gICAgfVxuXG4gICAgQGFjdGlvblxuICAgIGZvcmNlVXBkYXRlQmFja1JlZnMoKSB7XG4gICAgICB0aGlzLmludGVybmFsRm9yY2VVcGRhdGVCYWNrUmVmcyh0aGlzLm1heWJlQ3VycmVudClcbiAgICB9XG5cbiAgICBvbkluaXQoKSB7XG4gICAgICAvLyBsaXN0ZW4gdG8gY2hhbmdlc1xuXG4gICAgICBsZXQgc2F2ZWRPbGRUYXJnZXQ6IFQgfCB1bmRlZmluZWRcbiAgICAgIGxldCBzYXZlZEZpcnN0VGltZSA9IHRydWVcblxuICAgICAgLy8gYWNjb3JkaW5nIHRvIG13ZXN0cmF0ZSB0aGlzIHdvbid0IGxlYWsgYXMgbG9uZyBhcyB3ZSBkb24ndCBrZWVwIHRoZSBkaXNwb3NlciBhcm91bmRcbiAgICAgIHJlYWN0aW9uKFxuICAgICAgICAoKSA9PiB0aGlzLm1heWJlQ3VycmVudCxcbiAgICAgICAgKG5ld1RhcmdldCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW50ZXJuYWxGb3JjZVVwZGF0ZUJhY2tSZWZzKG5ld1RhcmdldClcblxuICAgICAgICAgIGNvbnN0IG9sZFRhcmdldCA9IHNhdmVkT2xkVGFyZ2V0XG4gICAgICAgICAgY29uc3QgZmlyc3RUaW1lID0gc2F2ZWRGaXJzdFRpbWVcbiAgICAgICAgICAvLyB1cGRhdGUgZWFybHkgaW4gY2FzZSBvZiB0aHJvd24gZXhjZXB0aW9uc1xuICAgICAgICAgIHNhdmVkT2xkVGFyZ2V0ID0gbmV3VGFyZ2V0XG4gICAgICAgICAgc2F2ZWRGaXJzdFRpbWUgPSBmYWxzZVxuXG4gICAgICAgICAgaWYgKCFmaXJzdFRpbWUgJiYgb25SZXNvbHZlZFZhbHVlQ2hhbmdlICYmIG5ld1RhcmdldCAhPT0gb2xkVGFyZ2V0KSB7XG4gICAgICAgICAgICBvblJlc29sdmVkVmFsdWVDaGFuZ2UodGhpcywgbmV3VGFyZ2V0LCBvbGRUYXJnZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZm4gPSAodGFyZ2V0OiBUKSA9PiB7XG4gICAgbGV0IGlkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWQgPSB0YXJnZXRcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0SXNPYmplY3QodGFyZ2V0LCBcInRhcmdldFwiKVxuICAgICAgaWQgPSBnZXRJZCh0YXJnZXQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgZmFpbHVyZShcInJlZiB0YXJnZXQgb2JqZWN0IG11c3QgaGF2ZSBhbiBpZCBvZiBzdHJpbmcgdHlwZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZiA9IG5ldyBDdXN0b21SZWYoe1xuICAgICAgaWQsXG4gICAgfSlcblxuICAgIHJldHVybiByZWZcbiAgfVxuICBmbi5yZWZDbGFzcyA9IEN1c3RvbVJlZlxuXG4gIGNvbnN0IHRoaXNSZWZDb25zdHJ1Y3RvciA9IGZuIGFzIGFueSBhcyBSZWZDb25zdHJ1Y3RvcjxUPlxuXG4gIHJldHVybiB0aGlzUmVmQ29uc3RydWN0b3Jcbn1cblxuLyoqXG4gKiBVc2VzIGEgbW9kZWwgYGdldFJlZklkKClgIG1ldGhvZCB3aGVuZXZlciBwb3NzaWJsZSB0byBnZXQgYSByZWZlcmVuY2UgSUQuXG4gKiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IG1ldGhvZCBpdCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICogSWYgdGhlIG1vZGVsIGhhcyBhbiBpbXBsZW1lbnRhdGlvbiwgYnV0IHRoYXQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBhIGBzdHJpbmdgIGl0IHdpbGwgdGhyb3cuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUYXJnZXQgb2JqZWN0IHRvIGdldCB0aGUgSUQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBzdHJpbmcgSUQgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbFJlZklkKHRhcmdldDogb2JqZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzTW9kZWwodGFyZ2V0KSAmJiB0YXJnZXQuZ2V0UmVmSWQpIHtcbiAgICBjb25zdCBpZCA9IHRhcmdldC5nZXRSZWZJZCgpXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGlkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiJ2dldFJlZklkKCknIG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIHVuZGVmaW5lZCB3aGVuIHByZXNlbnRcIilcbiAgICB9XG4gICAgcmV0dXJuIGlkXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vLyBvbmUgY29tcHV0ZWQgaWQgdHJlZSBwZXIgaWQgZnVuY3Rpb25cbmNvbnN0IGNvbXB1dGVkSWRUcmVlcyA9IG5ldyBXZWFrTWFwPFxuICAobm9kZTogb2JqZWN0KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIENvbXB1dGVkV2Fsa1RyZWVBZ2dyZWdhdGU8c3RyaW5nPlxuPigpXG5cbi8qKlxuICogUmVzb2x2ZXMgYSBub2RlIGdpdmVuIGl0cyBJRC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgVGFyZ2V0IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHJvb3QgTm9kZSB3aGVyZSB0byBzdGFydCB0aGUgc2VhcmNoLiBUaGUgc2VhcmNoIHdpbGwgYmUgZG9uZSBvbiBpdCBhbmQgYWxsIGl0cyBjaGlsZHJlbi5cbiAqIEBwYXJhbSBpZCBJRCB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIGdldElkIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdldCB0aGUgSUQgZnJvbSBhbiBvYmplY3QgKGBnZXRNb2RlbFJlZklkYCBieSBkZWZhdWx0KS5cbiAqIEByZXR1cm5zIFRoZSBub2RlIGZvdW5kIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWQ8VCBleHRlbmRzIG9iamVjdD4oXG4gIHJvb3Q6IG9iamVjdCxcbiAgaWQ6IHN0cmluZyxcbiAgZ2V0SWQ6IFJlZklkUmVzb2x2ZXIgPSBnZXRNb2RlbFJlZklkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgLy8gY2FjaGUvcmV1c2UgY29tcHV0ZWRJZFRyZWVzIGZvciBzYW1lIGdldElkIGZ1bmN0aW9uXG4gIGNvbnN0IGNvbXB1dGVkSWRUcmVlID0gZ2V0T3JDcmVhdGUoY29tcHV0ZWRJZFRyZWVzLCBnZXRJZCwgKCkgPT5cbiAgICBjb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPHN0cmluZz4oKG5vZGUpID0+IGdldElkKG5vZGUpKVxuICApXG5cbiAgY29uc3QgaWRNYXAgPSBjb21wdXRlZElkVHJlZS53YWxrKHJvb3QpXG4gIHJldHVybiBpZE1hcCA/IChpZE1hcC5nZXQoaWQpIGFzIFQgfCB1bmRlZmluZWQpIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGdldEJhY2tSZWZzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICB0YXJnZXQ6IFQsXG4gIHJlZlR5cGU/OiBSZWZDb25zdHJ1Y3RvcjxUPlxuKTogT2JzZXJ2YWJsZVNldDxSZWY8VD4+IHtcbiAgbGV0IGJhY2tSZWZzID0gb2JqZWN0QmFja1JlZnMuZ2V0KHRhcmdldClcbiAgaWYgKCFiYWNrUmVmcykge1xuICAgIGJhY2tSZWZzID0ge1xuICAgICAgYWxsOiBvYnNlcnZhYmxlLnNldCh1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSksXG4gICAgICBieVR5cGU6IG5ldyBXZWFrTWFwKCksXG4gICAgfVxuICAgIG9iamVjdEJhY2tSZWZzLnNldCh0YXJnZXQsIGJhY2tSZWZzKVxuICB9XG5cbiAgaWYgKCFyZWZUeXBlKSB7XG4gICAgcmV0dXJuIGJhY2tSZWZzLmFsbFxuICB9IGVsc2Uge1xuICAgIGxldCBieVR5cGUgPSBiYWNrUmVmcy5ieVR5cGUuZ2V0KHJlZlR5cGUpXG4gICAgaWYgKCFieVR5cGUpIHtcbiAgICAgIGJ5VHlwZSA9IG9ic2VydmFibGUuc2V0KHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KVxuICAgICAgYmFja1JlZnMuYnlUeXBlLnNldChyZWZUeXBlLCBieVR5cGUpXG4gICAgfVxuICAgIHJldHVybiBieVR5cGVcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYWxsIHJlZmVyZW5jZXMgdGhhdCByZXNvbHZlIHRvIGEgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZWZlcmVuY2VkIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHRhcmdldCBOb2RlIHRoZSByZWZlcmVuY2VzIHBvaW50IHRvLlxuICogQHBhcmFtIHJlZlR5cGUgUGFzcyBpdCB0byBmaWx0ZXIgYnkgb25seSByZWZlcmVuY2VzIG9mIGEgZ2l2ZW4gdHlwZSwgb3Igb21pdCAvIHBhc3MgYHVuZGVmaW5lZGAgdG8gZ2V0IHJlZmVyZW5jZXMgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zLlxuICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSBzZXQgd2l0aCBhbGwgcmVmZXJlbmNlIG9iamVjdHMgdGhhdCBwb2ludCB0byB0aGUgZ2l2ZW4gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVmc1Jlc29sdmluZ1RvPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICB0YXJnZXQ6IFQsXG4gIHJlZlR5cGU/OiBSZWZDb25zdHJ1Y3RvcjxUPixcbiAgb3B0aW9ucz86IHtcbiAgICB1cGRhdGVBbGxSZWZzSWZOZWVkZWQ/OiBib29sZWFuXG4gIH1cbik6IE9ic2VydmFibGVTZXQ8UmVmPFQ+PiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodGFyZ2V0LCBcInRhcmdldFwiKVxuXG4gIGlmIChvcHRpb25zPy51cGRhdGVBbGxSZWZzSWZOZWVkZWQgJiYgaXNSZWFjdGlvbkRlbGF5ZWQoKSkge1xuICAgIC8vIGluIHRoaXMgY2FzZSB0aGUgcmVmZXJlbmNlIHVwZGF0ZSBtaWdodCBoYXZlIGJlZW4gZGVsYXllZFxuICAgIC8vIHNvIHdlIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVwZGF0ZSB0aGVtXG4gICAgY29uc3QgcmVmc0NoZWNrZWQgPSBuZXcgU2V0PFJlZjxvYmplY3Q+PigpXG4gICAgY29uc3QgdXBkYXRlUmVmID0gKHJlZjogUmVmPGFueT4pID0+IHtcbiAgICAgIGlmICghcmVmc0NoZWNrZWQuaGFzKHJlZikpIHtcbiAgICAgICAgaWYgKCFyZWZUeXBlIHx8IHJlZiBpbnN0YW5jZW9mIHJlZlR5cGUucmVmQ2xhc3MpIHtcbiAgICAgICAgICByZWYuZm9yY2VVcGRhdGVCYWNrUmVmcygpXG4gICAgICAgIH1cbiAgICAgICAgcmVmc0NoZWNrZWQuYWRkKHJlZilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbGRCYWNrUmVmcyA9IGdldEJhY2tSZWZzKHRhcmdldCwgcmVmVHlwZSlcbiAgICBvbGRCYWNrUmVmcy5mb3JFYWNoKHVwZGF0ZVJlZilcblxuICAgIGNvbnN0IHJlZnNDaGlsZHJlbk9mUm9vdCA9IGdldERlZXBDaGlsZHJlblJlZnMoZ2V0RGVlcE9iamVjdENoaWxkcmVuKGdldFJvb3QodGFyZ2V0KSkpXG4gICAgbGV0IHJlZnM6IFNldDxSZWY8b2JqZWN0Pj4gfCB1bmRlZmluZWRcbiAgICBpZiAocmVmVHlwZSkge1xuICAgICAgcmVmcyA9IHJlZnNDaGlsZHJlbk9mUm9vdC5ieVR5cGUuZ2V0KHJlZlR5cGUucmVmQ2xhc3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZnMgPSByZWZzQ2hpbGRyZW5PZlJvb3QuYWxsXG4gICAgfVxuICAgIHJlZnM/LmZvckVhY2godXBkYXRlUmVmKVxuICB9XG5cbiAgcmV0dXJuIGdldEJhY2tSZWZzKHRhcmdldCwgcmVmVHlwZSlcbn1cblxuY29uc3QgdXBkYXRlQmFja1JlZnMgPSBhY3Rpb24oXG4gIFwidXBkYXRlQmFja1JlZnNcIixcbiAgPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHJlZjogUmVmPFQ+LFxuICAgIHJlZkNsYXNzOiBSZWZDb25zdHJ1Y3RvcjxUPixcbiAgICBuZXdUYXJnZXQ6IFQgfCB1bmRlZmluZWQsXG4gICAgb2xkVGFyZ2V0OiBUIHwgdW5kZWZpbmVkXG4gICkgPT4ge1xuICAgIGlmIChuZXdUYXJnZXQgPT09IG9sZFRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG9sZFRhcmdldCkge1xuICAgICAgZ2V0QmFja1JlZnMob2xkVGFyZ2V0KS5kZWxldGUocmVmKVxuICAgICAgZ2V0QmFja1JlZnMob2xkVGFyZ2V0LCByZWZDbGFzcyBhcyBSZWZDb25zdHJ1Y3Rvcjxhbnk+KS5kZWxldGUocmVmKVxuICAgIH1cbiAgICBpZiAobmV3VGFyZ2V0KSB7XG4gICAgICBnZXRCYWNrUmVmcyhuZXdUYXJnZXQpLmFkZChyZWYpXG4gICAgICBnZXRCYWNrUmVmcyhuZXdUYXJnZXQsIHJlZkNsYXNzIGFzIFJlZkNvbnN0cnVjdG9yPGFueT4pLmFkZChyZWYpXG4gICAgfVxuICB9XG4pXG5cbmZ1bmN0aW9uIGlzUmVhY3Rpb25EZWxheWVkKCkge1xuICBsZXQgcmVhY3Rpb25EZWxheWVkID0gdHJ1ZVxuICBjb25zdCBkaXNwb3NlID0gd2hlbihcbiAgICAoKSA9PiB0cnVlLFxuICAgICgpID0+IHtcbiAgICAgIHJlYWN0aW9uRGVsYXllZCA9IGZhbHNlXG4gICAgfVxuICApXG4gIGRpc3Bvc2UoKVxuICByZXR1cm4gcmVhY3Rpb25EZWxheWVkXG59XG5cbmludGVyZmFjZSBEZWVwQ2hpbGRyZW5SZWZzIHtcbiAgYWxsOiBTZXQ8UmVmPGFueT4+XG4gIGJ5VHlwZTogV2Vha01hcDxNb2RlbENsYXNzPFJlZjxhbnk+PiwgU2V0PFJlZjxhbnk+Pj5cbn1cblxuY29uc3QgZ2V0RGVlcENoaWxkcmVuUmVmcyA9IHJlZ2lzdGVyRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uPERlZXBDaGlsZHJlblJlZnM+KHtcbiAgaW5pdERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbDogbmV3IFNldCgpLFxuICAgICAgYnlUeXBlOiBuZXcgV2Vha01hcCgpLFxuICAgIH1cbiAgfSxcblxuICBhZGROb2RlKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFJlZikge1xuICAgICAgZGF0YS5hbGwuYWRkKG5vZGUpXG4gICAgICBjb25zdCByZWZzQnlUaGlzVHlwZSA9IGdldE9yQ3JlYXRlKGRhdGEuYnlUeXBlLCBub2RlLmNvbnN0cnVjdG9yLCAoKSA9PiBuZXcgU2V0KCkpXG4gICAgICByZWZzQnlUaGlzVHlwZS5hZGQobm9kZSlcbiAgICB9XG4gIH0sXG59KVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgZ2V0TW9kZWxSZWZJZCxcbiAgaW50ZXJuYWxDdXN0b21SZWYsXG4gIFJlZklkUmVzb2x2ZXIsXG4gIFJlZk9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSxcbiAgUmVmUmVzb2x2ZXIsXG59IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBSZWZDb25zdHJ1Y3RvciB9IGZyb20gXCIuL1JlZlwiXG5cbi8qKlxuICogQ3VzdG9tIHJlZmVyZW5jZSBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlZk9wdGlvbnM8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogTXVzdCByZXR1cm4gdGhlIHJlc29sdXRpb24gZm9yIHRoZSBnaXZlbiByZWZlcmVuY2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVmIFJlZmVyZW5jZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBvYmplY3Qgb3IgdW5kZWZpbmVkIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZC5cbiAgICovXG4gIHJlc29sdmU6IFJlZlJlc29sdmVyPFQ+XG5cbiAgLyoqXG4gICAqIE11c3QgcmV0dXJuIHRoZSBJRCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiB0YXJnZXQgb2JqZWN0LCBvciBgdW5kZWZpbmVkYCBpZiBpdCBoYXMgbm8gSUQuXG4gICAqIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIHRyeSB0byBnZXQgdGhlIHJlZmVyZW5jZSBpZCBmcm9tIHRoZSBtb2RlbCBgZ2V0UmVmSWQoKWAgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBvYmplY3QuXG4gICAqL1xuICBnZXRJZD86IFJlZklkUmVzb2x2ZXJcblxuICAvKipcbiAgICogV2hhdCBzaG91bGQgaGFwcGVuIHdoZW4gdGhlIHJlc29sdmVkIHZhbHVlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSByZWYgUmVmZXJlbmNlIG9iamVjdC5cbiAgICogQHBhcmFtIG5ld1ZhbHVlIE5ldyByZXNvbHZlZCB2YWx1ZS5cbiAgICogQHBhcmFtIG9sZFZhbHVlIE9sZCByZXNvbHZlZCB2YWx1ZS5cbiAgICovXG4gIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZT86IFJlZk9uUmVzb2x2ZWRWYWx1ZUNoYW5nZTxUPlxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gcmVmIHRvIGFuIG9iamVjdCwgd2hpY2ggaW4gaXRzIHNuYXBzaG90IGZvcm0gaGFzIGFuIGlkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBUYXJnZXQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxUeXBlSWQgVW5pcXVlIG1vZGVsIHR5cGUgaWQuXG4gKiBAcGFyYW0gb3B0aW9ucyBDdXN0b20gcmVmZXJlbmNlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byBjb25zdHJ1Y3QgdGhhdCB0eXBlIG9mIGN1c3RvbSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21SZWY6IDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgbW9kZWxUeXBlSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogQ3VzdG9tUmVmT3B0aW9uczxUPlxuKSA9PiBSZWZDb25zdHJ1Y3RvcjxUPiA9IGFjdGlvbihcImN1c3RvbVJlZlwiLCAobW9kZWxUeXBlSWQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgZ2V0SWQgPSBvcHRpb25zLmdldElkID8/IGdldE1vZGVsUmVmSWRcblxuICByZXR1cm4gaW50ZXJuYWxDdXN0b21SZWYobW9kZWxUeXBlSWQsICgpID0+IG9wdGlvbnMucmVzb2x2ZSwgZ2V0SWQsIG9wdGlvbnMub25SZXNvbHZlZFZhbHVlQ2hhbmdlKVxufSlcbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGZhc3RHZXRSb290IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7XG4gIGdldE1vZGVsUmVmSWQsXG4gIGludGVybmFsQ3VzdG9tUmVmLFxuICBSZWZJZFJlc29sdmVyLFxuICBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2UsXG4gIFJlZlJlc29sdmVyLFxuICByZXNvbHZlSWQsXG59IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBSZWYsIFJlZkNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vUmVmXCJcblxuLyoqXG4gKiBDdXN0b20gcmVmZXJlbmNlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFJlZk9wdGlvbnM8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogTXVzdCByZXR1cm4gdGhlIElEIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHRhcmdldCBvYmplY3QsIG9yIGB1bmRlZmluZWRgIGlmIGl0IGhhcyBubyBJRC5cbiAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgdHJ5IHRvIGdldCB0aGUgcmVmZXJlbmNlIGlkIGZyb20gdGhlIG1vZGVsIGBnZXRSZWZJZCgpYCBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIGdldElkPzogUmVmSWRSZXNvbHZlclxuXG4gIC8qKlxuICAgKiBXaGF0IHNob3VsZCBoYXBwZW4gd2hlbiB0aGUgcmVzb2x2ZWQgdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHJlZiBSZWZlcmVuY2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHJlc29sdmVkIHZhbHVlLlxuICAgKiBAcGFyYW0gb2xkVmFsdWUgT2xkIHJlc29sdmVkIHZhbHVlLlxuICAgKi9cbiAgb25SZXNvbHZlZFZhbHVlQ2hhbmdlPzogUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlPFQ+XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJvb3QgcmVmIHRvIGFuIG9iamVjdCwgd2hpY2ggaW4gaXRzIHNuYXBzaG90IGZvcm0gaGFzIGFuIGlkLlxuICogQSByb290IHJlZiB3aWxsIG9ubHkgYmUgYWJsZSB0byByZXNvbHZlIHJlZmVyZW5jZXMgYXMgbG9uZyBhcyBib3RoIHRoZSBSZWZcbiAqIGFuZCB0aGUgcmVmZXJlbmNlZCBvYmplY3Qgc2hhcmUgYSBjb21tb24gcm9vdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgVGFyZ2V0IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIG1vZGVsVHlwZUlkIFVuaXF1ZSBtb2RlbCB0eXBlIGlkLlxuICogQHBhcmFtIFtvcHRpb25zXSBSb290IHJlZmVyZW5jZSBvcHRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGFsbG93cyB5b3UgdG8gY29uc3RydWN0IHRoYXQgdHlwZSBvZiByb290IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJvb3RSZWY6IDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgbW9kZWxUeXBlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IFJvb3RSZWZPcHRpb25zPFQ+IHwgdW5kZWZpbmVkXG4pID0+IFJlZkNvbnN0cnVjdG9yPFQ+ID0gYWN0aW9uKFxuICBcInJvb3RSZWZcIixcbiAgPFQgZXh0ZW5kcyBvYmplY3Q+KG1vZGVsVHlwZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBSb290UmVmT3B0aW9uczxUPik6IFJlZkNvbnN0cnVjdG9yPFQ+ID0+IHtcbiAgICBjb25zdCBnZXRJZCA9IG9wdGlvbnM/LmdldElkID8/IGdldE1vZGVsUmVmSWRcbiAgICBjb25zdCBvblJlc29sdmVkVmFsdWVDaGFuZ2UgPSBvcHRpb25zPy5vblJlc29sdmVkVmFsdWVDaGFuZ2VcblxuICAgIGNvbnN0IHJlc29sdmVyR2VuID0gKHJlZjogUmVmPFQ+KTogUmVmUmVzb2x2ZXI8VD4gPT4ge1xuICAgICAgbGV0IGNhY2hlZFRhcmdldDogVCB8IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCByZWZSb290ID0gZmFzdEdldFJvb3QocmVmKVxuXG4gICAgICAgIGlmIChpc1JlZlJvb3RDYWNoZWRUYXJnZXRPayhyZWYsIHJlZlJvb3QsIGNhY2hlZFRhcmdldCwgZ2V0SWQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlZFRhcmdldFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiBub3QgZm91bmQsIGV2ZXJ5dGltZSBhIGNoaWxkIGlzIGFkZGVkL3JlbW92ZWQgb3IgaXRzIGlkIGNoYW5nZXMgd2Ugd2lsbCBwZXJmb3JtIGFub3RoZXIgc2VhcmNoXG4gICAgICAgIC8vIHRoaXMgc2VhcmNoIGlzIG9ubHkgZG9uZSBvbmNlIGZvciBldmVyeSBkaXN0aW5jdCBnZXRJZCBmdW5jdGlvblxuICAgICAgICBjb25zdCBuZXdUYXJnZXQgPSByZXNvbHZlSWQ8VD4ocmVmUm9vdCwgcmVmLmlkLCBnZXRJZClcbiAgICAgICAgaWYgKG5ld1RhcmdldCkge1xuICAgICAgICAgIGNhY2hlZFRhcmdldCA9IG5ld1RhcmdldFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdUYXJnZXRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJuYWxDdXN0b21SZWYobW9kZWxUeXBlSWQsIHJlc29sdmVyR2VuLCBnZXRJZCwgb25SZXNvbHZlZFZhbHVlQ2hhbmdlKVxuICB9XG4pXG5cbmZ1bmN0aW9uIGlzUmVmUm9vdENhY2hlZFRhcmdldE9rPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICByZWY6IFJlZjxUPixcbiAgcmVmUm9vdDogb2JqZWN0LFxuICBjYWNoZWRUYXJnZXQ6IFQgfCB1bmRlZmluZWQsXG4gIGdldElkOiBSZWZJZFJlc29sdmVyXG4pOiBjYWNoZWRUYXJnZXQgaXMgVCB7XG4gIGlmICghY2FjaGVkVGFyZ2V0KSByZXR1cm4gZmFsc2VcbiAgaWYgKHJlZi5pZCAhPT0gZ2V0SWQoY2FjaGVkVGFyZ2V0KSkgcmV0dXJuIGZhbHNlXG4gIGlmIChyZWZSb290ICE9PSBmYXN0R2V0Um9vdChjYWNoZWRUYXJnZXQpKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCB7IGFkZFN0YW5kYWxvbmVBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25zXCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhbmRhbG9uZSBhY3Rpb24uIEEgc3RhbmRhbG9uZSBhY3Rpb24gbXVzdCBhbHdheXMgdGFrZSBhbiBleGlzdGluZyB0cmVlIG5vZGUgYXMgZmlyc3QgYXJndW1lbnQuXG4gKlxuICogQHBhcmFtIGFjdGlvbk5hbWUgVW5pcXVlIGFjdGlvbiBuYW1lLlxuICogQHBhcmFtIGZuIEZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGZ1bmN0aW9uIGFzIGFuIHN0YW5kYWxvbmUgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhbG9uZUFjdGlvbjxGTiBleHRlbmRzICh0YXJnZXQ6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueT4oXG4gIGFjdGlvbk5hbWU6IHN0cmluZyxcbiAgZm46IEZOXG4pOiBGTiB7XG4gIHJldHVybiBhZGRTdGFuZGFsb25lQWN0aW9uKGFjdGlvbk5hbWUsIGZuLCBmYWxzZSkgYXMgdW5rbm93biBhcyBGTlxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFuZGFsb25lIGZsb3cuIEEgc3RhbmRhbG9uZSBmbG93IG11c3QgYWx3YXlzIHRha2UgYW4gZXhpc3RpbmcgdHJlZSBub2RlIGFzIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBhY3Rpb25OYW1lIFVuaXF1ZSBhY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSBmbiBGdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmdW5jdGlvbiBhcyBhbiBzdGFuZGFsb25lIGZsb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFsb25lRmxvdzxcbiAgRk4gZXh0ZW5kcyAodGFyZ2V0OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBHZW5lcmF0b3I8YW55LCBhbnksIGFueT5cbj4oYWN0aW9uTmFtZTogc3RyaW5nLCBmbjogRk4pOiBGTiB7XG4gIHJldHVybiBhZGRTdGFuZGFsb25lQWN0aW9uKGFjdGlvbk5hbWUsIGZuLCB0cnVlKSBhcyB1bmtub3duIGFzIEZOXG59XG4iLCJpbXBvcnQgeyByZW1vdmUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHRvVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyBuYW1lc3BhY2UgYXMgbnMgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgc3RhbmRhbG9uZUFjdGlvbiB9IGZyb20gXCIuL3N0YW5kYWxvbmVBY3Rpb25zXCJcblxuZnVuY3Rpb24gX3NwbGljZShhcnJheTogYW55W10sIHN0YXJ0OiBudW1iZXIsIGRlbGV0ZUNvdW50PzogbnVtYmVyKTogYW55W11cbmZ1bmN0aW9uIF9zcGxpY2UoYXJyYXk6IGFueVtdLCBzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudDogbnVtYmVyLCAuLi5pdGVtczogYW55W10pOiBhbnlbXVxuZnVuY3Rpb24gX3NwbGljZShhcnJheTogYW55W10sIC4uLmFyZ3M6IGFueVtdKTogYW55W10ge1xuICByZXR1cm4gKGFycmF5LnNwbGljZSBhcyBhbnkpKC4uLmFyZ3MpXG59XG5cbmNvbnN0IG5hbWVzcGFjZSA9IGAke25zfS9hcnJheUFjdGlvbnNgXG5cbmV4cG9ydCBjb25zdCBhcnJheUFjdGlvbnMgPSB7XG4gIHNldDogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9OjpzZXRgLCA8VD4oYXJyYXk6IFRbXSwgaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQgPT4ge1xuICAgIHNldChhcnJheSwgaW5kZXgsIHZhbHVlKVxuICB9KSxcblxuICBkZWxldGU6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6ZGVsZXRlYCwgPFQ+KGFycmF5OiBUW10sIGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gcmVtb3ZlKGFycmF5LCBcIlwiICsgaW5kZXgpXG4gIH0pLFxuXG4gIHNldExlbmd0aDogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9OjpzZXRMZW5ndGhgLCA8VD4oYXJyYXk6IFRbXSwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBhcnJheS5sZW5ndGggPSBsZW5ndGhcbiAgfSksXG5cbiAgY29uY2F0OiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmNvbmNhdGAsXG4gICAgPFQ+KGFycmF5OiBUW10sIC4uLml0ZW1zOiBDb25jYXRBcnJheTxUPltdKTogVFtdID0+IHtcbiAgICAgIHJldHVybiBhcnJheS5jb25jYXQoLi4uaXRlbXMpXG4gICAgfVxuICApLFxuXG4gIGNvcHlXaXRoaW46IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6Y29weVdpdGhpbmAsXG4gICAgPFQ+KGFycmF5OiBUW10sIHRhcmdldDogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBUW10gPT4ge1xuICAgICAgcmV0dXJuIGFycmF5LmNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCwgZW5kKVxuICAgIH1cbiAgKSxcblxuICBmaWxsOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmZpbGxgLFxuICAgIDxUPihhcnJheTogVFtdLCB2YWx1ZTogVCwgc3RhcnQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGVuZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IFRbXSA9PiB7XG4gICAgICByZXR1cm4gYXJyYXkuZmlsbCh2YWx1ZSwgc3RhcnQsIGVuZClcbiAgICB9XG4gICksXG5cbiAgcG9wOiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnBvcGAsIDxUPihhcnJheTogVFtdKTogVCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgcmV0dXJuIGFycmF5LnBvcCgpXG4gIH0pLFxuXG4gIHB1c2g6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6cHVzaGAsIDxUPihhcnJheTogVFtdLCAuLi5pdGVtczogVFtdKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gYXJyYXkucHVzaCguLi5pdGVtcylcbiAgfSksXG5cbiAgcmV2ZXJzZTogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9OjpyZXZlcnNlYCwgPFQ+KGFycmF5OiBUW10pOiBUW10gPT4ge1xuICAgIHJldHVybiBhcnJheS5yZXZlcnNlKClcbiAgfSksXG5cbiAgc2hpZnQ6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6c2hpZnRgLCA8VD4oYXJyYXk6IFRbXSk6IFQgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiBhcnJheS5zaGlmdCgpXG4gIH0pLFxuXG4gIHNsaWNlOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OnNsaWNlYCxcbiAgICA8VD4oYXJyYXk6IFRbXSwgc3RhcnQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGVuZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IFRbXSA9PiB7XG4gICAgICByZXR1cm4gYXJyYXkuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICB9XG4gICksXG5cbiAgc29ydDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9Ojpzb3J0YCxcbiAgICA8VD4oYXJyYXk6IFRbXSwgY29tcGFyZUZuPzogKChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHwgdW5kZWZpbmVkKTogVFtdID0+IHtcbiAgICAgIHJldHVybiBhcnJheS5zb3J0KGNvbXBhcmVGbilcbiAgICB9XG4gICksXG5cbiAgc3BsaWNlOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OnNwbGljZWAsXG4gICAgX3NwbGljZSBhc1xuICAgICAgfCAoPFQ+KGFycmF5OiBUW10sIHN0YXJ0OiBudW1iZXIsIGRlbGV0ZUNvdW50PzogbnVtYmVyKSA9PiBUW10pXG4gICAgICB8ICg8VD4oYXJyYXk6IFRbXSwgc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IFRbXSkgPT4gVFtdKVxuICApLFxuXG4gIHVuc2hpZnQ6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6dW5zaGlmdGAsIDxUPihhcnJheTogVFtdLCAuLi5pdGVtczogVFtdKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gYXJyYXkudW5zaGlmdCguLi5pdGVtcylcbiAgfSksXG5cbiAgc3dhcDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9Ojpzd2FwYCxcbiAgICA8VD4oYXJyYXk6IFRbXSwgaW5kZXgxOiBudW1iZXIsIGluZGV4MjogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICBpZiAoaW5kZXgxIDwgMCB8fCBpbmRleDIgPCAwIHx8IGluZGV4MSA+PSBhcnJheS5sZW5ndGggfHwgaW5kZXgyID49IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleDIgPCBpbmRleDEpIHtcbiAgICAgICAgO1tpbmRleDEsIGluZGV4Ml0gPSBbaW5kZXgyLCBpbmRleDFdXG4gICAgICB9XG4gICAgICAvLyBzaW5jZSBhIHNhbWUgbm9kZSBjYW5ub3QgYmUgaW4gdHdvIHBsYWNlcyBhdCBvbmNlIHdlIHdpbGwgcmVtb3ZlXG4gICAgICAvLyBib3RoIHRoZW4gcmVpbnNlcnQgdGhlbVxuICAgICAgY29uc3QgW3YxXSA9IGFycmF5LnNwbGljZShpbmRleDEsIDEpXG4gICAgICBjb25zdCBbdjJdID0gYXJyYXkuc3BsaWNlKGluZGV4MiAtIDEsIDEpXG4gICAgICBhcnJheS5zcGxpY2UoaW5kZXgxLCAwLCB2MilcbiAgICAgIGFycmF5LnNwbGljZShpbmRleDIsIDAsIHYxKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICksXG5cbiAgY3JlYXRlOiA8VD4oZGF0YTogVFtdKTogVFtdID0+IHRvVHJlZU5vZGUoZGF0YSksXG59XG4iLCJpbXBvcnQgeyBpc09ic2VydmFibGUsIHJlbW92ZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgdG9UcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBuYW1lc3BhY2UgYXMgbnMgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgc3RhbmRhbG9uZUFjdGlvbiB9IGZyb20gXCIuL3N0YW5kYWxvbmVBY3Rpb25zXCJcblxuY29uc3QgbmFtZXNwYWNlID0gYCR7bnN9L29iamVjdEFjdGlvbnNgXG5cbmV4cG9ydCBjb25zdCBvYmplY3RBY3Rpb25zID0ge1xuICBzZXQ6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6c2V0YCxcbiAgICA8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIFQ+KHRhcmdldDogVCwga2V5OiBLLCB2YWx1ZTogVFtLXSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZSh0YXJnZXQpKSB7XG4gICAgICAgIHNldCh0YXJnZXQsIGtleSwgdmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICApLFxuXG4gIGFzc2lnbjogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9Ojphc3NpZ25gLFxuICAgIDxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFQsIHBhcnRpYWxPYmplY3Q6IFBhcnRpYWw8VD4pOiB2b2lkID0+IHtcbiAgICAgIGFzc2VydElzT2JqZWN0KHBhcnRpYWxPYmplY3QsIFwicGFydGlhbE9iamVjdFwiKVxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBhcnRpYWxPYmplY3QpXG5cbiAgICAgIGlmIChpc09ic2VydmFibGUodGFyZ2V0KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgc2V0KHRhcmdldCwga2V5LCAocGFydGlhbE9iamVjdCBhcyBhbnkpW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICA7KHRhcmdldCBhcyBhbnkpW2tleV0gPSAocGFydGlhbE9iamVjdCBhcyBhbnkpW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgKSxcblxuICBkZWxldGU6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6ZGVsZXRlYCxcbiAgICA8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIFQ+KHRhcmdldDogVCwga2V5OiBLKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gcmVtb3ZlKHRhcmdldCwga2V5IGFzIGFueSlcbiAgICB9XG4gICksXG5cbiAgY2FsbDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpjYWxsYCxcbiAgICA8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIFQ+KFxuICAgICAgdGFyZ2V0OiBULFxuICAgICAgbWV0aG9kTmFtZTogSyxcbiAgICAgIC4uLmFyZ3M6IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFBhcmFtZXRlcnM8VFtLXT4gOiBuZXZlclxuICAgICk6IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFJldHVyblR5cGU8VFtLXT4gOiBuZXZlciA9PiB7XG4gICAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgfVxuICApLFxuXG4gIGNyZWF0ZTogPFQgZXh0ZW5kcyBvYmplY3Q+KGRhdGE6IFQpOiBUID0+IHRvVHJlZU5vZGUoZGF0YSksXG59XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB0YWcgZGF0YSBhY2Nlc3NvciBmb3IgYSB0YXJnZXQgb2JqZWN0IG9mIGEgY2VydGFpbiB0eXBlLlxuICogVGFnIGRhdGEgd2lsbCBiZSBsYXp5IGNyZWF0ZWQgb24gYWNjZXNzIGFuZCByZXVzZWQgZm9yIHRoZSBzYW1lIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHR5cGVwYXJhbSBUYXJnZXQgVGFyZ2V0IHR5cGUuXG4gKiBAdHlwZXBhcmFtIFRhZ0RhdGEgVGFnIGRhdGEgdHlwZS5cbiAqIEBwYXJhbSB0YWdEYXRhQ29uc3RydWN0b3IgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0aGUgZmlyc3QgdGltZSB0aGUgdGFnXG4gKiBmb3IgYSBnaXZlbiBvYmplY3QgaXMgcmVxdWVzdGVkLlxuICogQHJldHVybnMgVGhlIHRhZyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZzxUYXJnZXQgZXh0ZW5kcyBvYmplY3QsIFRhZ0RhdGE+KFxuICB0YWdEYXRhQ29uc3RydWN0b3I6ICh0YXJnZXQ6IFRhcmdldCkgPT4gVGFnRGF0YVxuKToge1xuICBmb3IodGFyZ2V0OiBUYXJnZXQpOiBUYWdEYXRhXG59IHtcbiAgY29uc3QgbWFwID0gbmV3IFdlYWtNYXA8VGFyZ2V0LCBUYWdEYXRhPigpXG5cbiAgcmV0dXJuIHtcbiAgICBmb3IodGFyZ2V0KTogVGFnRGF0YSB7XG4gICAgICBpZiAoIW1hcC5oYXModGFyZ2V0KSkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGFnRGF0YUNvbnN0cnVjdG9yKHRhcmdldClcbiAgICAgICAgbWFwLnNldCh0YXJnZXQsIGRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbWFwLmdldCh0YXJnZXQpIVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGFjdGlvbixcbiAgSU1hcFdpbGxDaGFuZ2UsXG4gIGludGVyY2VwdCxcbiAgSU9iamVjdERpZENoYW5nZSxcbiAgSU9ic2VydmFibGVBcnJheSxcbiAgaXNPYnNlcnZhYmxlQXJyYXksXG4gIGlzT2JzZXJ2YWJsZU9iamVjdCxcbiAgb2JzZXJ2YWJsZSxcbiAgT2JzZXJ2YWJsZU1hcCxcbiAgb2JzZXJ2ZSxcbiAgcmVtb3ZlLFxuICBzZXQsXG59IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIGFzc2VydElzTWFwLFxuICBhc3NlcnRJc09ic2VydmFibGVBcnJheSxcbiAgYXNzZXJ0SXNPYnNlcnZhYmxlT2JqZWN0LFxuICBmYWlsdXJlLFxuICBnZXRNb2J4VmVyc2lvbixcbiAgaW5EZXZNb2RlLFxuICBpc0FycmF5LFxufSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgdGFnIH0gZnJvbSBcIi4uL3V0aWxzL3RhZ1wiXG5cbmNvbnN0IG9ic2VydmFibGVNYXBCYWNrZWRCeU9ic2VydmFibGVPYmplY3QgPSBhY3Rpb24oXG4gIDxUPihcbiAgICBvYmo6IG9iamVjdFxuICApOiBPYnNlcnZhYmxlTWFwPHN0cmluZywgVD4gJiB7XG4gICAgZGF0YU9iamVjdDogdHlwZW9mIG9ialxuICB9ID0+IHtcbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIGlmICghaXNPYnNlcnZhYmxlT2JqZWN0KG9iaikpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcImFzc2VydGlvbiBmYWlsZWQ6IGV4cGVjdGVkIGFuIG9ic2VydmFibGUgb2JqZWN0XCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWFwID0gb2JzZXJ2YWJsZS5tYXAoKVxuICAgIDsobWFwIGFzIGFueSkuZGF0YU9iamVjdCA9IG9ialxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICBtYXAuc2V0KGssIChvYmogYXMgYW55KVtrXSlcbiAgICB9XG5cbiAgICBsZXQgbWFwQWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBvYmplY3RBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG5cbiAgICAvLyB3aGVuIHRoZSBvYmplY3QgY2hhbmdlcyB0aGUgbWFwIGNoYW5nZXNcbiAgICBvYnNlcnZlKFxuICAgICAgb2JqLFxuICAgICAgYWN0aW9uKChjaGFuZ2U6IElPYmplY3REaWRDaGFuZ2UpID0+IHtcbiAgICAgICAgaWYgKG1hcEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBvYmplY3RBbHJlYWR5Q2hhbmdlZCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgICBtYXAuc2V0KGNoYW5nZS5uYW1lLCBjaGFuZ2UubmV3VmFsdWUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgICAgICBtYXAuZGVsZXRlKGNoYW5nZS5uYW1lKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBvYmplY3RBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgLy8gd2hlbiB0aGUgbWFwIGNoYW5nZXMgYWxzbyBjaGFuZ2UgdGhlIG9iamVjdFxuICAgIGludGVyY2VwdChcbiAgICAgIG1hcCxcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBJTWFwV2lsbENoYW5nZTxzdHJpbmcsIFQ+KSA9PiB7XG4gICAgICAgIGlmIChtYXBBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqZWN0QWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gY2hhbmdlXG4gICAgICAgIH1cblxuICAgICAgICBtYXBBbHJlYWR5Q2hhbmdlZCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgICBzZXQob2JqLCBjaGFuZ2UubmFtZSwgY2hhbmdlLm5ld1ZhbHVlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwiZGVsZXRlXCI6IHtcbiAgICAgICAgICAgICAgcmVtb3ZlKG9iaiwgY2hhbmdlLm5hbWUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIG1hcEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gbWFwIGFzIGFueVxuICB9XG4pXG5cbmNvbnN0IG9ic2VydmFibGVNYXBCYWNrZWRCeU9ic2VydmFibGVBcnJheSA9IGFjdGlvbihcbiAgPFQ+KFxuICAgIGFycmF5OiBJT2JzZXJ2YWJsZUFycmF5PFtzdHJpbmcsIFRdPlxuICApOiBPYnNlcnZhYmxlTWFwPHN0cmluZywgVD4gJiB7IGRhdGFPYmplY3Q6IHR5cGVvZiBhcnJheSB9ID0+IHtcbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIGlmICghaXNPYnNlcnZhYmxlQXJyYXkoYXJyYXkpKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiBleHBlY3RlZCBhbiBvYnNlcnZhYmxlIGFycmF5XCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1hcDogT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFQ+XG4gICAgaWYgKGdldE1vYnhWZXJzaW9uKCkgPj0gNikge1xuICAgICAgbWFwID0gb2JzZXJ2YWJsZS5tYXAoYXJyYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcCA9IG9ic2VydmFibGUubWFwKClcbiAgICAgIGFycmF5LmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBtYXAuc2V0KGssIHYpXG4gICAgICB9KVxuICAgIH1cbiAgICA7KG1hcCBhcyBhbnkpLmRhdGFPYmplY3QgPSBhcnJheVxuXG4gICAgaWYgKG1hcC5zaXplICE9PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhcnJheXMgYmFja2luZyBhIG1hcCBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGUga2V5c1wiKVxuICAgIH1cblxuICAgIGxldCBtYXBBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgbGV0IGFycmF5QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuXG4gICAgLy8gZm9yIHNwZWVkIHJlYXNvbnMgd2Ugd2lsbCBqdXN0IGFzc3VtZSBkaXN0aW5jdCB2YWx1ZXMgYXJlIG9ubHkgb25jZSBpbiB0aGUgYXJyYXlcbiAgICAvLyBhbHNvIHdlIGFzc3VtZSB0dXBsZXMgdGhlbXNlbHZlcyBhcmUgaW1tdXRhYmxlXG5cbiAgICAvLyB3aGVuIHRoZSBhcnJheSBjaGFuZ2VzIHRoZSBtYXAgY2hhbmdlc1xuICAgIG9ic2VydmUoXG4gICAgICBhcnJheSxcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBhbnkgLypJQXJyYXlEaWRDaGFuZ2U8W3N0cmluZywgVF0+Ki8pID0+IHtcbiAgICAgICAgaWYgKG1hcEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUFscmVhZHlDaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzcGxpY2VcIjoge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNoYW5nZS5yZW1vdmVkXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKHJlbW92ZWRbaV1bMF0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gY2hhbmdlLmFkZGVkXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgbWFwLnNldChhZGRlZFtpXVswXSwgYWRkZWRbaV1bMV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICAgIG1hcC5kZWxldGUoY2hhbmdlLm9sZFZhbHVlWzBdKVxuICAgICAgICAgICAgICBtYXAuc2V0KGNoYW5nZS5uZXdWYWx1ZVswXSwgY2hhbmdlLm5ld1ZhbHVlWzFdKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhcnJheUFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICAvLyB3aGVuIHRoZSBtYXAgY2hhbmdlcyBhbHNvIGNoYW5nZSB0aGUgYXJyYXlcbiAgICBpbnRlcmNlcHQoXG4gICAgICBtYXAsXG4gICAgICBhY3Rpb24oKGNoYW5nZTogSU1hcFdpbGxDaGFuZ2U8c3RyaW5nLCBUPikgPT4ge1xuICAgICAgICBpZiAobWFwQWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycmF5QWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gY2hhbmdlXG4gICAgICAgIH1cblxuICAgICAgICBtYXBBbHJlYWR5Q2hhbmdlZCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSB3aG9sZSB0dXBsZSB0byBrZWVwIHR1cGxlIGltbXV0YWJpbGl0eVxuICAgICAgICAgICAgICBjb25zdCBpID0gYXJyYXkuZmluZEluZGV4KChpKSA9PiBpWzBdID09PSBjaGFuZ2UubmFtZSlcbiAgICAgICAgICAgICAgYXJyYXlbaV0gPSBbY2hhbmdlLm5hbWUsIGNoYW5nZS5uZXdWYWx1ZSFdXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgICAgICBhcnJheS5wdXNoKFtjaGFuZ2UubmFtZSwgY2hhbmdlLm5ld1ZhbHVlIV0pXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJkZWxldGVcIjoge1xuICAgICAgICAgICAgICBjb25zdCBpID0gYXJyYXkuZmluZEluZGV4KChpKSA9PiBpWzBdID09PSBjaGFuZ2UubmFtZSlcbiAgICAgICAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIG1hcEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gbWFwIGFzIGFueVxuICB9XG4pXG5cbmNvbnN0IGFzTWFwVGFnID0gdGFnKChvYmpPckFycmF5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgQXJyYXk8W3N0cmluZywgYW55XT4pID0+IHtcbiAgaWYgKGlzQXJyYXkob2JqT3JBcnJheSkpIHtcbiAgICBhc3NlcnRJc09ic2VydmFibGVBcnJheShvYmpPckFycmF5LCBcIm9iak9yQXJyYXlcIilcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU1hcEJhY2tlZEJ5T2JzZXJ2YWJsZUFycmF5KG9iak9yQXJyYXkpXG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0SXNPYnNlcnZhYmxlT2JqZWN0KG9iak9yQXJyYXksIFwib2JqT3JBcnJheVwiKVxuICAgIHJldHVybiBvYnNlcnZhYmxlTWFwQmFja2VkQnlPYnNlcnZhYmxlT2JqZWN0KG9iak9yQXJyYXkpXG4gIH1cbn0pXG5cbi8qKlxuICogV3JhcHMgYW4gb2JzZXJ2YWJsZSBvYmplY3Qgb3IgYSB0dXBsZSBhcnJheSB0byBvZmZlciBhIG1hcCBsaWtlIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgQXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc01hcDxLLCBWPihcbiAgYXJyYXk6IEFycmF5PFtLLCBWXT5cbik6IE9ic2VydmFibGVNYXA8SywgVj4gJiB7IGRhdGFPYmplY3Q6IEFycmF5PFtLLCBWXT4gfVxuXG4vKipcbiAqIFdyYXBzIGFuIG9ic2VydmFibGUgb2JqZWN0IG9yIGEgdHVwbGUgYXJyYXkgdG8gb2ZmZXIgYSBtYXAgbGlrZSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIG9iamVjdCBPYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc01hcDxUPihcbiAgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBUPlxuKTogT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFQ+ICYgeyBkYXRhT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBUPiB9XG5cbi8qKlxuICogV3JhcHMgYW4gb2JzZXJ2YWJsZSBvYmplY3Qgb3IgYSB0dXBsZSBhcnJheSB0byBvZmZlciBhIG1hcCBsaWtlIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqT3JBcnJheSBPYmplY3Qgb3IgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc01hcChcbiAgb2JqT3JBcnJheTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBBcnJheTxbdW5rbm93biwgdW5rbm93bl0+XG4pOiBPYnNlcnZhYmxlTWFwPHVua25vd24sIHVua25vd24+ICYgeyBkYXRhT2JqZWN0OiB0eXBlb2Ygb2JqT3JBcnJheSB9IHtcbiAgcmV0dXJuIGFzTWFwVGFnLmZvcihvYmpPckFycmF5KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG1hcCB0byBhbiBvYmplY3QuIElmIHRoZSBtYXAgaXMgYSBjb2xsZWN0aW9uIHdyYXBwZXIgaXQgd2lsbCByZXR1cm4gdGhlIGJhY2tlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIG1hcFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9PYmplY3Q8VD4obWFwOiBNYXA8c3RyaW5nLCBUPik6IFJlY29yZDxzdHJpbmcsIFQ+IHtcbiAgYXNzZXJ0SXNNYXAobWFwLCBcIm1hcFwiKVxuXG4gIGNvbnN0IGRhdGFPYmplY3QgPSAobWFwIGFzIGFueSkuZGF0YU9iamVjdFxuICBpZiAoZGF0YU9iamVjdCAmJiAhaXNBcnJheShkYXRhT2JqZWN0KSkge1xuICAgIHJldHVybiBkYXRhT2JqZWN0XG4gIH1cblxuICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIFQ+ID0ge31cbiAgZm9yIChjb25zdCBrIG9mIG1hcC5rZXlzKCkpIHtcbiAgICBvYmpba10gPSBtYXAuZ2V0KGspIVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbWFwIHRvIGFuIGFycmF5LiBJZiB0aGUgbWFwIGlzIGEgY29sbGVjdGlvbiB3cmFwcGVyIGl0IHdpbGwgcmV0dXJuIHRoZSBiYWNrZWQgYXJyYXkuXG4gKlxuICogQHBhcmFtIG1hcFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9BcnJheTxLLCBWPihtYXA6IE1hcDxLLCBWPik6IEFycmF5PFtLLCBWXT4ge1xuICBhc3NlcnRJc01hcChtYXAsIFwibWFwXCIpXG5cbiAgY29uc3QgZGF0YU9iamVjdCA9IChtYXAgYXMgYW55KS5kYXRhT2JqZWN0XG4gIGlmIChkYXRhT2JqZWN0ICYmIGlzQXJyYXkoZGF0YU9iamVjdCkpIHtcbiAgICByZXR1cm4gZGF0YU9iamVjdFxuICB9XG5cbiAgY29uc3QgYXJyOiBbSywgVl1bXSA9IFtdXG4gIGZvciAoY29uc3QgayBvZiBtYXAua2V5cygpKSB7XG4gICAgYXJyLnB1c2goW2ssIG1hcC5nZXQoaykhXSlcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cbiIsImltcG9ydCB0eXBlIHsgTW9kZWxQcm9wVHJhbnNmb3JtIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgYXNNYXAgfSBmcm9tIFwiLi4vd3JhcHBlcnMvYXNNYXBcIlxuXG5jb25zdCBfb2JqZWN0VG9NYXBUcmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgTWFwPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICB0cmFuc2Zvcm0oeyBvcmlnaW5hbFZhbHVlOiBvYmosIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWU6IGNhY2hlZE1hcCB9KSB7XG4gICAgcmV0dXJuIGNhY2hlZE1hcCA/PyBhc01hcChvYmopXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlOiBtYXAgfSkge1xuICAgIC8vIGRvIG5vdCBjYWNoZSBtYXAgPC0+IG9iaiByZWxhdGlvbnNoaXBcblxuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgIGZvciAoY29uc3QgayBvZiBtYXAua2V5cygpKSB7XG4gICAgICBvYmpba10gPSBtYXAuZ2V0KGspIVxuICAgIH1cblxuICAgIHJldHVybiBvYmpcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IG9iamVjdFRvTWFwVHJhbnNmb3JtID0gPFQ+KCkgPT5cbiAgX29iamVjdFRvTWFwVHJhbnNmb3JtIGFzIE1vZGVsUHJvcFRyYW5zZm9ybTxSZWNvcmQ8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgVD4+XG5cbmNvbnN0IF9hcnJheVRvTWFwVHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08QXJyYXk8W3Vua25vd24sIHVua25vd25dPiwgTWFwPHVua25vd24sIHVua25vd24+PiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZTogYXJyLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiBjYWNoZWRNYXAgfSkge1xuICAgIHJldHVybiBjYWNoZWRNYXAgPz8gYXNNYXAoYXJyKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZTogbWFwIH0pIHtcbiAgICAvLyBkbyBub3QgY2FjaGUgbWFwIDwtPiBhcnIgcmVsYXRpb25zaGlwXG5cbiAgICBjb25zdCBhcnI6IEFycmF5PFt1bmtub3duLCB1bmtub3duXT4gPSBbXVxuICAgIGZvciAoY29uc3QgayBvZiBtYXAua2V5cygpKSB7XG4gICAgICBhcnIucHVzaChbaywgbWFwLmdldChrKSFdKVxuICAgIH1cblxuICAgIHJldHVybiBhcnJcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IGFycmF5VG9NYXBUcmFuc2Zvcm0gPSA8SywgVj4oKSA9PlxuICBfYXJyYXlUb01hcFRyYW5zZm9ybSBhcyBNb2RlbFByb3BUcmFuc2Zvcm08QXJyYXk8W0ssIFZdPiwgTWFwPEssIFY+PlxuIiwiaW1wb3J0IHtcbiAgYWN0aW9uLFxuICBpbnRlcmNlcHQsXG4gIElPYnNlcnZhYmxlQXJyYXksXG4gIElTZXRXaWxsQ2hhbmdlLFxuICBpc09ic2VydmFibGVBcnJheSxcbiAgb2JzZXJ2YWJsZSxcbiAgT2JzZXJ2YWJsZVNldCxcbiAgb2JzZXJ2ZSxcbn0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXksIGFzc2VydElzU2V0LCBmYWlsdXJlLCBnZXRNb2J4VmVyc2lvbiwgaW5EZXZNb2RlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHRhZyB9IGZyb20gXCIuLi91dGlscy90YWdcIlxuXG5jb25zdCBvYnNlcnZhYmxlU2V0QmFja2VkQnlPYnNlcnZhYmxlQXJyYXkgPSBhY3Rpb24oXG4gIDxUPihhcnJheTogSU9ic2VydmFibGVBcnJheTxUPik6IE9ic2VydmFibGVTZXQ8VD4gJiB7IGRhdGFPYmplY3Q6IHR5cGVvZiBhcnJheSB9ID0+IHtcbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIGlmICghaXNPYnNlcnZhYmxlQXJyYXkoYXJyYXkpKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiBleHBlY3RlZCBhbiBvYnNlcnZhYmxlIGFycmF5XCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNldDogT2JzZXJ2YWJsZVNldDxUPlxuICAgIGlmIChnZXRNb2J4VmVyc2lvbigpID49IDYpIHtcbiAgICAgIHNldCA9IG9ic2VydmFibGUuc2V0KGFycmF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXQgPSBvYnNlcnZhYmxlLnNldCgpXG4gICAgICBhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIHNldC5hZGQoaXRlbSlcbiAgICAgIH0pXG4gICAgfVxuICAgIDsoc2V0IGFzIGFueSkuZGF0YU9iamVjdCA9IGFycmF5XG5cbiAgICBpZiAoc2V0LnNpemUgIT09IGFycmF5Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImFycmF5cyBiYWNraW5nIGEgc2V0IGNhbm5vdCBjb250YWluIGR1cGxpY2F0ZSB2YWx1ZXNcIilcbiAgICB9XG5cbiAgICBsZXQgc2V0QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBhcnJheUFscmVhZHlDaGFuZ2VkID0gZmFsc2VcblxuICAgIC8vIGZvciBzcGVlZCByZWFzb25zIHdlIHdpbGwganVzdCBhc3N1bWUgZGlzdGluY3QgdmFsdWVzIGFyZSBvbmx5IG9uY2UgaW4gdGhlIGFycmF5XG5cbiAgICAvLyB3aGVuIHRoZSBhcnJheSBjaGFuZ2VzIHRoZSBzZXQgY2hhbmdlc1xuICAgIG9ic2VydmUoXG4gICAgICBhcnJheSxcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBhbnkgLypJQXJyYXlEaWRDaGFuZ2U8VD4qLykgPT4ge1xuICAgICAgICBpZiAoc2V0QWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGFycmF5QWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3BsaWNlXCI6IHtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjaGFuZ2UucmVtb3ZlZFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShyZW1vdmVkW2ldKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRlZCA9IGNoYW5nZS5hZGRlZFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHNldC5hZGQoYWRkZWRbaV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICAgIHNldC5kZWxldGUoY2hhbmdlLm9sZFZhbHVlKVxuICAgICAgICAgICAgICBzZXQuYWRkKGNoYW5nZS5uZXdWYWx1ZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgLy8gd2hlbiB0aGUgc2V0IGNoYW5nZXMgYWxzbyBjaGFuZ2UgdGhlIGFycmF5XG4gICAgaW50ZXJjZXB0KFxuICAgICAgc2V0LFxuICAgICAgYWN0aW9uKChjaGFuZ2U6IElTZXRXaWxsQ2hhbmdlPFQ+KSA9PiB7XG4gICAgICAgIGlmIChzZXRBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyYXlBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEFscmVhZHlDaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgICAgIGFycmF5LnB1c2goY2hhbmdlLm5ld1ZhbHVlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwiZGVsZXRlXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGFycmF5LmluZGV4T2YoY2hhbmdlLm9sZFZhbHVlKVxuICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2hhbmdlXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIHJldHVybiBzZXQgYXMgYW55XG4gIH1cbilcblxuY29uc3QgYXNTZXRUYWcgPSB0YWcoKGFycmF5OiBBcnJheTxhbnk+KSA9PiB7XG4gIGFzc2VydElzT2JzZXJ2YWJsZUFycmF5KGFycmF5LCBcImFycmF5XCIpXG4gIHJldHVybiBvYnNlcnZhYmxlU2V0QmFja2VkQnlPYnNlcnZhYmxlQXJyYXkoYXJyYXkpXG59KVxuXG4vKipcbiAqIFdyYXBzIGFuIG9ic2VydmFibGUgYXJyYXkgdG8gb2ZmZXIgYSBzZXQgbGlrZSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc1NldDxUPihhcnJheTogQXJyYXk8VD4pOiBPYnNlcnZhYmxlU2V0PFQ+ICYgeyBkYXRhT2JqZWN0OiB0eXBlb2YgYXJyYXkgfSB7XG4gIHJldHVybiBhc1NldFRhZy5mb3IoYXJyYXkpIGFzIGFueVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc2V0IHRvIGFuIGFycmF5LiBJZiB0aGUgc2V0IGlzIGEgY29sbGVjdGlvbiB3cmFwcGVyIGl0IHdpbGwgcmV0dXJuIHRoZSBiYWNrZWQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHNldFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VG9BcnJheTxUPihzZXQ6IFNldDxUPik6IEFycmF5PFQ+IHtcbiAgYXNzZXJ0SXNTZXQoc2V0LCBcInNldFwiKVxuXG4gIGNvbnN0IGRhdGFPYmplY3QgPSAoc2V0IGFzIGFueSkuZGF0YU9iamVjdFxuICBpZiAoZGF0YU9iamVjdCkge1xuICAgIHJldHVybiBkYXRhT2JqZWN0XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShzZXQudmFsdWVzKCkpXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsUHJvcFRyYW5zZm9ybSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGFzU2V0IH0gZnJvbSBcIi4uL3dyYXBwZXJzL2FzU2V0XCJcblxuY29uc3QgX2FycmF5VG9TZXRUcmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxBcnJheTx1bmtub3duPiwgU2V0PHVua25vd24+PiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZTogYXJyLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiBjYWNoZWRTZXQgfSkge1xuICAgIHJldHVybiBjYWNoZWRTZXQgPz8gYXNTZXQoYXJyKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZTogc2V0IH0pIHtcbiAgICAvLyBkbyBub3QgY2FjaGUgc2V0IDwtPiBhcnIgcmVsYXRpb25zaGlwXG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZXQudmFsdWVzKCkpXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBhcnJheVRvU2V0VHJhbnNmb3JtID0gPFQ+KCkgPT5cbiAgX2FycmF5VG9TZXRUcmFuc2Zvcm0gYXMgTW9kZWxQcm9wVHJhbnNmb3JtPEFycmF5PFQ+LCBTZXQ8VD4+XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsUHJvcFRyYW5zZm9ybSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcblxuY29uc3QgX3N0cmluZ1RvQmlnSW50VHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08c3RyaW5nLCBiaWdpbnQ+ID0ge1xuICB0cmFuc2Zvcm0oeyBvcmlnaW5hbFZhbHVlLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSA/PyBCaWdJbnQob3JpZ2luYWxWYWx1ZSlcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWUsIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSB9KSB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm1lZFZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICBjYWNoZVRyYW5zZm9ybWVkVmFsdWUoKVxuICAgIH1cbiAgICByZXR1cm4gdHJhbnNmb3JtZWRWYWx1ZS50b1N0cmluZygpXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0JpZ0ludFRyYW5zZm9ybSA9ICgpID0+IF9zdHJpbmdUb0JpZ0ludFRyYW5zZm9ybVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1tdXRhYmxlRGF0ZVxuICBleHRlbmRzIE9taXQ8XG4gICAgRGF0ZSxcbiAgICB8IFwic2V0VGltZVwiXG4gICAgfCBcInNldE1pbGxpc2Vjb25kc1wiXG4gICAgfCBcInNldFVUQ01pbGxpc2Vjb25kc1wiXG4gICAgfCBcInNldFNlY29uZHNcIlxuICAgIHwgXCJzZXRVVENTZWNvbmRzXCJcbiAgICB8IFwic2V0TWludXRlc1wiXG4gICAgfCBcInNldFVUQ01pbnV0ZXNcIlxuICAgIHwgXCJzZXRIb3Vyc1wiXG4gICAgfCBcInNldFVUQ0hvdXJzXCJcbiAgICB8IFwic2V0RGF0ZVwiXG4gICAgfCBcInNldFVUQ0RhdGVcIlxuICAgIHwgXCJzZXRNb250aFwiXG4gICAgfCBcInNldFVUQ01vbnRoXCJcbiAgICB8IFwic2V0RnVsbFllYXJcIlxuICAgIHwgXCJzZXRVVENGdWxsWWVhclwiXG4gID4ge31cblxuY29uc3QgZXJyTWVzc2FnZSA9IFwidGhpcyBEYXRlIG9iamVjdCBpcyBpbW11dGFibGVcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgSW1tdXRhYmxlRGF0ZSBleHRlbmRzIERhdGUge1xuICAvLyBkaXNhYmxlIG11dGFibGUgbWV0aG9kc1xuXG4gIHNldFRpbWUoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRNaWxsaXNlY29uZHMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRVVENNaWxsaXNlY29uZHMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRTZWNvbmRzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDU2Vjb25kcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldE1pbnV0ZXMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRVVENNaW51dGVzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0SG91cnMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRVVENIb3VycygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldERhdGUoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRVVENEYXRlKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0TW9udGgoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRVVENNb250aCgpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldEZ1bGxZZWFyKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDRnVsbFllYXIoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTW9kZWxQcm9wVHJhbnNmb3JtIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgSW1tdXRhYmxlRGF0ZSB9IGZyb20gXCIuL0ltbXV0YWJsZURhdGVcIlxuXG5jb25zdCBfdGltZXN0YW1wVG9EYXRlVHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08bnVtYmVyLCBEYXRlPiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZSwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSB9KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgPz8gbmV3IEltbXV0YWJsZURhdGUob3JpZ2luYWxWYWx1ZSlcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWUsIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSB9KSB7XG4gICAgaWYgKHRyYW5zZm9ybWVkVmFsdWUgaW5zdGFuY2VvZiBJbW11dGFibGVEYXRlKSB7XG4gICAgICBjYWNoZVRyYW5zZm9ybWVkVmFsdWUoKVxuICAgIH1cbiAgICByZXR1cm4gK3RyYW5zZm9ybWVkVmFsdWVcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IHRpbWVzdGFtcFRvRGF0ZVRyYW5zZm9ybSA9ICgpID0+IF90aW1lc3RhbXBUb0RhdGVUcmFuc2Zvcm1cblxuY29uc3QgX2lzb1N0cmluZ1RvRGF0ZVRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPHN0cmluZywgRGF0ZT4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWUsIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlID8/IG5ldyBJbW11dGFibGVEYXRlKG9yaWdpbmFsVmFsdWUpXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlLCBjYWNoZVRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIGlmICh0cmFuc2Zvcm1lZFZhbHVlIGluc3RhbmNlb2YgSW1tdXRhYmxlRGF0ZSkge1xuICAgICAgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKClcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkVmFsdWUudG9JU09TdHJpbmcoKVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgaXNvU3RyaW5nVG9EYXRlVHJhbnNmb3JtID0gKCkgPT4gX2lzb1N0cmluZ1RvRGF0ZVRyYW5zZm9ybVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjb21wdXRlZCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHBhdGhUb1RhcmdldFBhdGhJZHMgfSBmcm9tIFwiLi4vYWN0aW9uTWlkZGxld2FyZXMvdXRpbHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVBhdGgsIHJlc29sdmVQYXRoQ2hlY2tpbmdJZHMsIHNraXBJZENoZWNraW5nIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB0eXBlIHsgUGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaC9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgYXBwbHlTbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9hcHBseVNuYXBzaG90XCJcbmltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuLi9zbmFwc2hvdC9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBkZWVwRXF1YWxzIH0gZnJvbSBcIi4vZGVlcEVxdWFsc1wiXG5cbi8qKlxuICogQSBjbGFzcyB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbm0gb2YgZHJhZnQuXG4gKiBVc2UgYGRyYWZ0YCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgRGF0YSB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgRHJhZnQ8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogRHJhZnQgZGF0YSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBUXG5cbiAgLyoqXG4gICAqIENvbW1pdHMgY3VycmVudCBkcmFmdCBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAqL1xuICBAYWN0aW9uXG4gIGNvbW1pdCgpOiB2b2lkIHtcbiAgICBhcHBseVNuYXBzaG90KHRoaXMub3JpZ2luYWxEYXRhLCBnZXRTbmFwc2hvdCh0aGlzLmRhdGEpKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnRpYWxseSBjb21taXRzIGN1cnJlbnQgZHJhZnQgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgKiBJZiB0aGUgcGF0aCBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gZWl0aGVyIHRoZSBkcmFmdCBvciB0aGUgb3JpZ2luYWwgb2JqZWN0IGl0IHdpbGwgdGhyb3cuXG4gICAqIE5vdGUgdGhhdCBtb2RlbCBJRHMgYXJlIGNoZWNrZWQgdG8gYmUgdGhlIHNhbWUgd2hlbiByZXNvbHZpbmcgdGhlIHBhdGhzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGNvbW1pdC5cbiAgICovXG4gIEBhY3Rpb25cbiAgY29tbWl0QnlQYXRoKHBhdGg6IFBhdGgpOiB2b2lkIHtcbiAgICBjb25zdCBkcmFmdFRhcmdldCA9IHJlc29sdmVQYXRoKHRoaXMuZGF0YSwgcGF0aClcbiAgICBpZiAoIWRyYWZ0VGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbiBkcmFmdCBvYmplY3RgKVxuICAgIH1cblxuICAgIGNvbnN0IGRyYWZ0UGF0aElkcyA9IHBhdGhUb1RhcmdldFBhdGhJZHNJZ25vcmluZ0xhc3QodGhpcy5kYXRhLCBwYXRoKVxuXG4gICAgY29uc3Qgb3JpZ2luYWxUYXJnZXQgPSByZXNvbHZlUGF0aENoZWNraW5nSWRzKHRoaXMub3JpZ2luYWxEYXRhLCBwYXRoLCBkcmFmdFBhdGhJZHMpXG4gICAgaWYgKCFvcmlnaW5hbFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW4gb3JpZ2luYWwgb2JqZWN0YClcbiAgICB9XG5cbiAgICBhcHBseVBhdGNoZXModGhpcy5vcmlnaW5hbERhdGEsIFtcbiAgICAgIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICB2YWx1ZTogZ2V0U25hcHNob3QoZHJhZnRUYXJnZXQudmFsdWUpLFxuICAgICAgfSxcbiAgICBdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZHJhZnQgdG8gYmUgYW4gZXhhY3QgY29weSBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgKi9cbiAgQGFjdGlvblxuICByZXNldCgpOiB2b2lkIHtcbiAgICBhcHBseVNuYXBzaG90KHRoaXMuZGF0YSwgdGhpcy5vcmlnaW5hbFNuYXBzaG90KVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnRpYWxseSByZXNldHMgY3VycmVudCBkcmFmdCBjaGFuZ2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAqIElmIHRoZSBwYXRoIGNhbm5vdCBiZSByZXNvbHZlZCBpbiBlaXRoZXIgdGhlIGRyYWZ0IG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgaXQgd2lsbCB0aHJvdy5cbiAgICogTm90ZSB0aGF0IG1vZGVsIElEcyBhcmUgY2hlY2tlZCB0byBiZSB0aGUgc2FtZSB3aGVuIHJlc29sdmluZyB0aGUgcGF0aHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gcmVzZXQuXG4gICAqL1xuICBAYWN0aW9uXG4gIHJlc2V0QnlQYXRoKHBhdGg6IFBhdGgpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbFRhcmdldCA9IHJlc29sdmVQYXRoKHRoaXMub3JpZ2luYWxEYXRhLCBwYXRoKVxuICAgIGlmICghb3JpZ2luYWxUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gY291bGQgbm90IGJlIHJlc29sdmVkIGluIG9yaWdpbmFsIG9iamVjdGApXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxQYXRoSWRzID0gcGF0aFRvVGFyZ2V0UGF0aElkc0lnbm9yaW5nTGFzdCh0aGlzLm9yaWdpbmFsRGF0YSwgcGF0aClcblxuICAgIGNvbnN0IGRyYWZ0VGFyZ2V0ID0gcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyh0aGlzLmRhdGEsIHBhdGgsIG9yaWdpbmFsUGF0aElkcylcbiAgICBpZiAoIWRyYWZ0VGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbiBkcmFmdCBvYmplY3RgKVxuICAgIH1cblxuICAgIGFwcGx5UGF0Y2hlcyh0aGlzLmRhdGEsIFtcbiAgICAgIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICB2YWx1ZTogZ2V0U25hcHNob3Qob3JpZ2luYWxUYXJnZXQudmFsdWUpLFxuICAgICAgfSxcbiAgICBdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBkcmFmdCBoYXMgY2hhbmdlZCBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgb2JqZWN0LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgaXNEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbHMoZ2V0U25hcHNob3QodGhpcy5kYXRhKSwgdGhpcy5vcmlnaW5hbFNuYXBzaG90KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvZiB0aGUgZHJhZnQgaGFzIGNoYW5nZWQgY29tcGFyZWQgdG8gdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICogSWYgdGhlIHBhdGggY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBkcmFmdCBpdCB3aWxsIHRocm93LlxuICAgKiBJZiB0aGUgcGF0aCBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gdGhlIG9yaWdpbmFsIG9iamVjdCBpdCB3aWxsIHJldHVybiBgdHJ1ZWAuXG4gICAqIE5vdGUgdGhhdCBtb2RlbCBJRHMgYXJlIGNoZWNrZWQgdG8gYmUgdGhlIHNhbWUgd2hlbiByZXNvbHZpbmcgdGhlIHBhdGhzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGNoZWNrLlxuICAgKi9cbiAgaXNEaXJ0eUJ5UGF0aChwYXRoOiBQYXRoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHJhZnRUYXJnZXQgPSByZXNvbHZlUGF0aCh0aGlzLmRhdGEsIHBhdGgpXG4gICAgaWYgKCFkcmFmdFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW4gZHJhZnQgb2JqZWN0YClcbiAgICB9XG5cbiAgICBjb25zdCBkcmFmdFBhdGhJZHMgPSBwYXRoVG9UYXJnZXRQYXRoSWRzSWdub3JpbmdMYXN0KHRoaXMuZGF0YSwgcGF0aClcblxuICAgIGNvbnN0IG9yaWdpbmFsVGFyZ2V0ID0gcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyh0aGlzLm9yaWdpbmFsRGF0YSwgcGF0aCwgZHJhZnRQYXRoSWRzKVxuICAgIGlmICghb3JpZ2luYWxUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuICFkZWVwRXF1YWxzKGRyYWZ0VGFyZ2V0LnZhbHVlLCBvcmlnaW5hbFRhcmdldC52YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmlnaW5hbCBkYXRhIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsRGF0YTogVFxuXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBvcmlnaW5hbFNuYXBzaG90KCkge1xuICAgIHJldHVybiBnZXRTbmFwc2hvdCh0aGlzLm9yaWdpbmFsRGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERyYWZ0LlxuICAgKiBEbyBub3QgdXNlIGRpcmVjdGx5LCB1c2UgYGRyYWZ0YCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gb3JpZ2luYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9yaWdpbmFsOiBUKSB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChvcmlnaW5hbCwgXCJvcmlnaW5hbFwiKVxuXG4gICAgdGhpcy5vcmlnaW5hbERhdGEgPSBvcmlnaW5hbFxuICAgIHRoaXMuZGF0YSA9IGZyb21TbmFwc2hvdCh0aGlzLm9yaWdpbmFsU25hcHNob3QsIHsgZ2VuZXJhdGVOZXdJZHM6IGZhbHNlIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgY29weSBvZiBhIHRyZWUgbm9kZSBhbmQgYWxsIGl0cyBjaGlsZHJlbi5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgRGF0YSB0eXBlLlxuICogQHBhcmFtIG9yaWdpbmFsIE9yaWdpbmFsIG5vZGUuXG4gKiBAcmV0dXJucyBUaGUgZHJhZnQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJhZnQ8VCBleHRlbmRzIG9iamVjdD4ob3JpZ2luYWw6IFQpOiBEcmFmdDxUPiB7XG4gIHJldHVybiBuZXcgRHJhZnQob3JpZ2luYWwpXG59XG5cbmZ1bmN0aW9uIHBhdGhUb1RhcmdldFBhdGhJZHNJZ25vcmluZ0xhc3Qocm9vdDogYW55LCBwYXRoOiBQYXRoKSB7XG4gIGNvbnN0IHBhdGhJZHM6IChzdHJpbmcgfCBudWxsIHwgdHlwZW9mIHNraXBJZENoZWNraW5nKVtdID0gcGF0aFRvVGFyZ2V0UGF0aElkcyhyb290LCBwYXRoKVxuICBpZiAocGF0aElkcy5sZW5ndGggPj0gMSkge1xuICAgIC8vIG5ldmVyIGNoZWNrIHRoZSBsYXN0IG9iamVjdCBpZFxuICAgIHBhdGhJZHNbcGF0aElkcy5sZW5ndGggLSAxXSA9IHNraXBJZENoZWNraW5nXG4gIH1cblxuICByZXR1cm4gcGF0aElkc1xufVxuIiwiaW1wb3J0IHsgcmVhY3Rpb24sIHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgcmVhZG9ubHlNaWRkbGV3YXJlLFxuICBSZWFkb25seU1pZGRsZXdhcmVSZXR1cm4sXG59IGZyb20gXCIuLi9hY3Rpb25NaWRkbGV3YXJlcy9yZWFkb25seU1pZGRsZXdhcmVcIlxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0XCJcbmltcG9ydCB7IGdldFBhcmVudFRvQ2hpbGRQYXRoLCByZXNvbHZlUGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IG9uUGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaC9lbWl0UGF0Y2hcIlxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuLi9wYXRjaC9QYXRjaFwiXG5pbXBvcnQgeyBQYXRjaFJlY29yZGVyLCBwYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoL3BhdGNoUmVjb3JkZXJcIlxuaW1wb3J0IHsgaXNSb290U3RvcmUsIHJlZ2lzdGVyUm9vdFN0b3JlLCB1bnJlZ2lzdGVyUm9vdFN0b3JlIH0gZnJvbSBcIi4uL3Jvb3RTdG9yZS9yb290U3RvcmVcIlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tIFwiLi4vc25hcHNob3QvY2xvbmVcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiwgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQ29udGV4dCB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHNhbmRib3ggbWFuYWdlciB0aGlzIG5vZGUgcnVucyB1bmRlciAoaWYgYW55KS5cbiAqL1xuY29uc3Qgc2FuZGJveE1hbmFnZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTYW5kYm94TWFuYWdlcj4oKVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNhbmRib3ggbWFuYWdlciBvZiBhIG5vZGUsIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRoZSBzYW5kYm94IG1hbmFnZXIgb2YgYSBub2RlLCBvciBgdW5kZWZpbmVkYCBpZiBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZVNhbmRib3hNYW5hZ2VyKG5vZGU6IG9iamVjdCk6IFNhbmRib3hNYW5hZ2VyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNhbmRib3hNYW5hZ2VyQ29udGV4dC5nZXQobm9kZSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gbm9kZSBpcyBhIHNhbmRib3hlZCBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgc2FuZGJveGVkLCBgZmFsc2VgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbmRib3hlZE5vZGUobm9kZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldE5vZGVTYW5kYm94TWFuYWdlcihub2RlKVxufVxuXG4vKipcbiAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBgU2FuZGJveE1hbmFnZXIud2l0aFNhbmRib3hgLlxuICovXG5leHBvcnQgdHlwZSBXaXRoU2FuZGJveENhbGxiYWNrPFQgZXh0ZW5kcyByZWFkb25seSBbb2JqZWN0LCAuLi5vYmplY3RbXV0sIFI+ID0gKFxuICAuLi5ub2RlczogVFxuKSA9PiBib29sZWFuIHwgeyBjb21taXQ6IGJvb2xlYW47IHJldHVybjogUiB9XG5cbi8qKlxuICogTWFuYWdlciBjbGFzcyByZXR1cm5lZCBieSBgc2FuZGJveGAgdGhhdCBhbGxvd3MgeW91IHRvIG1ha2UgY2hhbmdlcyB0byBhIHNhbmRib3ggY29weSBvZiB0aGVcbiAqIG9yaWdpbmFsIHN1YnRyZWUgYW5kIGFwcGx5IHRoZW0gdG8gdGhlIG9yaWdpbmFsIHN1YnRyZWUgb3IgcmVqZWN0IHRoZW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBTYW5kYm94TWFuYWdlciB7XG4gIC8qKlxuICAgKiBUaGUgc2FuZGJveCBjb3B5IG9mIHRoZSBvcmlnaW5hbCBzdWJ0cmVlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJ0cmVlUm9vdENsb25lOiBvYmplY3RcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGRpc3Bvc2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwb3NlcjogKCkgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgYHdpdGhTYW5kYm94YCBwYXRjaCByZWNvcmRlci4gSWYgYHVuZGVmaW5lZGAsIG5vIGB3aXRoU2FuZGJveGAgY2FsbCBpcyBiZWluZ1xuICAgKiBleGVjdXRlZC5cbiAgICovXG4gIHByaXZhdGUgd2l0aFNhbmRib3hQYXRjaFJlY29yZGVyOiBQYXRjaFJlY29yZGVyIHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGZyb20gYHJlYWRvbmx5TWlkZGxld2FyZWAgdGhhdCB3aWxsIGFsbG93IGFjdGlvbnMgdG8gYmUgc3RhcnRlZCBpbnNpZGUgdGhlIHByb3ZpZGVkXG4gICAqIGNvZGUgYmxvY2sgb24gYSByZWFkb25seSBub2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGxvd1dyaXRlOiBSZWFkb25seU1pZGRsZXdhcmVSZXR1cm5bXCJhbGxvd1dyaXRlXCJdXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2hhbmdlcyBtYWRlIGluIHRoZSBzYW5kYm94IGFyZSBjdXJyZW50bHkgYmVpbmcgY29tbWl0dGVkIHRvIHRoZSBvcmlnaW5hbCBzdWJ0cmVlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbW1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBTYW5kYm94TWFuYWdlcmAuXG4gICAqIERvIG5vdCB1c2UgZGlyZWN0bHksIHVzZSBgc2FuZGJveGAgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzdWJ0cmVlUm9vdDogb2JqZWN0KSB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gICAgLy8gd2UgdGVtcG9yYXJpbHkgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250ZXh0IG1hbmFnZXIgc28gdGhhdFxuICAgIC8vIGNsb25lZCBub2RlcyBjYW4gYWNjZXNzIGl0IHdoaWxlIGluIHRoZWlyIG9uSW5pdCBwaGFzZVxuXG4gICAgbGV0IHByZXZpb3VzQ29udGV4dERlZmF1bHQgPSBzYW5kYm94TWFuYWdlckNvbnRleHQuZ2V0RGVmYXVsdCgpXG4gICAgc2FuZGJveE1hbmFnZXJDb250ZXh0LnNldERlZmF1bHQodGhpcylcbiAgICB0cnkge1xuICAgICAgdGhpcy5zdWJ0cmVlUm9vdENsb25lID0gY2xvbmUoc3VidHJlZVJvb3QsIHsgZ2VuZXJhdGVOZXdJZHM6IGZhbHNlIH0pXG4gICAgICBzYW5kYm94TWFuYWdlckNvbnRleHQuc2V0KHRoaXMuc3VidHJlZVJvb3RDbG9uZSwgdGhpcylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH0gZmluYWxseSB7XG4gICAgICBzYW5kYm94TWFuYWdlckNvbnRleHQuc2V0RGVmYXVsdChwcmV2aW91c0NvbnRleHREZWZhdWx0KVxuICAgIH1cblxuICAgIGxldCB3YXNSUyA9IGZhbHNlXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uUlMgPSByZWFjdGlvbihcbiAgICAgICgpID0+IGlzUm9vdFN0b3JlKHN1YnRyZWVSb290KSxcbiAgICAgIChpc1JTKSA9PiB7XG4gICAgICAgIGlmIChpc1JTICE9PSB3YXNSUykge1xuICAgICAgICAgIHdhc1JTID0gaXNSU1xuICAgICAgICAgIGlmIChpc1JTKSB7XG4gICAgICAgICAgICByZWdpc3RlclJvb3RTdG9yZSh0aGlzLnN1YnRyZWVSb290Q2xvbmUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVucmVnaXN0ZXJSb290U3RvcmUodGhpcy5zdWJ0cmVlUm9vdENsb25lKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgZmlyZUltbWVkaWF0ZWx5OiB0cnVlIH1cbiAgICApXG5cbiAgICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKHN1YnRyZWVSb290LCAocGF0Y2hlcykgPT4ge1xuICAgICAgaWYgKHRoaXMud2l0aFNhbmRib3hQYXRjaFJlY29yZGVyKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJvcmlnaW5hbCBzdWJ0cmVlIG11c3Qgbm90IGNoYW5nZSB3aGlsZSAnd2l0aFNhbmRib3gnIGV4ZWN1dGVzXCIpXG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDb21taXR0aW5nKSB7XG4gICAgICAgIHRoaXMuYWxsb3dXcml0ZSgoKSA9PiB7XG4gICAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3RDbG9uZSwgcGF0Y2hlcylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgeyBhbGxvd1dyaXRlLCBkaXNwb3NlOiBkaXNwb3NlUmVhZG9ubHlNVyB9ID0gcmVhZG9ubHlNaWRkbGV3YXJlKHRoaXMuc3VidHJlZVJvb3RDbG9uZSlcbiAgICB0aGlzLmFsbG93V3JpdGUgPSBhbGxvd1dyaXRlXG5cbiAgICB0aGlzLmRpc3Bvc2VyID0gKCkgPT4ge1xuICAgICAgZGlzcG9zZVJlYWN0aW9uUlMoKVxuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXG4gICAgICBkaXNwb3NlUmVhZG9ubHlNVygpXG4gICAgICBpZiAoaXNSb290U3RvcmUodGhpcy5zdWJ0cmVlUm9vdENsb25lKSkge1xuICAgICAgICB1bnJlZ2lzdGVyUm9vdFN0b3JlKHRoaXMuc3VidHJlZVJvb3RDbG9uZSlcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzcG9zZXIgPSAoKSA9PiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgZm5gIHdpdGggc2FuZGJveCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIG9mIGBub2Rlc2AuIFRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhlIHNhbmRib3hcbiAgICogaW4gYGZuYCBjYW4gYmUgYWNjZXB0ZWQsIGkuZS4gYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgc3VidHJlZSwgb3IgcmVqZWN0ZWQuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAgICogQHR5cGVwYXJhbSBSIFJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0gbm9kZXMgVHVwbGUgb2Ygb2JqZWN0cyBmb3Igd2hpY2ggdG8gb2J0YWluIHNhbmRib3ggY29waWVzLlxuICAgKiBAcGFyYW0gZm4gRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2l0aCBzYW5kYm94IGNvcGllcyBvZiB0aGUgZWxlbWVudHMgb2YgYG5vZGVzYC4gQW55IGNoYW5nZXNcbiAgICogbWFkZSB0byB0aGUgc2FuZGJveCBhcmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgc3VidHJlZSB3aGVuIGBmbmAgcmV0dXJucyBgdHJ1ZWAgb3JcbiAgICogYHsgY29tbWl0OiB0cnVlLCAuLi4gfWAuIFdoZW4gYGZuYCByZXR1cm5zIGBmYWxzZWAgb3IgYHsgY29tbWl0OiBmYWxzZSwgLi4uIH1gIHRoZSBjaGFuZ2VzIG1hZGVcbiAgICogdG8gdGhlIHNhbmRib3ggYXJlIHJlamVjdGVkLlxuICAgKiBAcmV0dXJucyBWYWx1ZSBvZiB0eXBlIGBSYCB3aGVuIGBmbmAgcmV0dXJucyBhbiBvYmplY3Qgb2YgdHlwZSBgeyBjb21taXQ6IGJvb2xlYW47IHJldHVybjogUiB9YFxuICAgKiBvciBgdm9pZGAgd2hlbiBgZm5gIHJldHVybnMgYSBib29sZWFuLlxuICAgKi9cbiAgd2l0aFNhbmRib3g8VCBleHRlbmRzIHJlYWRvbmx5IFtvYmplY3QsIC4uLm9iamVjdFtdXSwgUiA9IHZvaWQ+KFxuICAgIG5vZGVzOiBULFxuICAgIGZuOiBXaXRoU2FuZGJveENhbGxiYWNrPFQsIFI+XG4gICk6IFIge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZXNbaV0sIGBub2Rlc1ske2l9XWApXG4gICAgfVxuICAgIGFzc2VydElzRnVuY3Rpb24oZm4sIFwiZm5cIilcblxuICAgIGNvbnN0IHsgc2FuZGJveE5vZGVzLCBhcHBseVJlY29yZGVyQ2hhbmdlcyB9ID0gdGhpcy5wcmVwYXJlU2FuZGJveENoYW5nZXMobm9kZXMpXG5cbiAgICBsZXQgY29tbWl0ID0gZmFsc2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB0aGlzLmFsbG93V3JpdGUoKCkgPT4gZm4oLi4uc2FuZGJveE5vZGVzKSlcbiAgICAgIGlmICh0eXBlb2YgcmV0dXJuVmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGNvbW1pdCA9IHJldHVyblZhbHVlXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21taXQgPSByZXR1cm5WYWx1ZS5jb21taXRcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnJldHVyblxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhcHBseVJlY29yZGVyQ2hhbmdlcyhjb21taXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIG9mIHRoZSBzYW5kYm94LlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2VyKClcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVNhbmRib3hDaGFuZ2VzPFQgZXh0ZW5kcyByZWFkb25seSBbb2JqZWN0LCAuLi5vYmplY3RbXV0+KFxuICAgIG5vZGVzOiBUXG4gICk6IHsgc2FuZGJveE5vZGVzOiBUOyBhcHBseVJlY29yZGVyQ2hhbmdlczogKGNvbW1pdDogYm9vbGVhbikgPT4gdm9pZCB9IHtcbiAgICBjb25zdCBpc05lc3RlZFdpdGhTYW5kYm94Q2FsbCA9ICEhdGhpcy53aXRoU2FuZGJveFBhdGNoUmVjb3JkZXJcblxuICAgIGNvbnN0IHNhbmRib3hOb2RlcyA9IG5vZGVzLm1hcCgobm9kZSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKFxuICAgICAgICBpc05lc3RlZFdpdGhTYW5kYm94Q2FsbCA/IHRoaXMuc3VidHJlZVJvb3RDbG9uZSA6IHRoaXMuc3VidHJlZVJvb3QsXG4gICAgICAgIG5vZGVcbiAgICAgIClcbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBub2RlIGlzIG5vdCBhIGNoaWxkIG9mIHN1YnRyZWVSb290JHtpc05lc3RlZFdpdGhTYW5kYm94Q2FsbCA/IFwiQ2xvbmVcIiA6IFwiXCJ9YClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2FuZGJveE5vZGUgPSByZXNvbHZlUGF0aDx0eXBlb2Ygbm9kZT4odGhpcy5zdWJ0cmVlUm9vdENsb25lLCBwYXRoKS52YWx1ZVxuICAgICAgaWYgKCFzYW5kYm94Tm9kZSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwicGF0aCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgLSBzYW5kYm94IG1heSBiZSBvdXQgb2Ygc3luYyB3aXRoIG9yaWdpbmFsIHRyZWVcIilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNhbmRib3hOb2RlXG4gICAgfSkgYXMgdW5rbm93biBhcyBUXG5cbiAgICBpZiAoIXRoaXMud2l0aFNhbmRib3hQYXRjaFJlY29yZGVyKSB7XG4gICAgICB0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlciA9IHBhdGNoUmVjb3JkZXIodGhpcy5zdWJ0cmVlUm9vdENsb25lKVxuICAgIH1cbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMud2l0aFNhbmRib3hQYXRjaFJlY29yZGVyXG4gICAgY29uc3QgbnVtUmVjb3JkZXJFdmVudHMgPSByZWNvcmRlci5ldmVudHMubGVuZ3RoXG5cbiAgICBjb25zdCBhcHBseVJlY29yZGVyQ2hhbmdlcyA9IChjb21taXQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNOZXN0ZWRXaXRoU2FuZGJveENhbGwpIHtcbiAgICAgICAgcmVjb3JkZXIuZGlzcG9zZSgpXG4gICAgICAgIHRoaXMud2l0aFNhbmRib3hQYXRjaFJlY29yZGVyID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgIGlmICghaXNOZXN0ZWRXaXRoU2FuZGJveENhbGwpIHtcbiAgICAgICAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICAgICAgICBjb25zdCBsZW4gPSByZWNvcmRlci5ldmVudHMubGVuZ3RoXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLnJlY29yZGVyLmV2ZW50c1tpXS5wYXRjaGVzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzQ29tbWl0dGluZyA9IHRoaXMuaXNDb21taXR0aW5nXG4gICAgICAgICAgdGhpcy5pc0NvbW1pdHRpbmcgPSB0cnVlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFwcGx5UGF0Y2hlcyh0aGlzLnN1YnRyZWVSb290LCBwYXRjaGVzKVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmlzQ29tbWl0dGluZyA9IGlzQ29tbWl0dGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hbGxvd1dyaXRlKCgpID0+IHtcbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IHJlY29yZGVyLmV2ZW50cy5sZW5ndGhcbiAgICAgICAgICAgIHdoaWxlIChpLS0gPiBudW1SZWNvcmRlckV2ZW50cykge1xuICAgICAgICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdENsb25lLCByZWNvcmRlci5ldmVudHNbaV0uaW52ZXJzZVBhdGNoZXMsIHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzYW5kYm94Tm9kZXMsIGFwcGx5UmVjb3JkZXJDaGFuZ2VzIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYW5kYm94LlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zIEEgYFNhbmRib3hNYW5hZ2VyYCB3aGljaCBhbGxvd3MgeW91IHRvIG1hbmFnZSB0aGUgc2FuZGJveCBvcGVyYXRpb25zIGFuZCBkaXNwb3NlIG9mIHRoZVxuICogc2FuZGJveC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbmRib3goc3VidHJlZVJvb3Q6IG9iamVjdCk6IFNhbmRib3hNYW5hZ2VyIHtcbiAgcmV0dXJuIG5ldyBTYW5kYm94TWFuYWdlcihzdWJ0cmVlUm9vdClcbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGxhenkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSwgQXJyYXlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gdHVwbGUgb2YgdmFsdWVzIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IHN0cmluZ051bWJlclR1cGxlVHlwZSA9IHR5cGVzLnR1cGxlKHR5cGVzLnN0cmluZywgdHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIEl0ZW0gdHlwZXMuXG4gKiBAcGFyYW0gaXRlbVR5cGUgVHlwZSBvZiBpbm5lciBpdGVtcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc1R1cGxlPFQgZXh0ZW5kcyBBbnlUeXBlW10+KC4uLml0ZW1UeXBlczogVCk6IEFycmF5VHlwZTxUPiB7XG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgVHVwbGVUeXBlSW5mbyh0LCBpdGVtVHlwZXMubWFwKHJlc29sdmVTdGFuZGFyZFR5cGUpKVxuXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgIGNvbnN0IGNoZWNrZXJzID0gaXRlbVR5cGVzLm1hcChyZXNvbHZlVHlwZUNoZWNrZXIpXG5cbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+IHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lcyA9IGNoZWNrZXJzLm1hcCgodGMpID0+IHtcbiAgICAgICAgaWYgKHJlY3Vyc2l2ZVR5cGVDaGVja2Vycy5pbmNsdWRlcyh0YykpIHtcbiAgICAgICAgICByZXR1cm4gXCIuLi5cIlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0Yy5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIHRjKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIFwiW1wiICsgdHlwZU5hbWVzLmpvaW4oXCIsIFwiKSArIFwiXVwiXG4gICAgfVxuXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuQXJyYXksXG5cbiAgICAgIChhcnJheSwgcGF0aCkgPT4ge1xuICAgICAgICBpZiAoIWlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCAhPT0gaXRlbVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgYXJyYXkpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgaXRlbUVycm9yID0gY2hlY2tlcnNbaV0uY2hlY2soYXJyYXlbaV0sIFsuLi5wYXRoLCBpXSlcbiAgICAgICAgICBpZiAoaXRlbUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbUVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0sXG5cbiAgICAgIGdldFR5cGVOYW1lLFxuICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgIChhcnJheSkgPT4ge1xuICAgICAgICBpZiAoIWlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCAhPT0gaXRlbVR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgaXRlbUFjdHVhbENoZWNrZXIgPSBjaGVja2Vyc1tpXS5zbmFwc2hvdFR5cGUoYXJyYXlbaV0pXG4gICAgICAgICAgaWYgKCFpdGVtQWN0dWFsQ2hlY2tlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1RjXG4gICAgICB9LFxuXG4gICAgICAoYXJyYXk6IHVua25vd25bXSkgPT4ge1xuICAgICAgICByZXR1cm4gYXJyYXkubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrZXJzW2ldLmZyb21TbmFwc2hvdFByb2Nlc3NvcihpdGVtKVxuICAgICAgICB9KVxuICAgICAgfSxcblxuICAgICAgKGFycmF5OiB1bmtub3duW10pID0+IHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGVja2Vyc1tpXS50b1NuYXBzaG90UHJvY2Vzc29yKGl0ZW0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXNUY1xuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG59XG5cbi8qKlxuICogYHR5cGVzLnR1cGxlYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXBsZVR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICAvLyBtZW1vaXplIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgYXJyYXkgb24gdGhlIGdldHRlclxuICBwcml2YXRlIF9pdGVtVHlwZUluZm9zID0gbGF6eSgoKSA9PiB0aGlzLml0ZW1UeXBlcy5tYXAoZ2V0VHlwZUluZm8pKVxuXG4gIGdldCBpdGVtVHlwZUluZm9zKCk6IFJlYWRvbmx5QXJyYXk8VHlwZUluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5faXRlbVR5cGVJbmZvcygpXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBpdGVtVHlwZXM6IFJlYWRvbmx5QXJyYXk8QW55U3RhbmRhcmRUeXBlPikge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyB2YWx1ZXMgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbEFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vbW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgbW9kZWxJZEtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiXG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbERlY29yYXRvclwiXG5pbXBvcnQgeyBpZFByb3AgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyB0eXBlc0FycmF5IH0gZnJvbSBcIi4uL3R5cGVzL2FycmF5QmFzZWQvdHlwZXNBcnJheVwiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuLi90eXBlcy91dGlsaXR5L3R5cGVzVW5jaGVja2VkXCJcbmltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQSBzZXQgdGhhdCBpcyBiYWNrZWQgYnkgYW4gYXJyYXkuXG4gKiBVc2UgYGFycmF5U2V0YCB0byBjcmVhdGUgaXQuXG4gKi9cbkBtb2RlbChgJHtuYW1lc3BhY2V9L0FycmF5U2V0YClcbmV4cG9ydCBjbGFzcyBBcnJheVNldDxWPlxuICBleHRlbmRzIE1vZGVsKHtcbiAgICBbbW9kZWxJZEtleV06IGlkUHJvcCxcbiAgICBpdGVtczogdFByb3AodHlwZXNBcnJheSh0eXBlc1VuY2hlY2tlZDxhbnk+KCkpLCAoKSA9PiBbXSksIC8vIHdpbGwgYmUgcHJvcGVybHkgY2hlY2tlZCBieSB0eXBlcy5hcnJheVNldChzdWJUeXBlKVxuICB9KVxuICBpbXBsZW1lbnRzIFNldDxWPlxue1xuICBAbW9kZWxBY3Rpb25cbiAgYWRkKHZhbHVlOiBWKTogdGhpcyB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICBpZiAoIWl0ZW1zLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIEBtb2RlbEFjdGlvblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zLmxlbmd0aCA9IDBcbiAgfVxuXG4gIEBtb2RlbEFjdGlvblxuICBkZWxldGUodmFsdWU6IFYpOiBib29sZWFuIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcblxuICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KCh0KSA9PiB0ID09PSB2YWx1ZSlcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgaXRlbXMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFYsIHZhbHVlMjogViwgc2V0OiBTZXQ8Vj4pID0+IHZvaWQsIHRoaXNBcmc/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyB3ZSBjYW5ub3QgdXNlIHRoZSBzZXQgaW1wbGVtZW50YXRpb24gc2luY2Ugd2UgbmVlZCB0byBwYXNzIHRoaXMgYXMgc2V0XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG4gICAgY29uc3QgbGVuID0gaXRlbXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGl0ZW1zW2ldXG4gICAgICBjYWxsYmFja2ZuLmNhbGwodGhpc0FyZywgaywgaywgdGhpcylcbiAgICB9XG4gIH1cblxuICBoYXModmFsdWU6IFYpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5pbmNsdWRlcyh2YWx1ZSlcbiAgfVxuXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoXG4gIH1cblxuICBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcygpIC8vIHllcywgdmFsdWVzXG4gIH1cblxuICB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxWPiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICByZXR1cm4gdmFsdWVzKGl0ZW1zKVtTeW1ib2wuaXRlcmF0b3JdKClcbiAgfVxuXG4gIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbViwgVl0+IHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcblxuICAgIC8vIFRPRE86IHNob3VsZCB1c2UgYW4gYWN0dWFsIGl0ZXJhdG9yXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgodikgPT4gW3YsIHZdIGFzIFtWLCBWXSkudmFsdWVzKClcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcygpXG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJBcnJheVNldFwiXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEFycmF5U2V0IG1vZGVsIGluc3RhbmNlLlxuICpcbiAqIEB0eXBlcGFyYW0gViBWYWx1ZSB0eXBlLlxuICogQHBhcmFtIFtlbnRyaWVzXSBPcHRpb25hbCBpbml0aWFsIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5U2V0PFY+KHZhbHVlcz86IFJlYWRvbmx5QXJyYXk8Vj4gfCBudWxsKTogQXJyYXlTZXQ8Vj4ge1xuICBjb25zdCBpbml0aWFsQXJyOiBWW10gPSB2YWx1ZXMgPyB2YWx1ZXMuc2xpY2UoKSA6IFtdXG5cbiAgcmV0dXJuIG5ldyBBcnJheVNldCh7IGl0ZW1zOiBpbml0aWFsQXJyIH0pXG59XG4iLCJpbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQXJyYXlTZXQgfSBmcm9tIFwiLi4vLi4vd3JhcHBlcnMvQXJyYXlTZXRcIlxuaW1wb3J0IHsgdHlwZXNBcnJheSB9IGZyb20gXCIuLi9hcnJheUJhc2VkL3R5cGVzQXJyYXlcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSwgTW9kZWxUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuaW1wb3J0IHsgdHlwZXNPYmplY3QgfSBmcm9tIFwiLi90eXBlc09iamVjdFwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiBhcnJheSBiYWNrZWQgc2V0IEFycmF5U2V0LlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgbnVtYmVyU2V0VHlwZSA9IHR5cGVzLmFycmF5U2V0KHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBWYWx1ZSB0eXBlLlxuICogQHBhcmFtIHZhbHVlVHlwZSBWYWx1ZSB0eXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzQXJyYXlTZXQ8VCBleHRlbmRzIEFueVR5cGU+KHZhbHVlVHlwZTogVCk6IE1vZGVsVHlwZTxBcnJheVNldDxUeXBlVG9EYXRhPFQ+Pj4ge1xuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IEFycmF5U2V0VHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZSh2YWx1ZVR5cGUpKVxuXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KEFycmF5U2V0KSFcblxuICAgIGNvbnN0IHZhbHVlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcih2YWx1ZVR5cGUpXG5cbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+XG4gICAgICBgQXJyYXlTZXQ8JHt2YWx1ZUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB2YWx1ZUNoZWNrZXIpfT5gXG5cbiAgICBjb25zdCBkYXRhVHlwZUNoZWNrZXIgPSB0eXBlc09iamVjdCgoKSA9PiAoe1xuICAgICAgaXRlbXM6IHR5cGVzQXJyYXkodmFsdWVDaGVja2VyIGFzIGFueSksXG4gICAgfSkpXG5cbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsIC8vIGJlY2F1c2UgaXQgaXMgcmVhbGx5IGEgbW9kZWxcblxuICAgICAgKG9iaiwgcGF0aCkgPT4ge1xuICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBBcnJheVNldCkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIG9iailcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkVGMgPSByZXNvbHZlVHlwZUNoZWNrZXIoZGF0YVR5cGVDaGVja2VyKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRUYy5jaGVjayhvYmouJCwgcGF0aClcbiAgICAgIH0sXG5cbiAgICAgIGdldFR5cGVOYW1lLFxuICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgIChvYmopID0+IHtcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmpbbW9kZWxUeXBlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZmFzdCBjaGVja1xuICAgICAgICAgIHJldHVybiBvYmpbbW9kZWxUeXBlS2V5XSA9PT0gbW9kZWxJbmZvLm5hbWUgPyB0aGlzVGMgOiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZFRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkVGMuc25hcHNob3RUeXBlKG9iaikgPyB0aGlzVGMgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICAoc246IHsgaXRlbXM6IHVua25vd25bXSB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc24sXG4gICAgICAgICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICAgICAgICAgIGl0ZW1zOiBzbi5pdGVtcy5tYXAoKHYpID0+IHZhbHVlQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3IodikpLFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAoc246IHsgaXRlbXM6IHVua25vd25bXTsgW21vZGVsVHlwZUtleV0/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBzbkNvcHkgPSB7XG4gICAgICAgICAgLi4uc24sXG4gICAgICAgICAgaXRlbXM6IHNuLml0ZW1zLm1hcCgodikgPT4gdmFsdWVDaGVja2VyLnRvU25hcHNob3RQcm9jZXNzb3IodikpLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNuQ29weVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiB0aGlzVGNcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5hcnJheVNldGAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgQXJyYXlTZXRUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgZ2V0IHZhbHVlVHlwZUluZm8oKTogVHlwZUluZm8ge1xuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLnZhbHVlVHlwZSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9yaWdpbmFsVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSB2YWx1ZVR5cGU6IEFueVN0YW5kYXJkVHlwZSkge1xuICAgIHN1cGVyKG9yaWdpbmFsVHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSwgUmVjb3JkVHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFuIG9iamVjdC1saWtlIG1hcCwgYW4gb2JqZWN0IHdpdGggc3RyaW5nIGtleXMgYW5kIHZhbHVlcyBhbGwgb2YgYSBzYW1lIGdpdmVuIHR5cGUuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiAvLyB7IFtrOiBzdHJpbmddOiBudW1iZXIgfVxuICogY29uc3QgbnVtYmVyTWFwVHlwZSA9IHR5cGVzLnJlY29yZCh0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cbiAqIEBwYXJhbSB2YWx1ZVR5cGUgVHlwZSBvZiB0aGUgdmFsdWVzIG9mIHRoZSBvYmplY3QtbGlrZSBtYXAuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNSZWNvcmQ8VCBleHRlbmRzIEFueVR5cGU+KHZhbHVlVHlwZTogVCk6IFJlY29yZFR5cGU8VD4ge1xuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodGMpID0+IG5ldyBSZWNvcmRUeXBlSW5mbyh0YywgcmVzb2x2ZVN0YW5kYXJkVHlwZSh2YWx1ZVR5cGUpKVxuXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcih2YWx1ZVR5cGUpXG5cbiAgICBjb25zdCBnZXRUeXBlTmFtZSA9ICguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnM6IFR5cGVDaGVja2VyW10pID0+XG4gICAgICBgUmVjb3JkPCR7dmFsdWVDaGVja2VyLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdmFsdWVDaGVja2VyKX0+YFxuXG4gICAgY29uc3QgYXBwbHlTbmFwc2hvdFByb2Nlc3NvciA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtb2RlOiBcImZyb21cIiB8IFwidG9cIikgPT4ge1xuICAgICAgaWYgKHZhbHVlQ2hlY2tlci51bmNoZWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdPYmo6IHR5cGVvZiBvYmogPSB7fVxuXG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICAgIGNvbnN0IHYgPVxuICAgICAgICAgIG1vZGUgPT09IFwiZnJvbVwiXG4gICAgICAgICAgICA/IHZhbHVlQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3Iob2JqW2tdKVxuICAgICAgICAgICAgOiB2YWx1ZUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3NvcihvYmpba10pXG4gICAgICAgIG5ld09ialtrXSA9IHZcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09ialxuICAgIH1cblxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcblxuICAgICAgKG9iaiwgcGF0aCkgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIG9iailcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWVDaGVja2VyLnVuY2hlY2tlZCkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgICAgICAgY29uc3QgdiA9IG9ialtrXVxuICAgICAgICAgICAgY29uc3QgdmFsdWVFcnJvciA9IHZhbHVlQ2hlY2tlci5jaGVjayh2LCBbLi4ucGF0aCwga10pXG4gICAgICAgICAgICBpZiAodmFsdWVFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWVFcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAob2JqKSA9PiB7XG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkgcmV0dXJuIG51bGxcblxuICAgICAgICBpZiAoIXZhbHVlQ2hlY2tlci51bmNoZWNrZWQpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgICAgICAgIGNvbnN0IHYgPSBvYmpba11cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQWN0dWFsQ2hlY2tlciA9IHZhbHVlQ2hlY2tlci5zbmFwc2hvdFR5cGUodilcbiAgICAgICAgICAgIGlmICghdmFsdWVBY3R1YWxDaGVja2VyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNUY1xuICAgICAgfSxcblxuICAgICAgKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5U25hcHNob3RQcm9jZXNzb3Iob2JqLCBcImZyb21cIilcbiAgICAgIH0sXG5cbiAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIHJldHVybiBhcHBseVNuYXBzaG90UHJvY2Vzc29yKG9iaiwgXCJ0b1wiKVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiB0aGlzVGNcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5yZWNvcmRgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICBnZXQgdmFsdWVUeXBlSW5mbygpOiBUeXBlSW5mbyB7XG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMudmFsdWVUeXBlKVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgdmFsdWVUeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgZW50cmllcywgZ2V0LCBoYXMsIGtleXMsIHJlbW92ZSwgc2V0LCB2YWx1ZXMgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbEFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vbW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgbW9kZWxJZEtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiXG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbERlY29yYXRvclwiXG5pbXBvcnQgeyBpZFByb3AgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyB0eXBlc1JlY29yZCB9IGZyb20gXCIuLi90eXBlcy9vYmplY3RCYXNlZC90eXBlc1JlY29yZFwiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuLi90eXBlcy91dGlsaXR5L3R5cGVzVW5jaGVja2VkXCJcbmltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQSBtYXAgdGhhdCBpcyBiYWNrZWQgYnkgYW4gb2JqZWN0LWxpa2UgbWFwLlxuICogVXNlIGBvYmplY3RNYXBgIHRvIGNyZWF0ZSBpdC5cbiAqL1xuQG1vZGVsKGAke25hbWVzcGFjZX0vT2JqZWN0TWFwYClcbmV4cG9ydCBjbGFzcyBPYmplY3RNYXA8Vj5cbiAgZXh0ZW5kcyBNb2RlbCh7XG4gICAgW21vZGVsSWRLZXldOiBpZFByb3AsXG4gICAgaXRlbXM6IHRQcm9wKHR5cGVzUmVjb3JkKHR5cGVzVW5jaGVja2VkPGFueT4oKSksICgpID0+ICh7fSkpLCAvLyB3aWxsIGJlIHByb3Blcmx5IGNoZWNrZWQgYnkgdHlwZXMub2JqZWN0TWFwKHN1YlR5cGUpXG4gIH0pXG4gIGltcGxlbWVudHMgTWFwPHN0cmluZywgVj5cbntcbiAgQG1vZGVsQWN0aW9uXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW1zKVxuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgIHJlbW92ZShpdGVtcywgaylcbiAgICB9XG4gIH1cblxuICBAbW9kZWxBY3Rpb25cbiAgZGVsZXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzS2V5ID0gdGhpcy5oYXMoa2V5KVxuICAgIGlmIChoYXNLZXkpIHtcbiAgICAgIHJlbW92ZSh0aGlzLml0ZW1zLCBrZXkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoKGNhbGxiYWNrZm46ICh2YWx1ZTogViwga2V5OiBzdHJpbmcsIG1hcDogTWFwPHN0cmluZywgVj4pID0+IHZvaWQsIHRoaXNBcmc/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyB3ZSBjYW5ub3QgdXNlIHRoZSBtYXAgaW1wbGVtZW50YXRpb24gc2luY2Ugd2UgbmVlZCB0byBwYXNzIHRoaXMgYXMgbWFwXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbXMpXG4gICAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgY2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIGl0ZW1zW2tdLCBrLCB0aGlzKVxuICAgIH1cbiAgfVxuXG4gIGdldChrZXk6IHN0cmluZyk6IFYgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBnZXQodGhpcy5pdGVtcywga2V5KVxuICB9XG5cbiAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhhcyh0aGlzLml0ZW1zLCBrZXkpXG4gIH1cblxuICBAbW9kZWxBY3Rpb25cbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVik6IHRoaXMge1xuICAgIHNldCh0aGlzLml0ZW1zLCBrZXksIHZhbHVlKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBrZXlzKHRoaXMuaXRlbXMpLmxlbmd0aFxuICB9XG5cbiAga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIC8vIFRPRE86IHNob3VsZCB1c2UgYW4gYWN0dWFsIGl0ZXJhdG9yXG4gICAgcmV0dXJuIGtleXModGhpcy5pdGVtcylbU3ltYm9sLml0ZXJhdG9yXSgpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPlxuICB9XG5cbiAgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xuICAgIC8vIFRPRE86IHNob3VsZCB1c2UgYW4gYWN0dWFsIGl0ZXJhdG9yXG4gICAgcmV0dXJuIHZhbHVlcyh0aGlzLml0ZW1zKVtTeW1ib2wuaXRlcmF0b3JdKClcbiAgfVxuXG4gIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBWXT4ge1xuICAgIC8vIFRPRE86IHNob3VsZCB1c2UgYW4gYWN0dWFsIGl0ZXJhdG9yXG4gICAgcmV0dXJuIGVudHJpZXModGhpcy5pdGVtcylbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIFZdPiB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpXG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJPYmplY3RNYXBcIlxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBPYmplY3RNYXAgbW9kZWwgaW5zdGFuY2UuXG4gKlxuICogQHR5cGVwYXJhbSBWIFZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gW2VudHJpZXNdIE9wdGlvbmFsIGluaXRpYWwgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TWFwPFY+KGVudHJpZXM/OiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIFZdPiB8IG51bGwpOiBPYmplY3RNYXA8Vj4ge1xuICBjb25zdCBpbml0aWFsT2JqOiB7IFtrOiBzdHJpbmddOiBWIH0gPSB7fVxuXG4gIGlmIChlbnRyaWVzKSB7XG4gICAgbGV0IGxlbiA9IGVudHJpZXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICBpbml0aWFsT2JqW2VudHJ5WzBdXSA9IGVudHJ5WzFdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBPYmplY3RNYXAoeyBpdGVtczogaW5pdGlhbE9iaiB9KVxufVxuIiwiaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uLy4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IE9iamVjdE1hcCB9IGZyb20gXCIuLi8uLi93cmFwcGVycy9PYmplY3RNYXBcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSwgTW9kZWxUeXBlLCBUeXBlVG9EYXRhIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuaW1wb3J0IHsgdHlwZXNPYmplY3QgfSBmcm9tIFwiLi90eXBlc09iamVjdFwiXG5pbXBvcnQgeyB0eXBlc1JlY29yZCB9IGZyb20gXCIuL3R5cGVzUmVjb3JkXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFuIG9iamVjdC1saWtlIG1hcCBPYmplY3RNYXAuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBudW1iZXJNYXBUeXBlID0gdHlwZXMub2JqZWN0TWFwKHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBWYWx1ZSB0eXBlLlxuICogQHBhcmFtIHZhbHVlVHlwZSBWYWx1ZSB0eXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzT2JqZWN0TWFwPFQgZXh0ZW5kcyBBbnlUeXBlPihcbiAgdmFsdWVUeXBlOiBUXG4pOiBNb2RlbFR5cGU8T2JqZWN0TWFwPFR5cGVUb0RhdGE8VD4+PiB7XG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgT2JqZWN0TWFwVHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZSh2YWx1ZVR5cGUpKVxuXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KE9iamVjdE1hcCkhXG5cbiAgICBjb25zdCB2YWx1ZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodmFsdWVUeXBlKVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PlxuICAgICAgYE9iamVjdE1hcDwke3ZhbHVlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIHZhbHVlQ2hlY2tlcil9PmBcblxuICAgIGNvbnN0IGRhdGFUeXBlQ2hlY2tlciA9IHR5cGVzT2JqZWN0KCgpID0+ICh7XG4gICAgICBpdGVtczogdHlwZXNSZWNvcmQodmFsdWVDaGVja2VyIGFzIGFueSksXG4gICAgfSkpXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoZGF0YVR5cGVDaGVja2VyKVxuXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LFxuXG4gICAgICAob2JqLCBwYXRoKSA9PiB7XG4gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9iamVjdE1hcCkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIG9iailcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5jaGVjayhvYmouJCwgcGF0aClcbiAgICAgIH0sXG5cbiAgICAgIGdldFR5cGVOYW1lLFxuICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgIChvYmopID0+IHtcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmpbbW9kZWxUeXBlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZmFzdCBjaGVja1xuICAgICAgICAgIHJldHVybiBvYmpbbW9kZWxUeXBlS2V5XSA9PT0gbW9kZWxJbmZvLm5hbWUgPyB0aGlzVGMgOiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuc25hcHNob3RUeXBlKG9iaikgPyB0aGlzVGMgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICAoc246IHsgaXRlbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pID0+IHtcbiAgICAgICAgY29uc3QgbmV3SXRlbXM6IHR5cGVvZiBzbltcIml0ZW1zXCJdID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoc24uaXRlbXMpKSB7XG4gICAgICAgICAgbmV3SXRlbXNba10gPSB2YWx1ZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuLml0ZW1zW2tdKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zbixcbiAgICAgICAgICBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUsXG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAoc246IHsgaXRlbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBbbW9kZWxUeXBlS2V5XT86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zOiB0eXBlb2Ygc25bXCJpdGVtc1wiXSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNuLml0ZW1zKSkge1xuICAgICAgICAgIG5ld0l0ZW1zW2tdID0gdmFsdWVDaGVja2VyLnRvU25hcHNob3RQcm9jZXNzb3Ioc24uaXRlbXNba10pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzbkNvcHkgPSB7XG4gICAgICAgICAgLi4uc24sXG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNuQ29weVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiB0aGlzVGNcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5vYmplY3RNYXBgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIE9iamVjdE1hcFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xuICBnZXQgdmFsdWVUeXBlSW5mbygpOiBUeXBlSW5mbyB7XG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMudmFsdWVUeXBlKVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgdmFsdWVUeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uLy4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IFJlZiwgUmVmQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vLi4vcmVmL1JlZlwiXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyB0eXBlc1N0cmluZyB9IGZyb20gXCIuLi9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgeyByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHsgVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyQmFzZVR5cGUsIFR5cGVJbmZvIH0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IHR5cGVzT2JqZWN0IH0gZnJvbSBcIi4vdHlwZXNPYmplY3RcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9yIG1vZGVsLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgcmVmVG9Tb21lT2JqZWN0ID0gdHlwZXMucmVmKFNvbWVPYmplY3QpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIE8gT2JqZWN0IG9yIG1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gcmVmQ29uc3RydWN0b3IgUmVmIG9iamVjdCB0eXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzUmVmPE8gZXh0ZW5kcyBvYmplY3Q+KHJlZkNvbnN0cnVjdG9yOiBSZWZDb25zdHJ1Y3RvcjxPPik6IE1vZGVsVHlwZTxSZWY8Tz4+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSBcIlJlZlwiXG5cbiAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQocmVmQ29uc3RydWN0b3IucmVmQ2xhc3MpIVxuXG4gIGNvbnN0IHJlZkRhdGFUeXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihcbiAgICB0eXBlc09iamVjdCgoKSA9PiAoe1xuICAgICAgaWQ6IHR5cGVzU3RyaW5nLFxuICAgIH0pKVxuICApXG5cbiAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcblxuICAgICh2YWx1ZSwgcGF0aCkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBSZWYpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgdHlwZU5hbWUsIHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVmRGF0YVR5cGVDaGVja2VyLmNoZWNrKHZhbHVlLiQsIHBhdGgpXG4gICAgfSxcblxuICAgICgpID0+IHR5cGVOYW1lLFxuICAgICh0KSA9PiBuZXcgUmVmVHlwZUluZm8odCksXG5cbiAgICAob2JqKSA9PiB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgaWYgKG9ialttb2RlbFR5cGVLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZmFzdCBjaGVja1xuICAgICAgICByZXR1cm4gb2JqW21vZGVsVHlwZUtleV0gPT09IG1vZGVsSW5mby5uYW1lID8gdGhpc1RjIDogbnVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVmRGF0YVR5cGVDaGVja2VyLnNuYXBzaG90VHlwZShvYmopID8gdGhpc1RjIDogbnVsbFxuICAgIH0sXG5cbiAgICAoc246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICBpZiAoc25bbW9kZWxUeXBlS2V5XSkge1xuICAgICAgICByZXR1cm4gc25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc24sXG4gICAgICAgICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIChzbikgPT4gc25cbiAgKVxuXG4gIHJldHVybiB0aGlzVGMgYXMgYW55XG59XG5cbi8qKlxuICogYHR5cGVzLnJlZmAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgUmVmVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7fVxuIiwiaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQgeyB0eXBlc09yIH0gZnJvbSBcIi4uL3V0aWxpdHkvdHlwZXNPclwiXG5pbXBvcnQgeyB0eXBlc0xpdGVyYWwgfSBmcm9tIFwiLi90eXBlc1ByaW1pdGl2ZVwiXG5cbi8qKlxuICogQGlnbm9yZVxuICogRW51bSBsaWtlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnVtTGlrZSB7XG4gIFtrOiBzdHJpbmddOiBudW1iZXIgfCBzdHJpbmdcbiAgW3Y6IG51bWJlcl06IHN0cmluZ1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW51bVZhbHVlcyhlOiBFbnVtTGlrZSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCB2YWxzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGUpKSB7XG4gICAgY29uc3QgdiA9IGVba11cbiAgICAvLyB3ZSBoYXZlIHRvIGRvIHRoaXMgc2luY2UgVFMgZG9lcyBzb21ldGhpbmcgd2VpcmRcbiAgICAvLyB0byBudW1iZXIgdmFsdWVzXG4gICAgLy8gSGkgPSAwIC0+IHsgSGk6IDAsIDA6IFwiSGlcIiB9XG4gICAgLy8gYW5kIFNXQyBjdXJyZW50bHkgZ2VuZXJhdGVzIGVudW0gY29kZSBpbmNvbnNpc3RlbnQgd2l0aCBUUy9CYWJlbFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2MtcHJvamVjdC9zd2MvaXNzdWVzLzM3MTFcbiAgICBpZiAoIXZhbHMuaW5jbHVkZXModikgJiYgKCh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIiAmJiB2ICE9PSAraykgfHwgZVt2XSAhPT0gK2spKSB7XG4gICAgICB2YWxzLnB1c2godilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHNcbn1cblxuLyoqXG4gKiBAaWdub3JlXG4gKiBFeHRyYWN0IGVudW0gdmFsdWVzIG91dCBvZiBhIGVudW0gb2JqZWN0LlxuICovXG5leHBvcnQgdHlwZSBFbnVtVmFsdWVzPEUgZXh0ZW5kcyBFbnVtTGlrZT4gPSBFIGV4dGVuZHMgUmVjb3JkPFxuICBpbmZlciBfSywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaW5mZXIgVlxuPlxuICA/IFZcbiAgOiBuZXZlclxuXG4vKipcbiAqIEFuIGVudW0gdHlwZSwgYmFzZWQgb24gYSBUeXBlU2NyaXB0IGFsaWtlIGVudW0gb2JqZWN0LlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMub3IoLi4uZW51bV92YWx1ZXMubWFwKHR5cGVzLmxpdGVyYWwpKWBcbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGVudW0gQ29sb3Ige1xuICogICBSZWQgPSBcInJlZFwiLFxuICogICBHcmVlbiA9IFwiZ3JlZW5cIlxuICogfVxuICpcbiAqIGNvbnN0IGNvbG9yVHlwZSA9IHR5cGVzLmVudW0oQ29sb3IpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIEUgRW51bSB0eXBlLlxuICogQHBhcmFtIGVudW1PYmplY3RcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0VudW08RSBleHRlbmRzIEVudW1MaWtlPihlbnVtT2JqZWN0OiBFKTogSWRlbnRpdHlUeXBlPEVudW1WYWx1ZXM8RT4+IHtcbiAgYXNzZXJ0SXNPYmplY3QoZW51bU9iamVjdCwgXCJlbnVtT2JqZWN0XCIpXG5cbiAgY29uc3QgbGl0ZXJhbHMgPSBlbnVtVmFsdWVzKGVudW1PYmplY3QpLm1hcCgoZSkgPT4gdHlwZXNMaXRlcmFsKGUpKVxuICByZXR1cm4gdHlwZXNPciguLi5saXRlcmFscykgYXMgYW55XG59XG4iLCJpbXBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuLi9nZXRUeXBlSW5mb1wiXHJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgQW55VHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcclxuaW1wb3J0IHsgbGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciwgVHlwZUluZm8sIFR5cGVJbmZvR2VuIH0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcclxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxyXG5cclxuLyoqXHJcbiAqIEEgcmVmaW5lbWVudCBvdmVyIGEgZ2l2ZW4gdHlwZS4gVGhpcyBhbGxvd3MgeW91IHRvIGRvIGV4dHJhIGNoZWNrc1xyXG4gKiBvdmVyIG1vZGVscywgZW5zdXJlIG51bWJlcnMgYXJlIGludGVnZXJzLCBldGMuXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IGludGVnZXJUeXBlID0gdHlwZXMucmVmaW5lbWVudCh0eXBlcy5udW1iZXIsIChuKSA9PiB7XHJcbiAqICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobilcclxuICogfSwgXCJpbnRlZ2VyXCIpXHJcbiAqXHJcbiAqIGNvbnN0IHN1bU1vZGVsVHlwZSA9IHR5cGVzLnJlZmluZW1lbnQodHlwZXMubW9kZWwoU3VtKSwgKHN1bSkgPT4ge1xyXG4gKiAgIC8vIGltYWdpbmUgdGhhdCBmb3Igc29tZSByZWFzb24gc3VtIGluY2x1ZGVzIGEgbnVtYmVyICdhJywgYSBudW1iZXIgJ2InXHJcbiAqICAgLy8gYW5kIHRoZSByZXN1bHRcclxuICpcclxuICogICBjb25zdCByaWdodFJlc3VsdCA9IHN1bS5hICsgc3VtLmIgPT09IHN1bS5yZXN1bHRcclxuICpcclxuICogICAvLyBzaW1wbGUgbW9kZSB0aGF0IHdpbGwganVzdCByZXR1cm4gdGhhdCB0aGUgd2hvbGUgbW9kZWwgaXMgaW5jb3JyZWN0XHJcbiAqICAgcmV0dXJuIHJpZ2h0UmVzdWx0XHJcbiAqXHJcbiAqICAgLy8gdGhpcyB3aWxsIHJldHVybiB0aGF0IHRoZSByZXN1bHQgZmllbGQgaXMgd3JvbmdcclxuICogICByZXR1cm4gcmlnaHRSZXN1bHQgPyBudWxsIDogbmV3IFR5cGVDaGVja0Vycm9yKFtcInJlc3VsdFwiXSwgXCJhK2JcIiwgc3VtLnJlc3VsdClcclxuICogfSlcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBCYXNlIHR5cGUuXHJcbiAqIEBwYXJhbSBiYXNlVHlwZSBCYXNlIHR5cGUuXHJcbiAqIEBwYXJhbSBjaGVja0ZuIEZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBkYXRhIChpZiBpdCBwYXNzZXMgdGhlIGJhc2UgdHlwZVxyXG4gKiBjaGVjaykgYW5kIHJldHVybiBudWxsIG9yIGZhbHNlIGlmIHRoZXJlIHdlcmUgbm8gZXJyb3JzIG9yIGVpdGhlciBhIFR5cGVDaGVja0Vycm9yIGluc3RhbmNlIG9yXHJcbiAqIHRydWUgaWYgdGhlcmUgd2VyZS5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlc1JlZmluZW1lbnQ8VCBleHRlbmRzIEFueVR5cGU+KFxyXG4gIGJhc2VUeXBlOiBULFxyXG4gIGNoZWNrRm46IChkYXRhOiBUeXBlVG9EYXRhPFQ+KSA9PiBUeXBlQ2hlY2tFcnJvciB8IG51bGwgfCBib29sZWFuLFxyXG4gIHR5cGVOYW1lPzogc3RyaW5nXHJcbik6IFQge1xyXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PlxyXG4gICAgbmV3IFJlZmluZW1lbnRUeXBlSW5mbyh0LCByZXNvbHZlU3RhbmRhcmRUeXBlKGJhc2VUeXBlKSwgY2hlY2tGbiwgdHlwZU5hbWUpXHJcblxyXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xyXG4gICAgY29uc3QgYmFzZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoYmFzZVR5cGUpXHJcblxyXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiB7XHJcbiAgICAgIGNvbnN0IGJhc2VUeXBlTmFtZSA9IGJhc2VDaGVja2VyLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgYmFzZUNoZWNrZXIpXHJcbiAgICAgIGNvbnN0IHJlZmluZW1lbnROYW1lID0gdHlwZU5hbWUgfHwgXCJyZWZpbmVtZW50T2ZcIlxyXG4gICAgICByZXR1cm4gYCR7cmVmaW5lbWVudE5hbWV9PCR7YmFzZVR5cGVOYW1lfT5gXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcclxuICAgICAgYmFzZUNoZWNrZXIuYmFzZVR5cGUsXHJcblxyXG4gICAgICAoZGF0YSwgcGF0aCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJhc2VFcnIgPSBiYXNlQ2hlY2tlci5jaGVjayhkYXRhLCBwYXRoKVxyXG4gICAgICAgIGlmIChiYXNlRXJyKSB7XHJcbiAgICAgICAgICByZXR1cm4gYmFzZUVyclxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVmaW5lbWVudEVyciA9IGNoZWNrRm4oZGF0YSlcclxuXHJcbiAgICAgICAgaWYgKHJlZmluZW1lbnRFcnIgPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfSBlbHNlIGlmIChyZWZpbmVtZW50RXJyID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBkYXRhKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVmaW5lbWVudEVyciA/PyBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgZ2V0VHlwZU5hbWUsXHJcbiAgICAgIHR5cGVJbmZvR2VuLFxyXG5cclxuICAgICAgLy8gd2UgY2Fubm90IGNoZWNrIHJlZmluZW1lbnQgaGVyZSBzaW5jZSBpdCBjaGVja3MgZGF0YSBpbnN0YW5jZXMsIG5vdCBzbmFwc2hvdHNcclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci5zbmFwc2hvdFR5cGUoc24pLFxyXG5cclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pLFxyXG4gICAgICAoc24pID0+IGJhc2VDaGVja2VyLnRvU25hcHNob3RQcm9jZXNzb3Ioc24pXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuIHRoaXNUY1xyXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy5yZWZpbmVtZW50YCB0eXBlIGluZm8uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUmVmaW5lbWVudFR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge1xyXG4gIGdldCBiYXNlVHlwZUluZm8oKTogVHlwZUluZm8ge1xyXG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMuYmFzZVR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgICByZWFkb25seSBiYXNlVHlwZTogQW55U3RhbmRhcmRUeXBlLFxyXG4gICAgcmVhZG9ubHkgY2hlY2tGdW5jdGlvbjogKGRhdGE6IGFueSkgPT4gVHlwZUNoZWNrRXJyb3IgfCBudWxsIHwgYm9vbGVhbixcclxuICAgIHJlYWRvbmx5IHR5cGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIHN1cGVyKHRoaXNUeXBlKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlc1JlZmluZW1lbnQgfSBmcm9tIFwiLi4vdXRpbGl0eS90eXBlc1JlZmluZW1lbnRcIlxuaW1wb3J0IHsgdHlwZXNOdW1iZXIsIHR5cGVzU3RyaW5nIH0gZnJvbSBcIi4vdHlwZXNQcmltaXRpdmVcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW55IGludGVnZXIgbnVtYmVyIHZhbHVlLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMucmVmaW5lbWVudCh0eXBlcy5udW1iZXIsIG4gPT4gTnVtYmVyLmlzSW50ZWdlcihuKSwgXCJpbnRlZ2VyXCIpYFxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy5pbnRlZ2VyXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVzSW50ZWdlciA9IHR5cGVzUmVmaW5lbWVudCh0eXBlc051bWJlciwgKG4pID0+IE51bWJlci5pc0ludGVnZXIobiksIFwiaW50ZWdlclwiKVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW55IHN0cmluZyB2YWx1ZSBvdGhlciB0aGFuIFwiXCIuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5yZWZpbmVtZW50KHR5cGVzLnN0cmluZywgcyA9PiBzICE9PSBcIlwiLCBcIm5vbkVtcHR5XCIpYFxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy5ub25FbXB0eVN0cmluZ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc05vbkVtcHR5U3RyaW5nID0gdHlwZXNSZWZpbmVtZW50KHR5cGVzU3RyaW5nLCAocykgPT4gcyAhPT0gXCJcIiwgXCJub25FbXB0eVwiKVxuIiwiaW1wb3J0IHsgdHlwZXNOdWxsLCB0eXBlc1VuZGVmaW5lZCB9IGZyb20gXCIuLi9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUsIElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7IHR5cGVzT3IgfSBmcm9tIFwiLi90eXBlc09yXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGVpdGhlciBhIHR5cGUgb3IgdW5kZWZpbmVkLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMub3IoYmFzZVR5cGUsIHR5cGVzLnVuZGVmaW5lZClgXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBudW1iZXJPclVuZGVmaW5lZFR5cGUgPSB0eXBlcy5tYXliZSh0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cbiAqIEBwYXJhbSBiYXNlVHlwZSBUeXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzTWF5YmU8VCBleHRlbmRzIEFueVR5cGU+KGJhc2VUeXBlOiBUKTogVCB8IElkZW50aXR5VHlwZTx1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHR5cGVzT3IoYmFzZVR5cGUsIHR5cGVzVW5kZWZpbmVkKVxufVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgZWl0aGVyIGEgdHlwZSBvciBudWxsLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMub3IoYmFzZVR5cGUsIHR5cGVzLm51bGwpYFxuICpcbiAqICAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgbnVtYmVyT3JOdWxsVHlwZSA9IHR5cGVzLm1heWJlTnVsbCh0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cbiAqIEBwYXJhbSB0eXBlIFR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNNYXliZU51bGw8VCBleHRlbmRzIEFueVR5cGU+KHR5cGU6IFQpOiBUIHwgSWRlbnRpdHlUeXBlPG51bGw+IHtcbiAgcmV0dXJuIHR5cGVzT3IodHlwZSwgdHlwZXNOdWxsKVxufVxuIiwiaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxyXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7IGxhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIsIFR5cGVJbmZvLCBUeXBlSW5mb0dlbiB9IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXHJcblxyXG4vKipcclxuICogV3JhcCBhIGdpdmVuIHR5cGUgd2l0aCB0YWcgaW5mb3JtYXRpb24uXHJcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aCB0aGUgdHlwZSBvZiBhIHByb3AgdGhhdFxyXG4gKiB5b3UgY2FuIHVzZSBhdCBydW50aW1lLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCB3aWR0aFR5cGUgPSB0eXBlcy50YWcodHlwZXMubnVtYmVyLCB7IGRpc3BsYXlOYW1lOiBcIldpZHRoIGluIEluY2hlc1wiLCByZXF1aXJlZDogdHJ1ZSB9LCBcImRpbWVuc2lvblwiKVxyXG4gKiBjb25zdCBoZWlnaHRUeXBlID0gdHlwZXMudGFnKHR5cGVzLm51bWJlciwgeyBkaXNwbGF5TmFtZTogXCJIZWlnaHQgaW4gSW5jaGVzXCIsIHJlcXVpcmVkOiB0cnVlIH0sIFwiZGltZW5zaW9uXCIpXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGVzZSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCBhdCBydW50aW1lIHRocm91Z2ggaW5zcGVjdGlvbiBBUElzLCBlLmcuXHJcbiAqIGBgYFxyXG4gKiBAbW9kZWwoJ015TW9kZWwnKVxyXG4gKiBjbGFzcyBNeU1vZGVsIGV4dGVuZHMgTW9kZWwoe1xyXG4gKiAgIHdpZHRoOiB0UHJvcCh3aWR0aFR5cGUsIDEwKSxcclxuICogICBoZWlnaHQ6IHRQcm9wKGhlaWdodFR5cGUsIDEwKVxyXG4gKiB9KSB7fVxyXG4gKlxyXG4gKiBjb25zdCBtID0gbmV3IE15TW9kZWwoe30pXHJcbiAqIGNvbnN0IHR5cGUgPSB0eXBlcy5tb2RlbDx0eXBlb2YgTW9kZWw+KG0uY29uc3RydWN0b3IpXHJcbiAqIGNvbnN0IG1vZGVsVHlwZUluZm8gPSBnZXRUeXBlSW5mbyh0eXBlKSBhcyBNb2RlbFR5cGVJbmZvXHJcbiAqIGNvbnN0IHByb3BUeXBlSW5mbyA9IG1vZGVsVHlwZUluZm8ucHJvcHMud2lkdGgudHlwZUluZm8gYXMgVGFnVHlwZUluZm9cclxuICogY29uc3QgZGlzcGxheU5hbWUgPSBwcm9wVHlwZUluZm8uZGlzcGxheU5hbWVcclxuICogYGBgXHJcbiAqIEB0eXBlcGFyYW0gVCBCYXNlIHR5cGUuXHJcbiAqIEBwYXJhbSBiYXNlVHlwZSBCYXNlIHR5cGUuXHJcbiAqIEB0eXBlcGFyYW0gQSBUYWcgb2JqZWN0LlxyXG4gKiBAcGFyYW0gdGFnIEFiaXRyYXJ5IG9iamVjdCB0aGF0IGNhbiBiZSBxdWVyaWVkIGF0IHJ1bnRpbWUuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNUYWc8VCBleHRlbmRzIEFueVR5cGUsIEE+KGJhc2VUeXBlOiBULCB0YWc6IEEsIHR5cGVOYW1lPzogc3RyaW5nKTogVCB7XHJcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+XHJcbiAgICBuZXcgVGFnVHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZShiYXNlVHlwZSksIHRhZywgdHlwZU5hbWUpXHJcblxyXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xyXG4gICAgY29uc3QgYmFzZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoYmFzZVR5cGUpXHJcblxyXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiB7XHJcbiAgICAgIGNvbnN0IGJhc2VUeXBlTmFtZSA9IGJhc2VDaGVja2VyLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgYmFzZUNoZWNrZXIpXHJcbiAgICAgIGNvbnN0IHRhZ2dlZE5hbWUgPSB0eXBlTmFtZSB8fCBcInRhZ2dlZFwiXHJcbiAgICAgIHJldHVybiBgJHt0YWdnZWROYW1lfTwke2Jhc2VUeXBlTmFtZX0+YFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgICAgIGJhc2VDaGVja2VyLmJhc2VUeXBlLFxyXG4gICAgICBiYXNlQ2hlY2tlci5jaGVjayxcclxuICAgICAgZ2V0VHlwZU5hbWUsXHJcbiAgICAgIHR5cGVJbmZvR2VuLFxyXG4gICAgICAoc24pID0+IGJhc2VDaGVja2VyLnNuYXBzaG90VHlwZShzbiksXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKSxcclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiB0aGlzVGNcclxuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMudGFnYCB0eXBlIGluZm8uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGFnVHlwZUluZm88QT4gZXh0ZW5kcyBUeXBlSW5mbyB7XHJcbiAgZ2V0IGJhc2VUeXBlSW5mbygpOiBUeXBlSW5mbyB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy5iYXNlVHlwZSlcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgdGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSxcclxuICAgIHJlYWRvbmx5IGJhc2VUeXBlOiBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgICByZWFkb25seSB0YWc6IEEsXHJcbiAgICByZWFkb25seSB0eXBlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICBzdXBlcih0aGlzVHlwZSlcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQXJyYXlUeXBlSW5mbywgdHlwZXNBcnJheSB9IGZyb20gXCIuL2FycmF5QmFzZWQvdHlwZXNBcnJheVwiXG5pbXBvcnQgeyBUdXBsZVR5cGVJbmZvLCB0eXBlc1R1cGxlIH0gZnJvbSBcIi4vYXJyYXlCYXNlZC90eXBlc1R1cGxlXCJcbmltcG9ydCB7IEFycmF5U2V0VHlwZUluZm8sIHR5cGVzQXJyYXlTZXQgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc0FycmF5U2V0XCJcbmltcG9ydCB7IHR5cGVzRGF0YU1vZGVsRGF0YSB9IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzRGF0YU1vZGVsRGF0YVwiXG5pbXBvcnQgeyBNb2RlbFR5cGVJbmZvLCBNb2RlbFR5cGVJbmZvUHJvcHMsIHR5cGVzTW9kZWwgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc01vZGVsXCJcbmltcG9ydCB7XG4gIEZyb3plblR5cGVJbmZvLFxuICBPYmplY3RUeXBlSW5mbyxcbiAgT2JqZWN0VHlwZUluZm9Qcm9wcyxcbiAgdHlwZXNGcm96ZW4sXG4gIHR5cGVzT2JqZWN0LFxufSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc09iamVjdFwiXG5pbXBvcnQgeyBPYmplY3RNYXBUeXBlSW5mbywgdHlwZXNPYmplY3RNYXAgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc09iamVjdE1hcFwiXG5pbXBvcnQgeyBSZWNvcmRUeXBlSW5mbywgdHlwZXNSZWNvcmQgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc1JlY29yZFwiXG5pbXBvcnQgeyBSZWZUeXBlSW5mbywgdHlwZXNSZWYgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc1JlZlwiXG5pbXBvcnQgeyB0eXBlc0VudW0gfSBmcm9tIFwiLi9wcmltaXRpdmVCYXNlZC90eXBlc0VudW1cIlxuaW1wb3J0IHtcbiAgQm9vbGVhblR5cGVJbmZvLFxuICBMaXRlcmFsVHlwZUluZm8sXG4gIE51bWJlclR5cGVJbmZvLFxuICBTdHJpbmdUeXBlSW5mbyxcbiAgdHlwZXNCb29sZWFuLFxuICB0eXBlc0xpdGVyYWwsXG4gIHR5cGVzTnVsbCxcbiAgdHlwZXNOdW1iZXIsXG4gIHR5cGVzU3RyaW5nLFxuICB0eXBlc1VuZGVmaW5lZCxcbn0gZnJvbSBcIi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHsgdHlwZXNJbnRlZ2VyLCB0eXBlc05vbkVtcHR5U3RyaW5nIH0gZnJvbSBcIi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNSZWZpbmVkUHJpbWl0aXZlXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuL3NjaGVtYXNcIlxuaW1wb3J0IHsgdHlwZXNNYXliZSwgdHlwZXNNYXliZU51bGwgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzTWF5YmVcIlxuaW1wb3J0IHsgT3JUeXBlSW5mbywgdHlwZXNPciB9IGZyb20gXCIuL3V0aWxpdHkvdHlwZXNPclwiXG5pbXBvcnQgeyBSZWZpbmVtZW50VHlwZUluZm8sIHR5cGVzUmVmaW5lbWVudCB9IGZyb20gXCIuL3V0aWxpdHkvdHlwZXNSZWZpbmVtZW50XCJcbmltcG9ydCB7IFRhZ1R5cGVJbmZvLCB0eXBlc1RhZyB9IGZyb20gXCIuL3V0aWxpdHkvdHlwZXNUYWdcIlxuaW1wb3J0IHsgdHlwZXNVbmNoZWNrZWQsIFVuY2hlY2tlZFR5cGVJbmZvIH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc1VuY2hlY2tlZFwiXG5leHBvcnQgeyBnZXRUeXBlSW5mbyB9IGZyb20gXCIuL2dldFR5cGVJbmZvXCJcbmV4cG9ydCB7IFR5cGVJbmZvIH0gZnJvbSBcIi4vVHlwZUNoZWNrZXJcIlxuZXhwb3J0IHR5cGUgeyBPYmplY3RUeXBlSW5mb1Byb3BzLCBNb2RlbFR5cGVJbmZvUHJvcHMgfVxuZXhwb3J0IHtcbiAgQm9vbGVhblR5cGVJbmZvLFxuICBMaXRlcmFsVHlwZUluZm8sXG4gIE51bWJlclR5cGVJbmZvLFxuICBTdHJpbmdUeXBlSW5mbyxcbiAgRnJvemVuVHlwZUluZm8sXG4gIE9iamVjdE1hcFR5cGVJbmZvLFxuICBUYWdUeXBlSW5mbyxcbiAgUmVmaW5lbWVudFR5cGVJbmZvLFxuICBSZWNvcmRUeXBlSW5mbyxcbiAgUmVmVHlwZUluZm8sXG4gIFVuY2hlY2tlZFR5cGVJbmZvLFxuICBPYmplY3RUeXBlSW5mbyxcbiAgQXJyYXlTZXRUeXBlSW5mbyxcbiAgQXJyYXlUeXBlSW5mbyxcbiAgTW9kZWxUeXBlSW5mbyxcbiAgT3JUeXBlSW5mbyxcbiAgVHVwbGVUeXBlSW5mbyxcbn1cblxuZXhwb3J0IGNvbnN0IHR5cGVzID0ge1xuICBsaXRlcmFsOiB0eXBlc0xpdGVyYWwsXG4gIHVuZGVmaW5lZDogdHlwZXNVbmRlZmluZWQsXG4gIG51bGw6IHR5cGVzTnVsbCxcbiAgYm9vbGVhbjogdHlwZXNCb29sZWFuLFxuICBudW1iZXI6IHR5cGVzTnVtYmVyLFxuICBzdHJpbmc6IHR5cGVzU3RyaW5nLFxuICBvcjogdHlwZXNPcixcbiAgbWF5YmU6IHR5cGVzTWF5YmUsXG4gIG1heWJlTnVsbDogdHlwZXNNYXliZU51bGwsXG4gIGFycmF5OiB0eXBlc0FycmF5LFxuICByZWNvcmQ6IHR5cGVzUmVjb3JkLFxuICB1bmNoZWNrZWQ6IHR5cGVzVW5jaGVja2VkLFxuICBtb2RlbDogdHlwZXNNb2RlbCxcbiAgZGF0YU1vZGVsRGF0YTogdHlwZXNEYXRhTW9kZWxEYXRhLFxuICBvYmplY3Q6IHR5cGVzT2JqZWN0LFxuICByZWY6IHR5cGVzUmVmLFxuICBmcm96ZW46IHR5cGVzRnJvemVuLFxuICBlbnVtOiB0eXBlc0VudW0sXG4gIHRhZzogdHlwZXNUYWcsXG4gIHJlZmluZW1lbnQ6IHR5cGVzUmVmaW5lbWVudCxcbiAgaW50ZWdlcjogdHlwZXNJbnRlZ2VyLFxuICBub25FbXB0eVN0cmluZzogdHlwZXNOb25FbXB0eVN0cmluZyxcbiAgb2JqZWN0TWFwOiB0eXBlc09iamVjdE1hcCxcbiAgYXJyYXlTZXQ6IHR5cGVzQXJyYXlTZXQsXG4gIHR1cGxlOiB0eXBlc1R1cGxlLFxuXG4gIG1hcEFycmF5PFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpIHtcbiAgICByZXR1cm4gdHlwZXNBcnJheSh0eXBlc1R1cGxlKHR5cGVzU3RyaW5nLCB2YWx1ZVR5cGUpKVxuICB9LFxuICBzZXRBcnJheTxUIGV4dGVuZHMgQW55VHlwZT4odmFsdWVUeXBlOiBUKSB7XG4gICAgcmV0dXJuIHR5cGVzQXJyYXkodmFsdWVUeXBlKVxuICB9LFxuICBtYXBPYmplY3Q8VCBleHRlbmRzIEFueVR5cGU+KHZhbHVlVHlwZTogVCkge1xuICAgIHJldHVybiB0eXBlc1JlY29yZCh2YWx1ZVR5cGUpXG4gIH0sXG4gIGRhdGVTdHJpbmc6IHR5cGVzTm9uRW1wdHlTdHJpbmcsXG4gIGRhdGVUaW1lc3RhbXA6IHR5cGVzSW50ZWdlcixcbn1cbiJdLCJuYW1lcyI6WyJCdWlsdEluQWN0aW9uIiwiQWN0aW9uQ29udGV4dEFjdGlvblR5cGUiLCJBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZSIsImlzT2JzZXJ2YWJsZU1hcCIsImlzT2JzZXJ2YWJsZVNldCIsImlzT2JzZXJ2YWJsZUFycmF5IiwiaXNPYnNlcnZhYmxlT2JqZWN0IiwibW9ieCIsIm5hbWVzcGFjZSIsImNyZWF0ZUF0b20iLCJydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzIiwic3RhbmRhcmRUeXBlUmVzb2x2ZXJzIiwiYWN0aW9uIiwiTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZSIsIkhvb2tBY3Rpb24iLCJvYnNlcnZhYmxlIiwiV2Fsa1RyZWVNb2RlIiwiY29tcHV0ZWQiLCJpc0FjdGlvbiIsIkZyb3plbkNoZWNrTW9kZSIsInJlYWN0aW9uIiwiaXNPYnNlcnZhYmxlIiwidG9KUyIsImZhc3REZWVwRXF1YWwiLCJvYnNlcnZhYmxlT3B0aW9ucyIsImludGVyY2VwdCIsIm9ic2VydmUiLCJBY3Rpb25UcmFja2luZ1Jlc3VsdCIsImludGVybmFsTW9kZWwiLCJVbmRvRXZlbnRUeXBlIiwiVW5kb1N0b3JlIiwid2hlbiIsIm5zIiwicmVtb3ZlIiwidmFsdWVzIiwiQXJyYXlTZXQiLCJnZXQiLCJoYXMiLCJrZXlzIiwiZW50cmllcyIsIk9iamVjdE1hcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLFFBQU0sOENBQThCOzhCQVdEO1dBQzFCLHdCQUF3QixJQUFJLGNBQWM7QUFBQSxFQUNuRDs4QkFNRSxnQkFDQSxhQUNBOzRCQUV3QixJQUFJLGdCQUFnQjtBQUFBLE1BQzFDO0FBQUEsTUFDQTtBQUFBLEtBQ0Q7QUFBQSxFQUNIOztZQzNCWTs7Ozs7OztFQXlCWixHQXpCWUE7QUEyQlosUUFBTSxzQkFBMkMsSUFBSSxJQUFJLE9BQU8sT0FBT0Esc0JBQWEsQ0FBQzsyQkFXckQ7V0FDdkIsb0JBQW9CLElBQUks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
|
|
8252
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhTW9kZWwvYWN0aW9ucy50cyIsIi4uL3NyYy9hY3Rpb24vYnVpbHRJbkFjdGlvbnMudHMiLCIuLi9zcmMvYWN0aW9uL2NvbnRleHQudHMiLCIuLi9zcmMvYWN0aW9uL2lzTW9kZWxBY3Rpb24udHMiLCIuLi9zcmMvbW9kZWwvbWV0YWRhdGEudHMiLCIuLi9zcmMvdXRpbHMvaW5kZXgudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL21vZGVsSW5mby50cyIsIi4uL3NyYy91dGlscy9tYXBVdGlscy50cyIsIi4uL3NyYy9wYXJlbnQvY29yZS50cyIsIi4uL3NyYy90d2Vha2VyL2NvcmUudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzLnRzIiwiLi4vc3JjL21vZGVsL2dldE1vZGVsTWV0YWRhdGEudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm8udHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvcHJvcC50cyIsIi4uL3NyYy90eXBlcy9nZXRUeXBlSW5mby50cyIsIi4uL3NyYy90eXBlcy9UeXBlQ2hlY2tFcnJvci50cyIsIi4uL3NyYy90eXBlcy9UeXBlQ2hlY2tlci50cyIsIi4uL3NyYy90eXBlcy9vYmplY3RCYXNlZC90eXBlc01vZGVsLnRzIiwiLi4vc3JjL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlLnRzIiwiLi4vc3JjL3R5cGVzL3JlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVycy50cyIsIi4uL3NyYy90eXBlcy9yZXNvbHZlVHlwZUNoZWNrZXIudHMiLCIuLi9zcmMvc25hcHNob3QvaW50ZXJuYWwudHMiLCIuLi9zcmMvc25hcHNob3QvZ2V0U25hcHNob3QudHMiLCIuLi9zcmMvdHlwZXMvdHlwZUNoZWNrLnRzIiwiLi4vbm9kZV9tb2R1bGVzL25hbm9pZC9ub24tc2VjdXJlL2luZGV4LmpzIiwiLi4vc3JjL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWcudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvbW9kZWxDbGFzc0luaXRpYWxpemVyLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL25ld01vZGVsLnRzIiwiLi4vc3JjL2FjdGlvbi9wcm90ZWN0aW9uLnRzIiwiLi4vc3JjL2FjdGlvbi9wZW5kaW5nQWN0aW9ucy50cyIsIi4uL3NyYy9hY3Rpb24vaG9va0FjdGlvbnMudHMiLCIuLi9zcmMvcGFyZW50L2NvcmVPYmplY3RDaGlsZHJlbi50cyIsIi4uL3NyYy9wYXJlbnQvd2Fsa1RyZWUudHMiLCIuLi9zcmMvcm9vdFN0b3JlL2F0dGFjaERldGFjaC50cyIsIi4uL3NyYy9yb290U3RvcmUvcm9vdFN0b3JlLnRzIiwiLi4vc3JjL3BhdGNoL2VtaXRQYXRjaC50cyIsIi4uL3NyYy9kYXRhTW9kZWwvZ2V0RGF0YU1vZGVsTWV0YWRhdGEudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNEYXRhTW9kZWxEYXRhLnRzIiwiLi4vc3JjL2RhdGFNb2RlbC9uZXdEYXRhTW9kZWwudHMiLCIuLi9zcmMvZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWwudHMiLCIuLi9zcmMvZGF0YU1vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2Zyb3plbi9Gcm96ZW4udHMiLCIuLi9zcmMvdHdlYWtlci9Ud2Vha2VyUHJpb3JpdHkudHMiLCIuLi9zcmMvdHdlYWtlci90d2Vha0Zyb3plbi50cyIsIi4uL3NyYy9wYXJlbnQvZmluZFBhcmVudC50cyIsIi4uL3NyYy9wYXJlbnQvZ2V0Q2hpbGRyZW5PYmplY3RzLnRzIiwiLi4vc3JjL3BhcmVudC9maW5kQ2hpbGRyZW4udHMiLCIuLi9zcmMvcGFyZW50L29uQ2hpbGRBdHRhY2hlZFRvLnRzIiwiLi4vc3JjL3BhcmVudC9wYXRoMi50cyIsIi4uL3NyYy90d2Vha2VyL3dpdGhvdXRUeXBlQ2hlY2tpbmcudHMiLCIuLi9zcmMvc25hcHNob3QvU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlQXJyYXlTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWNvbmNpbGVGcm96ZW5TbmFwc2hvdC50cyIsIi4uL25vZGVfbW9kdWxlcy9mYXN0LWRlZXAtZXF1YWwvZXM2L2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzL01vZGVsUG9vbC50cyIsIi4uL3NyYy9zbmFwc2hvdC9hcHBseVNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L29uU25hcHNob3QudHMiLCIuLi9zcmMvdHJlZVV0aWxzL2RlZXBFcXVhbHMudHMiLCIuLi9zcmMvc25hcHNob3QvcmVjb25jaWxlTW9kZWxTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9yZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90LnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzLnRzIiwiLi4vc3JjL3NuYXBzaG90L3JlY29uY2lsZVNuYXBzaG90LnRzIiwiLi4vc3JjL3BhdGNoL2FwcGx5UGF0Y2hlcy50cyIsIi4uL3NyYy90d2Vha2VyL3R5cGVDaGVja2luZy50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrUGxhaW5PYmplY3QudHMiLCIuLi9zcmMvdHdlYWtlci9yZWdpc3RlckRlZmF1bHRUd2Vha2Vycy50cyIsIi4uL3NyYy90d2Vha2VyL3R3ZWFrLnRzIiwiLi4vc3JjL3R3ZWFrZXIvdHdlYWtBcnJheS50cyIsIi4uL3NyYy9zbmFwc2hvdC9mcm9tQXJyYXlTbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9mcm9tRnJvemVuU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbU1vZGVsU25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvZnJvbVBsYWluT2JqZWN0U25hcHNob3QudHMiLCIuLi9zcmMvc25hcHNob3QvcmVnaXN0ZXJEZWZhdWx0U25hcHNob3R0ZXJzLnRzIiwiLi4vc3JjL3NuYXBzaG90L2Zyb21TbmFwc2hvdC50cyIsIi4uL3NyYy9zbmFwc2hvdC9jbG9uZS50cyIsIi4uL3NyYy9wYXJlbnQvc2V0UGFyZW50LnRzIiwiLi4vc3JjL3R3ZWFrZXIvdHdlYWtNb2RlbC50cyIsIi4uL3NyYy9tb2RlbC9uZXdNb2RlbC50cyIsIi4uL3NyYy9tb2RlbC9CYXNlTW9kZWwudHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvcGFyZW50L3BhdGgudHMiLCIuLi9zcmMvYWN0aW9uL21pZGRsZXdhcmUudHMiLCIuLi9zcmMvYWN0aW9uL3dyYXBJbkFjdGlvbi50cyIsIi4uL3NyYy9wYXJlbnQvZGV0YWNoLnRzIiwiLi4vc3JjL21vZGVsU2hhcmVkL2NoZWNrTW9kZWxEZWNvcmF0b3JBcmdzLnRzIiwiLi4vc3JjL2FjdGlvbi9hY3Rpb25EZWNvcmF0b3JVdGlscy50cyIsIi4uL3NyYy9hY3Rpb24vbW9kZWxGbG93LnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9hY3Rpb25zLnRzIiwiLi4vc3JjL2FjdGlvbi9hcHBseURlbGV0ZS50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlNZXRob2RDYWxsLnRzIiwiLi4vc3JjL2FjdGlvbi9hcHBseVNldC50cyIsIi4uL3NyYy9hY3Rpb24vYXBwbHlBY3Rpb24udHMiLCIuLi9zcmMvYWN0aW9uL21vZGVsQWN0aW9uLnRzIiwiLi4vc3JjL2FjdGlvbi9ydW5VbnByb3RlY3RlZC50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL2NvcmUudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9hcnJheVNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9kYXRlU2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL21hcFNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvdXRpbHMudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9vYmplY3RQYXRoU2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL29iamVjdFNuYXBzaG90U2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL3BsYWluT2JqZWN0U2VyaWFsaXplci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL3ByaW1pdGl2ZVNlcmlhbGl6ZXIudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvYWN0aW9uU2VyaWFsaXphdGlvbi9zZXRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL2FjdGlvblNlcmlhbGl6YXRpb24vYWN0aW9uU2VyaWFsaXphdGlvbi50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25TZXJpYWxpemF0aW9uL2FwcGx5U2VyaWFsaXplZEFjdGlvbi50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy9hY3Rpb25UcmFja2luZ01pZGRsZXdhcmUudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvb25BY3Rpb25NaWRkbGV3YXJlLnRzIiwiLi4vc3JjL2FjdGlvbk1pZGRsZXdhcmVzL3JlYWRvbmx5TWlkZGxld2FyZS50cyIsIi4uL3NyYy9wYXRjaC9qc29uUGF0Y2gudHMiLCIuLi9zcmMvcGF0Y2gvcGF0Y2hSZWNvcmRlci50cyIsIi4uL3NyYy9hY3Rpb25NaWRkbGV3YXJlcy90cmFuc2FjdGlvbk1pZGRsZXdhcmUudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNPYmplY3QudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc1VuY2hlY2tlZC50cyIsIi4uL3NyYy90eXBlcy91dGlsaXR5L3R5cGVzT3IudHMiLCIuLi9zcmMvdHlwZXMvdFByb3AudHMiLCIuLi9zcmMvdXRpbHMvY2hhaW5GbnMudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvdXRpbHMudHMiLCIuLi9zcmMvbW9kZWxTaGFyZWQvc2hhcmVkSW50ZXJuYWxNb2RlbC50cyIsIi4uL3NyYy9tb2RlbC9Nb2RlbC50cyIsIi4uL3NyYy9tb2RlbFNoYXJlZC9tb2RlbERlY29yYXRvci50cyIsIi4uL3NyYy90eXBlcy9hcnJheUJhc2VkL3R5cGVzQXJyYXkudHMiLCIuLi9zcmMvYWN0aW9uTWlkZGxld2FyZXMvdW5kb01pZGRsZXdhcmUudHMiLCIuLi9zcmMvY29udGV4dC9jb250ZXh0LnRzIiwiLi4vc3JjL2NvbXB1dGVkVHJlZS9jb21wdXRlZFRyZWUudHMiLCIuLi9zcmMvZGF0YU1vZGVsL0RhdGFNb2RlbC50cyIsIi4uL3NyYy9yZWR1eC9jb25uZWN0UmVkdXhEZXZUb29scy50cyIsIi4uL3NyYy9yZWR1eC9yZWR1eC50cyIsIi4uL3NyYy9yZWYvUmVmLnRzIiwiLi4vc3JjL3JlZi9jb3JlLnRzIiwiLi4vc3JjL3JlZi9jdXN0b21SZWYudHMiLCIuLi9zcmMvcmVmL3Jvb3RSZWYudHMiLCIuLi9zcmMvc3RhbmRhcmRBY3Rpb25zL3N0YW5kYWxvbmVBY3Rpb25zLnRzIiwiLi4vc3JjL3N0YW5kYXJkQWN0aW9ucy9hcnJheUFjdGlvbnMudHMiLCIuLi9zcmMvc3RhbmRhcmRBY3Rpb25zL29iamVjdEFjdGlvbnMudHMiLCIuLi9zcmMvdXRpbHMvdGFnLnRzIiwiLi4vc3JjL3dyYXBwZXJzL2FzTWFwLnRzIiwiLi4vc3JjL3RyYW5zZm9ybXMvYXNNYXAudHMiLCIuLi9zcmMvd3JhcHBlcnMvYXNTZXQudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9hc1NldC50cyIsIi4uL3NyYy90cmFuc2Zvcm1zL2JpZ2ludC50cyIsIi4uL3NyYy90cmFuc2Zvcm1zL0ltbXV0YWJsZURhdGUudHMiLCIuLi9zcmMvdHJhbnNmb3Jtcy9kYXRlLnRzIiwiLi4vc3JjL3RyZWVVdGlscy9kcmFmdC50cyIsIi4uL3NyYy90cmVlVXRpbHMvc2FuZGJveC50cyIsIi4uL3NyYy90eXBlcy9hcnJheUJhc2VkL3R5cGVzVHVwbGUudHMiLCIuLi9zcmMvd3JhcHBlcnMvQXJyYXlTZXQudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNBcnJheVNldC50cyIsIi4uL3NyYy90eXBlcy9vYmplY3RCYXNlZC90eXBlc1JlY29yZC50cyIsIi4uL3NyYy93cmFwcGVycy9PYmplY3RNYXAudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNPYmplY3RNYXAudHMiLCIuLi9zcmMvdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNSZWYudHMiLCIuLi9zcmMvdHlwZXMvcHJpbWl0aXZlQmFzZWQvdHlwZXNFbnVtLnRzIiwiLi4vc3JjL3R5cGVzL3V0aWxpdHkvdHlwZXNSZWZpbmVtZW50LnRzIiwiLi4vc3JjL3R5cGVzL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUmVmaW5lZFByaW1pdGl2ZS50cyIsIi4uL3NyYy90eXBlcy91dGlsaXR5L3R5cGVzTWF5YmUudHMiLCIuLi9zcmMvdHlwZXMvdXRpbGl0eS90eXBlc1RhZy50cyIsIi4uL3NyYy90eXBlcy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuL0Jhc2VEYXRhTW9kZWxcIlxuXG5jb25zdCBkYXRhTW9kZWxBY3Rpb25SZWdpc3RyeSA9IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAge1xuICAgIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPlxuICAgIGZuTmFtZTogc3RyaW5nXG4gIH1cbj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YU1vZGVsQWN0aW9uKGZ1bGxBY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGRhdGFNb2RlbEFjdGlvblJlZ2lzdHJ5LmdldChmdWxsQWN0aW9uTmFtZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERhdGFNb2RlbEFjdGlvbihcbiAgZnVsbEFjdGlvbk5hbWU6IHN0cmluZyxcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxuICBmbk5hbWU6IHN0cmluZ1xuKSB7XG4gIGRhdGFNb2RlbEFjdGlvblJlZ2lzdHJ5LnNldChmdWxsQWN0aW9uTmFtZSwge1xuICAgIG1vZGVsQ2xhc3MsXG4gICAgZm5OYW1lLFxuICB9KVxufVxuIiwiLyoqXG4gKiBBIGJ1aWx0LWluIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gQnVpbHRJbkFjdGlvbiB7XG4gIC8qKlxuICAgKiBhcHBseVBhdGNoZXNcbiAgICovXG4gIEFwcGx5UGF0Y2hlcyA9IFwiJCRhcHBseVBhdGNoZXNcIixcbiAgLyoqXG4gICAqIGFwcGx5U25hcHNob3RcbiAgICovXG4gIEFwcGx5U25hcHNob3QgPSBcIiQkYXBwbHlTbmFwc2hvdFwiLFxuICAvKipcbiAgICogZGV0YWNoXG4gICAqL1xuICBEZXRhY2ggPSBcIiQkZGV0YWNoXCIsXG4gIC8qKlxuICAgKiBhcHBseVNldFxuICAgKi9cbiAgQXBwbHlTZXQgPSBcIiQkYXBwbHlTZXRcIixcbiAgLyoqXG4gICAqIGFwcGx5RGVsZXRlXG4gICAqL1xuICBBcHBseURlbGV0ZSA9IFwiJCRhcHBseURlbGV0ZVwiLFxuICAvKipcbiAgICogYXBwbHlNZXRob2RDYWxsXG4gICAqL1xuICBBcHBseU1ldGhvZENhbGwgPSBcIiQkYXBwbHlNZXRob2RDYWxsXCIsXG59XG5cbmNvbnN0IGJ1aWx0SW5BY3Rpb25WYWx1ZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KE9iamVjdC52YWx1ZXMoQnVpbHRJbkFjdGlvbikpXG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIGFjdGlvbiBuYW1lIGlzIGEgYnVpbHQtaW4gYWN0aW9uLCB0aGlzIGlzLCBvbmUgb2Y6XG4gKiAtIGFwcGx5UGF0Y2hlcygpXG4gKiAtIGFwcGx5U25hcHNob3QoKVxuICogLSBkZXRhY2goKVxuICpcbiAqIEBwYXJhbSBhY3Rpb25OYW1lIEFjdGlvbiBuYW1lIHRvIGNoZWNrLlxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIGJ1aWx0LWluIGFjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCdWlsdEluQWN0aW9uKGFjdGlvbk5hbWU6IHN0cmluZyk6IGFjdGlvbk5hbWUgaXMgQnVpbHRJbkFjdGlvbiB7XG4gIHJldHVybiBidWlsdEluQWN0aW9uVmFsdWVzLmhhcyhhY3Rpb25OYW1lKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuXG4vKipcbiAqIExvdyBsZXZlbCBhY3Rpb24gY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Db250ZXh0IHtcbiAgLyoqXG4gICAqIEFjdGlvbiBuYW1lXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25OYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIEFjdGlvbiB0eXBlLCBzeW5jIG9yIGFzeW5jLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGVcbiAgLyoqXG4gICAqIEFjdGlvbiB0YXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBBbnlNb2RlbFxuICAvKipcbiAgICogQXJyYXkgb2YgYWN0aW9uIGFyZ3VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M6IFJlYWRvbmx5QXJyYXk8YW55PlxuICAvKipcbiAgICogUGFyZW50IGFjdGlvbiBjb250ZXh0LCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRDb250ZXh0PzogQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogUm9vdCBhY3Rpb24gY29udGV4dCwgb3IgaXRzZWxmIGlmIHRoZSByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdENvbnRleHQ6IEFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIFByZXZpb3VzIGFzeW5jIHN0ZXAgY29udGV4dCwgdW5kZWZpbmVkIGZvciBzeW5jIGFjdGlvbnMgb3IgdGhlIGZpcnN0IGFjdGlvbiBvZiBhIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBwcmV2aW91c0FzeW5jU3RlcENvbnRleHQ/OiBBY3Rpb25Db250ZXh0XG4gIC8qKlxuICAgKiBTcGF3biBhc3luYyBzdGVwIGNvbnRleHQsIHVuZGVmaW5lZCBmb3Igc3luYyBhY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Bhd25Bc3luY1N0ZXBDb250ZXh0PzogQWN0aW9uQ29udGV4dFxuICAvKipcbiAgICogQXN5bmMgc3RlcCB0eXBlLCBvciB1bmRlZmluZWQgZm9yIHN5bmMgYWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGFzeW5jU3RlcFR5cGU/OiBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZVxuICAvKipcbiAgICogQ3VzdG9tIGRhdGEgZm9yIHRoZSBhY3Rpb24gY29udGV4dCB0byBiZSBzZXQgYnkgbWlkZGxld2FyZXMsIGFuIG9iamVjdC5cbiAgICogU3ltYm9scyBtdXN0IGJlIHVzZWQgYXMga2V5cyB0byBhdm9pZCBuYW1lIGNsYXNoaW5nIGJldHdlZW4gbWlkZGxld2FyZXMuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBSZWNvcmQ8c3ltYm9sLCBhbnk+XG59XG5cbi8qKlxuICogQWN0aW9uIHR5cGUsIHN5bmMgb3IgYXN5bmMuXG4gKi9cbmV4cG9ydCBlbnVtIEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIHtcbiAgU3luYyA9IFwic3luY1wiLFxuICBBc3luYyA9IFwiYXN5bmNcIixcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBzdGVwIHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlIHtcbiAgLyoqXG4gICAqIFRoZSBmbG93IGlzIGFib3V0IHRvIHN0YXJ0LlxuICAgKi9cbiAgU3Bhd24gPSBcInNwYXduXCIsXG4gIC8qKlxuICAgKiBUaGUgZmxvdyBpcyBhYm91dCB0byByZXR1cm4gKGZpbmlzaCkuXG4gICAqL1xuICBSZXR1cm4gPSBcInJldHVyblwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgaXMgYWJvdXQgdG8gY29udGludWUuXG4gICAqL1xuICBSZXN1bWUgPSBcInJlc3VtZVwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgeWllbGQganVzdCB0aHJldywgd2hpY2ggbWlnaHQgYmUgcmVjb3ZlcmVkIChjYXVnaHQpIG9yIG5vdC5cbiAgICovXG4gIFJlc3VtZUVycm9yID0gXCJyZXN1bWVFcnJvclwiLFxuICAvKipcbiAgICogVGhlIGZsb3cgaXMgYWJvdXQgdG8gdGhyb3cgYW4gZXJyb3IgdG8gdGhlIGZsb3cgY2FsbGVyLlxuICAgKi9cbiAgVGhyb3cgPSBcInRocm93XCIsXG59XG5cbmxldCBjdXJyZW50QWN0aW9uQ29udGV4dDogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZFxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnRseSBydW5uaW5nIGFjdGlvbiBjb250ZXh0LCBvciB1bmRlZmluZWQgaWYgbm9uZS5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKTogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjdXJyZW50QWN0aW9uQ29udGV4dFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFNldHMgdGhlIGN1cnJlbnQgYWN0aW9uIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGN0eCBDdXJyZW50IGFjdGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudEFjdGlvbkNvbnRleHQoY3R4OiBBY3Rpb25Db250ZXh0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGN1cnJlbnRBY3Rpb25Db250ZXh0ID0gY3R4XG59XG4iLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxBY3Rpb25TeW1ib2wgPSBTeW1ib2woXCJtb2RlbEFjdGlvblwiKVxuXG4vKipcbiAqIFJldHVybnMgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIGEgbW9kZWwgYWN0aW9uIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbEFjdGlvbihmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiICYmIG1vZGVsQWN0aW9uU3ltYm9sIGluIGZuXG59XG4iLCIvKipcbiAqIEtleSB3aGVyZSBtb2RlbCBzbmFwc2hvdHMgd2lsbCBzdG9yZSBtb2RlbCB0eXBlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgY29uc3QgbW9kZWxUeXBlS2V5ID0gXCIkbW9kZWxUeXBlXCJcblxuLyoqXG4gKiBLZXkgdGhhdCBzZXJ2ZXMgYXMgcHJveHkgdG8gdGhlIG1vZGVsIHByb3BlcnR5IGRlc2lnbmVkIGFzICdpZFByb3AnIChpZiBhbnkpLlxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJZEtleSA9IFwiJG1vZGVsSWRcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogUmV0dXJucyBpZiBhIGdpdmVuIGtleSBpcyBhIHJlc2VydmVkIGtleSBpbiBtb2RlbCBzbmFwc2hvdHMuXG4gKlxuICogQHBhcmFtIGtleVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzZXJ2ZWRNb2RlbEtleShrZXk6IHN0cmluZykge1xuICAvLyBub3RlICRtb2RlbElkIGlzIE5PVCBhIHJlc2VydmVkIGtleSwgc2luY2UgaXQgd2lsbCBldmVudHVhbGx5IGVuZCB1cCBpbiB0aGUgZGF0YVxuICAvLyBhbmQgY2FuIGFjdHVhbGx5IGJlIGNoYW5nZWRcbiAgcmV0dXJuIGtleSA9PT0gbW9kZWxUeXBlS2V5XG59XG4iLCJpbXBvcnQgKiBhcyBtb2J4IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIElPYnNlcnZhYmxlQXJyYXksXG4gIGlzT2JzZXJ2YWJsZUFycmF5LFxuICBpc09ic2VydmFibGVNYXAsXG4gIGlzT2JzZXJ2YWJsZU9iamVjdCxcbiAgaXNPYnNlcnZhYmxlU2V0LFxuICBPYnNlcnZhYmxlTWFwLFxuICBPYnNlcnZhYmxlU2V0LFxufSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBKU09OUHJpbWl0aXZlVmFsdWUsIFByaW1pdGl2ZVZhbHVlIH0gZnJvbSBcIi4vdHlwZXNcIlxuXG4vKipcbiAqIEEgbW9ieC1rZXlzdG9uZSBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKG1zZylcblxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZUVycm9yLnByb3RvdHlwZSlcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZUVycm9yKG1zZylcbn1cblxuY29uc3Qgd3JpdGFibGVIaWRkZW5Qcm9wRGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0ge1xuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHZhbHVlOiB1bmRlZmluZWQsXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRIaWRkZW5Qcm9wKG9iamVjdDogYW55LCBwcm9wTmFtZTogUHJvcGVydHlLZXksIHZhbHVlOiBhbnksIHdyaXRhYmxlID0gdHJ1ZSkge1xuICBpZiAod3JpdGFibGUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwgd3JpdGFibGVIaWRkZW5Qcm9wRGVzY3JpcHRvcilcbiAgICBvYmplY3RbcHJvcE5hbWVdID0gdmFsdWVcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wTmFtZSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQcm9wUmVhZG9ubHk8VD4ob2JqZWN0OiBULCBwcm9wTmFtZToga2V5b2YgVCwgZW51bWVyYWJsZTogYm9vbGVhbikge1xuICBjb25zdCBwcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wTmFtZSlcbiAgaWYgKHByb3BEZXNjKSB7XG4gICAgcHJvcERlc2MuZW51bWVyYWJsZSA9IGVudW1lcmFibGVcbiAgICBpZiAocHJvcERlc2MuZ2V0KSB7XG4gICAgICBkZWxldGUgcHJvcERlc2Muc2V0XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BEZXNjLndyaXRhYmxlID0gZmFsc2VcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcE5hbWUsIHByb3BEZXNjKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIlxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcmltaXRpdmVWYWx1ZSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNKU09OUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSlNPTlByaW1pdGl2ZVZhbHVlIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpXG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRnJvbUFycmF5PFQ+KGFycmF5OiBUW10sIHZhbHVlOiBUKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IGFycmF5LmluZGV4T2YodmFsdWUpXG4gIGlmIChpbmRleCA+PSAwKSB7XG4gICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hcCh2YWw6IHVua25vd24pOiB2YWwgaXMgTWFwPGFueSwgYW55PiB8IE9ic2VydmFibGVNYXAge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgTWFwIHx8IGlzT2JzZXJ2YWJsZU1hcCh2YWwpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NldCh2YWw6IHVua25vd24pOiB2YWwgaXMgU2V0PGFueT4gfCBPYnNlcnZhYmxlU2V0IHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIFNldCB8fCBpc09ic2VydmFibGVTZXQodmFsKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSh2YWw6IHVua25vd24pOiB2YWwgaXMgYW55W10gfCBJT2JzZXJ2YWJsZUFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc09ic2VydmFibGVBcnJheSh2YWwpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbkRldk1vZGUoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCJcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzT2JqZWN0KHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIG9iamVjdCB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGFuIG9iamVjdGApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24sIGFyZ05hbWU6IHN0cmluZyk6IGFzc2VydHMgdmFsdWUgaXMgb2JqZWN0IHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHBsYWluIG9iamVjdGApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgYXJnTmFtZTogc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBvYmplY3Qge1xuICBpZiAoIWlzT2JzZXJ2YWJsZU9iamVjdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYW4gb2JzZXJ2YWJsZSBvYmplY3RgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc09ic2VydmFibGVBcnJheShcbiAgdmFsdWU6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZ1xuKTogYXNzZXJ0cyB2YWx1ZSBpcyBJT2JzZXJ2YWJsZUFycmF5IHtcbiAgaWYgKCFpc09ic2VydmFibGVBcnJheSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYW4gb2JzZXJ2YWJsZSBhcnJheWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzTWFwKHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIE1hcDxhbnksIGFueT4ge1xuICBpZiAoIWlzTWFwKHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIG1hcGApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzU2V0KHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIFNldDxhbnk+IHtcbiAgaWYgKCFpc1NldCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBzZXRgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc0Z1bmN0aW9uKHZhbHVlOiB1bmtub3duLCBhcmdOYW1lOiBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIEZ1bmN0aW9uIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgZnVuY3Rpb25gKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc1ByaW1pdGl2ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZ1xuKTogYXNzZXJ0cyB2YWx1ZSBpcyBQcmltaXRpdmVWYWx1ZSB7XG4gIGlmICghaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgcHJpbWl0aXZlYClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNTdHJpbmcodmFsdWU6IHVua25vd24sIGFyZ05hbWU6IHN0cmluZyk6IGFzc2VydHMgdmFsdWUgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBiZSBhIHN0cmluZ2ApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWNvcmF0ZU1ldGhvZE9yRmllbGREYXRhIHtcbiAgdGFyZ2V0OiBhbnlcbiAgcHJvcGVydHlLZXk6IHN0cmluZ1xuICBiYXNlRGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBhbnkgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcnVuQWZ0ZXJOZXdTeW1ib2wgPSBTeW1ib2woXCJydW5BZnRlck5ld1wiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcnVuQmVmb3JlT25Jbml0U3ltYm9sID0gU3ltYm9sKFwicnVuQmVmb3JlT25Jbml0XCIpXG5cbnR5cGUgV3JhcEZ1bmN0aW9uID0gKGRhdGE6IERlY29yYXRlTWV0aG9kT3JGaWVsZERhdGEsIGZuOiBhbnkpID0+IGFueVxudHlwZSBMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnNBcnJheSA9ICgoaW5zdGFuY2U6IGFueSkgPT4gdm9pZClbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24oXG4gIHRhcmdldDogYW55LFxuICBzeW1ib2w6IHN5bWJvbCxcbiAgZm46IChpbnN0YW5jZTogYW55KSA9PiB2b2lkXG4pIHtcbiAgbGV0IGFycmF5OiBMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnNBcnJheSA9IHRhcmdldFtzeW1ib2xdXG4gIGlmICghYXJyYXkgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIHN5bWJvbCkpIHtcbiAgICAvLyBsZWF2ZSBiYXNlIGFycmF5IHVubW9kaWZpZWQsIGNyZWF0ZSBuZXcgYXJyYXkgaW4gdGhlIGRlcml2ZWQgY2xhc3NcbiAgICBhcnJheSA9IGFycmF5ID8gYXJyYXkuc2xpY2UoKSA6IFtdXG4gICAgYWRkSGlkZGVuUHJvcCh0YXJnZXQsIHN5bWJvbCwgYXJyYXkpXG4gIH1cbiAgYXJyYXkucHVzaChmbilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRlV3JhcE1ldGhvZE9yRmllbGQoXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbiAgZGF0YTogRGVjb3JhdGVNZXRob2RPckZpZWxkRGF0YSxcbiAgd3JhcDogV3JhcEZ1bmN0aW9uXG4pOiBhbnkge1xuICBjb25zdCB7IHRhcmdldCwgcHJvcGVydHlLZXksIGJhc2VEZXNjcmlwdG9yIH0gPSBkYXRhXG5cbiAgY29uc3QgYWRkRmllbGREZWNvcmF0b3IgPSAoKSA9PiB7XG4gICAgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24odGFyZ2V0LCBydW5BZnRlck5ld1N5bWJvbCwgKGluc3RhbmNlKSA9PiB7XG4gICAgICBpbnN0YW5jZVtwcm9wZXJ0eUtleV0gPSB3cmFwKGRhdGEsIGluc3RhbmNlW3Byb3BlcnR5S2V5XSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKGJhc2VEZXNjcmlwdG9yKSB7XG4gICAgaWYgKGJhc2VEZXNjcmlwdG9yLmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBAJHtkZWNvcmF0b3JOYW1lfSBjYW5ub3QgYmUgdXNlZCB3aXRoIGdldHRlcnNgKVxuICAgIH1cblxuICAgIGlmIChiYXNlRGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgLy8gYmFiZWwgLyB0eXBlc2NyaXB0IC0gbWV0aG9kIGRlY29yYXRvclxuICAgICAgLy8gQGFjdGlvbiBtZXRob2QoKSB7IH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogd3JhcChkYXRhLCBiYXNlRGVzY3JpcHRvci52YWx1ZSksXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGJhYmVsIC0gZmllbGQgZGVjb3JhdG9yOiBAYWN0aW9uIG1ldGhvZCA9ICgpID0+IHt9XG4gICAgICBhZGRGaWVsZERlY29yYXRvcigpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHR5cGVzY3JpcHQgLSBmaWVsZCBkZWNvcmF0b3JcbiAgICBhZGRGaWVsZERlY29yYXRvcigpXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyh0YXJnZXQ6IGFueSwgc3ltYm9sOiBzeW1ib2wpOiB2b2lkIHtcbiAgY29uc3QgZm5zOiBMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnNBcnJheSB8IHVuZGVmaW5lZCA9IHRhcmdldFtzeW1ib2xdXG4gIGlmIChmbnMpIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZucykge1xuICAgICAgZm4odGFyZ2V0KVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCB3YXJuaW5nc0FscmVhZHlEaXNwbGF5ZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nV2FybmluZyh0eXBlOiBcIndhcm5cIiB8IFwiZXJyb3JcIiwgbXNnOiBzdHJpbmcsIHVuaXF1ZUtleT86IHN0cmluZyk6IHZvaWQge1xuICBpZiAodW5pcXVlS2V5KSB7XG4gICAgaWYgKHdhcm5pbmdzQWxyZWFkeURpc3BsYXllZC5oYXModW5pcXVlS2V5KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdhcm5pbmdzQWxyZWFkeURpc3BsYXllZC5hZGQodW5pcXVlS2V5KVxuICB9XG5cbiAgbXNnID0gXCJbbW9ieC1rZXlzdG9uZV0gXCIgKyBtc2dcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIndhcm5cIjpcbiAgICAgIGNvbnNvbGUud2Fybihtc2cpXG4gICAgICBicmVha1xuICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBmYWlsdXJlKGB1bmtub3duIGxvZyB0eXBlIC0gJHt0eXBlfWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhenk8QSBleHRlbmRzIHVua25vd25bXSwgUj4oZ2V0dGVyOiAoLi4uYXJnczogQSkgPT4gUik6IHR5cGVvZiBnZXR0ZXIge1xuICBsZXQgbWVtb2l6ZWRWYWx1ZTogUlxuICBsZXQgbWVtb2l6ZWQgPSBmYWxzZVxuXG4gIHJldHVybiAoLi4uYXJnczogQSk6IFIgPT4ge1xuICAgIGlmICghbWVtb2l6ZWQpIHtcbiAgICAgIG1lbW9pemVkVmFsdWUgPSBnZXR0ZXIoLi4uYXJncylcbiAgICAgIG1lbW9pemVkID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gbWVtb2l6ZWRWYWx1ZVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBpZGVudGl0eUZuID0gPFQ+KHg6IFQpOiBUID0+IHhcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vYng2ID0ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jb25jYXRcbiAgbWFrZU9ic2VydmFibGU6IChtb2J4IGFzIGFueSlbXG4gICAgLy8ganVzdCB0byBlbnN1cmUgaW1wb3J0ICogaXMga2VwdCBwcm9wZXJseVxuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoXCJsXCIuY2hhckNvZGVBdCgwKSArIDEpICsgXCJha2VPYnNlcnZhYmxlXCJcbiAgXSxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOYW1lVG9TZXR0ZXJOYW1lKHByb3BOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHNldCR7cHJvcE5hbWVbMF0udG9VcHBlckNhc2UoKX0ke3Byb3BOYW1lLnNsaWNlKDEpfWBcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vYnhWZXJzaW9uKCk6IG51bWJlciB7XG4gIGlmIChtb2J4Ni5tYWtlT2JzZXJ2YWJsZSEpIHtcbiAgICByZXR1cm4gNlxuICB9IGVsc2Uge1xuICAgIHJldHVybiA1XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG5hbWVzcGFjZSA9IFwibW9ieC1rZXlzdG9uZVwiXG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IEZsYXR0ZW4sIElzTmV2ZXJUeXBlIH0gZnJvbSBcIi4uL3V0aWxzL3R5cGVzXCJcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxQcm9wc1RvU25hcHNob3RDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90RGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YSxcbiAgTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbn0gZnJvbSBcIi4vcHJvcFwiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgcHJvcHNUeXBlU3ltYm9sID0gU3ltYm9sKFwicHJvcHNUeXBlXCIpXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sID0gU3ltYm9sKFwiZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlXCIpXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbCA9IFN5bWJvbChcInRvU25hcHNob3RPdmVycmlkZVR5cGVcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wgPSBTeW1ib2woXCJtb2RlbEluaXRpYWxpemVkXCIpXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGluc3RhbmNlIHR5cGUgb2YgYSBtb2RlbCBjbGFzcy5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxDbGFzczxNIGV4dGVuZHMgQW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+ID0ge1xuICBuZXcgKGluaXRpYWxEYXRhOiBhbnkpOiBNXG5cbiAgZnJvbVNuYXBzaG90UHJvY2Vzc29yPyhzbjogYW55KTogYW55XG4gIHRvU25hcHNob3RQcm9jZXNzb3I/KHNuOiBhbnksIG1vZGVsSW5zdGFuY2U6IGFueSk6IGFueVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBpbnN0YW5jZSB0eXBlIG9mIGFuIGFic3RyYWN0IG1vZGVsIGNsYXNzLlxuICovXG5leHBvcnQgdHlwZSBBYnN0cmFjdE1vZGVsQ2xhc3M8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IGFic3RyYWN0IG5ldyAoXG4gIGluaXRpYWxEYXRhOiBhbnlcbikgPT4gTVxuXG4vKipcbiAqIFRoZSBwcm9wcyBvZiBhIG1vZGVsLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzT2Y8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IE1bdHlwZW9mIHByb3BzVHlwZVN5bWJvbF1cblxuLyoqXG4gKiBUaGUgZGF0YSB0eXBlIG9mIGEgbW9kZWwsIHdpdGhvdXQgdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsVW50cmFuc2Zvcm1lZERhdGE8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9IEZsYXR0ZW48TVtcIiRcIl0+XG5cbi8qKlxuICogVGhlIGNyZWF0aW9uIGRhdGEgdHlwZSBvZiBhIG1vZGVsLCB3aXRob3V0IHRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkLlxuICovXG5leHBvcnQgdHlwZSBNb2RlbFVudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9XG4gIE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8TW9kZWxQcm9wc09mPE0+PlxuXG4vKipcbiAqIFRoZSBkYXRhIHR5cGUgb2YgYSBtb2RlbCwgd2l0aCB0cmFuc2Zvcm1hdGlvbnMgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxEYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4gPSBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGE8XG4gIE1vZGVsUHJvcHNPZjxNPlxuPlxuXG4vKipcbiAqIFRoZSBjcmVhdGlvbiBkYXRhIHR5cGUgb2YgYSBtb2RlbCwgd2l0aCB0cmFuc2Zvcm1hdGlvbnMgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxDcmVhdGlvbkRhdGE8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPiA9XG4gIE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPE1vZGVsUHJvcHNPZjxNPj5cblxuLyoqXG4gKiBUaGUgZnJvbSBzbmFwc2hvdCB0eXBlIG9mIGEgbW9kZWwuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFNuYXBzaG90SW5PZjxNb2RlbD4gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxGcm9tU25hcHNob3Q8TSBleHRlbmRzIEFueU1vZGVsPiA9IElzTmV2ZXJUeXBlPFxuICBNW3R5cGVvZiBmcm9tU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YTxNb2RlbFByb3BzT2Y8TT4+LFxuICBNW3R5cGVvZiBmcm9tU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2xdXG4+ICYgeyBbbW9kZWxUeXBlS2V5XT86IHN0cmluZyB9XG5cbi8qKlxuICogVGhlIHRvIHNuYXBzaG90IHR5cGUgb2YgYSBtb2RlbC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU25hcHNob3RPdXRPZjxNb2RlbD4gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxUb1NuYXBzaG90PE0gZXh0ZW5kcyBBbnlNb2RlbD4gPSBJc05ldmVyVHlwZTxcbiAgTVt0eXBlb2YgdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF0sXG4gIE1vZGVsUHJvcHNUb1NuYXBzaG90RGF0YTxNb2RlbFByb3BzT2Y8TT4+LFxuICBNW3R5cGVvZiB0b1NuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXVxuPiAmIHsgW21vZGVsVHlwZUtleV0/OiBzdHJpbmcgfVxuXG4vKipcbiAqIFRyaWNrcyBUeXBlU2NyaXB0IGludG8gYWNjZXB0aW5nIGEgcGFydGljdWxhciBraW5kIG9mIGdlbmVyaWMgY2xhc3MgYXMgYSBwYXJhbWV0ZXIgZm9yIGBFeHRlbmRlZE1vZGVsYC5cbiAqIERvZXMgbm90aGluZyBpbiBydW50aW1lLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBHZW5lcmljIG1vZGVsIGNsYXNzIHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBHZW5lcmljIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsQ2xhc3M8VCBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPih0eXBlOiB7XG4gIHByb3RvdHlwZTogVFxufSk6IE1vZGVsQ2xhc3M8VD4ge1xuICByZXR1cm4gdHlwZSBhcyBhbnlcbn1cbiIsImltcG9ydCB0eXBlIHsgQW55RGF0YU1vZGVsIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuL0Jhc2VNb2RlbFNoYXJlZFwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxJbmZvIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPlxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJbmZvQnlOYW1lOiB7XG4gIFtuYW1lOiBzdHJpbmddOiBNb2RlbEluZm9cbn0gPSB7fVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJbmZvQnlDbGFzcyA9IG5ldyBNYXA8TW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4sIE1vZGVsSW5mbz4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxJbmZvRm9yTmFtZShuYW1lOiBzdHJpbmcpOiBNb2RlbEluZm8gfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxJbmZvQnlOYW1lW25hbWVdXG59XG4iLCJ0eXBlIEFueU1hcDxWID0gYW55PiA9IE1hcDxhbnksIFY+IHwgV2Vha01hcDxhbnksIFY+XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZTxLLCBWLCBDID0gVj4obWFwOiBNYXA8SywgVj4sIGtleTogSywgY3JlYXRlOiAoKSA9PiBDKTogVlxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yQ3JlYXRlPEsgZXh0ZW5kcyBvYmplY3QsIFYsIEMgPSBWPihcbiAgbWFwOiBXZWFrTWFwPEssIFY+LFxuICBrZXk6IEssXG4gIGNyZWF0ZTogKCkgPT4gQ1xuKTogVlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JDcmVhdGU8Vj4obWFwOiBBbnlNYXA8Vj4sIGtleTogYW55LCBjcmVhdGU6ICgpID0+IFYpIHtcbiAgbGV0IHZhbHVlID0gbWFwLmdldChrZXkpXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSBjcmVhdGUoKVxuICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cbiIsImltcG9ydCB7IGNyZWF0ZUF0b20sIElBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi9wYXRoXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG9iamVjdFBhcmVudHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFBhcmVudFBhdGg8b2JqZWN0PiB8IHVuZGVmaW5lZD4oKVxuXG5jb25zdCBvYmplY3RQYXJlbnRzQXRvbXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJlbnRQYXRoRXF1YWxzKFxuICBwYXJlbnRQYXRoMTogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkLFxuICBwYXJlbnRQYXRoMjogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkLFxuICBjb21wYXJlUGF0aCA9IHRydWVcbikge1xuICBpZiAoIXBhcmVudFBhdGgxICYmICFwYXJlbnRQYXRoMikgcmV0dXJuIHRydWVcbiAgaWYgKCFwYXJlbnRQYXRoMSB8fCAhcGFyZW50UGF0aDIpIHJldHVybiBmYWxzZVxuICBjb25zdCBwYXJlbnRFcXVhbHMgPSBwYXJlbnRQYXRoMS5wYXJlbnQgPT09IHBhcmVudFBhdGgyLnBhcmVudFxuICBpZiAoIXBhcmVudEVxdWFscykgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBjb21wYXJlUGF0aCA/IHBhcmVudFBhdGgxLnBhdGggPT09IHBhcmVudFBhdGgyLnBhdGggOiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhcmVudFBhdGhBdG9tKG9iajogb2JqZWN0KSB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShvYmplY3RQYXJlbnRzQXRvbXMsIG9iaiwgKCkgPT4gY3JlYXRlQXRvbShcInBhcmVudEF0b21cIikpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRQYXJlbnRQYXRoT2JzZXJ2ZWQobm9kZTogb2JqZWN0KSB7XG4gIGNyZWF0ZVBhcmVudFBhdGhBdG9tKG5vZGUpLnJlcG9ydE9ic2VydmVkKClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydFBhcmVudFBhdGhDaGFuZ2VkKG5vZGU6IG9iamVjdCkge1xuICBjcmVhdGVQYXJlbnRQYXRoQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRhdGFPYmplY3RQYXJlbnQgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdD4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YVRvTW9kZWxOb2RlPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQpOiBUIHtcbiAgY29uc3QgbW9kZWxOb2RlID0gZGF0YU9iamVjdFBhcmVudC5nZXQobm9kZSlcbiAgcmV0dXJuIChtb2RlbE5vZGUgYXMgVCkgPz8gbm9kZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxUb0RhdGFOb2RlPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IFQpOiBUIHtcbiAgcmV0dXJuIGlzTW9kZWwobm9kZSkgPyBub2RlLiQgOiBub2RlXG59XG4iLCJpbXBvcnQgeyBydW5JbkFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGRhdGFPYmplY3RQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgdHdlYWtlZE9iamVjdHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIHVuZGVmaW5lZCB8ICgoKSA9PiB2b2lkKT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUd2Vha2VkT2JqZWN0KHZhbHVlOiB1bmtub3duLCBjYW5CZURhdGFPYmplY3Q6IGJvb2xlYW4pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICBpZiAoIWNhbkJlRGF0YU9iamVjdCAmJiBkYXRhT2JqZWN0UGFyZW50Lmhhcyh2YWx1ZSBhcyBvYmplY3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHR3ZWFrZWRPYmplY3RzLmhhcyh2YWx1ZSBhcyBvYmplY3QpXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gb2JqZWN0IGlzIG5vdyBhIHRyZWUgbm9kZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IGlzIGEgdHJlZSBub2RlLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyZWVOb2RlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICFpc1ByaW1pdGl2ZSh2YWx1ZSkgJiYgaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCBmYWxzZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR3ZWFrZWRPYmplY3QoXG4gIHRyZWVOb2RlOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcsXG4gIGNhbkJlRGF0YU9iamVjdCA9IGZhbHNlXG4pOiBhc3NlcnRzIHRyZWVOb2RlIGlzIG9iamVjdCB7XG4gIGlmICghY2FuQmVEYXRhT2JqZWN0ICYmIGRhdGFPYmplY3RQYXJlbnQuaGFzKHRyZWVOb2RlIGFzIG9iamVjdCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgdGhlIG1vZGVsIG9iamVjdCBpbnN0YW5jZSBpbnN0ZWFkIG9mIHRoZSAnJCcgc3ViLW9iamVjdGApXG4gIH1cbiAgaWYgKGlzUHJpbWl0aXZlKHRyZWVOb2RlKSB8fCAhaXNUd2Vha2VkT2JqZWN0KHRyZWVOb2RlLCB0cnVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgJHthcmdOYW1lfSBtdXN0IGJlIGEgdHJlZSBub2RlICh1c3VhbGx5IGEgbW9kZWwgb3IgYSBzaGFsbG93IC8gZGVlcCBjaGlsZCBwYXJ0IG9mIGEgbW9kZWwgJ2RhdGEnIG9iamVjdClgXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyBhIGdpdmVuIG9iamVjdCBpcyBub3cgYSB0cmVlIG5vZGUsIG9yIHRocm93cyBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIGFyZ05hbWUgQXJndW1lbnQgbmFtZSwgcGFydCBvZiB0aGUgdGhyb3duIGVycm9yIGRlc2NyaXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNUcmVlTm9kZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZyA9IFwiYXJndW1lbnRcIlxuKTogYXNzZXJ0cyB2YWx1ZSBpcyBvYmplY3Qge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBhcmdOYW1lLCBmYWxzZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGxldCBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyhmbjogKCkgPT4gdm9pZCkge1xuICBjb25zdCBvbGQgPSBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzXG4gIHJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgPSB0cnVlXG4gIHRyeSB7XG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgZm4oKVxuICAgIH0pXG4gIH0gZmluYWxseSB7XG4gICAgcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyA9IG9sZFxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgbW9kZWxNZXRhZGF0YVN5bWJvbCA9IFN5bWJvbChcIm1vZGVsTWV0YWRhdGFcIilcbmV4cG9ydCBjb25zdCBtb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sID0gU3ltYm9sKFwibW9kZWxVbndyYXBwZWRDbGFzc1wiKVxuZXhwb3J0IGNvbnN0IHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wgPSBTeW1ib2woXCJydW5BZnRlck1vZGVsRGVjb3JhdG9yXCIpXG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsTWV0YWRhdGFTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzXCJcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBpc01vZGVsLCBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQXNzb2NpYXRlZCBtb2RlbCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEFzc29jaWF0ZWQgZGF0YSB0eXBlIGZvciBydW50aW1lIGNoZWNraW5nIChpZiBhbnkpLlxuICAgKi9cbiAgZGF0YVR5cGU/OiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IHVzZWQgYXMgbW9kZWwgaWQuXG4gICAqL1xuICBtb2RlbElkUHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBBIHZhbHVlIHR5cGUgd2lsbCBiZSBjbG9uZWQgYXV0b21hdGljYWxseSB3aGVuIGJlaW5nIGF0dGFjaGVkIHRvIGEgbmV3IHRyZWUuXG4gICAqL1xuICB2YWx1ZVR5cGU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGZvciBhIG1vZGVsIGluc3RhbmNlIG9yIGNsYXNzLlxuICpcbiAqIEBwYXJhbSBtb2RlbENsYXNzT3JJbnN0YW5jZSBNb2RlbCBjbGFzcyBvciBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxNZXRhZGF0YShcbiAgbW9kZWxDbGFzc09ySW5zdGFuY2U6IEFueU1vZGVsIHwgTW9kZWxDbGFzczxBbnlNb2RlbD5cbik6IE1vZGVsTWV0YWRhdGEge1xuICBpZiAoaXNNb2RlbChtb2RlbENsYXNzT3JJbnN0YW5jZSkpIHtcbiAgICByZXR1cm4gKG1vZGVsQ2xhc3NPckluc3RhbmNlIGFzIGFueSkuY29uc3RydWN0b3JbbW9kZWxNZXRhZGF0YVN5bWJvbF1cbiAgfSBlbHNlIGlmIChpc01vZGVsQ2xhc3MobW9kZWxDbGFzc09ySW5zdGFuY2UpKSB7XG4gICAgcmV0dXJuIChtb2RlbENsYXNzT3JJbnN0YW5jZSBhcyBhbnkpW21vZGVsTWV0YWRhdGFTeW1ib2xdXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgbW9kZWxDbGFzc09ySW5zdGFuY2UgbXVzdCBiZSBhIG1vZGVsIGNsYXNzIG9yIGluc3RhbmNlYClcbiAgfVxufVxuXG5jb25zdCBtb2RlbElkUHJvcGVydHlOYW1lQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZyB8IHVuZGVmaW5lZD4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShcbiAgICBtb2RlbElkUHJvcGVydHlOYW1lQ2FjaGUsXG4gICAgbW9kZWxDbGFzcyxcbiAgICAoKSA9PiBnZXRNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhc3MpLm1vZGVsSWRQcm9wZXJ0eVxuICApXG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BzIH0gZnJvbSBcIi4vcHJvcFwiXG5cbmNvbnN0IG1vZGVsUHJvcGVydGllc1N5bWJvbCA9IFN5bWJvbChcIm1vZGVsUHJvcGVydGllc1wiKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEdldHMgdGhlIGluZm8gcmVsYXRlZCB0byBhIG1vZGVsIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIG1vZGVsQ2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD5cbik6IE1vZGVsUHJvcHMge1xuICByZXR1cm4gKG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbFByb3BlcnRpZXNTeW1ib2xdXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKlxuICogU2V0cyB0aGUgaW5mbyByZWxhdGVkIHRvIGEgbW9kZWwgY2xhc3MgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gbW9kZWxDbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPixcbiAgcHJvcHM6IE1vZGVsUHJvcHNcbik6IHZvaWQge1xuICA7KG1vZGVsQ2xhc3MgYXMgYW55KVttb2RlbFByb3BlcnRpZXNTeW1ib2xdID0gcHJvcHNcbn1cbiIsImltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mLCBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4uL3NuYXBzaG90L1NuYXBzaG90T2ZcIlxuaW1wb3J0IHR5cGUgeyBMYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB0eXBlIHsgRmxhdHRlbiwgSXNOZXZlclR5cGUsIElzT3B0aW9uYWxWYWx1ZSB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3Qgbm9EZWZhdWx0VmFsdWUgPSBTeW1ib2woXCJub0RlZmF1bHRWYWx1ZVwiKVxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxQcm9wPFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gIFRUcmFuc2Zvcm1lZFZhbHVlLFxuICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICBUSXNSZXF1aXJlZCxcbiAgVElzSWQgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gIFRIYXNTZXR0ZXIgPSBuZXZlcixcbiAgVEZyb21TbmFwc2hvdE92ZXJyaWRlID0gbmV2ZXIsXG4gIFRUb1NuYXBzaG90T3ZlcnJpZGUgPSBuZXZlclxuPiB7XG4gIF9pbnRlcm5hbDoge1xuICAgICR2YWx1ZVR5cGU6IFRQcm9wVmFsdWVcbiAgICAkY3JlYXRpb25WYWx1ZVR5cGU6IFRQcm9wQ3JlYXRpb25WYWx1ZVxuICAgICR0cmFuc2Zvcm1lZFZhbHVlVHlwZTogVFRyYW5zZm9ybWVkVmFsdWVcbiAgICAkdHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlVHlwZTogVFRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVxuICAgICRpc1JlcXVpcmVkOiBUSXNSZXF1aXJlZFxuICAgICRpc0lkOiBUSXNJZFxuICAgICRoYXNTZXR0ZXI6IFRIYXNTZXR0ZXJcbiAgICAkZnJvbVNuYXBzaG90T3ZlcnJpZGU6IFRGcm9tU25hcHNob3RPdmVycmlkZVxuICAgICR0b1NuYXBzaG90T3ZlcnJpZGU6IFRUb1NuYXBzaG90T3ZlcnJpZGVcblxuICAgIGRlZmF1bHRGbjogKCgpID0+IFRQcm9wVmFsdWUpIHwgdHlwZW9mIG5vRGVmYXVsdFZhbHVlXG4gICAgZGVmYXVsdFZhbHVlOiBUUHJvcFZhbHVlIHwgdHlwZW9mIG5vRGVmYXVsdFZhbHVlXG4gICAgdHlwZUNoZWNrZXI6IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyIHwgdW5kZWZpbmVkXG4gICAgc2V0dGVyOiBib29sZWFuIHwgXCJhc3NpZ25cIlxuICAgIGlzSWQ6IGJvb2xlYW5cbiAgICB0cmFuc2Zvcm06XG4gICAgICB8IHtcbiAgICAgICAgICB0cmFuc2Zvcm0oXG4gICAgICAgICAgICBvcmlnaW5hbDogdW5rbm93bixcbiAgICAgICAgICAgIG1vZGVsOiBvYmplY3QsXG4gICAgICAgICAgICBwcm9wTmFtZTogUHJvcGVydHlLZXksXG4gICAgICAgICAgICBzZXRPcmlnaW5hbFZhbHVlOiAobmV3T3JpZ2luYWxWYWx1ZTogdW5rbm93bikgPT4gdm9pZFxuICAgICAgICAgICk6IHVua25vd25cbiAgICAgICAgICB1bnRyYW5zZm9ybSh0cmFuc2Zvcm1lZDogdW5rbm93biwgbW9kZWw6IG9iamVjdCwgcHJvcE5hbWU6IFByb3BlcnR5S2V5KTogdW5rbm93blxuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZFxuICAgIGZyb21TbmFwc2hvdFByb2Nlc3Nvcj8oc246IHVua25vd24pOiB1bmtub3duXG4gICAgdG9TbmFwc2hvdFByb2Nlc3Nvcj8oc246IHVua25vd24pOiB1bmtub3duXG4gIH1cblxuICB3aXRoU2V0dGVyKCk6IE1vZGVsUHJvcDxcbiAgICBUUHJvcFZhbHVlLFxuICAgIFRQcm9wQ3JlYXRpb25WYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIHN0cmluZyxcbiAgICBURnJvbVNuYXBzaG90T3ZlcnJpZGUsXG4gICAgVFRvU25hcHNob3RPdmVycmlkZVxuICA+XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTZXR0ZXIgbWV0aG9kcyBhcmUgcHJlZmVycmVkLlxuICAgKi9cbiAgd2l0aFNldHRlcihcbiAgICBtb2RlOiBcImFzc2lnblwiXG4gICk6IE1vZGVsUHJvcDxcbiAgICBUUHJvcFZhbHVlLFxuICAgIFRQcm9wQ3JlYXRpb25WYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRWYWx1ZSxcbiAgICBUVHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlLFxuICAgIFRJc1JlcXVpcmVkLFxuICAgIFRJc0lkLFxuICAgIHN0cmluZyxcbiAgICBURnJvbVNuYXBzaG90T3ZlcnJpZGUsXG4gICAgVFRvU25hcHNob3RPdmVycmlkZVxuICA+XG5cbiAgLyoqXG4gICAqIFNldHMgYSB0cmFuc2Zvcm0gZm9yIHRoZSBwcm9wZXJ0eSBpbnN0YW5jZSB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGVwYXJhbSBUVFYgVHJhbnNmb3JtZWQgdmFsdWUgdHlwZS5cbiAgICogQHBhcmFtIHRyYW5zZm9ybSBUcmFuc2Zvcm0gdG8gYmUgdXNlZC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHdpdGhUcmFuc2Zvcm08VFRWPihcbiAgICB0cmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxOb25OdWxsYWJsZTxUUHJvcFZhbHVlPiwgVFRWPlxuICApOiBNb2RlbFByb3A8XG4gICAgVFByb3BWYWx1ZSxcbiAgICBUUHJvcENyZWF0aW9uVmFsdWUsXG4gICAgVFRWIHwgRXh0cmFjdDxUUHJvcFZhbHVlLCBudWxsIHwgdW5kZWZpbmVkPixcbiAgICBUVFYgfCBFeHRyYWN0PFRQcm9wQ3JlYXRpb25WYWx1ZSwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gICAgVElzUmVxdWlyZWQsXG4gICAgVElzSWQsXG4gICAgVEhhc1NldHRlcixcbiAgICBURnJvbVNuYXBzaG90T3ZlcnJpZGUsXG4gICAgVFRvU25hcHNob3RPdmVycmlkZVxuICA+XG5cbiAgd2l0aFNuYXBzaG90UHJvY2Vzc29yPFxuICAgIEZTID0gVEZyb21TbmFwc2hvdE92ZXJyaWRlLFxuICAgIFRTID0gVFRvU25hcHNob3RPdmVycmlkZSxcbiAgICBUaGlzIGV4dGVuZHMgQW55TW9kZWxQcm9wID0gdGhpc1xuICA+KHByb2Nlc3Nvcjoge1xuICAgIGZyb21TbmFwc2hvdD8oc246IEZTKTogTW9kZWxQcm9wRnJvbVNuYXBzaG90PFRoaXM+XG4gICAgdG9TbmFwc2hvdD8oc246IE1vZGVsUHJvcFRvU25hcHNob3Q8VGhpcz4pOiBUU1xuICB9KTogTW9kZWxQcm9wPFxuICAgIFRQcm9wVmFsdWUsXG4gICAgVFByb3BDcmVhdGlvblZhbHVlLFxuICAgIFRUcmFuc2Zvcm1lZFZhbHVlLFxuICAgIFRUcmFuc2Zvcm1lZENyZWF0aW9uVmFsdWUsXG4gICAgVElzUmVxdWlyZWQsXG4gICAgVElzSWQsXG4gICAgVEhhc1NldHRlcixcbiAgICBGUyxcbiAgICBUU1xuICA+XG59XG5cbi8qKlxuICogVGhlIHNuYXBzaG90IGluIHR5cGUgb2YgYSBtb2RlbCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wRnJvbVNuYXBzaG90PE1QIGV4dGVuZHMgQW55TW9kZWxQcm9wPiA9IElzTmV2ZXJUeXBlPFxuICBNUFtcIl9pbnRlcm5hbFwiXVtcIiRmcm9tU25hcHNob3RPdmVycmlkZVwiXSxcbiAgU25hcHNob3RJbk9mPE1QW1wiX2ludGVybmFsXCJdW1wiJGNyZWF0aW9uVmFsdWVUeXBlXCJdPixcbiAgTVBbXCJfaW50ZXJuYWxcIl1bXCIkZnJvbVNuYXBzaG90T3ZlcnJpZGVcIl1cbj5cblxuLyoqXG4gKiBUaGUgc25hcHNob3Qgb3V0IHR5cGUgb2YgYSBtb2RlbCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wVG9TbmFwc2hvdDxNUCBleHRlbmRzIEFueU1vZGVsUHJvcD4gPSBJc05ldmVyVHlwZTxcbiAgTVBbXCJfaW50ZXJuYWxcIl1bXCIkdG9TbmFwc2hvdE92ZXJyaWRlXCJdLFxuICBTbmFwc2hvdE91dE9mPE1QW1wiX2ludGVybmFsXCJdW1wiJHZhbHVlVHlwZVwiXT4sXG4gIE1QW1wiX2ludGVybmFsXCJdW1wiJHRvU25hcHNob3RPdmVycmlkZVwiXVxuPlxuXG4vKipcbiAqIEEgbW9kZWwgcHJvcCB0cmFuc2Zvcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxQcm9wVHJhbnNmb3JtPFRPcmlnaW5hbCwgVFRyYW5zZm9ybWVkPiB7XG4gIHRyYW5zZm9ybShwYXJhbXM6IHtcbiAgICBvcmlnaW5hbFZhbHVlOiBUT3JpZ2luYWxcbiAgICBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiBUVHJhbnNmb3JtZWQgfCB1bmRlZmluZWRcbiAgICBzZXRPcmlnaW5hbFZhbHVlKHZhbHVlOiBUT3JpZ2luYWwpOiB2b2lkXG4gIH0pOiBUVHJhbnNmb3JtZWRcblxuICB1bnRyYW5zZm9ybShwYXJhbXM6IHsgdHJhbnNmb3JtZWRWYWx1ZTogVFRyYW5zZm9ybWVkOyBjYWNoZVRyYW5zZm9ybWVkVmFsdWUoKTogdm9pZCB9KTogVE9yaWdpbmFsXG59XG5cbi8qKlxuICogQW55IG1vZGVsIHByb3BlcnR5LlxuICovXG5leHBvcnQgdHlwZSBBbnlNb2RlbFByb3AgPSBNb2RlbFByb3A8YW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueT5cblxuLyoqXG4gKiBNb2RlbCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJvcHMge1xuICBbazogc3RyaW5nXTogQW55TW9kZWxQcm9wXG59XG5cbmV4cG9ydCB0eXBlIFJlcXVpcmVkTW9kZWxQcm9wczxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0ge1xuICBbSyBpbiBrZXlvZiBNUF06IE1QW0tdW1wiX2ludGVybmFsXCJdW1wiJGlzUmVxdWlyZWRcIl0gJiBLXG59W2tleW9mIE1QXVxuXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0gRmxhdHRlbjx7XG4gIFtrIGluIGtleW9mIE1QXTogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdmFsdWVUeXBlXCJdXG59PlxuXG5leHBvcnQgdHlwZSBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IEZsYXR0ZW48e1xuICBbayBpbiBrZXlvZiBNUF06IE1vZGVsUHJvcFRvU25hcHNob3Q8TVBba10+IGV4dGVuZHMgaW5mZXIgUiA/IFIgOiBuZXZlclxufT5cblxuLy8gd2UgZG9uJ3QgdXNlIE8uT3B0aW9uYWwgYW55bW9yZSBzaW5jZSBpdCBnZW5lcmF0ZXMgdW5pb25zIHRvbyBoZWF2eVxuLy8gYWxzbyBpZiB3ZSB1c2UgcGljayBvdmVyIHRoZSBvcHRpb25hbCBwcm9wcyB3ZSB3aWxsIGxvb3NlIHRoZSBhYmlsaXR5XG4vLyB0byBpbmZlciBnZW5lcmljc1xuLy8gd2UgYWxzbyBkb24ndCB1c2UgRmxhdHRlbiBiZWNhdXNlIGlmIHdlIGRvIHNvbWUgZ2VuZXJpY3Mgd29uJ3Qgd29ya1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxNUCBleHRlbmRzIE1vZGVsUHJvcHM+ID0ge1xuICBbayBpbiBrZXlvZiBNUF0/OiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiRjcmVhdGlvblZhbHVlVHlwZVwiXVxufSAmIHtcbiAgW2sgaW4gUmVxdWlyZWRNb2RlbFByb3BzPE1QPl06IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJGNyZWF0aW9uVmFsdWVUeXBlXCJdXG59XG5cbi8vIHdlIGRvbid0IHVzZSBPLk9wdGlvbmFsIGFueW1vcmUgc2luY2UgaXQgZ2VuZXJhdGVzIHVuaW9ucyB0b28gaGVhdnlcbi8vIGFsc28gaWYgd2UgdXNlIHBpY2sgb3ZlciB0aGUgb3B0aW9uYWwgcHJvcHMgd2Ugd2lsbCBsb29zZSB0aGUgYWJpbGl0eVxuLy8gdG8gaW5mZXIgZ2VuZXJpY3NcbmV4cG9ydCB0eXBlIE1vZGVsUHJvcHNUb1NuYXBzaG90Q3JlYXRpb25EYXRhPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBGbGF0dGVuPFxuICB7XG4gICAgW2sgaW4ga2V5b2YgTVBdPzogTW9kZWxQcm9wRnJvbVNuYXBzaG90PE1QW2tdPiBleHRlbmRzIGluZmVyIFIgPyBSIDogbmV2ZXJcbiAgfSAmIHtcbiAgICBbayBpbiB7XG4gICAgICBbSyBpbiBrZXlvZiBNUF06IElzTmV2ZXJUeXBlPFxuICAgICAgICBNUFtLXVtcIl9pbnRlcm5hbFwiXVtcIiRmcm9tU25hcHNob3RPdmVycmlkZVwiXSxcbiAgICAgICAgTVBbS11bXCJfaW50ZXJuYWxcIl1bXCIkaXNSZXF1aXJlZFwiXSAmIEssIC8vIG5vIG92ZXJyaWRlXG4gICAgICAgIElzT3B0aW9uYWxWYWx1ZTxNUFtLXVtcIl9pbnRlcm5hbFwiXVtcIiRmcm9tU25hcHNob3RPdmVycmlkZVwiXSwgbmV2ZXIsIEs+IC8vIHdpdGggb3ZlcnJpZGVcbiAgICAgID5cbiAgICB9W2tleW9mIE1QXV06IE1vZGVsUHJvcEZyb21TbmFwc2hvdDxNUFtrXT4gZXh0ZW5kcyBpbmZlciBSID8gUiA6IG5ldmVyXG4gIH1cbj5cblxuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBGbGF0dGVuPHtcbiAgW2sgaW4ga2V5b2YgTVBdOiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiR0cmFuc2Zvcm1lZFZhbHVlVHlwZVwiXVxufT5cblxuLy8gd2UgZG9uJ3QgdXNlIE8uT3B0aW9uYWwgYW55bW9yZSBzaW5jZSBpdCBnZW5lcmF0ZXMgdW5pb25zIHRvbyBoZWF2eVxuLy8gYWxzbyBpZiB3ZSB1c2UgcGljayBvdmVyIHRoZSBvcHRpb25hbCBwcm9wcyB3ZSB3aWxsIGxvb3NlIHRoZSBhYmlsaXR5XG4vLyB0byBpbmZlciBnZW5lcmljc1xuLy8gd2UgYWxzbyBkb24ndCB1c2UgRmxhdHRlbiBiZWNhdXNlIGlmIHdlIGRvIHNvbWUgZ2VuZXJpY3Mgd29uJ3Qgd29ya1xuLy8gd2UgYWxzbyBkb24ndCB1c2UgT21pdCBiZWNhdXNlIGlmIHdlIGRvIHNvbWUgZ2VuZXJpY3Mgd29uJ3Qgd29ya1xuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8TVAgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IHtcbiAgW2sgaW4ga2V5b2YgTVBdPzogTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkdHJhbnNmb3JtZWRDcmVhdGlvblZhbHVlVHlwZVwiXVxufSAmIHtcbiAgW2sgaW4gUmVxdWlyZWRNb2RlbFByb3BzPE1QPl06IE1QW2tdW1wiX2ludGVybmFsXCJdW1wiJHRyYW5zZm9ybWVkQ3JlYXRpb25WYWx1ZVR5cGVcIl1cbn1cblxuZXhwb3J0IHR5cGUgTW9kZWxQcm9wc1RvU2V0dGVyPE1QIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBGbGF0dGVuPHtcbiAgW2sgaW4ga2V5b2YgTVAgYXMgTVBba11bXCJfaW50ZXJuYWxcIl1bXCIkaGFzU2V0dGVyXCJdICYgYHNldCR7Q2FwaXRhbGl6ZTxrICYgc3RyaW5nPn1gXTogKFxuICAgIHZhbHVlOiBNUFtrXVtcIl9pbnRlcm5hbFwiXVtcIiR0cmFuc2Zvcm1lZFZhbHVlVHlwZVwiXVxuICApID0+IHZvaWRcbn0+XG5cbmV4cG9ydCB0eXBlIE1vZGVsSWRQcm9wID0gTW9kZWxQcm9wPFxuICBzdHJpbmcsXG4gIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RyaW5nLFxuICBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG5ldmVyLCAvLyBub3QgcmVxdWlyZWRcbiAgdHJ1ZVxuPlxuXG4vKipcbiAqIEEgcHJvcGVydHkgdGhhdCB3aWxsIGJlIHVzZWQgYXMgbW9kZWwgaWQsIGFjY2Vzc2libGUgdGhyb3VnaCAkbW9kZWxJZC5cbiAqIENhbiBvbmx5IGJlIHVzZWQgaW4gbW9kZWxzIGFuZCB0aGVyZSBjYW4gYmUgb25seSBvbmUgcGVyIG1vZGVsLlxuICovXG5leHBvcnQgY29uc3QgaWRQcm9wID0ge1xuICBfaW50ZXJuYWw6IHtcbiAgICBzZXR0ZXI6IGZhbHNlLFxuICAgIGlzSWQ6IHRydWUsXG4gIH0sXG5cbiAgd2l0aFNldHRlcihtb2RlPzogYm9vbGVhbiB8IFwiYXNzaWduXCIpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLCBfaW50ZXJuYWw6IHsgLi4udGhpcy5faW50ZXJuYWwsIHNldHRlcjogbW9kZSA/PyB0cnVlIH0gfVxuICB9LFxufSBhcyBhbnkgYXMgTW9kZWxJZFByb3BcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCB0eXBlIE9ubHlQcmltaXRpdmVzPFQ+ID0gRXhjbHVkZTxULCBvYmplY3Q+XG5cbi8qKlxuICogQSBtb2RlbCBwcm9wIHRoYXQgbWF5YmUgLyBtYXliZSBub3QgaXMgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiBpZiB0aGUgdmFsdWUgY2FuIHRha2UgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgdHlwZSBNYXliZU9wdGlvbmFsTW9kZWxQcm9wPFRQcm9wVmFsdWU+ID0gTW9kZWxQcm9wPFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcFZhbHVlLFxuICBJc09wdGlvbmFsVmFsdWU8VFByb3BWYWx1ZSwgbmV2ZXIsIHN0cmluZz4gLy8gY2FsY3VsYXRlIGlmIHJlcXVpcmVkXG4+XG5cbi8qKlxuICogQSBtb2RlbCBwcm9wIHRoYXQgaXMgZGVmaW5pdGVseSBvcHRpb25hbC5cbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uYWxNb2RlbFByb3A8VFByb3BWYWx1ZT4gPSBNb2RlbFByb3A8XG4gIFRQcm9wVmFsdWUsXG4gIFRQcm9wVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBUUHJvcFZhbHVlLFxuICBUUHJvcFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbmV2ZXIgLy8gbm90IHJlcXVpcmVkXG4+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5LCB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgZGVmYXVsdCB2YWx1ZVxuICogaWYgdGhlIGlucHV0IHNuYXBzaG90IC8gbW9kZWwgY3JlYXRpb24gZGF0YSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiBwcm9wKCgpID0+IDEwKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mIDEwXG4gKiB4OiBwcm9wPG51bWJlcltdPigoKSA9PiBbXSkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyIGFycmF5LCB3aXRoIGEgZGVmYXVsdCBlbXB0eSBhcnJheVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUVmFsdWUgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBkZWZhdWx0Rm4gRGVmYXVsdCB2YWx1ZSBnZW5lcmF0b3IgZnVuY3Rpb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcDxUVmFsdWU+KGRlZmF1bHRGbjogKCkgPT4gVFZhbHVlKTogT3B0aW9uYWxNb2RlbFByb3A8VFZhbHVlPlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSwgd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlXG4gKiBpZiB0aGUgaW5wdXQgc25hcHNob3QgLyBtb2RlbCBjcmVhdGlvbiBkYXRhIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyB3aXRoIHByaW1pdGl2ZSB2YWx1ZXMgYW5kIG5ldmVyIHdpdGggb2JqZWN0IHZhbHVlc1xuICogKGFycmF5LCBtb2RlbCwgb2JqZWN0LCBldGMpLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogcHJvcCgxMCkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiAxMFxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUVmFsdWUgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCBwcmltaXRpdmUgdmFsdWUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcDxUVmFsdWU+KGRlZmF1bHRWYWx1ZTogT25seVByaW1pdGl2ZXM8VFZhbHVlPik6IE9wdGlvbmFsTW9kZWxQcm9wPFRWYWx1ZT5cblxuLyoqXG4gKiBEZWZpbmVzIGEgbW9kZWwgcHJvcGVydHkgd2l0aCBubyBkZWZhdWx0IHZhbHVlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogcHJvcDxudW1iZXI+KCkgLy8gYSByZXF1aXJlZCBudW1iZXJcbiAqIHg6IHByb3A8bnVtYmVyIHwgdW5kZWZpbmVkPigpIC8vIGFuIG9wdGlvbmFsIG51bWJlciwgd2hpY2ggZGVmYXVsdHMgdG8gdW5kZWZpbmVkXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFRWYWx1ZSBWYWx1ZSB0eXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3A8VFZhbHVlPigpOiBNYXliZU9wdGlvbmFsTW9kZWxQcm9wPFRWYWx1ZT5cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIHByb3AoZGVmPzogYW55KTogQW55TW9kZWxQcm9wIHtcbiAgbGV0IGhhc0RlZmF1bHRWYWx1ZSA9IGZhbHNlXG5cbiAgLy8gZGVmYXVsdFxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAxKSB7XG4gICAgaGFzRGVmYXVsdFZhbHVlID0gdHJ1ZVxuICB9XG5cbiAgY29uc3QgaXNEZWZGbiA9IHR5cGVvZiBkZWYgPT09IFwiZnVuY3Rpb25cIlxuXG4gIGNvbnN0IG9iajogQW55TW9kZWxQcm9wID0ge1xuICAgIF9pbnRlcm5hbDoge1xuICAgICAgJHZhbHVlVHlwZTogbnVsbCBhcyBhbnksXG4gICAgICAkY3JlYXRpb25WYWx1ZVR5cGU6IG51bGwgYXMgYW55LFxuICAgICAgJHRyYW5zZm9ybWVkVmFsdWVUeXBlOiBudWxsIGFzIGFueSxcbiAgICAgICR0cmFuc2Zvcm1lZENyZWF0aW9uVmFsdWVUeXBlOiBudWxsIGFzIGFueSxcbiAgICAgICRpc1JlcXVpcmVkOiBudWxsIGFzIG5ldmVyLFxuICAgICAgJGlzSWQ6IG51bGwgYXMgbmV2ZXIsXG4gICAgICAkaGFzU2V0dGVyOiBudWxsIGFzIG5ldmVyLFxuICAgICAgJGZyb21TbmFwc2hvdE92ZXJyaWRlOiBudWxsIGFzIG5ldmVyLFxuICAgICAgJHRvU25hcHNob3RPdmVycmlkZTogbnVsbCBhcyBuZXZlcixcblxuICAgICAgZGVmYXVsdEZuOiBoYXNEZWZhdWx0VmFsdWUgJiYgaXNEZWZGbiA/IGRlZiA6IG5vRGVmYXVsdFZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBoYXNEZWZhdWx0VmFsdWUgJiYgIWlzRGVmRm4gPyBkZWYgOiBub0RlZmF1bHRWYWx1ZSxcbiAgICAgIHR5cGVDaGVja2VyOiB1bmRlZmluZWQsXG4gICAgICBzZXR0ZXI6IGZhbHNlLFxuICAgICAgaXNJZDogZmFsc2UsXG4gICAgICB0cmFuc2Zvcm06IHVuZGVmaW5lZCxcbiAgICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvcjogdW5kZWZpbmVkLFxuICAgICAgdG9TbmFwc2hvdFByb2Nlc3NvcjogdW5kZWZpbmVkLFxuICAgIH0sXG5cbiAgICB3aXRoU2V0dGVyKG1vZGU/OiBib29sZWFuIHwgXCJhc3NpZ25cIikge1xuICAgICAgcmV0dXJuIHsgLi4udGhpcywgX2ludGVybmFsOiB7IC4uLnRoaXMuX2ludGVybmFsLCBzZXR0ZXI6IG1vZGUgPz8gdHJ1ZSB9IH1cbiAgICB9LFxuXG4gICAgd2l0aFRyYW5zZm9ybSh0cmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTx1bmtub3duLCB1bmtub3duPikge1xuICAgICAgcmV0dXJuIHsgLi4udGhpcywgX2ludGVybmFsOiB7IC4uLnRoaXMuX2ludGVybmFsLCB0cmFuc2Zvcm06IHRvRnVsbFRyYW5zZm9ybSh0cmFuc2Zvcm0pIH0gfVxuICAgIH0sXG5cbiAgICB3aXRoU25hcHNob3RQcm9jZXNzb3IoeyBmcm9tU25hcHNob3QsIHRvU25hcHNob3QgfSkge1xuICAgICAgbGV0IG5ld0Zyb21TbmFwc2hvdFxuXG4gICAgICBpZiAodGhpcy5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yICYmIGZyb21TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBvbGRGbiA9IHRoaXMuX2ludGVybmFsLmZyb21TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgICBjb25zdCBuZXdGbiA9IGZyb21TbmFwc2hvdFxuICAgICAgICBuZXdGcm9tU25hcHNob3QgPSAoc246IGFueSkgPT4gb2xkRm4obmV3Rm4oc24pKVxuICAgICAgfSBlbHNlIGlmIChmcm9tU25hcHNob3QpIHtcbiAgICAgICAgbmV3RnJvbVNuYXBzaG90ID0gZnJvbVNuYXBzaG90XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdGcm9tU25hcHNob3QgPSB0aGlzLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld1RvU25hcHNob3RcblxuICAgICAgaWYgKHRoaXMuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3IgJiYgdG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBvbGRGbjogYW55ID0gdGhpcy5faW50ZXJuYWwudG9TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgICBjb25zdCBuZXdGbiA9IHRvU25hcHNob3RcbiAgICAgICAgbmV3VG9TbmFwc2hvdCA9IChzbjogYW55KSA9PiBuZXdGbihvbGRGbihzbikpXG4gICAgICB9IGVsc2UgaWYgKHRvU25hcHNob3QpIHtcbiAgICAgICAgbmV3VG9TbmFwc2hvdCA9IHRvU25hcHNob3RcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1RvU25hcHNob3QgPSB0aGlzLl9pbnRlcm5hbC50b1NuYXBzaG90UHJvY2Vzc29yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMsXG4gICAgICAgIF9pbnRlcm5hbDoge1xuICAgICAgICAgIC4uLnRoaXMuX2ludGVybmFsLFxuICAgICAgICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvcjogbmV3RnJvbVNuYXBzaG90LFxuICAgICAgICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IG5ld1RvU25hcHNob3QsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSxcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxubGV0IGNhY2hlVHJhbnNmb3JtUmVzdWx0ID0gZmFsc2VcbmNvbnN0IGNhY2hlVHJhbnNmb3JtZWRWYWx1ZUZuID0gKCkgPT4ge1xuICBjYWNoZVRyYW5zZm9ybVJlc3VsdCA9IHRydWVcbn1cblxuZnVuY3Rpb24gdG9GdWxsVHJhbnNmb3JtKHRyYW5zZm9ybU9iamVjdDogTW9kZWxQcm9wVHJhbnNmb3JtPHVua25vd24sIHVua25vd24+KSB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXA8XG4gICAgb2JqZWN0LFxuICAgIE1hcDxQcm9wZXJ0eUtleSwgeyBvcmlnaW5hbFZhbHVlOiB1bmtub3duOyB0cmFuc2Zvcm1lZFZhbHVlOiB1bmtub3duIH0+XG4gID4oKVxuXG4gIGNvbnN0IHRyYW5zZm9ybSA9IChwYXJhbXM6IHtcbiAgICBvcmlnaW5hbFZhbHVlOiB1bmtub3duXG4gICAgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogdW5rbm93blxuICAgIHNldE9yaWdpbmFsVmFsdWUobmV3T3JpZ2luYWxWYWx1ZTogdW5rbm93bik6IHZvaWRcbiAgfSkgPT4gKHBhcmFtcy5vcmlnaW5hbFZhbHVlID09IG51bGwgPyBwYXJhbXMub3JpZ2luYWxWYWx1ZSA6IHRyYW5zZm9ybU9iamVjdC50cmFuc2Zvcm0ocGFyYW1zKSlcblxuICBjb25zdCB1bnRyYW5zZm9ybSA9IChwYXJhbXM6IHsgdHJhbnNmb3JtZWRWYWx1ZTogdW5rbm93bjsgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKCk6IHZvaWQgfSkgPT5cbiAgICBwYXJhbXMudHJhbnNmb3JtZWRWYWx1ZSA9PSBudWxsID8gcGFyYW1zLnRyYW5zZm9ybWVkVmFsdWUgOiB0cmFuc2Zvcm1PYmplY3QudW50cmFuc2Zvcm0ocGFyYW1zKVxuXG4gIHJldHVybiB7XG4gICAgdHJhbnNmb3JtKFxuICAgICAgb3JpZ2luYWxWYWx1ZTogdW5rbm93bixcbiAgICAgIG1vZGVsOiBvYmplY3QsXG4gICAgICBwcm9wTmFtZTogUHJvcGVydHlLZXksXG4gICAgICBzZXRPcmlnaW5hbFZhbHVlOiAobmV3T3JpZ2luYWxWYWx1ZTogdW5rbm93bikgPT4gdm9pZFxuICAgICkge1xuICAgICAgY29uc3QgbW9kZWxDYWNoZSA9IGdldE9yQ3JlYXRlKGNhY2hlLCBtb2RlbCwgKCkgPT4gbmV3IE1hcCgpKVxuXG4gICAgICBsZXQgcHJvcENhY2hlID0gbW9kZWxDYWNoZS5nZXQocHJvcE5hbWUpXG4gICAgICBpZiAocHJvcENhY2hlPy5vcmlnaW5hbFZhbHVlICE9PSBvcmlnaW5hbFZhbHVlKSB7XG4gICAgICAgIC8vIG9yaWdpbmFsIGNoYW5nZWQsIGludmFsaWRhdGUgY2FjaGVcbiAgICAgICAgbW9kZWxDYWNoZS5kZWxldGUocHJvcE5hbWUpXG4gICAgICAgIHByb3BDYWNoZSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtKHtcbiAgICAgICAgb3JpZ2luYWxWYWx1ZSxcbiAgICAgICAgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogcHJvcENhY2hlPy50cmFuc2Zvcm1lZFZhbHVlLFxuICAgICAgICBzZXRPcmlnaW5hbFZhbHVlLFxuICAgICAgfSlcblxuICAgICAgbW9kZWxDYWNoZS5zZXQocHJvcE5hbWUsIHtcbiAgICAgICAgb3JpZ2luYWxWYWx1ZSxcbiAgICAgICAgdHJhbnNmb3JtZWRWYWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFZhbHVlXG4gICAgfSxcblxuICAgIHVudHJhbnNmb3JtKHRyYW5zZm9ybWVkVmFsdWU6IHVua25vd24sIG1vZGVsOiBvYmplY3QsIHByb3BOYW1lOiBQcm9wZXJ0eUtleSkge1xuICAgICAgY29uc3QgbW9kZWxDYWNoZSA9IGdldE9yQ3JlYXRlKGNhY2hlLCBtb2RlbCwgKCkgPT4gbmV3IE1hcCgpKVxuXG4gICAgICBjYWNoZVRyYW5zZm9ybVJlc3VsdCA9IGZhbHNlXG4gICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdW50cmFuc2Zvcm0oe1xuICAgICAgICB0cmFuc2Zvcm1lZFZhbHVlLFxuICAgICAgICBjYWNoZVRyYW5zZm9ybWVkVmFsdWU6IGNhY2hlVHJhbnNmb3JtZWRWYWx1ZUZuLFxuICAgICAgfSlcbiAgICAgIGlmIChjYWNoZVRyYW5zZm9ybVJlc3VsdCkge1xuICAgICAgICBtb2RlbENhY2hlLnNldChwcm9wTmFtZSwgeyBvcmlnaW5hbFZhbHVlLCB0cmFuc2Zvcm1lZFZhbHVlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb2RlbENhY2hlLmRlbGV0ZShwcm9wTmFtZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsVmFsdWVcbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUgfSBmcm9tIFwiLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlIH0gZnJvbSBcIi4vc2NoZW1hc1wiXG5pbXBvcnQgdHlwZSB7IExhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIsIFR5cGVJbmZvIH0gZnJvbSBcIi4vVHlwZUNoZWNrZXJcIlxuXG4vKipcbiAqIEdldHMgdGhlIHR5cGUgaW5mbyBvZiBhIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIHR5cGUgVHlwZSB0byBnZXQgdGhlIGluZm8gZnJvbS5cbiAqIEByZXR1cm5zIFRoZSB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlSW5mbyh0eXBlOiBBbnlUeXBlKTogVHlwZUluZm8ge1xuICBjb25zdCBzdGRUeXBlID0gcmVzb2x2ZVN0YW5kYXJkVHlwZSh0eXBlKVxuICBjb25zdCB0eXBlSW5mbyA9IChzdGRUeXBlIGFzIGFueSBhcyBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlcikudHlwZUluZm9cbiAgaWYgKCF0eXBlSW5mbykge1xuICAgIHRocm93IGZhaWx1cmUoYHR5cGUgaW5mbyBub3QgZm91bmQgZm9yICR7dHlwZX1gKVxuICB9XG4gIHJldHVybiB0eXBlSW5mb1xufVxuIiwiaW1wb3J0IHsgZ2V0Um9vdFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgUGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB7IGlzVHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogQSB0eXBlIGNoZWNraW5nIGVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZUNoZWNrRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeXBlRXJyb3IuXG4gICAqIEBwYXJhbSBwYXRoIFN1Yi1wYXRoIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLlxuICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlTmFtZSBOYW1lIG9mIHRoZSBleHBlY3RlZCB0eXBlLlxuICAgKiBAcGFyYW0gYWN0dWFsVmFsdWUgQWN0dWFsIHZhbHVlLlxuICAgKi9cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcGF0aDogUGF0aCwgcmVhZG9ubHkgZXhwZWN0ZWRUeXBlTmFtZTogc3RyaW5nLCByZWFkb25seSBhY3R1YWxWYWx1ZTogYW55KSB7fVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgdGhlIHR5cGUgY2hlY2sgZXJyb3IgYXMgYW4gYWN0dWFsIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZUNoZWNrZWRWYWx1ZSBVc3VhbGx5IHRoZSB2YWx1ZSB3aGVyZSB0aGUgdHlwZSBjaGVjayB3YXMgaW52b2tlZC5cbiAgICovXG4gIHRocm93KHR5cGVDaGVja2VkVmFsdWU6IGFueSk6IG5ldmVyIHtcbiAgICBsZXQgbXNnID0gXCJUeXBlQ2hlY2tFcnJvcjogXCJcbiAgICBsZXQgcm9vdFBhdGg6IFBhdGggPSBbXVxuICAgIGlmIChpc1R3ZWFrZWRPYmplY3QodHlwZUNoZWNrZWRWYWx1ZSwgdHJ1ZSkpIHtcbiAgICAgIHJvb3RQYXRoID0gZ2V0Um9vdFBhdGgodHlwZUNoZWNrZWRWYWx1ZSkucGF0aFxuICAgIH1cblxuICAgIG1zZyArPSBcIlsvXCIgKyBbLi4ucm9vdFBhdGgsIC4uLnRoaXMucGF0aF0uam9pbihcIi9cIikgKyBcIl0gXCJcblxuICAgIG1zZyArPSBcIkV4cGVjdGVkOiBcIiArIHRoaXMuZXhwZWN0ZWRUeXBlTmFtZVxuXG4gICAgdGhyb3cgZmFpbHVyZShtc2cpXG4gIH1cbn1cbiIsImltcG9ydCB7IGZhc3RHZXRQYXJlbnRJbmNsdWRpbmdEYXRhT2JqZWN0cyB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGlzQXJyYXksIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSB9IGZyb20gXCIuL3NjaGVtYXNcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi9UeXBlQ2hlY2tFcnJvclwiXG5cbnR5cGUgQ2hlY2tGdW5jdGlvbiA9ICh2YWx1ZTogYW55LCBwYXRoOiBQYXRoKSA9PiBUeXBlQ2hlY2tFcnJvciB8IG51bGxcblxuY29uc3QgZW1wdHlQYXRoOiBQYXRoID0gW11cblxudHlwZSBDaGVja1Jlc3VsdCA9IFR5cGVDaGVja0Vycm9yIHwgbnVsbFxudHlwZSBDaGVja1Jlc3VsdENhY2hlID0gV2Vha01hcDxvYmplY3QsIENoZWNrUmVzdWx0PlxuXG5jb25zdCB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkUmVzdWx0c09mT2JqZWN0ID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTZXQ8VHlwZUNoZWNrZXI+PigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBlbnVtIFR5cGVDaGVja2VyQmFzZVR5cGUge1xuICBPYmplY3QgPSBcIm9iamVjdFwiLFxuICBBcnJheSA9IFwiYXJyYXlcIixcbiAgUHJpbWl0aXZlID0gXCJwcmltaXRpdmVcIixcbiAgQW55ID0gXCJhbnlcIixcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDaGVja2VyQmFzZVR5cGVGcm9tVmFsdWUodmFsdWU6IGFueSk6IFR5cGVDaGVja2VyQmFzZVR5cGUge1xuICAvLyBhcnJheSBtdXN0IGJlIGJlZm9yZSBvYmplY3Qgc2luY2UgYXJyYXlzIGFyZSBhbHNvIG9iamVjdHNcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSByZXR1cm4gVHlwZUNoZWNrZXJCYXNlVHlwZS5BcnJheVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSByZXR1cm4gVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3RcbiAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIFR5cGVDaGVja2VyQmFzZVR5cGUuUHJpbWl0aXZlXG4gIHJldHVybiBUeXBlQ2hlY2tlckJhc2VUeXBlLkFueVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZGF0ZUNhY2hlZFR5cGVDaGVja2VyUmVzdWx0KG9iajogb2JqZWN0KSB7XG4gIC8vIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSBpdCBmb3IgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBwYXJlbnRzXG4gIGxldCBjdXJyZW50OiBhbnkgPSBvYmpcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBjb25zdCBzZXQgPSB0eXBlQ2hlY2tlcnNXaXRoQ2FjaGVkUmVzdWx0c09mT2JqZWN0LmdldChjdXJyZW50KVxuICAgIGlmIChzZXQpIHtcbiAgICAgIGZvciAoY29uc3QgdHlwZUNoZWNrZXIgb2Ygc2V0KSB7XG4gICAgICAgIHR5cGVDaGVja2VyLmludmFsaWRhdGVDYWNoZWRSZXN1bHQoY3VycmVudClcbiAgICAgIH1cbiAgICAgIHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRSZXN1bHRzT2ZPYmplY3QuZGVsZXRlKGN1cnJlbnQpXG4gICAgfVxuXG4gICAgY3VycmVudCA9IGZhc3RHZXRQYXJlbnRJbmNsdWRpbmdEYXRhT2JqZWN0cyhjdXJyZW50KVxuICB9XG59XG5cbmNvbnN0IHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRTbmFwc2hvdFByb2Nlc3NvclJlc3VsdHNPZk9iamVjdCA9IG5ldyBXZWFrTWFwPFxuICBvYmplY3QsXG4gIFNldDxUeXBlQ2hlY2tlcj5cbj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZGF0ZUNhY2hlZFRvU25hcHNob3RQcm9jZXNzb3JSZXN1bHQob2JqOiBvYmplY3QpIHtcbiAgY29uc3Qgc2V0ID0gdHlwZUNoZWNrZXJzV2l0aENhY2hlZFNuYXBzaG90UHJvY2Vzc29yUmVzdWx0c09mT2JqZWN0LmdldChvYmopXG5cbiAgaWYgKHNldCkge1xuICAgIHNldC5mb3JFYWNoKCh0eXBlQ2hlY2tlcikgPT4gdHlwZUNoZWNrZXIuaW52YWxpZGF0ZVNuYXBzaG90UHJvY2Vzc29yQ2FjaGVkUmVzdWx0KG9iaikpXG4gICAgdHlwZUNoZWNrZXJzV2l0aENhY2hlZFNuYXBzaG90UHJvY2Vzc29yUmVzdWx0c09mT2JqZWN0LmRlbGV0ZShvYmopXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVDaGVja2VyIHtcbiAgcHJpdmF0ZSBjaGVja1Jlc3VsdENhY2hlPzogQ2hlY2tSZXN1bHRDYWNoZVxuXG4gIHVuY2hlY2tlZDogYm9vbGVhblxuXG4gIHByaXZhdGUgY3JlYXRlQ2FjaGVJZk5lZWRlZCgpOiBDaGVja1Jlc3VsdENhY2hlIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tSZXN1bHRDYWNoZSkge1xuICAgICAgdGhpcy5jaGVja1Jlc3VsdENhY2hlID0gbmV3IFdlYWtNYXAoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jaGVja1Jlc3VsdENhY2hlXG4gIH1cblxuICBzZXRDYWNoZWRSZXN1bHQob2JqOiBvYmplY3QsIG5ld0NhY2hlVmFsdWU6IENoZWNrUmVzdWx0KSB7XG4gICAgdGhpcy5jcmVhdGVDYWNoZUlmTmVlZGVkKCkuc2V0KG9iaiwgbmV3Q2FjaGVWYWx1ZSlcblxuICAgIC8vIHJlZ2lzdGVyIHRoaXMgdHlwZSBjaGVja2VyIGFzIGxpc3RlbmVyIG9mIHRoYXQgb2JqZWN0IGNoYW5nZXNcbiAgICBjb25zdCB0eXBlQ2hlY2tlclNldCA9IGdldE9yQ3JlYXRlKHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRSZXN1bHRzT2ZPYmplY3QsIG9iaiwgKCkgPT4gbmV3IFNldCgpKVxuXG4gICAgdHlwZUNoZWNrZXJTZXQuYWRkKHRoaXMpXG4gIH1cblxuICBpbnZhbGlkYXRlQ2FjaGVkUmVzdWx0KG9iajogb2JqZWN0KSB7XG4gICAgdGhpcy5jaGVja1Jlc3VsdENhY2hlPy5kZWxldGUob2JqKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZWRSZXN1bHQob2JqOiBvYmplY3QpOiBDaGVja1Jlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXN1bHRDYWNoZT8uZ2V0KG9iailcbiAgfVxuXG4gIGNoZWNrKHZhbHVlOiBhbnksIHBhdGg6IFBhdGgpOiBUeXBlQ2hlY2tFcnJvciB8IG51bGwge1xuICAgIGlmICh0aGlzLnVuY2hlY2tlZCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAoIWlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVjayEodmFsdWUsIHBhdGgpXG4gICAgfVxuXG4gICAgLy8gb3B0aW1pemVkIGNoZWNraW5nIHdpdGggY2FjaGVkIHZhbHVlc1xuXG4gICAgbGV0IGNhY2hlZFJlc3VsdCA9IHRoaXMuZ2V0Q2FjaGVkUmVzdWx0KHZhbHVlKVxuXG4gICAgaWYgKGNhY2hlZFJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyB3ZSBzZXQgdGhlIHBhdGggZW1wdHkgc2luY2UgdGhlIHJlc3VsdCBjb3VsZCBiZSB1c2VkIGZvciBwYXRocyBvdGhlciB0aGFuIHRoaXMgYmFzZVxuICAgICAgY2FjaGVkUmVzdWx0ID0gdGhpcy5fY2hlY2shKHZhbHVlLCBlbXB0eVBhdGgpXG4gICAgICB0aGlzLnNldENhY2hlZFJlc3VsdCh2YWx1ZSwgY2FjaGVkUmVzdWx0KVxuICAgIH1cblxuICAgIGlmIChjYWNoZWRSZXN1bHQpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IoXG4gICAgICAgIFsuLi5wYXRoLCAuLi5jYWNoZWRSZXN1bHQucGF0aF0sXG4gICAgICAgIGNhY2hlZFJlc3VsdC5leHBlY3RlZFR5cGVOYW1lLFxuICAgICAgICBjYWNoZWRSZXN1bHQuYWN0dWFsVmFsdWVcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jYWNoZWRUeXBlSW5mb0dlbjogVHlwZUluZm9HZW5cblxuICBnZXQgdHlwZUluZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFR5cGVJbmZvR2VuKHRoaXMgYXMgYW55KVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgYmFzZVR5cGU6IFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hlY2s6IENoZWNrRnVuY3Rpb24gfCBudWxsLFxuICAgIHJlYWRvbmx5IGdldFR5cGVOYW1lOiAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuLFxuICAgIHJlYWRvbmx5IHNuYXBzaG90VHlwZTogKHNuOiB1bmtub3duKSA9PiBUeXBlQ2hlY2tlciB8IG51bGwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZnJvbVNuYXBzaG90UHJvY2Vzc29yOiAoc246IGFueSkgPT4gdW5rbm93bixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90b1NuYXBzaG90UHJvY2Vzc29yOiAoc246IGFueSkgPT4gdW5rbm93blxuICApIHtcbiAgICB0aGlzLnVuY2hlY2tlZCA9ICFfY2hlY2tcbiAgICB0aGlzLl9jYWNoZWRUeXBlSW5mb0dlbiA9IGxhenkodHlwZUluZm9HZW4pXG4gIH1cblxuICBmcm9tU25hcHNob3RQcm9jZXNzb3IgPSAoc246IGFueSk6IHVua25vd24gPT4ge1xuICAgIC8vIHdlIGNhbm5vdCBjYWNoZSBmcm9tU25hcHNob3RQcm9jZXNzb3Igc2luY2Ugbm9ib2R5IGVuc3VyZXMgdXNcbiAgICAvLyB0aGUgb3JpZ2luYWwgc25hcHNob3Qgd29uJ3QgYmUgdHdlYWtlZCBhZnRlciB1c2VcbiAgICByZXR1cm4gdGhpcy5fZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdG9TbmFwc2hvdFByb2Nlc3NvckNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCB1bmtub3duPigpXG5cbiAgaW52YWxpZGF0ZVNuYXBzaG90UHJvY2Vzc29yQ2FjaGVkUmVzdWx0KG9iajogb2JqZWN0KSB7XG4gICAgdGhpcy5fdG9TbmFwc2hvdFByb2Nlc3NvckNhY2hlLmRlbGV0ZShvYmopXG4gIH1cblxuICB0b1NuYXBzaG90UHJvY2Vzc29yID0gKHNuOiBhbnkpOiB1bmtub3duID0+IHtcbiAgICBpZiAodHlwZW9mIHNuICE9PSBcIm9iamVjdFwiIHx8IHNuID09PSBudWxsKSB7XG4gICAgICAvLyBub3QgY2FjaGVhYmxlXG4gICAgICByZXR1cm4gdGhpcy5fdG9TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdG9TbmFwc2hvdFByb2Nlc3NvckNhY2hlLmhhcyhzbikpIHtcbiAgICAgIHJldHVybiB0aGlzLl90b1NuYXBzaG90UHJvY2Vzc29yQ2FjaGUuZ2V0KHNuKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbCA9IHRoaXMuX3RvU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgdGhpcy5fdG9TbmFwc2hvdFByb2Nlc3NvckNhY2hlLnNldChzbiwgdmFsKVxuXG4gICAgLy8gcmVnaXN0ZXIgdGhpcyB0eXBlIGNoZWNrZXIgYXMgbGlzdGVuZXIgb2YgdGhhdCBzbiBjaGFuZ2VzXG4gICAgY29uc3QgdHlwZUNoZWNrZXJTZXQgPSBnZXRPckNyZWF0ZShcbiAgICAgIHR5cGVDaGVja2Vyc1dpdGhDYWNoZWRTbmFwc2hvdFByb2Nlc3NvclJlc3VsdHNPZk9iamVjdCxcbiAgICAgIHNuLFxuICAgICAgKCkgPT4gbmV3IFNldCgpXG4gICAgKVxuXG4gICAgdHlwZUNoZWNrZXJTZXQuYWRkKHRoaXMpXG5cbiAgICByZXR1cm4gdmFsXG4gIH1cbn1cblxuY29uc3QgbGF0ZVR5cGVDaGVja2VyU3ltYm9sID0gU3ltYm9sKFwibGF0ZVR5cGVDaGVrZXJcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXRlVHlwZUNoZWNrZXIge1xuICBbbGF0ZVR5cGVDaGVja2VyU3ltYm9sXTogdHJ1ZVxuICAoKTogVHlwZUNoZWNrZXJcbiAgdHlwZUluZm86IFR5cGVJbmZvXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXRlVHlwZUNoZWNrZXIoZm46ICgpID0+IFR5cGVDaGVja2VyLCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4pOiBMYXRlVHlwZUNoZWNrZXIge1xuICBsZXQgY2FjaGVkOiBUeXBlQ2hlY2tlciB8IHVuZGVmaW5lZFxuICBjb25zdCBsdGMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNhY2hlZCA9IGZuKClcbiAgICByZXR1cm4gY2FjaGVkXG4gIH1cbiAgOyhsdGMgYXMgTGF0ZVR5cGVDaGVja2VyKVtsYXRlVHlwZUNoZWNrZXJTeW1ib2xdID0gdHJ1ZVxuXG4gIGNvbnN0IGNhY2hlZFR5cGVJbmZvR2VuID0gbGF6eSh0eXBlSW5mb0dlbilcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobHRjLCBcInR5cGVJbmZvXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVHlwZUluZm9HZW4obHRjIGFzIGFueSlcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybiBsdGMgYXMgTGF0ZVR5cGVDaGVja2VyXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xhdGVUeXBlQ2hlY2tlcihsdGM6IHVua25vd24pOiBsdGMgaXMgTGF0ZVR5cGVDaGVja2VyIHtcbiAgcmV0dXJuIHR5cGVvZiBsdGMgPT09IFwiZnVuY3Rpb25cIiAmJiBsYXRlVHlwZUNoZWNrZXJTeW1ib2wgaW4gbHRjXG59XG5cbi8qKlxuICogVHlwZSBpbmZvIGJhc2UgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHt9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVJbmZvR2VuID0gKHQ6IEFueVN0YW5kYXJkVHlwZSkgPT4gVHlwZUluZm9cbiIsImltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uLy4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWxDbGFzcyB9IGZyb20gXCIuLi8uLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbFByb3BzSW5mb1wiXG5pbXBvcnQgeyBub0RlZmF1bHRWYWx1ZSB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGlzT2JqZWN0LCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlZ2lzdGVyU3RhbmRhcmRUeXBlUmVzb2x2ZXIsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIE1vZGVsVHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcblxuY29uc3QgY2FjaGVkTW9kZWxUeXBlQ2hlY2tlciA9IG5ldyBXZWFrTWFwPE1vZGVsQ2xhc3M8QW55TW9kZWw+LCBUeXBlQ2hlY2tlcj4oKVxuXG50eXBlIF9DbGFzczxUPiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbnR5cGUgX0NsYXNzT3JPYmplY3Q8TSwgSz4gPSBLIGV4dGVuZHMgTSA/IG9iamVjdCA6IF9DbGFzczxLPiB8ICgoKSA9PiBfQ2xhc3M8Sz4pXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIG1vZGVsLiBUaGUgdHlwZSByZWZlcmVuY2VkIGluIHRoZSBtb2RlbCBkZWNvcmF0b3Igd2lsbCBiZSB1c2VkIGZvciB0eXBlIGNoZWNraW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3Qgc29tZU1vZGVsVHlwZSA9IHR5cGVzLm1vZGVsKFNvbWVNb2RlbClcbiAqIC8vIG9yIGZvciByZWN1cnNpdmUgbW9kZWxzXG4gKiBjb25zdCBzb21lTW9kZWxUeXBlID0gdHlwZXMubW9kZWw8U29tZU1vZGVsPigoKSA9PiBTb21lTW9kZWwpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIE0gTW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbENsYXNzIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzTW9kZWw8TSA9IG5ldmVyLCBLID0gTT4obW9kZWxDbGFzczogX0NsYXNzT3JPYmplY3Q8TSwgSz4pOiBNb2RlbFR5cGU8Sz4ge1xuICAvLyBpZiB3ZSB0eXBlIGl0IGFueSBzdHJvbmdlciB0aGVuIHJlY3Vyc2l2ZSBkZWZzIGFuZCBzbyBvbiBzdG9wIHdvcmtpbmdcblxuICBpZiAoIWlzTW9kZWxDbGFzcyhtb2RlbENsYXNzKSAmJiB0eXBlb2YgbW9kZWxDbGFzcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLy8gcmVzb2x2ZSBsYXRlclxuICAgIGNvbnN0IG1vZGVsQ2xhc3NGbiA9IG1vZGVsQ2xhc3MgYXMgKCkgPT4gTW9kZWxDbGFzczxBbnlNb2RlbD5cbiAgICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IE1vZGVsVHlwZUluZm8odCwgbW9kZWxDbGFzc0ZuKCkpXG4gICAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB0eXBlc01vZGVsKG1vZGVsQ2xhc3NGbigpKSBhcyBhbnksIHR5cGVJbmZvR2VuKSBhcyBhbnlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtb2RlbENsYXp6OiBNb2RlbENsYXNzPEFueU1vZGVsPiA9IG1vZGVsQ2xhc3MgYXMgYW55XG5cbiAgICBjb25zdCBjYWNoZWRUeXBlQ2hlY2tlciA9IGNhY2hlZE1vZGVsVHlwZUNoZWNrZXIuZ2V0KG1vZGVsQ2xhenopXG4gICAgaWYgKGNhY2hlZFR5cGVDaGVja2VyKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVHlwZUNoZWNrZXIgYXMgYW55XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBNb2RlbFR5cGVJbmZvKHQsIG1vZGVsQ2xhenopXG5cbiAgICBjb25zdCB0YyA9IGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChtb2RlbENsYXp6KSFcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gYE1vZGVsKCR7bW9kZWxJbmZvLm5hbWV9KWBcblxuICAgICAgY29uc3QgZGF0YVR5cGVDaGVja2VyID0gZ2V0TW9kZWxNZXRhZGF0YShtb2RlbENsYXp6KS5kYXRhVHlwZVxuICAgICAgY29uc3QgcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIgPSBkYXRhVHlwZUNoZWNrZXJcbiAgICAgICAgPyByZXNvbHZlVHlwZUNoZWNrZXIoZGF0YVR5cGVDaGVja2VyKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcblxuICAgICAgICAodmFsdWUsIHBhdGgpID0+IHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIG1vZGVsQ2xhenopKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIHR5cGVOYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5jaGVjayh2YWx1ZS4kLCBwYXRoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHR5cGVOYW1lLFxuICAgICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWVbbW9kZWxUeXBlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBmYXN0IGNoZWNrXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVbbW9kZWxUeXBlS2V5XSA9PT0gbW9kZWxJbmZvLm5hbWUgPyB0aGlzVGMgOiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmVkRGF0YVR5cGVDaGVja2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuc25hcHNob3RUeXBlKHZhbHVlKSA/IHRoaXNUYyA6IG51bGxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBub3QgZW5vdWdoIGluZm8gdG8gYmUgYWJsZSB0byB0ZWxsXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcblxuICAgICAgICAoc24pID0+IHtcbiAgICAgICAgICBpZiAoc25bbW9kZWxUeXBlS2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIHNuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgICAgICBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIChzbikgPT4gc25cbiAgICAgIClcblxuICAgICAgcmV0dXJuIHRoaXNUY1xuICAgIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcblxuICAgIGNhY2hlZE1vZGVsVHlwZUNoZWNrZXIuc2V0KG1vZGVsQ2xhenosIHRjKVxuXG4gICAgcmV0dXJuIHRjIGFzIGFueVxuICB9XG59XG5cbi8qKlxuICogYHR5cGVzLm1vZGVsYCB0eXBlIGluZm8gZm9yIGEgbW9kZWwgcHJvcHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxUeXBlSW5mb1Byb3BzIHtcbiAgcmVhZG9ubHkgW3Byb3BOYW1lOiBzdHJpbmddOiBSZWFkb25seTx7XG4gICAgdHlwZTogQW55U3RhbmRhcmRUeXBlIHwgdW5kZWZpbmVkXG4gICAgdHlwZUluZm86IFR5cGVJbmZvIHwgdW5kZWZpbmVkXG4gICAgaGFzRGVmYXVsdDogYm9vbGVhblxuICAgIGRlZmF1bHQ6IGFueVxuICB9PlxufVxuXG4vKipcbiAqIGB0eXBlcy5tb2RlbGAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgcHJpdmF0ZSBfcHJvcHMgPSBsYXp5KCgpID0+IHtcbiAgICBjb25zdCBvYmpTY2hlbWEgPSBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8odGhpcy5tb2RlbENsYXNzKVxuXG4gICAgY29uc3QgcHJvcFR5cGVzOiBPLldyaXRhYmxlPE1vZGVsVHlwZUluZm9Qcm9wcz4gPSB7fVxuICAgIE9iamVjdC5rZXlzKG9ialNjaGVtYSkuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHByb3BEYXRhID0gb2JqU2NoZW1hW3Byb3BOYW1lXVxuXG4gICAgICBjb25zdCB0eXBlID0gcHJvcERhdGEuX2ludGVybmFsLnR5cGVDaGVja2VyIGFzIGFueSBhcyBBbnlTdGFuZGFyZFR5cGVcblxuICAgICAgbGV0IHR5cGVJbmZvOiBUeXBlSW5mbyB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgdHlwZUluZm8gPSBnZXRUeXBlSW5mbyh0eXBlKVxuICAgICAgfVxuXG4gICAgICBsZXQgaGFzRGVmYXVsdCA9IGZhbHNlXG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnlcbiAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuXG4gICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWUgIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWVcbiAgICAgICAgaGFzRGVmYXVsdCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgcHJvcFR5cGVzW3Byb3BOYW1lXSA9IHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdHlwZUluZm8sXG4gICAgICAgIGhhc0RlZmF1bHQsXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBwcm9wVHlwZXNcbiAgfSlcblxuICBnZXQgcHJvcHMoKTogTW9kZWxUeXBlSW5mb1Byb3BzIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcHMoKVxuICB9XG5cbiAgZ2V0IG1vZGVsVHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KHRoaXMubW9kZWxDbGFzcykhXG4gICAgcmV0dXJuIG1vZGVsSW5mby5uYW1lXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCByZWFkb25seSBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsPikge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vZGVsU3RhbmRhcmRUeXBlUmVzb2x2ZXIoKSB7XG4gIHJlZ2lzdGVyU3RhbmRhcmRUeXBlUmVzb2x2ZXIoKHYpID0+IChpc01vZGVsQ2xhc3ModikgPyB0eXBlc01vZGVsKHYpIDogdW5kZWZpbmVkKSlcbn1cbiIsImltcG9ydCB7IGFzc2VydElzUHJpbWl0aXZlLCBpZGVudGl0eUZuIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUHJpbWl0aXZlVmFsdWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdHlwZXNcIlxuaW1wb3J0IHsgcmVnaXN0ZXJTdGFuZGFyZFR5cGVSZXNvbHZlciwgU3RhbmRhcmRUeXBlUmVzb2x2ZXJGbiB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7IFR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlckJhc2VUeXBlLCBUeXBlSW5mbywgVHlwZUluZm9HZW4gfSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vVHlwZUNoZWNrRXJyb3JcIlxuXG5jb25zdCBzdGFuZGFyZFR5cGVSZXNvbHZlcnM6IFN0YW5kYXJkVHlwZVJlc29sdmVyRm5bXSA9IFtdXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGNlcnRhaW4gdmFsdWUgb2YgYSBwcmltaXRpdmUgKGZvciBleGFtcGxlIGFuICpleGFjdCogbnVtYmVyIG9yIHN0cmluZykuXG4gKlxuICogRXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGhpVHlwZSA9IHR5cGVzLmxpdGVyYWwoXCJoaVwiKSAvLyB0aGUgc3RyaW5nIHdpdGggdmFsdWUgXCJoaVwiXG4gKiBjb25zdCBudW1iZXI1VHlwZSA9IHR5cGVzLmxpdGVyYWwoNSkgLy8gdGhlIG51bWJlciB3aXRoIHZhbHVlIDVcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBMaXRlcmFsIHZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gbGl0ZXJhbCBMaXRlcmFsIHZhbHVlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzTGl0ZXJhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVmFsdWU+KGxpdGVyYWw6IFQpOiBJZGVudGl0eVR5cGU8VD4ge1xuICBhc3NlcnRJc1ByaW1pdGl2ZShsaXRlcmFsLCBcImxpdGVyYWxcIilcbiAgbGV0IHR5cGVOYW1lOiBzdHJpbmdcbiAgc3dpdGNoIChsaXRlcmFsKSB7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICB0eXBlTmFtZSA9IFwidW5kZWZpbmVkXCJcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBudWxsOlxuICAgICAgdHlwZU5hbWUgPSBcIm51bGxcIlxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdHlwZU5hbWUgPSBKU09OLnN0cmluZ2lmeShsaXRlcmFsKVxuICAgICAgYnJlYWtcbiAgfVxuXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgTGl0ZXJhbFR5cGVJbmZvKHQsIGxpdGVyYWwpXG5cbiAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLlByaW1pdGl2ZSxcblxuICAgICh2YWx1ZSwgcGF0aCkgPT4gKHZhbHVlID09PSBsaXRlcmFsID8gbnVsbCA6IG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCB0eXBlTmFtZSwgdmFsdWUpKSxcblxuICAgICgpID0+IHR5cGVOYW1lLFxuICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgKHZhbHVlKSA9PiAodmFsdWUgPT09IGxpdGVyYWwgPyB0aGlzVGMgOiBudWxsKSxcbiAgICBpZGVudGl0eUZuLFxuICAgIGlkZW50aXR5Rm5cbiAgKVxuXG4gIHJldHVybiB0aGlzVGMgYXMgYW55XG59XG5cbi8qKlxuICogYHR5cGVzLmxpdGVyYWxgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIExpdGVyYWxUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgbGl0ZXJhbDogUHJpbWl0aXZlVmFsdWUpIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIHVuZGVmaW5lZC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLmxpdGVyYWwodW5kZWZpbmVkKWAuXG4gKlxuICogYGBgdHNcbiAqIHR5cGVzLnVuZGVmaW5lZFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc1VuZGVmaW5lZCA9IHR5cGVzTGl0ZXJhbCh1bmRlZmluZWQpXG5cbnN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKCh2KSA9PiAodiA9PT0gdW5kZWZpbmVkID8gdHlwZXNVbmRlZmluZWQgOiB1bmRlZmluZWQpKVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG51bGwuXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGB0eXBlcy5saXRlcmFsKG51bGwpYC5cbiAqXG4gKiBgYGB0c1xuICogdHlwZXMubnVsbFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc051bGwgPSB0eXBlc0xpdGVyYWwobnVsbClcblxuc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLnB1c2goKHYpID0+ICh2ID09PSBudWxsID8gdHlwZXNOdWxsIDogdW5kZWZpbmVkKSlcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBib29sZWFuIHZhbHVlLlxuICpcbiAqIGBgYHRzXG4gKiB0eXBlcy5ib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVzQm9vbGVhbjogSWRlbnRpdHlUeXBlPGJvb2xlYW4+ID0gbmV3IFR5cGVDaGVja2VyKFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLlByaW1pdGl2ZSxcblxuICAodmFsdWUsIHBhdGgpID0+ICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gbnVsbCA6IG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBcImJvb2xlYW5cIiwgdmFsdWUpKSxcblxuICAoKSA9PiBcImJvb2xlYW5cIixcbiAgKHQpID0+IG5ldyBCb29sZWFuVHlwZUluZm8odCksXG5cbiAgKHZhbHVlKSA9PiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/ICh0eXBlc0Jvb2xlYW4gYXMgYW55KSA6IG51bGwpLFxuICBpZGVudGl0eUZuLFxuICBpZGVudGl0eUZuXG4pIGFzIGFueVxuXG5zdGFuZGFyZFR5cGVSZXNvbHZlcnMucHVzaCgodikgPT4gKHYgPT09IEJvb2xlYW4gPyB0eXBlc0Jvb2xlYW4gOiB1bmRlZmluZWQpKVxuXG4vKipcbiAqIGB0eXBlcy5ib29sZWFuYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBCb29sZWFuVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7fVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW55IG51bWJlciB2YWx1ZS5cbiAqXG4gKiBgYGB0c1xuICogdHlwZXMubnVtYmVyXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVzTnVtYmVyOiBJZGVudGl0eVR5cGU8bnVtYmVyPiA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZS5QcmltaXRpdmUsXG5cbiAgKHZhbHVlLCBwYXRoKSA9PiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gbnVsbCA6IG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBcIm51bWJlclwiLCB2YWx1ZSkpLFxuXG4gICgpID0+IFwibnVtYmVyXCIsXG4gICh0KSA9PiBuZXcgTnVtYmVyVHlwZUluZm8odCksXG5cbiAgKHZhbHVlKSA9PiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gKHR5cGVzTnVtYmVyIGFzIGFueSkgOiBudWxsKSxcbiAgaWRlbnRpdHlGbixcbiAgaWRlbnRpdHlGblxuKSBhcyBhbnlcblxuc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLnB1c2goKHYpID0+ICh2ID09PSBOdW1iZXIgPyB0eXBlc051bWJlciA6IHVuZGVmaW5lZCkpXG5cbi8qKlxuICogYHR5cGVzLm51bWJlcmAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgTnVtYmVyVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7fVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW55IHN0cmluZyB2YWx1ZS5cbiAqXG4gKiBgYGB0c1xuICogdHlwZXMuc3RyaW5nXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVzU3RyaW5nOiBJZGVudGl0eVR5cGU8c3RyaW5nPiA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZS5QcmltaXRpdmUsXG5cbiAgKHZhbHVlLCBwYXRoKSA9PiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gbnVsbCA6IG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBcInN0cmluZ1wiLCB2YWx1ZSkpLFxuXG4gICgpID0+IFwic3RyaW5nXCIsXG4gICh0KSA9PiBuZXcgU3RyaW5nVHlwZUluZm8odCksXG5cbiAgKHZhbHVlKSA9PiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gKHR5cGVzU3RyaW5nIGFzIGFueSkgOiBudWxsKSxcbiAgaWRlbnRpdHlGbixcbiAgaWRlbnRpdHlGblxuKSBhcyBhbnlcblxuc3RhbmRhcmRUeXBlUmVzb2x2ZXJzLnB1c2goKHYpID0+ICh2ID09PSBTdHJpbmcgPyB0eXBlc1N0cmluZyA6IHVuZGVmaW5lZCkpXG5cbi8qKlxuICogYHR5cGVzLnN0cmluZ2AgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgU3RyaW5nVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7fVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJQcmltaXRpdmVTdGFuZGFyZFR5cGVSZXNvbHZlcnMoKSB7XG4gIHN0YW5kYXJkVHlwZVJlc29sdmVycy5mb3JFYWNoKChzdHIpID0+IHtcbiAgICByZWdpc3RlclN0YW5kYXJkVHlwZVJlc29sdmVyKHN0cilcbiAgfSlcbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyTW9kZWxTdGFuZGFyZFR5cGVSZXNvbHZlciB9IGZyb20gXCIuL29iamVjdEJhc2VkL3R5cGVzTW9kZWxcIlxuaW1wb3J0IHsgcmVnaXN0ZXJQcmltaXRpdmVTdGFuZGFyZFR5cGVSZXNvbHZlcnMgfSBmcm9tIFwiLi9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5cbmxldCBkZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzUmVnaXN0ZXJlZCA9IGZhbHNlXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnMoKSB7XG4gIGlmIChkZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGRlZmF1bHRTdGFuZGFyZFR5cGVSZXNvbHZlcnNSZWdpc3RlcmVkID0gdHJ1ZVxuXG4gIHJlZ2lzdGVyTW9kZWxTdGFuZGFyZFR5cGVSZXNvbHZlcigpXG4gIHJlZ2lzdGVyUHJpbWl0aXZlU3RhbmRhcmRUeXBlUmVzb2x2ZXJzKClcbn1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgcmVnaXN0ZXJEZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzIH0gZnJvbSBcIi4vcmVnaXN0ZXJEZWZhdWx0U3RhbmRhcmRUeXBlUmVzb2x2ZXJzXCJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlIH0gZnJvbSBcIi4vc2NoZW1hc1wiXG5pbXBvcnQgeyBpc0xhdGVUeXBlQ2hlY2tlciwgTGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciB9IGZyb20gXCIuL1R5cGVDaGVja2VyXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgU3RhbmRhcmRUeXBlUmVzb2x2ZXJGbiA9ICh2YWx1ZTogYW55KSA9PiBBbnlTdGFuZGFyZFR5cGUgfCB1bmRlZmluZWRcblxuY29uc3Qgc3RhbmRhcmRUeXBlUmVzb2x2ZXJzOiBTdGFuZGFyZFR5cGVSZXNvbHZlckZuW10gPSBbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdGFuZGFyZFR5cGVSZXNvbHZlcihyZXNvbHZlckZuOiBTdGFuZGFyZFR5cGVSZXNvbHZlckZuKSB7XG4gIHN0YW5kYXJkVHlwZVJlc29sdmVycy5wdXNoKHJlc29sdmVyRm4pXG59XG5cbmZ1bmN0aW9uIGZpbmRTdGFuZGFyZFR5cGUodmFsdWU6IGFueSk6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHJlZ2lzdGVyRGVmYXVsdFN0YW5kYXJkVHlwZVJlc29sdmVycygpXG5cbiAgZm9yIChjb25zdCByZXNvbHZlckZuIG9mIHN0YW5kYXJkVHlwZVJlc29sdmVycykge1xuICAgIGNvbnN0IHRjID0gcmVzb2x2ZXJGbih2YWx1ZSlcbiAgICBpZiAodGMpIHJldHVybiB0Y1xuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUeXBlQ2hlY2tlcih2OiBBbnlUeXBlIHwgVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXIpOiBUeXBlQ2hlY2tlciB7XG4gIGxldCBuZXh0OiBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlciA9IHYgYXMgYW55XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5leHQgaW5zdGFuY2VvZiBUeXBlQ2hlY2tlcikge1xuICAgICAgcmV0dXJuIG5leHRcbiAgICB9IGVsc2UgaWYgKGlzTGF0ZVR5cGVDaGVja2VyKG5leHQpKSB7XG4gICAgICBuZXh0ID0gbmV4dCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRjID0gZmluZFN0YW5kYXJkVHlwZSh2KVxuICAgICAgaWYgKHRjKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVHlwZUNoZWNrZXIodGMpXG4gICAgICB9XG4gICAgICB0aHJvdyBmYWlsdXJlKFwidHlwZSBjaGVja2VyIGNvdWxkIG5vdCBiZSByZXNvbHZlZFwiKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVN0YW5kYXJkVHlwZU5vVGhyb3coXG4gIHY6IEFueVR5cGUgfCBUeXBlQ2hlY2tlciB8IExhdGVUeXBlQ2hlY2tlclxuKTogQW55U3RhbmRhcmRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBUeXBlQ2hlY2tlciB8fCBpc0xhdGVUeXBlQ2hlY2tlcih2KSkge1xuICAgIHJldHVybiB2IGFzIGFueVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHRjID0gZmluZFN0YW5kYXJkVHlwZSh2KVxuICAgIGlmICh0Yykge1xuICAgICAgcmV0dXJuIHRjXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVN0YW5kYXJkVHlwZSh2OiBBbnlUeXBlIHwgVHlwZUNoZWNrZXIgfCBMYXRlVHlwZUNoZWNrZXIpOiBBbnlTdGFuZGFyZFR5cGUge1xuICBjb25zdCB0YyA9IHJlc29sdmVTdGFuZGFyZFR5cGVOb1Rocm93KHYpXG4gIGlmICh0Yykge1xuICAgIHJldHVybiB0Y1xuICB9XG4gIHRocm93IGZhaWx1cmUoXCJzdGFuZGFyZCB0eXBlIGNvdWxkIG5vdCBiZSByZXNvbHZlZFwiKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBjcmVhdGVBdG9tLCBJQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnRQYXRoLCBQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGludmFsaWRhdGVDYWNoZWRUb1NuYXBzaG90UHJvY2Vzc29yUmVzdWx0IH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IFByaW1pdGl2ZVZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3R5cGVzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgU25hcHNob3RUcmFuc2Zvcm1GbiA9IChzbjogdW5rbm93bikgPT4gdW5rbm93blxuXG5pbnRlcmZhY2UgU25hcHNob3REYXRhIHtcbiAgdW50cmFuc2Zvcm1lZDogYW55XG4gIHJlYWRvbmx5IHRyYW5zZm9ybUZuOiBTbmFwc2hvdFRyYW5zZm9ybUZuIHwgdW5kZWZpbmVkXG4gIHRyYW5zZm9ybWVkOiBhbnlcbiAgcmVhZG9ubHkgYXRvbTogSUF0b21cbn1cblxuY29uc3Qgc25hcHNob3RzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTbmFwc2hvdERhdGE+KClcblxuLy8gdHJ1ZSBpZiBpdCBoYXMgYmVlbiBhY2Nlc3NlZCBwdWJsaWNseSBhbmQgdGhlcmVmb3JlIHNob3VsZCBiZSBjbG9uZWRcbi8vIHJhdGhlciB0aGFuIG1vZGlmaWVkIGluIHBsYWNlXG5jb25zdCBmcm96ZW5TdGF0ZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYm9vbGVhbj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJuYWxTbmFwc2hvdDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgdmFsdWU6IFRcbik6IFJlYWRvbmx5PFNuYXBzaG90RGF0YT4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gc25hcHNob3RzLmdldCh2YWx1ZSlcbn1cblxuaW50ZXJmYWNlIEludGVybmFsU25hcHNob3RQYXJlbnQge1xuICBwYXJlbnRTbmFwc2hvdDogU25hcHNob3REYXRhIHwgdW5kZWZpbmVkXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PlxufVxuXG5mdW5jdGlvbiBnZXRJbnRlcm5hbFNuYXBzaG90UGFyZW50KFxuICBzbjogUmVhZG9ubHk8U25hcHNob3REYXRhPiB8IHVuZGVmaW5lZCxcbiAgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkXG4pOiBJbnRlcm5hbFNuYXBzaG90UGFyZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXJlbnRQYXRoIHx8ICFzbikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IHBhcmVudFNuID0gZ2V0SW50ZXJuYWxTbmFwc2hvdChwYXJlbnRQYXRoLnBhcmVudClcbiAgaWYgKCFwYXJlbnRTbikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyZW50U25hcHNob3Q6IHBhcmVudFNuLFxuICAgIHBhcmVudFBhdGg6IHBhcmVudFBhdGgsXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHVuc2V0SW50ZXJuYWxTbmFwc2hvdCA9IGFjdGlvbihcInVuc2V0SW50ZXJuYWxTbmFwc2hvdFwiLCAodmFsdWU6IGFueSkgPT4ge1xuICBjb25zdCBvbGRTbiA9IGdldEludGVybmFsU25hcHNob3QodmFsdWUpXG5cbiAgaWYgKG9sZFNuKSB7XG4gICAgc25hcHNob3RzLmRlbGV0ZSh2YWx1ZSlcbiAgICBvbGRTbi5hdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG59KVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3Qgc2V0TmV3SW50ZXJuYWxTbmFwc2hvdCA9IGFjdGlvbihcbiAgXCJzZXROZXdJbnRlcm5hbFNuYXBzaG90XCIsXG4gIDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICB2YWx1ZTogYW55LFxuICAgIHVudHJhbnNmb3JtZWQ6IFQsXG4gICAgdHJhbnNmb3JtRm46IFNuYXBzaG90VHJhbnNmb3JtRm4gfCB1bmRlZmluZWQsXG4gICAgbWFya0FzRnJvemVuID0gZmFsc2VcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3Qgc246IFNuYXBzaG90RGF0YSA9IHtcbiAgICAgIHVudHJhbnNmb3JtZWQsXG4gICAgICB0cmFuc2Zvcm1GbixcbiAgICAgIHRyYW5zZm9ybWVkOiB0cmFuc2Zvcm1GbiA/IHRyYW5zZm9ybUZuKHVudHJhbnNmb3JtZWQpIDogdW50cmFuc2Zvcm1lZCxcbiAgICAgIGF0b206IGNyZWF0ZUF0b20oXCJzbmFwc2hvdFwiKSxcbiAgICB9XG4gICAgZnJvemVuU3RhdGUuc2V0KHNuLnVudHJhbnNmb3JtZWQsIG1hcmtBc0Zyb3plbilcbiAgICBmcm96ZW5TdGF0ZS5zZXQoc24udHJhbnNmb3JtZWQsIG1hcmtBc0Zyb3plbilcblxuICAgIHNuYXBzaG90cy5zZXQodmFsdWUsIHNuKVxuXG4gICAgc24uYXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuKVxuXG50eXBlIE11dGF0ZUludGVybmFsU25hcHNob3RGbjxUPiA9IChwcmV2U246IFQpID0+IHZvaWRcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUludGVybmFsU25hcHNob3QgPSBhY3Rpb24oXG4gIFwidXBkYXRlSW50ZXJuYWxTbmFwc2hvdFwiLFxuICA8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IGFueSwgbXV0YXRlOiBNdXRhdGVJbnRlcm5hbFNuYXBzaG90Rm48VD4pOiB2b2lkID0+IHtcbiAgICBjb25zdCBzbiA9IGdldEludGVybmFsU25hcHNob3QodmFsdWUpISBhcyBTbmFwc2hvdERhdGFcblxuICAgIGxldCB1bnRyYW5zZm9ybWVkID0gc24udW50cmFuc2Zvcm1lZFxuICAgIGNvbnN0IHNuRnJvemVuID0gZnJvemVuU3RhdGUuZ2V0KHVudHJhbnNmb3JtZWQpIVxuICAgIGlmIChzbkZyb3plbikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodW50cmFuc2Zvcm1lZCkpIHtcbiAgICAgICAgdW50cmFuc2Zvcm1lZCA9IHVudHJhbnNmb3JtZWQuc2xpY2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW50cmFuc2Zvcm1lZCA9IE9iamVjdC5hc3NpZ24oe30sIHVudHJhbnNmb3JtZWQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBwcm9jZXNzb3IgY2FjaGVkIHJlc3VsdCBpcyBubyBsb25nZXIgdmFsaWQgc2luY2Ugd2Ugd2lsbFxuICAgICAgLy8gbXV0YXRlIHRoZSBvYmplY3RcbiAgICAgIGludmFsaWRhdGVDYWNoZWRUb1NuYXBzaG90UHJvY2Vzc29yUmVzdWx0KHVudHJhbnNmb3JtZWQpXG4gICAgfVxuXG4gICAgbXV0YXRlKHVudHJhbnNmb3JtZWQpXG5cbiAgICBzbi51bnRyYW5zZm9ybWVkID0gdW50cmFuc2Zvcm1lZFxuICAgIHNuLnRyYW5zZm9ybWVkID0gc24udHJhbnNmb3JtRm4gPyBzbi50cmFuc2Zvcm1Gbih1bnRyYW5zZm9ybWVkKSA6IHVudHJhbnNmb3JtZWRcblxuICAgIGZyb3plblN0YXRlLnNldChzbi51bnRyYW5zZm9ybWVkLCBmYWxzZSlcbiAgICBmcm96ZW5TdGF0ZS5zZXQoc24udHJhbnNmb3JtZWQsIGZhbHNlKVxuXG4gICAgc24uYXRvbS5yZXBvcnRDaGFuZ2VkKClcblxuICAgIC8vIGFsc28gdXBkYXRlIHBhcmVudChzKSBzbmFwc2hvdChzKSBpZiBuZWVkZWRcbiAgICBjb25zdCBwYXJlbnQgPSBnZXRJbnRlcm5hbFNuYXBzaG90UGFyZW50KHNuLCBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSkpXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgY29uc3QgeyBwYXJlbnRTbmFwc2hvdCwgcGFyZW50UGF0aCB9ID0gcGFyZW50XG4gICAgICAvLyBtaWdodCBiZSBmYWxzZSBpbiB0aGUgY2FzZXMgd2hlcmUgdGhlIHBhcmVudCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWRcbiAgICAgIGlmIChwYXJlbnRTbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBwYXRoID0gcGFyZW50UGF0aC5wYXRoXG5cbiAgICAgICAgLy8gcGF0Y2hlcyBmb3IgcGFyZW50IGNoYW5nZXMgc2hvdWxkIG5vdCBiZSBlbWl0dGVkXG4gICAgICAgIHVwZGF0ZUludGVybmFsU25hcHNob3QocGFyZW50UGF0aC5wYXJlbnQsIChvYmpPckFycmF5OiBhbnkpID0+IHtcbiAgICAgICAgICBvYmpPckFycmF5W3BhdGhdID0gc24udHJhbnNmb3JtZWRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydEludGVybmFsU25hcHNob3RPYnNlcnZlZChzbjogU25hcHNob3REYXRhKSB7XG4gIHNuLmF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJlZXplSW50ZXJuYWxTbmFwc2hvdDxUIGV4dGVuZHMgUHJpbWl0aXZlVmFsdWUgfCBvYmplY3Q+KGRhdGE6IFQpOiBUIHtcbiAgaWYgKGlzUHJpbWl0aXZlKGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8vIHRoaXMgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBkYXRhIGNvbWVzIGZyb20gZXhhbXBsZSBmcm9tIHRyYW5zZm9ybXNcbiAgY29uc3QgaXNGcm96ZW4gPSBmcm96ZW5TdGF0ZS5nZXQoZGF0YSlcblxuICBpZiAoaXNGcm96ZW4gPT09IHVuZGVmaW5lZCB8fCBpc0Zyb3plbiA9PT0gdHJ1ZSkge1xuICAgIC8vIGFscmVhZHkgZnJvemVuIG9yIGFuIGV4dGVybmFsIGRhdGEgKGUuZy4gZnJvbSBhIHRyYW5zZm9ybSlcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZyZWV6ZUludGVybmFsU25hcHNob3QoZGF0YVtpXSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmcmVlemVJbnRlcm5hbFNuYXBzaG90KChkYXRhIGFzIGFueSlba2V5c1tpXV0pXG4gICAgfVxuICB9XG5cbiAgZnJvemVuU3RhdGUuc2V0KGRhdGEsIHRydWUpXG5cbiAgcmV0dXJuIGRhdGFcbn1cbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcclxuaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3R5cGVzL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB7IEFueVR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXHJcbmltcG9ydCB7IGZhaWx1cmUsIGlkZW50aXR5Rm4sIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHtcclxuICBmcmVlemVJbnRlcm5hbFNuYXBzaG90LFxyXG4gIGdldEludGVybmFsU25hcHNob3QsXHJcbiAgcmVwb3J0SW50ZXJuYWxTbmFwc2hvdE9ic2VydmVkLFxyXG59IGZyb20gXCIuL2ludGVybmFsXCJcclxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXHJcblxyXG4vKipcclxuICogUmV0cmlldmVzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBmb3IgYSBkYXRhIHN0cnVjdHVyZS5cclxuICogU2luY2UgcmV0dXJuZWQgc25hcHNob3RzIGFyZSBpbW11dGFibGUgdGhleSB3aWxsIHJlc3BlY3Qgc2hhbGxvdyBlcXVhbGl0eSwgdGhpcyBpcyxcclxuICogaWYgbm8gY2hhbmdlcyBhcmUgbWFkZSB0aGVuIHRoZSBzbmFwc2hvdCB3aWxsIGJlIGtlcHQgdGhlIHNhbWUuXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cclxuICogQHBhcmFtIG5vZGVPclByaW1pdGl2ZSBEYXRhIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHByaW10aXZlcy5cclxuICogQHJldHVybnMgVGhlIHNuYXBzaG90LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNuYXBzaG90PFQgZXh0ZW5kcyBBbnlUeXBlPihcclxuICB0eXBlOiBULFxyXG4gIG5vZGVPclByaW1pdGl2ZTogVHlwZVRvRGF0YTxUPlxyXG4pOiBTbmFwc2hvdE91dE9mPFR5cGVUb0RhdGE8VD4+XHJcblxyXG4vKipcclxuICogUmV0cmlldmVzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBmb3IgYSBkYXRhIHN0cnVjdHVyZS5cclxuICogU2luY2UgcmV0dXJuZWQgc25hcHNob3RzIGFyZSBpbW11dGFibGUgdGhleSB3aWxsIHJlc3BlY3Qgc2hhbGxvdyBlcXVhbGl0eSwgdGhpcyBpcyxcclxuICogaWYgbm8gY2hhbmdlcyBhcmUgbWFkZSB0aGVuIHRoZSBzbmFwc2hvdCB3aWxsIGJlIGtlcHQgdGhlIHNhbWUuXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cclxuICogQHBhcmFtIG5vZGVPclByaW1pdGl2ZSBEYXRhIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHByaW10aXZlcy5cclxuICogQHJldHVybnMgVGhlIHNuYXBzaG90LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNuYXBzaG90PFQ+KG5vZGVPclByaW1pdGl2ZTogVCk6IFNuYXBzaG90T3V0T2Y8VD5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTbmFwc2hvdChhcmcxOiBhbnksIGFyZzI/OiBhbnkpOiBhbnkge1xyXG4gIGxldCB0b1NuYXBzaG90UHJvY2Vzc29yID0gaWRlbnRpdHlGbiBhcyAoc246IGFueSkgPT4gdW5rbm93blxyXG4gIGxldCBub2RlT3JQcmltaXRpdmU6IGFueVxyXG5cclxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7XHJcbiAgICB0b1NuYXBzaG90UHJvY2Vzc29yID0gcmVzb2x2ZVR5cGVDaGVja2VyKGFyZzEpLnRvU25hcHNob3RQcm9jZXNzb3JcclxuICAgIG5vZGVPclByaW1pdGl2ZSA9IGFyZzJcclxuICB9IGVsc2Uge1xyXG4gICAgbm9kZU9yUHJpbWl0aXZlID0gYXJnMVxyXG4gIH1cclxuXHJcbiAgaWYgKGlzUHJpbWl0aXZlKG5vZGVPclByaW1pdGl2ZSkpIHtcclxuICAgIHJldHVybiB0b1NuYXBzaG90UHJvY2Vzc29yKG5vZGVPclByaW1pdGl2ZSlcclxuICB9XHJcblxyXG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZU9yUHJpbWl0aXZlLCBcIm5vZGVPclByaW1pdGl2ZVwiKVxyXG5cclxuICBjb25zdCBzbmFwc2hvdCA9IGdldEludGVybmFsU25hcHNob3Qobm9kZU9yUHJpbWl0aXZlKVxyXG4gIGlmICghc25hcHNob3QpIHtcclxuICAgIHRocm93IGZhaWx1cmUoXCJnZXRTbmFwc2hvdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGtpbmQgb2Ygb2JqZWN0XCIpXHJcbiAgfVxyXG5cclxuICBmcmVlemVJbnRlcm5hbFNuYXBzaG90KHNuYXBzaG90LnRyYW5zZm9ybWVkKVxyXG4gIHJlcG9ydEludGVybmFsU25hcHNob3RPYnNlcnZlZChzbmFwc2hvdClcclxuICByZXR1cm4gdG9TbmFwc2hvdFByb2Nlc3NvcihzbmFwc2hvdC50cmFuc2Zvcm1lZClcclxufVxyXG4iLCJpbXBvcnQgeyByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi9zY2hlbWFzXCJcclxuaW1wb3J0IHR5cGUgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuL1R5cGVDaGVja0Vycm9yXCJcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBjb25mb3JtcyB0byBhIGdpdmVuIHR5cGUuXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxyXG4gKiBAcGFyYW0gdHlwZSBUeXBlIHRvIGNoZWNrIGZvci5cclxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrLlxyXG4gKiBAcmV0dXJucyBBIFR5cGVFcnJvciBpZiB0aGUgY2hlY2sgZmFpbHMgb3IgbnVsbCBpZiBubyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlQ2hlY2s8VCBleHRlbmRzIEFueVR5cGU+KHR5cGU6IFQsIHZhbHVlOiBUeXBlVG9EYXRhPFQ+KTogVHlwZUNoZWNrRXJyb3IgfCBudWxsIHtcclxuICBjb25zdCB0eXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcih0eXBlKVxyXG5cclxuICBpZiAodHlwZUNoZWNrZXIudW5jaGVja2VkKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdHlwZUNoZWNrZXIuY2hlY2sodmFsdWUsIFtdKVxyXG4gIH1cclxufVxyXG4iLCJsZXQgdXJsQWxwaGFiZXQgPVxuICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcbmxldCBjdXN0b21BbHBoYWJldCA9IChhbHBoYWJldCwgZGVmYXVsdFNpemUgPSAyMSkgPT4ge1xuICByZXR1cm4gKHNpemUgPSBkZWZhdWx0U2l6ZSkgPT4ge1xuICAgIGxldCBpZCA9ICcnXG4gICAgbGV0IGkgPSBzaXplXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgaWQgKz0gYWxwaGFiZXRbKE1hdGgucmFuZG9tKCkgKiBhbHBoYWJldC5sZW5ndGgpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG4gIH1cbn1cbmxldCBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9ICcnXG4gIGxldCBpID0gc2l6ZVxuICB3aGlsZSAoaS0tKSB7XG4gICAgaWQgKz0gdXJsQWxwaGFiZXRbKE1hdGgucmFuZG9tKCkgKiA2NCkgfCAwXVxuICB9XG4gIHJldHVybiBpZFxufVxuZXhwb3J0IHsgbmFub2lkLCBjdXN0b21BbHBoYWJldCB9XG4iLCJpbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkL25vbi1zZWN1cmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBNb2RlbCBhdXRvIHR5cGUtY2hlY2tpbmcgbW9kZS5cbiAqL1xuZXhwb3J0IGVudW0gTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZSB7XG4gIC8qKlxuICAgKiBBdXRvIHR5cGUgY2hlY2sgbW9kZWxzIG9ubHkgaW4gZGV2IG1vZGVcbiAgICovXG4gIERldk1vZGVPbmx5ID0gXCJkZXZNb2RlT25seVwiLFxuICAvKipcbiAgICogQXV0byB0eXBlIGNoZWNrIG1vZGVscyBubyBtYXR0ZXIgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcbiAgICovXG4gIEFsd2F5c09uID0gXCJhbHdheXNPblwiLFxuICAvKipcbiAgICogRG8gbm90IGF1dG8gdHlwZSBjaGVjayBtb2RlbHMgbm8gbWF0dGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50XG4gICAqL1xuICBBbHdheXNPZmYgPSBcImFsd2F5c09mZlwiLFxufVxuXG4vKipcbiAqIEdsb2JhbCBjb25maWcgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JhbENvbmZpZyB7XG4gIC8qKlxuICAgKiBNb2RlbCBhdXRvIHR5cGUtY2hlY2tpbmcgbW9kZS5cbiAgICovXG4gIG1vZGVsQXV0b1R5cGVDaGVja2luZzogTW9kZWxBdXRvVHlwZUNoZWNraW5nTW9kZVxuXG4gIC8qKlxuICAgKiBJRCBnZW5lcmF0b3IgZnVuY3Rpb24gZm9yIG1vZGVsIGlkcy5cbiAgICovXG4gIG1vZGVsSWRHZW5lcmF0b3IoKTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEFsbG93IGFycmF5IGVsZW1lbnRzIHRvIGJlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgYWxsb3dVbmRlZmluZWRBcnJheUVsZW1lbnRzOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgd2FybmluZ3MgcmVsYXRlZCB0byBkdXBsaWNhdGVkIG1vZGVsIG5hbWVzIChkZWZhdWx0cyB0byBgdHJ1ZWApLlxuICAgKiBVc3VhbGx5IHNldCB0byBmYWxzZSBpbiB0ZXN0IGVudmlyb25tZW50cyAoZS5nLiBqZXN0KS5cbiAgICovXG4gIHNob3dEdXBsaWNhdGVNb2RlbE5hbWVXYXJuaW5nczogYm9vbGVhblxufVxuXG5sZXQgbG9jYWxJZCA9IDBcbmNvbnN0IGxvY2FsQmFzZUlkID0gbmFub2lkKClcblxuZnVuY3Rpb24gZGVmYXVsdE1vZGVsSWRHZW5lcmF0b3IoKTogc3RyaW5nIHtcbiAgLy8gd2UgdXNlIGJhc2UgMzYgZm9yIGxvY2FsIGlkIHNpbmNlIGl0IGlzIHNob3J0IGFuZCBmYXN0XG4gIGNvbnN0IGlkID0gbG9jYWxJZC50b1N0cmluZygzNikgKyBcIi1cIiArIGxvY2FsQmFzZUlkXG4gIGxvY2FsSWQrK1xuICByZXR1cm4gaWRcbn1cblxuLy8gZGVmYXVsdHNcbmxldCBnbG9iYWxDb25maWc6IEdsb2JhbENvbmZpZyA9IHtcbiAgbW9kZWxBdXRvVHlwZUNoZWNraW5nOiBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlLkRldk1vZGVPbmx5LFxuICBtb2RlbElkR2VuZXJhdG9yOiBkZWZhdWx0TW9kZWxJZEdlbmVyYXRvcixcbiAgYWxsb3dVbmRlZmluZWRBcnJheUVsZW1lbnRzOiBmYWxzZSxcbiAgc2hvd0R1cGxpY2F0ZU1vZGVsTmFtZVdhcm5pbmdzOiB0cnVlLFxufVxuXG4vKipcbiAqIFBhcnRpYWxseSBzZXRzIHRoZSBjdXJyZW50IGdsb2JhbCBjb25maWcuXG4gKlxuICogQHBhcmFtIGNvbmZpZyBQYXJ0aWFsIG9iamVjdCB3aXRoIHRoZSBuZXcgY29uZmlndXJhdGlvbnMuIE9wdGlvbnMgbm90IGluY2x1ZGVkIGluIHRoZSBvYmplY3Qgd29uJ3QgYmUgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdsb2JhbENvbmZpZyhjb25maWc6IFBhcnRpYWw8R2xvYmFsQ29uZmlnPikge1xuICBnbG9iYWxDb25maWcgPSBPYmplY3QuZnJlZXplKHtcbiAgICAuLi5nbG9iYWxDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9KVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgZ2xvYmFsIGNvbmZpZyBvYmplY3QuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbENvbmZpZygpOiBSZWFkb25seTxHbG9iYWxDb25maWc+IHtcbiAgcmV0dXJuIGdsb2JhbENvbmZpZ1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIFJldHVybnMgaWYgdGhlIGF1dG8gdHlwZSBjaGVja2luZyBmb3IgbW9kZWxzIGlzIGVuYWJsZWQuXG4gKlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCgpIHtcbiAgc3dpdGNoIChnZXRHbG9iYWxDb25maWcoKS5tb2RlbEF1dG9UeXBlQ2hlY2tpbmcpIHtcbiAgICBjYXNlIE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGUuRGV2TW9kZU9ubHk6XG4gICAgICByZXR1cm4gaW5EZXZNb2RlKClcbiAgICBjYXNlIE1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGUuQWx3YXlzT2ZmOlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgY2FzZSBNb2RlbEF1dG9UeXBlQ2hlY2tpbmdNb2RlLkFsd2F5c09uOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgJ21vZGVsQXV0b1R5cGVDaGVja2luZycgY29uZmlnIHZhbHVlIC0gJHtnbG9iYWxDb25maWcubW9kZWxBdXRvVHlwZUNoZWNraW5nfWBcbiAgICAgIClcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4vQmFzZU1vZGVsU2hhcmVkXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sID0gU3ltYm9sKFwibW9kZWxJbml0aWFsaXplcnNcIilcblxudHlwZSBNb2RlbENsYXNzSW5pdGlhbGl6ZXIgPSAobW9kZWxJbnN0YW5jZTogQW55TW9kZWwgfCBBbnlEYXRhTW9kZWwpID0+IHZvaWRcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE1vZGVsQ2xhc3NJbml0aWFsaXplcihcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4sXG4gIGluaXQ6IE1vZGVsQ2xhc3NJbml0aWFsaXplclxuKSB7XG4gIGxldCBpbml0aWFsaXplcnMgPSAobW9kZWxDbGFzcyBhcyBhbnkpW21vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sXVxuICBpZiAoIWluaXRpYWxpemVycykge1xuICAgIGluaXRpYWxpemVycyA9IFtdXG4gICAgOyhtb2RlbENsYXNzIGFzIGFueSlbbW9kZWxJbml0aWFsaXplcnNTeW1ib2xdID0gaW5pdGlhbGl6ZXJzXG4gIH1cbiAgaW5pdGlhbGl6ZXJzLnB1c2goaW5pdClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQ2xhc3NJbml0aWFsaXplcnMoXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+XG4pOiBNb2RlbENsYXNzSW5pdGlhbGl6ZXJbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiAobW9kZWxDbGFzcyBhcyBhbnkpW21vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sXVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBnZXRNb2RlbENsYXNzSW5pdGlhbGl6ZXJzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsQ2xhc3NJbml0aWFsaXplclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzKFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPixcbiAgbW9kZWxPYmo6IGFueVxuKSB7XG4gIGNvbnN0IGluaXRpYWxpemVycyA9IGdldE1vZGVsQ2xhc3NJbml0aWFsaXplcnMobW9kZWxDbGFzcylcbiAgaWYgKGluaXRpYWxpemVycykge1xuICAgIGNvbnN0IGxlbiA9IGluaXRpYWxpemVycy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBpbml0ID0gaW5pdGlhbGl6ZXJzW2ldXG4gICAgICBpbml0KG1vZGVsT2JqKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIlxuXG5mdW5jdGlvbiBjYW5Xcml0ZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuICFnZXRBY3Rpb25Qcm90ZWN0aW9uKCkgfHwgISFnZXRDdXJyZW50QWN0aW9uQ29udGV4dCgpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDYW5Xcml0ZSgpIHtcbiAgaWYgKCFjYW5Xcml0ZSgpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImRhdGEgY2hhbmdlcyBtdXN0IGJlIHBlcmZvcm1lZCBpbnNpZGUgbW9kZWwgYWN0aW9uc1wiKVxuICB9XG59XG5cbmxldCBhY3Rpb25Qcm90ZWN0aW9uID0gdHJ1ZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEdldHMgaWYgdGhlIGFjdGlvbiBwcm90ZWN0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkIG9yIG5vdC5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uUHJvdGVjdGlvbigpIHtcbiAgcmV0dXJuIGFjdGlvblByb3RlY3Rpb25cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBTZXRzIGlmIHRoZSBhY3Rpb24gcHJvdGVjdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZCBvciBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRBY3Rpb25Qcm90ZWN0aW9uKHByb3RlY3Rpb246IGJvb2xlYW4pIHtcbiAgYWN0aW9uUHJvdGVjdGlvbiA9IHByb3RlY3Rpb25cbn1cbiIsImltcG9ydCB7IGdldEN1cnJlbnRBY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyBnZXRBY3Rpb25Qcm90ZWN0aW9uIH0gZnJvbSBcIi4vcHJvdGVjdGlvblwiXG5cbmNvbnN0IHBlbmRpbmdBY3Rpb25zOiAoKCkgPT4gdm9pZClbXSA9IFtdXG5cbmZ1bmN0aW9uIGlzQWN0aW9uUnVubmluZygpIHtcbiAgcmV0dXJuICFnZXRBY3Rpb25Qcm90ZWN0aW9uKCkgfHwgZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdBY3Rpb24oYWN0aW9uOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gIC8vIGRlbGF5IGFjdGlvbiB1bnRpbCBhbGwgY3VycmVudCBhY3Rpb25zIGFyZSBmaW5pc2hlZFxuICBpZiAoaXNBY3Rpb25SdW5uaW5nKCkpIHtcbiAgICBwZW5kaW5nQWN0aW9ucy5wdXNoKGFjdGlvbilcbiAgfSBlbHNlIHtcbiAgICBhY3Rpb24oKVxuICB9XG59XG5cbmxldCBwZW5kaW5nQWN0aW9uc1J1bm5pbmcgPSBmYWxzZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5UnVuUGVuZGluZ0FjdGlvbnMoKTogdm9pZCB7XG4gIGlmIChpc0FjdGlvblJ1bm5pbmcoKSB8fCBwZW5kaW5nQWN0aW9uc1J1bm5pbmcpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHBlbmRpbmdBY3Rpb25zUnVubmluZyA9IHRydWVcblxuICB0cnkge1xuICAgIHdoaWxlIChwZW5kaW5nQWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0QWN0aW9uID0gcGVuZGluZ0FjdGlvbnMuc2hpZnQoKSFcbiAgICAgIG5leHRBY3Rpb24oKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwZW5kaW5nQWN0aW9uc1J1bm5pbmcgPSBmYWxzZVxuICB9XG59XG4iLCIvKipcbiAqIEEgaG9vayBhY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIEhvb2tBY3Rpb24ge1xuICAvKipcbiAgICogb25Jbml0IGhvb2tcbiAgICovXG4gIE9uSW5pdCA9IFwiJCRvbkluaXRcIixcbiAgLyoqXG4gICAqIG9uTGF6eUluaXQgaG9va1xuICAgKi9cbiAgT25MYXp5SW5pdCA9IFwiJCRvbkxhenlJbml0XCIsXG4gIC8qKlxuICAgKiBvbkF0dGFjaGVkVG9Sb290U3RvcmUgaG9va1xuICAgKi9cbiAgT25BdHRhY2hlZFRvUm9vdFN0b3JlID0gXCIkJG9uQXR0YWNoZWRUb1Jvb3RTdG9yZVwiLFxuICAvKipcbiAgICogZGlzcG9zZXIgZm9yIG9uQXR0YWNoZWRUb1Jvb3RTdG9yZSBob29rXG4gICAqL1xuICBPbkF0dGFjaGVkVG9Sb290U3RvcmVEaXNwb3NlciA9IFwiJCRvbkF0dGFjaGVkVG9Sb290U3RvcmVEaXNwb3NlclwiLFxufVxuXG5jb25zdCBob29rQWN0aW9uVmFsdWVzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChPYmplY3QudmFsdWVzKEhvb2tBY3Rpb24pKVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBhY3Rpb24gbmFtZSBjb3JyZXNwb25kcyB0byBhIGhvb2ssIHRoaXMgaXMsIG9uZSBvZjpcbiAqIC0gb25Jbml0KCkgaG9va1xuICogLSBvbkxhenlJbml0KCkgaG9va1xuICogLSBvbkF0dGFjaGVkVG9Sb290U3RvcmUoKSBob29rXG4gKiAtIGRpc3Bvc2VyIHJldHVybmVkIGJ5IGEgb25BdHRhY2hlZFRvUm9vdFN0b3JlKCkgaG9va1xuICpcbiAqIEBwYXJhbSBhY3Rpb25OYW1lIEFjdGlvbiBuYW1lIHRvIGNoZWNrLlxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIGhvb2ssIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSG9va0FjdGlvbihhY3Rpb25OYW1lOiBzdHJpbmcpOiBhY3Rpb25OYW1lIGlzIEhvb2tBY3Rpb24ge1xuICByZXR1cm4gaG9va0FjdGlvblZhbHVlcy5oYXMoYWN0aW9uTmFtZSlcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgY3JlYXRlQXRvbSwgSUF0b20sIG9ic2VydmFibGUsIE9ic2VydmFibGVTZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50IH0gZnJvbSBcIi4vcGF0aFwiXG5cbmNvbnN0IGRlZmF1bHRPYnNlcnZhYmxlU2V0T3B0aW9ucyA9IHsgZGVlcDogZmFsc2UgfVxuXG5pbnRlcmZhY2UgRGVlcE9iamVjdENoaWxkcmVuIHtcbiAgZGVlcDogU2V0PG9iamVjdD5cblxuICBleHRlbnNpb25zRGF0YTogV2Vha01hcDxTeW1ib2wsIGFueT5cbn1cblxuaW50ZXJmYWNlIE9iamVjdENoaWxkcmVuRGF0YSBleHRlbmRzIERlZXBPYmplY3RDaGlsZHJlbiB7XG4gIHNoYWxsb3c6IE9ic2VydmFibGVTZXQ8b2JqZWN0PlxuXG4gIGRlZXBEaXJ0eTogYm9vbGVhblxuICBkZWVwQXRvbTogSUF0b21cbn1cblxuY29uc3Qgb2JqZWN0Q2hpbGRyZW4gPSBuZXcgV2Vha01hcDxvYmplY3QsIE9iamVjdENoaWxkcmVuRGF0YT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZU9iamVjdENoaWxkcmVuKG5vZGU6IG9iamVjdCkge1xuICBpZiAob2JqZWN0Q2hpbGRyZW4uaGFzKG5vZGUpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBvYmplY3RDaGlsZHJlbi5zZXQobm9kZSwge1xuICAgIHNoYWxsb3c6IG9ic2VydmFibGUuc2V0KHVuZGVmaW5lZCwgZGVmYXVsdE9ic2VydmFibGVTZXRPcHRpb25zKSxcblxuICAgIGRlZXA6IG5ldyBTZXQoKSxcbiAgICBleHRlbnNpb25zRGF0YTogaW5pdEV4dGVuc2lvbnNEYXRhKCksXG5cbiAgICBkZWVwRGlydHk6IHRydWUsXG4gICAgZGVlcEF0b206IGNyZWF0ZUF0b20oXCJkZWVwQ2hpbGRyZW5BdG9tXCIpLFxuICB9KVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqZWN0Q2hpbGRyZW4obm9kZTogb2JqZWN0KTogT2JqZWN0Q2hpbGRyZW5EYXRhW1wic2hhbGxvd1wiXSB7XG4gIHJldHVybiBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhLnNoYWxsb3dcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZXBPYmplY3RDaGlsZHJlbihub2RlOiBvYmplY3QpOiBEZWVwT2JqZWN0Q2hpbGRyZW4ge1xuICBjb25zdCBvYmogPSBvYmplY3RDaGlsZHJlbi5nZXQobm9kZSkhXG5cbiAgaWYgKG9iai5kZWVwRGlydHkpIHtcbiAgICB1cGRhdGVEZWVwT2JqZWN0Q2hpbGRyZW4obm9kZSlcbiAgfVxuXG4gIG9iai5kZWVwQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgcmV0dXJuIG9ialxufVxuXG5mdW5jdGlvbiBhZGROb2RlVG9EZWVwTGlzdHMobm9kZTogYW55LCBkYXRhOiBEZWVwT2JqZWN0Q2hpbGRyZW4pIHtcbiAgZGF0YS5kZWVwLmFkZChub2RlKVxuICBleHRlbnNpb25zLmZvckVhY2goKGV4dGVuc2lvbiwgZGF0YVN5bWJvbCkgPT4ge1xuICAgIGV4dGVuc2lvbi5hZGROb2RlKG5vZGUsIGRhdGEuZXh0ZW5zaW9uc0RhdGEuZ2V0KGRhdGFTeW1ib2wpKVxuICB9KVxufVxuXG5jb25zdCB1cGRhdGVEZWVwT2JqZWN0Q2hpbGRyZW4gPSBhY3Rpb24oKG5vZGU6IG9iamVjdCk6IERlZXBPYmplY3RDaGlsZHJlbiA9PiB7XG4gIGNvbnN0IG9iaiA9IG9iamVjdENoaWxkcmVuLmdldChub2RlKSFcbiAgaWYgKCFvYmouZGVlcERpcnR5KSB7XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgY29uc3QgZGF0YTogRGVlcE9iamVjdENoaWxkcmVuID0ge1xuICAgIGRlZXA6IG5ldyBTZXQoKSxcbiAgICBleHRlbnNpb25zRGF0YTogaW5pdEV4dGVuc2lvbnNEYXRhKCksXG4gIH1cblxuICBjb25zdCBjaGlsZHJlbkl0ZXIgPSBnZXRPYmplY3RDaGlsZHJlbihub2RlKSEudmFsdWVzKClcbiAgbGV0IGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB3aGlsZSAoIWNoLmRvbmUpIHtcbiAgICBhZGROb2RlVG9EZWVwTGlzdHMoY2gudmFsdWUsIGRhdGEpXG5cbiAgICBjb25zdCByZXQgPSB1cGRhdGVEZWVwT2JqZWN0Q2hpbGRyZW4oY2gudmFsdWUpLmRlZXBcbiAgICBjb25zdCByZXRJdGVyID0gcmV0LnZhbHVlcygpXG4gICAgbGV0IHJldEN1ciA9IHJldEl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFyZXRDdXIuZG9uZSkge1xuICAgICAgYWRkTm9kZVRvRGVlcExpc3RzKHJldEN1ci52YWx1ZSwgZGF0YSlcbiAgICAgIHJldEN1ciA9IHJldEl0ZXIubmV4dCgpXG4gICAgfVxuXG4gICAgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG4gIH1cblxuICBPYmplY3QuYXNzaWduKG9iaiwgZGF0YSlcblxuICBvYmouZGVlcERpcnR5ID0gZmFsc2VcbiAgb2JqLmRlZXBBdG9tLnJlcG9ydENoYW5nZWQoKVxuXG4gIHJldHVybiBvYmpcbn0pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRPYmplY3RDaGlsZCA9IGFjdGlvbigobm9kZTogb2JqZWN0LCBjaGlsZDogb2JqZWN0KSA9PiB7XG4gIGNvbnN0IG9iaiA9IG9iamVjdENoaWxkcmVuLmdldChub2RlKSFcbiAgb2JqLnNoYWxsb3cuYWRkKGNoaWxkKVxuXG4gIGludmFsaWRhdGVEZWVwQ2hpbGRyZW4obm9kZSlcbn0pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVPYmplY3RDaGlsZCA9IGFjdGlvbigobm9kZTogb2JqZWN0LCBjaGlsZDogb2JqZWN0KSA9PiB7XG4gIGNvbnN0IG9iaiA9IG9iamVjdENoaWxkcmVuLmdldChub2RlKSFcbiAgb2JqLnNoYWxsb3cuZGVsZXRlKGNoaWxkKVxuXG4gIGludmFsaWRhdGVEZWVwQ2hpbGRyZW4obm9kZSlcbn0pXG5cbmZ1bmN0aW9uIGludmFsaWRhdGVEZWVwQ2hpbGRyZW4obm9kZTogb2JqZWN0KSB7XG4gIGNvbnN0IG9iaiA9IG9iamVjdENoaWxkcmVuLmdldChub2RlKSFcblxuICBpZiAoIW9iai5kZWVwRGlydHkpIHtcbiAgICBvYmouZGVlcERpcnR5ID0gdHJ1ZVxuICAgIG9iai5kZWVwQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuXG4gIGNvbnN0IHBhcmVudCA9IGZhc3RHZXRQYXJlbnQobm9kZSlcbiAgaWYgKHBhcmVudCkge1xuICAgIGludmFsaWRhdGVEZWVwQ2hpbGRyZW4ocGFyZW50KVxuICB9XG59XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSBuZXcgTWFwPFN5bWJvbCwgRGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uPGFueT4+KClcblxuaW50ZXJmYWNlIERlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbjxEPiB7XG4gIGluaXREYXRhKCk6IERcbiAgYWRkTm9kZShub2RlOiBhbnksIGRhdGE6IEQpOiB2b2lkXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbjxEPihleHRlbnNpb246IERlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbjxEPikge1xuICBjb25zdCBkYXRhU3ltYm9sID0gU3ltYm9sKFwiZGVlcE9iamVjdENoaWxkcmVuRXh0ZW5zaW9uXCIpXG4gIGV4dGVuc2lvbnMuc2V0KGRhdGFTeW1ib2wsIGV4dGVuc2lvbilcblxuICByZXR1cm4gKGRhdGE6IERlZXBPYmplY3RDaGlsZHJlbik6IEQgPT4ge1xuICAgIHJldHVybiBkYXRhLmV4dGVuc2lvbnNEYXRhLmdldChkYXRhU3ltYm9sKSBhcyBEXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdEV4dGVuc2lvbnNEYXRhKCkge1xuICBjb25zdCBleHRlbnNpb25zRGF0YSA9IG5ldyBNYXA8U3ltYm9sLCBhbnk+KClcblxuICBleHRlbnNpb25zLmZvckVhY2goKGV4dGVuc2lvbiwgZGF0YVN5bWJvbCkgPT4ge1xuICAgIGV4dGVuc2lvbnNEYXRhLnNldChkYXRhU3ltYm9sLCBleHRlbnNpb24uaW5pdERhdGEoKSlcbiAgfSlcblxuICByZXR1cm4gZXh0ZW5zaW9uc0RhdGFcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldE9iamVjdENoaWxkcmVuIH0gZnJvbSBcIi4vY29yZU9iamVjdENoaWxkcmVuXCJcblxuLyoqXG4gKiBNb2RlIGZvciB0aGUgYHdhbGtUcmVlYCBtZXRob2QuXG4gKi9cbmV4cG9ydCBlbnVtIFdhbGtUcmVlTW9kZSB7XG4gIC8qKlxuICAgKiBUaGUgd2FsayB3aWxsIGJlIGRvbmUgcGFyZW50IChyb290cykgZmlyc3QsIHRoZW4gY2hpbGRyZW4uXG4gICAqL1xuICBQYXJlbnRGaXJzdCA9IFwicGFyZW50Rmlyc3RcIixcbiAgLyoqXG4gICAqIFRoZSB3YWxrIHdpbGwgYmUgZG9uZSBjaGlsZHJlbiAobGVhZnMpIGZpcnN0LCB0aGVuIHBhcmVudHMuXG4gICAqL1xuICBDaGlsZHJlbkZpcnN0ID0gXCJjaGlsZHJlbkZpcnN0XCIsXG59XG5cbi8qKlxuICogV2Fsa3MgYSB0cmVlLCBydW5uaW5nIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gZm9yIGVhY2ggbm9kZS5cbiAqIElmIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJucyBzb21ldGhpbmcgb3RoZXIgdGhhbiB1bmRlZmluZWQsXG4gKiB0aGVuIHRoZSB3YWxrIHdpbGwgYmUgc3RvcHBlZCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSByZXR1cm5lZCB2YWx1ZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmV0dXJuZWQgb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIHZvaWQuXG4gKiBAcGFyYW0gcm9vdCBTdWJ0cmVlIHJvb3Qgb2JqZWN0LlxuICogQHBhcmFtIHZpc2l0IEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gZm9yIGVhY2ggbm9kZSBvZiB0aGUgdHJlZS5cbiAqIEBwYXJhbSBtb2RlIE1vZGUgdG8gd2FsayB0aGUgdHJlZSwgYXMgZGVmaW5lZCBpbiBgV2Fsa1RyZWVNb2RlYC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWxrVHJlZTxUID0gdm9pZD4oXG4gIHJvb3Q6IG9iamVjdCxcbiAgdmlzaXQ6IChub2RlOiBvYmplY3QpID0+IFQgfCB1bmRlZmluZWQsXG4gIG1vZGU6IFdhbGtUcmVlTW9kZVxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qocm9vdCwgXCJyb290XCIpXG5cbiAgaWYgKG1vZGUgPT09IFdhbGtUcmVlTW9kZS5QYXJlbnRGaXJzdCkge1xuICAgIHJldHVybiB3YWxrVHJlZVBhcmVudEZpcnN0KHJvb3QsIHZpc2l0KVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB3YWxrVHJlZUNoaWxkcmVuRmlyc3Qocm9vdCwgdmlzaXQpXG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fsa1RyZWVQYXJlbnRGaXJzdDxUID0gdm9pZD4oXG4gIHJvb3Q6IG9iamVjdCxcbiAgdmlzaXQ6IChub2RlOiBvYmplY3QpID0+IFQgfCB1bmRlZmluZWRcbik6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbcm9vdF1cblxuICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSFcblxuICAgIGNvbnN0IHJldCA9IHZpc2l0KG5vZGUpXG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBnZXRPYmplY3RDaGlsZHJlbihub2RlKSFcblxuICAgIHN0YWNrLmxlbmd0aCArPSBjaGlsZHJlbi5zaXplXG4gICAgbGV0IGkgPSBzdGFjay5sZW5ndGggLSAxXG5cbiAgICBjb25zdCBjaGlsZHJlbkl0ZXIgPSBjaGlsZHJlbiEudmFsdWVzKClcbiAgICBsZXQgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFjaC5kb25lKSB7XG4gICAgICBzdGFja1tpLS1dID0gY2gudmFsdWVcbiAgICAgIGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gd2Fsa1RyZWVDaGlsZHJlbkZpcnN0PFQgPSB2b2lkPihcbiAgcm9vdDogb2JqZWN0LFxuICB2aXNpdDogKG5vZGU6IG9iamVjdCkgPT4gVCB8IHVuZGVmaW5lZFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNoaWxkcmVuSXRlciA9IGdldE9iamVjdENoaWxkcmVuKHJvb3QpIS52YWx1ZXMoKVxuICBsZXQgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG4gIHdoaWxlICghY2guZG9uZSkge1xuICAgIGNvbnN0IHJldCA9IHdhbGtUcmVlQ2hpbGRyZW5GaXJzdChjaC52YWx1ZSwgdmlzaXQpXG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICAgIGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB9XG5cbiAgY29uc3QgcmV0ID0gdmlzaXQocm9vdClcbiAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVkV2Fsa1RyZWVBZ2dyZWdhdGU8Uj4ge1xuICB3YWxrKHRhcmdldDogb2JqZWN0KTogTWFwPFIsIG9iamVjdD4gfCB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRUcmVlUmVzdWx0PFI+KFxuICBjb21wdXRlZEZuczogV2Vha01hcDxvYmplY3QsIElDb21wdXRlZFZhbHVlPE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkPj4sXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBSIHwgdW5kZWZpbmVkLFxuICB0cmVlOiBvYmplY3Rcbik6IE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGNtcHRlZCA9IGNvbXB1dGVkRm5zLmdldCh0cmVlKVxuICBpZiAoIWNtcHRlZCkge1xuICAgIGNtcHRlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB3YWxrVHJlZUFnZ3JlZ2F0ZSh0cmVlLCB2aXNpdCwgKGNoKSA9PiBnZXRDb21wdXRlZFRyZWVSZXN1bHQoY29tcHV0ZWRGbnMsIHZpc2l0LCBjaCkpXG4gICAgfSlcbiAgICBjb21wdXRlZEZucy5zZXQodHJlZSwgY21wdGVkKVxuICB9XG4gIHJldHVybiBjbXB0ZWQuZ2V0KClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVkV2Fsa1RyZWVBZ2dyZWdhdGU8Uj4oXG4gIHZpc2l0OiAobm9kZTogb2JqZWN0KSA9PiBSIHwgdW5kZWZpbmVkXG4pOiBDb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPFI+IHtcbiAgY29uc3QgY29tcHV0ZWRGbnMgPSBuZXcgV2Vha01hcDxvYmplY3QsIElDb21wdXRlZFZhbHVlPE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkPj4oKVxuXG4gIHJldHVybiB7XG4gICAgd2FsazogKG4pID0+IGdldENvbXB1dGVkVHJlZVJlc3VsdChjb21wdXRlZEZucywgdmlzaXQsIG4pLFxuICB9XG59XG5cbmZ1bmN0aW9uIHdhbGtUcmVlQWdncmVnYXRlPFI+KFxuICB0YXJnZXQ6IG9iamVjdCxcbiAgdmlzaXQ6IChub2RlOiBvYmplY3QpID0+IFIgfCB1bmRlZmluZWQsXG4gIHJlY3Vyc2U6IChub2RlOiBvYmplY3QpID0+IE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkXG4pOiBNYXA8Uiwgb2JqZWN0PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBtYXA6IE1hcDxSLCBvYmplY3Q+IHwgdW5kZWZpbmVkXG4gIGNvbnN0IHJvb3RWYWwgPSB2aXNpdCh0YXJnZXQpXG5cbiAgY29uc3QgY2hpbGRyZW5NYXAgPSBnZXRPYmplY3RDaGlsZHJlbih0YXJnZXQpIVxuICBjb25zdCBjaGlsZHJlbkl0ZXIgPSBjaGlsZHJlbk1hcCEudmFsdWVzKClcbiAgbGV0IGNoID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuXG4gIC8vIHNtYWxsIG9wdGltaXphdGlvbiwgaWYgdGhlcmUgaXMgb25seSBvbmUgY2hpbGQgYW5kIHRoaXNcbiAgLy8gb2JqZWN0IHByb3ZpZGVzIG5vIHZhbHVlIHdlIGNhbiBqdXN0IHJldXNlIHRoZSBjaGlsZCBvbmVzXG4gIGlmIChyb290VmFsID09PSB1bmRlZmluZWQgJiYgY2hpbGRyZW5NYXAuc2l6ZSA9PT0gMSkge1xuICAgIHJldHVybiByZWN1cnNlKGNoLnZhbHVlKVxuICB9XG5cbiAgd2hpbGUgKCFjaC5kb25lKSB7XG4gICAgY29uc3QgY2hpbGRNYXAgPSByZWN1cnNlKGNoLnZhbHVlKVxuXG4gICAgaWYgKGNoaWxkTWFwKSB7XG4gICAgICBpZiAoIW1hcCkge1xuICAgICAgICBtYXAgPSBuZXcgTWFwKClcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIGNoaWxkIG1hcCBrZXlzL3ZhbHVlcyB0byBvd24gbWFwXG4gICAgICBjb25zdCBtYXBJdGVyID0gY2hpbGRNYXAua2V5cygpXG5cbiAgICAgIGxldCBtYXBDdXIgPSBtYXBJdGVyLm5leHQoKVxuICAgICAgd2hpbGUgKCFtYXBDdXIuZG9uZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBtYXBDdXIudmFsdWVcbiAgICAgICAgY29uc3QgdmFsID0gY2hpbGRNYXAuZ2V0KGtleSkhXG4gICAgICAgIG1hcC5zZXQoa2V5LCB2YWwpXG4gICAgICAgIG1hcEN1ciA9IG1hcEl0ZXIubmV4dCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY2ggPSBjaGlsZHJlbkl0ZXIubmV4dCgpXG4gIH1cblxuICAvLyBhZGQgaXQgYXQgdGhlIGVuZCBzbyBwYXJlbnQgcmVzb2x1dGlvbnMgaGF2ZSBoaWdoZXJcbiAgLy8gcHJpb3JpdHkgdGhhbiBjaGlsZCBvbmVzXG4gIGlmIChyb290VmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIW1hcCkge1xuICAgICAgbWFwID0gbmV3IE1hcCgpXG4gICAgfVxuICAgIG1hcC5zZXQocm9vdFZhbCwgdGFyZ2V0KVxuICB9XG5cbiAgcmV0dXJuIG1hcFxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgSG9va0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vaG9va0FjdGlvbnNcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uLCB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgQW55TW9kZWwsIEJhc2VNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgd2Fsa1RyZWUsIFdhbGtUcmVlTW9kZSB9IGZyb20gXCIuLi9wYXJlbnQvd2Fsa1RyZWVcIlxuXG5jb25zdCBvbkF0dGFjaGVkRGlzcG9zZXJzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCAoKSA9PiB2b2lkPigpXG5jb25zdCBhdHRhY2hlZFRvUm9vdFN0b3JlID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBhdHRhY2hUb1Jvb3RTdG9yZSA9IGFjdGlvbihcbiAgXCJhdHRhY2hUb1Jvb3RTdG9yZVwiLFxuICAocm9vdFN0b3JlOiBvYmplY3QsIGNoaWxkOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgICAvLyB3ZSB1c2UgYW4gYXJyYXkgdG8gZW5zdXJlIHRoZXkgd2lsbCBnZXQgY2FsbGVkIGV2ZW4gaWYgdGhlIGFjdHVhbCBob29rIG1vZGlmaWVzIHRoZSB0cmVlXG4gICAgY29uc3QgY2hpbGRyZW5Ub0NhbGw6IEFueU1vZGVsW10gPSBbXVxuXG4gICAgd2Fsa1RyZWUoXG4gICAgICBjaGlsZCxcbiAgICAgIChjaCkgPT4ge1xuICAgICAgICAvLyB3ZSB1c2UgdGhpcyB0byBhdm9pZCBjYWxsaW5nIG9uQXR0YWNoZWRUb1Jvb3RTdG9yZVxuICAgICAgICAvLyB0d2ljZVxuICAgICAgICBpZiAoYXR0YWNoZWRUb1Jvb3RTdG9yZS5oYXMoY2gpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNoZWRUb1Jvb3RTdG9yZS5hZGQoY2gpXG5cbiAgICAgICAgaWYgKGNoIGluc3RhbmNlb2YgQmFzZU1vZGVsICYmIChjaCBhcyBhbnkpLm9uQXR0YWNoZWRUb1Jvb3RTdG9yZSkge1xuICAgICAgICAgIHdyYXBNb2RlbE1ldGhvZEluQWN0aW9uSWZOZWVkZWQoXG4gICAgICAgICAgICBjaCBhcyBhbnksXG4gICAgICAgICAgICBcIm9uQXR0YWNoZWRUb1Jvb3RTdG9yZVwiLFxuICAgICAgICAgICAgSG9va0FjdGlvbi5PbkF0dGFjaGVkVG9Sb290U3RvcmVcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjaGlsZHJlblRvQ2FsbC5wdXNoKGNoIGFzIEFueU1vZGVsKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgV2Fsa1RyZWVNb2RlLlBhcmVudEZpcnN0XG4gICAgKVxuXG4gICAgY29uc3QgY2hpbGRyZW5Ub0NhbGxMZW4gPSBjaGlsZHJlblRvQ2FsbC5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuVG9DYWxsTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoID0gY2hpbGRyZW5Ub0NhbGxbaV1cblxuICAgICAgY29uc3QgZGlzcG9zZXIgPSAoY2ggYXMgYW55KS5vbkF0dGFjaGVkVG9Sb290U3RvcmUhKHJvb3RTdG9yZSlcbiAgICAgIGlmIChkaXNwb3Nlcikge1xuICAgICAgICBvbkF0dGFjaGVkRGlzcG9zZXJzLnNldChjaCwgZGlzcG9zZXIpXG4gICAgICB9XG4gICAgfVxuICB9XG4pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkZXRhY2hGcm9tUm9vdFN0b3JlID0gYWN0aW9uKFwiZGV0YWNoRnJvbVJvb3RTdG9yZVwiLCAoY2hpbGQ6IG9iamVjdCk6IHZvaWQgPT4ge1xuICAvLyB3ZSB1c2UgYW4gYXJyYXkgdG8gZW5zdXJlIHRoZXkgd2lsbCBnZXQgY2FsbGVkIGV2ZW4gaWYgdGhlIGFjdHVhbCBob29rIG1vZGlmaWVzIHRoZSB0cmVlXG4gIGNvbnN0IGRpc3Bvc2Vyc1RvQ2FsbDogKCgpID0+IHZvaWQpW10gPSBbXVxuXG4gIHdhbGtUcmVlKFxuICAgIGNoaWxkLFxuICAgIChjaCkgPT4ge1xuICAgICAgaWYgKCFhdHRhY2hlZFRvUm9vdFN0b3JlLmRlbGV0ZShjaCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpc3Bvc2VyID0gb25BdHRhY2hlZERpc3Bvc2Vycy5nZXQoY2gpXG4gICAgICBpZiAoZGlzcG9zZXIpIHtcbiAgICAgICAgLy8gd3JhcCBkaXNwb3NlciBpbiBhY3Rpb25cbiAgICAgICAgY29uc3QgZGlzcG9zZXJBY3Rpb24gPSB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgIG5hbWVPck5hbWVGbjogSG9va0FjdGlvbi5PbkF0dGFjaGVkVG9Sb290U3RvcmVEaXNwb3NlcixcbiAgICAgICAgICBmbjogZGlzcG9zZXIsXG4gICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgICAgICAgfSkuYmluZChjaClcbiAgICAgICAgb25BdHRhY2hlZERpc3Bvc2Vycy5kZWxldGUoY2gpXG5cbiAgICAgICAgZGlzcG9zZXJzVG9DYWxsLnB1c2goZGlzcG9zZXJBY3Rpb24pXG4gICAgICB9XG4gICAgfSxcbiAgICBXYWxrVHJlZU1vZGUuQ2hpbGRyZW5GaXJzdFxuICApXG5cbiAgY29uc3QgZGlzcG9zZXJzVG9DYWxsTGVuID0gZGlzcG9zZXJzVG9DYWxsLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bvc2Vyc1RvQ2FsbExlbjsgaSsrKSB7XG4gICAgZGlzcG9zZXJzVG9DYWxsW2ldKClcbiAgfVxufSlcbiIsImltcG9ydCB7IGFjdGlvbiwgY3JlYXRlQXRvbSwgSUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdCwgaXNSb290IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHsgYXR0YWNoVG9Sb290U3RvcmUsIGRldGFjaEZyb21Sb290U3RvcmUgfSBmcm9tIFwiLi9hdHRhY2hEZXRhY2hcIlxuXG5jb25zdCByb290U3RvcmVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpXG5jb25zdCByb290U3RvcmVBdG9tcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgSUF0b20+KClcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBtb2RlbCAvIHRyZWUgbm9kZSBvYmplY3QgYXMgYSByb290IHN0b3JlIHRyZWUuXG4gKiBNYXJraW5nIGEgbW9kZWwgb2JqZWN0IGFzIGEgcm9vdCBzdG9yZSB0cmVlIHNlcnZlcyBzZXZlcmFsIHB1cnBvc2VzOlxuICogLSBJdCBhbGxvd3MgdGhlIGBvbkF0dGFjaGVkVG9Sb290U3RvcmVgIGhvb2sgKHBsdXMgZGlzcG9zZXIpIHRvIGJlIGludm9rZWQgb24gbW9kZWxzIG9uY2UgdGhleSBiZWNvbWUgcGFydCBvZiB0aGlzIHRyZWUuXG4gKiAgIFRoZXNlIGhvb2tzIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIGF0dGFjaCBlZmZlY3RzIGFuZCBzZXJ2ZSBhcyBzb21lIHNvcnQgb2YgaW5pdGlhbGl6YXRpb24uXG4gKiAtIEl0IGFsbG93cyBhdXRvIGRldGFjaGFibGUgcmVmZXJlbmNlcyB0byB3b3JrIHByb3Blcmx5LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlIE5vZGUgb2JqZWN0IHRvIHJlZ2lzdGVyIGFzIHJvb3Qgc3RvcmUuXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBtb2RlbCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkLlxuICovXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJSb290U3RvcmU6IDxUIGV4dGVuZHMgb2JqZWN0Pihub2RlOiBUKSA9PiBUID0gYWN0aW9uKFxuICBcInJlZ2lzdGVyUm9vdFN0b3JlXCIsXG4gIChub2RlKSA9PiB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIGlmIChyb290U3RvcmVzLmhhcyhub2RlKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIm9iamVjdCBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgcm9vdCBzdG9yZVwiKVxuICAgIH1cblxuICAgIGlmICghaXNSb290KG5vZGUpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYSByb290IHN0b3JlIG11c3Qgbm90IGhhdmUgYSBwYXJlbnRcIilcbiAgICB9XG5cbiAgICByb290U3RvcmVzLmFkZChub2RlKVxuXG4gICAgYXR0YWNoVG9Sb290U3RvcmUobm9kZSwgbm9kZSlcblxuICAgIGdldE9yQ3JlYXRlUm9vdFN0b3JlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbiAgICByZXR1cm4gbm9kZVxuICB9XG4pXG5cbi8qKlxuICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0IHRvIG1hcmsgaXQgYXMgbm8gbG9uZ2VyIGEgcm9vdCBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIG9iamVjdCB0byB1bnJlZ2lzdGVyIGFzIHJvb3Qgc3RvcmUuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyUm9vdFN0b3JlOiAobm9kZTogb2JqZWN0KSA9PiB2b2lkID0gYWN0aW9uKFwidW5yZWdpc3RlclJvb3RTdG9yZVwiLCAobm9kZSkgPT4ge1xuICBpZiAoIWlzUm9vdFN0b3JlKG5vZGUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm5vdCBhIHJvb3Qgc3RvcmVcIilcbiAgfVxuXG4gIHJvb3RTdG9yZXMuZGVsZXRlKG5vZGUpXG5cbiAgZGV0YWNoRnJvbVJvb3RTdG9yZShub2RlKVxuXG4gIGdldE9yQ3JlYXRlUm9vdFN0b3JlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbn0pXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gb2JqZWN0IGlzIG1hcmtlZCBhcyBhIHJvb3Qgc3RvcmUuXG4gKlxuICogQHBhcmFtIG5vZGUgT2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdFN0b3JlKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIHJldHVybiBmYXN0SXNSb290U3RvcmUobm9kZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RJc1Jvb3RTdG9yZShub2RlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgZ2V0T3JDcmVhdGVSb290U3RvcmVBdG9tKG5vZGUpLnJlcG9ydE9ic2VydmVkKClcbiAgcmV0dXJuIHJvb3RTdG9yZXMuaGFzKG5vZGUpXG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBzdG9yZSBvZiBhIGdpdmVuIHRyZWUgY2hpbGQsIG9yIHVuZGVmaW5lZCBpZiBub25lLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSb290IHN0b3JlIHR5cGUuXG4gKiBAcGFyYW0gbm9kZSBUYXJnZXQgdG8gZmluZCB0aGUgcm9vdCBzdG9yZSBmb3IuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vdFN0b3JlPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IG9iamVjdCk6IFQgfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIHJldHVybiBmYXN0R2V0Um9vdFN0b3JlKG5vZGUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0Um9vdFN0b3JlPFQgZXh0ZW5kcyBvYmplY3Q+KG5vZGU6IG9iamVjdCk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gZmFzdEdldFJvb3Qobm9kZSlcbiAgcmV0dXJuIGZhc3RJc1Jvb3RTdG9yZShyb290KSA/IHJvb3QgOiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gZ2V0T3JDcmVhdGVSb290U3RvcmVBdG9tKG5vZGU6IG9iamVjdCk6IElBdG9tIHtcbiAgcmV0dXJuIGdldE9yQ3JlYXRlKHJvb3RTdG9yZUF0b21zLCBub2RlLCAoKSA9PiBjcmVhdGVBdG9tKFwicm9vdFN0b3JlXCIpKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBpc0FjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGZhc3RHZXRQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB0eXBlIHsgUGF0aEVsZW1lbnQgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uLCBkZWxldGVGcm9tQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuL1BhdGNoXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsUGF0Y2hSZWNvcmRlciB7XG4gIHBhdGNoZXMhOiBQYXRjaFtdXG4gIGludlBhdGNoZXMhOiBQYXRjaFtdXG5cbiAgcmVjb3JkKHBhdGNoZXM6IFBhdGNoW10sIGludlBhdGNoZXM6IFBhdGNoW10pIHtcbiAgICB0aGlzLnBhdGNoZXMgPSBwYXRjaGVzXG4gICAgdGhpcy5pbnZQYXRjaGVzID0gaW52UGF0Y2hlc1xuICB9XG5cbiAgZW1pdChvYmo6IG9iamVjdCkge1xuICAgIGVtaXRQYXRjaChvYmosIHRoaXMucGF0Y2hlcywgdGhpcy5pbnZQYXRjaGVzLCB0cnVlKVxuICB9XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gYSBwYXRjaCBpcyBlbWl0dGVkLlxuICovXG5leHBvcnQgdHlwZSBPblBhdGNoZXNMaXN0ZW5lciA9IChwYXRjaGVzOiBQYXRjaFtdLCBpbnZlcnNlUGF0Y2hlczogUGF0Y2hbXSkgPT4gdm9pZFxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuIGEgZ2xvYmFsIHBhdGNoIGlzIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE9uR2xvYmFsUGF0Y2hlc0xpc3RlbmVyID0gKFxuICB0YXJnZXQ6IG9iamVjdCxcbiAgcGF0Y2hlczogUGF0Y2hbXSxcbiAgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW11cbikgPT4gdm9pZFxuXG4vKipcbiAqIERpc3Bvc2VyIGZ1bmN0aW9uIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHBhdGNoZXMuXG4gKi9cbmV4cG9ydCB0eXBlIE9uUGF0Y2hlc0Rpc3Bvc2VyID0gKCkgPT4gdm9pZFxuXG5jb25zdCBwYXRjaExpc3RlbmVycyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgT25QYXRjaGVzTGlzdGVuZXJbXT4oKVxuY29uc3QgZ2xvYmFsUGF0Y2hMaXN0ZW5lcnM6IE9uR2xvYmFsUGF0Y2hlc0xpc3RlbmVyW10gPSBbXVxuXG4vKipcbiAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBwYXRjaCBpcyBnZW5lcmF0ZWQgZm9yIHRoZSB0cmVlIG9mIHRoZSBnaXZlbiB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3Qgb2JqZWN0IG9mIHRoZSBwYXRjaCBsaXN0ZW5lci5cbiAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBldmVyeXRpbWUgYSBwYXRjaCBpcyBnZW5lcmF0ZWQgZm9yIHRoZSBvYmplY3Qgb3IgaXRzIGNoaWxkcmVuLlxuICogQHJldHVybnMgQSBkaXNwb3NlciB0byBzdG9wIGxpc3RlbmluZyB0byBwYXRjaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25QYXRjaGVzKHN1YnRyZWVSb290OiBvYmplY3QsIGxpc3RlbmVyOiBPblBhdGNoZXNMaXN0ZW5lcik6IE9uUGF0Y2hlc0Rpc3Bvc2VyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuICBhc3NlcnRJc0Z1bmN0aW9uKGxpc3RlbmVyLCBcImxpc3RlbmVyXCIpXG5cbiAgaWYgKCFpc0FjdGlvbihsaXN0ZW5lcikpIHtcbiAgICBsaXN0ZW5lciA9IGFjdGlvbihsaXN0ZW5lci5uYW1lIHx8IFwib25QYXRjaGVzTGlzdGVuZXJcIiwgbGlzdGVuZXIpXG4gIH1cblxuICBsZXQgbGlzdGVuZXJzRm9yT2JqZWN0ID0gcGF0Y2hMaXN0ZW5lcnMuZ2V0KHN1YnRyZWVSb290KVxuICBpZiAoIWxpc3RlbmVyc0Zvck9iamVjdCkge1xuICAgIGxpc3RlbmVyc0Zvck9iamVjdCA9IFtdXG4gICAgcGF0Y2hMaXN0ZW5lcnMuc2V0KHN1YnRyZWVSb290LCBsaXN0ZW5lcnNGb3JPYmplY3QpXG4gIH1cblxuICBsaXN0ZW5lcnNGb3JPYmplY3QucHVzaChsaXN0ZW5lcilcbiAgcmV0dXJuICgpID0+IHtcbiAgICBkZWxldGVGcm9tQXJyYXkobGlzdGVuZXJzRm9yT2JqZWN0ISwgbGlzdGVuZXIpXG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgcGF0Y2ggaXMgZ2VuZXJhdGVkIGFueXdoZXJlLlxuICogVXN1YWxseSBwcmVmZXIgdXNpbmcgYG9uUGF0Y2hlc2AuXG4gKlxuICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGV2ZXJ5dGltZSBhIHBhdGNoIGlzIGdlbmVyYXRlZCBhbnl3aGVyZS5cbiAqIEByZXR1cm5zIEEgZGlzcG9zZXIgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gcGF0Y2hlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uR2xvYmFsUGF0Y2hlcyhsaXN0ZW5lcjogT25HbG9iYWxQYXRjaGVzTGlzdGVuZXIpOiBPblBhdGNoZXNEaXNwb3NlciB7XG4gIGFzc2VydElzRnVuY3Rpb24obGlzdGVuZXIsIFwibGlzdGVuZXJcIilcblxuICBpZiAoIWlzQWN0aW9uKGxpc3RlbmVyKSkge1xuICAgIGxpc3RlbmVyID0gYWN0aW9uKGxpc3RlbmVyLm5hbWUgfHwgXCJvbkdsb2JhbFBhdGNoZXNMaXN0ZW5lclwiLCBsaXN0ZW5lcilcbiAgfVxuXG4gIGdsb2JhbFBhdGNoTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZGVsZXRlRnJvbUFycmF5KGdsb2JhbFBhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcilcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UGF0Y2goXG4gIG9iajogb2JqZWN0LFxuICBwYXRjaGVzOiBQYXRjaFtdLFxuICBpbnZlcnNlUGF0Y2hlczogUGF0Y2hbXSxcbiAgZW1pdEdsb2JhbGx5OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKHBhdGNoZXMubGVuZ3RoIDw9IDAgJiYgaW52ZXJzZVBhdGNoZXMubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGZpcnN0IGVtaXQgZ2xvYmFsIGxpc3RlbmVyc1xuICBpZiAoZW1pdEdsb2JhbGx5KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbG9iYWxQYXRjaExpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBnbG9iYWxQYXRjaExpc3RlbmVyc1tpXVxuICAgICAgbGlzdGVuZXIob2JqLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcylcbiAgICB9XG4gIH1cblxuICAvLyB0aGVuIHBlciBzdWJ0cmVlIGxpc3RlbmVyc1xuICBjb25zdCBsaXN0ZW5lcnNGb3JPYmplY3QgPSBwYXRjaExpc3RlbmVycy5nZXQob2JqKVxuICBpZiAobGlzdGVuZXJzRm9yT2JqZWN0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnNGb3JPYmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzRm9yT2JqZWN0W2ldXG4gICAgICBsaXN0ZW5lcihwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcylcbiAgICB9XG4gIH1cblxuICAvLyBhbmQgYWxzbyBlbWl0IHN1YnRyZWUgbGlzdGVuZXJzIGFsbCB0aGUgd2F5IHRvIHRoZSByb290XG4gIGNvbnN0IHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aChvYmopXG4gIGlmIChwYXJlbnRQYXRoKSB7XG4gICAgLy8gdHdlYWsgcGF0Y2hlcyBzbyB0aGV5IGluY2x1ZGUgdGhlIGNoaWxkIHBhdGhcbiAgICBjb25zdCBjaGlsZFBhdGggPSBwYXJlbnRQYXRoLnBhdGhcbiAgICBjb25zdCBuZXdQYXRjaGVzID0gcGF0Y2hlcy5tYXAoKHApID0+IGFkZFBhdGhUb1BhdGNoKHAsIGNoaWxkUGF0aCkpXG4gICAgY29uc3QgbmV3SW52ZXJzZVBhdGNoZXMgPSBpbnZlcnNlUGF0Y2hlcy5tYXAoKHApID0+IGFkZFBhdGhUb1BhdGNoKHAsIGNoaWxkUGF0aCkpXG5cbiAgICAvLyBmYWxzZSB0byBhdm9pZCBlbWl0dGluZyBnbG9iYWwgcGF0Y2hlcyBhZ2FpbiBmb3IgdGhlIHNhbWUgY2hhbmdlXG4gICAgZW1pdFBhdGNoKHBhcmVudFBhdGgucGFyZW50LCBuZXdQYXRjaGVzLCBuZXdJbnZlcnNlUGF0Y2hlcywgZmFsc2UpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkUGF0aFRvUGF0Y2gocGF0Y2g6IFBhdGNoLCBwYXRoOiBQYXRoRWxlbWVudCk6IFBhdGNoIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wYXRjaCxcbiAgICBwYXRoOiBbcGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxNZXRhZGF0YVN5bWJvbCB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbFN5bWJvbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3NjaGVtYXNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWwsIGlzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQXNzb2NpYXRlZCBkYXRhIG1vZGVsIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFNb2RlbE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEFzc29jaWF0ZWQgZGF0YSB0eXBlIGZvciBydW50aW1lIGNoZWNraW5nIChpZiBhbnkpLlxuICAgKi9cbiAgZGF0YVR5cGU/OiBBbnlUeXBlXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBmb3IgYSBkYXRhIG1vZGVsIGluc3RhbmNlIG9yIGNsYXNzLlxuICpcbiAqIEBwYXJhbSBtb2RlbENsYXNzT3JJbnN0YW5jZSBEYXRhIG1vZGVsIGNsYXNzIG9yIGluc3RhbmNlLlxuICogQHJldHVybnMgVGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhTW9kZWxNZXRhZGF0YShcbiAgbW9kZWxDbGFzc09ySW5zdGFuY2U6IEFueURhdGFNb2RlbCB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPlxuKTogRGF0YU1vZGVsTWV0YWRhdGEge1xuICBpZiAoaXNEYXRhTW9kZWwobW9kZWxDbGFzc09ySW5zdGFuY2UpKSB7XG4gICAgcmV0dXJuIChtb2RlbENsYXNzT3JJbnN0YW5jZSBhcyBhbnkpLmNvbnN0cnVjdG9yW21vZGVsTWV0YWRhdGFTeW1ib2xdXG4gIH0gZWxzZSBpZiAoaXNEYXRhTW9kZWxDbGFzcyhtb2RlbENsYXNzT3JJbnN0YW5jZSkpIHtcbiAgICByZXR1cm4gKG1vZGVsQ2xhc3NPckluc3RhbmNlIGFzIGFueSlbbW9kZWxNZXRhZGF0YVN5bWJvbF1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBtb2RlbENsYXNzT3JJbnN0YW5jZSBtdXN0IGJlIGEgbW9kZWwgY2xhc3Mgb3IgaW5zdGFuY2VgKVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgZ2V0RGF0YU1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vZGF0YU1vZGVsL2dldERhdGFNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGlzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxDbGFzcyxcbiAgTW9kZWxEYXRhLFxuICBNb2RlbFVudHJhbnNmb3JtZWREYXRhLFxufSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9tb2RlbFByb3BzSW5mb1wiXG5pbXBvcnQgeyBub0RlZmF1bHRWYWx1ZSB9IGZyb20gXCIuLi8uLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGZhaWx1cmUsIGxhenkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxuaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgSWRlbnRpdHlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHtcbiAgbGF0ZVR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcbiAgVHlwZUluZm8sXG4gIFR5cGVJbmZvR2VuLFxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxuXG5jb25zdCBjYWNoZWREYXRhTW9kZWxUeXBlQ2hlY2tlciA9IG5ldyBXZWFrTWFwPE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiwgVHlwZUNoZWNrZXI+KClcblxudHlwZSBfQ2xhc3M8VD4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG50eXBlIF9DbGFzc09yT2JqZWN0PE0sIEs+ID0gSyBleHRlbmRzIE0gPyBvYmplY3QgOiBfQ2xhc3M8Sz4gfCAoKCkgPT4gX0NsYXNzPEs+KVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBkYXRhIG1vZGVsIGRhdGEuXG4gKiBUaGUgdHlwZSByZWZlcmVuY2VkIGluIHRoZSBtb2RlbCBkZWNvcmF0b3Igd2lsbCBiZSB1c2VkIGZvciB0eXBlIGNoZWNraW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3Qgc29tZURhdGFNb2RlbERhdGFUeXBlID0gdHlwZXMuZGF0YU1vZGVsRGF0YShTb21lTW9kZWwpXG4gKiAvLyBvciBmb3IgcmVjdXJzaXZlIG1vZGVsc1xuICogY29uc3Qgc29tZURhdGFNb2RlbERhdGFUeXBlID0gdHlwZXMuZGF0YU1vZGVsRGF0YTxTb21lTW9kZWw+KCgpID0+IFNvbWVNb2RlbClcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gTSBEYXRhIG1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gbW9kZWxDbGFzcyBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0RhdGFNb2RlbERhdGE8TSA9IG5ldmVyLCBLID0gTT4oXG4gIG1vZGVsQ2xhc3M6IF9DbGFzc09yT2JqZWN0PE0sIEs+XG4pOiBJZGVudGl0eVR5cGU8XG4gIHwgTW9kZWxVbnRyYW5zZm9ybWVkRGF0YTxcbiAgICAgIEsgZXh0ZW5kcyBNID8gKE0gZXh0ZW5kcyBBbnlEYXRhTW9kZWwgPyBNIDogbmV2ZXIpIDogSyBleHRlbmRzIEFueURhdGFNb2RlbCA/IEsgOiBuZXZlclxuICAgID5cbiAgfCBNb2RlbERhdGE8XG4gICAgICBLIGV4dGVuZHMgTSA/IChNIGV4dGVuZHMgQW55RGF0YU1vZGVsID8gTSA6IG5ldmVyKSA6IEsgZXh0ZW5kcyBBbnlEYXRhTW9kZWwgPyBLIDogbmV2ZXJcbiAgICA+XG4+IHtcbiAgLy8gaWYgd2UgdHlwZSBpdCBhbnkgc3Ryb25nZXIgdGhlbiByZWN1cnNpdmUgZGVmcyBhbmQgc28gb24gc3RvcCB3b3JraW5nXG5cbiAgaWYgKCFpc0RhdGFNb2RlbENsYXNzKG1vZGVsQ2xhc3MpICYmIHR5cGVvZiBtb2RlbENsYXNzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyByZXNvbHZlIGxhdGVyXG4gICAgY29uc3QgbW9kZWxDbGFzc0ZuID0gbW9kZWxDbGFzcyBhcyAoKSA9PiBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbiAgICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IERhdGFNb2RlbERhdGFUeXBlSW5mbyh0LCBtb2RlbENsYXNzRm4oKSlcbiAgICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHR5cGVzRGF0YU1vZGVsRGF0YShtb2RlbENsYXNzRm4oKSkgYXMgYW55LCB0eXBlSW5mb0dlbikgYXMgYW55XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbW9kZWxDbGF6ejogTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+ID0gbW9kZWxDbGFzcyBhcyBhbnlcblxuICAgIGNvbnN0IGNhY2hlZFR5cGVDaGVja2VyID0gY2FjaGVkRGF0YU1vZGVsVHlwZUNoZWNrZXIuZ2V0KG1vZGVsQ2xhenopXG4gICAgaWYgKGNhY2hlZFR5cGVDaGVja2VyKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVHlwZUNoZWNrZXIgYXMgYW55XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBEYXRhTW9kZWxEYXRhVHlwZUluZm8odCwgbW9kZWxDbGF6eilcblxuICAgIGNvbnN0IHRjID0gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KG1vZGVsQ2xhenopIVxuICAgICAgY29uc3QgdHlwZU5hbWUgPSBgRGF0YU1vZGVsRGF0YSgke21vZGVsSW5mby5uYW1lfSlgXG5cbiAgICAgIGNvbnN0IGRhdGFUeXBlQ2hlY2tlciA9IGdldERhdGFNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhenopLmRhdGFUeXBlXG4gICAgICBpZiAoIWRhdGFUeXBlQ2hlY2tlcikge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGB0eXBlIGNoZWNraW5nIGNhbm5vdCBiZSBwZXJmb3JtZWQgb3ZlciBkYXRhIG1vZGVsIGRhdGEgb2YgdHlwZSAnJHttb2RlbEluZm8ubmFtZX0nIHNpbmNlIHRoYXQgbW9kZWwgdHlwZSBoYXMgbm8gZGF0YSB0eXBlIGRlY2xhcmVkLCBjb25zaWRlciBhZGRpbmcgYSBkYXRhIHR5cGUgb3IgdXNpbmcgdHlwZXMudW5jaGVja2VkKCkgaW5zdGVhZGBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvbHZlZERhdGFUeXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihkYXRhVHlwZUNoZWNrZXIpXG5cbiAgICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LFxuXG4gICAgICAgICh2YWx1ZSwgcGF0aCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5jaGVjayh2YWx1ZSwgcGF0aClcbiAgICAgICAgfSxcblxuICAgICAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICAgICAgdHlwZUluZm9HZW4sXG5cbiAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLnNuYXBzaG90VHlwZSh2YWx1ZSkgPyB0aGlzVGMgOiBudWxsXG4gICAgICAgIH0sXG5cbiAgICAgICAgKHNuOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgKHNuOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZERhdGFUeXBlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgICAgICB9XG4gICAgICApXG5cbiAgICAgIHJldHVybiB0aGlzVGNcbiAgICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XG5cbiAgICBjYWNoZWREYXRhTW9kZWxUeXBlQ2hlY2tlci5zZXQobW9kZWxDbGF6eiwgdGMpXG5cbiAgICByZXR1cm4gdGMgYXMgYW55XG4gIH1cbn1cblxuLyoqXG4gKiBgdHlwZXMuZGF0YU1vZGVsRGF0YWAgdHlwZSBpbmZvIGZvciBhIG1vZGVsIHByb3BzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFNb2RlbERhdGFUeXBlSW5mb1Byb3BzIHtcbiAgcmVhZG9ubHkgW3Byb3BOYW1lOiBzdHJpbmddOiBSZWFkb25seTx7XG4gICAgdHlwZTogQW55U3RhbmRhcmRUeXBlIHwgdW5kZWZpbmVkXG4gICAgdHlwZUluZm86IFR5cGVJbmZvIHwgdW5kZWZpbmVkXG4gICAgaGFzRGVmYXVsdDogYm9vbGVhblxuICAgIGRlZmF1bHQ6IGFueVxuICB9PlxufVxuXG4vKipcbiAqIGB0eXBlcy5kYXRhTW9kZWxEYXRhYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhTW9kZWxEYXRhVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIHByaXZhdGUgX3Byb3BzID0gbGF6eSgoKSA9PiB7XG4gICAgY29uc3Qgb2JqU2NoZW1hID0gZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKHRoaXMubW9kZWxDbGFzcylcblxuICAgIGNvbnN0IHByb3BUeXBlczogTy5Xcml0YWJsZTxEYXRhTW9kZWxEYXRhVHlwZUluZm9Qcm9wcz4gPSB7fVxuICAgIE9iamVjdC5rZXlzKG9ialNjaGVtYSkuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHByb3BEYXRhID0gb2JqU2NoZW1hW3Byb3BOYW1lXVxuXG4gICAgICBjb25zdCB0eXBlID0gcHJvcERhdGEuX2ludGVybmFsLnR5cGVDaGVja2VyIGFzIGFueSBhcyBBbnlTdGFuZGFyZFR5cGVcblxuICAgICAgbGV0IHR5cGVJbmZvOiBUeXBlSW5mbyB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgdHlwZUluZm8gPSBnZXRUeXBlSW5mbyh0eXBlKVxuICAgICAgfVxuXG4gICAgICBsZXQgaGFzRGVmYXVsdCA9IGZhbHNlXG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnlcbiAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuICE9PSBub0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuXG4gICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWUgIT09IG5vRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWVcbiAgICAgICAgaGFzRGVmYXVsdCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgcHJvcFR5cGVzW3Byb3BOYW1lXSA9IHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdHlwZUluZm8sXG4gICAgICAgIGhhc0RlZmF1bHQsXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBwcm9wVHlwZXNcbiAgfSlcblxuICBnZXQgcHJvcHMoKTogRGF0YU1vZGVsRGF0YVR5cGVJbmZvUHJvcHMge1xuICAgIHJldHVybiB0aGlzLl9wcm9wcygpXG4gIH1cblxuICBnZXQgbW9kZWxUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQodGhpcy5tb2RlbENsYXNzKSFcbiAgICByZXR1cm4gbW9kZWxJbmZvLm5hbWVcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPikge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgdHlwZSB7IE8gfSBmcm9tIFwidHMtdG9vbGJlbHRcIlxuaW1wb3J0IHsgaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFVudHJhbnNmb3JtZWREYXRhIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL25ld01vZGVsXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgbWFrZVByb3BSZWFkb25seSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi9EYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHsgZ2V0RGF0YU1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi9nZXREYXRhTW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBhc3NlcnRJc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaW50ZXJuYWxOZXdEYXRhTW9kZWwgPSBhY3Rpb24oXG4gIFwibmV3TW9kZWxcIixcbiAgPE0gZXh0ZW5kcyBBbnlEYXRhTW9kZWw+KFxuICAgIG9yaWdNb2RlbE9iajogTSxcbiAgICB0d2Vha2VkRGF0YTogTW9kZWxVbnRyYW5zZm9ybWVkRGF0YTxNPixcbiAgICBvcHRpb25zOiBQaWNrPERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucywgXCJtb2RlbENsYXNzXCI+XG4gICk6IE0gPT4ge1xuICAgIGNvbnN0IHsgbW9kZWxDbGFzczogX21vZGVsQ2xhc3MgfSA9IG9wdGlvbnNcbiAgICBjb25zdCBtb2RlbENsYXNzID0gX21vZGVsQ2xhc3MhXG5cbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIGFzc2VydElzRGF0YU1vZGVsQ2xhc3MobW9kZWxDbGFzcywgXCJtb2RlbENsYXNzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxPYmogPSBvcmlnTW9kZWxPYmogYXMgTy5Xcml0YWJsZTxNPlxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGFzcylcbiAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYG5vIG1vZGVsIGluZm8gZm9yIGNsYXNzICR7bW9kZWxDbGFzcy5uYW1lfSBjb3VsZCBiZSBmb3VuZCAtIGRpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQG1vZGVsIGRlY29yYXRvcj9gXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gbGluayBpdCwgYW5kIG1ha2UgaXQgcmVhZG9ubHlcbiAgICBtb2RlbE9iai4kID0gdHdlYWtlZERhdGFcbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIG1ha2VQcm9wUmVhZG9ubHkobW9kZWxPYmosIFwiJFwiLCB0cnVlKVxuICAgIH1cblxuICAgIC8vIHR5cGUgY2hlY2sgaXQgaWYgbmVlZGVkXG4gICAgaWYgKGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCgpICYmIGdldERhdGFNb2RlbE1ldGFkYXRhKG1vZGVsQ2xhc3MpLmRhdGFUeXBlKSB7XG4gICAgICBjb25zdCBlcnIgPSBtb2RlbE9iai50eXBlQ2hlY2soKVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBlcnIudGhyb3cobW9kZWxPYmopXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcnVuIGFueSBleHRyYSBpbml0aWFsaXplcnMgZm9yIHRoZSBjbGFzcyBhcyBuZWVkZWRcbiAgICBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzKG1vZGVsQ2xhc3MsIG1vZGVsT2JqKVxuXG4gICAgcmV0dXJuIG1vZGVsT2JqIGFzIE1cbiAgfVxuKVxuIiwiaW1wb3J0IHsgTW9kZWxDbGFzcywgcHJvcHNUeXBlU3ltYm9sIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHtcbiAgTW9kZWxQcm9wcyxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGEsXG4gIE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWREYXRhLFxuICBub0RlZmF1bHRWYWx1ZSxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgaXNUcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgdG9UcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrXCJcbmltcG9ydCB7IHR5cGVzRGF0YU1vZGVsRGF0YSB9IGZyb20gXCIuLi90eXBlcy9vYmplY3RCYXNlZC90eXBlc0RhdGFNb2RlbERhdGFcIlxuaW1wb3J0IHsgdHlwZUNoZWNrIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVDaGVja1wiXG5pbXBvcnQgdHlwZSB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL3R5cGVzL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4vRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGludGVybmFsTmV3RGF0YU1vZGVsIH0gZnJvbSBcIi4vbmV3RGF0YU1vZGVsXCJcblxuY29uc3QgZGF0YU1vZGVsSW5zdGFuY2VDYWNoZSA9IG5ldyBXZWFrTWFwPE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiwgV2Vha01hcDxhbnksIEFueURhdGFNb2RlbD4+KClcblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBkYXRhIG1vZGVscy4gVXNlIGBEYXRhTW9kZWxgIGluc3RlYWQgd2hlbiBleHRlbmRpbmcuXG4gKlxuICogTmV2ZXIgb3ZlcnJpZGUgdGhlIGNvbnN0cnVjdG9yLCB1c2UgYG9uTGF6eUluaXRgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBEYXRhIFByb3BzIGRhdGEgdHlwZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4ge1xuICAvLyBqdXN0IHRvIG1ha2UgdHlwaW5nIHdvcmsgcHJvcGVybHlcbiAgW3Byb3BzVHlwZVN5bWJvbF0hOiBUUHJvcHNcblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkIHdoZW4gdGhlcmUncyB0aGUgZmlyc3QgY2FsbCB0byBgZm4oTSwgZGF0YSlgLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uTGF6eUluaXQ/KCk6IHZvaWRcblxuICAvKipcbiAgICogRGF0YSBwYXJ0IG9mIHRoZSBtb2RlbCwgd2hpY2ggaXMgb2JzZXJ2YWJsZSBhbmQgd2lsbCBiZSBzZXJpYWxpemVkIGluIHNuYXBzaG90cy5cbiAgICogVXNlIGl0IGlmIG9uZSBvZiB0aGUgZGF0YSBwcm9wZXJ0aWVzIG1hdGNoZXMgb25lIG9mIHRoZSBtb2RlbCBwcm9wZXJ0aWVzL2Z1bmN0aW9ucy5cbiAgICogVGhpcyBhbHNvIGFsbG93cyBhY2Nlc3MgdG8gdGhlIGJhY2tlZCB2YWx1ZXMgb2YgdHJhbnNmb3JtZWQgcHJvcGVydGllcy5cbiAgICovXG4gIHJlYWRvbmx5ICQhOiBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkRGF0YTxUUHJvcHM+XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgdHlwZSBjaGVjayBvdmVyIHRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogRm9yIHRoaXMgdG8gd29yayBhIGRhdGEgdHlwZSBoYXMgdG8gYmUgZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbW9kZWwgcHJvcGVydGllcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBgVHlwZUNoZWNrRXJyb3JgIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBlcnJvci5cbiAgICovXG4gIHR5cGVDaGVjaygpOiBUeXBlQ2hlY2tFcnJvciB8IG51bGwge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlc0RhdGFNb2RlbERhdGE8dGhpcz4odGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpXG4gICAgcmV0dXJuIHR5cGVDaGVjayh0eXBlLCB0aGlzLiQgYXMgYW55KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBkYXRhIG1vZGVsLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YTpcbiAgICAgIHwgTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+XG4gICAgICB8IE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFRQcm9wcz5cbiAgKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImRhdGEgbW9kZWxzIGNhbiBvbmx5IHdvcmsgb3ZlciBkYXRhIG9iamVjdHNcIilcbiAgICB9XG5cbiAgICBjb25zdCB7IG1vZGVsQ2xhc3M6IF9tb2RlbENsYXNzIH06IERhdGFNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyA9IGFyZ3VtZW50c1sxXSBhcyBhbnlcbiAgICBjb25zdCBtb2RlbENsYXNzID0gX21vZGVsQ2xhc3MhXG5cbiAgICB0eXBlIERhdGEgPSBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkRGF0YTxUUHJvcHM+XG4gICAgbGV0IHR3ZWFrZWREYXRhOiBEYXRhXG4gICAgaWYgKGlzVHJlZU5vZGUoZGF0YSkpIHtcbiAgICAgIC8vIGluIHRoZW9yeSBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICB0d2Vha2VkRGF0YSA9IGRhdGEgYXMgYW55IGFzIERhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGFzcylcbiAgICAgIGlmICghbW9kZWxJbmZvKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYG5vIG1vZGVsIGluZm8gZm9yIGNsYXNzICR7bW9kZWxDbGFzcy5uYW1lfSBjb3VsZCBiZSBmb3VuZCAtIGRpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQG1vZGVsIGRlY29yYXRvcj9gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZWxQcm9wcyA9IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhtb2RlbENsYXNzKVxuXG4gICAgICBjb25zdCBpbml0aWFsRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpXG5cbiAgICAgIGNvbnN0IG1vZGVsUHJvcHNLZXlzID0gT2JqZWN0LmtleXMobW9kZWxQcm9wcylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kZWxQcm9wc0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IG1vZGVsUHJvcHNLZXlzW2ldXG4gICAgICAgIGNvbnN0IHByb3BEYXRhID0gbW9kZWxQcm9wc1trXVxuXG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IGluaXRpYWxEYXRhIVtrXVxuICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG5cbiAgICAgICAgLy8gYXBwbHkgdW50cmFuc2Zvcm0gKGlmIGFueSlcbiAgICAgICAgaWYgKHByb3BEYXRhLl9pbnRlcm5hbC50cmFuc2Zvcm0pIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgIG5ld1ZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLnRyYW5zZm9ybS51bnRyYW5zZm9ybShuZXdWYWx1ZSwgdGhpcywgaylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFwcGx5IGRlZmF1bHQgdmFsdWUgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0Rm4oKVxuICAgICAgICAgIH0gZWxzZSBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZSAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC5kZWZhdWx0VmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgIGluaXRpYWxEYXRhW2tdID0gbmV3VmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0d2Vha2VkRGF0YSA9IHRvVHJlZU5vZGUoaW5pdGlhbERhdGEgYXMgRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZXNGb3JNb2RlbENsYXNzID0gZ2V0T3JDcmVhdGUoXG4gICAgICBkYXRhTW9kZWxJbnN0YW5jZUNhY2hlLFxuICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICgpID0+IG5ldyBXZWFrTWFwKClcbiAgICApXG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc0Zvck1vZGVsQ2xhc3MuZ2V0KHR3ZWFrZWREYXRhKVxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuXG4gICAgaW5zdGFuY2VzRm9yTW9kZWxDbGFzcy5zZXQodHdlYWtlZERhdGEsIHRoaXMpXG5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbW9kZWxDbGFzcy5wcm90b3R5cGUpXG5cbiAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBhbnlcblxuICAgIC8vIGRlbGV0ZSB1bm5lY2Vzc2FyeSBwcm9wc1xuICAgIGRlbGV0ZSBzZWxmW3Byb3BzVHlwZVN5bWJvbF1cblxuICAgIGludGVybmFsTmV3RGF0YU1vZGVsKHRoaXMsIHR3ZWFrZWREYXRhIGFzIGFueSwge1xuICAgICAgbW9kZWxDbGFzcyxcbiAgICB9KVxuICB9XG5cbiAgdG9TdHJpbmcob3B0aW9ucz86IHsgd2l0aERhdGE/OiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSB7XG4gICAgICB3aXRoRGF0YTogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpXG5cbiAgICBjb25zdCBmaXJzdFBhcnQgPSBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IyR7bW9kZWxJbmZvIS5uYW1lfWBcblxuICAgIHJldHVybiBmaW5hbE9wdGlvbnMud2l0aERhdGFcbiAgICAgID8gYFske2ZpcnN0UGFydH0gJHtKU09OLnN0cmluZ2lmeShnZXRTbmFwc2hvdCh0aGlzKSl9XWBcbiAgICAgIDogYFske2ZpcnN0UGFydH1dYFxuICB9XG59XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgdHlwZSBCYXNlRGF0YU1vZGVsS2V5cyA9IGtleW9mIEFueURhdGFNb2RlbCB8IFwib25MYXp5SW5pdFwiXG5cbi8vIHRoZXNlIHByb3BzIHdpbGwgbmV2ZXIgYmUgaG9pc3RlZCB0byB0aGlzXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYmFzZURhdGFNb2RlbFByb3BOYW1lcyA9IG5ldyBTZXQ8QmFzZURhdGFNb2RlbEtleXM+KFtcIm9uTGF6eUluaXRcIiwgXCIkXCIsIFwidHlwZUNoZWNrXCJdKVxuXG4vKipcbiAqIEFueSBraW5kIG9mIGRhdGEgbW9kZWwgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW55RGF0YU1vZGVsIGV4dGVuZHMgQmFzZURhdGFNb2RlbDxhbnk+IHt9XG5cbi8qKlxuICogQSBkYXRhIG1vZGVsIGNsYXNzIGRlY2xhcmF0aW9uLCBtYWRlIG9mIGEgYmFzZSBtb2RlbCBhbmQgdGhlIG1vZGVsIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YU1vZGVsQ2xhc3NEZWNsYXJhdGlvbjxCYXNlTW9kZWxDbGFzcywgTW9kZWxJbnRlcmZhY2U+ID0gQmFzZU1vZGVsQ2xhc3MgJiB7XG4gICguLi5hcmdzOiBhbnlbXSk6IE1vZGVsSW50ZXJmYWNlXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB7IEJhc2VEYXRhTW9kZWwgfSBmcm9tIFwiLi9CYXNlRGF0YU1vZGVsXCJcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgZGF0YSBtb2RlbCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gbW9kZWxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFNb2RlbChtb2RlbDogdW5rbm93bik6IG1vZGVsIGlzIEFueURhdGFNb2RlbCB7XG4gIHJldHVybiBtb2RlbCBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWxcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBhY3R1YWxseSBhIGRhdGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcGFyYW0gYXJnTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNEYXRhTW9kZWwoXG4gIG1vZGVsOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcsXG4gIGN1c3RvbUVyck1zZyA9IFwibXVzdCBiZSBhIGRhdGEgbW9kZWwgaW5zdGFuY2VcIlxuKTogYXNzZXJ0cyBtb2RlbCBpcyBBbnlEYXRhTW9kZWwge1xuICBpZiAoIWlzRGF0YU1vZGVsKG1vZGVsKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gJHtjdXN0b21FcnJNc2d9YClcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhTW9kZWxDbGFzcyhtb2RlbENsYXNzOiB1bmtub3duKTogbW9kZWxDbGFzcyBpcyBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4ge1xuICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKG1vZGVsQ2xhc3MgIT09IEJhc2VEYXRhTW9kZWwgJiYgIShtb2RlbENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNEYXRhTW9kZWxDbGFzcyhcbiAgbW9kZWxDbGFzczogdW5rbm93bixcbiAgYXJnTmFtZTogc3RyaW5nXG4pOiBhc3NlcnRzIG1vZGVsQ2xhc3MgaXMgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+IHtcbiAgaWYgKHR5cGVvZiBtb2RlbENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgYmUgYSBjbGFzc2ApXG4gIH1cblxuICBpZiAobW9kZWxDbGFzcyAhPT0gQmFzZURhdGFNb2RlbCAmJiAhKG1vZGVsQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgQmFzZURhdGFNb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9IG11c3QgZXh0ZW5kIERhdGFNb2RlbGApXG4gIH1cbn1cbiIsImltcG9ydCB7IGdldEdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZGcm96ZW4gfSBmcm9tIFwiLi4vc25hcHNob3RcIlxuaW1wb3J0IHsgdHdlYWsgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyBmYWlsdXJlLCBpbkRldk1vZGUsIGlzUGxhaW5PYmplY3QsIGlzUHJpbWl0aXZlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBTaG91bGQgZnJlZXplIGFuZCBwbGFpbiBqc29uIGNoZWNrcyBiZSBkb25lIHdoZW4gY3JlYXRpbmcgdGhlIGZyb3plbiBvYmplY3Q/XG4gKi9cbmV4cG9ydCBlbnVtIEZyb3plbkNoZWNrTW9kZSB7XG4gIC8qKiBPbmx5IHdoZW4gaW4gZGV2IG1vZGUgKi9cbiAgRGV2TW9kZU9ubHkgPSBcImRldk1vZGVPbmx5XCIsXG4gIC8qKiBBbHdheXMgKi9cbiAgT24gPSBcIm9uXCIsXG4gIC8qKiBOZXZlciAqL1xuICBPZmYgPSBcIm9mZlwiLFxufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGNvbnN0IGZyb3plbktleSA9IFwiJGZyb3plblwiXG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGNvbnRhaW5zIGZyb3plbiBkYXRhLlxuICogVXNlIGBmcm96ZW5gIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBEYXRhIHR5cGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGcm96ZW48VD4ge1xuICAvKipcbiAgICogRnJvemVuIGRhdGEsIGRlZXBseSBpbW11dGFibGUuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBUXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRnJvemVuLlxuICAgKiBEbyBub3QgdXNlIGRpcmVjdGx5LCB1c2UgYGZyb3plbmAgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFUb0ZyZWV6ZVxuICAgKiBAcGFyYW0gY2hlY2tNb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhVG9GcmVlemU6IFQsIGNoZWNrTW9kZTogRnJvemVuQ2hlY2tNb2RlID0gRnJvemVuQ2hlY2tNb2RlLkRldk1vZGVPbmx5KSB7XG4gICAgY29uc3QgY2hlY2sgPVxuICAgICAgY2hlY2tNb2RlID09PSBGcm96ZW5DaGVja01vZGUuT24gfHwgKGNoZWNrTW9kZSA9PT0gRnJvemVuQ2hlY2tNb2RlLkRldk1vZGVPbmx5ICYmIGluRGV2TW9kZSgpKVxuICAgIGlmIChjaGVjaykge1xuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUoZGF0YVRvRnJlZXplKVxuICAgIH1cblxuICAgIHRoaXMuZGF0YSA9IGRhdGFUb0ZyZWV6ZVxuXG4gICAgaWYgKGNoZWNrKSB7XG4gICAgICBPYmplY3QuZnJlZXplKHRoaXMuZGF0YSlcbiAgICB9XG5cbiAgICB0d2Vhayh0aGlzLCB1bmRlZmluZWQpXG4gIH1cbn1cblxuLyoqXG4gKiBNYXJrcyBzb21lIGRhdGEgYXMgZnJvemVuLiBGcm96ZW4gZGF0YSBiZWNvbWVzIGltbXV0YWJsZSAoYXQgbGVhc3QgaW4gZGV2IG1vZGUpLCBhbmQgaXMgbm90IGVuaGFuY2VkXG4gKiB3aXRoIGNhcGFiaWxpdGllcyBzdWNoIGFzIGdldHRpbmcgdGhlIHBhcmVudCBvZiB0aGUgb2JqZWN0cyAoZXhjZXB0IGZvciB0aGUgcm9vdCBvYmplY3QpLCBpdCBpcyBub3RcbiAqIG1hZGUgZGVlcGx5IG9ic2VydmFibGUgKHRob3VnaCB0aGUgcm9vdCBvYmplY3QgaXMgb2JzZXJ2YWJsZSBieSByZWZlcmVuY2UpLCBldGMuXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBtZWFucyBpdCB3aWxsIGJlIG11Y2ggZmFzdGVyIHRvIGNyZWF0ZS9hY2Nlc3MuIFVzZSB0aGlzIGZvciBiaWcgZGF0YSBwaWVjZXNcbiAqIHRoYXQgYXJlIHVubGlrZWx5IHRvIGNoYW5nZSB1bmxlc3MgYWxsIG9mIHRoZW0gY2hhbmdlIChmb3IgZXhhbXBsZSBsaXN0cyBvZiBwb2ludHMgZm9yIGEgcG9seWdvbiwgZXRjKS5cbiAqXG4gKiBOb3RlIHRoYXQgZGF0YSBwYXNzZWQgdG8gZnJvemVuIG11c3QgYmUgc2VyaWFsaXphYmxlIHRvIEpTT04sIHRoaXMgaXM6XG4gKiAtIHByaW1pdGl2ZSwgcGxhaW4gb2JqZWN0LCBvciBhcnJheVxuICogLSB3aXRob3V0IGN5Y2xlc1xuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcGFyYW0gY2hlY2tNb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm96ZW48VD4oXG4gIGRhdGE6IFQsXG4gIGNoZWNrTW9kZTogRnJvemVuQ2hlY2tNb2RlID0gRnJvemVuQ2hlY2tNb2RlLkRldk1vZGVPbmx5XG4pOiBGcm96ZW48VD4ge1xuICByZXR1cm4gbmV3IEZyb3plbjxUPihkYXRhLCBjaGVja01vZGUpXG59XG5cbmZ1bmN0aW9uIGNoZWNrRGF0YUlzU2VyaWFsaXphYmxlQW5kRnJlZXplKGRhdGE6IGFueSkge1xuICAvLyBUT0RPOiBkZXRlY3QgY3ljbGVzIGFuZCB0aHJvdyBpZiBwcmVzZW50P1xuXG4gIC8vIHByaW1pdGl2ZXMgYXJlIG9rXG4gIGlmIChpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBjb25zdCBhcnJMZW4gPSBkYXRhLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHYgPSBkYXRhW2ldXG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkICYmICFnZXRHbG9iYWxDb25maWcoKS5hbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHMpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBcInVuZGVmaW5lZCBpcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhcnJheXMgc2luY2UgaXQgaXMgbm90IHNlcmlhbGl6YWJsZSBpbiBKU09OLCBjb25zaWRlciB1c2luZyBudWxsIGluc3RlYWRcIlxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjaGVja0RhdGFJc1NlcmlhbGl6YWJsZUFuZEZyZWV6ZSh2KVxuICAgIH1cbiAgICBPYmplY3QuZnJlZXplKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgICBjb25zdCBkYXRhS2V5c0xlbiA9IGRhdGFLZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUtleXNMZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGRhdGFLZXlzW2ldXG4gICAgICBjb25zdCB2ID0gZGF0YVtrXVxuXG4gICAgICBjaGVja0RhdGFJc1NlcmlhbGl6YWJsZUFuZEZyZWV6ZShrKVxuICAgICAgY2hlY2tEYXRhSXNTZXJpYWxpemFibGVBbmRGcmVlemUodilcbiAgICB9XG4gICAgT2JqZWN0LmZyZWV6ZShkYXRhKVxuICAgIHJldHVyblxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShgZnJvemVuIGRhdGEgbXVzdCBiZSBwbGFpbmx5IHNlcmlhbGl6YWJsZSB0byBKU09OLCBidXQgJHtkYXRhfSBpcyBub3RgKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIENoZWNrcyBpZiBhbiBzbmFwc2hvdCBpcyBhbiBzbmFwc2hvdCBmb3IgYSBmcm96ZW4gZGF0YS5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3RcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb3plblNuYXBzaG90KHNuYXBzaG90OiB1bmtub3duKTogc25hcHNob3QgaXMgU25hcHNob3RJbk9mRnJvemVuPEZyb3plbjxhbnk+PiB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHNuYXBzaG90KSAmJiBmcm96ZW5LZXkgaW4gc25hcHNob3Rcbn1cbiIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBlbnVtIFR3ZWFrZXJQcmlvcml0eSB7XG4gIE1vZGVsLFxuICBBcnJheSxcbiAgUGxhaW5PYmplY3QsXG4gIEZyb3plbixcbn1cbiIsImltcG9ydCB7IEZyb3plbiwgZnJvemVuS2V5IH0gZnJvbSBcIi4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHR5cGUgeyBQYXJlbnRQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IHNldFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvc2V0UGFyZW50XCJcbmltcG9ydCB7IHNldE5ld0ludGVybmFsU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxuaW1wb3J0IHsgdHdlYWtlZE9iamVjdHMgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IHJlZ2lzdGVyVHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrXCJcbmltcG9ydCB7IFR3ZWFrZXJQcmlvcml0eSB9IGZyb20gXCIuL1R3ZWFrZXJQcmlvcml0eVwiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d2Vha0Zyb3plbjxUIGV4dGVuZHMgRnJvemVuPGFueT4+KFxuICBmcm96ZW5PYmo6IFQsXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuKTogVCB7XG4gIHR3ZWFrZWRPYmplY3RzLnNldChmcm96ZW5PYmosIHVuZGVmaW5lZClcbiAgc2V0UGFyZW50KHtcbiAgICB2YWx1ZTogZnJvemVuT2JqLFxuICAgIHBhcmVudFBhdGgsXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcbiAgICBpc0RhdGFPYmplY3Q6IGZhbHNlLFxuICAgIC8vIGEgZnJvemVuIGlzIG5vdCBhIHZhbHVlLXR5cGVcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogZmFsc2UsXG4gIH0pXG5cbiAgLy8gd2UgRE9OJ1Qgd2FudCBkYXRhIHByb3hpZmllZCwgYnV0IHRoZSBzbmFwc2hvdCBpcyB0aGUgZGF0YSBpdHNlbGZcbiAgc2V0TmV3SW50ZXJuYWxTbmFwc2hvdChmcm96ZW5PYmosIHsgW2Zyb3plbktleV06IHRydWUsIGRhdGE6IGZyb3plbk9iai5kYXRhIH0sIHVuZGVmaW5lZCwgdHJ1ZSlcblxuICByZXR1cm4gZnJvemVuT2JqXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZyb3plblR3ZWFrZXIoKSB7XG4gIHJlZ2lzdGVyVHdlYWtlcihUd2Vha2VyUHJpb3JpdHkuRnJvemVuLCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGcm96ZW4pIHtcbiAgICAgIHJldHVybiB0d2Vha0Zyb3plbih2YWx1ZSwgcGFyZW50UGF0aClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudFBhdGgsIFBhcmVudFBhdGggfSBmcm9tIFwiLi9wYXRoXCJcbmltcG9ydCB0eXBlIHsgUGF0aCwgV3JpdGFibGVQYXRoIH0gZnJvbSBcIi4vcGF0aFR5cGVzXCJcblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB0aGUgcGFyZW50cyAoZnJvbSB0aGUgbmVhcmVzdCB1bnRpbCB0aGUgcm9vdClcbiAqIHVudGlsIG9uZSBvZiB0aGVtIG1hdGNoZXMgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAqIElmIHRoZSBwcmVkaWNhdGUgaXMgbWF0Y2hlZCBpdCB3aWxsIHJldHVybiB0aGUgZm91bmQgbm9kZS5cbiAqIElmIG5vbmUgaXMgZm91bmQgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQYXJlbnQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gY2hpbGQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biBmb3IgZXZlcnkgcGFyZW50IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBmcm9tIGltbWVkaWF0ZSBwYXJlbnQgdG8gdGhlIHJvb3QuXG4gKiBAcGFyYW0gbWF4RGVwdGggTWF4IGRlcHRoLCBvciAwIGZvciBpbmZpbml0ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGFyZW50PFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICBjaGlsZDogb2JqZWN0LFxuICBwcmVkaWNhdGU6IChwYXJlbnROb2RlOiBvYmplY3QpID0+IGJvb2xlYW4sXG4gIG1heERlcHRoID0gMFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZvdW5kUGFyZW50UGF0aCA9IGZpbmRQYXJlbnRQYXRoKGNoaWxkLCBwcmVkaWNhdGUsIG1heERlcHRoKVxuICByZXR1cm4gZm91bmRQYXJlbnRQYXRoID8gZm91bmRQYXJlbnRQYXRoLnBhcmVudCA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBgZmluZFBhcmVudFBhdGhgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUGFyZW50UGF0aDxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBGb3VuZCBwYXJlbnQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50OiBUXG5cbiAgLyoqXG4gICAqIFBhdGggZnJvbSB0aGUgZm91bmQgcGFyZW50IHRvIHRoZSBjaGlsZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IFBhdGhcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCB0aGUgcGFyZW50cyAoZnJvbSB0aGUgbmVhcmVzdCB1bnRpbCB0aGUgcm9vdClcbiAqIHVudGlsIG9uZSBvZiB0aGVtIG1hdGNoZXMgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAqIElmIHRoZSBwcmVkaWNhdGUgaXMgbWF0Y2hlZCBpdCB3aWxsIHJldHVybiB0aGUgZm91bmQgbm9kZSBwbHVzIHRoZVxuICogcGF0aCB0byBnZXQgZnJvbSB0aGUgcGFyZW50IHRvIHRoZSBjaGlsZC5cbiAqIElmIG5vbmUgaXMgZm91bmQgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBQYXJlbnQgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gY2hpbGQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biBmb3IgZXZlcnkgcGFyZW50IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBmcm9tIGltbWVkaWF0ZSBwYXJlbnQgdG8gdGhlIHJvb3QuXG4gKiBAcGFyYW0gbWF4RGVwdGggTWF4IGRlcHRoLCBvciAwIGZvciBpbmZpbml0ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGFyZW50UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgY2hpbGQ6IG9iamVjdCxcbiAgcHJlZGljYXRlOiAocGFyZW50Tm9kZTogb2JqZWN0KSA9PiBib29sZWFuLFxuICBtYXhEZXB0aCA9IDBcbik6IEZvdW5kUGFyZW50UGF0aDxUPiB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QoY2hpbGQsIFwiY2hpbGRcIilcblxuICBjb25zdCBwYXRoOiBXcml0YWJsZVBhdGggPSBbXVxuXG4gIGxldCBjdXJyZW50OiBhbnkgPSBjaGlsZFxuICBsZXQgZGVwdGggPSAwXG5cbiAgbGV0IHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZFxuICB3aGlsZSAoKHBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aChjdXJyZW50KSkpIHtcbiAgICBwYXRoLnVuc2hpZnQocGFyZW50UGF0aC5wYXRoKVxuICAgIGN1cnJlbnQgPSBwYXJlbnRQYXRoLnBhcmVudFxuICAgIGlmIChwcmVkaWNhdGUoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmVudDogY3VycmVudCxcbiAgICAgICAgcGF0aCxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZXB0aCsrXG4gICAgaWYgKG1heERlcHRoID4gMCAmJiBkZXB0aCA9PT0gbWF4RGVwdGgpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cbiIsImltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldERlZXBPYmplY3RDaGlsZHJlbiwgZ2V0T2JqZWN0Q2hpbGRyZW4gfSBmcm9tIFwiLi9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuXG4vKipcbiAqIFJldHVybnMgYWxsIHRoZSBjaGlsZHJlbiBvYmplY3RzICh0aGlzIGlzLCBleGNsdWRpbmcgcHJpbWl0aXZlcykgb2YgYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBub2RlIE9iamVjdCB0byBnZXQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gZnJvbS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gQW4gb3B0aW9uYWwgb2JqZWN0IHdpdGggdGhlIGBkZWVwYCBvcHRpb24gKGRlZmF1bHRzIHRvIGZhbHNlKSB0byB0cnVlIHRvIGdldFxuICogdGhlIGNoaWxkcmVuIGRlZXBseSBvciBmYWxzZSB0byBnZXQgdGhlbSBzaGFsbG93bHkuXG4gKiBAcmV0dXJucyBBIHJlYWRvbmx5IG9ic2VydmFibGUgc2V0IHdpdGggdGhlIGNoaWxkcmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRyZW5PYmplY3RzKFxuICBub2RlOiBvYmplY3QsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVlcD86IGJvb2xlYW5cbiAgfVxuKTogUmVhZG9ubHlTZXQ8b2JqZWN0PiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmRlZXApIHtcbiAgICByZXR1cm4gZ2V0T2JqZWN0Q2hpbGRyZW4obm9kZSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0RGVlcE9iamVjdENoaWxkcmVuKG5vZGUpLmRlZXBcbiAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0Q2hpbGRyZW5PYmplY3RzIH0gZnJvbSBcIi4vZ2V0Q2hpbGRyZW5PYmplY3RzXCJcblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCBjaGlsZHJlbiBhbmQgY29sbGVjdHMgdGhlbSBpbiBhIHNldCBpZiB0aGVcbiAqIGdpdmVuIHByZWRpY2F0ZSBtYXRjaGVzLlxuICpcbiAqIEBwYXJhbSByb290IFJvb3Qgb2JqZWN0IHRvIGdldCB0aGUgbWF0Y2hpbmcgY2hpbGRyZW4gZnJvbS5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biBmb3IgZXZlcnkgY2hpbGQgb2YgdGhlIHJvb3Qgb2JqZWN0LlxuICogQHBhcmFtIFtvcHRpb25zXSBBbiBvcHRpb25hbCBvYmplY3Qgd2l0aCB0aGUgYGRlZXBgIG9wdGlvbiAoZGVmYXVsdHMgdG8gYGZhbHNlYCkgc2V0IHRvIGB0cnVlYCB0b1xuICogZ2V0IHRoZSBjaGlsZHJlbiBkZWVwbHkgb3IgYGZhbHNlYCB0byBnZXQgdGhlbSBzaGFsbG93bHkuXG4gKiBAcmV0dXJucyBBIHJlYWRvbmx5IG9ic2VydmFibGUgc2V0IHdpdGggdGhlIG1hdGNoaW5nIGNoaWxkcmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENoaWxkcmVuPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICByb290OiBvYmplY3QsXG4gIHByZWRpY2F0ZTogKG5vZGU6IG9iamVjdCkgPT4gYm9vbGVhbixcbiAgb3B0aW9ucz86IHtcbiAgICBkZWVwPzogYm9vbGVhblxuICB9XG4pOiBSZWFkb25seVNldDxUPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5PYmplY3RzKHJvb3QsIG9wdGlvbnMpXG5cbiAgY29uc3Qgc2V0ID0gbmV3IFNldDxhbnk+KClcblxuICBjb25zdCBpdGVyID0gY2hpbGRyZW4udmFsdWVzKClcbiAgbGV0IGN1ciA9IGl0ZXIubmV4dCgpXG4gIHdoaWxlICghY3VyLmRvbmUpIHtcbiAgICBpZiAocHJlZGljYXRlKGN1ci52YWx1ZSkpIHtcbiAgICAgIHNldC5hZGQoY3VyLnZhbHVlKVxuICAgIH1cbiAgICBjdXIgPSBpdGVyLm5leHQoKVxuICB9XG5cbiAgcmV0dXJuIHNldFxufVxuIiwiaW1wb3J0IHsgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldENoaWxkcmVuT2JqZWN0cyB9IGZyb20gXCIuL2dldENoaWxkcmVuT2JqZWN0c1wiXG5cbi8qKlxuICogUnVucyBhIGNhbGxiYWNrIGV2ZXJ5dGltZSBhIG5ldyBvYmplY3QgaXMgYXR0YWNoZWQgdG8gYSBnaXZlbiBub2RlLlxuICogVGhlIGNhbGxiYWNrIGNhbiBvcHRpb25hbGx5IHJldHVybiBhIGRpc3Bvc2VyIHdoaWNoIHdpbGwgYmUgcnVuIHdoZW4gdGhlIGNoaWxkIGlzIGRldGFjaGVkLlxuICpcbiAqIFRoZSBvcHRpb25hbCBvcHRpb25zIHBhcmFtZXRlciBhY2NlcHRzIGFuZCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gKiAtIGBkZWVwOiBib29sZWFuYCAoZGVmYXVsdDogYGZhbHNlYCkgLSB0cnVlIGlmIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgcnVuIGZvciBhbGwgY2hpbGRyZW4gZGVlcGx5XG4gKiBvciBmYWxzZSBpZiBpdCBpdCBzaG91bGQgb25seSBydW4gZm9yIHNoYWxsb3cgY2hpbGRyZW4uXG4gKiAtIGBmaXJlRm9yQ3VycmVudENoaWxkcmVuOiBib29sZWFuYCAoZGVmYXVsdDogYHRydWVgKSAtIHRydWUgaWYgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBpbW1lZGlhdGVseVxuICogY2FsbGVkIGZvciBjdXJyZW50bHkgYXR0YWNoZWQgY2hpbGRyZW4sIGZhbHNlIGlmIG9ubHkgZm9yIGZ1dHVyZSBhdHRhY2htZW50cy5cbiAqXG4gKiBSZXR1cm5zIGEgZGlzcG9zZXIsIHdoaWNoIGhhcyBhIGJvb2xlYW4gcGFyYW1ldGVyIHdoaWNoIHNob3VsZCBiZSB0cnVlIGlmIHBlbmRpbmcgZGV0YWNobWVudFxuICogY2FsbGJhY2tzIHNob3VsZCBiZSBydW4gb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBvYmplY3Qgd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIHRyYWNrZWQuXG4gKiBAcGFyYW0gZm4gQ2FsbGJhY2sgY2FsbGVkIHdoZW4gYSBjaGlsZCBpcyBhdHRhY2hlZCB0byB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBbb3B0aW9uc11cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkNoaWxkQXR0YWNoZWRUbyhcbiAgdGFyZ2V0OiAoKSA9PiBvYmplY3QsXG4gIGZuOiAoY2hpbGQ6IG9iamVjdCkgPT4gKCgpID0+IHZvaWQpIHwgdm9pZCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWVwPzogYm9vbGVhblxuICAgIGZpcmVGb3JDdXJyZW50Q2hpbGRyZW4/OiBib29sZWFuXG4gIH1cbik6IChydW5EZXRhY2hEaXNwb3NlcnM6IGJvb2xlYW4pID0+IHZvaWQge1xuICBhc3NlcnRJc0Z1bmN0aW9uKHRhcmdldCwgXCJ0YXJnZXRcIilcbiAgYXNzZXJ0SXNGdW5jdGlvbihmbiwgXCJmblwiKVxuXG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgZGVlcDogZmFsc2UsXG4gICAgcnVuRm9yQ3VycmVudENoaWxkcmVuOiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cblxuICBjb25zdCBkZXRhY2hEaXNwb3NlcnMgPSBuZXcgV2Vha01hcDxvYmplY3QsICgpID0+IHZvaWQ+KClcblxuICBjb25zdCBydW5EZXRhY2hEaXNwb3NlciA9IChuOiBvYmplY3QpID0+IHtcbiAgICBjb25zdCBkZXRhY2hEaXNwb3NlciA9IGRldGFjaERpc3Bvc2Vycy5nZXQobilcbiAgICBpZiAoZGV0YWNoRGlzcG9zZXIpIHtcbiAgICAgIGRldGFjaERpc3Bvc2Vycy5kZWxldGUobilcbiAgICAgIGRldGFjaERpc3Bvc2VyKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhZGREZXRhY2hEaXNwb3NlciA9IChuOiBvYmplY3QsIGRpc3Bvc2VyOiAoKCkgPT4gdm9pZCkgfCB2b2lkKSA9PiB7XG4gICAgaWYgKGRpc3Bvc2VyKSB7XG4gICAgICBkZXRhY2hEaXNwb3NlcnMuc2V0KG4sIGRpc3Bvc2VyKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdldENoaWxkcmVuT2JqZWN0T3B0cyA9IHsgZGVlcDogb3B0cy5kZWVwIH1cbiAgY29uc3QgZ2V0Q3VycmVudENoaWxkcmVuID0gKCkgPT4ge1xuICAgIGxldCB0ID0gdGFyZ2V0KClcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KHQsIFwidGFyZ2V0KClcIilcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5PYmplY3RzKHQsIGdldENoaWxkcmVuT2JqZWN0T3B0cylcblxuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8b2JqZWN0PigpXG5cbiAgICBjb25zdCBpdGVyID0gY2hpbGRyZW4udmFsdWVzKClcbiAgICBsZXQgY3VyID0gaXRlci5uZXh0KClcbiAgICB3aGlsZSAoIWN1ci5kb25lKSB7XG4gICAgICBzZXQuYWRkKGN1ci52YWx1ZSlcbiAgICAgIGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNldFxuICB9XG5cbiAgY29uc3QgY3VycmVudENoaWxkcmVuID0gb3B0cy5ydW5Gb3JDdXJyZW50Q2hpbGRyZW4gPyBuZXcgU2V0PG9iamVjdD4oKSA6IGdldEN1cnJlbnRDaGlsZHJlbigpXG5cbiAgY29uc3QgZGlzcG9zZXIgPSByZWFjdGlvbihcbiAgICAoKSA9PiBnZXRDdXJyZW50Q2hpbGRyZW4oKSxcbiAgICAobmV3Q2hpbGRyZW4pID0+IHtcbiAgICAgIGNvbnN0IGRpc3Bvc2Vyc1RvUnVuOiBvYmplY3RbXSA9IFtdXG5cbiAgICAgIC8vIGZpbmQgZGVhZFxuICAgICAgY29uc3QgY3VycmVudENoaWxkcmVuSXRlciA9IGN1cnJlbnRDaGlsZHJlbi52YWx1ZXMoKVxuICAgICAgbGV0IGN1cnJlbnRDaGlsZHJlbkN1ciA9IGN1cnJlbnRDaGlsZHJlbkl0ZXIubmV4dCgpXG4gICAgICB3aGlsZSAoIWN1cnJlbnRDaGlsZHJlbkN1ci5kb25lKSB7XG4gICAgICAgIGNvbnN0IG4gPSBjdXJyZW50Q2hpbGRyZW5DdXIudmFsdWVcbiAgICAgICAgaWYgKCFuZXdDaGlsZHJlbi5oYXMobikpIHtcbiAgICAgICAgICBjdXJyZW50Q2hpbGRyZW4uZGVsZXRlKG4pXG5cbiAgICAgICAgICAvLyB3ZSBzaG91bGQgcnVuIGl0IGluIGludmVyc2Ugb3JkZXJcbiAgICAgICAgICBkaXNwb3NlcnNUb1J1bi5wdXNoKG4pXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50Q2hpbGRyZW5DdXIgPSBjdXJyZW50Q2hpbGRyZW5JdGVyLm5leHQoKVxuICAgICAgfVxuXG4gICAgICBpZiAoZGlzcG9zZXJzVG9SdW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gZGlzcG9zZXJzVG9SdW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBydW5EZXRhY2hEaXNwb3NlcihkaXNwb3NlcnNUb1J1bltpXSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIG5ld1xuICAgICAgY29uc3QgbmV3Q2hpbGRyZW5JdGVyID0gbmV3Q2hpbGRyZW4udmFsdWVzKClcbiAgICAgIGxldCBuZXdDaGlsZHJlbkN1ciA9IG5ld0NoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIHdoaWxlICghbmV3Q2hpbGRyZW5DdXIuZG9uZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3Q2hpbGRyZW5DdXIudmFsdWVcbiAgICAgICAgaWYgKCFjdXJyZW50Q2hpbGRyZW4uaGFzKG4pKSB7XG4gICAgICAgICAgY3VycmVudENoaWxkcmVuLmFkZChuKVxuXG4gICAgICAgICAgYWRkRGV0YWNoRGlzcG9zZXIobiwgZm4obikpXG4gICAgICAgIH1cblxuICAgICAgICBuZXdDaGlsZHJlbkN1ciA9IG5ld0NoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcbiAgICB9XG4gIClcblxuICByZXR1cm4gKHJ1bkRldGFjaERpc3Bvc2VyczogYm9vbGVhbikgPT4ge1xuICAgIGRpc3Bvc2VyKClcblxuICAgIGlmIChydW5EZXRhY2hEaXNwb3NlcnMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGlsZHJlbkl0ZXIgPSBjdXJyZW50Q2hpbGRyZW4udmFsdWVzKClcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRyZW5DdXIgPSBjdXJyZW50Q2hpbGRyZW5JdGVyLm5leHQoKVxuICAgICAgd2hpbGUgKCFjdXJyZW50Q2hpbGRyZW5DdXIuZG9uZSkge1xuICAgICAgICBjb25zdCBuID0gY3VycmVudENoaWxkcmVuQ3VyLnZhbHVlXG4gICAgICAgIHJ1bkRldGFjaERpc3Bvc2VyKG4pXG5cbiAgICAgICAgY3VycmVudENoaWxkcmVuQ3VyID0gY3VycmVudENoaWxkcmVuSXRlci5uZXh0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY3VycmVudENoaWxkcmVuLmNsZWFyKClcbiAgfVxufVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZ2V0RGVlcE9iamVjdENoaWxkcmVuIH0gZnJvbSBcIi4vY29yZU9iamVjdENoaWxkcmVuXCJcblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSB0YXJnZXQgaXMgYSBcImNoaWxkXCIgb2YgdGhlIHRyZWUgb2YgdGhlIGdpdmVuIFwicGFyZW50XCIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBjaGlsZCBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHBhcmVudCBQYXJlbnQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRPZlBhcmVudChjaGlsZDogb2JqZWN0LCBwYXJlbnQ6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KGNoaWxkLCBcImNoaWxkXCIpXG4gIGFzc2VydFR3ZWFrZWRPYmplY3QocGFyZW50LCBcInBhcmVudFwiKVxuXG4gIHJldHVybiBnZXREZWVwT2JqZWN0Q2hpbGRyZW4ocGFyZW50KS5kZWVwLmhhcyhjaGlsZClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSB0YXJnZXQgaXMgYSBcInBhcmVudFwiIHRoYXQgaGFzIGluIGl0cyB0cmVlIHRoZSBnaXZlbiBcImNoaWxkXCIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwYXJlbnQgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBjaGlsZCBDaGlsZCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJlbnRPZkNoaWxkKHBhcmVudDogb2JqZWN0LCBjaGlsZDogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0NoaWxkT2ZQYXJlbnQoY2hpbGQsIHBhcmVudClcbn1cbiIsImxldCB0eXBlQ2hlY2tpbmdBbGxvd2VkID0gdHJ1ZVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dFR5cGVDaGVja2luZyhmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBsZXQgb2xkVHlwZUNoZWNraW5nQWxsb3dlZCA9IHR5cGVDaGVja2luZ0FsbG93ZWRcbiAgdHlwZUNoZWNraW5nQWxsb3dlZCA9IGZhbHNlXG5cbiAgdHJ5IHtcbiAgICBmbigpXG4gIH0gZmluYWxseSB7XG4gICAgdHlwZUNoZWNraW5nQWxsb3dlZCA9IG9sZFR5cGVDaGVja2luZ0FsbG93ZWRcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlQ2hlY2tpbmdBbGxvd2VkKCkge1xuICByZXR1cm4gdHlwZUNoZWNraW5nQWxsb3dlZFxufVxuIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGVudW0gU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkge1xuICBBcnJheSxcbiAgRnJvemVuLFxuICBNb2RlbCxcbiAgUGxhaW5PYmplY3QsXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuLi90d2Vha2VyL3R5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyB3aXRob3V0VHlwZUNoZWNraW5nIH0gZnJvbSBcIi4uL3R3ZWFrZXIvd2l0aG91dFR5cGVDaGVja2luZ1wiXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgZGV0YWNoSWZOZWVkZWQsIHJlY29uY2lsZVNuYXBzaG90LCByZWdpc3RlclJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVTbmFwc2hvdFwiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZk9iamVjdCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIHJlY29uY2lsZUFycmF5U25hcHNob3QoXG4gIHZhbHVlOiBhbnksXG4gIHNuOiBTbmFwc2hvdEluT2ZPYmplY3Q8YW55W10+LFxuICBtb2RlbFBvb2w6IE1vZGVsUG9vbFxuKTogYW55W10ge1xuICBpZiAoIWlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICByZXR1cm4gZnJvbVNuYXBzaG90KHNuKVxuICB9XG5cbiAgY29uc3Qgc25hcHNob3RCZWZvcmVDaGFuZ2VzID0gZ2V0U25hcHNob3QodmFsdWUpXG5cbiAgd2l0aG91dFR5cGVDaGVja2luZygoKSA9PiB7XG4gICAgLy8gcmVtb3ZlIGV4Y2VzcyBpdGVtc1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBzbi5sZW5ndGgpIHtcbiAgICAgIHZhbHVlLnNwbGljZShzbi5sZW5ndGgsIHZhbHVlLmxlbmd0aCAtIHNuLmxlbmd0aClcbiAgICB9XG5cbiAgICAvLyByZWNvbmNpbGUgcHJlc2VudCBpdGVtc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdmFsdWVbaV1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3Qob2xkVmFsdWUsIHNuW2ldLCBtb2RlbFBvb2wsIHZhbHVlKVxuXG4gICAgICBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZSwgb2xkVmFsdWUsIG1vZGVsUG9vbClcblxuICAgICAgc2V0KHZhbHVlLCBpLCBuZXdWYWx1ZSlcbiAgICB9XG5cbiAgICAvLyBhZGQgZXhjZXNzIGl0ZW1zXG4gICAgZm9yIChsZXQgaSA9IHZhbHVlLmxlbmd0aDsgaSA8IHNuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZS5wdXNoKHJlY29uY2lsZVNuYXBzaG90KHVuZGVmaW5lZCwgc25baV0sIG1vZGVsUG9vbCwgdmFsdWUpKVxuICAgIH1cbiAgfSlcblxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSh2YWx1ZSwgdW5kZWZpbmVkLCBzbmFwc2hvdEJlZm9yZUNoYW5nZXMpXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFycmF5U25hcHNob3RSZWNvbmNpbGVyKCkge1xuICByZWdpc3RlclJlY29uY2lsZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuQXJyYXksICh2YWx1ZSwgc24sIG1vZGVsUG9vbCkgPT4ge1xuICAgIGlmIChpc0FycmF5KHNuKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZUFycmF5U25hcHNob3QodmFsdWUsIHNuLCBtb2RlbFBvb2wpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IEZyb3plbiwgZnJvemVuLCBpc0Zyb3plblNuYXBzaG90IH0gZnJvbSBcIi4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHsgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZGcm96ZW4gfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiByZWNvbmNpbGVGcm96ZW5TbmFwc2hvdCh2YWx1ZTogYW55LCBzbjogU25hcHNob3RJbk9mRnJvemVuPEZyb3plbjxhbnk+Pik6IEZyb3plbjxhbnk+IHtcbiAgLy8gcmVjb25jaWxpYXRpb24gaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgdGFyZ2V0IGlzIGEgRnJvemVuIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgZGF0YSAoYnkgcmVmKVxuICAvLyBpbiB0aGVvcnkgd2UgY291bGQgY29tcGFyZSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBib3RoIGRhdGFzIG9yIGRvIGEgZGVlcCBjb21wYXJpc29uLCBidXQgdGhhdCdkIGJlIHRvbyBzbG93XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZyb3plbiAmJiB2YWx1ZS5kYXRhID09PSBzbi5kYXRhKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgcmV0dXJuIGZyb3plbihzbi5kYXRhKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm96ZW5TbmFwc2hvdFJlY29uY2lsZXIoKSB7XG4gIHJlZ2lzdGVyUmVjb25jaWxlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5Gcm96ZW4sICh2YWx1ZSwgc24pID0+IHtcbiAgICBpZiAoaXNGcm96ZW5TbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVGcm96ZW5TbmFwc2hvdCh2YWx1ZSwgc24pXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuICB2YXIgZW52SGFzQmlnSW50NjRBcnJheSA9IHR5cGVvZiBCaWdJbnQ2NEFycmF5ICE9PSAndW5kZWZpbmVkJztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgaWYgKChhIGluc3RhbmNlb2YgTWFwKSAmJiAoYiBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgICAgIGlmICghZXF1YWwoaVsxXSwgYi5nZXQoaVswXSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoKGEgaW5zdGFuY2VvZiBTZXQpICYmIChiIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgICAgIGlmICghYi5oYXMoaVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghZXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB0cnVlIGlmIGJvdGggTmFOLCBmYWxzZSBvdGhlcndpc2VcbiAgcmV0dXJuIGEhPT1hICYmIGIhPT1iO1xufTtcbiIsImltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbElkS2V5LCBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCwgaXNNb2RlbFNuYXBzaG90IH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGRhdGFPYmplY3RQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHtcbiAgZ2V0RGVlcE9iamVjdENoaWxkcmVuLFxuICByZWdpc3RlckRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbixcbn0gZnJvbSBcIi4uL3BhcmVudC9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuXG5mdW5jdGlvbiBieU1vZGVsVHlwZUFuZElkS2V5KG1vZGVsVHlwZTogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG1vZGVsVHlwZSArIFwiIFwiICsgbW9kZWxJZFxufVxuXG5leHBvcnQgY2xhc3MgTW9kZWxQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBSZWFkb25seU1hcDxzdHJpbmcsIEFueU1vZGVsPlxuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IG9iamVjdCkge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgdGhlIHN1Yi1kYXRhICQgb2JqZWN0XG4gICAgcm9vdCA9IGRhdGFPYmplY3RQYXJlbnQuZ2V0KHJvb3QpID8/IHJvb3RcblxuICAgIHRoaXMucG9vbCA9IGdldERlZXBDaGlsZHJlbk1vZGVscyhnZXREZWVwT2JqZWN0Q2hpbGRyZW4ocm9vdCkpXG4gIH1cblxuICBmaW5kTW9kZWxCeVR5cGVBbmRJZChtb2RlbFR5cGU6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQW55TW9kZWwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtb2RlbElkID8gdGhpcy5wb29sLmdldChieU1vZGVsVHlwZUFuZElkS2V5KG1vZGVsVHlwZSwgbW9kZWxJZCkpIDogdW5kZWZpbmVkXG4gIH1cblxuICBmaW5kTW9kZWxGb3JTbmFwc2hvdChzbjogYW55KTogQW55TW9kZWwgfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNNb2RlbFNuYXBzaG90KHNuKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IHNuW21vZGVsVHlwZUtleV1cbiAgICBjb25zdCBtb2RlbEluZm8gPSBnZXRNb2RlbEluZm9Gb3JOYW1lKG1vZGVsVHlwZSkhXG4gICAgY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZSA9IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUobW9kZWxJbmZvLmNsYXNzIGFzIE1vZGVsQ2xhc3M8QW55TW9kZWw+KVxuXG4gICAgcmV0dXJuIG1vZGVsSWRQcm9wZXJ0eU5hbWVcbiAgICAgID8gdGhpcy5maW5kTW9kZWxCeVR5cGVBbmRJZChzblttb2RlbFR5cGVLZXldLCAoc24gYXMgYW55KVttb2RlbElkUHJvcGVydHlOYW1lXSlcbiAgICAgIDogdW5kZWZpbmVkXG4gIH1cbn1cblxuY29uc3QgZ2V0RGVlcENoaWxkcmVuTW9kZWxzID0gcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb248TWFwPHN0cmluZywgQW55TW9kZWw+Pih7XG4gIGluaXREYXRhKCkge1xuICAgIHJldHVybiBuZXcgTWFwKClcbiAgfSxcblxuICBhZGROb2RlKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoaXNNb2RlbChub2RlKSkge1xuICAgICAgY29uc3QgaWQgPSBub2RlW21vZGVsSWRLZXldXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgZGF0YS5zZXQoYnlNb2RlbFR5cGVBbmRJZEtleShub2RlW21vZGVsVHlwZUtleV0sIGlkKSwgbm9kZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlT2JqZWN0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgaXNGcm96ZW5TbmFwc2hvdCB9IGZyb20gXCIuLi9mcm96ZW4vRnJvemVuXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbElkS2V5LCBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCwgaXNNb2RlbFNuYXBzaG90IH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJbmZvRm9yTmFtZSwgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUsIGluRGV2TW9kZSwgaXNBcnJheSwgaXNQbGFpbk9iamVjdCwgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IHJlY29uY2lsZVNuYXBzaG90IH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2YsIFNuYXBzaG90T3V0T2YgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcblxuLyoqXG4gKiBBcHBsaWVzIGEgZnVsbCBzbmFwc2hvdCBvdmVyIGFuIG9iamVjdCwgcmVjb25jaWxpbmcgaXQgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlIFRhcmdldCBvYmplY3QgKG1vZGVsIG9iamVjdCwgb2JqZWN0IG9yIGFycmF5KS5cbiAqIEBwYXJhbSBzbmFwc2hvdCBTbmFwc2hvdCB0byBhcHBseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCwgc25hcHNob3Q6IFNuYXBzaG90SW5PZjxUPik6IHZvaWRcblxuLyoqXG4gKiBBcHBsaWVzIGEgZnVsbCBzbmFwc2hvdCBvdmVyIGFuIG9iamVjdCwgcmVjb25jaWxpbmcgaXQgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlIFRhcmdldCBvYmplY3QgKG1vZGVsIG9iamVjdCwgb2JqZWN0IG9yIGFycmF5KS5cbiAqIEBwYXJhbSBzbmFwc2hvdCBTbmFwc2hvdCB0byBhcHBseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U25hcHNob3Q8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCwgc25hcHNob3Q6IFNuYXBzaG90T3V0T2Y8VD4pOiB2b2lkXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNuYXBzaG90KG5vZGU6IG9iamVjdCwgc25hcHNob3Q6IHVua25vd24pOiB2b2lkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcbiAgYXNzZXJ0SXNPYmplY3Qoc25hcHNob3QsIFwic25hcHNob3RcIilcblxuICB3cmFwcGVkSW50ZXJuYWxBcHBseVNuYXBzaG90KCkuY2FsbChub2RlLCBzbmFwc2hvdClcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlTbmFwc2hvdDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgdGhpczogVCxcbiAgc246IFNuYXBzaG90SW5PZjxUPiB8IFNuYXBzaG90T3V0T2Y8VD5cbik6IHZvaWQge1xuICBjb25zdCBvYmogPSB0aGlzXG5cbiAgY29uc3QgcmVjb25jaWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsUG9vbCA9IG5ldyBNb2RlbFBvb2wob2JqKVxuICAgIGNvbnN0IHJldCA9IHJlY29uY2lsZVNuYXBzaG90KG9iaiwgc24sIG1vZGVsUG9vbCwgdW5kZWZpbmVkKVxuXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAocmV0ICE9PSBvYmopIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcImFzc2VydGlvbiBmYWlsZWQ6IHJlY29uY2lsZWQgb2JqZWN0IGhhcyB0byBiZSB0aGUgc2FtZVwiKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc0FycmF5KHNuKSkge1xuICAgIGlmICghaXNBcnJheShvYmopKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiaWYgdGhlIHNuYXBzaG90IGlzIGFuIGFycmF5IHRoZSB0YXJnZXQgbXVzdCBiZSBhbiBhcnJheSB0b29cIilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb25jaWxlKClcbiAgfVxuXG4gIGlmIChpc0Zyb3plblNuYXBzaG90KHNuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhcHBseVNuYXBzaG90IGNhbm5vdCBiZSB1c2VkIG92ZXIgZnJvemVuIG9iamVjdHNcIilcbiAgfVxuXG4gIC8vIGFkYXB0IHNuYXBzaG90IHRvIHRhcmdldCBtb2RlbCBpZiBwb3NzaWJsZVxuICBpZiAoaXNQbGFpbk9iamVjdChzbikgJiYgKHNuIGFzIGFueSlbbW9kZWxUeXBlS2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzTW9kZWwob2JqKSkge1xuICAgIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KChvYmogYXMgYW55KS5jb25zdHJ1Y3RvcikhXG4gICAgc24gPSB7IC4uLnNuLCBbbW9kZWxUeXBlS2V5XTogbW9kZWxJbmZvLm5hbWUgfVxuICB9XG5cbiAgaWYgKGlzTW9kZWxTbmFwc2hvdChzbikpIHtcbiAgICBjb25zdCB0eXBlID0gc25bbW9kZWxUeXBlS2V5XVxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZSh0eXBlKVxuICAgIGlmICghbW9kZWxJbmZvKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBtb2RlbCB3aXRoIG5hbWUgXCIke3R5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gICAgfVxuXG4gICAgLy8gd2UgZG9uJ3QgY2hlY2sgYnkgYWN0dWFsIGluc3RhbmNlIHNpbmNlIHRoZSBjbGFzcyBtaWdodCBiZSBhIGRpZmZlcmVudCBvbmUgZHVlIHRvIGhvdCByZWxvYWRpbmdcbiAgICBpZiAoIWlzTW9kZWwob2JqKSkge1xuICAgICAgLy8gbm90IGEgbW9kZWwgaW5zdGFuY2UsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICB0aHJvdyBmYWlsdXJlKGB0aGUgdGFyZ2V0IGZvciBhIG1vZGVsIHNuYXBzaG90IG11c3QgYmUgYSBtb2RlbCBpbnN0YW5jZWApXG4gICAgfVxuXG4gICAgaWYgKG9ialttb2RlbFR5cGVLZXldICE9PSB0eXBlKSB7XG4gICAgICAvLyBkaWZmZXJlbnQga2luZCBvZiBtb2RlbCwgbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBzbmFwc2hvdCBtb2RlbCB0eXBlICcke3R5cGV9JyBkb2VzIG5vdCBtYXRjaCB0YXJnZXQgbW9kZWwgdHlwZSAnJHtcbiAgICAgICAgICAob2JqIGFzIGFueSlbbW9kZWxUeXBlS2V5XVxuICAgICAgICB9J2BcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbElkUHJvcGVydHlOYW1lID0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShtb2RlbEluZm8uY2xhc3MgYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pXG4gICAgaWYgKG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgIGNvbnN0IGlkID0gKHNuIGFzIGFueSlbbW9kZWxJZFByb3BlcnR5TmFtZV1cbiAgICAgIGlmIChvYmpbbW9kZWxJZEtleV0gIT09IGlkKSB7XG4gICAgICAgIC8vIGRpZmZlcmVudCBpZCwgbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgc25hcHNob3QgbW9kZWwgaWQgJyR7aWR9JyBkb2VzIG5vdCBtYXRjaCB0YXJnZXQgbW9kZWwgaWQgJyR7b2JqW21vZGVsSWRLZXldfSdgXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb25jaWxlKClcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHNuKSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChvYmopICYmICFpc09ic2VydmFibGVPYmplY3Qob2JqKSkge1xuICAgICAgLy8gbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICAgIHRocm93IGZhaWx1cmUoXCJpZiB0aGUgc25hcHNob3QgaXMgYW4gb2JqZWN0IHRoZSB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QgdG9vXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgpXG4gIH1cblxuICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBzbmFwc2hvdCAtICR7c259YClcbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlTbmFwc2hvdCA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlTbmFwc2hvdCxcbiAgICBmbjogaW50ZXJuYWxBcHBseVNuYXBzaG90LFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG4iLCJpbXBvcnQgeyByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5cbi8qKlxuICogTGlzdGVuZXIgZnVuY3Rpb24gZm9yIG9uU25hcHNob3QuXG4gKi9cbmV4cG9ydCB0eXBlIE9uU25hcHNob3RMaXN0ZW5lcjxUPiA9IChzbjogU25hcHNob3RPdXRPZjxUPiwgcHJldlNuOiBTbmFwc2hvdE91dE9mPFQ+KSA9PiB2b2lkXG5cbi8qKlxuICogRGlzcG9zZXIgZnVuY3Rpb24gZm9yIG9uU25hcHNob3QuXG4gKi9cbmV4cG9ydCB0eXBlIE9uU25hcHNob3REaXNwb3NlciA9ICgpID0+IHZvaWRcblxuLyoqXG4gKiBBZGRzIGEgcmVhY3Rpb24gdGhhdCB3aWxsIHRyaWdnZXIgZXZlcnkgdGltZSBhbiBzbmFwc2hvdCBjaGFuZ2VzLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlT3JGbiBPYmplY3QgdG8gZ2V0IHRoZSBzbmFwc2hvdCBmcm9tIG9yIGEgZnVuY3Rpb24gdG8gZ2V0IGl0LlxuICogQHBhcmFtIGxpc3RlbmVyIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgc25hcHNob3QgY2hhbmdlcy5cbiAqIEByZXR1cm5zIEEgZGlzcG9zZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblNuYXBzaG90PFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBub2RlT3JGbjogVCB8ICgoKSA9PiBUKSxcbiAgbGlzdGVuZXI6IE9uU25hcHNob3RMaXN0ZW5lcjxUPlxuKTogT25TbmFwc2hvdERpc3Bvc2VyIHtcbiAgY29uc3Qgbm9kZUZuID0gdHlwZW9mIG5vZGVPckZuID09PSBcImZ1bmN0aW9uXCIgPyAobm9kZU9yRm4gYXMgKCkgPT4gVCkgOiAoKSA9PiBub2RlT3JGblxuXG4gIGNvbnN0IG5vZGUgPSBub2RlRm4oKVxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGxldCBjdXJyZW50U25hcHNob3QgPSBnZXRTbmFwc2hvdChub2RlKVxuXG4gIHJldHVybiByZWFjdGlvbihcbiAgICAoKSA9PiBnZXRTbmFwc2hvdChub2RlRm4oKSksXG4gICAgKG5ld1NuYXBzaG90KSA9PiB7XG4gICAgICBjb25zdCBwcmV2U24gPSBjdXJyZW50U25hcHNob3RcbiAgICAgIGN1cnJlbnRTbmFwc2hvdCA9IG5ld1NuYXBzaG90XG4gICAgICBsaXN0ZW5lcihuZXdTbmFwc2hvdCwgcHJldlNuKVxuICAgIH1cbiAgKVxufVxuIiwiaW1wb3J0IGZhc3REZWVwRXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbC9lczZcIlxuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCB0b0pTIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3RcIlxuaW1wb3J0IHsgaXNUcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyXCJcbmltcG9ydCB7IGdldE1vYnhWZXJzaW9uIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBEZWVwbHkgY29tcGFyZXMgdHdvIHZhbHVlcy5cbiAqXG4gKiBTdXBwb3J0ZWQgdmFsdWVzIGFyZTpcbiAqIC0gUHJpbWl0aXZlc1xuICogLSBCb3hlZCBvYnNlcnZhYmxlc1xuICogLSBPYmplY3RzLCBvYnNlcnZhYmxlIG9iamVjdHNcbiAqIC0gQXJyYXlzLCBvYnNlcnZhYmxlIGFycmF5c1xuICogLSBUeXBlZCBhcnJheXNcbiAqIC0gTWFwcywgb2JzZXJ2YWJsZSBtYXBzXG4gKiAtIFNldHMsIG9ic2VydmFibGUgc2V0c1xuICogLSBUcmVlIG5vZGVzIChvcHRpbWl6ZWQgYnkgdXNpbmcgc25hcHNob3QgY29tcGFyaXNvbiBpbnRlcm5hbGx5KVxuICpcbiAqIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBtb2RlbHMgdGhlIHJlc3VsdCB3aWxsIGJlIGZhbHNlIGlmIHRoZWlyIG1vZGVsIElEcyBhcmUgZGlmZmVyZW50LlxuICpcbiAqIEBwYXJhbSBhIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gYiBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGV5IGFyZSB0aGUgZXF1aXZhbGVudCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWxzKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIC8vIHF1aWNrIGNoZWNrIGZvciByZWZlcmVuY2VcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gdXNlIHNuYXBzaG90cyB0byBjb21wYXJlIGlmIHBvc3NpYmxlXG4gIC8vIHNpbmNlIHNuYXBzaG90cyB1c2Ugc3RydWN0dXJhbCBzaGFyaW5nIGl0IGlzIG1vcmUgbGlrZWx5XG4gIC8vIHRvIHNwZWVkIHVwIGNvbXBhcmlzb25zXG4gIGlmIChpc1RyZWVOb2RlKGEpKSB7XG4gICAgYSA9IGdldFNuYXBzaG90KGEpXG4gIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKGEpKSB7XG4gICAgYSA9IHRvSlMoYSwgdG9KU09wdGlvbnMpXG4gIH1cbiAgaWYgKGlzVHJlZU5vZGUoYikpIHtcbiAgICBiID0gZ2V0U25hcHNob3QoYilcbiAgfSBlbHNlIGlmIChpc09ic2VydmFibGUoYikpIHtcbiAgICBiID0gdG9KUyhiLCB0b0pTT3B0aW9ucylcbiAgfVxuXG4gIHJldHVybiBmYXN0RGVlcEVxdWFsKGEsIGIpXG59XG5cbmNvbnN0IHRvSlNPcHRpb25zID1cbiAgZ2V0TW9ieFZlcnNpb24oKSA+PSA2XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHtcbiAgICAgICAgZXhwb3J0TWFwc0FzT2JqZWN0czogZmFsc2UsXG4gICAgICAgIHJlY3Vyc2VFdmVyeXRoaW5nOiBmYWxzZSxcbiAgICAgIH1cbiIsImltcG9ydCB7IHJlbW92ZSwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGlzUmVzZXJ2ZWRNb2RlbEtleSwgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwsIGlzTW9kZWxTbmFwc2hvdCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGRlZXBFcXVhbHMgfSBmcm9tIFwiLi4vdHJlZVV0aWxzL2RlZXBFcXVhbHNcIlxuaW1wb3J0IHsgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UgfSBmcm9tIFwiLi4vdHdlYWtlci90eXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgd2l0aG91dFR5cGVDaGVja2luZyB9IGZyb20gXCIuLi90d2Vha2VyL3dpdGhvdXRUeXBlQ2hlY2tpbmdcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNBcnJheSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4vZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgZGV0YWNoSWZOZWVkZWQsIHJlY29uY2lsZVNuYXBzaG90LCByZWdpc3RlclJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVTbmFwc2hvdFwiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZk1vZGVsIH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gcmVjb25jaWxlTW9kZWxTbmFwc2hvdChcbiAgdmFsdWU6IGFueSxcbiAgc246IFNuYXBzaG90SW5PZk1vZGVsPEFueU1vZGVsPixcbiAgbW9kZWxQb29sOiBNb2RlbFBvb2wsXG4gIHBhcmVudDogYW55XG4pOiBBbnlNb2RlbCB7XG4gIGNvbnN0IHR5cGUgPSBzblttb2RlbFR5cGVLZXldIVxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0Zvck5hbWUodHlwZSlcbiAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBtb2RlbCB3aXRoIG5hbWUgXCIke3R5cGV9XCIgbm90IGZvdW5kIGluIHRoZSByZWdpc3RyeWApXG4gIH1cblxuICAvLyB0cnkgdG8gdXNlIG1vZGVsIGZyb20gcG9vbCBpZiBwb3NzaWJsZVxuICBjb25zdCBtb2RlbEluUG9vbCA9IG1vZGVsUG9vbC5maW5kTW9kZWxGb3JTbmFwc2hvdChzbilcbiAgaWYgKG1vZGVsSW5Qb29sKSB7XG4gICAgdmFsdWUgPSBtb2RlbEluUG9vbFxuICB9XG5cbiAgLy8gd2UgZG9uJ3QgY2hlY2sgYnkgYWN0dWFsIGluc3RhbmNlIHNpbmNlIHRoZSBjbGFzcyBtaWdodCBiZSBhIGRpZmZlcmVudCBvbmUgZHVlIHRvIGhvdCByZWxvYWRpbmdcbiAgaWYgKCFpc01vZGVsKHZhbHVlKSB8fCB2YWx1ZVttb2RlbFR5cGVLZXldICE9PSB0eXBlKSB7XG4gICAgLy8gZGlmZmVyZW50IGtpbmQgb2YgbW9kZWwgdHlwZSwgbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGVcbiAgICByZXR1cm4gZnJvbVNuYXBzaG90PEFueU1vZGVsPihzbilcbiAgfVxuXG4gIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPilcbiAgaWYgKG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICBjb25zdCBpZCA9IHNuW21vZGVsSWRQcm9wZXJ0eU5hbWVdXG5cbiAgICBpZiAodmFsdWVbbW9kZWxJZEtleV0gIT09IGlkKSB7XG4gICAgICAvLyBkaWZmZXJlbnQgaWQsIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90PEFueU1vZGVsPihzbilcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNBcnJheShwYXJlbnQpKSB7XG4gICAgLy8gbm8gaWQgYW5kIGluc2lkZSBhbiBhcnJheT8gbm8gcmVjb25jaWxpYXRpb24gcG9zc2libGUsXG4gICAgLy8gdW5sZXNzIHRoZSBzbmFwc2hvdHMgYXJlIGVxdWl2YWxlbnQgKG5vdGUgZGVlcCBlcXVhbHMgd2lsbCB1c2UgdGhlIHNuYXBzaG90IG9mIHZhbHVlIGF1dG8pXG4gICAgaWYgKCFkZWVwRXF1YWxzKHZhbHVlLCBzbikpIHtcbiAgICAgIHJldHVybiBmcm9tU25hcHNob3Q8QW55TW9kZWw+KHNuKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1vZGVsT2JqOiBBbnlNb2RlbCA9IHZhbHVlXG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlQ2hhbmdlcyA9IGdldFNuYXBzaG90KG1vZGVsT2JqKVxuXG4gIHdpdGhvdXRUeXBlQ2hlY2tpbmcoKCkgPT4ge1xuICAgIGxldCBwcm9jZXNzZWRTbjogYW55ID0gc25cbiAgICBjb25zdCBtb2RlbENsYXNzOiBNb2RlbENsYXNzPEFueU1vZGVsPiA9IChtb2RlbE9iaiBhcyBhbnkpLmNvbnN0cnVjdG9yXG4gICAgaWYgKG1vZGVsQ2xhc3MuZnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICBwcm9jZXNzZWRTbiA9IG1vZGVsQ2xhc3MuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBtb2RlbE9iai4kXG5cbiAgICAvLyByZW1vdmUgZXhjZXNzIHByb3BzXG4gICAgY29uc3QgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhKVxuICAgIGNvbnN0IGRhdGFLZXlzTGVuID0gZGF0YUtleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gZGF0YUtleXNbaV1cbiAgICAgIGlmICghKGsgaW4gcHJvY2Vzc2VkU24pKSB7XG4gICAgICAgIHJlbW92ZShkYXRhLCBrKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY29uY2lsZSB0aGUgcmVzdFxuICAgIGNvbnN0IHByb2Nlc3NlZFNuS2V5cyA9IE9iamVjdC5rZXlzKHByb2Nlc3NlZFNuKVxuICAgIGNvbnN0IHByb2Nlc3NlZFNuS2V5c0xlbiA9IHByb2Nlc3NlZFNuS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZFNuS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gcHJvY2Vzc2VkU25LZXlzW2ldXG4gICAgICBpZiAoIWlzUmVzZXJ2ZWRNb2RlbEtleShrKSkge1xuICAgICAgICBjb25zdCB2ID0gcHJvY2Vzc2VkU25ba11cblxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGRhdGFba11cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdChvbGRWYWx1ZSwgdiwgbW9kZWxQb29sLCBtb2RlbE9iailcblxuICAgICAgICBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZSwgb2xkVmFsdWUsIG1vZGVsUG9vbClcblxuICAgICAgICBzZXQoZGF0YSwgaywgbmV3VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKG1vZGVsT2JqLCB1bmRlZmluZWQsIHNuYXBzaG90QmVmb3JlQ2hhbmdlcylcblxuICByZXR1cm4gbW9kZWxPYmpcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kZWxTbmFwc2hvdFJlY29uY2lsZXIoKSB7XG4gIHJlZ2lzdGVyUmVjb25jaWxlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5Nb2RlbCwgKHZhbHVlLCBzbiwgbW9kZWxQb29sLCBwYXJlbnQpID0+IHtcbiAgICBpZiAoaXNNb2RlbFNuYXBzaG90KHNuKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZU1vZGVsU25hcHNob3QodmFsdWUsIHNuLCBtb2RlbFBvb2wsIHBhcmVudClcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlT2JqZWN0LCByZW1vdmUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IHdpdGhvdXRUeXBlQ2hlY2tpbmcgfSBmcm9tIFwiLi4vdHdlYWtlci93aXRob3V0VHlwZUNoZWNraW5nXCJcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbFBvb2wgfSBmcm9tIFwiLi4vdXRpbHMvTW9kZWxQb29sXCJcbmltcG9ydCB7IGZyb21TbmFwc2hvdCB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGRldGFjaElmTmVlZGVkLCByZWNvbmNpbGVTbmFwc2hvdCwgcmVnaXN0ZXJSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdEluT2ZPYmplY3QgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiByZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90KFxuICB2YWx1ZTogYW55LFxuICBzbjogU25hcHNob3RJbk9mT2JqZWN0PGFueT4sXG4gIG1vZGVsUG9vbDogTW9kZWxQb29sXG4pOiBvYmplY3Qge1xuICAvLyBwbGFpbiBvYmpcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiAhaXNPYnNlcnZhYmxlT2JqZWN0KHZhbHVlKSkge1xuICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uIHBvc3NpYmxlXG4gICAgcmV0dXJuIGZyb21TbmFwc2hvdChzbilcbiAgfVxuXG4gIGNvbnN0IHBsYWluT2JqID0gdmFsdWVcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVDaGFuZ2VzID0gZ2V0U25hcHNob3QocGxhaW5PYmopXG5cbiAgd2l0aG91dFR5cGVDaGVja2luZygoKSA9PiB7XG4gICAgLy8gcmVtb3ZlIGV4Y2VzcyBwcm9wc1xuICAgIGNvbnN0IHBsYWluT2JqS2V5cyA9IE9iamVjdC5rZXlzKHBsYWluT2JqKVxuICAgIGNvbnN0IHBsYWluT2JqS2V5c0xlbiA9IHBsYWluT2JqS2V5cy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWluT2JqS2V5c0xlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gcGxhaW5PYmpLZXlzW2ldXG4gICAgICBpZiAoIShrIGluIHNuKSkge1xuICAgICAgICByZW1vdmUocGxhaW5PYmosIGspXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVjb25jaWxlIHRoZSByZXN0XG4gICAgY29uc3Qgc25LZXlzID0gT2JqZWN0LmtleXMoc24pXG4gICAgY29uc3Qgc25LZXlzTGVuID0gc25LZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc25LZXlzTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBzbktleXNbaV1cbiAgICAgIGNvbnN0IHYgPSBzbltrXVxuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHBsYWluT2JqW2tdXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KG9sZFZhbHVlLCB2LCBtb2RlbFBvb2wsIHBsYWluT2JqKVxuXG4gICAgICBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZSwgb2xkVmFsdWUsIG1vZGVsUG9vbClcblxuICAgICAgc2V0KHBsYWluT2JqLCBrLCBuZXdWYWx1ZSlcbiAgICB9XG4gIH0pXG5cbiAgcnVuVHlwZUNoZWNraW5nQWZ0ZXJDaGFuZ2UocGxhaW5PYmosIHVuZGVmaW5lZCwgc25hcHNob3RCZWZvcmVDaGFuZ2VzKVxuXG4gIHJldHVybiBwbGFpbk9ialxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJQbGFpbk9iamVjdFNuYXBzaG90UmVjb25jaWxlcigpIHtcbiAgcmVnaXN0ZXJSZWNvbmNpbGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LlBsYWluT2JqZWN0LCAodmFsdWUsIHNuLCBtb2RlbFBvb2wpID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChzbikpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90KHZhbHVlLCBzbiwgbW9kZWxQb29sKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyByZWdpc3RlckFycmF5U25hcHNob3RSZWNvbmNpbGVyIH0gZnJvbSBcIi4vcmVjb25jaWxlQXJyYXlTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckZyb3plblNuYXBzaG90UmVjb25jaWxlciB9IGZyb20gXCIuL3JlY29uY2lsZUZyb3plblNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyTW9kZWxTbmFwc2hvdFJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVNb2RlbFNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyUGxhaW5PYmplY3RTbmFwc2hvdFJlY29uY2lsZXIgfSBmcm9tIFwiLi9yZWNvbmNpbGVQbGFpbk9iamVjdFNuYXBzaG90XCJcblxubGV0IGRlZmF1bHRSZWNvbmNpbGVyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0UmVjb25jaWxlcnMoKSB7XG4gIGlmIChkZWZhdWx0UmVjb25jaWxlcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdFJlY29uY2lsZXJzUmVnaXN0ZXJlZCA9IHRydWVcblxuICByZWdpc3RlckFycmF5U25hcHNob3RSZWNvbmNpbGVyKClcbiAgcmVnaXN0ZXJGcm96ZW5TbmFwc2hvdFJlY29uY2lsZXIoKVxuICByZWdpc3Rlck1vZGVsU25hcHNob3RSZWNvbmNpbGVyKClcbiAgcmVnaXN0ZXJQbGFpbk9iamVjdFNuYXBzaG90UmVjb25jaWxlcigpXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbElkS2V5LCBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzIH0gZnJvbSBcIi4uL3BhcmVudFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc01hcCwgaXNQcmltaXRpdmUsIGlzU2V0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxQb29sIH0gZnJvbSBcIi4uL3V0aWxzL01vZGVsUG9vbFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuL2dldFNuYXBzaG90XCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFJlY29uY2lsZXJzIH0gZnJvbSBcIi4vcmVnaXN0ZXJEZWZhdWx0UmVjb25jaWxlcnNcIlxuXG50eXBlIFJlY29uY2lsZXIgPSAodmFsdWU6IGFueSwgc246IGFueSwgbW9kZWxQb29sOiBNb2RlbFBvb2wsIHBhcmVudDogYW55KSA9PiBhbnkgfCB1bmRlZmluZWRcblxuY29uc3QgcmVjb25jaWxlcnM6IHsgcHJpb3JpdHk6IG51bWJlcjsgcmVjb25jaWxlcjogUmVjb25jaWxlciB9W10gPSBbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZWNvbmNpbGVyKHByaW9yaXR5OiBudW1iZXIsIHJlY29uY2lsZXI6IFJlY29uY2lsZXIpOiB2b2lkIHtcbiAgcmVjb25jaWxlcnMucHVzaCh7IHByaW9yaXR5LCByZWNvbmNpbGVyIH0pXG4gIHJlY29uY2lsZXJzLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlU25hcHNob3QodmFsdWU6IGFueSwgc246IGFueSwgbW9kZWxQb29sOiBNb2RlbFBvb2wsIHBhcmVudDogYW55KTogYW55IHtcbiAgaWYgKGlzUHJpbWl0aXZlKHNuKSkge1xuICAgIHJldHVybiBzblxuICB9XG5cbiAgLy8gaWYgdGhlIHNuYXBzaG90IHBhc3NlZCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG9uZVxuICAvLyB0aGVuIGl0IGlzIGFscmVhZHkgcmVjb25jaWxlZFxuICBpZiAoZ2V0U25hcHNob3QodmFsdWUpID09PSBzbikge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmVnaXN0ZXJEZWZhdWx0UmVjb25jaWxlcnMoKVxuXG4gIGNvbnN0IHJlY29uY2lsZXJzTGVuID0gcmVjb25jaWxlcnMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjb25jaWxlcnNMZW47IGkrKykge1xuICAgIGNvbnN0IHsgcmVjb25jaWxlciB9ID0gcmVjb25jaWxlcnNbaV1cbiAgICBjb25zdCByZXQgPSByZWNvbmNpbGVyKHZhbHVlLCBzbiwgbW9kZWxQb29sLCBwYXJlbnQpXG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTWFwKHNuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhIHNuYXBzaG90IG11c3Qgbm90IGNvbnRhaW4gbWFwc1wiKVxuICB9XG5cbiAgaWYgKGlzU2V0KHNuKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhIHNuYXBzaG90IG11c3Qgbm90IGNvbnRhaW4gc2V0c1wiKVxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgc25hcHNob3QgLSAke3NufWApXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRhY2hJZk5lZWRlZChuZXdWYWx1ZTogYW55LCBvbGRWYWx1ZTogYW55LCBtb2RlbFBvb2w6IE1vZGVsUG9vbCkge1xuICAvLyBlZGdlIGNhc2UgZm9yIHdoZW4gd2UgYXJlIHN3YXBwaW5nIG1vZGVscyBhcm91bmQgdGhlIHRyZWVcblxuICBpZiAobmV3VmFsdWUgPT09IG9sZFZhbHVlKSB7XG4gICAgLy8gYWxyZWFkeSB3aGVyZSBpdCBzaG91bGQgYmVcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChcbiAgICBpc01vZGVsKG5ld1ZhbHVlKSAmJlxuICAgIG1vZGVsUG9vbC5maW5kTW9kZWxCeVR5cGVBbmRJZChuZXdWYWx1ZVttb2RlbFR5cGVLZXldLCBuZXdWYWx1ZVttb2RlbElkS2V5XSlcbiAgKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoSW5jbHVkaW5nRGF0YU9iamVjdHMobmV3VmFsdWUpXG4gICAgaWYgKHBhcmVudFBhdGgpIHtcbiAgICAgIHNldChwYXJlbnRQYXRoLnBhcmVudCwgcGFyZW50UGF0aC5wYXRoLCBudWxsKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVtb3ZlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL3dyYXBJbkFjdGlvblwiXG5pbXBvcnQgeyBtb2RlbFRvRGF0YU5vZGUgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBQYXRoRWxlbWVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFR5cGVzXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi4vcGF0Y2gvUGF0Y2hcIlxuaW1wb3J0IHsgcmVjb25jaWxlU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvcmVjb25jaWxlU25hcHNob3RcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlLCBpc0FycmF5LCBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsUG9vbCB9IGZyb20gXCIuLi91dGlscy9Nb2RlbFBvb2xcIlxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGdpdmVuIHBhdGNoZXMgdG8gdGhlIGdpdmVuIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIG5vZGUgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBwYXRjaGVzIExpc3Qgb2YgcGF0Y2hlcyB0byBhcHBseS5cbiAqIEBwYXJhbSByZXZlcnNlIFdoZXRoZXIgcGF0Y2hlcyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaGVzKFxuICBub2RlOiBvYmplY3QsXG4gIHBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+IHwgUmVhZG9ubHlBcnJheTxSZWFkb25seUFycmF5PFBhdGNoPj4sXG4gIHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZVxuKTogdm9pZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgaWYgKHBhdGNoZXMubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyYXBwZWRJbnRlcm5hbEFwcGx5UGF0Y2hlcygpLmNhbGwobm9kZSwgcGF0Y2hlcywgcmV2ZXJzZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlQYXRjaGVzKFxuICB0aGlzOiBvYmplY3QsXG4gIHBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+IHwgUmVhZG9ubHlBcnJheTxSZWFkb25seUFycmF5PFBhdGNoPj4sXG4gIHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZVxuKTogdm9pZCB7XG4gIGNvbnN0IG9iaiA9IHRoaXNcbiAgY29uc3QgbW9kZWxQb29sID0gbmV3IE1vZGVsUG9vbChvYmopXG5cbiAgaWYgKHJldmVyc2UpIHtcbiAgICBsZXQgaSA9IHBhdGNoZXMubGVuZ3RoXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3QgcCA9IHBhdGNoZXNbaV1cbiAgICAgIGlmICghaXNBcnJheShwKSkge1xuICAgICAgICBhcHBseVNpbmdsZVBhdGNoKG9iaiwgcCBhcyBQYXRjaCwgbW9kZWxQb29sKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGogPSBwLmxlbmd0aFxuICAgICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgICAgYXBwbHlTaW5nbGVQYXRjaChvYmosIHBbal0sIG1vZGVsUG9vbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsZW4gPSBwYXRjaGVzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRjaGVzW2ldXG4gICAgICBpZiAoIWlzQXJyYXkocCkpIHtcbiAgICAgICAgYXBwbHlTaW5nbGVQYXRjaChvYmosIHAgYXMgUGF0Y2gsIG1vZGVsUG9vbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxlbjIgPSBwLmxlbmd0aFxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbjI7IGorKykge1xuICAgICAgICAgIGFwcGx5U2luZ2xlUGF0Y2gob2JqLCBwW2pdLCBtb2RlbFBvb2wpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlQYXRjaGVzID0gbGF6eSgoKSA9PlxuICB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogQnVpbHRJbkFjdGlvbi5BcHBseVBhdGNoZXMsXG4gICAgZm46IGludGVybmFsQXBwbHlQYXRjaGVzLFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG5cbmZ1bmN0aW9uIGFwcGx5U2luZ2xlUGF0Y2gob2JqOiBvYmplY3QsIHBhdGNoOiBQYXRjaCwgbW9kZWxQb29sOiBNb2RlbFBvb2wpOiB2b2lkIHtcbiAgY29uc3QgeyB0YXJnZXQsIHByb3AgfSA9IHBhdGhBcnJheVRvT2JqZWN0QW5kUHJvcChvYmosIHBhdGNoLnBhdGgpXG5cbiAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICBjb25zdCBpbmRleCA9ICtwcm9wIVxuICAgICAgICAvLyByZWNvbmNpbGUgZnJvbSB0aGUgcG9vbCBpZiBwb3NzaWJsZVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29uY2lsZVNuYXBzaG90KHVuZGVmaW5lZCwgcGF0Y2gudmFsdWUsIG1vZGVsUG9vbCwgdGFyZ2V0KVxuICAgICAgICB0YXJnZXQuc3BsaWNlKGluZGV4LCAwLCBuZXdWYWx1ZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gK3Byb3AhXG4gICAgICAgIC8vIG5vIHJlY29uY2lsaWF0aW9uLCByZW1vdmluZ1xuICAgICAgICB0YXJnZXQuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgIGlmIChwcm9wID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgdGFyZ2V0Lmxlbmd0aCA9IHBhdGNoLnZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSArcHJvcCFcbiAgICAgICAgICAvLyB0cnkgdG8gcmVjb25jaWxlXG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdCh0YXJnZXRbaW5kZXhdLCBwYXRjaC52YWx1ZSwgbW9kZWxQb29sLCB0YXJnZXQpXG4gICAgICAgICAgc2V0KHRhcmdldCwgaW5kZXggYXMgYW55LCBuZXdWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246ICR7KHBhdGNoIGFzIGFueSkub3B9YClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgIC8vIHJlY29uY2lsZSBmcm9tIHRoZSBwb29sIGlmIHBvc3NpYmxlXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVjb25jaWxlU25hcHNob3QodW5kZWZpbmVkLCBwYXRjaC52YWx1ZSwgbW9kZWxQb29sLCB0YXJnZXQpXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3AsIG5ld1ZhbHVlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgLy8gbm8gcmVjb25jaWxpYXRpb24sIHJlbW92aW5nXG4gICAgICAgIHJlbW92ZSh0YXJnZXQsIHByb3ApXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgLy8gdHJ5IHRvIHJlY29uY2lsZVxuICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHR3ZWFrIHRoZSBwb29sIHNpbmNlIHJlY29uY2lsZVNuYXBzaG90IHdpbGwgZG8gdGhhdCBmb3IgdXNcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbmNpbGVTbmFwc2hvdCh0YXJnZXRbcHJvcCFdLCBwYXRjaC52YWx1ZSwgbW9kZWxQb29sLCB0YXJnZXQpXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3AsIG5ld1ZhbHVlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246ICR7KHBhdGNoIGFzIGFueSkub3B9YClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0aEFycmF5VG9PYmplY3RBbmRQcm9wKFxuICBvYmo6IG9iamVjdCxcbiAgcGF0aDogUGF0Y2hbXCJwYXRoXCJdXG4pOiB7IHRhcmdldDogYW55OyBwcm9wPzogUGF0aEVsZW1lbnQgfSB7XG4gIGlmIChpbkRldk1vZGUoKSkge1xuICAgIGlmICghaXNBcnJheShwYXRoKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRoOiAke3BhdGh9YClcbiAgICB9XG4gIH1cblxuICBsZXQgdGFyZ2V0OiBhbnkgPSBtb2RlbFRvRGF0YU5vZGUob2JqKVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQsXG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gcGF0aC5sZW5ndGggLSAyOyBpKyspIHtcbiAgICB0YXJnZXQgPSBtb2RlbFRvRGF0YU5vZGUodGFyZ2V0W3BhdGhbaV1dKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0YXJnZXQsXG4gICAgcHJvcDogcGF0aFtwYXRoLmxlbmd0aCAtIDFdLFxuICB9XG59XG4iLCJpbXBvcnQgeyBpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQgfSBmcm9tIFwiLi4vZ2xvYmFsQ29uZmlnL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBnZXRNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBkYXRhVG9Nb2RlbE5vZGUgfSBmcm9tIFwiLi4vcGFyZW50L2NvcmVcIlxuaW1wb3J0IHsgZmluZFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvZmluZFBhcmVudFwiXG5pbXBvcnQgeyBpbnRlcm5hbEFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaC9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgSW50ZXJuYWxQYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoL2VtaXRQYXRjaFwiXG5pbXBvcnQgeyBpbnRlcm5hbEFwcGx5U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvYXBwbHlTbmFwc2hvdFwiXG5pbXBvcnQgeyBpbnZhbGlkYXRlQ2FjaGVkVHlwZUNoZWNrZXJSZXN1bHQgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHsgcnVuV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzIH0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgeyBpc1R5cGVDaGVja2luZ0FsbG93ZWQgfSBmcm9tIFwiLi93aXRob3V0VHlwZUNoZWNraW5nXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKFxuICBvYmo6IG9iamVjdCxcbiAgcGF0Y2hSZWNvcmRlcjogSW50ZXJuYWxQYXRjaFJlY29yZGVyIHwgdW5kZWZpbmVkLFxuICBzbmFwc2hvdEJlZm9yZUNoYW5nZXM/OiBvYmplY3Rcbikge1xuICBpZiAoIWlzVHlwZUNoZWNraW5nQWxsb3dlZCgpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBpbnZhbGlkYXRlIHR5cGUgY2hlY2sgY2FjaGVkIHJlc3VsdFxuICBpbnZhbGlkYXRlQ2FjaGVkVHlwZUNoZWNrZXJSZXN1bHQob2JqKVxuXG4gIGlmIChpc01vZGVsQXV0b1R5cGVDaGVja2luZ0VuYWJsZWQoKSkge1xuICAgIGNvbnN0IHBhcmVudE1vZGVsV2l0aFR5cGVDaGVja2VyID0gZmluZE5lYXJlc3RQYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlcihvYmopXG4gICAgaWYgKHBhcmVudE1vZGVsV2l0aFR5cGVDaGVja2VyKSB7XG4gICAgICBjb25zdCBlcnIgPSBwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlci50eXBlQ2hlY2soKVxuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBxdWlldGx5IGFwcGx5IGludmVyc2UgcGF0Y2hlcyAoZG8gbm90IGdlbmVyYXRlIHBhdGNoZXMsIHNuYXBzaG90cywgYWN0aW9ucywgZXRjKVxuICAgICAgICBydW5XaXRob3V0U25hcHNob3RPclBhdGNoZXMoKCkgPT4ge1xuICAgICAgICAgIGlmIChwYXRjaFJlY29yZGVyKSB7XG4gICAgICAgICAgICBpbnRlcm5hbEFwcGx5UGF0Y2hlcy5jYWxsKG9iaiwgcGF0Y2hSZWNvcmRlci5pbnZQYXRjaGVzLCB0cnVlKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc25hcHNob3RCZWZvcmVDaGFuZ2VzKSB7XG4gICAgICAgICAgICBpbnRlcm5hbEFwcGx5U25hcHNob3QuY2FsbChvYmosIHNuYXBzaG90QmVmb3JlQ2hhbmdlcylcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgYXBwbHkgcGF0Y2hlcyBpdCB3aWxsIGJlIHR5cGUgY2hlY2tlZCBhZ2FpbiBhbmQgaXRzIHJlc3VsdCBjYWNoZWQgb25jZSBtb3JlXG4gICAgICAgIGVyci50aHJvdyhwYXJlbnRNb2RlbFdpdGhUeXBlQ2hlY2tlcilcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBGaW5kcyB0aGUgY2xvc2VzdCBwYXJlbnQgbW9kZWwgdGhhdCBoYXMgYSB0eXBlIGNoZWNrZXIgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gY2hpbGRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGZpbmROZWFyZXN0UGFyZW50TW9kZWxXaXRoVHlwZUNoZWNrZXIoY2hpbGQ6IG9iamVjdCk6IEFueU1vZGVsIHwgdW5kZWZpbmVkIHtcbiAgLy8gY2hpbGQgbWlnaHQgYmUgLiQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHBhcmVudCBtb2RlbCBpbiB0aGF0IGNhc2VcbiAgY29uc3QgYWN0dWFsQ2hpbGQgPSBkYXRhVG9Nb2RlbE5vZGUoY2hpbGQpXG5cbiAgaWYgKGNoaWxkICE9PSBhY3R1YWxDaGlsZCkge1xuICAgIGNoaWxkID0gYWN0dWFsQ2hpbGRcbiAgICBpZiAoaXNNb2RlbChjaGlsZCkgJiYgISFnZXRNb2RlbE1ldGFkYXRhKGNoaWxkKS5kYXRhVHlwZSkge1xuICAgICAgcmV0dXJuIGNoaWxkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbmRQYXJlbnQoY2hpbGQsIChwYXJlbnQpID0+IHtcbiAgICByZXR1cm4gaXNNb2RlbChwYXJlbnQpICYmICEhZ2V0TW9kZWxNZXRhZGF0YShwYXJlbnQpLmRhdGFUeXBlXG4gIH0pXG59XG4iLCJpbXBvcnQge1xuICBpbnRlcmNlcHQsXG4gIElPYmplY3REaWRDaGFuZ2UsXG4gIElPYmplY3RXaWxsQ2hhbmdlLFxuICBpc09ic2VydmFibGVPYmplY3QsXG4gIG9ic2VydmFibGUsXG4gIG9ic2VydmUsXG4gIHNldCxcbn0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgYXNzZXJ0Q2FuV3JpdGUgfSBmcm9tIFwiLi4vYWN0aW9uL3Byb3RlY3Rpb25cIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJbmZvRm9yTmFtZSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHsgZGF0YVRvTW9kZWxOb2RlIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyBJbnRlcm5hbFBhdGNoUmVjb3JkZXIgfSBmcm9tIFwiLi4vcGF0Y2gvZW1pdFBhdGNoXCJcbmltcG9ydCB7XG4gIGZyZWV6ZUludGVybmFsU25hcHNob3QsXG4gIGdldEludGVybmFsU25hcHNob3QsXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QsXG4gIFNuYXBzaG90VHJhbnNmb3JtRm4sXG4gIHVwZGF0ZUludGVybmFsU25hcHNob3QsXG59IGZyb20gXCIuLi9zbmFwc2hvdC9pbnRlcm5hbFwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzLCB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgcmVnaXN0ZXJUd2Vha2VyLCB0cnlVbnR3ZWFrLCB0d2VhayB9IGZyb20gXCIuL3R3ZWFrXCJcbmltcG9ydCB7IFR3ZWFrZXJQcmlvcml0eSB9IGZyb20gXCIuL1R3ZWFrZXJQcmlvcml0eVwiXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuL3R5cGVDaGVja2luZ1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d2Vha1BsYWluT2JqZWN0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgdmFsdWU6IFQsXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcbiAgc25hcHNob3RNb2RlbFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZG9Ob3RUd2Vha0NoaWxkcmVuOiBib29sZWFuLFxuICBpc0RhdGFPYmplY3Q6IGJvb2xlYW5cbik6IFQge1xuICBjb25zdCBvcmlnaW5hbE9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHZhbHVlXG4gIGNvbnN0IHR3ZWFrZWRPYmogPSBpc09ic2VydmFibGVPYmplY3Qob3JpZ2luYWxPYmopXG4gICAgPyBvcmlnaW5hbE9ialxuICAgIDogb2JzZXJ2YWJsZS5vYmplY3Qoe30sIHVuZGVmaW5lZCwgb2JzZXJ2YWJsZU9wdGlvbnMpXG5cbiAgbGV0IGludGVyY2VwdERpc3Bvc2VyOiAoKSA9PiB2b2lkXG4gIGxldCBvYnNlcnZlRGlzcG9zZXI6ICgpID0+IHZvaWRcblxuICBjb25zdCB1bnR3ZWFrID0gKCkgPT4ge1xuICAgIGludGVyY2VwdERpc3Bvc2VyKClcbiAgICBvYnNlcnZlRGlzcG9zZXIoKVxuICB9XG5cbiAgdHdlYWtlZE9iamVjdHMuc2V0KHR3ZWFrZWRPYmosIHVudHdlYWspXG4gIHNldFBhcmVudCh7XG4gICAgdmFsdWU6IHR3ZWFrZWRPYmosXG4gICAgcGFyZW50UGF0aCxcbiAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgIGlzRGF0YU9iamVjdCxcbiAgICAvLyBhbiBvYmplY3Qgc2hvdWxkbid0IGJlIGNsb25lZFxuICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcbiAgfSlcblxuICBsZXQgdW50cmFuc2Zvcm1lZFNuOiBhbnkgPSB7fVxuXG4gIC8vIHN1YnN0aXR1dGUgaW5pdGlhbCB2YWx1ZXMgYnkgdHdlYWtlZCB2YWx1ZXNcbiAgY29uc3Qgb3JpZ2luYWxPYmpLZXlzID0gT2JqZWN0LmtleXMob3JpZ2luYWxPYmopXG4gIGNvbnN0IG9yaWdpbmFsT2JqS2V5c0xlbiA9IG9yaWdpbmFsT2JqS2V5cy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5hbE9iaktleXNMZW47IGkrKykge1xuICAgIGNvbnN0IGsgPSBvcmlnaW5hbE9iaktleXNbaV1cbiAgICBjb25zdCB2ID0gb3JpZ2luYWxPYmpba11cblxuICAgIGlmIChpc1ByaW1pdGl2ZSh2KSkge1xuICAgICAgaWYgKCFkb05vdFR3ZWFrQ2hpbGRyZW4pIHtcbiAgICAgICAgc2V0KHR3ZWFrZWRPYmosIGssIHYpXG4gICAgICB9XG4gICAgICB1bnRyYW5zZm9ybWVkU25ba10gPSB2XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhdGggPSB7IHBhcmVudDogdHdlYWtlZE9iaiwgcGF0aDogayB9XG5cbiAgICAgIGxldCB0d2Vha2VkVmFsdWVcbiAgICAgIGlmIChkb05vdFR3ZWFrQ2hpbGRyZW4pIHtcbiAgICAgICAgdHdlYWtlZFZhbHVlID0gdlxuICAgICAgICBzZXRQYXJlbnQoe1xuICAgICAgICAgIHZhbHVlOiB0d2Vha2VkVmFsdWUsXG4gICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXG4gICAgICAgICAgLy8gdGhlIHZhbHVlIGlzIGFscmVhZHkgYSBuZXcgdmFsdWUgKHRoZSByZXN1bHQgb2YgYSBmcm9tU25hcHNob3QpXG4gICAgICAgICAgY2xvbmVJZkFwcGxpY2FibGU6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHdlYWtlZFZhbHVlID0gdHdlYWsodiwgcGF0aClcbiAgICAgICAgc2V0KHR3ZWFrZWRPYmosIGssIHR3ZWFrZWRWYWx1ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWVTbiA9IGdldEludGVybmFsU25hcHNob3QodHdlYWtlZFZhbHVlKSFcbiAgICAgIHVudHJhbnNmb3JtZWRTbltrXSA9IHZhbHVlU24udHJhbnNmb3JtZWRcbiAgICB9XG4gIH1cblxuICBsZXQgdHJhbnNmb3JtRm46IFNuYXBzaG90VHJhbnNmb3JtRm4gfCB1bmRlZmluZWRcbiAgaWYgKHNuYXBzaG90TW9kZWxUeXBlKSB7XG4gICAgdW50cmFuc2Zvcm1lZFNuW21vZGVsVHlwZUtleV0gPSBzbmFwc2hvdE1vZGVsVHlwZVxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZShzbmFwc2hvdE1vZGVsVHlwZSlcbiAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShgbW9kZWwgd2l0aCBuYW1lIFwiJHtzbmFwc2hvdE1vZGVsVHlwZX1cIiBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5YClcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFRyYW5zZm9ybUZuID0gKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPikudG9TbmFwc2hvdFByb2Nlc3NvclxuICAgIGlmIChvcmlnaW5hbFRyYW5zZm9ybUZuKSB7XG4gICAgICB0cmFuc2Zvcm1GbiA9IChzbikgPT4gb3JpZ2luYWxUcmFuc2Zvcm1GbihzbiwgZGF0YVRvTW9kZWxOb2RlKHR3ZWFrZWRPYmopKVxuICAgIH1cbiAgfVxuXG4gIHNldE5ld0ludGVybmFsU25hcHNob3QoXG4gICAgaXNEYXRhT2JqZWN0ID8gZGF0YVRvTW9kZWxOb2RlKHR3ZWFrZWRPYmopIDogdHdlYWtlZE9iaixcbiAgICB1bnRyYW5zZm9ybWVkU24sXG4gICAgdHJhbnNmb3JtRm5cbiAgKVxuXG4gIGludGVyY2VwdERpc3Bvc2VyID0gaW50ZXJjZXB0KHR3ZWFrZWRPYmosIGludGVyY2VwdE9iamVjdE11dGF0aW9uKVxuICBvYnNlcnZlRGlzcG9zZXIgPSBvYnNlcnZlKHR3ZWFrZWRPYmosIG9iamVjdERpZENoYW5nZSlcblxuICByZXR1cm4gdHdlYWtlZE9iaiBhcyBhbnlcbn1cblxuY29uc3Qgb2JzZXJ2YWJsZU9wdGlvbnMgPSB7XG4gIGRlZXA6IGZhbHNlLFxufVxuXG5mdW5jdGlvbiBvYmplY3REaWRDaGFuZ2UoY2hhbmdlOiBJT2JqZWN0RGlkQ2hhbmdlKTogdm9pZCB7XG4gIGNvbnN0IG9iaiA9IGNoYW5nZS5vYmplY3RcbiAgY29uc3QgYWN0dWFsTm9kZSA9IGRhdGFUb01vZGVsTm9kZShvYmopXG4gIGxldCB7IHVudHJhbnNmb3JtZWQ6IG9sZFVudHJhbnNmb3JtZWRTbiB9ID0gZ2V0SW50ZXJuYWxTbmFwc2hvdChhY3R1YWxOb2RlKSFcblxuICBjb25zdCBwYXRjaFJlY29yZGVyID0gbmV3IEludGVybmFsUGF0Y2hSZWNvcmRlcigpXG5cbiAgbGV0IG11dGF0ZTogKChzbjogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICBjYXNlIFwiYWRkXCI6XG4gICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAge1xuICAgICAgICBjb25zdCBrID0gY2hhbmdlLm5hbWVcbiAgICAgICAgY29uc3QgdmFsID0gY2hhbmdlLm5ld1ZhbHVlXG5cbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2xkVW50cmFuc2Zvcm1lZFNuW2tdXG5cbiAgICAgICAgbGV0IG5ld1ZhbDogYW55XG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWwpKSB7XG4gICAgICAgICAgbmV3VmFsID0gdmFsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVTbiA9IGdldEludGVybmFsU25hcHNob3QodmFsKSFcbiAgICAgICAgICBuZXdWYWwgPSB2YWx1ZVNuLnRyYW5zZm9ybWVkXG4gICAgICAgIH1cblxuICAgICAgICBtdXRhdGUgPSAoc24pID0+IHtcbiAgICAgICAgICBzbltrXSA9IG5ld1ZhbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IFtrIGFzIHN0cmluZ11cbiAgICAgICAgaWYgKGNoYW5nZS50eXBlID09PSBcImFkZFwiKSB7XG4gICAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG5ld1ZhbCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG9sZFZhbCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcInJlbW92ZVwiOlxuICAgICAge1xuICAgICAgICBjb25zdCBrID0gY2hhbmdlLm5hbWVcbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2xkVW50cmFuc2Zvcm1lZFNuW2tdXG4gICAgICAgIG11dGF0ZSA9IChzbikgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBzbltrXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IFtrIGFzIHN0cmluZ11cblxuICAgICAgICBwYXRjaFJlY29yZGVyLnJlY29yZChcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG9sZFZhbCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgfVxuXG4gIHJ1blR5cGVDaGVja2luZ0FmdGVyQ2hhbmdlKG9iaiwgcGF0Y2hSZWNvcmRlcilcblxuICBpZiAoIXJ1bm5pbmdXaXRob3V0U25hcHNob3RPclBhdGNoZXMgJiYgbXV0YXRlISkge1xuICAgIHVwZGF0ZUludGVybmFsU25hcHNob3QoYWN0dWFsTm9kZSwgbXV0YXRlKVxuICAgIHBhdGNoUmVjb3JkZXIuZW1pdChhY3R1YWxOb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyY2VwdE9iamVjdE11dGF0aW9uKGNoYW5nZTogSU9iamVjdFdpbGxDaGFuZ2UpIHtcbiAgYXNzZXJ0Q2FuV3JpdGUoKVxuXG4gIGlmICh0eXBlb2YgY2hhbmdlLm5hbWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwic3ltYm9sIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIilcbiAgfVxuXG4gIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICBjYXNlIFwiYWRkXCI6XG4gICAgICBjaGFuZ2UubmV3VmFsdWUgPSB0d2VhayhjaGFuZ2UubmV3VmFsdWUsIHtcbiAgICAgICAgcGFyZW50OiBjaGFuZ2Uub2JqZWN0LFxuICAgICAgICBwYXRoOiBcIlwiICsgY2hhbmdlLm5hbWUsXG4gICAgICB9KVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgY29uc3Qgb2xkVmFsID0gY2hhbmdlLm9iamVjdFtjaGFuZ2UubmFtZV1cbiAgICAgIHR3ZWFrKG9sZFZhbCwgdW5kZWZpbmVkKVxuICAgICAgdHJ5VW50d2VhayhvbGRWYWwpXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgY29uc3Qgb2xkVmFsID0gY2hhbmdlLm9iamVjdFtjaGFuZ2UubmFtZV1cbiAgICAgIHR3ZWFrKG9sZFZhbCwgdW5kZWZpbmVkKVxuICAgICAgdHJ5VW50d2VhayhvbGRWYWwpXG5cbiAgICAgIGNoYW5nZS5uZXdWYWx1ZSA9IHR3ZWFrKGNoYW5nZS5uZXdWYWx1ZSwge1xuICAgICAgICBwYXJlbnQ6IGNoYW5nZS5vYmplY3QsXG4gICAgICAgIHBhdGg6IFwiXCIgKyBjaGFuZ2UubmFtZSxcbiAgICAgIH0pXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2Vcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGxhaW5PYmplY3RUd2Vha2VyKCkge1xuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5LlBsYWluT2JqZWN0LCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcbiAgICAvLyBwbGFpbiBvYmplY3RcbiAgICBpZiAoaXNPYnNlcnZhYmxlT2JqZWN0KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHR3ZWFrUGxhaW5PYmplY3QodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PiwgcGFyZW50UGF0aCwgdW5kZWZpbmVkLCBmYWxzZSwgZmFsc2UpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyQXJyYXlUd2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtBcnJheVwiXG5pbXBvcnQgeyByZWdpc3RlckZyb3plblR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha0Zyb3plblwiXG5pbXBvcnQgeyByZWdpc3Rlck1vZGVsVHdlYWtlciB9IGZyb20gXCIuL3R3ZWFrTW9kZWxcIlxuaW1wb3J0IHsgcmVnaXN0ZXJQbGFpbk9iamVjdFR3ZWFrZXIgfSBmcm9tIFwiLi90d2Vha1BsYWluT2JqZWN0XCJcblxubGV0IGRlZmF1bHRUd2Vha2Vyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnMoKSB7XG4gIGlmIChkZWZhdWx0VHdlYWtlcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdFR3ZWFrZXJzUmVnaXN0ZXJlZCA9IHRydWVcblxuICByZWdpc3RlckFycmF5VHdlYWtlcigpXG4gIHJlZ2lzdGVyRnJvemVuVHdlYWtlcigpXG4gIHJlZ2lzdGVyTW9kZWxUd2Vha2VyKClcbiAgcmVnaXN0ZXJQbGFpbk9iamVjdFR3ZWFrZXIoKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCB9IGZyb20gXCIuLi9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB7IGdldE9iamVjdENoaWxkcmVuIH0gZnJvbSBcIi4uL3BhcmVudC9jb3JlT2JqZWN0Q2hpbGRyZW5cIlxuaW1wb3J0IHsgZmFzdEdldFBhcmVudCwgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyB1bnNldEludGVybmFsU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvaW50ZXJuYWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZUNoZWNrXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNNYXAsIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNTZXQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0LCB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgcmVnaXN0ZXJEZWZhdWx0VHdlYWtlcnMgfSBmcm9tIFwiLi9yZWdpc3RlckRlZmF1bHRUd2Vha2Vyc1wiXG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IChhcnJheSwgcGxhaW4gb2JqZWN0KSBpbnRvIGEgdHJlZSBub2RlLFxuICogd2hpY2ggdGhlbiBjYW4gYWNjZXB0IGNhbGxzIHRvIGBnZXRQYXJlbnRgLCBgZ2V0U25hcHNob3RgLCBldGMuXG4gKiBJZiBhIHRyZWUgbm9kZSBpcyBwYXNzZWQgaXQgd2lsbCByZXR1cm4gdGhlIHBhc3NlZCBhcmd1bWVudCBkaXJlY3RseS5cbiAqIEFkZGl0aW9uYWxseSB0aGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgdHlwZSBwYXNzZWQgdG8gY2hlY2sgdGhlIHZhbHVlXG4gKiBjb25mb3JtcyB0byB0aGUgdHlwZSB3aGVuIG1vZGVsIGF1dG8gdHlwZSBjaGVja2luZyBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gdHVybiBpbnRvIGEgdHJlZSBub2RlLlxuICogQHJldHVybnMgVGhlIG9iamVjdCBhcyBhIHRyZWUgbm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVHJlZU5vZGU8VFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUsIFYgZXh0ZW5kcyBUeXBlVG9EYXRhPFRUeXBlPj4oXG4gIHR5cGU6IFRUeXBlLFxuICB2YWx1ZTogVlxuKTogVlxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCAoYXJyYXksIHBsYWluIG9iamVjdCkgaW50byBhIHRyZWUgbm9kZSxcbiAqIHdoaWNoIHRoZW4gY2FuIGFjY2VwdCBjYWxscyB0byBgZ2V0UGFyZW50YCwgYGdldFNuYXBzaG90YCwgZXRjLlxuICogSWYgYSB0cmVlIG5vZGUgaXMgcGFzc2VkIGl0IHdpbGwgcmV0dXJuIHRoZSBwYXNzZWQgYXJndW1lbnQgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHZhbHVlIE9iamVjdCB0byB0dXJuIGludG8gYSB0cmVlIG5vZGUuXG4gKiBAcmV0dXJucyBUaGUgb2JqZWN0IGFzIGEgdHJlZSBub2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UcmVlTm9kZTxUIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVCk6IFRcblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIHRvVHJlZU5vZGUoYXJnMTogYW55LCBhcmcyPzogYW55KTogYW55IHtcbiAgbGV0IHZhbHVlOiBvYmplY3QsIHR5cGU6IEFueVN0YW5kYXJkVHlwZSB8IHVuZGVmaW5lZFxuICBsZXQgaGFzVHlwZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGhhc1R5cGUgPSBmYWxzZVxuICAgIHZhbHVlID0gYXJnMVxuICB9IGVsc2Uge1xuICAgIHR5cGUgPSBhcmcxXG4gICAgaGFzVHlwZSA9IHRydWVcbiAgICB2YWx1ZSA9IGFyZzJcbiAgfVxuXG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm9ubHkgb2JqZWN0cyBjYW4gYmUgdHVybmVkIGludG8gdHJlZSBub2Rlc1wiKVxuICB9XG5cbiAgaWYgKGhhc1R5cGUgJiYgaXNNb2RlbEF1dG9UeXBlQ2hlY2tpbmdFbmFibGVkKCkpIHtcbiAgICBjb25zdCBlcnJvcnMgPSB0eXBlQ2hlY2sodHlwZSwgdmFsdWUpXG4gICAgaWYgKGVycm9ycykge1xuICAgICAgZXJyb3JzLnRocm93KHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCB0cnVlKSkge1xuICAgIHJldHVybiB0d2Vhayh2YWx1ZSwgdW5kZWZpbmVkKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBUd2Vha2VyPFQ+ID0gKHZhbHVlOiBULCBwYXJlbnRQYXRoOiBQYXJlbnRQYXRoPGFueT4gfCB1bmRlZmluZWQpID0+IFQgfCB1bmRlZmluZWRcblxuY29uc3QgdHdlYWtlcnM6IHsgcHJpb3JpdHk6IG51bWJlcjsgdHdlYWtlcjogVHdlYWtlcjxhbnk+IH1bXSA9IFtdXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclR3ZWFrZXI8VD4ocHJpb3JpdHk6IG51bWJlciwgdHdlYWtlcjogVHdlYWtlcjxUPik6IHZvaWQge1xuICB0d2Vha2Vycy5wdXNoKHsgcHJpb3JpdHksIHR3ZWFrZXIgfSlcbiAgdHdlYWtlcnMuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpXG59XG5cbmZ1bmN0aW9uIGludGVybmFsVHdlYWs8VD4odmFsdWU6IFQsIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCk6IFQge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyBhbHJlYWR5IHR3ZWFrZWRcbiAgaWYgKGlzVHdlYWtlZE9iamVjdCh2YWx1ZSwgdHJ1ZSkpIHtcbiAgICB2YWx1ZSA9IHNldFBhcmVudCh7XG4gICAgICB2YWx1ZSxcbiAgICAgIHBhcmVudFBhdGgsXG4gICAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiB0cnVlLFxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyB1bnN1cHBvcnRlZCAobXVzdCBnbyBiZWZvcmUgcGxhaW4gb2JqZWN0IHR3ZWFrZXIpXG4gIGlmIChpc0RhdGFNb2RlbCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgXCJkYXRhIG1vZGVscyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZC4geW91IG1heSBpbnNlcnQgdGhlIGRhdGEgaW4gdGhlIHRyZWUgaW5zdGVhZCAoJyQnIHByb3BlcnR5KS5cIlxuICAgIClcbiAgfVxuXG4gIHJlZ2lzdGVyRGVmYXVsdFR3ZWFrZXJzKClcblxuICBjb25zdCB0d2Vha2Vyc0xlbiA9IHR3ZWFrZXJzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHR3ZWFrZXJzTGVuOyBpKyspIHtcbiAgICBjb25zdCB7IHR3ZWFrZXIgfSA9IHR3ZWFrZXJzW2ldXG4gICAgY29uc3QgdHdlYWtlZFZhbCA9IHR3ZWFrZXIodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgaWYgKHR3ZWFrZWRWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHR3ZWFrZWRWYWxcbiAgICB9XG4gIH1cblxuICAvLyB1bnN1cHBvcnRlZFxuICBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcIm1hcHMgYXJlIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQuIGNvbnNpZGVyIHVzaW5nICdPYmplY3RNYXAnIC8gJ2FzTWFwJyBpbnN0ZWFkLlwiKVxuICB9XG5cbiAgLy8gdW5zdXBwb3J0ZWRcbiAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJzZXRzIGFyZSBub3QgZGlyZWN0bHkgc3VwcG9ydGVkLiBjb25zaWRlciB1c2luZyAnQXJyYXlTZXQnIC8gJ2FzU2V0JyBpbnN0ZWFkLlwiKVxuICB9XG5cbiAgdGhyb3cgZmFpbHVyZShcbiAgICBgdHdlYWsgY2FuIG9ubHkgd29yayBvdmVyIG1vZGVscywgb2JzZXJ2YWJsZSBvYmplY3RzL2FycmF5cywgb3IgcHJpbWl0aXZlcywgYnV0IGdvdCAke3ZhbHVlfSBpbnN0ZWFkYFxuICApXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCB0d2VhayA9IGFjdGlvbihcInR3ZWFrXCIsIGludGVybmFsVHdlYWspXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlVbnR3ZWFrKHZhbHVlOiBhbnkpIHtcbiAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICBpZiAoZmFzdEdldFBhcmVudCh2YWx1ZSkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiBvYmplY3QgY2Fubm90IGJlIHVudHdlYWtlZCB3aGlsZSBpdCBoYXMgYSBwYXJlbnRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCB1bnR3ZWFrZXIgPSB0d2Vha2VkT2JqZWN0cy5nZXQodmFsdWUpXG4gIGlmICghdW50d2Vha2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB3ZSBoYXZlIHRvIG1ha2UgYSBjb3B5IHNpbmNlIGl0IHdpbGwgYmUgY2hhbmdlZFxuICAvLyB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3Vyc2VsdmVzIHNpbmNlIGl0IHNlZW1zIGxpa2UgYmFiZWwgZG9lcyBub3QgZG8gZG93bmxldmVsIGl0ZXJhdGlvblxuICBjb25zdCBjaGlsZHJlbiA9IFtdXG4gIGNvbnN0IGNoaWxkcmVuSXRlciA9IGdldE9iamVjdENoaWxkcmVuKHZhbHVlKSEudmFsdWVzKClcbiAgbGV0IGNoaWxkcmVuQ3VyID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB3aGlsZSAoIWNoaWxkcmVuQ3VyLmRvbmUpIHtcbiAgICBjaGlsZHJlbi5wdXNoKGNoaWxkcmVuQ3VyLnZhbHVlKVxuICAgIGNoaWxkcmVuQ3VyID0gY2hpbGRyZW5JdGVyLm5leHQoKVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHNldFBhcmVudCh7XG4gICAgICB2YWx1ZTogY2hpbGRyZW5baV0sXG4gICAgICBwYXJlbnRQYXRoOiB1bmRlZmluZWQsXG4gICAgICBpbmRleENoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuICAgICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICAgIC8vIG5vIG5lZWQgdG8gY2xvbmUgaWYgdW5zZXR0aW5nIHRoZSBwYXJlbnRcbiAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcbiAgICB9KVxuICB9XG5cbiAgdW50d2Vha2VyKClcblxuICB0d2Vha2VkT2JqZWN0cy5kZWxldGUodmFsdWUpXG4gIHVuc2V0SW50ZXJuYWxTbmFwc2hvdCh2YWx1ZSlcbiAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCB7XHJcbiAgSUFycmF5V2lsbENoYW5nZSxcclxuICBJQXJyYXlXaWxsU3BsaWNlLFxyXG4gIGludGVyY2VwdCxcclxuICBJT2JzZXJ2YWJsZUFycmF5LFxyXG4gIGlzT2JzZXJ2YWJsZUFycmF5LFxyXG4gIG9ic2VydmFibGUsXHJcbiAgb2JzZXJ2ZSxcclxuICBzZXQsXHJcbn0gZnJvbSBcIm1vYnhcIlxyXG5pbXBvcnQgeyBhc3NlcnRDYW5Xcml0ZSB9IGZyb20gXCIuLi9hY3Rpb24vcHJvdGVjdGlvblwiXHJcbmltcG9ydCB7IGdldEdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9nbG9iYWxDb25maWdcIlxyXG5pbXBvcnQgdHlwZSB7IFBhcmVudFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxyXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXHJcbmltcG9ydCB7IEludGVybmFsUGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaC9lbWl0UGF0Y2hcIlxyXG5pbXBvcnQgdHlwZSB7IFBhdGNoIH0gZnJvbSBcIi4uL3BhdGNoL1BhdGNoXCJcclxuaW1wb3J0IHtcclxuICBmcmVlemVJbnRlcm5hbFNuYXBzaG90LFxyXG4gIGdldEludGVybmFsU25hcHNob3QsXHJcbiAgc2V0TmV3SW50ZXJuYWxTbmFwc2hvdCxcclxuICB1cGRhdGVJbnRlcm5hbFNuYXBzaG90LFxyXG59IGZyb20gXCIuLi9zbmFwc2hvdC9pbnRlcm5hbFwiXHJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNBcnJheSwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBydW5uaW5nV2l0aG91dFNuYXBzaG90T3JQYXRjaGVzLCB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxyXG5pbXBvcnQgeyByZWdpc3RlclR3ZWFrZXIsIHRyeVVudHdlYWssIHR3ZWFrIH0gZnJvbSBcIi4vdHdlYWtcIlxyXG5pbXBvcnQgeyBUd2Vha2VyUHJpb3JpdHkgfSBmcm9tIFwiLi9Ud2Vha2VyUHJpb3JpdHlcIlxyXG5pbXBvcnQgeyBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZSB9IGZyb20gXCIuL3R5cGVDaGVja2luZ1wiXHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHdlYWtBcnJheTxUIGV4dGVuZHMgYW55W10+KFxyXG4gIHZhbHVlOiBULFxyXG4gIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCxcclxuICBkb05vdFR3ZWFrQ2hpbGRyZW46IGJvb2xlYW5cclxuKTogVCB7XHJcbiAgY29uc3Qgb3JpZ2luYWxBcnI6IFJlYWRvbmx5QXJyYXk8YW55PiA9IHZhbHVlXHJcbiAgY29uc3QgYXJyTG4gPSBvcmlnaW5hbEFyci5sZW5ndGhcclxuICBjb25zdCB0d2Vha2VkQXJyID0gaXNPYnNlcnZhYmxlQXJyYXkob3JpZ2luYWxBcnIpXHJcbiAgICA/IG9yaWdpbmFsQXJyXHJcbiAgICA6IG9ic2VydmFibGUuYXJyYXkoW10sIG9ic2VydmFibGVPcHRpb25zKVxyXG4gIGlmICh0d2Vha2VkQXJyICE9PSBvcmlnaW5hbEFycikge1xyXG4gICAgdHdlYWtlZEFyci5sZW5ndGggPSBvcmlnaW5hbEFyci5sZW5ndGhcclxuICB9XHJcblxyXG4gIGxldCBpbnRlcmNlcHREaXNwb3NlcjogKCkgPT4gdm9pZFxyXG4gIGxldCBvYnNlcnZlRGlzcG9zZXI6ICgpID0+IHZvaWRcclxuXHJcbiAgY29uc3QgdW50d2VhayA9ICgpID0+IHtcclxuICAgIGludGVyY2VwdERpc3Bvc2VyKClcclxuICAgIG9ic2VydmVEaXNwb3NlcigpXHJcbiAgfVxyXG5cclxuICB0d2Vha2VkT2JqZWN0cy5zZXQodHdlYWtlZEFyciwgdW50d2VhaylcclxuICBzZXRQYXJlbnQoe1xyXG4gICAgdmFsdWU6IHR3ZWFrZWRBcnIsXHJcbiAgICBwYXJlbnRQYXRoLFxyXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcclxuICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXHJcbiAgICAvLyBhcnJheXMgc2hvdWxkbid0IGJlIGNsb25lZCBhbnl3YXlcclxuICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcclxuICB9KVxyXG5cclxuICBjb25zdCB1bnRyYW5zZm9ybWVkU246IGFueVtdID0gW11cclxuICB1bnRyYW5zZm9ybWVkU24ubGVuZ3RoID0gYXJyTG5cclxuXHJcbiAgLy8gc3Vic3RpdHV0ZSBpbml0aWFsIHZhbHVlcyBieSBwcm94aWVkIHZhbHVlc1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyTG47IGkrKykge1xyXG4gICAgY29uc3QgdiA9IG9yaWdpbmFsQXJyW2ldXHJcblxyXG4gICAgaWYgKGlzUHJpbWl0aXZlKHYpKSB7XHJcbiAgICAgIGlmICghZG9Ob3RUd2Vha0NoaWxkcmVuKSB7XHJcbiAgICAgICAgc2V0KHR3ZWFrZWRBcnIsIGksIHYpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHVudHJhbnNmb3JtZWRTbltpXSA9IHZcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBhdGggPSB7IHBhcmVudDogdHdlYWtlZEFyciwgcGF0aDogaSB9XHJcblxyXG4gICAgICBsZXQgdHdlYWtlZFZhbHVlXHJcbiAgICAgIGlmIChkb05vdFR3ZWFrQ2hpbGRyZW4pIHtcclxuICAgICAgICB0d2Vha2VkVmFsdWUgPSB2XHJcbiAgICAgICAgc2V0UGFyZW50KHtcclxuICAgICAgICAgIHZhbHVlOiB0d2Vha2VkVmFsdWUsXHJcbiAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxyXG4gICAgICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBmYWxzZSxcclxuICAgICAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXHJcbiAgICAgICAgICAvLyB0aGUgdmFsdWUgaXMgYWxyZWFkeSBhIG5ldyB2YWx1ZSAodGhlIHJlc3VsdCBvZiBhIGZyb21TbmFwc2hvdClcclxuICAgICAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHR3ZWFrZWRWYWx1ZSA9IHR3ZWFrKHYsIHBhdGgpXHJcbiAgICAgICAgc2V0KHR3ZWFrZWRBcnIsIGksIHR3ZWFrZWRWYWx1ZSlcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdmFsdWVTbiA9IGdldEludGVybmFsU25hcHNob3QodHdlYWtlZFZhbHVlKSFcclxuICAgICAgdW50cmFuc2Zvcm1lZFNuW2ldID0gdmFsdWVTbi50cmFuc2Zvcm1lZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0TmV3SW50ZXJuYWxTbmFwc2hvdCh0d2Vha2VkQXJyLCB1bnRyYW5zZm9ybWVkU24sIHVuZGVmaW5lZClcclxuXHJcbiAgaW50ZXJjZXB0RGlzcG9zZXIgPSBpbnRlcmNlcHQodHdlYWtlZEFyciwgaW50ZXJjZXB0QXJyYXlNdXRhdGlvbi5iaW5kKHVuZGVmaW5lZCwgdHdlYWtlZEFycikpXHJcbiAgb2JzZXJ2ZURpc3Bvc2VyID0gb2JzZXJ2ZSh0d2Vha2VkQXJyLCBhcnJheURpZENoYW5nZSlcclxuXHJcbiAgcmV0dXJuIHR3ZWFrZWRBcnIgYXMgYW55XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5RGlkQ2hhbmdlKGNoYW5nZTogYW55IC8qSUFycmF5RGlkQ2hhbmdlKi8pIHtcclxuICBjb25zdCBhcnIgPSBjaGFuZ2Uub2JqZWN0XHJcbiAgbGV0IHsgdW50cmFuc2Zvcm1lZDogb2xkU25hcHNob3QgfSA9IGdldEludGVybmFsU25hcHNob3QoYXJyIGFzIEFycmF5PGFueT4pIVxyXG5cclxuICBjb25zdCBwYXRjaFJlY29yZGVyID0gbmV3IEludGVybmFsUGF0Y2hSZWNvcmRlcigpXHJcblxyXG4gIGxldCBtdXRhdGU6ICgoc246IGFueVtdKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxyXG5cclxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XHJcbiAgICBjYXNlIFwic3BsaWNlXCI6XHJcbiAgICAgIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNoYW5nZS5pbmRleFxyXG4gICAgICAgIGNvbnN0IGFkZGVkQ291bnQgPSBjaGFuZ2UuYWRkZWRDb3VudFxyXG4gICAgICAgIGNvbnN0IHJlbW92ZWRDb3VudCA9IGNoYW5nZS5yZW1vdmVkQ291bnRcclxuXHJcbiAgICAgICAgbGV0IGFkZGVkSXRlbXM6IGFueVtdID0gW11cclxuICAgICAgICBhZGRlZEl0ZW1zLmxlbmd0aCA9IGFkZGVkQ291bnRcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGVkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdiA9IGNoYW5nZS5hZGRlZFtpXVxyXG4gICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHYpKSB7XHJcbiAgICAgICAgICAgIGFkZGVkSXRlbXNbaV0gPSB2XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhZGRlZEl0ZW1zW2ldID0gZ2V0SW50ZXJuYWxTbmFwc2hvdCh2KSEudHJhbnNmb3JtZWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZExlbiA9IG9sZFNuYXBzaG90Lmxlbmd0aFxyXG4gICAgICAgIG11dGF0ZSA9IChuZXdTbmFwc2hvdCkgPT4ge1xyXG4gICAgICAgICAgbmV3U25hcHNob3Quc3BsaWNlKGluZGV4LCByZW1vdmVkQ291bnQsIC4uLmFkZGVkSXRlbXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgICAgICBjb25zdCBpbnZQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuXHJcbiAgICAgICAgLy8gb3B0aW1pemF0aW9uOiBpZiB3ZSBhZGQgYXMgbWFueSBhcyB3ZSByZW1vdmUgdGhlbiByZW1vdmUvcmVhZGQgaW5zdGVhZFxyXG5cclxuICAgICAgICAvLyB3ZSBjYW5ub3QgcmVwbGFjZSBzaW5jZSB3ZSBtaWdodCBlbmQgdXAgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIHNhbWUgbm9kZVxyXG4gICAgICAgIC8vIG1pZ2h0IGF0dGVtcHQgdG8gYmUgdGVtcG9yYXJpbHkgdHdpY2UgaW5zaWRlIHRoZSBzYW1lIHRyZWUgKGUuZy4gc29ydGluZylcclxuXHJcbiAgICAgICAgLy8gaXQgd291bGQgYmUgZmFzdGVyIHRvIGtlZXAgaG9sZXMgcmF0aGVyIHRoYW4gcmVtb3ZlL3JlYWRkLCBidXQgaWYgd2UgZG8gdGhhdCB0aGVuXHJcbiAgICAgICAgLy8gdmFsaWRhdGlvbiBtaWdodCBmYWlsXHJcblxyXG4gICAgICAgIGlmIChhZGRlZENvdW50ID09PSByZW1vdmVkQ291bnQpIHtcclxuICAgICAgICAgIGNvbnN0IHJlYWRkUGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICAgICAgICBjb25zdCByZWFkZEludlBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gICAgICAgICAgbGV0IHJlbW92ZWQgPSAwXHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRlZENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmVhbEluZGV4ID0gaW5kZXggKyBpXHJcblxyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWwgPSBnZXRWYWx1ZUFmdGVyU3BsaWNlKFxyXG4gICAgICAgICAgICAgIG9sZFNuYXBzaG90LFxyXG4gICAgICAgICAgICAgIHJlYWxJbmRleCxcclxuICAgICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgICByZW1vdmVkQ291bnQsXHJcbiAgICAgICAgICAgICAgYWRkZWRJdGVtc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZFNuYXBzaG90W3JlYWxJbmRleF1cclxuXHJcbiAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG9sZFZhbCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZVBhdGggPSBbcmVhbEluZGV4IC0gcmVtb3ZlZF1cclxuICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiByZW1vdmVQYXRoLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgaW52UGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogcmVtb3ZlUGF0aCxcclxuICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICByZW1vdmVkKytcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgcmVhZGRQYXRoID0gW3JlYWxJbmRleF1cclxuICAgICAgICAgICAgICByZWFkZFBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IHJlYWRkUGF0aCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG5ld1ZhbCksXHJcbiAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgcmVhZGRJbnZQYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiByZWFkZFBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRWYWwpLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goLi4ucmVhZGRQYXRjaGVzKVxyXG4gICAgICAgICAgaW52UGF0Y2hlcy5wdXNoKC4uLnJlYWRkSW52UGF0Y2hlcylcclxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmV2ZXJzZSBzaW5jZSBpbnZlcnNlIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZVxyXG4gICAgICAgICAgaW52UGF0Y2hlcy5yZXZlcnNlKClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaW50ZXJpbUxlbiA9IG9sZExlbiAtIHJlbW92ZWRDb3VudFxyXG5cclxuICAgICAgICAgIC8vIGZpcnN0IHJlbW92ZSBpdGVtc1xyXG4gICAgICAgICAgaWYgKHJlbW92ZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCB3aGVuIHJlbW92aW5nIGZyb20gdGhlIGVuZCBzZXQgdGhlIGxlbmd0aCBpbnN0ZWFkXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZVVzaW5nU2V0TGVuZ3RoID0gaW5kZXggPj0gaW50ZXJpbUxlblxyXG4gICAgICAgICAgICBpZiAocmVtb3ZlVXNpbmdTZXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogW1wibGVuZ3RoXCJdLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGludGVyaW1MZW4sXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlbW92ZWRDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVhbEluZGV4ID0gaW5kZXggKyBpXHJcbiAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IFtyZWFsSW5kZXhdXHJcblxyXG4gICAgICAgICAgICAgIGlmICghcmVtb3ZlVXNpbmdTZXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSAuLi4yLCAxLCAwXHJcbiAgICAgICAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBhZGQgMCwgMSwgMi4uLiBzaW5jZSBpbnZlcnNlIHBhdGNoZXMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZVxyXG4gICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChvbGRTbmFwc2hvdFtyZWFsSW5kZXhdKSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gdGhlbiBhZGQgaXRlbXNcclxuICAgICAgICAgIGlmIChhZGRlZENvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGZvciBpbnZlcnNlIHBhdGNoZXMsIHdoZW4gYWRkaW5nIGZyb20gdGhlIGVuZCBzZXQgdGhlIGxlbmd0aCB0byByZXN0b3JlIGluc3RlYWRcclxuICAgICAgICAgICAgY29uc3QgcmVzdG9yZVVzaW5nU2V0TGVuZ3RoID0gaW5kZXggPj0gaW50ZXJpbUxlblxyXG4gICAgICAgICAgICBpZiAocmVzdG9yZVVzaW5nU2V0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgaW52UGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgICAgIHBhdGg6IFtcImxlbmd0aFwiXSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBpbnRlcmltTGVuLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkZWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVhbEluZGV4ID0gaW5kZXggKyBpXHJcbiAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IFtyZWFsSW5kZXhdXHJcblxyXG4gICAgICAgICAgICAgIC8vIGFkZCAwLCAxLCAyLi4uXHJcbiAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KFxyXG4gICAgICAgICAgICAgICAgICBnZXRWYWx1ZUFmdGVyU3BsaWNlKG9sZFNuYXBzaG90LCByZWFsSW5kZXgsIGluZGV4LCByZW1vdmVkQ291bnQsIGFkZGVkSXRlbXMpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSAuLi4yLCAxLCAwIHNpbmNlIGludmVyc2UgcGF0Y2hlcyBhcmUgYXBwbGllZCBpbiByZXZlcnNlXHJcbiAgICAgICAgICAgICAgaWYgKCFyZXN0b3JlVXNpbmdTZXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGludlBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhdGNoUmVjb3JkZXIucmVjb3JkKHBhdGNoZXMsIGludlBhdGNoZXMpXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgIHtcclxuICAgICAgICBjb25zdCBrID0gY2hhbmdlLmluZGV4XHJcbiAgICAgICAgY29uc3QgdmFsID0gY2hhbmdlLm5ld1ZhbHVlXHJcbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2xkU25hcHNob3Rba11cclxuICAgICAgICBsZXQgbmV3VmFsOiBhbnlcclxuICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xyXG4gICAgICAgICAgbmV3VmFsID0gdmFsXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlU24gPSBnZXRJbnRlcm5hbFNuYXBzaG90KHZhbCkhXHJcbiAgICAgICAgICBuZXdWYWwgPSB2YWx1ZVNuLnRyYW5zZm9ybWVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG11dGF0ZSA9IChuZXdTbmFwc2hvdCkgPT4ge1xyXG4gICAgICAgICAgbmV3U25hcHNob3Rba10gPSBuZXdWYWxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBba11cclxuXHJcbiAgICAgICAgcGF0Y2hSZWNvcmRlci5yZWNvcmQoXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICB2YWx1ZTogZnJlZXplSW50ZXJuYWxTbmFwc2hvdChuZXdWYWwpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBmcmVlemVJbnRlcm5hbFNuYXBzaG90KG9sZFZhbCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICBydW5UeXBlQ2hlY2tpbmdBZnRlckNoYW5nZShhcnIsIHBhdGNoUmVjb3JkZXIpXHJcblxyXG4gIGlmICghcnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyAmJiBtdXRhdGUpIHtcclxuICAgIHVwZGF0ZUludGVybmFsU25hcHNob3QoYXJyLCBtdXRhdGUpXHJcbiAgICBwYXRjaFJlY29yZGVyLmVtaXQoYXJyKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgdW5kZWZpbmVkSW5zaWRlQXJyYXlFcnJvck1zZyA9XHJcbiAgXCJ1bmRlZmluZWQgaXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXJyYXlzIHNpbmNlIGl0IGlzIG5vdCBzZXJpYWxpemFibGUgaW4gSlNPTiwgY29uc2lkZXIgdXNpbmcgbnVsbCBpbnN0ZWFkXCJcclxuXHJcbi8vIFRPRE86IHJlbW92ZSBhcnJheSBwYXJhbWV0ZXIgYW5kIGp1c3QgdXNlIGNoYW5nZS5vYmplY3Qgb25jZSBtb2J4IHVwZGF0ZSBldmVudCBpcyBmaXhlZFxyXG5mdW5jdGlvbiBpbnRlcmNlcHRBcnJheU11dGF0aW9uKFxyXG4gIGFycmF5OiBJT2JzZXJ2YWJsZUFycmF5LFxyXG4gIGNoYW5nZTogSUFycmF5V2lsbENoYW5nZSB8IElBcnJheVdpbGxTcGxpY2VcclxuKSB7XHJcbiAgYXNzZXJ0Q2FuV3JpdGUoKVxyXG5cclxuICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XHJcbiAgICBjYXNlIFwic3BsaWNlXCI6XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaW5EZXZNb2RlKCkgJiYgIWdldEdsb2JhbENvbmZpZygpLmFsbG93VW5kZWZpbmVkQXJyYXlFbGVtZW50cykge1xyXG4gICAgICAgICAgY29uc3QgbGVuID0gY2hhbmdlLmFkZGVkLmxlbmd0aFxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2ID0gY2hhbmdlLmFkZGVkW2ldXHJcbiAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBmYWlsdXJlKHVuZGVmaW5lZEluc2lkZUFycmF5RXJyb3JNc2cpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLnJlbW92ZWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCByZW1vdmVkVmFsdWUgPSBjaGFuZ2Uub2JqZWN0W2NoYW5nZS5pbmRleCArIGldXHJcbiAgICAgICAgICB0d2VhayhyZW1vdmVkVmFsdWUsIHVuZGVmaW5lZClcclxuICAgICAgICAgIHRyeVVudHdlYWsocmVtb3ZlZFZhbHVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuYWRkZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNoYW5nZS5hZGRlZFtpXSA9IHR3ZWFrKGNoYW5nZS5hZGRlZFtpXSwge1xyXG4gICAgICAgICAgICBwYXJlbnQ6IGNoYW5nZS5vYmplY3QsXHJcbiAgICAgICAgICAgIHBhdGg6IGNoYW5nZS5pbmRleCArIGksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gd2UgbWlnaHQgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgcGFyZW50IG9mIHRoZSBuZXh0IGluZGV4ZXNcclxuICAgICAgICBjb25zdCBvbGROZXh0SW5kZXggPSBjaGFuZ2UuaW5kZXggKyBjaGFuZ2UucmVtb3ZlZENvdW50XHJcbiAgICAgICAgY29uc3QgbmV3TmV4dEluZGV4ID0gY2hhbmdlLmluZGV4ICsgY2hhbmdlLmFkZGVkLmxlbmd0aFxyXG5cclxuICAgICAgICBpZiAob2xkTmV4dEluZGV4ICE9PSBuZXdOZXh0SW5kZXgpIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSBvbGROZXh0SW5kZXgsIGogPSBuZXdOZXh0SW5kZXg7IGkgPCBjaGFuZ2Uub2JqZWN0Lmxlbmd0aDsgaSsrLCBqKyspIHtcclxuICAgICAgICAgICAgc2V0UGFyZW50KHtcclxuICAgICAgICAgICAgICB2YWx1ZTogY2hhbmdlLm9iamVjdFtpXSxcclxuICAgICAgICAgICAgICBwYXJlbnRQYXRoOiB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoYW5nZS5vYmplY3QsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBqLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiB0cnVlLFxyXG4gICAgICAgICAgICAgIGlzRGF0YU9iamVjdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgLy8ganVzdCByZS1pbmRleGluZ1xyXG4gICAgICAgICAgICAgIGNsb25lSWZBcHBsaWNhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuXHJcbiAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgIGlmIChcclxuICAgICAgICBpbkRldk1vZGUoKSAmJlxyXG4gICAgICAgICFnZXRHbG9iYWxDb25maWcoKS5hbGxvd1VuZGVmaW5lZEFycmF5RWxlbWVudHMgJiZcclxuICAgICAgICBjaGFuZ2UubmV3VmFsdWUgPT09IHVuZGVmaW5lZFxyXG4gICAgICApIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKHVuZGVmaW5lZEluc2lkZUFycmF5RXJyb3JNc2cpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRPRE86IHNob3VsZCBiZSBjaGFuZ2Uub2JqZWN0LCBidXQgbW9ieCBpcyBidWdnZWQgYW5kIGRvZXNuJ3Qgc2VuZCB0aGUgcHJveHlcclxuICAgICAgY29uc3Qgb2xkVmFsID0gYXJyYXlbY2hhbmdlLmluZGV4XVxyXG4gICAgICB0d2VhayhvbGRWYWwsIHVuZGVmaW5lZCkgLy8gc2V0IG9sZCBwcm9wIG9iaiBwYXJlbnQgdG8gdW5kZWZpbmVkXHJcbiAgICAgIHRyeVVudHdlYWsob2xkVmFsKVxyXG5cclxuICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHdlYWsoY2hhbmdlLm5ld1ZhbHVlLCB7IHBhcmVudDogYXJyYXksIHBhdGg6IGNoYW5nZS5pbmRleCB9KVxyXG4gICAgICBicmVha1xyXG4gIH1cclxuICByZXR1cm4gY2hhbmdlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFycmF5VHdlYWtlcigpIHtcclxuICByZWdpc3RlclR3ZWFrZXIoVHdlYWtlclByaW9yaXR5LkFycmF5LCAodmFsdWUsIHBhcmVudFBhdGgpID0+IHtcclxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdHdlYWtBcnJheSh2YWx1ZSwgcGFyZW50UGF0aCwgZmFsc2UpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgb2JzZXJ2YWJsZU9wdGlvbnMgPSB7XHJcbiAgZGVlcDogZmFsc2UsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFZhbHVlQWZ0ZXJTcGxpY2U8VD4oXHJcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcclxuICBpOiBudW1iZXIsXHJcbiAgaW5kZXg6IG51bWJlcixcclxuICByZW1vdmU6IG51bWJlcixcclxuICBhZGRlZEl0ZW1zOiByZWFkb25seSBUW11cclxuKSB7XHJcbiAgY29uc3QgYmFzZSA9IGkgLSBpbmRleFxyXG4gIGlmIChiYXNlIDwgMCkge1xyXG4gICAgcmV0dXJuIGFycmF5W2ldXHJcbiAgfVxyXG5cclxuICBpZiAoYmFzZSA8IGFkZGVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICByZXR1cm4gYWRkZWRJdGVtc1tiYXNlXVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGFycmF5W2kgLSBhZGRlZEl0ZW1zLmxlbmd0aCArIHJlbW92ZV1cclxufVxyXG4iLCJpbXBvcnQgeyBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgdHdlYWtBcnJheSB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrQXJyYXlcIlxuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQge1xuICBGcm9tU25hcHNob3RDb250ZXh0LFxuICBpbnRlcm5hbEZyb21TbmFwc2hvdCxcbiAgb2JzZXJ2YWJsZU9wdGlvbnMsXG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIsXG59IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBTbmFwc2hvdEluT2ZPYmplY3QgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG5mdW5jdGlvbiBmcm9tQXJyYXlTbmFwc2hvdChzbjogU25hcHNob3RJbk9mT2JqZWN0PGFueT4sIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCk6IGFueVtdIHtcbiAgY29uc3QgYXJyID0gb2JzZXJ2YWJsZS5hcnJheShbXSBhcyBhbnlbXSwgb2JzZXJ2YWJsZU9wdGlvbnMpXG4gIGNvbnN0IGxuID0gc24ubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG47IGkrKykge1xuICAgIGFyci5wdXNoKGludGVybmFsRnJvbVNuYXBzaG90KHNuW2ldLCBjdHgpKVxuICB9XG4gIHJldHVybiB0d2Vha0FycmF5KGFyciwgdW5kZWZpbmVkLCB0cnVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tQXJyYXlTbmFwc2hvdHRlcigpIHtcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5BcnJheSwgKHNuLCBjdHgpID0+IHtcbiAgICBpZiAoaXNBcnJheShzbikpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlTbmFwc2hvdChzbiwgY3R4KVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBmcm96ZW4sIGlzRnJvemVuU25hcHNob3QgfSBmcm9tIFwiLi4vZnJvemVuL0Zyb3plblwiXG5pbXBvcnQgeyByZWdpc3RlclNuYXBzaG90dGVyIH0gZnJvbSBcIi4vZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5IH0gZnJvbSBcIi4vU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHlcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tRnJvemVuU25hcHNob3R0ZXIoKSB7XG4gIHJlZ2lzdGVyU25hcHNob3R0ZXIoU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkuRnJvemVuLCAoc24pID0+IHtcbiAgICBpZiAoaXNGcm96ZW5TbmFwc2hvdChzbikpIHtcbiAgICAgIHJldHVybiBmcm96ZW4oc24uZGF0YSlcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KVxufVxuIiwiaW1wb3J0IHsgQW55TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHsgaXNNb2RlbFNuYXBzaG90IH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGdldE1vZGVsSW5mb0Zvck5hbWUgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgRnJvbVNuYXBzaG90Q29udGV4dCwgcmVnaXN0ZXJTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBTbmFwc2hvdEluT2ZNb2RlbCB9IGZyb20gXCIuL1NuYXBzaG90T2ZcIlxuaW1wb3J0IHsgU25hcHNob3R0ZXJBbmRSZWNvbmNpbGVyUHJpb3JpdHkgfSBmcm9tIFwiLi9TbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eVwiXG5cbmZ1bmN0aW9uIGZyb21Nb2RlbFNuYXBzaG90KHNuOiBTbmFwc2hvdEluT2ZNb2RlbDxBbnlNb2RlbD4sIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCk6IEFueU1vZGVsIHtcbiAgY29uc3QgdHlwZSA9IHNuW21vZGVsVHlwZUtleV1cblxuICBpZiAoIXR5cGUpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBhIG1vZGVsIHNuYXBzaG90IG11c3QgY29udGFpbiBhIHR5cGUga2V5ICgke21vZGVsVHlwZUtleX0pLCBidXQgbm9uZSB3YXMgZm91bmRgKVxuICB9XG5cbiAgY29uc3QgbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yTmFtZSh0eXBlKVxuICBpZiAoIW1vZGVsSW5mbykge1xuICAgIHRocm93IGZhaWx1cmUoYG1vZGVsIHdpdGggbmFtZSBcIiR7dHlwZX1cIiBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5YClcbiAgfVxuXG4gIGNvbnN0IG1vZGVsSWRQcm9wZXJ0eU5hbWUgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKG1vZGVsSW5mby5jbGFzcyBhcyBNb2RlbENsYXNzPEFueU1vZGVsPilcbiAgaWYgKG1vZGVsSWRQcm9wZXJ0eU5hbWUgJiYgKHNuIGFzIGFueSlbbW9kZWxJZFByb3BlcnR5TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgYSBtb2RlbCBzbmFwc2hvdCBvZiB0eXBlICcke3R5cGV9JyBtdXN0IGNvbnRhaW4gYW4gaWQga2V5ICgke21vZGVsSWRQcm9wZXJ0eU5hbWV9KSwgYnV0IG5vbmUgd2FzIGZvdW5kYFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBuZXcgKG1vZGVsSW5mby5jbGFzcyBhcyBhbnkpKHVuZGVmaW5lZCwge1xuICAgIHNuYXBzaG90SW5pdGlhbERhdGE6IHtcbiAgICAgIHVucHJvY2Vzc2VkU25hcHNob3Q6IHNuLFxuICAgICAgc25hcHNob3RUb0luaXRpYWxEYXRhOiBjdHguc25hcHNob3RUb0luaXRpYWxEYXRhLFxuICAgIH0sXG4gICAgZ2VuZXJhdGVOZXdJZHM6IGN0eC5vcHRpb25zLmdlbmVyYXRlTmV3SWRzLFxuICB9IGFzIE1vZGVsQ29uc3RydWN0b3JPcHRpb25zKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGcm9tTW9kZWxTbmFwc2hvdHRlcigpIHtcbiAgcmVnaXN0ZXJTbmFwc2hvdHRlcihTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eS5Nb2RlbCwgKHNuLCBjdHgpID0+IHtcbiAgICBpZiAoaXNNb2RlbFNuYXBzaG90KHNuKSkge1xuICAgICAgcmV0dXJuIGZyb21Nb2RlbFNuYXBzaG90KHNuLCBjdHgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IG9ic2VydmFibGUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHR3ZWFrUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1BsYWluT2JqZWN0XCJcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgRnJvbVNuYXBzaG90Q29udGV4dCxcbiAgaW50ZXJuYWxGcm9tU25hcHNob3QsXG4gIG9ic2VydmFibGVPcHRpb25zLFxuICByZWdpc3RlclNuYXBzaG90dGVyLFxufSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgU25hcHNob3RJbk9mT2JqZWN0IH0gZnJvbSBcIi4vU25hcHNob3RPZlwiXG5pbXBvcnQgeyBTbmFwc2hvdHRlckFuZFJlY29uY2lsZXJQcmlvcml0eSB9IGZyb20gXCIuL1NuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5XCJcblxuZnVuY3Rpb24gZnJvbVBsYWluT2JqZWN0U25hcHNob3Qoc246IFNuYXBzaG90SW5PZk9iamVjdDxhbnk+LCBjdHg6IEZyb21TbmFwc2hvdENvbnRleHQpOiBvYmplY3Qge1xuICBjb25zdCBwbGFpbk9iaiA9IG9ic2VydmFibGUub2JqZWN0KHt9LCB1bmRlZmluZWQsIG9ic2VydmFibGVPcHRpb25zKVxuXG4gIGNvbnN0IHNuS2V5cyA9IE9iamVjdC5rZXlzKHNuKVxuICBjb25zdCBzbktleXNMZW4gPSBzbktleXMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc25LZXlzTGVuOyBpKyspIHtcbiAgICBjb25zdCBrID0gc25LZXlzW2ldXG4gICAgY29uc3QgdiA9IHNuW2tdXG4gICAgc2V0KHBsYWluT2JqLCBrLCBpbnRlcm5hbEZyb21TbmFwc2hvdCh2LCBjdHgpKVxuICB9XG4gIHJldHVybiB0d2Vha1BsYWluT2JqZWN0KHBsYWluT2JqLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZyb21QbGFpbk9iamVjdFNuYXBzaG90dGVyKCkge1xuICByZWdpc3RlclNuYXBzaG90dGVyKFNuYXBzaG90dGVyQW5kUmVjb25jaWxlclByaW9yaXR5LlBsYWluT2JqZWN0LCAoc24sIGN0eCkgPT4ge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHNuKSkge1xuICAgICAgcmV0dXJuIGZyb21QbGFpbk9iamVjdFNuYXBzaG90KHNuLCBjdHgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyRnJvbUFycmF5U25hcHNob3R0ZXIgfSBmcm9tIFwiLi9mcm9tQXJyYXlTbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckZyb21Gcm96ZW5TbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21Gcm96ZW5TbmFwc2hvdFwiXG5pbXBvcnQgeyByZWdpc3RlckZyb21Nb2RlbFNuYXBzaG90dGVyIH0gZnJvbSBcIi4vZnJvbU1vZGVsU25hcHNob3RcIlxuaW1wb3J0IHsgcmVnaXN0ZXJGcm9tUGxhaW5PYmplY3RTbmFwc2hvdHRlciB9IGZyb20gXCIuL2Zyb21QbGFpbk9iamVjdFNuYXBzaG90XCJcblxubGV0IGRlZmF1bHRTbmFwc2hvdHRlcnNSZWdpc3RlcmVkID0gZmFsc2VcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVycygpIHtcbiAgaWYgKGRlZmF1bHRTbmFwc2hvdHRlcnNSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZGVmYXVsdFNuYXBzaG90dGVyc1JlZ2lzdGVyZWQgPSB0cnVlXG5cbiAgcmVnaXN0ZXJGcm9tQXJyYXlTbmFwc2hvdHRlcigpXG4gIHJlZ2lzdGVyRnJvbUZyb3plblNuYXBzaG90dGVyKClcbiAgcmVnaXN0ZXJGcm9tTW9kZWxTbmFwc2hvdHRlcigpXG4gIHJlZ2lzdGVyRnJvbVBsYWluT2JqZWN0U25hcHNob3R0ZXIoKVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uLCBvYnNlcnZhYmxlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBpc1Jlc2VydmVkTW9kZWxLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3R5cGVzL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVN0YW5kYXJkVHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi90eXBlcy9zY2hlbWFzXCJcbmltcG9ydCB7IGlzTGF0ZVR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc01hcCwgaXNQcmltaXRpdmUsIGlzU2V0IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVycyB9IGZyb20gXCIuL3JlZ2lzdGVyRGVmYXVsdFNuYXBzaG90dGVyc1wiXG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90SW5PZiwgU25hcHNob3RJbk9mTW9kZWwsIFNuYXBzaG90T3V0T2YgfSBmcm9tIFwiLi9TbmFwc2hvdE9mXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgU25hcHNob3R0ZXIgPSAoc246IGFueSwgY3R4OiBGcm9tU25hcHNob3RDb250ZXh0KSA9PiBhbnkgfCB1bmRlZmluZWRcblxuY29uc3Qgc25hcHNob3R0ZXJzOiB7IHByaW9yaXR5OiBudW1iZXI7IHNuYXBzaG90dGVyOiBTbmFwc2hvdHRlciB9W10gPSBbXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTbmFwc2hvdHRlcihwcmlvcml0eTogbnVtYmVyLCBzbmFwc2hvdHRlcjogU25hcHNob3R0ZXIpOiB2b2lkIHtcbiAgc25hcHNob3R0ZXJzLnB1c2goeyBwcmlvcml0eSwgc25hcHNob3R0ZXIgfSlcbiAgc25hcHNob3R0ZXJzLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxufVxuXG4vKipcbiAqIEZyb20gc25hcHNob3Qgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcm9tU25hcHNob3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhc3MgYHRydWVgIHRvIGdlbmVyYXRlIG5ldyBpbnRlcm5hbCBpZHMgZm9yIG1vZGVscyByYXRoZXIgdGhhbiByZXVzaW5nIHRoZW0uIChEZWZhdWx0IGlzIGBmYWxzZWApXG4gICAqL1xuICBnZW5lcmF0ZU5ld0lkczogYm9vbGVhblxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyb21TbmFwc2hvdENvbnRleHQge1xuICBvcHRpb25zOiBGcm9tU25hcHNob3RPcHRpb25zXG4gIHNuYXBzaG90VG9Jbml0aWFsRGF0YShwcm9jZXNzZWRTbjogU25hcHNob3RJbk9mTW9kZWw8QW55TW9kZWw+KTogYW55XG59XG5cbi8qKlxuICogR2l2ZW4gYSB0eXBlIGRlc2VyaWFsaXplcyBhIGRhdGEgc3RydWN0dXJlIGZyb20gaXRzIHNuYXBzaG90IGZvcm0uXG4gKlxuICogQHR5cGVwYXJhbSBUVHlwZSBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0eXBlIFR5cGUuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QsIGV2ZW4gaWYgYSBwcmltaXRpdmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU25hcHNob3Q8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD5cbj4oXG4gIHR5cGU6IFRUeXBlLFxuICBzbmFwc2hvdDogU25hcHNob3RJbk9mPFR5cGVUb0RhdGE8VFR5cGU+PixcbiAgb3B0aW9ucz86IFBhcnRpYWw8RnJvbVNuYXBzaG90T3B0aW9ucz5cbik6IFR5cGVUb0RhdGE8VFR5cGU+XG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGEgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBpdHMgc25hcHNob3QgZm9ybS5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gc25hcHNob3QgU25hcHNob3QsIGV2ZW4gaWYgYSBwcmltaXRpdmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU25hcHNob3Q8VD4oXG4gIHNuYXBzaG90OiBTbmFwc2hvdEluT2Y8VD4gfCBTbmFwc2hvdE91dE9mPFQ+LFxuICBvcHRpb25zPzogUGFydGlhbDxGcm9tU25hcHNob3RPcHRpb25zPlxuKTogVFxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNuYXBzaG90PFQ+KGFyZzE6IGFueSwgYXJnMjogYW55LCBhcmczPzogYW55KTogVCB7XG4gIGxldCBzbmFwc2hvdDogYW55XG4gIGxldCBvcHRpb25zOiBQYXJ0aWFsPEZyb21TbmFwc2hvdE9wdGlvbnM+IHwgdW5kZWZpbmVkXG5cbiAgaWYgKGlzTGF0ZVR5cGVDaGVja2VyKGFyZzEpIHx8IGFyZzEgaW5zdGFuY2VvZiBUeXBlQ2hlY2tlciB8fCBpc01vZGVsQ2xhc3MoYXJnMSkpIHtcbiAgICBjb25zdCB0eXBlQ2hlY2tlciA9IHJlc29sdmVUeXBlQ2hlY2tlcihhcmcxKVxuICAgIHNuYXBzaG90ID0gdHlwZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yID8gdHlwZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKGFyZzIpIDogYXJnMlxuICAgIG9wdGlvbnMgPSBhcmczXG4gIH0gZWxzZSB7XG4gICAgc25hcHNob3QgPSBhcmcxXG4gICAgb3B0aW9ucyA9IGFyZzJcbiAgfVxuXG4gIHJldHVybiBmcm9tU25hcHNob3RBY3Rpb24oc25hcHNob3QsIG9wdGlvbnMpXG59XG5cbmNvbnN0IGZyb21TbmFwc2hvdEFjdGlvbiA9IGFjdGlvbihcbiAgXCJmcm9tU25hcHNob3RcIixcbiAgPFQ+KHNuYXBzaG90OiBTbmFwc2hvdEluT2Y8VD4sIG9wdGlvbnM/OiBQYXJ0aWFsPEZyb21TbmFwc2hvdE9wdGlvbnM+KTogVCA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGdlbmVyYXRlTmV3SWRzOiBmYWxzZSxcbiAgICAgIG92ZXJyaWRlUm9vdE1vZGVsSWQ6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgY3R4OiBQYXJ0aWFsPEZyb21TbmFwc2hvdENvbnRleHQ+ID0ge1xuICAgICAgb3B0aW9uczogb3B0cyxcbiAgICB9XG4gICAgY3R4LnNuYXBzaG90VG9Jbml0aWFsRGF0YSA9IHNuYXBzaG90VG9Jbml0aWFsRGF0YS5iaW5kKHVuZGVmaW5lZCwgY3R4IGFzIEZyb21TbmFwc2hvdENvbnRleHQpXG5cbiAgICByZXR1cm4gaW50ZXJuYWxGcm9tU25hcHNob3Q8VD4oc25hcHNob3QsIGN0eCBhcyBGcm9tU25hcHNob3RDb250ZXh0KVxuICB9XG4pXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbEZyb21TbmFwc2hvdDxUPihcbiAgc246IFNuYXBzaG90SW5PZjxUPiB8IFNuYXBzaG90T3V0T2Y8VD4sXG4gIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dFxuKTogVCB7XG4gIGlmIChpc1ByaW1pdGl2ZShzbikpIHtcbiAgICByZXR1cm4gc24gYXMgYW55XG4gIH1cblxuICByZWdpc3RlckRlZmF1bHRTbmFwc2hvdHRlcnMoKVxuXG4gIGNvbnN0IHNuYXBzaG90dGVyTGVuID0gc25hcHNob3R0ZXJzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNuYXBzaG90dGVyTGVuOyBpKyspIHtcbiAgICBjb25zdCB7IHNuYXBzaG90dGVyIH0gPSBzbmFwc2hvdHRlcnNbaV1cbiAgICBjb25zdCByZXQgPSBzbmFwc2hvdHRlcihzbiwgY3R4KVxuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgfVxuXG4gIGlmIChpc01hcChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIG1hcHNcIilcbiAgfVxuXG4gIGlmIChpc1NldChzbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiYSBzbmFwc2hvdCBtdXN0IG5vdCBjb250YWluIHNldHNcIilcbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIHNuYXBzaG90IC0gJHtzbn1gKVxufVxuXG5mdW5jdGlvbiBzbmFwc2hvdFRvSW5pdGlhbERhdGEoXG4gIGN0eDogRnJvbVNuYXBzaG90Q29udGV4dCxcbiAgcHJvY2Vzc2VkU246IFNuYXBzaG90SW5PZk1vZGVsPEFueU1vZGVsPlxuKTogYW55IHtcbiAgY29uc3QgaW5pdGlhbERhdGEgPSBvYnNlcnZhYmxlLm9iamVjdCh7fSwgdW5kZWZpbmVkLCBvYnNlcnZhYmxlT3B0aW9ucylcblxuICBjb25zdCBwcm9jZXNzZWRTbktleXMgPSBPYmplY3Qua2V5cyhwcm9jZXNzZWRTbilcbiAgY29uc3QgcHJvY2Vzc2VkU25LZXlzTGVuID0gcHJvY2Vzc2VkU25LZXlzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZFNuS2V5c0xlbjsgaSsrKSB7XG4gICAgY29uc3QgayA9IHByb2Nlc3NlZFNuS2V5c1tpXVxuICAgIGlmICghaXNSZXNlcnZlZE1vZGVsS2V5KGspKSB7XG4gICAgICBjb25zdCB2ID0gcHJvY2Vzc2VkU25ba11cbiAgICAgIHNldChpbml0aWFsRGF0YSwgaywgaW50ZXJuYWxGcm9tU25hcHNob3QodiwgY3R4KSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluaXRpYWxEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBvYnNlcnZhYmxlT3B0aW9ucyA9IHtcbiAgZGVlcDogZmFsc2UsXG59XG4iLCJpbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmcm9tU25hcHNob3QgfSBmcm9tIFwiLi9mcm9tU25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi9nZXRTbmFwc2hvdFwiXG5cbi8qKlxuICogQ2xvbmUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbG9uZU9wdGlvbnMge1xuICAvKipcbiAgICogUGFzcyBgdHJ1ZWAgdG8gZ2VuZXJhdGUgbmV3IGludGVybmFsIGlkcyBmb3IgbW9kZWxzIHJhdGhlciB0aGFuIHJldXNpbmcgdGhlbS4gKERlZmF1bHQgaXMgYHRydWVgKVxuICAgKi9cbiAgZ2VuZXJhdGVOZXdJZHM6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDbG9uZXMgYW4gb2JqZWN0IGJ5IGRvaW5nIGEgYGZyb21TbmFwc2hvdChnZXRTbmFwc2hvdCh2YWx1ZSksIHsgZ2VuZXJhdGVOZXdJZHM6IHRydWUgfSlgLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBub2RlIE9iamVjdCB0byBjbG9uZS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBjbG9uZWQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmU8VCBleHRlbmRzIG9iamVjdD4obm9kZTogVCwgb3B0aW9ucz86IFBhcnRpYWw8Q2xvbmVPcHRpb25zPik6IFQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgZ2VuZXJhdGVOZXdJZHM6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxuXG4gIGNvbnN0IHNuID0gZ2V0U25hcHNob3Qobm9kZSlcbiAgcmV0dXJuIGZyb21TbmFwc2hvdChzbiwgb3B0cylcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGVucXVldWVQZW5kaW5nQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9wZW5kaW5nQWN0aW9uc1wiXG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQmFzZU1vZGVsXCJcbmltcG9ydCB7IGdldE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGF0dGFjaFRvUm9vdFN0b3JlLCBkZXRhY2hGcm9tUm9vdFN0b3JlIH0gZnJvbSBcIi4uL3Jvb3RTdG9yZS9hdHRhY2hEZXRhY2hcIlxuaW1wb3J0IHsgaXNSb290U3RvcmUgfSBmcm9tIFwiLi4vcm9vdFN0b3JlL3Jvb3RTdG9yZVwiXG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gXCIuLi9zbmFwc2hvdC9jbG9uZVwiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUsIGluRGV2TW9kZSwgaXNQcmltaXRpdmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgZGF0YU9iamVjdFBhcmVudCxcbiAgZGF0YVRvTW9kZWxOb2RlLFxuICBvYmplY3RQYXJlbnRzLFxuICBwYXJlbnRQYXRoRXF1YWxzLFxuICByZXBvcnRQYXJlbnRQYXRoQ2hhbmdlZCxcbn0gZnJvbSBcIi4vY29yZVwiXG5pbXBvcnQgeyBhZGRPYmplY3RDaGlsZCwgaW5pdGlhbGl6ZU9iamVjdENoaWxkcmVuLCByZW1vdmVPYmplY3RDaGlsZCB9IGZyb20gXCIuL2NvcmVPYmplY3RDaGlsZHJlblwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aCwgZmFzdEdldFJvb3QsIFBhcmVudFBhdGggfSBmcm9tIFwiLi9wYXRoXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFBhcmVudCA9IGFjdGlvbihcbiAgXCJzZXRQYXJlbnRcIixcbiAgKHtcbiAgICB2YWx1ZSxcbiAgICBwYXJlbnRQYXRoLFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZCxcbiAgICBpc0RhdGFPYmplY3QsXG4gICAgY2xvbmVJZkFwcGxpY2FibGUsXG4gIH06IHtcbiAgICB2YWx1ZTogYW55XG4gICAgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkXG4gICAgaW5kZXhDaGFuZ2VBbGxvd2VkOiBib29sZWFuXG4gICAgaXNEYXRhT2JqZWN0OiBib29sZWFuXG4gICAgY2xvbmVJZkFwcGxpY2FibGU6IGJvb2xlYW5cbiAgfSk6IGFueSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoaW5kZXhDaGFuZ2VBbGxvd2VkICYmIGNsb25lSWZBcHBsaWNhYmxlKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgXCJhc3NlcnRpb24gZmFpbGVkOiAnaW5kZXhDaGFuZ2VBbGxvd2VkJyBhbmQgJ2Nsb25lSWZBcHBsaWNhYmxlJyBjYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWVcIlxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoYGFzc2VydGlvbiBmYWlsZWQ6IHZhbHVlIGNhbm5vdCBiZSBhIGZ1bmN0aW9uIG9yIGEgc3ltYm9sYClcbiAgICAgIH1cbiAgICAgIGlmICghaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCB0cnVlKSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBhc3NlcnRpb24gZmFpbGVkOiB2YWx1ZSBpcyBub3QgcmVhZHkgdG8gdGFrZSBhIHBhcmVudGApXG4gICAgICB9XG4gICAgICBpZiAocGFyZW50UGF0aCAmJiAhaXNUd2Vha2VkT2JqZWN0KHBhcmVudFBhdGgucGFyZW50LCB0cnVlKSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKGBhc3NlcnRpb24gZmFpbGVkOiBwYXJlbnQgaXMgbm90IHJlYWR5IHRvIHRha2UgY2hpbGRyZW5gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RhdGFPYmplY3QpIHtcbiAgICAgIGRhdGFPYmplY3RQYXJlbnQuc2V0KHZhbHVlLCBwYXJlbnRQYXRoIS5wYXJlbnQpXG4gICAgICAvLyBkYXRhIG9iamVjdCB3aWxsIHByb3h5IHRvIHVzZSB0aGUgYWN0dWFsIHBhcmVudCBtb2RlbCBmb3IgY2hpbGQvcGFyZW50IHN0dWZmXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBpbml0aWFsaXplT2JqZWN0Q2hpbGRyZW4odmFsdWUpXG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIG5ldyBwYXJlbnQgYWN0dWFsbHkgcG9pbnRzIHRvIG1vZGVscyB3aGVuIHdlIGdpdmUgbW9kZWwgZGF0YSBvYmpzXG4gICAgaWYgKHBhcmVudFBhdGgpIHtcbiAgICAgIGNvbnN0IGFjdHVhbFBhcmVudCA9IGRhdGFUb01vZGVsTm9kZShwYXJlbnRQYXRoLnBhcmVudClcbiAgICAgIGlmIChwYXJlbnRQYXRoLnBhcmVudCAhPT0gYWN0dWFsUGFyZW50KSB7XG4gICAgICAgIHBhcmVudFBhdGggPSB7XG4gICAgICAgICAgcGFyZW50OiBhY3R1YWxQYXJlbnQsXG4gICAgICAgICAgcGF0aDogcGFyZW50UGF0aC5wYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG9sZFBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSlcbiAgICBpZiAocGFyZW50UGF0aEVxdWFscyhvbGRQYXJlbnRQYXRoLCBwYXJlbnRQYXRoKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGlzUm9vdFN0b3JlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcInJvb3Qgc3RvcmVzIGNhbm5vdCBiZSBhdHRhY2hlZCB0byBhbnkgcGFyZW50c1wiKVxuICAgIH1cblxuICAgIC8vIHZhbHVlIHR5cGUgbW9kZWxzIHNob3VsZCBiZSBjbG9uZWQgd2hlbiB0aGV5IGFyZSBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBwYXJlbnRcbiAgICAvLyBhbmQgdGhleSBoYWQgb25lIHByZXZpb3VzbHlcbiAgICBpZiAoXG4gICAgICBjbG9uZUlmQXBwbGljYWJsZSAmJlxuICAgICAgcGFyZW50UGF0aD8ucGFyZW50ICYmXG4gICAgICBvbGRQYXJlbnRQYXRoPy5wYXJlbnQgJiZcbiAgICAgIGlzTW9kZWwodmFsdWUpICYmXG4gICAgICBnZXRNb2RlbE1ldGFkYXRhKHZhbHVlKS52YWx1ZVR5cGVcbiAgICApIHtcbiAgICAgIHZhbHVlID0gY2xvbmUodmFsdWUsIHsgZ2VuZXJhdGVOZXdJZHM6IHRydWUgfSlcbiAgICAgIG9sZFBhcmVudFBhdGggPSBmYXN0R2V0UGFyZW50UGF0aCh2YWx1ZSlcbiAgICB9XG5cbiAgICBpZiAob2xkUGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoKSB7XG4gICAgICBpZiAob2xkUGFyZW50UGF0aC5wYXJlbnQgPT09IHBhcmVudFBhdGgucGFyZW50ICYmIGluZGV4Q2hhbmdlQWxsb3dlZCkge1xuICAgICAgICAvLyBqdXN0IGNoYW5naW5nIHRoZSBpbmRleFxuICAgICAgICBvYmplY3RQYXJlbnRzLnNldCh2YWx1ZSwgcGFyZW50UGF0aClcbiAgICAgICAgcmVwb3J0UGFyZW50UGF0aENoYW5nZWQodmFsdWUpXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcImFuIG9iamVjdCBjYW5ub3QgYmUgYXNzaWduZWQgYSBuZXcgcGFyZW50IHdoZW4gaXQgYWxyZWFkeSBoYXMgb25lXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNoVG9OZXdQYXJlbnQgPSAoKSA9PiB7XG4gICAgICAvLyBkZXRhY2ggZnJvbSBvbGRcbiAgICAgIGlmIChvbGRQYXJlbnRQYXRoPy5wYXJlbnQpIHtcbiAgICAgICAgcmVtb3ZlT2JqZWN0Q2hpbGQob2xkUGFyZW50UGF0aC5wYXJlbnQsIHZhbHVlKVxuICAgICAgfVxuXG4gICAgICAvLyBhdHRhY2ggdG8gbmV3XG4gICAgICBvYmplY3RQYXJlbnRzLnNldCh2YWx1ZSwgcGFyZW50UGF0aClcbiAgICAgIGlmIChwYXJlbnRQYXRoPy5wYXJlbnQpIHtcbiAgICAgICAgYWRkT2JqZWN0Q2hpbGQocGFyZW50UGF0aC5wYXJlbnQsIHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVwb3J0UGFyZW50UGF0aENoYW5nZWQodmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmFzZU1vZGVsKSB7XG4gICAgICBjb25zdCBvbGRSb290ID0gZmFzdEdldFJvb3QodmFsdWUpXG4gICAgICBjb25zdCBvbGRSb290U3RvcmUgPSBpc1Jvb3RTdG9yZShvbGRSb290KSA/IG9sZFJvb3QgOiB1bmRlZmluZWRcblxuICAgICAgYXR0YWNoVG9OZXdQYXJlbnQoKVxuXG4gICAgICBjb25zdCBuZXdSb290ID0gZmFzdEdldFJvb3QodmFsdWUpXG4gICAgICBjb25zdCBuZXdSb290U3RvcmUgPSBpc1Jvb3RTdG9yZShuZXdSb290KSA/IG5ld1Jvb3QgOiB1bmRlZmluZWRcblxuICAgICAgLy8gaW52b2tlIG1vZGVsIHJvb3Qgc3RvcmUgZXZlbnRzXG4gICAgICBpZiAob2xkUm9vdFN0b3JlICE9PSBuZXdSb290U3RvcmUgJiYgKG9sZFJvb3RTdG9yZSB8fCBuZXdSb290U3RvcmUpKSB7XG4gICAgICAgIGVucXVldWVQZW5kaW5nQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBpZiAob2xkUm9vdFN0b3JlKSB7XG4gICAgICAgICAgICBkZXRhY2hGcm9tUm9vdFN0b3JlKHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmV3Um9vdFN0b3JlKSB7XG4gICAgICAgICAgICBhdHRhY2hUb1Jvb3RTdG9yZShuZXdSb290U3RvcmUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXR0YWNoVG9OZXdQYXJlbnQoKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG4pXG4iLCJpbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGFyZW50UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBzZXRQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3NldFBhcmVudFwiXG5pbXBvcnQgeyB0d2Vha2VkT2JqZWN0cyB9IGZyb20gXCIuL2NvcmVcIlxuaW1wb3J0IHsgcmVnaXN0ZXJUd2Vha2VyIH0gZnJvbSBcIi4vdHdlYWtcIlxuaW1wb3J0IHsgVHdlYWtlclByaW9yaXR5IH0gZnJvbSBcIi4vVHdlYWtlclByaW9yaXR5XCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR3ZWFrTW9kZWw8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IFQsIHBhcmVudFBhdGg6IFBhcmVudFBhdGg8YW55PiB8IHVuZGVmaW5lZCk6IFQge1xuICB0d2Vha2VkT2JqZWN0cy5zZXQodmFsdWUsIHVuZGVmaW5lZClcbiAgc2V0UGFyZW50KHtcbiAgICB2YWx1ZSxcbiAgICBwYXJlbnRQYXRoLFxuICAgIGluZGV4Q2hhbmdlQWxsb3dlZDogZmFsc2UsXG4gICAgaXNEYXRhT2JqZWN0OiBmYWxzZSxcbiAgICBjbG9uZUlmQXBwbGljYWJsZTogdHJ1ZSxcbiAgfSlcblxuICAvLyBub3RoaW5nIHRvIGRvIGZvciBtb2RlbHMsIGRhdGEgaXMgYWxyZWFkeSBwcm94aWZpZWQgYW5kIGl0cyBwYXJlbnQgaXMgc2V0XG4gIC8vIGZvciBzbmFwc2hvdHMgd2Ugd2lsbCB1c2UgaXRzIFwiJFwiIG9iamVjdCBzbmFwc2hvdCBkaXJlY3RseVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2RlbFR3ZWFrZXIoKSB7XG4gIHJlZ2lzdGVyVHdlYWtlcihUd2Vha2VyUHJpb3JpdHkuTW9kZWwsICh2YWx1ZSwgcGFyZW50UGF0aCkgPT4ge1xuICAgIGlmIChpc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHR3ZWFrTW9kZWwodmFsdWUsIHBhcmVudFBhdGgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSlcbn1cbiIsImltcG9ydCB7IGFjdGlvbiwgc2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB7IGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCB9IGZyb20gXCIuLi9nbG9iYWxDb25maWcvZ2xvYmFsQ29uZmlnXCJcbmltcG9ydCB0eXBlIHsgTW9kZWxDcmVhdGlvbkRhdGEgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbFByb3BzSW5mb1wiXG5pbXBvcnQgeyBhcHBseU1vZGVsSW5pdGlhbGl6ZXJzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL25ld01vZGVsXCJcbmltcG9ydCB7IG5vRGVmYXVsdFZhbHVlIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgdHdlYWtNb2RlbCB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrTW9kZWxcIlxuaW1wb3J0IHsgdHdlYWtQbGFpbk9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL3R3ZWFrUGxhaW5PYmplY3RcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaW5EZXZNb2RlLCBtYWtlUHJvcFJlYWRvbmx5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgQW55TW9kZWwgfSBmcm9tIFwiLi9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSwgZ2V0TW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4vbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuL01vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGFzc2VydElzTW9kZWxDbGFzcyB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGludGVybmFsTmV3TW9kZWwgPSBhY3Rpb24oXG4gIFwibmV3TW9kZWxcIixcbiAgPE0gZXh0ZW5kcyBBbnlNb2RlbD4oXG4gICAgb3JpZ01vZGVsT2JqOiBNLFxuICAgIGluaXRpYWxEYXRhOiBNb2RlbENyZWF0aW9uRGF0YTxNPiB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBQaWNrPE1vZGVsQ29uc3RydWN0b3JPcHRpb25zLCBcIm1vZGVsQ2xhc3NcIiB8IFwic25hcHNob3RJbml0aWFsRGF0YVwiIHwgXCJnZW5lcmF0ZU5ld0lkc1wiPlxuICApOiBNID0+IHtcbiAgICBjb25zdCBtb2RlID0gaW5pdGlhbERhdGEgPyBcIm5ld1wiIDogXCJmcm9tU25hcHNob3RcIlxuICAgIGNvbnN0IHsgbW9kZWxDbGFzczogX21vZGVsQ2xhc3MsIHNuYXBzaG90SW5pdGlhbERhdGEsIGdlbmVyYXRlTmV3SWRzIH0gPSBvcHRpb25zXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IF9tb2RlbENsYXNzIVxuXG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBhc3NlcnRJc01vZGVsQ2xhc3MobW9kZWxDbGFzcywgXCJtb2RlbENsYXNzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxPYmogPSBvcmlnTW9kZWxPYmogYXMgTy5Xcml0YWJsZTxNPlxuXG4gICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQobW9kZWxDbGFzcylcbiAgICBpZiAoIW1vZGVsSW5mbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYG5vIG1vZGVsIGluZm8gZm9yIGNsYXNzICR7bW9kZWxDbGFzcy5uYW1lfSBjb3VsZCBiZSBmb3VuZCAtIGRpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQG1vZGVsIGRlY29yYXRvcj9gXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZSA9IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUobW9kZWxDbGFzcylcbiAgICBjb25zdCBtb2RlbFByb3BzID0gZ2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvKG1vZGVsQ2xhc3MpXG4gICAgY29uc3QgbW9kZWxJZFByb3BEYXRhID0gbW9kZWxJZFByb3BlcnR5TmFtZSA/IG1vZGVsUHJvcHNbbW9kZWxJZFByb3BlcnR5TmFtZV0hIDogdW5kZWZpbmVkXG5cbiAgICBsZXQgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGlmIChzbmFwc2hvdEluaXRpYWxEYXRhKSB7XG4gICAgICBsZXQgc24gPSBzbmFwc2hvdEluaXRpYWxEYXRhLnVucHJvY2Vzc2VkU25hcHNob3RcblxuICAgICAgaWYgKG1vZGVsSWRQcm9wRGF0YSAmJiBtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmIChnZW5lcmF0ZU5ld0lkcykge1xuICAgICAgICAgIGlkID0gKG1vZGVsSWRQcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuIGFzICgpID0+IHN0cmluZykoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlkID0gc25bbW9kZWxJZFByb3BlcnR5TmFtZV1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobW9kZWxDbGFzcy5mcm9tU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICAgICAgc24gPSBtb2RlbENsYXNzLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbilcbiAgICAgIH1cblxuICAgICAgaW5pdGlhbERhdGEgPSBzbmFwc2hvdEluaXRpYWxEYXRhLnNuYXBzaG90VG9Jbml0aWFsRGF0YShzbilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXNlIHN5bWJvbCBpZiBwcm92aWRlZFxuICAgICAgaWYgKG1vZGVsSWRQcm9wRGF0YSAmJiBtb2RlbElkUHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmIChpbml0aWFsRGF0YSFbbW9kZWxJZFByb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgICBpZCA9IGluaXRpYWxEYXRhIVttb2RlbElkUHJvcGVydHlOYW1lXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlkID0gKG1vZGVsSWRQcm9wRGF0YS5faW50ZXJuYWwuZGVmYXVsdEZuIGFzICgpID0+IHN0cmluZykoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbW9kZWxPYmpbbW9kZWxUeXBlS2V5XSA9IG1vZGVsSW5mby5uYW1lXG5cbiAgICAvLyBmaWxsIGluIGRlZmF1bHRzIGluIGluaXRpYWwgZGF0YVxuICAgIGNvbnN0IG1vZGVsUHJvcHNLZXlzID0gT2JqZWN0LmtleXMobW9kZWxQcm9wcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGVsUHJvcHNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gbW9kZWxQcm9wc0tleXNbaV1cblxuICAgICAgLy8gaWQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCBhYm92ZVxuICAgICAgaWYgKGsgPT09IG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvcERhdGEgPSBtb2RlbFByb3BzW2tdXG5cbiAgICAgIGxldCBuZXdWYWx1ZSA9IGluaXRpYWxEYXRhIVtrXVxuICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgICAvLyBhcHBseSB1bnRyYW5zZm9ybSAoaWYgYW55KVxuICAgICAgaWYgKG1vZGUgPT09IFwibmV3XCIgJiYgcHJvcERhdGEuX2ludGVybmFsLnRyYW5zZm9ybSkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICBuZXdWYWx1ZSA9IHByb3BEYXRhLl9pbnRlcm5hbC50cmFuc2Zvcm0udW50cmFuc2Zvcm0obmV3VmFsdWUsIG1vZGVsT2JqLCBrKVxuICAgICAgfVxuXG4gICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlIChpZiBuZWVkZWQpXG4gICAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbiAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgIG5ld1ZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRGbigpXG4gICAgICAgIH0gZWxzZSBpZiAocHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZSAhPT0gbm9EZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgIG5ld1ZhbHVlID0gcHJvcERhdGEuX2ludGVybmFsLmRlZmF1bHRWYWx1ZVxuICAgICAgICB9IGVsc2UgaWYgKCEoXCJrXCIgaW4gaW5pdGlhbERhdGEhKSkge1xuICAgICAgICAgIC8vIGZvciBtb2J4NCwgd2UgbmVlZCB0byBzZXQgdXAgcHJvcGVydGllcyBldmVuIGlmIHRoZXkgYXJlIHVuZGVmaW5lZFxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgc2V0KGluaXRpYWxEYXRhIGFzIGFueSwgaywgbmV3VmFsdWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsSWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgIHNldChpbml0aWFsRGF0YSBhcyBhbnksIG1vZGVsSWRQcm9wZXJ0eU5hbWUsIGlkKVxuICAgIH1cblxuICAgIHR3ZWFrTW9kZWwobW9kZWxPYmosIHVuZGVmaW5lZClcblxuICAgIC8vIGNyZWF0ZSBvYnNlcnZhYmxlIGRhdGEgb2JqZWN0IHdpdGggaW5pdGlhbCBkYXRhXG4gICAgbGV0IG9ic0RhdGEgPSB0d2Vha1BsYWluT2JqZWN0KFxuICAgICAgaW5pdGlhbERhdGEhLFxuICAgICAgeyBwYXJlbnQ6IG1vZGVsT2JqLCBwYXRoOiBcIiRcIiB9LFxuICAgICAgbW9kZWxPYmpbbW9kZWxUeXBlS2V5XSxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZVxuICAgIClcblxuICAgIC8vIGxpbmsgaXQsIGFuZCBtYWtlIGl0IHJlYWRvbmx5XG4gICAgbW9kZWxPYmouJCA9IG9ic0RhdGFcbiAgICBpZiAoaW5EZXZNb2RlKCkpIHtcbiAgICAgIG1ha2VQcm9wUmVhZG9ubHkobW9kZWxPYmosIFwiJFwiLCB0cnVlKVxuICAgIH1cblxuICAgIC8vIHR5cGUgY2hlY2sgaXQgaWYgbmVlZGVkXG4gICAgaWYgKGlzTW9kZWxBdXRvVHlwZUNoZWNraW5nRW5hYmxlZCgpICYmIGdldE1vZGVsTWV0YWRhdGEobW9kZWxDbGFzcykuZGF0YVR5cGUpIHtcbiAgICAgIGNvbnN0IGVyciA9IG1vZGVsT2JqLnR5cGVDaGVjaygpXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGVyci50aHJvdyhtb2RlbE9iailcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBydW4gYW55IGV4dHJhIGluaXRpYWxpemVycyBmb3IgdGhlIGNsYXNzIGFzIG5lZWRlZFxuICAgIGFwcGx5TW9kZWxJbml0aWFsaXplcnMobW9kZWxDbGFzcywgbW9kZWxPYmopXG5cbiAgICByZXR1cm4gbW9kZWxPYmogYXMgTVxuICB9XG4pXG4iLCJpbXBvcnQgeyBvYnNlcnZhYmxlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sLFxuICBNb2RlbENsYXNzLFxuICBwcm9wc1R5cGVTeW1ib2wsXG4gIHRvU25hcHNob3RPdmVycmlkZVR5cGVTeW1ib2wsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9CYXNlTW9kZWxTaGFyZWRcIlxuaW1wb3J0IHsgbW9kZWxJbmZvQnlDbGFzcyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHR5cGUge1xuICBNb2RlbFByb3BzLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZERhdGEsXG59IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RJbk9mTW9kZWwsIFNuYXBzaG90T3V0T2ZNb2RlbCB9IGZyb20gXCIuLi9zbmFwc2hvdC9TbmFwc2hvdE9mXCJcbmltcG9ydCB7IHR5cGVzTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNNb2RlbFwiXG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZUNoZWNrXCJcbmltcG9ydCB0eXBlIHsgVHlwZUNoZWNrRXJyb3IgfSBmcm9tIFwiLi4vdHlwZXMvVHlwZUNoZWNrRXJyb3JcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuL2dldE1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgbW9kZWxJZEtleSwgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4vbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuL01vZGVsQ29uc3RydWN0b3JPcHRpb25zXCJcbmltcG9ydCB7IGludGVybmFsTmV3TW9kZWwgfSBmcm9tIFwiLi9uZXdNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRJc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgbW9kZWxJZFByb3BlcnR5TmFtZVN5bWJvbCA9IFN5bWJvbChcIm1vZGVsSWRQcm9wZXJ0eU5hbWVcIilcblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBtb2RlbHMuIFVzZSBgTW9kZWxgIGluc3RlYWQgd2hlbiBleHRlbmRpbmcuXG4gKlxuICogTmV2ZXIgb3ZlcnJpZGUgdGhlIGNvbnN0cnVjdG9yLCB1c2UgYG9uSW5pdGAgb3IgYG9uQXR0YWNoZWRUb1Jvb3RTdG9yZWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIERhdGEgRGF0YSB0eXBlLlxuICogQHR5cGVwYXJhbSBDcmVhdGlvbkRhdGEgQ3JlYXRpb24gZGF0YSB0eXBlLlxuICogQHR5cGVwYXJhbSBNb2RlbElkUHJvcGVydHlOYW1lIE1vZGVsIGlkIHByb3BlcnR5IG5hbWUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIEZyb21TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVG9TbmFwc2hvdE92ZXJyaWRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgTW9kZWxJZFByb3BlcnR5TmFtZSBleHRlbmRzIHN0cmluZyA9IG5ldmVyXG4+IHtcbiAgLy8ganVzdCB0byBtYWtlIHR5cGluZyB3b3JrIHByb3Blcmx5XG4gIFtwcm9wc1R5cGVTeW1ib2xdITogVFByb3BzO1xuICBbZnJvbVNuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXSE6IEZyb21TbmFwc2hvdE92ZXJyaWRlO1xuICBbdG9TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF0hOiBUb1NuYXBzaG90T3ZlcnJpZGU7XG4gIFttb2RlbElkUHJvcGVydHlOYW1lU3ltYm9sXSE6IE1vZGVsSWRQcm9wZXJ0eU5hbWU7XG5cbiAgLyoqXG4gICAqIE1vZGVsIHR5cGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IFttb2RlbFR5cGVLZXldITogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE1vZGVsIGludGVybmFsIGlkLiBDYW4gYmUgbW9kaWZpZWQgaW5zaWRlIGEgbW9kZWwgYWN0aW9uLlxuICAgKiBJdCB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCBpZiB0aGVyZSdzIG5vIGlkIHByb3Agc2V0LlxuICAgKi9cbiAgZ2V0IFttb2RlbElkS2V5XSgpOiBbTW9kZWxJZFByb3BlcnR5TmFtZV0gZXh0ZW5kcyBbbmV2ZXJdID8gbmV2ZXIgOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkUHJvcCA9IGdldE1vZGVsSWRQcm9wZXJ0eU5hbWUodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpXG4gICAgcmV0dXJuIGlkUHJvcCA/IHRoaXMuJFtpZFByb3BdIDogKHVuZGVmaW5lZCBhcyBhbnkpXG4gIH1cblxuICBzZXQgW21vZGVsSWRLZXldKG5ld0lkOiBbTW9kZWxJZFByb3BlcnR5TmFtZV0gZXh0ZW5kcyBbbmV2ZXJdID8gbmV2ZXIgOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpZFByb3AgPSBnZXRNb2RlbElkUHJvcGVydHlOYW1lKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVxuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiJG1vZGVsSWQgY2Fubm90IGJlIHNldCB3aGVuIHRoZXJlIGlzIG5vIGlkUHJvcCBzZXQgaW4gdGhlIG1vZGVsXCIpXG4gICAgfVxuICAgIDsodGhpcy4kIGFzIGFueSlbaWRQcm9wXSA9IG5ld0lkXG4gIH1cblxuICAvKipcbiAgICogQ2FuIGJlIG92ZXJyaWRkZW4gdG8gb2ZmZXIgYSByZWZlcmVuY2UgaWQgdG8gYmUgdXNlZCBpbiByZWZlcmVuY2UgcmVzb2x1dGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCB3aWxsIHVzZSB0aGUgYGlkUHJvcGAgaWYgYXZhaWxhYmxlIG9yIHJldHVybiBgdW5kZWZpbmVkYCBvdGhlcndpc2UuXG4gICAqL1xuICBnZXRSZWZJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzW21vZGVsSWRLZXldXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uSW5pdD8oKTogdm9pZFxuXG4gIC8qKlxuICAgKiBEYXRhIHBhcnQgb2YgdGhlIG1vZGVsLCB3aGljaCBpcyBvYnNlcnZhYmxlIGFuZCB3aWxsIGJlIHNlcmlhbGl6ZWQgaW4gc25hcHNob3RzLlxuICAgKiBVc2UgaXQgaWYgb25lIG9mIHRoZSBkYXRhIHByb3BlcnRpZXMgbWF0Y2hlcyBvbmUgb2YgdGhlIG1vZGVsIHByb3BlcnRpZXMvZnVuY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgJCE6IE1vZGVsUHJvcHNUb1VudHJhbnNmb3JtZWREYXRhPFRQcm9wcz5cblxuICAvKipcbiAgICogT3B0aW9uYWwgaG9vayB0aGF0IHdpbGwgcnVuIG9uY2UgdGhpcyBtb2RlbCBpbnN0YW5jZSBpcyBhdHRhY2hlZCB0byB0aGUgdHJlZSBvZiBhIG1vZGVsIG1hcmtlZCBhc1xuICAgKiByb290IHN0b3JlIHZpYSBgcmVnaXN0ZXJSb290U3RvcmVgLlxuICAgKiBCYXNpY2FsbHkgdGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgeW91IGtub3cgdGhlIGZ1bGwgcm9vdCBzdG9yZSBpcyBjb21wbGV0ZSBhbmQgd2hlcmUgdGhpbmdzIHN1Y2ggYXNcbiAgICogbWlkZGxld2FyZXMsIGVmZmVjdHMgKHJlYWN0aW9ucywgZXRjKSwgYW5kIG90aGVyIHNpZGUgZWZmZWN0cyBzaG91bGQgYmUgcmVnaXN0ZXJlZCwgc2luY2UgaXQgbWVhbnNcbiAgICogdGhhdCB0aGUgbW9kZWwgaXMgbm93IHBhcnQgb2YgdGhlIGFjdGl2ZSBhcHBsaWNhdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogSXQgY2FuIHJldHVybiBhIGRpc3Bvc2VyIHRoYXQgd2lsbCBiZSBydW4gb25jZSB0aGlzIG1vZGVsIGluc3RhbmNlIGlzIGRldGFjaGVkIGZyb20gc3VjaCByb290IHN0b3JlIHRyZWUuXG4gICAqXG4gICAqIEBwYXJhbSByb290U3RvcmVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3RlY3RlZCBvbkF0dGFjaGVkVG9Sb290U3RvcmU/KHJvb3RTdG9yZTogb2JqZWN0KTogKCgpID0+IHZvaWQpIHwgdm9pZFxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHR5cGUgY2hlY2sgb3ZlciB0aGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEZvciB0aGlzIHRvIHdvcmsgYSBkYXRhIHR5cGUgaGFzIHRvIGJlIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1vZGVsIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYFR5cGVDaGVja0Vycm9yYCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gZXJyb3IuXG4gICAqL1xuICB0eXBlQ2hlY2soKTogVHlwZUNoZWNrRXJyb3IgfCBudWxsIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZXNNb2RlbDx0aGlzPih0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSlcbiAgICByZXR1cm4gdHlwZUNoZWNrKHR5cGUsIHRoaXMgYXMgYW55KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBtb2RlbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGE6IE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFRQcm9wcz4pIHtcbiAgICBsZXQgaW5pdGlhbERhdGEgPSBkYXRhIGFzIGFueVxuICAgIGNvbnN0IHsgc25hcHNob3RJbml0aWFsRGF0YSwgbW9kZWxDbGFzcywgZ2VuZXJhdGVOZXdJZHMgfTogTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgPVxuICAgICAgYXJndW1lbnRzWzFdIGFzIGFueVxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG1vZGVsQ2xhc3MhLnByb3RvdHlwZSlcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzIGFzIGFueVxuXG4gICAgLy8gZGVsZXRlIHVubmVjZXNzYXJ5IHByb3BzXG4gICAgZGVsZXRlIHNlbGZbcHJvcHNUeXBlU3ltYm9sXVxuICAgIGRlbGV0ZSBzZWxmW2Zyb21TbmFwc2hvdE92ZXJyaWRlVHlwZVN5bWJvbF1cbiAgICBkZWxldGUgc2VsZlt0b1NuYXBzaG90T3ZlcnJpZGVUeXBlU3ltYm9sXVxuICAgIGRlbGV0ZSBzZWxmW21vZGVsSWRQcm9wZXJ0eU5hbWVTeW1ib2xdXG5cbiAgICBpZiAoIXNuYXBzaG90SW5pdGlhbERhdGEpIHtcbiAgICAgIC8vIHBsYWluIG5ld1xuICAgICAgYXNzZXJ0SXNPYmplY3QoaW5pdGlhbERhdGEsIFwiaW5pdGlhbERhdGFcIilcblxuICAgICAgaW50ZXJuYWxOZXdNb2RlbCh0aGlzLCBvYnNlcnZhYmxlLm9iamVjdChpbml0aWFsRGF0YSBhcyBhbnksIHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KSwge1xuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICBnZW5lcmF0ZU5ld0lkczogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZyb20gc25hcHNob3RcbiAgICAgIGludGVybmFsTmV3TW9kZWwodGhpcywgdW5kZWZpbmVkLCB7IG1vZGVsQ2xhc3MsIHNuYXBzaG90SW5pdGlhbERhdGEsIGdlbmVyYXRlTmV3SWRzIH0pXG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcob3B0aW9ucz86IHsgd2l0aERhdGE/OiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSB7XG4gICAgICB3aXRoRGF0YTogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RQYXJ0ID0gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXNbbW9kZWxUeXBlS2V5XX1gXG5cbiAgICByZXR1cm4gZmluYWxPcHRpb25zLndpdGhEYXRhXG4gICAgICA/IGBbJHtmaXJzdFBhcnR9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U25hcHNob3QodGhpcykpfV1gXG4gICAgICA6IGBbJHtmaXJzdFBhcnR9XWBcbiAgfVxufVxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IHR5cGUgQmFzZU1vZGVsS2V5cyA9IGtleW9mIEFueU1vZGVsIHwgXCJvbkluaXRcIiB8IFwib25BdHRhY2hlZFRvUm9vdFN0b3JlXCJcblxuLy8gdGhlc2UgcHJvcHMgd2lsbCBuZXZlciBiZSBob2lzdGVkIHRvIHRoaXMgKGV4Y2VwdCBmb3IgbW9kZWwgaWQpXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYmFzZU1vZGVsUHJvcE5hbWVzID0gbmV3IFNldDxCYXNlTW9kZWxLZXlzPihbXG4gIG1vZGVsVHlwZUtleSxcbiAgbW9kZWxJZEtleSxcbiAgXCJvbkluaXRcIixcbiAgXCIkXCIsXG4gIFwiZ2V0UmVmSWRcIixcbiAgXCJvbkF0dGFjaGVkVG9Sb290U3RvcmVcIixcbiAgXCJ0eXBlQ2hlY2tcIixcbl0pXG5cbi8qKlxuICogQW55IGtpbmQgb2YgbW9kZWwgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW55TW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWw8YW55LCBhbnksIGFueSwgYW55PiB7fVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUuXG4gKlxuICogVHJpY2tzIFR5cGVTY3JpcHQgaW50byBhY2NlcHRpbmcgYWJzdHJhY3QgY2xhc3NlcyBhcyBhIHBhcmFtZXRlciBmb3IgYEV4dGVuZGVkTW9kZWxgLlxuICogRG9lcyBub3RoaW5nIGluIHJ1bnRpbWUuXG4gKlxuICogQHR5cGVwYXJhbSBUIEFic3RyYWN0IG1vZGVsIGNsYXNzIHR5cGUuXG4gKiBAcGFyYW0gdHlwZSBBYnN0cmFjdCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYnN0cmFjdE1vZGVsQ2xhc3M8VD4odHlwZTogVCk6IFQgJiBPYmplY3Qge1xuICByZXR1cm4gdHlwZSBhcyBhbnlcbn1cblxuLyoqXG4gKiBUaGUgbW9kZWwgaWQgcHJvcGVydHkgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxJZFByb3BlcnR5TmFtZTxNIGV4dGVuZHMgQW55TW9kZWw+ID0gTVt0eXBlb2YgbW9kZWxJZFByb3BlcnR5TmFtZVN5bWJvbF1cblxuLyoqXG4gKiBBZGQgbWlzc2luZyBtb2RlbCBtZXRhZGF0YSB0byBhIG1vZGVsIGNyZWF0aW9uIHNuYXBzaG90IHRvIGdlbmVyYXRlIGEgcHJvcGVyIG1vZGVsIHNuYXBzaG90LlxuICogVXN1YWxseSB1c2VkIGFsb25nc2lkZSBgZnJvbVNuYXBzaG90YC5cbiAqXG4gKiBAdHlwZXBhcmFtIE0gTW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbENsYXNzIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHNuYXBzaG90IE1vZGVsIGNyZWF0aW9uIHNuYXBzaG90IHdpdGhvdXQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgbW9kZWwgc25hcHNob3QgKGluY2x1ZGluZyBtZXRhZGF0YSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNuYXBzaG90SW5XaXRoTWV0YWRhdGE8TSBleHRlbmRzIEFueU1vZGVsPihcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzczxNPixcbiAgc25hcHNob3Q6IE9taXQ8U25hcHNob3RJbk9mTW9kZWw8TT4sIHR5cGVvZiBtb2RlbFR5cGVLZXk+XG4pOiBTbmFwc2hvdEluT2ZNb2RlbDxNPiB7XG4gIGFzc2VydElzTW9kZWxDbGFzcyhtb2RlbENsYXNzLCBcIm1vZGVsQ2xhc3NcIilcbiAgYXNzZXJ0SXNPYmplY3Qoc25hcHNob3QsIFwiaW5pdGlhbERhdGFcIilcblxuICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChtb2RlbENsYXNzKSFcblxuICByZXR1cm4ge1xuICAgIC4uLnNuYXBzaG90LFxuICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgfSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBZGQgbWlzc2luZyBtb2RlbCBtZXRhZGF0YSB0byBhIG1vZGVsIG91dHB1dCBzbmFwc2hvdCB0byBnZW5lcmF0ZSBhIHByb3BlciBtb2RlbCBzbmFwc2hvdC5cbiAqIFVzdWFsbHkgdXNlZCBhbG9uZ3NpZGUgYGFwcGx5U25hcHNob3RgLlxuICpcbiAqIEB0eXBlcGFyYW0gTSBNb2RlbCB0eXBlLlxuICogQHBhcmFtIG1vZGVsQ2xhc3MgTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gc25hcHNob3QgTW9kZWwgb3V0cHV0IHNuYXBzaG90IHdpdGhvdXQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgbW9kZWwgc25hcHNob3QgKGluY2x1ZGluZyBtZXRhZGF0YSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhPE0gZXh0ZW5kcyBBbnlNb2RlbD4oXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M8TT4sXG4gIHNuYXBzaG90OiBPbWl0PFNuYXBzaG90T3V0T2ZNb2RlbDxNPiwgdHlwZW9mIG1vZGVsVHlwZUtleT5cbik6IFNuYXBzaG90T3V0T2ZNb2RlbDxNPiB7XG4gIGFzc2VydElzTW9kZWxDbGFzcyhtb2RlbENsYXNzLCBcIm1vZGVsQ2xhc3NcIilcbiAgYXNzZXJ0SXNPYmplY3Qoc25hcHNob3QsIFwiaW5pdGlhbERhdGFcIilcblxuICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChtb2RlbENsYXNzKSFcblxuICByZXR1cm4ge1xuICAgIC4uLnNuYXBzaG90LFxuICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgfSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBIG1vZGVsIGNsYXNzIGRlY2xhcmF0aW9uLCBtYWRlIG9mIGEgYmFzZSBtb2RlbCBhbmQgdGhlIG1vZGVsIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxDbGFzc0RlY2xhcmF0aW9uPEJhc2VNb2RlbENsYXNzLCBNb2RlbEludGVyZmFjZT4gPSBCYXNlTW9kZWxDbGFzcyAmIHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IE1vZGVsSW50ZXJmYWNlXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IGZhaWx1cmUsIGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQW55TW9kZWwsIEJhc2VNb2RlbCB9IGZyb20gXCIuL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi9tZXRhZGF0YVwiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBtb2RlbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWwobW9kZWw6IHVua25vd24pOiBtb2RlbCBpcyBBbnlNb2RlbCB7XG4gIHJldHVybiBtb2RlbCBpbnN0YW5jZW9mIEJhc2VNb2RlbFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEFzc2VydHMgc29tZXRoaW5nIGlzIGFjdHVhbGx5IGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcGFyYW0gYXJnTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNNb2RlbChcbiAgbW9kZWw6IHVua25vd24sXG4gIGFyZ05hbWU6IHN0cmluZyxcbiAgY3VzdG9tRXJyTXNnID0gXCJtdXN0IGJlIGEgbW9kZWwgaW5zdGFuY2VcIlxuKTogYXNzZXJ0cyBtb2RlbCBpcyBBbnlNb2RlbCB7XG4gIGlmICghaXNNb2RlbChtb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9ICR7Y3VzdG9tRXJyTXNnfWApXG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxDbGFzcyhtb2RlbENsYXNzOiB1bmtub3duKTogbW9kZWxDbGFzcyBpcyBNb2RlbENsYXNzPEFueU1vZGVsPiB7XG4gIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobW9kZWxDbGFzcyAhPT0gQmFzZU1vZGVsICYmICEobW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlTW9kZWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNNb2RlbENsYXNzKFxuICBtb2RlbENsYXNzOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmdcbik6IGFzc2VydHMgbW9kZWxDbGFzcyBpcyBNb2RlbENsYXNzPEFueU1vZGVsPiB7XG4gIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHthcmdOYW1lfSBtdXN0IGJlIGEgY2xhc3NgKVxuICB9XG5cbiAgaWYgKG1vZGVsQ2xhc3MgIT09IEJhc2VNb2RlbCAmJiAhKG1vZGVsQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgQmFzZU1vZGVsKSkge1xuICAgIHRocm93IGZhaWx1cmUoYCR7YXJnTmFtZX0gbXVzdCBleHRlbmQgTW9kZWxgKVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsU25hcHNob3Qoc246IHVua25vd24pOiBzbiBpcyB7IFttb2RlbFR5cGVLZXldOiBzdHJpbmcgfSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHNuKSAmJiBtb2RlbFR5cGVLZXkgaW4gc25cbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG1vZGVsSWRLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBpc0FycmF5LCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZSB9IGZyb20gXCIuLi91dGlscy9tYXBVdGlsc1wiXG5pbXBvcnQge1xuICBkYXRhT2JqZWN0UGFyZW50LFxuICBkYXRhVG9Nb2RlbE5vZGUsXG4gIG1vZGVsVG9EYXRhTm9kZSxcbiAgb2JqZWN0UGFyZW50cyxcbiAgcmVwb3J0UGFyZW50UGF0aE9ic2VydmVkLFxufSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUGF0aCwgUGF0aEVsZW1lbnQsIFdyaXRhYmxlUGF0aCB9IGZyb20gXCIuL3BhdGhUeXBlc1wiXG5cbi8qKlxuICogUGF0aCBmcm9tIGFuIG9iamVjdCB0byBpdHMgaW1tZWRpYXRlIHBhcmVudC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUGFyZW50IG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogUGFyZW50IG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudDogVFxuICAvKipcbiAgICogUHJvcGVydHkgbmFtZSAoaWYgdGhlIHBhcmVudCBpcyBhbiBvYmplY3QpIG9yIGluZGV4IG51bWJlciAoaWYgdGhlIHBhcmVudCBpcyBhbiBhcnJheSkuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBQYXRoRWxlbWVudFxufVxuXG4vKipcbiAqIFBhdGggZnJvbSBhbiBvYmplY3QgdG8gaXRzIHJvb3QuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJvb3Qgb2JqZWN0IHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFBhdGg8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogUm9vdCBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSByb290OiBUXG4gIC8qKlxuICAgKiBQYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIGdpdmVuIHRhcmdldCwgYXMgYSBzdHJpbmcgYXJyYXkuXG4gICAqIElmIHRoZSB0YXJnZXQgaXMgYSByb290IGl0c2VsZiB0aGVuIHRoZSBhcnJheSB3aWxsIGJlIGVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogUGF0aFxuXG4gIC8qKlxuICAgKiBPYmplY3RzIGluIHRoZSBwYXRoLCBmcm9tIHJvb3QgKGluY2x1ZGVkKSB1bnRpbCB0YXJnZXQgKGluY2x1ZGVkKS5cbiAgICogSWYgdGhlIHRhcmdldCBpcyBhIHJvb3QgdGhlbiBvbmx5IHRoZSB0YXJnZXQgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPYmplY3RzOiBSZWFkb25seUFycmF5PHVua25vd24+XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSB0YXJnZXQgcGx1cyB0aGUgcGF0aCBmcm9tIHRoZSBwYXJlbnQgdG8gdGhlIHRhcmdldCwgb3IgdW5kZWZpbmVkIGlmIGl0IGhhcyBubyBwYXJlbnQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFBhcmVudCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFBhcmVudFBhdGg8VD4gfCB1bmRlZmluZWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIpXG5cbiAgcmV0dXJuIGZhc3RHZXRQYXJlbnRQYXRoKHZhbHVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFBhcmVudFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4oXG4gIHZhbHVlOiBvYmplY3Rcbik6IFBhcmVudFBhdGg8VD4gfCB1bmRlZmluZWQge1xuICByZXBvcnRQYXJlbnRQYXRoT2JzZXJ2ZWQodmFsdWUpXG4gIHJldHVybiBvYmplY3RQYXJlbnRzLmdldCh2YWx1ZSkgYXMgYW55XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICB2YWx1ZTogb2JqZWN0XG4pOiBQYXJlbnRQYXRoPFQ+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyZW50TW9kZWwgPSBkYXRhT2JqZWN0UGFyZW50LmdldCh2YWx1ZSlcbiAgaWYgKHBhcmVudE1vZGVsKSB7XG4gICAgcmV0dXJuIHsgcGFyZW50OiBwYXJlbnRNb2RlbCBhcyBULCBwYXRoOiBcIiRcIiB9XG4gIH1cblxuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG4gIGlmIChwYXJlbnRQYXRoICYmIGlzTW9kZWwocGFyZW50UGF0aC5wYXJlbnQpKSB7XG4gICAgcmV0dXJuIHsgcGFyZW50OiBwYXJlbnRQYXRoLnBhcmVudC4kIGFzIFQsIHBhdGg6IHBhcmVudFBhdGgucGF0aCB9XG4gIH1cbiAgcmV0dXJuIHBhcmVudFBhdGhcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBwYXJlbnQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFBhcmVudCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogVCB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIilcblxuICByZXR1cm4gZmFzdEdldFBhcmVudCh2YWx1ZSlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhc3RHZXRQYXJlbnQ8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGgodmFsdWUpXG5cbiAgcmV0dXJuIHBhcmVudFBhdGggPyBwYXJlbnRQYXRoLnBhcmVudCA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEdldFBhcmVudEluY2x1ZGluZ0RhdGFPYmplY3RzPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KFxuICB2YWx1ZTogb2JqZWN0XG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoSW5jbHVkaW5nRGF0YU9iamVjdHModmFsdWUpXG5cbiAgcmV0dXJuIHBhcmVudFBhdGggPyBwYXJlbnRQYXRoLnBhcmVudCA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJldHVybnMgaWYgYSBnaXZlbiBvYmplY3QgaXMgYSBtb2RlbCBpbnRlcmltIGRhdGEgb2JqZWN0IChgJGApLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IGlzLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsRGF0YU9iamVjdCh2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIiwgdHJ1ZSlcblxuICByZXR1cm4gZmFzdElzTW9kZWxEYXRhT2JqZWN0KHZhbHVlKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdElzTW9kZWxEYXRhT2JqZWN0KHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGFPYmplY3RQYXJlbnQuaGFzKHZhbHVlKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIHRhcmdldCBwbHVzIHRoZSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gZ2V0IHRvIHRoZSB0YXJnZXQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJvb3Qgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gdmFsdWUgVGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290UGF0aDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogUm9vdFBhdGg8VD4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHZhbHVlLCBcInZhbHVlXCIpXG5cbiAgcmV0dXJuIGZhc3RHZXRSb290UGF0aCh2YWx1ZSlcbn1cblxuLy8gd2UgdXNlIGNvbXB1dGVkcyBzbyB0aGV5IGFyZSBjYWNoZWQgd2hlbmV2ZXIgcG9zc2libGVcbmNvbnN0IGNvbXB1dGVkc0dldFJvb3RQYXRoID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQ29tcHV0ZWRWYWx1ZTxSb290UGF0aDxhbnk+Pj4oKVxuXG5mdW5jdGlvbiBpbnRlcm5hbEdldFJvb3RQYXRoPFQgZXh0ZW5kcyBvYmplY3QgPSBhbnk+KHZhbHVlOiBvYmplY3QpOiBSb290UGF0aDxUPiB7XG4gIGNvbnN0IHJvb3RQYXRoID0ge1xuICAgIHJvb3Q6IHZhbHVlLFxuICAgIHBhdGg6IFtdIGFzIFdyaXRhYmxlUGF0aCxcbiAgICBwYXRoT2JqZWN0czogW3ZhbHVlXSBhcyB1bmtub3duW10sXG4gIH1cblxuICBsZXQgcGFyZW50UGF0aDogUGFyZW50UGF0aDxhbnk+IHwgdW5kZWZpbmVkXG4gIHdoaWxlICgocGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoKHJvb3RQYXRoLnJvb3QpKSkge1xuICAgIHJvb3RQYXRoLnJvb3QgPSBwYXJlbnRQYXRoLnBhcmVudFxuICAgIHJvb3RQYXRoLnBhdGgudW5zaGlmdChwYXJlbnRQYXRoLnBhdGgpXG4gICAgcm9vdFBhdGgucGF0aE9iamVjdHMudW5zaGlmdChwYXJlbnRQYXRoLnBhcmVudClcbiAgfVxuXG4gIHJldHVybiByb290UGF0aCBhcyBSb290UGF0aDxhbnk+XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0Um9vdFBhdGg8VCBleHRlbmRzIG9iamVjdCA9IGFueT4odmFsdWU6IG9iamVjdCk6IFJvb3RQYXRoPFQ+IHtcbiAgcmV0dXJuIGdldE9yQ3JlYXRlKGNvbXB1dGVkc0dldFJvb3RQYXRoLCB2YWx1ZSwgKCkgPT5cbiAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gaW50ZXJuYWxHZXRSb290UGF0aCh2YWx1ZSlcbiAgICB9KVxuICApLmdldCgpXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgb3IgaXRzZWxmIGlmIHRoZSB0YXJnZXQgaXMgYSByb290LlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSb290IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHZhbHVlIFRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vdDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogVCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodmFsdWUsIFwidmFsdWVcIilcblxuICByZXR1cm4gZmFzdEdldFJvb3QodmFsdWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0R2V0Um9vdDxUIGV4dGVuZHMgb2JqZWN0ID0gYW55Pih2YWx1ZTogb2JqZWN0KTogVCB7XG4gIHJldHVybiBmYXN0R2V0Um9vdFBhdGgodmFsdWUpLnJvb3Rcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gb2JqZWN0IGlzIGEgcm9vdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSb290KHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh2YWx1ZSwgXCJ2YWx1ZVwiKVxuXG4gIHJldHVybiAhZmFzdEdldFBhcmVudCh2YWx1ZSlcbn1cblxuY29uc3QgdW5yZXNvbHZlZCA9IHsgcmVzb2x2ZWQ6IGZhbHNlIH0gYXMgY29uc3RcblxuLyoqXG4gKiBUcmllcyB0byByZXNvbHZlIGEgcGF0aCBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmV0dXJuZWQgdmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBwYXRoUm9vdE9iamVjdCBPYmplY3QgdGhhdCBzZXJ2ZXMgYXMgcGF0aCByb290LlxuICogQHBhcmFtIHBhdGggUGF0aCBhcyBhbiBzdHJpbmcgb3IgbnVtYmVyIGFycmF5LlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYHsgcmVzb2x2ZWQ6IHRydWUsIHZhbHVlOiBUIH1gIG9yIGB7IHJlc29sdmVkOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoPFQgPSBhbnk+KFxuICBwYXRoUm9vdE9iamVjdDogb2JqZWN0LFxuICBwYXRoOiBQYXRoXG4pOlxuICB8IHtcbiAgICAgIHJlc29sdmVkOiB0cnVlXG4gICAgICB2YWx1ZTogVFxuICAgIH1cbiAgfCB7XG4gICAgICByZXNvbHZlZDogZmFsc2VcbiAgICAgIHZhbHVlPzogdW5kZWZpbmVkXG4gICAgfSB7XG4gIC8vIHVuaXQgdGVzdHMgcmVseSBvbiB0aGlzIHRvIHdvcmsgd2l0aCBhbnkgb2JqZWN0XG4gIC8vIGFzc2VydFR3ZWFrZWRPYmplY3QocGF0aFJvb3RPYmplY3QsIFwicGF0aFJvb3RPYmplY3RcIilcblxuICBsZXQgY3VycmVudDogYW55ID0gcGF0aFJvb3RPYmplY3RcblxuICBsZXQgbGVuID0gcGF0aC5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghaXNPYmplY3QoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiB1bnJlc29sdmVkXG4gICAgfVxuXG4gICAgY29uc3QgcCA9IHBhdGhbaV1cblxuICAgIC8vIGNoZWNrIGp1c3QgdG8gYXZvaWQgbW9ieCB3YXJuaW5ncyBhYm91dCB0cnlpbmcgdG8gYWNjZXNzIG91dCBvZiBib3VuZHMgaW5kZXhcbiAgICBpZiAoaXNBcnJheShjdXJyZW50KSAmJiArcCA+PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVucmVzb2x2ZWRcbiAgICB9XG5cbiAgICBpZiAoaXNNb2RlbChjdXJyZW50KSkge1xuICAgICAgY29uc3QgZGF0YU5vZGUgPSBtb2RlbFRvRGF0YU5vZGUoY3VycmVudClcbiAgICAgIGlmIChwIGluIGRhdGFOb2RlKSB7XG4gICAgICAgIGN1cnJlbnQgPSBkYXRhTm9kZVxuICAgICAgfSBlbHNlIGlmICghKHAgaW4gY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuIHVucmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50ID0gY3VycmVudFtwXVxuICB9XG5cbiAgcmV0dXJuIHsgcmVzb2x2ZWQ6IHRydWUsIHZhbHVlOiBjdXJyZW50IH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNraXBJZENoZWNraW5nID0gU3ltYm9sKFwic2tpcElkQ2hlY2tpbmdcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBUcmllcyB0byByZXNvbHZlIGEgcGF0aCBmcm9tIGFuIG9iamVjdCB3aGlsZSBjaGVja2luZyBpZHMuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybmVkIHZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gcGF0aFJvb3RPYmplY3QgT2JqZWN0IHRoYXQgc2VydmVzIGFzIHBhdGggcm9vdC5cbiAqIEBwYXJhbSBwYXRoIFBhdGggYXMgYW4gc3RyaW5nIG9yIG51bWJlciBhcnJheS5cbiAqIEBwYXJhbSBwYXRoSWRzIEFuIGFycmF5IG9mIGlkcyBvZiB0aGUgbW9kZWxzIHRoYXQgbXVzdCBiZSBjaGVja2VkLCBudWxsIGlmIG5vdCBhIG1vZGVsIG9yIGBza2lwSWRDaGVja2luZ2AgdG8gc2tpcCBpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGB7IHJlc29sdmVkOiB0cnVlLCB2YWx1ZTogVCB9YCBvciBgeyByZXNvbHZlZDogZmFsc2UgfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aENoZWNraW5nSWRzPFQgPSBhbnk+KFxuICBwYXRoUm9vdE9iamVjdDogb2JqZWN0LFxuICBwYXRoOiBQYXRoLFxuICBwYXRoSWRzOiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bGwgfCB0eXBlb2Ygc2tpcElkQ2hlY2tpbmc+XG4pOlxuICB8IHtcbiAgICAgIHJlc29sdmVkOiB0cnVlXG4gICAgICB2YWx1ZTogVFxuICAgIH1cbiAgfCB7XG4gICAgICByZXNvbHZlZDogZmFsc2VcbiAgICAgIHZhbHVlPzogdW5kZWZpbmVkXG4gICAgfSB7XG4gIC8vIHVuaXQgdGVzdHMgcmVseSBvbiB0aGlzIHRvIHdvcmsgd2l0aCBhbnkgb2JqZWN0XG4gIC8vIGFzc2VydFR3ZWFrZWRPYmplY3QocGF0aFJvb3RPYmplY3QsIFwicGF0aFJvb3RPYmplY3RcIilcblxuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWxUb0RhdGFOb2RlKHBhdGhSb290T2JqZWN0KVxuICAvLyByb290IGlkIGlzIG5ldmVyIGNoZWNrZWRcblxuICBsZXQgbGVuID0gcGF0aC5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghaXNPYmplY3QoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiB7IHJlc29sdmVkOiBmYWxzZSB9XG4gICAgfVxuXG4gICAgY29uc3QgcCA9IHBhdGhbaV1cblxuICAgIC8vIGNoZWNrIGp1c3QgdG8gYXZvaWQgbW9ieCB3YXJuaW5ncyBhYm91dCB0cnlpbmcgdG8gYWNjZXNzIG91dCBvZiBib3VuZHMgaW5kZXhcbiAgICBpZiAoaXNBcnJheShjdXJyZW50KSAmJiArcCA+PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgcmVzb2x2ZWQ6IGZhbHNlIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50TWF5YmVNb2RlbCA9IGN1cnJlbnRbcF1cbiAgICBjdXJyZW50ID0gbW9kZWxUb0RhdGFOb2RlKGN1cnJlbnRNYXliZU1vZGVsIGFzIG9iamVjdClcblxuICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBwYXRoSWRzW2ldXG4gICAgaWYgKGV4cGVjdGVkSWQgIT09IHNraXBJZENoZWNraW5nKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWQgPSBpc01vZGVsKGN1cnJlbnRNYXliZU1vZGVsKSA/IGN1cnJlbnRNYXliZU1vZGVsW21vZGVsSWRLZXldID8/IG51bGwgOiBudWxsXG4gICAgICBpZiAoZXhwZWN0ZWRJZCAhPT0gY3VycmVudElkKSB7XG4gICAgICAgIHJldHVybiB7IHJlc29sdmVkOiBmYWxzZSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgcmVzb2x2ZWQ6IHRydWUsIHZhbHVlOiBkYXRhVG9Nb2RlbE5vZGUoY3VycmVudCkgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHBhdGggdG8gZ2V0IGZyb20gYSBwYXJlbnQgdG8gYSBnaXZlbiBjaGlsZC5cbiAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIGNoaWxkIGlzIGFjdHVhbGx5IHRoZSBnaXZlbiBwYXJlbnQgb3IgdW5kZWZpbmVkIGlmIHRoZSBjaGlsZCBpcyBub3QgYSBjaGlsZCBvZiB0aGUgcGFyZW50LlxuICpcbiAqIEBwYXJhbSBmcm9tUGFyZW50XG4gKiBAcGFyYW0gdG9DaGlsZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFRvQ2hpbGRQYXRoKGZyb21QYXJlbnQ6IG9iamVjdCwgdG9DaGlsZDogb2JqZWN0KTogUGF0aCB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3QoZnJvbVBhcmVudCwgXCJmcm9tUGFyZW50XCIpXG4gIGFzc2VydFR3ZWFrZWRPYmplY3QodG9DaGlsZCwgXCJ0b0NoaWxkXCIpXG5cbiAgaWYgKGZyb21QYXJlbnQgPT09IHRvQ2hpbGQpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHBhdGg6IFdyaXRhYmxlUGF0aCA9IFtdXG5cbiAgbGV0IGN1cnJlbnQgPSB0b0NoaWxkXG4gIGxldCBwYXJlbnRQYXRoXG4gIHdoaWxlICgocGFyZW50UGF0aCA9IGZhc3RHZXRQYXJlbnRQYXRoKGN1cnJlbnQpKSkge1xuICAgIHBhdGgudW5zaGlmdChwYXJlbnRQYXRoLnBhdGgpXG5cbiAgICBjdXJyZW50ID0gcGFyZW50UGF0aC5wYXJlbnRcbiAgICBpZiAoY3VycmVudCA9PT0gZnJvbVBhcmVudCkge1xuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIiwiaW1wb3J0IHsgZmFzdEdldFBhcmVudCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBpc0NoaWxkT2ZQYXJlbnQgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGgyXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzRnVuY3Rpb24sIGFzc2VydElzT2JqZWN0LCBkZWxldGVGcm9tQXJyYXksIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5cbi8qKlxuICogQW4gYWN0aW9uIG1pZGRsZXdhcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uTWlkZGxld2FyZSB7XG4gIC8qKlxuICAgKiBTdWJ0cmVlIHJvb3Qgb2JqZWN0IChvYmplY3QgYW5kIGNoaWxkIG9iamVjdHMpIHRoaXMgbWlkZGxld2FyZSB3aWxsIHJ1biBmb3IuXG4gICAqIFRoaXMgdGFyZ2V0IFwiZmlsdGVyXCIgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBjdXN0b20gZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VidHJlZVJvb3Q6IG9iamVjdFxuXG4gIC8qKlxuICAgKiBBIGZpbHRlciBmdW5jdGlvbiB0byBkZWNpZGUgaWYgYW4gYWN0aW9uIG1pZGRsZXdhcmUgZnVuY3Rpb24gc2hvdWxkIGJlIHJ1biBvciBub3QuXG4gICAqL1xuICBmaWx0ZXI/KGN0eDogQWN0aW9uQ29udGV4dCk6IGJvb2xlYW5cblxuICAvKipcbiAgICogQW4gYWN0aW9uIG1pZGRsZXdhcmUgZnVuY3Rpb24uXG4gICAqIFJlbWJlciB0byBgcmV0dXJuIG5leHQoKWAgaWYgeW91IHdhbnQgdG8gY29udGludWUgdGhlIGFjdGlvbiBvciB0aHJvdyBpZiB5b3Ugd2FudCB0byBjYW5jZWwgaXQuXG4gICAqL1xuICBtaWRkbGV3YXJlKGN0eDogQWN0aW9uQ29udGV4dCwgbmV4dDogKCkgPT4gYW55KTogYW55XG59XG5cbi8qKlxuICogVGhlIGRpc3Bvc2VyIG9mIGFuIGFjdGlvbiBtaWRkbGV3YXJlLlxuICovXG5leHBvcnQgdHlwZSBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgPSAoKSA9PiB2b2lkXG5cbnR5cGUgUGFydGlhbEFjdGlvbk1pZGRsZXdhcmUgPSBQaWNrPEFjdGlvbk1pZGRsZXdhcmUsIFwiZmlsdGVyXCIgfCBcIm1pZGRsZXdhcmVcIj5cblxuY29uc3QgcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFBhcnRpYWxBY3Rpb25NaWRkbGV3YXJlW10+KClcblxuaW50ZXJmYWNlIEFjdGlvbk1pZGRsZXdhcmVzSXRlcmF0b3IgZXh0ZW5kcyBJdGVyYWJsZTxQYXJ0aWFsQWN0aW9uTWlkZGxld2FyZT4ge31cblxuY29uc3QgcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvciA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvcj4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aW9uIG1pZGRsZXdhcmVzIHRvIGJlIHJ1biBvdmVyIGEgZ2l2ZW4gb2JqZWN0IGFzIGFuIGl0ZXJhYmxlIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uTWlkZGxld2FyZXMob2JqOiBvYmplY3QpOiBBY3Rpb25NaWRkbGV3YXJlc0l0ZXJhdG9yIHtcbiAgLy8gd2hlbiB3ZSBjYWxsIGEgbWlkZGxld2FyZSB3ZSB3aWxsIGNhbGwgdGhlIG1pZGRsZXdhcmVzIG9mIHRoYXQgb2JqZWN0IHBsdXMgYWxsIHBhcmVudCBvYmplY3RzXG4gIC8vIHRoZSBwYXJlbnQgb2JqZWN0IG1pZGRsZXdhcmVzIGFyZSBydW4gbGFzdFxuXG4gIC8vIHNpbmNlIGFuIGFycmF5IGxpa2UgW2EsIGIsIGNdIHdpbGwgYmUgY2FsbGVkIGxpa2UgYyhiKGEoKSkpIHRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHB1dFxuICAvLyB0aGUgcGFyZW50IG9iamVjdCBvbmVzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5XG5cbiAgbGV0IGl0ZXJhYmxlID0gcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvci5nZXQob2JqKVxuICBpZiAoIWl0ZXJhYmxlKSB7XG4gICAgaXRlcmFibGUgPSB7XG4gICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgbGV0IGN1cnJlbnQ6IGFueSA9IG9ialxuXG4gICAgICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRJdGVyYXRvcigpIHtcbiAgICAgICAgICBjb25zdCBvYmpNd2FyZXMgPSBjdXJyZW50ID8gcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXMuZ2V0KGN1cnJlbnQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKCFvYmpNd2FyZXMgfHwgb2JqTXdhcmVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmpNd2FyZXNbU3ltYm9sLml0ZXJhdG9yXSgpXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmaW5kTmV4dEl0ZXJhdG9yKCkge1xuICAgICAgICAgIGxldCBuZXh0SXRlclxuICAgICAgICAgIHdoaWxlIChjdXJyZW50ICYmICFuZXh0SXRlcikge1xuICAgICAgICAgICAgY3VycmVudCA9IGZhc3RHZXRQYXJlbnQoY3VycmVudClcbiAgICAgICAgICAgIG5leHRJdGVyID0gZ2V0Q3VycmVudEl0ZXJhdG9yKClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5leHRJdGVyXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXRlciA9IGdldEN1cnJlbnRJdGVyYXRvcigpXG4gICAgICAgIGlmICghaXRlcikge1xuICAgICAgICAgIGl0ZXIgPSBmaW5kTmV4dEl0ZXJhdG9yKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yOiBJdGVyYXRvcjxQYXJ0aWFsQWN0aW9uTWlkZGxld2FyZT4gPSB7XG4gICAgICAgICAgbmV4dCgpIHtcbiAgICAgICAgICAgIGlmICghaXRlcikge1xuICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGl0ZXIubmV4dCgpXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlciA9IGZpbmROZXh0SXRlcmF0b3IoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVyYXRvclxuICAgICAgfSxcbiAgICB9XG4gICAgcGVyT2JqZWN0QWN0aW9uTWlkZGxld2FyZXNJdGVyYXRvci5zZXQob2JqLCBpdGVyYWJsZSlcbiAgfVxuICByZXR1cm4gaXRlcmFibGVcbn1cblxuLyoqXG4gKiBBZGRzIGEgZ2xvYmFsIGFjdGlvbiBtaWRkbGV3YXJlIHRvIGJlIHJ1biB3aGVuIGFuIGFjdGlvbiBpcyBwZXJmb3JtZWQuXG4gKiBJdCBpcyB1c3VhbGx5IHByZWZlcmFibGUgdG8gdXNlIGBvbkFjdGlvbk1pZGRsZXdhcmVgIGluc3RlYWQgdG8gbGltaXQgaXQgdG8gYSBnaXZlbiB0cmVlIGFuZCBvbmx5IHRvIHRvcG1vc3QgbGV2ZWwgYWN0aW9uc1xuICogb3IgYGFjdGlvblRyYWNraW5nTWlkZGxld2FyZWAgZm9yIGEgc2ltcGxpZmllZCBtaWRkbGV3YXJlLlxuICpcbiAqIEBwYXJhbSBtd2FyZSBBY3Rpb24gbWlkZGxld2FyZSB0byBiZSBydW4uXG4gKiBAcmV0dXJucyBBIGRpc3Bvc2VyIHRvIGNhbmNlbCB0aGUgbWlkZGxld2FyZS4gTm90ZSB0aGF0IGlmIHlvdSBkb24ndCBwbGFuIHRvIGRvIGFuIGVhcmx5IGRpc3Bvc2FsIG9mIHRoZSBtaWRkbGV3YXJlXG4gKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBvcHRpb25hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEFjdGlvbk1pZGRsZXdhcmUobXdhcmU6IEFjdGlvbk1pZGRsZXdhcmUpOiBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIge1xuICBhc3NlcnRJc09iamVjdChtd2FyZSwgXCJtaWRkbGV3YXJlXCIpXG5cbiAgbGV0IHsgbWlkZGxld2FyZSwgZmlsdGVyLCBzdWJ0cmVlUm9vdCB9ID0gbXdhcmVcblxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcIm1pZGRsZXdhcmUuc3VidHJlZVJvb3RcIilcbiAgYXNzZXJ0SXNGdW5jdGlvbihtaWRkbGV3YXJlLCBcIm1pZGRsZXdhcmUubWlkZGxld2FyZVwiKVxuICBpZiAoZmlsdGVyICYmIHR5cGVvZiBmaWx0ZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoXCJtaWRkbGV3YXJlLmZpbHRlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIpXG4gIH1cblxuICAvLyByZW1pbmRlcjogbmV2ZXIgdHVybiBtaWRkbGV3YXJlcyBpbnRvIGFjdGlvbnMgb3IgZWxzZVxuICAvLyByZWFjdGlvbnMgd2lsbCBub3QgYmUgcGlja2VkIHVwIGJ5IHRoZSB1bmRvIG1hbmFnZXJcblxuICBpZiAoc3VidHJlZVJvb3QpIHtcbiAgICBjb25zdCB0YXJnZXRGaWx0ZXIgPSAoY3R4OiBBY3Rpb25Db250ZXh0KSA9PlxuICAgICAgY3R4LnRhcmdldCA9PT0gc3VidHJlZVJvb3QgfHwgaXNDaGlsZE9mUGFyZW50KGN0eC50YXJnZXQsIHN1YnRyZWVSb290ISlcblxuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSB0YXJnZXRGaWx0ZXJcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VzdG9tRmlsdGVyID0gZmlsdGVyXG4gICAgICBmaWx0ZXIgPSAoY3R4KSA9PiB7XG4gICAgICAgIHJldHVybiB0YXJnZXRGaWx0ZXIoY3R4KSAmJiBjdXN0b21GaWx0ZXIoY3R4KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdHVhbE13YXJlID0geyBtaWRkbGV3YXJlLCBmaWx0ZXIgfVxuXG4gIGxldCBvYmpNd2FyZXMgPSBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlcy5nZXQoc3VidHJlZVJvb3QpIVxuICBpZiAoIW9iak13YXJlcykge1xuICAgIG9iak13YXJlcyA9IFthY3R1YWxNd2FyZV1cbiAgICBwZXJPYmplY3RBY3Rpb25NaWRkbGV3YXJlcy5zZXQoc3VidHJlZVJvb3QsIG9iak13YXJlcylcbiAgfSBlbHNlIHtcbiAgICBvYmpNd2FyZXMucHVzaChhY3R1YWxNd2FyZSlcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZGVsZXRlRnJvbUFycmF5KG9iak13YXJlcywgYWN0dWFsTXdhcmUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgdHlwZSB7IEFueURhdGFNb2RlbCB9IGZyb20gXCIuLi9kYXRhTW9kZWwvQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQge1xuICBBY3Rpb25Db250ZXh0LFxuICBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSxcbiAgZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQsXG4gIHNldEN1cnJlbnRBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IGlzTW9kZWxBY3Rpb24sIG1vZGVsQWN0aW9uU3ltYm9sIH0gZnJvbSBcIi4vaXNNb2RlbEFjdGlvblwiXG5pbXBvcnQgeyBnZXRBY3Rpb25NaWRkbGV3YXJlcyB9IGZyb20gXCIuL21pZGRsZXdhcmVcIlxuaW1wb3J0IHR5cGUgeyBGbG93RmluaXNoZXIgfSBmcm9tIFwiLi9tb2RlbEZsb3dcIlxuaW1wb3J0IHsgdHJ5UnVuUGVuZGluZ0FjdGlvbnMgfSBmcm9tIFwiLi9wZW5kaW5nQWN0aW9uc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuID0gKGN0eDogTy5Xcml0YWJsZTxBY3Rpb25Db250ZXh0Piwgc2VsZjogYW55KSA9PiB2b2lkXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5BY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPih7XG4gIG5hbWVPck5hbWVGbixcbiAgZm4sXG4gIGFjdGlvblR5cGUsXG4gIG92ZXJyaWRlQ29udGV4dCxcbiAgaXNGbG93RmluaXNoZXIgPSBmYWxzZSxcbn06IHtcbiAgbmFtZU9yTmFtZUZuOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKVxuICBmbjogVFxuICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZVxuICBvdmVycmlkZUNvbnRleHQ/OiBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGblxuICBpc0Zsb3dGaW5pc2hlcj86IGJvb2xlYW5cbn0pOiBUIHtcbiAgbGV0IGZuSW5BY3Rpb24gPSBmYWxzZVxuXG4gIGNvbnN0IHdyYXBwZWRBY3Rpb24gPSBmdW5jdGlvbiAodGhpczogYW55KSB7XG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JOYW1lRm4gPT09IFwiZnVuY3Rpb25cIiA/IG5hbWVPck5hbWVGbigpIDogbmFtZU9yTmFtZUZuXG5cbiAgICBpZiAoIWZuSW5BY3Rpb24pIHtcbiAgICAgIGZuSW5BY3Rpb24gPSB0cnVlXG5cbiAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBvbmx5IGlubmVyIGFjdGlvbnMgYWN0dWFsIG1vYnggYWN0aW9uc1xuICAgICAgLy8gc28gcmVhY3Rpb25zIChlLmcuIHJlZmVyZW5jZSBkZXRhY2hpbmcpIGFyZSBwaWNrZWQgdXAgaW4gdGhlXG4gICAgICAvLyByaWdodCBjb250ZXh0XG4gICAgICBmbiA9IGFjdGlvbihuYW1lLCBmbilcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzXG5cbiAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKVxuXG4gICAgY29uc3QgY29udGV4dDogTy5Xcml0YWJsZTxBY3Rpb25Db250ZXh0PiA9IHtcbiAgICAgIGFjdGlvbk5hbWU6IG5hbWUsXG4gICAgICB0eXBlOiBhY3Rpb25UeXBlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgYXJnczogQXJyYXkuZnJvbShhcmd1bWVudHMpLFxuICAgICAgcGFyZW50Q29udGV4dCxcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgcm9vdENvbnRleHQ6IHVuZGVmaW5lZCBhcyBhbnksIC8vIHdpbGwgYmUgc2V0IGFmdGVyIHRoZSBvdmVycmlkZVxuICAgIH1cbiAgICBpZiAob3ZlcnJpZGVDb250ZXh0KSB7XG4gICAgICBvdmVycmlkZUNvbnRleHQoY29udGV4dCwgdGhpcylcbiAgICB9XG4gICAgaWYgKCFjb250ZXh0LnJvb3RDb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dC5wcmV2aW91c0FzeW5jU3RlcENvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC5yb290Q29udGV4dCA9IGNvbnRleHQucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0LnJvb3RDb250ZXh0XG4gICAgICB9IGVsc2UgaWYgKGNvbnRleHQucGFyZW50Q29udGV4dCkge1xuICAgICAgICBjb250ZXh0LnJvb3RDb250ZXh0ID0gY29udGV4dC5wYXJlbnRDb250ZXh0LnJvb3RDb250ZXh0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LnJvb3RDb250ZXh0ID0gY29udGV4dFxuICAgICAgfVxuICAgIH1cblxuICAgIHNldEN1cnJlbnRBY3Rpb25Db250ZXh0KGNvbnRleHQpXG5cbiAgICBsZXQgbXdhcmVGbjogKCkgPT4gYW55ID0gZm4uYmluZCh0YXJnZXQsIC4uLmFyZ3VtZW50cylcbiAgICBjb25zdCBtd2FyZUl0ZXIgPSBnZXRBY3Rpb25NaWRkbGV3YXJlcyhjb250ZXh0LnRhcmdldClbU3ltYm9sLml0ZXJhdG9yXSgpXG4gICAgbGV0IG13YXJlQ3VyID0gbXdhcmVJdGVyLm5leHQoKVxuICAgIHdoaWxlICghbXdhcmVDdXIuZG9uZSkge1xuICAgICAgY29uc3QgbXdhcmUgPSBtd2FyZUN1ci52YWx1ZVxuXG4gICAgICBjb25zdCBmaWx0ZXJQYXNzZWQgPSBtd2FyZS5maWx0ZXIgPyBtd2FyZS5maWx0ZXIoY29udGV4dCkgOiB0cnVlXG4gICAgICBpZiAoZmlsdGVyUGFzc2VkKSB7XG4gICAgICAgIG13YXJlRm4gPSBtd2FyZS5taWRkbGV3YXJlLmJpbmQodW5kZWZpbmVkLCBjb250ZXh0LCBtd2FyZUZuKVxuICAgICAgfVxuXG4gICAgICBtd2FyZUN1ciA9IG13YXJlSXRlci5uZXh0KClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gbXdhcmVGbigpXG5cbiAgICAgIGlmIChpc0Zsb3dGaW5pc2hlcikge1xuICAgICAgICBjb25zdCBmbG93RmluaXNoZXIgPSByZXQgYXMgRmxvd0ZpbmlzaGVyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZmxvd0ZpbmlzaGVyLnZhbHVlXG4gICAgICAgIGlmIChmbG93RmluaXNoZXIucmVzb2x1dGlvbiA9PT0gXCJhY2NlcHRcIikge1xuICAgICAgICAgIGZsb3dGaW5pc2hlci5hY2NlcHRlcih2YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbG93RmluaXNoZXIucmVqZWN0ZXIodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlIC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgZXZlbiBuZWVkZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudEFjdGlvbkNvbnRleHQoY29udGV4dC5wYXJlbnRDb250ZXh0KVxuXG4gICAgICB0cnlSdW5QZW5kaW5nQWN0aW9ucygpXG4gICAgfVxuICB9XG4gIDsod3JhcHBlZEFjdGlvbiBhcyBhbnkpW21vZGVsQWN0aW9uU3ltYm9sXSA9IHRydWVcblxuICByZXR1cm4gd3JhcHBlZEFjdGlvbiBhcyBhbnlcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNb2RlbE1ldGhvZEluQWN0aW9uSWZOZWVkZWQ8TSBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BlcnR5S2V5OiBrZXlvZiBNLFxuICBuYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCBmbiA9IG1vZGVsW3Byb3BlcnR5S2V5XSBhcyBhbnlcbiAgaWYgKGlzTW9kZWxBY3Rpb24oZm4pKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB3cmFwcGVkRm4gPSB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICBmbixcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcbiAgY29uc3QgcHJvdG9GbiA9IHByb3RvW3Byb3BlcnR5S2V5XVxuICBpZiAocHJvdG9GbiA9PT0gZm4pIHtcbiAgICBwcm90b1twcm9wZXJ0eUtleV0gPSB3cmFwcGVkRm5cbiAgfSBlbHNlIHtcbiAgICBtb2RlbFtwcm9wZXJ0eUtleV0gPSB3cmFwcGVkRm5cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlQXJyYXksIGlzT2JzZXJ2YWJsZU9iamVjdCwgcmVtb3ZlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi4vYWN0aW9uL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50UGF0aEluY2x1ZGluZ0RhdGFPYmplY3RzIH0gZnJvbSBcIi4vcGF0aFwiXG5cbi8qKlxuICogRGV0YWNoZXMgYSBnaXZlbiBvYmplY3QgZnJvbSBhIHRyZWUuXG4gKiBJZiB0aGUgcGFyZW50IGlzIGFuIG9iamVjdCAvIG1vZGVsLCBkZXRhY2hpbmcgd2lsbCBkZWxldGUgdGhlIHByb3BlcnR5LlxuICogSWYgdGhlIHBhcmVudCBpcyBhbiBhcnJheSBkZXRhY2hpbmcgd2lsbCByZW1vdmUgdGhlIG5vZGUgYnkgc3BsaWNpbmcgaXQuXG4gKiBJZiB0aGVyZSdzIG5vIHBhcmVudCBpdCB3aWxsIHRocm93LlxuICpcbiAqIEBwYXJhbSBub2RlIE9iamVjdCB0byBiZSBkZXRhY2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaChub2RlOiBvYmplY3QpOiB2b2lkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICB3cmFwcGVkSW50ZXJuYWxEZXRhY2goKS5jYWxsKG5vZGUpXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbERldGFjaCA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uRGV0YWNoLFxuICAgIGZuOiBpbnRlcm5hbERldGFjaCxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuXG5mdW5jdGlvbiBpbnRlcm5hbERldGFjaCh0aGlzOiBvYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgbm9kZSA9IHRoaXNcblxuICBjb25zdCBwYXJlbnRQYXRoID0gZmFzdEdldFBhcmVudFBhdGhJbmNsdWRpbmdEYXRhT2JqZWN0cyhub2RlKVxuICBpZiAoIXBhcmVudFBhdGgpIHJldHVyblxuXG4gIGNvbnN0IHsgcGFyZW50LCBwYXRoIH0gPSBwYXJlbnRQYXRoXG4gIGlmIChpc09ic2VydmFibGVBcnJheShwYXJlbnQpKSB7XG4gICAgcGFyZW50LnNwbGljZSgrcGF0aCwgMSlcbiAgfSBlbHNlIGlmIChpc09ic2VydmFibGVPYmplY3QocGFyZW50KSkge1xuICAgIHJlbW92ZShwYXJlbnQsIFwiXCIgKyBwYXRoKVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoXCJwYXJlbnQgbXVzdCBiZSBhbiBvYnNlcnZhYmxlIG9iamVjdCBvciBhbiBvYnNlcnZhYmxlIGFycmF5XCIpXG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzKGZuTmFtZTogc3RyaW5nLCB0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykge1xuICBpZiAodHlwZW9mIHByb3BlcnR5S2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShgJHtmbk5hbWV9IGNhbm5vdCBiZSB1c2VkIG92ZXIgc3ltYm9sIHByb3BlcnRpZXNgKVxuICB9XG5cbiAgY29uc3QgZXJyTWVzc2FnZSA9IGAke2ZuTmFtZX0gbXVzdCBiZSB1c2VkIG92ZXIgbW9kZWwgY2xhc3NlcyBvciBpbnN0YW5jZXNgXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICAvLyBjaGVjayB0YXJnZXQgaXMgYSBtb2RlbCBvYmplY3Qgb3IgZXh0ZW5kZWQgY2xhc3NcbiAgY29uc3QgaXNNb2RlbCA9XG4gICAgdGFyZ2V0IGluc3RhbmNlb2YgQmFzZU1vZGVsIHx8IHRhcmdldCA9PT0gQmFzZU1vZGVsIHx8IHRhcmdldC5wcm90b3R5cGUgaW5zdGFuY2VvZiBCYXNlTW9kZWxcbiAgaWYgKGlzTW9kZWwpIHJldHVyblxuXG4gIGNvbnN0IGlzRGF0YU1vZGVsID1cbiAgICB0YXJnZXQgaW5zdGFuY2VvZiBCYXNlRGF0YU1vZGVsIHx8XG4gICAgdGFyZ2V0ID09PSBCYXNlRGF0YU1vZGVsIHx8XG4gICAgdGFyZ2V0LnByb3RvdHlwZSBpbnN0YW5jZW9mIEJhc2VEYXRhTW9kZWxcbiAgaWYgKGlzRGF0YU1vZGVsKSByZXR1cm5cblxuICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG59XG4iLCJpbXBvcnQgeyBzZXREYXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vZGF0YU1vZGVsL2FjdGlvbnNcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWwsIGlzRGF0YU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL3V0aWxzXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxTeW1ib2xzXCJcbmltcG9ydCB7IGFkZExhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUoXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nXG4pOiB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpXG4gIG92ZXJyaWRlQ29udGV4dDogV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gfCB1bmRlZmluZWRcbn0ge1xuICBsZXQgYWN0aW9uTmFtZTogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgPSBwcm9wZXJ0eUtleVxuICBsZXQgb3ZlcnJpZGVDb250ZXh0OiBXcmFwSW5BY3Rpb25PdmVycmlkZUNvbnRleHRGbiB8IHVuZGVmaW5lZFxuXG4gIGlmIChpc0RhdGFNb2RlbENsYXNzKHRhcmdldCkgfHwgaXNEYXRhTW9kZWwodGFyZ2V0KSkge1xuICAgIG92ZXJyaWRlQ29udGV4dCA9IChjdHgsIHNlbGYpID0+IHtcbiAgICAgIGN0eC50YXJnZXQgPSBzZWxmLiRcbiAgICB9XG5cbiAgICBsZXQgZnVsbEFjdGlvbk5hbWU6IHN0cmluZ1xuICAgIGFjdGlvbk5hbWUgPSAoKSA9PiBmdWxsQWN0aW9uTmFtZVxuXG4gICAgY29uc3QgbW9kZWxDbGFzczogYW55ID0gaXNEYXRhTW9kZWxDbGFzcyh0YXJnZXQpID8gdGFyZ2V0IDogdGFyZ2V0LmNvbnN0cnVjdG9yXG5cbiAgICBhZGRMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbihtb2RlbENsYXNzLCBydW5BZnRlck1vZGVsRGVjb3JhdG9yU3ltYm9sLCAoZmluYWxDbGFzcykgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJbmZvID0gbW9kZWxJbmZvQnlDbGFzcy5nZXQoZmluYWxDbGFzcykhXG4gICAgICBmdWxsQWN0aW9uTmFtZSA9IGBmbjo6JHttb2RlbEluZm8ubmFtZX06OiR7cHJvcGVydHlLZXl9YFxuICAgICAgc2V0RGF0YU1vZGVsQWN0aW9uKGZ1bGxBY3Rpb25OYW1lLCBtb2RlbEluZm8uY2xhc3MsIHByb3BlcnR5S2V5KVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHsgYWN0aW9uTmFtZSwgb3ZlcnJpZGVDb250ZXh0IH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXG5pbXBvcnQgeyBjaGVja01vZGVsRGVjb3JhdG9yQXJncyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9jaGVja01vZGVsRGVjb3JhdG9yQXJnc1wiXG5pbXBvcnQgeyBkZWNvcmF0ZVdyYXBNZXRob2RPckZpZWxkLCBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUgfSBmcm9tIFwiLi9hY3Rpb25EZWNvcmF0b3JVdGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0LCBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSwgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiwgV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG5jb25zdCBtb2RlbEZsb3dTeW1ib2wgPSBTeW1ib2woXCJtb2RlbEZsb3dcIilcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb3c8UiwgQXJncyBleHRlbmRzIGFueVtdPih7XG4gIG5hbWVPck5hbWVGbixcbiAgZ2VuZXJhdG9yLFxuICBvdmVycmlkZUNvbnRleHQsXG59OiB7XG4gIG5hbWVPck5hbWVGbjogc3RyaW5nIHwgKCgpID0+IHN0cmluZylcbiAgZ2VuZXJhdG9yOiAoLi4uYXJnczogQXJncykgPT4gSXRlcmFibGVJdGVyYXRvcjxhbnk+XG4gIG92ZXJyaWRlQ29udGV4dD86IFdyYXBJbkFjdGlvbk92ZXJyaWRlQ29udGV4dEZuXG59KTogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8YW55PiB7XG4gIC8vIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS90ai9jby9ibG9iL21hc3Rlci9pbmRleC5qc1xuICBjb25zdCBmbG93Rm4gPSBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgbmFtZU9yTmFtZUZuID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lT3JOYW1lRm4oKSA6IG5hbWVPck5hbWVGblxuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpc1xuXG4gICAgbGV0IHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dDogQWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgY3R4T3ZlcnJpZGUgPSAoc3RlcFR5cGU6IEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlKTogV3JhcEluQWN0aW9uT3ZlcnJpZGVDb250ZXh0Rm4gPT4ge1xuICAgICAgcmV0dXJuIChjdHg6IE8uV3JpdGFibGU8QWN0aW9uQ29udGV4dD4sIHNlbGYpID0+IHtcbiAgICAgICAgaWYgKG92ZXJyaWRlQ29udGV4dCkge1xuICAgICAgICAgIG92ZXJyaWRlQ29udGV4dChjdHgsIHNlbGYpXG4gICAgICAgIH1cblxuICAgICAgICBjdHgucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0ID0gcHJldmlvdXNBc3luY1N0ZXBDb250ZXh0XG4gICAgICAgIGN0eC5zcGF3bkFzeW5jU3RlcENvbnRleHQgPSBwcmV2aW91c0FzeW5jU3RlcENvbnRleHRcbiAgICAgICAgICA/IHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dC5zcGF3bkFzeW5jU3RlcENvbnRleHRcbiAgICAgICAgICA6IGN0eFxuICAgICAgICBjdHguYXN5bmNTdGVwVHlwZSA9IHN0ZXBUeXBlXG4gICAgICAgIGN0eC5hcmdzID0gYXJnc1xuXG4gICAgICAgIHByZXZpb3VzQXN5bmNTdGVwQ29udGV4dCA9IGN0eFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBnZW5lcmF0b3JSdW4gPSBmYWxzZVxuICAgIGNvbnN0IGdlbiA9IHdyYXBJbkFjdGlvbih7XG4gICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICBmbjogKCkgPT4ge1xuICAgICAgICBnZW5lcmF0b3JSdW4gPSB0cnVlXG4gICAgICAgIHJldHVybiBnZW5lcmF0b3IuYXBwbHkodGFyZ2V0LCBhcmdzIGFzIEFyZ3MpXG4gICAgICB9LFxuICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlNwYXduKSxcbiAgICB9KS5hcHBseSh0YXJnZXQpXG5cbiAgICBpZiAoIWdlbmVyYXRvclJ1bikge1xuICAgICAgLy8gbWF5YmUgaXQgZ290IG92ZXJyaWRkZW4gaW50byBhIHN5bmMgYWN0aW9uXG5cbiAgICAgIHJldHVybiBnZW4gaW5zdGFuY2VvZiBQcm9taXNlID8gZ2VuIDogUHJvbWlzZS5yZXNvbHZlKGdlbilcbiAgICB9XG5cbiAgICAvLyB1c2UgYm91bmQgZnVuY3Rpb25zIHRvIGZpeCBlczYgY29tcGlsYXRpb25cbiAgICBjb25zdCBnZW5OZXh0ID0gZ2VuLm5leHQuYmluZChnZW4pXG4gICAgY29uc3QgZ2VuVGhyb3cgPSBnZW4udGhyb3chLmJpbmQoZ2VuKVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFI+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbGVkKHJlczogYW55KTogdm9pZCB7XG4gICAgICAgIGxldCByZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgICAgbmFtZU9yTmFtZUZuOiBuYW1lLFxuICAgICAgICAgICAgZm46IGdlbk5leHQsXG4gICAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgICAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lKSxcbiAgICAgICAgICB9KS5jYWxsKHRhcmdldCwgcmVzKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgICAgICAgIGZuOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgZmxvdyBmaW5pc2hlciB0byBhbGxvdyBtaWRkbGV3YXJlcyB0byB0d2VhayB0aGUgcmV0dXJuIHZhbHVlIGJlZm9yZSByZXNvbHV0aW9uXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVycixcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiBcInJlamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgYWNjZXB0ZXI6IHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0ZXI6IHJlamVjdCxcbiAgICAgICAgICAgICAgfSBhcyBGbG93RmluaXNoZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5Bc3luYyxcbiAgICAgICAgICAgIG92ZXJyaWRlQ29udGV4dDogY3R4T3ZlcnJpZGUoQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuVGhyb3cpLFxuICAgICAgICAgICAgaXNGbG93RmluaXNoZXI6IHRydWUsXG4gICAgICAgICAgfSkuY2FsbCh0YXJnZXQsIGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBuZXh0KHJldClcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25SZWplY3RlZChlcnI6IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgcmV0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gd3JhcEluQWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWVPck5hbWVGbjogbmFtZSxcbiAgICAgICAgICAgIGZuOiBnZW5UaHJvdyxcbiAgICAgICAgICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jLFxuICAgICAgICAgICAgb3ZlcnJpZGVDb250ZXh0OiBjdHhPdmVycmlkZShBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWVFcnJvciksXG4gICAgICAgICAgfSkuY2FsbCh0YXJnZXQsIGVycilcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICAgICAgICBmbjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIC8vIHdlIHVzZSBhIGZsb3cgZmluaXNoZXIgdG8gYWxsb3cgbWlkZGxld2FyZXMgdG8gdHdlYWsgdGhlIHJldHVybiB2YWx1ZSBiZWZvcmUgcmVzb2x1dGlvblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBlcnIsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogXCJyZWplY3RcIixcblxuICAgICAgICAgICAgICAgIGFjY2VwdGVyOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdGVyOiByZWplY3QsXG4gICAgICAgICAgICAgIH0gYXMgRmxvd0ZpbmlzaGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICAgICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlRocm93KSxcbiAgICAgICAgICAgIGlzRmxvd0ZpbmlzaGVyOiB0cnVlLFxuICAgICAgICAgIH0pLmNhbGwodGFyZ2V0LCBlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dChyZXQpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG5leHQocmV0OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHJldCAmJiB0eXBlb2YgcmV0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIGFuIGFzeW5jIGl0ZXJhdG9yXG4gICAgICAgICAgcmV0LnRoZW4obmV4dCwgcmVqZWN0KVxuICAgICAgICB9IGVsc2UgaWYgKHJldC5kb25lKSB7XG4gICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgIHdyYXBJbkFjdGlvbih7XG4gICAgICAgICAgICBuYW1lT3JOYW1lRm46IG5hbWUsXG4gICAgICAgICAgICBmbjogKHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIC8vIHdlIHVzZSBhIGZsb3cgZmluaXNoZXIgdG8gYWxsb3cgbWlkZGxld2FyZXMgdG8gdHdlYWsgdGhlIHJldHVybiB2YWx1ZSBiZWZvcmUgcmVzb2x1dGlvblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogXCJhY2NlcHRcIixcblxuICAgICAgICAgICAgICAgIGFjY2VwdGVyOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdGVyOiByZWplY3QsXG4gICAgICAgICAgICAgIH0gYXMgRmxvd0ZpbmlzaGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuQXN5bmMsXG4gICAgICAgICAgICBvdmVycmlkZUNvbnRleHQ6IGN0eE92ZXJyaWRlKEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJldHVybiksXG4gICAgICAgICAgICBpc0Zsb3dGaW5pc2hlcjogdHJ1ZSxcbiAgICAgICAgICB9KS5jYWxsKHRhcmdldCwgcmV0LnZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbnRpbnVlXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJldC52YWx1ZSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvbkZ1bGZpbGxlZCh1bmRlZmluZWQpIC8vIGtpY2sgb2ZmIHRoZSBwcm9jZXNzXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cbiAgOyhmbG93Rm4gYXMgYW55KVttb2RlbEZsb3dTeW1ib2xdID0gdHJ1ZVxuXG4gIHJldHVybiBmbG93Rm5cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93RmluaXNoZXIge1xuICB2YWx1ZTogYW55XG4gIHJlc29sdXRpb246IFwiYWNjZXB0XCIgfCBcInJlamVjdFwiXG5cbiAgYWNjZXB0ZXIodmFsdWU6IGFueSk6IHZvaWRcbiAgcmVqZWN0ZXIodmFsdWU6IGFueSk6IHZvaWRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIG1vZGVsIGZsb3cgb3Igbm90LlxuICpcbiAqIEBwYXJhbSBmbiBGdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsRmxvdyhmbjogdW5rbm93bikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgJiYgbW9kZWxGbG93U3ltYm9sIGluIGZuXG59XG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgdHVybnMgYSBmdW5jdGlvbiBnZW5lcmF0b3IgaW50byBhIG1vZGVsIGZsb3cuXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHByb3BlcnR5S2V5XG4gKiBAcGFyYW0gW2Jhc2VEZXNjcmlwdG9yXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsRmxvdyhcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gIGJhc2VEZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4pOiB2b2lkIHtcbiAgY29uc3QgeyBhY3Rpb25OYW1lLCBvdmVycmlkZUNvbnRleHQgfSA9IGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUodGFyZ2V0LCBwcm9wZXJ0eUtleSlcblxuICByZXR1cm4gZGVjb3JhdGVXcmFwTWV0aG9kT3JGaWVsZChcbiAgICBcIm1vZGVsRmxvd1wiLFxuICAgIHtcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgYmFzZURlc2NyaXB0b3IsXG4gICAgfSxcbiAgICAoZGF0YSwgZm4pID0+IHtcbiAgICAgIGlmIChpc01vZGVsRmxvdyhmbikpIHtcbiAgICAgICAgcmV0dXJuIGZuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja01vZGVsRmxvd0FyZ3MoZGF0YS50YXJnZXQsIGRhdGEucHJvcGVydHlLZXksIGZuKVxuXG4gICAgICAgIHJldHVybiBmbG93KHsgbmFtZU9yTmFtZUZuOiBhY3Rpb25OYW1lLCBnZW5lcmF0b3I6IGZuLCBvdmVycmlkZUNvbnRleHQgfSlcbiAgICAgIH1cbiAgICB9XG4gIClcbn1cblxuZnVuY3Rpb24gY2hlY2tNb2RlbEZsb3dBcmdzKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IGZhaWx1cmUoXCJtb2RlbEZsb3cgaGFzIHRvIGJlIHVzZWQgb3ZlciBmdW5jdGlvbnNcIilcbiAgfVxuICBjaGVja01vZGVsRGVjb3JhdG9yQXJncyhcIm1vZGVsRmxvd1wiLCB0YXJnZXQsIHByb3BlcnR5S2V5KVxufVxuXG4vKipcbiAqIFRyaWNrcyB0aGUgVFMgY29tcGlsZXIgaW50byB0aGlua2luZyB0aGF0IGEgbW9kZWwgZmxvdyBnZW5lcmF0b3IgZnVuY3Rpb24gY2FuIGJlIGF3YWl0ZWRcbiAqIChpcyBhIHByb21pc2UpLlxuICpcbiAqIEB0eXBlcGFyYW0gQSBGdW5jdGlvbiBhcmd1bWVudHMuXG4gKiBAdHlwZXBhcmFtIFIgUmV0dXJuIHZhbHVlLlxuICogQHBhcmFtIGZuIEZsb3cgZnVuY3Rpb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gX2FzeW5jPEEgZXh0ZW5kcyBhbnlbXSwgUj4oXG4gIGZuOiAoLi4uYXJnczogQSkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55PlxuKTogKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4ge1xuICByZXR1cm4gZm4gYXMgYW55XG59XG5cbi8qKlxuICogTWFrZXMgYSBwcm9taXNlIGEgZmxvdywgc28gaXQgY2FuIGJlIGF3YWl0ZWQgd2l0aCB5aWVsZCouXG4gKlxuICogQHR5cGVwYXJhbSBUIFByb21pc2UgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0gcHJvbWlzZSBQcm9taXNlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hd2FpdDxUPihwcm9taXNlOiBQcm9taXNlPFQ+KTogR2VuZXJhdG9yPFByb21pc2U8VD4sIFQsIHVua25vd24+IHtcbiAgcmV0dXJuIHByb21pc2VHZW5lcmF0b3IuY2FsbChwcm9taXNlKVxufVxuXG4vKlxuZnVuY3Rpb24qIHByb21pc2VHZW5lcmF0b3I8VD4oXG4gIHRoaXM6IFByb21pc2U8VD5cbikge1xuICBjb25zdCByZXQ6IFQgPSB5aWVsZCB0aGlzXG4gIHJldHVybiByZXRcbn1cbiovXG5cbi8vIGFib3ZlIGNvZGUgYnV0IGNvbXBpbGVkIGJ5IFRTIGZvciBFUzVcbi8vIHNvIHdlIGRvbid0IGluY2x1ZGUgYSBkZXBlbmRlbmN5IHRvIHJlZ2VuZXJhdG9yIHJ1bnRpbWVcblxuY29uc3QgX19nZW5lcmF0b3IgPSBmdW5jdGlvbiAodGhpc0FyZzogYW55LCBib2R5OiBhbnkpIHtcbiAgbGV0IF86IGFueSA9IHtcbiAgICAgIGxhYmVsOiAwLFxuICAgICAgc2VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV1cbiAgICAgICAgcmV0dXJuIHRbMV1cbiAgICAgIH0sXG4gICAgICB0cnlzOiBbXSxcbiAgICAgIG9wczogW10sXG4gICAgfSxcbiAgICBmOiBhbnksXG4gICAgeTogYW55LFxuICAgIHQ6IGFueSxcbiAgICBnOiBhbnlcbiAgcmV0dXJuIChcbiAgICAoZyA9IHsgbmV4dDogdmVyYigwKSwgdGhyb3c6IHZlcmIoMSksIHJldHVybjogdmVyYigyKSB9KSxcbiAgICB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICB9KSxcbiAgICBnXG4gIClcbiAgZnVuY3Rpb24gdmVyYihuOiBhbnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHY6IGFueSkge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzdGVwKG9wOiBhbnkpIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIilcbiAgICB3aGlsZSAoXylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGYgPSAxKSxcbiAgICAgICAgICB5ICYmXG4gICAgICAgICAgICAodCA9XG4gICAgICAgICAgICAgIG9wWzBdICYgMlxuICAgICAgICAgICAgICAgID8geVtcInJldHVyblwiXVxuICAgICAgICAgICAgICAgIDogb3BbMF1cbiAgICAgICAgICAgICAgICA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApXG4gICAgICAgICAgICAgICAgOiB5Lm5leHQpICYmXG4gICAgICAgICAgICAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgaWYgKCgoeSA9IDApLCB0KSkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXVxuICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHQgPSBvcFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfLmxhYmVsKytcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfVxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF8ubGFiZWwrK1xuICAgICAgICAgICAgeSA9IG9wWzFdXG4gICAgICAgICAgICBvcCA9IFswXVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpXG4gICAgICAgICAgICBfLnRyeXMucG9wKClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgISgodCA9IF8udHJ5cyksICh0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkpICYmXG4gICAgICAgICAgICAgIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBfID0gMFxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdXG4gICAgICAgICAgICAgIHQgPSBvcFxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl1cbiAgICAgICAgICAgICAgXy5vcHMucHVzaChvcClcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKVxuICAgICAgICAgICAgXy50cnlzLnBvcCgpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9wID0gWzYsIGVdXG4gICAgICAgIHkgPSAwXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmID0gdCA9IDBcbiAgICAgIH1cbiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXVxuICAgIHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9taXNlR2VuZXJhdG9yKHRoaXM6IFByb21pc2U8YW55Pikge1xuICBsZXQgcmV0XG4gIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAodGhpczogYW55LCBfYTogYW55KSB7XG4gICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXVxuICAgICAgY2FzZSAxOlxuICAgICAgICByZXQgPSBfYS5zZW50KClcbiAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJldF1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7IGlzTW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL2lzTW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgZmxvdywgaXNNb2RlbEZsb3cgfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsRmxvd1wiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL3dyYXBJbkFjdGlvblwiXG5pbXBvcnQgeyBhc3NlcnRJc1RyZWVOb2RlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBhc3NlcnRJc0Z1bmN0aW9uLCBmYWlsdXJlLCBsb2dXYXJuaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdpdGggYW4gb2JqZWN0IGFzIHRhcmdldC5cbiAqL1xudHlwZSBUYXJnZXRlZEFjdGlvbiA9ICh0YXJnZXQ6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueVxuXG5jb25zdCBzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgVGFyZ2V0ZWRBY3Rpb24+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYWxvbmVBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkuZ2V0KGFjdGlvbk5hbWUpXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdGFuZGFsb25lQWN0aW9uKGZ1bGxBY3Rpb25OYW1lOiBzdHJpbmcsIGZuOiBUYXJnZXRlZEFjdGlvbiwgaXNGbG93OiBib29sZWFuKSB7XG4gIGFzc2VydElzRnVuY3Rpb24oZm4sIGZ1bGxBY3Rpb25OYW1lKVxuXG4gIGlmIChzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkuaGFzKGZ1bGxBY3Rpb25OYW1lKSkge1xuICAgIGxvZ1dhcm5pbmcoXG4gICAgICBcIndhcm5cIixcbiAgICAgIGBhbiBzdGFuZGFsb25lIGFjdGlvbiB3aXRoIG5hbWUgXCIke2Z1bGxBY3Rpb25OYW1lfVwiIGFscmVhZHkgZXhpc3RzIChpZiB5b3UgYXJlIHVzaW5nIGhvdC1yZWxvYWRpbmcgeW91IG1heSBzYWZlbHkgaWdub3JlIHRoaXMgd2FybmluZylgLFxuICAgICAgYGR1cGxpY2F0ZUFjdGlvbk5hbWUgLSAke2Z1bGxBY3Rpb25OYW1lfWBcbiAgICApXG4gIH1cblxuICBpZiAoaXNNb2RlbEFjdGlvbihmbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwidGhlIHN0YW5kYWxvbmUgYWN0aW9uIG11c3Qgbm90IGJlIHByZXZpb3VzbHkgbWFya2VkIGFzIGFuIGFjdGlvblwiKVxuICB9XG4gIGlmIChpc01vZGVsRmxvdyhmbikpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwidGhlIHN0YW5kYWxvbmUgYWN0aW9uIG11c3Qgbm90IGJlIHByZXZpb3VzbHkgbWFya2VkIGFzIGEgZmxvdyBhY3Rpb25cIilcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRBY3Rpb24gPSBpc0Zsb3dcbiAgICA/IGZsb3coeyBuYW1lT3JOYW1lRm46IGZ1bGxBY3Rpb25OYW1lLCBnZW5lcmF0b3I6IGZuIH0pXG4gICAgOiB3cmFwSW5BY3Rpb24oe1xuICAgICAgICBuYW1lT3JOYW1lRm46IGZ1bGxBY3Rpb25OYW1lLFxuICAgICAgICBmbixcbiAgICAgICAgYWN0aW9uVHlwZTogQWN0aW9uQ29udGV4dEFjdGlvblR5cGUuU3luYyxcbiAgICAgIH0pXG5cbiAgY29uc3QgZmluYWxBY3Rpb24gPSAodGFyZ2V0OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgYXNzZXJ0SXNUcmVlTm9kZSh0YXJnZXQsIFwidGFyZ2V0XCIpXG5cbiAgICAvLyB3ZSBuZWVkIHRvIHB1dCB0aGUgdGFyZ2V0IGludG8gdGhpc1xuICAgIHJldHVybiB3cmFwcGVkQWN0aW9uLmNhbGwodGFyZ2V0LCB0YXJnZXQsIC4uLmFyZ3MpXG4gIH1cblxuICBzdGFuZGFsb25lQWN0aW9uUmVnaXN0cnkuc2V0KGZ1bGxBY3Rpb25OYW1lLCBmaW5hbEFjdGlvbilcbiAgcmV0dXJuIGZpbmFsQWN0aW9uXG59XG4iLCJpbXBvcnQgeyByZW1vdmUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJ1aWx0SW5BY3Rpb24gfSBmcm9tIFwiLi9idWlsdEluQWN0aW9uc1wiXG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZSB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHsgd3JhcEluQWN0aW9uIH0gZnJvbSBcIi4vd3JhcEluQWN0aW9uXCJcblxuLyoqXG4gKiBEZWxldGVzIGFuIG9iamVjdCBmaWVsZCB3cmFwcGVkIGluIGFuIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAgVGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBmaWVsZE5hbWUgRmllbGQgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVsZXRlPE8gZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBPPihub2RlOiBPLCBmaWVsZE5hbWU6IEspOiB2b2lkIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIiwgdHJ1ZSlcblxuICB3cmFwcGVkSW50ZXJuYWxBcHBseURlbGV0ZSgpLmNhbGwobm9kZSwgZmllbGROYW1lIGFzIHN0cmluZyB8IG51bWJlcilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlEZWxldGU8TyBleHRlbmRzIG9iamVjdD4odGhpczogTywgZmllbGROYW1lOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgcmVtb3ZlKHRoaXMsIFwiXCIgKyBmaWVsZE5hbWUpXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5RGVsZXRlID0gbGF6eSgoKSA9PlxuICB3cmFwSW5BY3Rpb24oe1xuICAgIG5hbWVPck5hbWVGbjogQnVpbHRJbkFjdGlvbi5BcHBseURlbGV0ZSxcbiAgICBmbjogaW50ZXJuYWxBcHBseURlbGV0ZSxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuIiwiaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgQWN0aW9uQ29udGV4dEFjdGlvblR5cGUgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IHdyYXBJbkFjdGlvbiB9IGZyb20gXCIuL3dyYXBJbkFjdGlvblwiXG5cbnR5cGUgQW55RnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IGFueVxuXG4vKipcbiAqIENhbGxzIGFuIG9iamVjdCBtZXRob2Qgd3JhcHBlZCBpbiBhbiBhY3Rpb24uXG4gKlxuICogQHBhcmFtIG5vZGUgIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSBNZXRob2QgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWV0aG9kQ2FsbDxPIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgTywgRk4gZXh0ZW5kcyBPW0tdPihcbiAgbm9kZTogTyxcbiAgbWV0aG9kTmFtZTogSyxcbiAgLi4uYXJnczogRk4gZXh0ZW5kcyBBbnlGdW5jdGlvbiA/IFBhcmFtZXRlcnM8Rk4+IDogbmV2ZXJcbik6IEZOIGV4dGVuZHMgQW55RnVuY3Rpb24gPyBSZXR1cm5UeXBlPEZOPiA6IG5ldmVyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICByZXR1cm4gd3JhcHBlZEludGVybmFsQXBwbHlNZXRob2RDYWxsKCkuY2FsbChub2RlLCBtZXRob2ROYW1lIGFzIHN0cmluZyB8IG51bWJlciwgYXJncylcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQXBwbHlNZXRob2RDYWxsKHRoaXM6IGFueSwgbWV0aG9kTmFtZTogc3RyaW5nIHwgbnVtYmVyLCBhcmdzOiBhbnlbXSk6IGFueSB7XG4gIHJldHVybiB0aGlzW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG59XG5cbmNvbnN0IHdyYXBwZWRJbnRlcm5hbEFwcGx5TWV0aG9kQ2FsbCA9IGxhenkoKCkgPT5cbiAgd3JhcEluQWN0aW9uKHtcbiAgICBuYW1lT3JOYW1lRm46IEJ1aWx0SW5BY3Rpb24uQXBwbHlNZXRob2RDYWxsLFxuICAgIGZuOiBpbnRlcm5hbEFwcGx5TWV0aG9kQ2FsbCxcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICB9KVxuKVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiB9IGZyb20gXCIuL2J1aWx0SW5BY3Rpb25zXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG4vKipcbiAqIFNldHMgYW4gb2JqZWN0IGZpZWxkIHdyYXBwZWQgaW4gYW4gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSBub2RlICBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIGZpZWxkTmFtZSBGaWVsZCBuYW1lLlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2V0PE8gZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBPLCBWIGV4dGVuZHMgT1tLXT4oXG4gIG5vZGU6IE8sXG4gIGZpZWxkTmFtZTogSyxcbiAgdmFsdWU6IFZcbik6IHZvaWQge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiLCB0cnVlKVxuXG4gIHdyYXBwZWRJbnRlcm5hbEFwcGx5U2V0KCkuY2FsbChub2RlLCBmaWVsZE5hbWUgYXMgc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZSlcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxBcHBseVNldDxPIGV4dGVuZHMgb2JqZWN0Pih0aGlzOiBPLCBmaWVsZE5hbWU6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIGEgbW9kZWwgc2luY2UgbW9kZWxzIGNhbiBiZWNvbWUgb2JzZXJ2YWJsZSBvYmplY3RzXG4gIC8vIChlLmcuIGJ5IGhhdmluZyBhIGNvbXB1dGVkIHZhbHVlKVxuICBpZiAoIWlzTW9kZWwodGhpcykgJiYgaXNPYnNlcnZhYmxlKHRoaXMpKSB7XG4gICAgc2V0KHRoaXMsIGZpZWxkTmFtZSwgdmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgOyh0aGlzIGFzIGFueSlbZmllbGROYW1lXSA9IHZhbHVlXG4gIH1cbn1cblxuY29uc3Qgd3JhcHBlZEludGVybmFsQXBwbHlTZXQgPSBsYXp5KCgpID0+XG4gIHdyYXBJbkFjdGlvbih7XG4gICAgbmFtZU9yTmFtZUZuOiBCdWlsdEluQWN0aW9uLkFwcGx5U2V0LFxuICAgIGZuOiBpbnRlcm5hbEFwcGx5U2V0LFxuICAgIGFjdGlvblR5cGU6IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMsXG4gIH0pXG4pXG4iLCJpbXBvcnQgeyBnZXREYXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vZGF0YU1vZGVsL2FjdGlvbnNcIlxuaW1wb3J0IHsgZGV0YWNoIH0gZnJvbSBcIi4uL3BhcmVudC9kZXRhY2hcIlxuaW1wb3J0IHsgcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzIH0gZnJvbSBcIi4uL3BhdGNoL2FwcGx5UGF0Y2hlc1wiXG5pbXBvcnQgeyBhcHBseVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2FwcGx5U25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U3RhbmRhbG9uZUFjdGlvbiB9IGZyb20gXCIuLi9zdGFuZGFyZEFjdGlvbnMvYWN0aW9uc1wiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGFwcGx5RGVsZXRlIH0gZnJvbSBcIi4vYXBwbHlEZWxldGVcIlxuaW1wb3J0IHsgYXBwbHlNZXRob2RDYWxsIH0gZnJvbSBcIi4vYXBwbHlNZXRob2RDYWxsXCJcbmltcG9ydCB7IGFwcGx5U2V0IH0gZnJvbSBcIi4vYXBwbHlTZXRcIlxuaW1wb3J0IHsgQnVpbHRJbkFjdGlvbiwgaXNCdWlsdEluQWN0aW9uIH0gZnJvbSBcIi4vYnVpbHRJbkFjdGlvbnNcIlxuaW1wb3J0IHsgaXNIb29rQWN0aW9uIH0gZnJvbSBcIi4vaG9va0FjdGlvbnNcIlxuXG4vKipcbiAqIEFuIGFjdGlvbiBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkNhbGwge1xuICAvKipcbiAgICogQWN0aW9uIG5hbWUgKG5hbWUgb2YgdGhlIGZ1bmN0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBY3Rpb24gYXJndW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJnczogUmVhZG9ubHlBcnJheTxhbnk+XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIG1vZGVsIHdoZXJlIHRoZSBhY3Rpb24gd2lsbCBiZSBydW4sIGFzIGFuIGFycmF5IG9mIHN0cmluZyB8IG51bWJlci5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGg6IFBhdGhcblxuICAvKipcbiAgICogSWRzIG9mIG1vZGVscyBhbG9uZyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0LCBudWxsIGlmIGl0IGlzIG5vdCBhIG1vZGVsLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aElkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudWxsPlxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGlzIGFjdGlvbiBjYWxsIGFzIG5vbi1zZXJpYWxpemVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VyaWFsaXplZD86IHVuZGVmaW5lZFxufVxuXG5jb25zdCBidWlsdEluQWN0aW9uVG9GdW5jdGlvbiA9IHtcbiAgW0J1aWx0SW5BY3Rpb24uQXBwbHlTbmFwc2hvdF06IGFwcGx5U25hcHNob3QsXG4gIFtCdWlsdEluQWN0aW9uLkFwcGx5UGF0Y2hlc106IGFwcGx5UGF0Y2hlcyxcbiAgW0J1aWx0SW5BY3Rpb24uRGV0YWNoXTogZGV0YWNoLFxuICBbQnVpbHRJbkFjdGlvbi5BcHBseVNldF06IGFwcGx5U2V0LFxuICBbQnVpbHRJbkFjdGlvbi5BcHBseURlbGV0ZV06IGFwcGx5RGVsZXRlLFxuICBbQnVpbHRJbkFjdGlvbi5BcHBseU1ldGhvZENhbGxdOiBhcHBseU1ldGhvZENhbGwsXG59XG5cbi8qKlxuICogQXBwbGllcyAocnVucykgYW4gYWN0aW9uIG92ZXIgYSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIElmIHlvdSBpbnRlbmQgdG8gYXBwbHkgc2VyaWFsaXplZCBhY3Rpb25zIGNoZWNrIG9uZSBvZiB0aGUgYGFwcGx5U2VyaWFsaXplZEFjdGlvbmAgbWV0aG9kcyBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdCB0byBydW4gdGhlIGFjdGlvbiBvdmVyLlxuICogQHBhcmFtIGNhbGwgVGhlIGFjdGlvbiwgdXN1YWxseSBhcyBjb21pbmcgZnJvbSBgb25BY3Rpb25NaWRkbGV3YXJlYC5cbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGlvbiwgaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBY3Rpb248VFJldCA9IGFueT4oc3VidHJlZVJvb3Q6IG9iamVjdCwgY2FsbDogQWN0aW9uQ2FsbCk6IFRSZXQge1xuICBpZiAoY2FsbC5zZXJpYWxpemVkKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcbiAgICAgIFwiY2Fubm90IGFwcGx5IGEgc2VyaWFsaXplZCBhY3Rpb24gY2FsbCwgdXNlIG9uZSBvZiB0aGUgJ2FwcGx5U2VyaWFsaXplZEFjdGlvbicgbWV0aG9kcyBpbnN0ZWFkXCJcbiAgICApXG4gIH1cblxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgLy8gcmVzb2x2ZSBwYXRoIHdoaWxlIGNoZWNraW5nIGlkc1xuICBjb25zdCB7IHZhbHVlOiBjdXJyZW50LCByZXNvbHZlZCB9ID0gcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyhcbiAgICBzdWJ0cmVlUm9vdCxcbiAgICBjYWxsLnRhcmdldFBhdGgsXG4gICAgY2FsbC50YXJnZXRQYXRoSWRzXG4gIClcbiAgaWYgKCFyZXNvbHZlZCkge1xuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgb2JqZWN0IGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeShjYWxsLnRhcmdldFBhdGgpfSB3aXRoIGlkcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBjYWxsLnRhcmdldFBhdGhJZHNcbiAgICAgICl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZGBcbiAgICApXG4gIH1cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChjdXJyZW50LCBgcmVzb2x2ZWQgJHtjdXJyZW50fWAsIHRydWUpXG5cbiAgaWYgKGlzQnVpbHRJbkFjdGlvbihjYWxsLmFjdGlvbk5hbWUpKSB7XG4gICAgY29uc3QgZm5Ub0NhbGw6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID0gYnVpbHRJbkFjdGlvblRvRnVuY3Rpb25bY2FsbC5hY3Rpb25OYW1lXVxuICAgIGlmICghZm5Ub0NhbGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYGFzc2VydGlvbiBmYWlsZWQ6IHVua25vd24gYnVpbHQtaW4gYWN0aW9uIC0gJHtjYWxsLmFjdGlvbk5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZm5Ub0NhbGwuYXBwbHkoY3VycmVudCwgW2N1cnJlbnQsIC4uLmNhbGwuYXJnc10pXG4gIH1cblxuICBpZiAoaXNIb29rQWN0aW9uKGNhbGwuYWN0aW9uTmFtZSkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBjYWxscyB0byBob29rcyAoJHtjYWxsLmFjdGlvbk5hbWV9KSBjYW5ub3QgYmUgYXBwbGllZGApXG4gIH1cblxuICBjb25zdCBkYXRhTW9kZWxBY3Rpb24gPSBnZXREYXRhTW9kZWxBY3Rpb24oY2FsbC5hY3Rpb25OYW1lKVxuICBpZiAoZGF0YU1vZGVsQWN0aW9uKSB7XG4gICAgY29uc3QgaW5zdGFuY2U6IGFueSA9IG5ldyBkYXRhTW9kZWxBY3Rpb24ubW9kZWxDbGFzcyhjdXJyZW50KVxuICAgIHJldHVybiBpbnN0YW5jZVtkYXRhTW9kZWxBY3Rpb24uZm5OYW1lXS5hcHBseShpbnN0YW5jZSwgY2FsbC5hcmdzKVxuICB9XG5cbiAgY29uc3Qgc3RhbmRhbG9uZUFjdGlvbiA9IGdldFN0YW5kYWxvbmVBY3Rpb24oY2FsbC5hY3Rpb25OYW1lKVxuICBpZiAoc3RhbmRhbG9uZUFjdGlvbikge1xuICAgIHJldHVybiBzdGFuZGFsb25lQWN0aW9uLmFwcGx5KGN1cnJlbnQsIGNhbGwuYXJncyBhcyBhbnkpXG4gIH1cblxuICByZXR1cm4gKGN1cnJlbnQgYXMgYW55KVtjYWxsLmFjdGlvbk5hbWVdLmFwcGx5KGN1cnJlbnQsIGNhbGwuYXJncylcbn1cbiIsImltcG9ydCB7IGNoZWNrTW9kZWxEZWNvcmF0b3JBcmdzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL2NoZWNrTW9kZWxEZWNvcmF0b3JBcmdzXCJcbmltcG9ydCB7IGRlY29yYXRlV3JhcE1ldGhvZE9yRmllbGQsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0QWN0aW9uTmFtZUFuZENvbnRleHRPdmVycmlkZSB9IGZyb20gXCIuL2FjdGlvbkRlY29yYXRvclV0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgeyBpc01vZGVsQWN0aW9uIH0gZnJvbSBcIi4vaXNNb2RlbEFjdGlvblwiXG5pbXBvcnQgeyB3cmFwSW5BY3Rpb24gfSBmcm9tIFwiLi93cmFwSW5BY3Rpb25cIlxuXG5mdW5jdGlvbiBjaGVja01vZGVsQWN0aW9uQXJncyh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwibW9kZWxBY3Rpb24gaGFzIHRvIGJlIHVzZWQgb3ZlciBmdW5jdGlvbnNcIilcbiAgfVxuICBjaGVja01vZGVsRGVjb3JhdG9yQXJncyhcIm1vZGVsQWN0aW9uXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpXG59XG5cbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgdHVybnMgYSBmdW5jdGlvbiBpbnRvIGEgbW9kZWwgYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleVxuICogQHBhcmFtIFtiYXNlRGVzY3JpcHRvcl1cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEFjdGlvbihcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gIGJhc2VEZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4pOiB2b2lkIHtcbiAgY29uc3QgeyBhY3Rpb25OYW1lLCBvdmVycmlkZUNvbnRleHQgfSA9IGdldEFjdGlvbk5hbWVBbmRDb250ZXh0T3ZlcnJpZGUodGFyZ2V0LCBwcm9wZXJ0eUtleSlcblxuICByZXR1cm4gZGVjb3JhdGVXcmFwTWV0aG9kT3JGaWVsZChcbiAgICBcIm1vZGVsQWN0aW9uXCIsXG4gICAge1xuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXksXG4gICAgICBiYXNlRGVzY3JpcHRvcixcbiAgICB9LFxuICAgIChkYXRhLCBmbikgPT4ge1xuICAgICAgaWYgKGlzTW9kZWxBY3Rpb24oZm4pKSB7XG4gICAgICAgIHJldHVybiBmblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tNb2RlbEFjdGlvbkFyZ3MoZGF0YS50YXJnZXQsIGRhdGEucHJvcGVydHlLZXksIGZuKVxuXG4gICAgICAgIHJldHVybiB3cmFwSW5BY3Rpb24oe1xuICAgICAgICAgIG5hbWVPck5hbWVGbjogYWN0aW9uTmFtZSxcbiAgICAgICAgICBmbixcbiAgICAgICAgICBhY3Rpb25UeXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jLFxuICAgICAgICAgIG92ZXJyaWRlQ29udGV4dCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIClcbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHRyeVJ1blBlbmRpbmdBY3Rpb25zIH0gZnJvbSBcIi4vcGVuZGluZ0FjdGlvbnNcIlxuaW1wb3J0IHsgZ2V0QWN0aW9uUHJvdGVjdGlvbiwgc2V0QWN0aW9uUHJvdGVjdGlvbiB9IGZyb20gXCIuL3Byb3RlY3Rpb25cIlxuXG4vKipcbiAqIFJ1bnMgYSBibG9jayBpbiB1bnByb2N0ZWQgbW9kZSwgYXMgaWYgaXQgd2VyZSBydW4gaW5zaWRlIGEgbW9kZWwgYWN0aW9uLlxuICogQ29uc2lkZXIgdXNpbmcgYSBwcm9wZXIgbW9kZWwgYWN0aW9uIGluc3RlYWQgc2luY2UgdGhlc2Uga2luZCBvZiBhY3Rpb25zIGFyZSBub3QgcmVjb3JkZWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFJldHVybiB0eXBlLlxuICogQHBhcmFtIG5hbWUgTW9ieCBhY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSBmbiBBY3Rpb24gYmxvY2suXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuVW5wcm90ZWN0ZWQ8VD4obmFtZTogc3RyaW5nLCBmbjogKCkgPT4gVCk6IFRcblxuLyoqXG4gKiBSdW5zIGEgYmxvY2sgaW4gdW5wcm9jdGVkIG1vZGUsIGFzIGlmIGl0IHdlcmUgcnVuIGluc2lkZSBhIG1vZGVsIGFjdGlvbi5cbiAqIENvbnNpZGVyIHVzaW5nIGEgcHJvcGVyIG1vZGVsIGFjdGlvbiBpbnN0ZWFkIHNpbmNlIHRoZXNlIGtpbmQgb2YgYWN0aW9ucyBhcmUgbm90IHJlY29yZGVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSBmbiBBY3Rpb24gYmxvY2suXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuVW5wcm90ZWN0ZWQ8VD4oZm46ICgpID0+IFQpOiBUXG5cbi8vIGJhc2UgY2FzZVxuZXhwb3J0IGZ1bmN0aW9uIHJ1blVucHJvdGVjdGVkPFQ+KGFyZzE6IGFueSwgYXJnMj86IGFueSk6IFQge1xuICBjb25zdCBuYW1lID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgPyBhcmcxIDogdW5kZWZpbmVkXG4gIGNvbnN0IGZuOiAoKSA9PiBUID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgPyBhcmcyIDogYXJnMVxuXG4gIGNvbnN0IGlubmVyQWN0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IG9sZEFjdGlvblByb3RlY3Rpb24gPSBnZXRBY3Rpb25Qcm90ZWN0aW9uKClcbiAgICBzZXRBY3Rpb25Qcm90ZWN0aW9uKGZhbHNlKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEFjdGlvblByb3RlY3Rpb24ob2xkQWN0aW9uUHJvdGVjdGlvbilcblxuICAgICAgdHJ5UnVuUGVuZGluZ0FjdGlvbnMoKVxuICAgIH1cbiAgfVxuXG4gIGlmIChuYW1lKSB7XG4gICAgcmV0dXJuIGFjdGlvbihuYW1lLCBpbm5lckFjdGlvbikoKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBhY3Rpb24oaW5uZXJBY3Rpb24pKClcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IGNhbm5vdFNlcmlhbGl6ZSA9IFN5bWJvbChcImNhbm5vdFNlcmlhbGl6ZVwiKVxuXG4vKipcbiAqIFNlcmlhbGl6ZXIgb2YgYWN0aW9uIGNhbGwgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8VE9yaWdpbmFsLCBUU2VyaWFsaXplZD4ge1xuICAvKipcbiAgICogU2VyaWFsaXplciBJRCwgbXVzdCBiZSB1bmlxdWUuXG4gICAqL1xuICBpZDogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYW4gYWN0aW9uIGNhbGwgYXJndW1lbnQsIHJldHVybmluZyBgY2Fubm90U2VyaWFsaXplYCBpZiBub3QgcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuXG4gICAqIEBwYXJhbSB0YXJnZXRSb290IFRhcmdldCByb290LCBpZiBwcm92aWRlZC5cbiAgICogQHBhcmFtIHNlcmlhbGl6ZUNoaWxkIFNlcmlhbGl6ZSBhIGNoaWxkLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc2VyaWFsaXplKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNlcmlhbGl6ZUNoaWxkOiAodjogdW5rbm93bikgPT4gdW5rbm93bixcbiAgICB0YXJnZXRSb290OiBvYmplY3QgfCB1bmRlZmluZWRcbiAgKTogVFNlcmlhbGl6ZWQgfCB0eXBlb2YgY2Fubm90U2VyaWFsaXplXG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBhbiBhY3Rpb24gY2FsbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLlxuICAgKiBAcGFyYW0gdGFyZ2V0Um9vdCBUYXJnZXQgcm9vdCwgaWYgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSBkZXNlcmlhbGl6ZUNoaWxkIERlc2VyaWFsaXplIGEgY2hpbGQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBkZXNlcmlhbGl6ZShcbiAgICB2YWx1ZTogVFNlcmlhbGl6ZWQsXG4gICAgZGVzZXJpYWxpemVDaGlsZDogKHY6IHVua25vd24pID0+IHVua25vd24sXG4gICAgdGFyZ2V0Um9vdDogb2JqZWN0IHwgdW5kZWZpbmVkXG4gICk6IFRPcmlnaW5hbFxufVxuIiwiaW1wb3J0IHR5cGUgeyBJT2JzZXJ2YWJsZUFycmF5IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNBcnJheSwgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3QgYXJyYXlTZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPGFueVtdIHwgSU9ic2VydmFibGVBcnJheTxhbnk+LCBhbnlbXT4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L2FycmF5YCxcblxuICBzZXJpYWxpemUodmFsdWUsIHNlcmlhbGl6ZSkge1xuICAgIGlmICghaXNBcnJheSh2YWx1ZSkpIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIC8vIHRoaXMgd2lsbCBhbHNvIHRyYW5zZm9ybSBvYnNlcnZhYmxlIGFycmF5cyBpbnRvIG5vbi1vYnNlcnZhYmxlIG9uZXNcbiAgICByZXR1cm4gdmFsdWUubWFwKHNlcmlhbGl6ZSlcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShhcnIsIGRlc2VyaWFsaXplKSB7XG4gICAgcmV0dXJuIGFyci5tYXAoZGVzZXJpYWxpemUpXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBkYXRlU2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxEYXRlLCBudW1iZXI+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9kYXRlQXNUaW1lc3RhbXBgLFxuXG4gIHNlcmlhbGl6ZShkYXRlKSB7XG4gICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG4gICAgcmV0dXJuICtkYXRlXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUodGltZXN0YW1wKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcClcbiAgfSxcbn1cbiIsImltcG9ydCB7IGlzT2JzZXJ2YWJsZU1hcCwgT2JzZXJ2YWJsZU1hcCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IG1hcFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8XG4gIE1hcDxhbnksIGFueT4gfCBPYnNlcnZhYmxlTWFwPGFueSwgYW55PixcbiAgW2FueSwgYW55XVtdXG4+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9tYXBBc0FycmF5YCxcblxuICBzZXJpYWxpemUobWFwLCBzZXJpYWxpemUpIHtcbiAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBNYXApICYmICFpc09ic2VydmFibGVNYXAobWFwKSkgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuXG4gICAgY29uc3QgYXJyOiBbYW55LCBhbnldW10gPSBbXVxuXG4gICAgY29uc3QgaXRlciA9IG1hcC5rZXlzKClcbiAgICBsZXQgY3VyID0gaXRlci5uZXh0KClcbiAgICB3aGlsZSAoIWN1ci5kb25lKSB7XG4gICAgICBjb25zdCBrID0gY3VyLnZhbHVlXG4gICAgICBjb25zdCB2ID0gbWFwLmdldChrKVxuICAgICAgYXJyLnB1c2goW3NlcmlhbGl6ZShrKSwgc2VyaWFsaXplKHYpXSlcbiAgICAgIGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFyclxuICB9LFxuXG4gIGRlc2VyaWFsaXplKGFyciwgZGVzZXJpYWxpemUpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKClcblxuICAgIGNvbnN0IGxlbiA9IGFyci5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gYXJyW2ldWzBdXG4gICAgICBjb25zdCB2ID0gYXJyW2ldWzFdXG4gICAgICBtYXAuc2V0KGRlc2VyaWFsaXplKGspLCBkZXNlcmlhbGl6ZSh2KSlcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBtb2RlbElkS2V5IH0gZnJvbSBcIi4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb290UGF0aFRvVGFyZ2V0UGF0aElkcyhyb290UGF0aDogUm9vdFBhdGg8YW55Pik6IChzdHJpbmcgfCBudWxsKVtdIHtcbiAgY29uc3QgdGFyZ2V0UGF0aElkczogKHN0cmluZyB8IG51bGwpW10gPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdFBhdGgucGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRhcmdldE9iaiA9IHJvb3RQYXRoLnBhdGhPYmplY3RzW2kgKyAxXSAvLyBmaXJzdCBpcyByb290LCB3ZSBkb24ndCBjYXJlIGFib3V0IGl0cyBJRFxuICAgIGNvbnN0IHRhcmdldE9iaklkID0gaXNNb2RlbCh0YXJnZXRPYmopID8gdGFyZ2V0T2JqW21vZGVsSWRLZXldID8/IG51bGwgOiBudWxsXG4gICAgdGFyZ2V0UGF0aElkcy5wdXNoKHRhcmdldE9iaklkKVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldFBhdGhJZHNcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhUb1RhcmdldFBhdGhJZHMocm9vdDogYW55LCBwYXRoOiBQYXRoKTogKHN0cmluZyB8IG51bGwpW10ge1xuICBjb25zdCB0YXJnZXRQYXRoSWRzOiAoc3RyaW5nIHwgbnVsbClbXSA9IFtdXG4gIGxldCBjdXJyZW50ID0gcm9vdCAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSByb290IElEXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aFtpXV1cbiAgICBjb25zdCB0YXJnZXRPYmpJZCA9IGlzTW9kZWwoY3VycmVudCkgPyBjdXJyZW50W21vZGVsSWRLZXldID8/IG51bGwgOiBudWxsXG4gICAgdGFyZ2V0UGF0aElkcy5wdXNoKHRhcmdldE9iaklkKVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldFBhdGhJZHNcbn1cbiIsImltcG9ydCB7IGZhc3RHZXRSb290UGF0aCwgcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyB9IGZyb20gXCIuLi8uLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSBcIi4uLy4uL3BhcmVudC9wYXRoVHlwZXNcIlxuaW1wb3J0IHsgaXNUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgcm9vdFBhdGhUb1RhcmdldFBhdGhJZHMgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmludGVyZmFjZSBPYmplY3RQYXRoIHtcbiAgdGFyZ2V0UGF0aDogUGF0aFxuICB0YXJnZXRQYXRoSWRzOiAoc3RyaW5nIHwgbnVsbClbXVxufVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0UGF0aFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8b2JqZWN0LCBPYmplY3RQYXRoPiA9IHtcbiAgaWQ6IGAke25hbWVzcGFjZX0vb2JqZWN0UGF0aGAsXG5cbiAgc2VyaWFsaXplKHZhbHVlLCBfLCB0YXJnZXRSb290KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCB8fCAhaXNUd2Vha2VkT2JqZWN0KHZhbHVlLCBmYWxzZSkpXG4gICAgICByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICAvLyB0cnkgdG8gc2VyaWFsaXplIGEgcmVmIHRvIGl0cyBwYXRoIGlmIHBvc3NpYmxlIGluc3RlYWRcbiAgICBpZiAodGFyZ2V0Um9vdCkge1xuICAgICAgY29uc3Qgcm9vdFBhdGggPSBmYXN0R2V0Um9vdFBhdGgodmFsdWUpXG4gICAgICBpZiAocm9vdFBhdGgucm9vdCA9PT0gdGFyZ2V0Um9vdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRhcmdldFBhdGg6IHJvb3RQYXRoLnBhdGgsXG4gICAgICAgICAgdGFyZ2V0UGF0aElkczogcm9vdFBhdGhUb1RhcmdldFBhdGhJZHMocm9vdFBhdGgpLFxuICAgICAgICB9IGFzIE9iamVjdFBhdGhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2Fubm90U2VyaWFsaXplXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUocmVmLCBfLCB0YXJnZXRSb290KSB7XG4gICAgLy8gdHJ5IHRvIHJlc29sdmUgdGhlIG5vZGUgYmFja1xuICAgIGlmICh0YXJnZXRSb290KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlUGF0aENoZWNraW5nSWRzKHRhcmdldFJvb3QsIHJlZi50YXJnZXRQYXRoLCByZWYudGFyZ2V0UGF0aElkcylcbiAgICAgIGlmIChyZXN1bHQucmVzb2x2ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IGZhaWx1cmUoXG4gICAgICBgb2JqZWN0IGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeShyZWYudGFyZ2V0UGF0aCl9IHdpdGggaWRzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHJlZi50YXJnZXRQYXRoSWRzXG4gICAgICApfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWRgXG4gICAgKVxuICB9LFxufVxuIiwiaW1wb3J0IHsgZnJvbVNuYXBzaG90IH0gZnJvbSBcIi4uLy4uL3NuYXBzaG90L2Zyb21TbmFwc2hvdFwiXG5pbXBvcnQgeyBnZXRTbmFwc2hvdCB9IGZyb20gXCIuLi8uLi9zbmFwc2hvdC9nZXRTbmFwc2hvdFwiXG5pbXBvcnQgeyBpc1R3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IG5hbWVzcGFjZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IG9iamVjdFNuYXBzaG90U2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxvYmplY3QsIG9iamVjdD4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L29iamVjdFNuYXBzaG90YCxcblxuICBzZXJpYWxpemUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsIHx8ICFpc1R3ZWFrZWRPYmplY3QodmFsdWUsIGZhbHNlKSlcbiAgICAgIHJldHVybiBjYW5ub3RTZXJpYWxpemVcblxuICAgIHJldHVybiBnZXRTbmFwc2hvdCh2YWx1ZSlcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShzbmFwc2hvdCkge1xuICAgIHJldHVybiBmcm9tU25hcHNob3Qoc25hcHNob3QpXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBpc09ic2VydmFibGVPYmplY3QgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBpc1BsYWluT2JqZWN0LCBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplciwgY2Fubm90U2VyaWFsaXplIH0gZnJvbSBcIi4vY29yZVwiXG5cbmV4cG9ydCBjb25zdCBwbGFpbk9iamVjdFNlcmlhbGl6ZXI6IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXI8b2JqZWN0LCBvYmplY3Q+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9wbGFpbk9iamVjdGAsXG5cbiAgc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpICYmICFpc09ic2VydmFibGVPYmplY3QodmFsdWUpKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICAvLyB0aGlzIHdpbGwgbWFrZSBvYnNlcnZhYmxlIG9iamVjdHMgbm9uLW9ic2VydmFibGUgb25lc1xuICAgIHJldHVybiBtYXBPYmplY3RGaWVsZHModmFsdWUsIHNlcmlhbGl6ZSlcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShvYmosIHNlcmlhbGl6ZSkge1xuICAgIHJldHVybiBtYXBPYmplY3RGaWVsZHMob2JqLCBzZXJpYWxpemUpXG4gIH0sXG59XG5cbmZ1bmN0aW9uIG1hcE9iamVjdEZpZWxkcyhvcmlnaW5hbE9iajogYW55LCBtYXBGbjogKHg6IGFueSkgPT4gYW55KTogYW55IHtcbiAgY29uc3Qgb2JqOiBhbnkgPSB7fVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3JpZ2luYWxPYmopXG4gIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgIGNvbnN0IHYgPSBvcmlnaW5hbE9ialtrXVxuICAgIG9ialtrXSA9IG1hcEZuKHYpXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuIiwiaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3QgcHJpbWl0aXZlU2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxcbiAgbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkLFxuICBzdHJpbmdcbj4gPSB7XG4gIGlkOiBgJHtuYW1lc3BhY2V9L3ByaW1pdGl2ZUFzU3RyaW5nYCxcblxuICBzZXJpYWxpemUodmFsdWUpIHtcbiAgICAvLyBudW1iZXJcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFwibmFuXCJcbiAgICB9XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSArSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBcIitpbmZcIlxuICAgICAgY2FzZSAtSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBcIi1pbmZcIlxuICAgIH1cblxuICAgIC8vIGJpZ2ludFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgLy8gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbm5vdFNlcmlhbGl6ZVxuICB9LFxuXG4gIGRlc2VyaWFsaXplKHN0cikge1xuICAgIHN3aXRjaCAoc3RyKSB7XG4gICAgICBjYXNlIFwibmFuXCI6XG4gICAgICAgIHJldHVybiBOYU5cbiAgICAgIGNhc2UgXCIraW5mXCI6XG4gICAgICAgIHJldHVybiArSW5maW5pdHlcbiAgICAgIGNhc2UgXCItaW5mXCI6XG4gICAgICAgIHJldHVybiAtSW5maW5pdHlcbiAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEJpZ0ludChzdHIpXG4gICAgfVxuICB9LFxufVxuIiwiaW1wb3J0IHR5cGUgeyBPYnNlcnZhYmxlU2V0IH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIsIGNhbm5vdFNlcmlhbGl6ZSB9IGZyb20gXCIuL2NvcmVcIlxuXG5leHBvcnQgY29uc3Qgc2V0U2VyaWFsaXplcjogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxTZXQ8YW55PiB8IE9ic2VydmFibGVTZXQ8YW55PiwgYW55W10+ID0ge1xuICBpZDogYCR7bmFtZXNwYWNlfS9zZXRBc0FycmF5YCxcblxuICBzZXJpYWxpemUoc2V0LCBzZXJpYWxpemUpIHtcbiAgICBpZiAoIShzZXQgaW5zdGFuY2VvZiBTZXQpKSByZXR1cm4gY2Fubm90U2VyaWFsaXplXG5cbiAgICBjb25zdCBhcnI6IGFueVtdID0gW11cblxuICAgIGNvbnN0IGl0ZXIgPSBzZXQua2V5cygpXG4gICAgbGV0IGN1ciA9IGl0ZXIubmV4dCgpXG4gICAgd2hpbGUgKCFjdXIuZG9uZSkge1xuICAgICAgY29uc3QgayA9IGN1ci52YWx1ZVxuICAgICAgYXJyLnB1c2goc2VyaWFsaXplKGspKVxuICAgICAgY3VyID0gaXRlci5uZXh0KClcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyXG4gIH0sXG5cbiAgZGVzZXJpYWxpemUoYXJyLCBkZXNlcmlhbGl6ZSkge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKVxuXG4gICAgY29uc3QgbGVuID0gYXJyLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBhcnJbaV1cbiAgICAgIHNldC5hZGQoZGVzZXJpYWxpemUoaykpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNldFxuICB9LFxufVxuIiwiaW1wb3J0IHR5cGUgeyBPIH0gZnJvbSBcInRzLXRvb2xiZWx0XCJcbmltcG9ydCB0eXBlIHsgQWN0aW9uQ2FsbCB9IGZyb20gXCIuLi8uLi9hY3Rpb24vYXBwbHlBY3Rpb25cIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi8uLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSwgaXNKU09OUHJpbWl0aXZlLCBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgSlNPTlByaW1pdGl2ZVZhbHVlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3R5cGVzXCJcbmltcG9ydCB7IGFycmF5U2VyaWFsaXplciB9IGZyb20gXCIuL2FycmF5U2VyaWFsaXplclwiXG5pbXBvcnQgeyBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyLCBjYW5ub3RTZXJpYWxpemUgfSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB7IGRhdGVTZXJpYWxpemVyIH0gZnJvbSBcIi4vZGF0ZVNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgbWFwU2VyaWFsaXplciB9IGZyb20gXCIuL21hcFNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgb2JqZWN0UGF0aFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9vYmplY3RQYXRoU2VyaWFsaXplclwiXG5pbXBvcnQgeyBvYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9vYmplY3RTbmFwc2hvdFNlcmlhbGl6ZXJcIlxuaW1wb3J0IHsgcGxhaW5PYmplY3RTZXJpYWxpemVyIH0gZnJvbSBcIi4vcGxhaW5PYmplY3RTZXJpYWxpemVyXCJcbmltcG9ydCB7IHByaW1pdGl2ZVNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9wcmltaXRpdmVTZXJpYWxpemVyXCJcbmltcG9ydCB7IHNldFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9zZXRTZXJpYWxpemVyXCJcblxuY29uc3Qgc2VyaWFsaXplcnNBcnJheTogQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcjxhbnksIGFueT5bXSA9IFtdXG5jb25zdCBzZXJpYWxpemVyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPGFueSwgYW55Pj4oKVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG5ldyBhY3Rpb24gY2FsbCBhcmd1bWVudCBzZXJpYWxpemVycy5cbiAqIFNlcmlhbGl6ZXJzIGFyZSBjYWxsZWQgaW4gdGhlIGludmVyc2Ugb3JkZXIgdGhleSBhcmUgcmVnaXN0ZXJlZCwgbWVhbmluZyB0aGVcbiAqIGxhdGVzdCBvbmUgcmVnaXN0ZXJlZCB3aWxsIGJlIGNhbGxlZCBmaXJzdC5cbiAqXG4gKiBAcGFyYW0gc2VyaWFsaXplciBTZXJpYWxpemVyIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSBkaXNwb3NlciB0byB1bnJlZ2lzdGVyIHRoZSBzZXJpYWxpemVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKFxuICBzZXJpYWxpemVyOiBBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyPGFueSwgYW55PlxuKTogKCkgPT4gdm9pZCB7XG4gIHJlZ2lzdGVyRGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzKClcblxuICBpZiAoc2VyaWFsaXplcnNBcnJheS5pbmNsdWRlcyhzZXJpYWxpemVyKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhY3Rpb24gY2FsbCBhcmd1bWVudCBzZXJpYWxpemVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKVxuICB9XG4gIGlmIChzZXJpYWxpemVyc01hcC5oYXMoc2VyaWFsaXplci5pZCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBhY3Rpb24gY2FsbCBhcmd1bWVudCBzZXJpYWxpemVyIHdpdGggaWQgJyR7c2VyaWFsaXplci5pZH0nIGFscmVhZHkgcmVnaXN0ZXJlZGApXG4gIH1cblxuICBzZXJpYWxpemVyc0FycmF5LnVuc2hpZnQoc2VyaWFsaXplcilcbiAgc2VyaWFsaXplcnNNYXAuc2V0KHNlcmlhbGl6ZXIuaWQsIHNlcmlhbGl6ZXIpXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHNlcmlhbGl6ZXJzQXJyYXkuaW5kZXhPZihzZXJpYWxpemVyKVxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBzZXJpYWxpemVyc0FycmF5LnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gICAgc2VyaWFsaXplcnNNYXAuZGVsZXRlKHNlcmlhbGl6ZXIuaWQpXG4gIH1cbn1cblxuLyoqXG4gKiBTZXJpYWxpemVkIGFjdGlvbiBjYWxsIGFyZ3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnQge1xuICAvKipcbiAgICogU2VyaWFsaXplciBpZC5cbiAgICovXG4gIHJlYWRvbmx5ICRtb2J4S2V5c3RvbmVTZXJpYWxpemVyOiBzdHJpbmdcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogYW55XG59XG5cbi8qKlxuICogQSBzZXJpYWxpemVkIGFjdGlvbiBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRBY3Rpb25DYWxsIGV4dGVuZHMgT21pdDxBY3Rpb25DYWxsLCBcInNlcmlhbGl6ZWRcIj4ge1xuICAvKipcbiAgICogU2VyaWFsaXplZCBhY3Rpb24gYXJndW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJnczogUmVhZG9ubHlBcnJheTxTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50IHwgSlNPTlByaW1pdGl2ZVZhbHVlPlxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGlzIGFjdGlvbiBjYWxsIGFzIHNlcmlhbGl6ZWQuXG4gICAqL1xuICBzZXJpYWxpemVkOiB0cnVlXG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhbiBhY3Rpb24gY2FsbCBhcmd1bWVudCBieSByZXR1cm5pbmcgYSBgU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudGAuXG4gKiBUaGUgZm9sbG93aW5nIGFyZSBzdXBwb3J0ZWQgb3V0IG9mIHRoZSBib3g6XG4gKiAtIFByaW1pdGl2ZXMuXG4gKiAtIE5vZGVzIHRoYXQgYXJlIHVuZGVyIHRoZSBzYW1lIHJvb3Qgbm9kZSBhcyB0aGUgdGFyZ2V0IHJvb3QgKHdoZW4gcHJvdmlkZWQpIHdpbGwgYmUgc2VyaWFsaXplZFxuICogICBhcyBhIHBhdGguXG4gKiAtIE5vZGVzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUgc2FtZSByb290IG5vZGUgYXMgdGhlIHRhcmdldCByb290IHdpbGwgYmUgc2VyaWFsaXplZCBhcyB0aGVpciBzbmFwc2hvdC5cbiAqIC0gQXJyYXlzIChvYnNlcnZhYmxlIG9yIG5vdCkuXG4gKiAtIERhdGVzLlxuICogLSBNYXBzIChvYnNlcnZhYmxlIG9yIG5vdCkuXG4gKiAtIFNldHMgKG9ic2VydmFibGUgb3Igbm90KS5cbiAqIC0gUGxhaW4gb2JqZWN0cyAob2JzZXJ2YWJsZSBvciBub3QpLlxuICpcbiAqIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgc2VyaWFsaXplZCBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXJnVmFsdWUgQXJndW1lbnQgdmFsdWUgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBpdHMgc2VyaWFsaXphYmxlIGZvcm0uXG4gKiBAcGFyYW0gW3RhcmdldFJvb3RdIFRhcmdldCByb290IG5vZGUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoaXMgYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC5cbiAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemFibGUgZm9ybSBvZiB0aGUgcGFzc2VkIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KFxuICBhcmdWYWx1ZTogYW55LFxuICB0YXJnZXRSb290Pzogb2JqZWN0XG4pOiBTZXJpYWxpemVkQWN0aW9uQ2FsbEFyZ3VtZW50IHwgSlNPTlByaW1pdGl2ZVZhbHVlIHtcbiAgcmVnaXN0ZXJEZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnMoKVxuXG4gIGlmIChpc0pTT05QcmltaXRpdmUoYXJnVmFsdWUpKSB7XG4gICAgcmV0dXJuIGFyZ1ZhbHVlXG4gIH1cblxuICBjb25zdCBvcmlnVmFsdWUgPSBhcmdWYWx1ZVxuXG4gIGNvbnN0IHNlcmlhbGl6ZSA9ICh2OiBhbnkpID0+IHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudCh2LCB0YXJnZXRSb290KVxuXG4gIC8vIHRyeSBzZXJpYWxpemVyc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcmlhbGl6ZXJzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzZXJpYWxpemVyID0gc2VyaWFsaXplcnNBcnJheVtpXVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFyZ1ZhbHVlLCBzZXJpYWxpemUsIHRhcmdldFJvb3QpXG4gICAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY2Fubm90U2VyaWFsaXplKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAkbW9ieEtleXN0b25lU2VyaWFsaXplcjogc2VyaWFsaXplci5pZCxcbiAgICAgICAgdmFsdWU6IHNlcmlhbGl6ZWRWYWx1ZSxcbiAgICAgIH0gYXMgU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudFxuICAgIH1cbiAgfVxuXG4gIHRocm93IGZhaWx1cmUoYHNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudCBjb3VsZCBub3Qgc2VyaWFsaXplIHRoZSBnaXZlbiB2YWx1ZTogJHtvcmlnVmFsdWV9YClcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYW4gYWN0aW9uIGNhbGwgaXMgc2VyaWFsaXphYmxlIGJ5IG1hcHBpbmcgdGhlIGFjdGlvbiBhcmd1bWVudHMgaW50byBpdHNcbiAqIHNlcmlhbGl6YWJsZSB2ZXJzaW9uIGJ5IHVzaW5nIGBzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnRgLlxuICpcbiAqIEBwYXJhbSBhY3Rpb25DYWxsIEFjdGlvbiBjYWxsIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gW3RhcmdldFJvb3RdIFRhcmdldCByb290IG5vZGUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoaXMgYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC5cbiAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemFibGUgYWN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVBY3Rpb25DYWxsKFxuICBhY3Rpb25DYWxsOiBBY3Rpb25DYWxsLFxuICB0YXJnZXRSb290Pzogb2JqZWN0XG4pOiBTZXJpYWxpemVkQWN0aW9uQ2FsbCB7XG4gIGlmIChhY3Rpb25DYWxsLnNlcmlhbGl6ZWQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHNlcmlhbGl6ZSBhbiBhbHJlYWR5IHNlcmlhbGl6ZWQgYWN0aW9uIGNhbGxcIilcbiAgfVxuXG4gIGlmICh0YXJnZXRSb290ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldFJvb3QsIFwidGFyZ2V0Um9vdFwiKVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplID0gKHY6IGFueSkgPT4gc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KHYsIHRhcmdldFJvb3QpXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5hY3Rpb25DYWxsLFxuICAgIHNlcmlhbGl6ZWQ6IHRydWUsXG4gICAgYXJnczogYWN0aW9uQ2FsbC5hcmdzLm1hcChzZXJpYWxpemUpLFxuICB9XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhbiBhY3Rpb24gY2FsbCBhcmd1bWVudCBieSByZXR1cm5pbmcgaXRzIGRlc2VyaWFsaXplZCBlcXVpdmFsZW50LlxuICpcbiAqIEBwYXJhbSBhcmdWYWx1ZSBBcmd1bWVudCB2YWx1ZSB0byBiZSB0cmFuc2Zvcm1lZCBpbnRvIGl0cyBkZXNlcmlhbGl6ZWQgZm9ybS5cbiAqIEBwYXJhbSBbdGFyZ2V0Um9vdF0gVGFyZ2V0IHJvb3Qgbm9kZSBvZiB0aGUgbW9kZWwgd2hlcmUgdGhpcyBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBmb3JtIG9mIHRoZSBwYXNzZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudChcbiAgYXJnVmFsdWU6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsQXJndW1lbnQgfCBKU09OUHJpbWl0aXZlVmFsdWUsXG4gIHRhcmdldFJvb3Q/OiBvYmplY3Rcbik6IGFueSB7XG4gIHJlZ2lzdGVyRGVmYXVsdEFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXJzKClcblxuICBpZiAoaXNKU09OUHJpbWl0aXZlKGFyZ1ZhbHVlKSkge1xuICAgIHJldHVybiBhcmdWYWx1ZVxuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGFyZ1ZhbHVlKSB8fCB0eXBlb2YgYXJnVmFsdWUuJG1vYnhLZXlzdG9uZVNlcmlhbGl6ZXIgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiaW52YWxpZCBzZXJpYWxpemVkIGFjdGlvbiBjYWxsIGFyZ3VtZW50XCIpXG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVySWQgPSBhcmdWYWx1ZS4kbW9ieEtleXN0b25lU2VyaWFsaXplclxuICBjb25zdCBzZXJpYWxpemVyID0gc2VyaWFsaXplcnNNYXAuZ2V0KHNlcmlhbGl6ZXJJZClcblxuICBpZiAoIXNlcmlhbGl6ZXIpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBhIHNlcmlhbGl6ZXIgd2l0aCBpZCAnJHtzZXJpYWxpemVySWR9JyBjb3VsZCBub3QgYmUgZm91bmRgKVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gYXJnVmFsdWUgYXMgU2VyaWFsaXplZEFjdGlvbkNhbGxBcmd1bWVudFxuXG4gIGNvbnN0IGRlc2VyaWFsaXplID0gKHY6IGFueSkgPT4gZGVzZXJpYWxpemVBY3Rpb25DYWxsQXJndW1lbnQodiwgdGFyZ2V0Um9vdClcbiAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc2VyaWFsaXplZFZhbHVlLnZhbHVlLCBkZXNlcmlhbGl6ZSwgdGFyZ2V0Um9vdClcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYW4gYWN0aW9uIGNhbGwgaXMgZGVzZXJpYWxpemVkIGJ5IG1hcHBpbmcgdGhlIGFjdGlvbiBhcmd1bWVudHMgaW50byBpdHNcbiAqIGRlc2VyaWFsaXplZCB2ZXJzaW9uIGJ5IHVzaW5nIGBkZXNlcmlhbGl6ZUFjdGlvbkNhbGxBcmd1bWVudGAuXG4gKlxuICogQHBhcmFtIGFjdGlvbkNhbGwgQWN0aW9uIGNhbGwgdG8gY29udmVydC5cbiAqIEBwYXJhbSBbdGFyZ2V0Um9vdF0gVGFyZ2V0IHJvb3Qgbm9kZSBvZiB0aGUgbW9kZWwgd2hlcmUgdGhpcyBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLlxuICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBhY3Rpb24gY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQWN0aW9uQ2FsbChcbiAgYWN0aW9uQ2FsbDogU2VyaWFsaXplZEFjdGlvbkNhbGwsXG4gIHRhcmdldFJvb3Q/OiBvYmplY3Rcbik6IEFjdGlvbkNhbGwge1xuICBpZiAoIWFjdGlvbkNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgZGVzZXJpYWxpemUgYSBub24tc2VyaWFsaXplZCBhY3Rpb24gY2FsbFwiKVxuICB9XG5cbiAgaWYgKHRhcmdldFJvb3QgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3QodGFyZ2V0Um9vdCwgXCJ0YXJnZXRSb290XCIpXG4gIH1cblxuICBjb25zdCBkZXNlcmlhbGl6ZSA9ICh2OiBhbnkpID0+IGRlc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50KHYsIHRhcmdldFJvb3QpXG4gIGNvbnN0IGRlc2VyaWFsaXplZEFjdGlvbkNhbGw6IEFjdGlvbkNhbGwgPSB7XG4gICAgLi4uYWN0aW9uQ2FsbCxcbiAgICBzZXJpYWxpemVkOiB1bmRlZmluZWQsXG4gICAgYXJnczogYWN0aW9uQ2FsbC5hcmdzLm1hcChkZXNlcmlhbGl6ZSksXG4gIH1cbiAgZGVsZXRlIChkZXNlcmlhbGl6ZWRBY3Rpb25DYWxsIGFzIE8uV3JpdGFibGU8QWN0aW9uQ2FsbD4pLnNlcmlhbGl6ZWRcbiAgcmV0dXJuIGRlc2VyaWFsaXplZEFjdGlvbkNhbGxcbn1cblxubGV0IGRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyc1JlZ2lzdGVyZWQgPSBmYWxzZVxuXG5mdW5jdGlvbiByZWdpc3RlckRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVycygpIHtcbiAgaWYgKGRlZmF1bHRBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWZhdWx0QWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcnNSZWdpc3RlcmVkID0gdHJ1ZVxuXG4gIC8vIHNlcmlhbGl6ZXIgcmVnaXN0cmF0aW9uIChmcm9tIGxvdyBwcmlvcml0eSB0byBoaWdoIHByaW9yaXR5KVxuXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihwcmltaXRpdmVTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIocGxhaW5PYmplY3RTZXJpYWxpemVyKVxuICByZWdpc3RlckFjdGlvbkNhbGxBcmd1bWVudFNlcmlhbGl6ZXIoc2V0U2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKG1hcFNlcmlhbGl6ZXIpXG4gIHJlZ2lzdGVyQWN0aW9uQ2FsbEFyZ3VtZW50U2VyaWFsaXplcihkYXRlU2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKGFycmF5U2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKG9iamVjdFNuYXBzaG90U2VyaWFsaXplcilcbiAgcmVnaXN0ZXJBY3Rpb25DYWxsQXJndW1lbnRTZXJpYWxpemVyKG9iamVjdFBhdGhTZXJpYWxpemVyKVxufVxuIiwiaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhcHBseUFjdGlvbiB9IGZyb20gXCIuLi8uLi9hY3Rpb24vYXBwbHlBY3Rpb25cIlxuaW1wb3J0IHsgZnJvemVuS2V5IH0gZnJvbSBcIi4uLy4uL2Zyb3plbi9Gcm96ZW5cIlxuaW1wb3J0IHsgZ2V0TW9kZWxJZFByb3BlcnR5TmFtZSB9IGZyb20gXCIuLi8uLi9tb2RlbC9nZXRNb2RlbE1ldGFkYXRhXCJcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tIFwiLi4vLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHR5cGUgeyBXcml0YWJsZVBhdGggfSBmcm9tIFwiLi4vLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IG9uUGF0Y2hlcyB9IGZyb20gXCIuLi8uLi9wYXRjaC9lbWl0UGF0Y2hcIlxuaW1wb3J0IHR5cGUgeyBQYXRjaCB9IGZyb20gXCIuLi8uLi9wYXRjaC9QYXRjaFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBmYWlsdXJlLCBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBkZXNlcmlhbGl6ZUFjdGlvbkNhbGwsIFNlcmlhbGl6ZWRBY3Rpb25DYWxsIH0gZnJvbSBcIi4vYWN0aW9uU2VyaWFsaXphdGlvblwiXG5cbi8qKlxuICogU2VyaWFsaXplZCBhY3Rpb24gY2FsbCB3aXRoIG1vZGVsIElEIG92ZXJyaWRlcy5cbiAqIENhbiBiZSBnZW5lcmF0ZWQgd2l0aCBgYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kVHJhY2tOZXdNb2RlbElkc2AuXG4gKiBUbyBiZSBhcHBsaWVkIHdpdGggYGFwcGx5U2VyaWFsaXplZEFjdGlvbkFuZFN5bmNOZXdNb2RlbElkc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZEFjdGlvbkNhbGxXaXRoTW9kZWxJZE92ZXJyaWRlcyBleHRlbmRzIFNlcmlhbGl6ZWRBY3Rpb25DYWxsIHtcbiAgLyoqXG4gICAqIE1vZGVsIElkIG92ZXJyaWRlcyB0byBiZSBhcHBsaWVkIGF0IHRoZSBlbmQgb2YgYXBwbHlpbmcgdGhlIGFjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGVsSWRPdmVycmlkZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+XG59XG5cbi8qKlxuICogQXBwbGllcyAocnVucykgYSBzZXJpYWxpemVkIGFjdGlvbiBvdmVyIGEgdGFyZ2V0IG9iamVjdC5cbiAqIEluIHRoaXMgbW9kZSBuZXdseSBnZW5lcmF0ZWQgLyBtb2RpZmllZCBtb2RlbCBJRHMgd2lsbCBiZSB0cmFja2VkXG4gKiBzbyB0aGV5IGNhbiBiZSBsYXRlciBzeW5jaHJvbml6ZWQgd2hlbiBhcHBseWluZyBpdCBvbiBhbm90aGVyIG1hY2hpbmVcbiAqIHZpYSBgYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kU3luY05ld01vZGVsSWRzYC5cbiAqIFRoaXMgbWVhbnMgdGhpcyBtZXRob2QgaXMgdXN1YWxseSB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBJZiB5b3UgaW50ZW5kIHRvIGFwcGx5IG5vbi1zZXJpYWxpemVkIGFjdGlvbnMgY2hlY2sgYGFwcGx5QWN0aW9uYCBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdCB0byBydW4gdGhlIGFjdGlvbiBvdmVyLlxuICogQHBhcmFtIGNhbGwgVGhlIHNlcmlhbGl6ZWQgYWN0aW9uLCB1c3VhbGx5IGFzIGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIvY2xpZW50LlxuICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLCBpZiBhbnksIHBsdXMgYSBuZXcgc2VyaWFsaXplZCBhY3Rpb25cbiAqIHdpdGggbW9kZWwgb3ZlcnJpZGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kVHJhY2tOZXdNb2RlbElkczxUUmV0ID0gYW55PihcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgY2FsbDogU2VyaWFsaXplZEFjdGlvbkNhbGxcbik6IHtcbiAgcmV0dXJuVmFsdWU6IFRSZXRcbiAgc2VyaWFsaXplZEFjdGlvbkNhbGw6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsV2l0aE1vZGVsSWRPdmVycmlkZXNcbn0ge1xuICBpZiAoIWNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgYXBwbHkgYSBub24tc2VyaWFsaXplZCBhY3Rpb24gY2FsbCwgdXNlICdhcHBseUFjdGlvbicgaW5zdGVhZFwiKVxuICB9XG5cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGNvbnN0IGRlc2VyaWFsaXplZENhbGwgPSBkZXNlcmlhbGl6ZUFjdGlvbkNhbGwoY2FsbCwgc3VidHJlZVJvb3QpXG5cbiAgY29uc3QgbW9kZWxJZE92ZXJyaWRlczogUGF0Y2hbXSA9IFtdXG5cbiAgLy8gc2V0IGEgcGF0Y2ggbGlzdGVuZXIgdG8gdHJhY2sgY2hhbmdlcyB0byBtb2RlbCBpZHNcbiAgY29uc3QgcGF0Y2hEaXNwb3NlciA9IG9uUGF0Y2hlcyhzdWJ0cmVlUm9vdCwgKHBhdGNoZXMpID0+IHtcbiAgICBzY2FuUGF0Y2hlc0Zvck1vZGVsSWRDaGFuZ2VzKHN1YnRyZWVSb290LCBtb2RlbElkT3ZlcnJpZGVzLCBwYXRjaGVzKVxuICB9KVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBhcHBseUFjdGlvbihzdWJ0cmVlUm9vdCwgZGVzZXJpYWxpemVkQ2FsbClcblxuICAgIHJldHVybiB7XG4gICAgICByZXR1cm5WYWx1ZSxcbiAgICAgIHNlcmlhbGl6ZWRBY3Rpb25DYWxsOiB7XG4gICAgICAgIC4uLmNhbGwsXG4gICAgICAgIG1vZGVsSWRPdmVycmlkZXMsXG4gICAgICB9LFxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwYXRjaERpc3Bvc2VyKClcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2FuUGF0Y2hlc0Zvck1vZGVsSWRDaGFuZ2VzKHJvb3Q6IG9iamVjdCwgbW9kZWxJZE92ZXJyaWRlczogUGF0Y2hbXSwgcGF0Y2hlczogUGF0Y2hbXSkge1xuICBjb25zdCBsZW4gPSBwYXRjaGVzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgcGF0Y2ggPSBwYXRjaGVzW2ldXG4gICAgaWYgKHBhdGNoLm9wID09PSBcInJlcGxhY2VcIiB8fCBwYXRjaC5vcCA9PT0gXCJhZGRcIikge1xuICAgICAgZGVlcFNjYW5WYWx1ZUZvck1vZGVsSWRDaGFuZ2VzKFxuICAgICAgICByb290LFxuICAgICAgICBtb2RlbElkT3ZlcnJpZGVzLFxuICAgICAgICBwYXRjaC52YWx1ZSxcbiAgICAgICAgcGF0Y2gucGF0aCBhcyBXcml0YWJsZVBhdGhcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVlcFNjYW5WYWx1ZUZvck1vZGVsSWRDaGFuZ2VzKFxuICByb290OiBvYmplY3QsXG4gIG1vZGVsSWRPdmVycmlkZXM6IFBhdGNoW10sXG4gIHZhbHVlOiBhbnksXG4gIHBhdGg6IFdyaXRhYmxlUGF0aFxuKSB7XG4gIGlmIChwYXRoLmxlbmd0aCA+PSAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIGVuc3VyZSB0aGUgcGFyZW50IGlzIGFuIGFjdHVhbCBtb2RlbFxuICAgIGNvbnN0IHBhcmVudCA9IHJlc29sdmVQYXRoKHJvb3QsIHBhdGguc2xpY2UoMCwgcGF0aC5sZW5ndGggLSAxKSkudmFsdWVcblxuICAgIGlmIChpc01vZGVsKHBhcmVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXVxuICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gZ2V0TW9kZWxJZFByb3BlcnR5TmFtZShwYXJlbnQuY29uc3RydWN0b3IgYXMgYW55KSkge1xuICAgICAgICAvLyBmb3VuZCBvbmVcbiAgICAgICAgbW9kZWxJZE92ZXJyaWRlcy5wdXNoKHtcbiAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgcGF0aDogcGF0aC5zbGljZSgpLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBsZW4gPSB2YWx1ZS5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBwYXRoLnB1c2goaSlcbiAgICAgIGRlZXBTY2FuVmFsdWVGb3JNb2RlbElkQ2hhbmdlcyhyb290LCBtb2RlbElkT3ZlcnJpZGVzLCB2YWx1ZVtpXSwgcGF0aClcbiAgICAgIHBhdGgucG9wKClcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgLy8gc2tpcCBmcm96ZW4gdmFsdWVzXG4gICAgaWYgKCF2YWx1ZVtmcm96ZW5LZXldKSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpXG4gICAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IGtleXNbaV1cbiAgICAgICAgY29uc3QgcHJvcFZhbHVlID0gdmFsdWVbcHJvcE5hbWVdXG5cbiAgICAgICAgcGF0aC5wdXNoKHByb3BOYW1lKVxuICAgICAgICBkZWVwU2NhblZhbHVlRm9yTW9kZWxJZENoYW5nZXMocm9vdCwgbW9kZWxJZE92ZXJyaWRlcywgcHJvcFZhbHVlLCBwYXRoKVxuICAgICAgICBwYXRoLnBvcCgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyAocnVucykgYSBzZXJpYWxpemVkIGFjdGlvbiBvdmVyIGEgdGFyZ2V0IG9iamVjdC5cbiAqIEluIHRoaXMgbW9kZSBuZXdseSBnZW5lcmF0ZWQgLyBtb2RpZmllZCBtb2RlbCBJRHMgcHJldmlvdXNseSB0cmFja2VkXG4gKiBieSBgYXBwbHlTZXJpYWxpemVkQWN0aW9uQW5kVHJhY2tOZXdNb2RlbElkc2Agd2lsbCBiZSBzeW5jaHJvbml6ZWQgYWZ0ZXJcbiAqIHRoZSBhY3Rpb24gaXMgYXBwbGllZC5cbiAqIFRoaXMgbWVhbnMgdGhpcyBtZXRob2QgaXMgdXN1YWxseSB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZS5cbiAqXG4gKiBJZiB5b3UgaW50ZW5kIHRvIGFwcGx5IG5vbi1zZXJpYWxpemVkIGFjdGlvbnMgY2hlY2sgYGFwcGx5QWN0aW9uYCBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdCB0byBydW4gdGhlIGFjdGlvbiBvdmVyLlxuICogQHBhcmFtIGNhbGwgVGhlIHNlcmlhbGl6ZWQgYWN0aW9uLCB1c3VhbGx5IGFzIGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIvY2xpZW50LlxuICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlcmlhbGl6ZWRBY3Rpb25BbmRTeW5jTmV3TW9kZWxJZHM8VFJldCA9IGFueT4oXG4gIHN1YnRyZWVSb290OiBvYmplY3QsXG4gIGNhbGw6IFNlcmlhbGl6ZWRBY3Rpb25DYWxsV2l0aE1vZGVsSWRPdmVycmlkZXNcbik6IFRSZXQge1xuICBpZiAoIWNhbGwuc2VyaWFsaXplZCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgYXBwbHkgYSBub24tc2VyaWFsaXplZCBhY3Rpb24gY2FsbCwgdXNlICdhcHBseUFjdGlvbicgaW5zdGVhZFwiKVxuICB9XG5cbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGNvbnN0IGRlc2VyaWFsaXplZENhbGwgPSBkZXNlcmlhbGl6ZUFjdGlvbkNhbGwoY2FsbCwgc3VidHJlZVJvb3QpXG5cbiAgbGV0IHJldHVyblZhbHVlOiBhbnlcbiAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgIHJldHVyblZhbHVlID0gYXBwbHlBY3Rpb24oc3VidHJlZVJvb3QsIGRlc2VyaWFsaXplZENhbGwpXG5cbiAgICAvLyBhcHBseSBtb2RlbCBpZCBvdmVycmlkZXNcbiAgICBhcHBseVBhdGNoZXMoc3VidHJlZVJvb3QsIGNhbGwubW9kZWxJZE92ZXJyaWRlcylcbiAgfSlcblxuICByZXR1cm4gcmV0dXJuVmFsdWVcbn1cbiIsImltcG9ydCB7XG4gIEFjdGlvbkNvbnRleHQsXG4gIEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLFxuICBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZSxcbn0gZnJvbSBcIi4uL2FjdGlvbi9jb250ZXh0XCJcbmltcG9ydCB7XG4gIEFjdGlvbk1pZGRsZXdhcmUsXG4gIEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlcixcbiAgYWRkQWN0aW9uTWlkZGxld2FyZSxcbn0gZnJvbSBcIi4uL2FjdGlvbi9taWRkbGV3YXJlXCJcbmltcG9ydCB0eXBlIHsgRmxvd0ZpbmlzaGVyIH0gZnJvbSBcIi4uL2FjdGlvbi9tb2RlbEZsb3dcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5cbi8qKlxuICogU2ltcGxpZmllZCB2ZXJzaW9uIG9mIGFjdGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZUFjdGlvbkNvbnRleHQge1xuICAvKipcbiAgICogQWN0aW9uIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZ1xuICAvKipcbiAgICogQWN0aW9uIHR5cGUsIHN5bmMgb3IgYXN5bmMuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZVxuICAvKipcbiAgICogQWN0aW9uIHRhcmdldCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldDogQW55TW9kZWxcbiAgLyoqXG4gICAqIEFycmF5IG9mIGFjdGlvbiBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBhcmdzOiBSZWFkb25seUFycmF5PGFueT5cbiAgLyoqXG4gICAqIFBhcmVudCBhY3Rpb24gY29udGV4dCwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50Q29udGV4dD86IFNpbXBsZUFjdGlvbkNvbnRleHRcbiAgLyoqXG4gICAqIFJvb3QgYWN0aW9uIGNvbnRleHQsIG9yIGl0c2VsZiBpZiB0aGUgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RDb250ZXh0OiBTaW1wbGVBY3Rpb25Db250ZXh0XG4gIC8qKlxuICAgKiBDdXN0b20gZGF0YSBmb3IgdGhlIGFjdGlvbiBjb250ZXh0IHRvIGJlIHNldCBieSBtaWRkbGV3YXJlcywgYW4gb2JqZWN0LlxuICAgKiBTeW1ib2xzIG11c3QgYmUgdXNlZCBhcyBrZXlzIHRvIGF2b2lkIG5hbWUgY2xhc2hpbmcgYmV0d2VlbiBtaWRkbGV3YXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE6IFJlY29yZDxzeW1ib2wsIGFueT5cbn1cblxuLyoqXG4gKiBBY3Rpb24gdHJhY2tpbmcgbWlkZGxld2FyZSBmaW5pc2ggcmVzdWx0LlxuICovXG5leHBvcnQgZW51bSBBY3Rpb25UcmFja2luZ1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHJldHVybmVkIG5vcm1hbGx5ICh3aXRob3V0IHRocm93aW5nKS5cbiAgICovXG4gIFJldHVybiA9IFwicmV0dXJuXCIsXG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRocmV3IGFuIGVycm9yLlxuICAgKi9cbiAgVGhyb3cgPSBcInRocm93XCIsXG59XG5cbi8qKlxuICogQWN0aW9uIHRyYWNraW5nIG1pZGRsZXdhcmUgaG9va3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlIHtcbiAgLyoqXG4gICAqIEZpbHRlciBmdW5jdGlvbiBjYWxsZWQgd2hlbmV2ZXIgZWFjaCBhY3Rpb24gc3RhcnRzLCBhbmQgb25seSB0aGVuLlxuICAgKlxuICAgKiBJZiB0aGUgYWN0aW9uIGlzIGFjY2VwdGVkIHRoZW4gYG9uU3RhcnRgLCBgb25SZXN1bWVgLCBgb25TdXNwZW5kYCBhbmQgYG9uRmluaXNoYFxuICAgKiBmb3IgdGhhdCBwYXJ0aWN1bGFyIGFjdGlvbiB3aWxsIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQWxsIGFjdGlvbnMgYXJlIGFjY2VwdGVkIGJ5IGRlZmF1bHQgaWYgbm8gZmlsdGVyIGZ1bmN0aW9uIGlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICogQHJldHVybnMgdHJ1ZSB0byBhY2NlcHQgdGhlIGFjdGlvbiwgZmFsc2UgdG8gc2tpcCBpdC5cbiAgICovXG4gIGZpbHRlcj8oY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24ganVzdCBzdGFydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIENhbiBvcHRpb25hbGx5IHJldHVybiBhIHJlc3VsdCB0aGF0IHdpbGwgY2FuY2VsIHRoZSBvcmlnaW5hbCBhY3Rpb24gYW5kIGZpbmlzaCBpdFxuICAgKiB3aXRoIHRoZSByZXR1cm5lZCB2YWx1ZSAvIGVycm9yIHRvIGJlIHRocm93bi4gSW4gZWl0aGVyIGNhc2UgY2FzZSByZXN1bWUgLyBzdXNwZW5kIC8gZmluaXNoIHdpbGxcbiAgICogc3RpbGwgYmUgY2FsbGVkIG5vcm1hbGx5LlxuICAgKi9cbiAgb25TdGFydD8oY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogdm9pZCB8IEFjdGlvblRyYWNraW5nUmV0dXJuXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBqdXN0IHJlc3VtZWQgYSBzeW5jaHJvbm91cyBwaWVjZSBvZiBjb2RlIGV4ZWN1dGlvbi5cbiAgICogR2V0cyBjYWxsZWQgb25jZSBmb3Igc3luYyBhY3Rpb25zIGFuZCBtdWx0aXBsZSB0aW1lcyBmb3IgZmxvd3MuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICovXG4gIG9uUmVzdW1lPyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBqdXN0IGZpbmlzaGVkIGEgc3luY2hyb25vdXMgcGljZSBvZiBjb2RlIGV4ZWN1dGlvbi5cbiAgICogTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuIHRoZSBhY3Rpb24gaXMgZmluaXNoZWQuXG4gICAqIEdldHMgY2FsbGVkIG9uY2UgZm9yIHN5bmMgYWN0aW9ucyBhbmQgbXVsdGlwbGUgdGltZXMgZm9yIGZsb3dzLlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gICAqL1xuICBvblN1c3BlbmQ/KGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IHZvaWRcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIGp1c3QgZmluaXNoZWQsIGVpdGhlciBieSByZXR1cm5pbmcgbm9ybWFsbHkgb3IgYnkgdGhyb3dpbmcgYW4gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBjdHggU2ltcGxpZmllZCBhY3Rpb24gY29udGV4dC5cbiAgICogQHBhcmFtIHJldCBBY3Rpb24gcmV0dXJuIHJlc3VsdC5cbiAgICogQHJldHVybnMgQ2FuIG9wdGlvbmFsbHkgcmV0dXJuIGEgbmV3IHJlc3VsdCB0aGF0IHdpbGwgb3ZlcnJpZGUgdGhlIG9yaWdpbmFsIG9uZS5cbiAgICovXG4gIG9uRmluaXNoPyhjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQsIHJldDogQWN0aW9uVHJhY2tpbmdSZXR1cm4pOiB2b2lkIHwgQWN0aW9uVHJhY2tpbmdSZXR1cm5cbn1cblxuLyoqXG4gKiBSZXR1cm4gcmVzdWx0IG9mIGFuIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25UcmFja2luZ1JldHVybiB7XG4gIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHRcbiAgdmFsdWU6IGFueVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYWN0aW9uIHRyYWNraW5nIG1pZGRsZXdhcmUsIHdoaWNoIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgc3RhbmRhcmQgYWN0aW9uIG1pZGRsZXdhcmUuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290IFN1YnRyZWUgcm9vdCB0YXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIGhvb2tzIE1pZGRsZXdhcmUgaG9va3MuXG4gKiBAcmV0dXJucyBUaGUgbWlkZGxld2FyZSBkaXNwb3Nlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShcbiAgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgaG9va3M6IEFjdGlvblRyYWNraW5nTWlkZGxld2FyZVxuKTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGNvbnN0IGRhdGFTeW1ib2wgPSBTeW1ib2woXCJhY3Rpb25UcmFja2luZ01pZGRsZXdhcmVEYXRhXCIpXG5cbiAgZW51bSBTdGF0ZSB7XG4gICAgSWRsZSA9IFwiaWRsZVwiLFxuICAgIFN0YXJ0ZWQgPSBcInN0YXJ0ZWRcIixcbiAgICBSZWFsUmVzdW1lZCA9IFwicmVhbFJlc3VtZWRcIixcbiAgICBGYWtlUmVzdW1lZCA9IFwiZmFrZVJlc3VtZWRcIixcbiAgICBTdXNwZW5kZWQgPSBcInN1c3BlbmRlZFwiLFxuICAgIEZpbmlzaGVkID0gXCJmaW5pc2hlZFwiLFxuICB9XG5cbiAgaW50ZXJmYWNlIERhdGEge1xuICAgIHN0YXJ0QWNjZXB0ZWQ6IGJvb2xlYW5cbiAgICBzdGF0ZTogU3RhdGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEN0eERhdGEoY3R4OiBBY3Rpb25Db250ZXh0IHwgU2ltcGxlQWN0aW9uQ29udGV4dCk6IERhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjdHguZGF0YVtkYXRhU3ltYm9sXVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0Q3R4RGF0YShjdHg6IEFjdGlvbkNvbnRleHQgfCBTaW1wbGVBY3Rpb25Db250ZXh0LCBwYXJ0aWFsRGF0YTogUGFydGlhbDxEYXRhPikge1xuICAgIGxldCBjdXJyZW50RGF0YSA9IGN0eC5kYXRhW2RhdGFTeW1ib2xdXG4gICAgaWYgKCFjdXJyZW50RGF0YSkge1xuICAgICAgY3R4LmRhdGFbZGF0YVN5bWJvbF0gPSBwYXJ0aWFsRGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuYXNzaWduKGN1cnJlbnREYXRhLCBwYXJ0aWFsRGF0YSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB1c2VyRmlsdGVyOiBBY3Rpb25NaWRkbGV3YXJlW1wiZmlsdGVyXCJdID0gKGN0eCkgPT4ge1xuICAgIGlmIChob29rcy5maWx0ZXIpIHtcbiAgICAgIHJldHVybiBob29rcy5maWx0ZXIoc2ltcGxpZnlBY3Rpb25Db250ZXh0KGN0eCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0IHJlc3VtZVN1c3BlbmRTdXBwb3J0ID0gISFob29rcy5vblJlc3VtZSB8fCAhIWhvb2tzLm9uU3VzcGVuZFxuXG4gIGNvbnN0IGZpbHRlcjogQWN0aW9uTWlkZGxld2FyZVtcImZpbHRlclwiXSA9IChjdHgpID0+IHtcbiAgICBpZiAoY3R4LnR5cGUgPT09IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLlN5bmMpIHtcbiAgICAgIC8vIHN0YXJ0IGFuZCBmaW5pc2ggaXMgb24gdGhlIHNhbWUgY29udGV4dFxuICAgICAgY29uc3QgYWNjZXB0ZWQgPSB1c2VyRmlsdGVyKGN0eClcbiAgICAgIGlmIChhY2NlcHRlZCkge1xuICAgICAgICBzZXRDdHhEYXRhKGN0eCwge1xuICAgICAgICAgIHN0YXJ0QWNjZXB0ZWQ6IHRydWUsXG4gICAgICAgICAgc3RhdGU6IFN0YXRlLklkbGUsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjZXB0ZWRcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChjdHguYXN5bmNTdGVwVHlwZSkge1xuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlNwYXduOlxuICAgICAgICAgIGNvbnN0IGFjY2VwdGVkID0gdXNlckZpbHRlcihjdHgpXG4gICAgICAgICAgaWYgKGFjY2VwdGVkKSB7XG4gICAgICAgICAgICBzZXRDdHhEYXRhKGN0eCwge1xuICAgICAgICAgICAgICBzdGFydEFjY2VwdGVkOiB0cnVlLFxuICAgICAgICAgICAgICBzdGF0ZTogU3RhdGUuSWRsZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2NlcHRlZFxuXG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmV0dXJuOlxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlRocm93OlxuICAgICAgICAgIC8vIGRlcGVuZHMgaWYgdGhlIHNwYXduIG9uZSB3YXMgYWNjZXB0ZWQgb3Igbm90XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGdldEN0eERhdGEoY3R4LnNwYXduQXN5bmNTdGVwQ29udGV4dCEpXG4gICAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhLnN0YXJ0QWNjZXB0ZWQgOiBmYWxzZVxuXG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lOlxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJlc3VtZUVycm9yOlxuICAgICAgICAgIGlmICghcmVzdW1lU3VzcGVuZFN1cHBvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBkZXBlbmRzIGlmIHRoZSBzcGF3biBvbmUgd2FzIGFjY2VwdGVkIG9yIG5vdFxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGdldEN0eERhdGEoY3R4LnNwYXduQXN5bmNTdGVwQ29udGV4dCEpXG4gICAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGEuc3RhcnRBY2NlcHRlZCA6IGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSAoc2ltcGxlQ3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogQWN0aW9uVHJhY2tpbmdSZXR1cm4gfCB1bmRlZmluZWQgPT4ge1xuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogU3RhdGUuU3RhcnRlZCxcbiAgICB9KVxuICAgIGlmIChob29rcy5vblN0YXJ0KSB7XG4gICAgICByZXR1cm4gaG9va3Mub25TdGFydChzaW1wbGVDdHgpIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBmaW5pc2ggPSAoXG4gICAgc2ltcGxlQ3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LFxuICAgIHJldDogQWN0aW9uVHJhY2tpbmdSZXR1cm5cbiAgKTogQWN0aW9uVHJhY2tpbmdSZXR1cm4gPT4ge1xuICAgIC8vIGZha2VseSByZXN1bWUgYW5kIHN1c3BlbmQgdGhlIHBhcmVudCBpZiBuZWVkZWRcbiAgICBjb25zdCBwYXJlbnRDdHggPSBzaW1wbGVDdHgucGFyZW50Q29udGV4dFxuICAgIGxldCBwYXJlbnRSZXN1bWVkID0gZmFsc2VcbiAgICBpZiAocGFyZW50Q3R4KSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gZ2V0Q3R4RGF0YShwYXJlbnRDdHgpXG4gICAgICBpZiAocGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLnN0YXJ0QWNjZXB0ZWQgJiYgcGFyZW50RGF0YS5zdGF0ZSA9PT0gU3RhdGUuU3VzcGVuZGVkKSB7XG4gICAgICAgIHBhcmVudFJlc3VtZWQgPSB0cnVlXG4gICAgICAgIHJlc3VtZShwYXJlbnRDdHgsIGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogU3RhdGUuRmluaXNoZWQsXG4gICAgfSlcblxuICAgIGlmIChob29rcy5vbkZpbmlzaCkge1xuICAgICAgcmV0ID0gaG9va3Mub25GaW5pc2goc2ltcGxlQ3R4LCByZXQpIHx8IHJldFxuICAgIH1cblxuICAgIGlmIChwYXJlbnRSZXN1bWVkKSB7XG4gICAgICBzdXNwZW5kKHBhcmVudEN0eCEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgY29uc3QgcmVzdW1lID0gKHNpbXBsZUN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCwgcmVhbDogYm9vbGVhbikgPT4ge1xuICAgIC8vIGVuc3VyZSBwYXJlbnRzIGFyZSByZXN1bWVkXG4gICAgY29uc3QgcGFyZW50Q3R4ID0gc2ltcGxlQ3R4LnBhcmVudENvbnRleHRcbiAgICBpZiAocGFyZW50Q3R4KSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gZ2V0Q3R4RGF0YShwYXJlbnRDdHgpXG4gICAgICBpZiAocGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLnN0YXJ0QWNjZXB0ZWQgJiYgcGFyZW50RGF0YS5zdGF0ZSA9PT0gU3RhdGUuU3VzcGVuZGVkKSB7XG4gICAgICAgIHJlc3VtZShwYXJlbnRDdHgsIGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogcmVhbCA/IFN0YXRlLlJlYWxSZXN1bWVkIDogU3RhdGUuRmFrZVJlc3VtZWQsXG4gICAgfSlcbiAgICBpZiAoaG9va3Mub25SZXN1bWUpIHtcbiAgICAgIGhvb2tzLm9uUmVzdW1lKHNpbXBsZUN0eClcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdXNwZW5kID0gKHNpbXBsZUN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCkgPT4ge1xuICAgIHNldEN0eERhdGEoc2ltcGxlQ3R4LCB7XG4gICAgICBzdGF0ZTogU3RhdGUuU3VzcGVuZGVkLFxuICAgIH0pXG4gICAgaWYgKGhvb2tzLm9uU3VzcGVuZCkge1xuICAgICAgaG9va3Mub25TdXNwZW5kKHNpbXBsZUN0eClcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgcGFyZW50cyBhcmUgc3VzcGVuZGVkIGlmIHRoZXkgd2VyZSBmYWtlbHkgcmVzdW1lZFxuICAgIGNvbnN0IHBhcmVudEN0eCA9IHNpbXBsZUN0eC5wYXJlbnRDb250ZXh0XG4gICAgaWYgKHBhcmVudEN0eCkge1xuICAgICAgY29uc3QgcGFyZW50RGF0YSA9IGdldEN0eERhdGEocGFyZW50Q3R4KVxuICAgICAgaWYgKHBhcmVudERhdGEgJiYgcGFyZW50RGF0YS5zdGFydEFjY2VwdGVkICYmIHBhcmVudERhdGEuc3RhdGUgPT09IFN0YXRlLkZha2VSZXN1bWVkKSB7XG4gICAgICAgIHN1c3BlbmQocGFyZW50Q3R4KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG13YXJlOiBBY3Rpb25NaWRkbGV3YXJlW1wibWlkZGxld2FyZVwiXSA9IChjdHgsIG5leHQpID0+IHtcbiAgICBjb25zdCBzaW1wbGVDdHggPSBzaW1wbGlmeUFjdGlvbkNvbnRleHQoY3R4KVxuXG4gICAgY29uc3Qgb3JpZ05leHQgPSBuZXh0XG4gICAgbmV4dCA9ICgpID0+IHtcbiAgICAgIHJlc3VtZShzaW1wbGVDdHgsIHRydWUpXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZ05leHQoKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3VzcGVuZChzaW1wbGVDdHgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN0eC50eXBlID09PSBBY3Rpb25Db250ZXh0QWN0aW9uVHlwZS5TeW5jKSB7XG4gICAgICBsZXQgcmV0T2JqID0gc3RhcnQoc2ltcGxlQ3R4KVxuXG4gICAgICBpZiAocmV0T2JqKSB7XG4gICAgICAgIC8vIGFjdGlvbiBjYW5jZWxlZCAvIG92ZXJyaWRkZW4gYnkgb25TdGFydFxuICAgICAgICByZXN1bWUoc2ltcGxlQ3R4LCB0cnVlKVxuICAgICAgICBzdXNwZW5kKHNpbXBsZUN0eClcbiAgICAgICAgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwgcmV0T2JqKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCB7IHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuLCB2YWx1ZTogbmV4dCgpIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldE9iaiA9IGZpbmlzaChzaW1wbGVDdHgsIHsgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdywgdmFsdWU6IGVyciB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5PclRocm93QWN0aW9uVHJhY2tpbmdSZXR1cm4ocmV0T2JqKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhc3luY1xuXG4gICAgICBzd2l0Y2ggKGN0eC5hc3luY1N0ZXBUeXBlKSB7XG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuU3Bhd246IHtcbiAgICAgICAgICBsZXQgcmV0T2JqID0gc3RhcnQoc2ltcGxlQ3R4KVxuICAgICAgICAgIGlmIChyZXRPYmopIHtcbiAgICAgICAgICAgIC8vIGFjdGlvbiBjYW5jZWxlZCAvIG92ZXJyaWRkZW4gYnkgb25TdGFydFxuICAgICAgICAgICAgcmVzdW1lKHNpbXBsZUN0eCwgdHJ1ZSlcbiAgICAgICAgICAgIHN1c3BlbmQoc2ltcGxlQ3R4KVxuICAgICAgICAgICAgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwgcmV0T2JqKVxuICAgICAgICAgICAgcmV0dXJuIHJldHVybk9yVGhyb3dBY3Rpb25UcmFja2luZ1JldHVybihyZXRPYmopXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlJldHVybjoge1xuICAgICAgICAgIGNvbnN0IGZsb3dGaW5pc2hlcjogRmxvd0ZpbmlzaGVyID0gbmV4dCgpXG4gICAgICAgICAgY29uc3QgcmV0T2JqID0gZmluaXNoKHNpbXBsZUN0eCwge1xuICAgICAgICAgICAgcmVzdWx0OiBBY3Rpb25UcmFja2luZ1Jlc3VsdC5SZXR1cm4sXG4gICAgICAgICAgICB2YWx1ZTogZmxvd0ZpbmlzaGVyLnZhbHVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLnJlc29sdXRpb24gPVxuICAgICAgICAgICAgcmV0T2JqLnJlc3VsdCA9PT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuID8gXCJhY2NlcHRcIiA6IFwicmVqZWN0XCJcbiAgICAgICAgICBmbG93RmluaXNoZXIudmFsdWUgPSByZXRPYmoudmFsdWVcbiAgICAgICAgICByZXR1cm4gZmxvd0ZpbmlzaGVyXG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEFjdGlvbkNvbnRleHRBc3luY1N0ZXBUeXBlLlRocm93OiB7XG4gICAgICAgICAgY29uc3QgZmxvd0ZpbmlzaGVyOiBGbG93RmluaXNoZXIgPSBuZXh0KClcbiAgICAgICAgICBjb25zdCByZXRPYmogPSBmaW5pc2goc2ltcGxlQ3R4LCB7XG4gICAgICAgICAgICByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93LFxuICAgICAgICAgICAgdmFsdWU6IGZsb3dGaW5pc2hlci52YWx1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGZsb3dGaW5pc2hlci5yZXNvbHV0aW9uID1cbiAgICAgICAgICAgIHJldE9iai5yZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlJldHVybiA/IFwiYWNjZXB0XCIgOiBcInJlamVjdFwiXG4gICAgICAgICAgZmxvd0ZpbmlzaGVyLnZhbHVlID0gcmV0T2JqLnZhbHVlXG4gICAgICAgICAgcmV0dXJuIGZsb3dGaW5pc2hlclxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBBY3Rpb25Db250ZXh0QXN5bmNTdGVwVHlwZS5SZXN1bWU6XG4gICAgICAgIGNhc2UgQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUuUmVzdW1lRXJyb3I6XG4gICAgICAgICAgaWYgKHJlc3VtZVN1c3BlbmRTdXBwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgICAgIGBhc3NlcnRpb24gZXJyb3I6IGFzeW5jIHN0ZXAgc2hvdWxkIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQgLSAke2N0eC5hc3luY1N0ZXBUeXBlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgICAgYGFzc2VydGlvbiBlcnJvcjogYXN5bmMgc3RlcCBzaG91bGQgaGF2ZSBiZWVuIGZpbHRlcmVkIG91dCAtICR7Y3R4LmFzeW5jU3RlcFR5cGV9YFxuICAgICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWRkQWN0aW9uTWlkZGxld2FyZSh7IG1pZGRsZXdhcmU6IG13YXJlLCBmaWx0ZXIsIHN1YnRyZWVSb290OiBzdWJ0cmVlUm9vdCB9KVxufVxuXG5mdW5jdGlvbiByZXR1cm5PclRocm93QWN0aW9uVHJhY2tpbmdSZXR1cm4ocmV0T2JqOiBBY3Rpb25UcmFja2luZ1JldHVybikge1xuICBpZiAocmV0T2JqLnJlc3VsdCA9PT0gQWN0aW9uVHJhY2tpbmdSZXN1bHQuUmV0dXJuKSB7XG4gICAgcmV0dXJuIHJldE9iai52YWx1ZVxuICB9IGVsc2Uge1xuICAgIHRocm93IHJldE9iai52YWx1ZVxuICB9XG59XG5cbmNvbnN0IHNpbXBsZURhdGFDb250ZXh0U3ltYm9sID0gU3ltYm9sKFwic2ltcGxlRGF0YUNvbnRleHRcIilcblxuLyoqXG4gKiBTaW1wbGlmaWVzIGFuIGFjdGlvbiBjb250ZXh0IGJ5IGNvbnZlcnRpbmcgYW4gYXN5bmMgY2FsbCBoaWVyYXJjaHkgaW50byBhIHNpbXBsZXIgb25lLlxuICpcbiAqIEBwYXJhbSBjdHggQWN0aW9uIGNvbnRleHQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFNpbXBsaWZpZWQgYWN0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeUFjdGlvbkNvbnRleHQoY3R4OiBBY3Rpb25Db250ZXh0KTogU2ltcGxlQWN0aW9uQ29udGV4dCB7XG4gIHdoaWxlIChjdHgucHJldmlvdXNBc3luY1N0ZXBDb250ZXh0KSB7XG4gICAgY3R4ID0gY3R4LnByZXZpb3VzQXN5bmNTdGVwQ29udGV4dFxuICB9XG5cbiAgbGV0IHNpbXBsZUN0eCA9IGN0eC5kYXRhW3NpbXBsZURhdGFDb250ZXh0U3ltYm9sXVxuICBpZiAoIXNpbXBsZUN0eCkge1xuICAgIGNvbnN0IHBhcmVudENvbnRleHQgPSBjdHgucGFyZW50Q29udGV4dCA/IHNpbXBsaWZ5QWN0aW9uQ29udGV4dChjdHgucGFyZW50Q29udGV4dCkgOiB1bmRlZmluZWRcblxuICAgIHNpbXBsZUN0eCA9IHtcbiAgICAgIGFjdGlvbk5hbWU6IGN0eC5hY3Rpb25OYW1lLFxuICAgICAgdHlwZTogY3R4LnR5cGUsXG4gICAgICB0YXJnZXQ6IGN0eC50YXJnZXQsXG4gICAgICBhcmdzOiBjdHguYXJncyxcbiAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgcGFyZW50Q29udGV4dCxcbiAgICB9XG4gICAgc2ltcGxlQ3R4LnJvb3RDb250ZXh0ID0gcGFyZW50Q29udGV4dCA/IHBhcmVudENvbnRleHQucm9vdENvbnRleHQgOiBzaW1wbGVDdHhcblxuICAgIGN0eC5kYXRhW3NpbXBsZURhdGFDb250ZXh0U3ltYm9sXSA9IHNpbXBsZUN0eFxuICB9XG4gIHJldHVybiBzaW1wbGVDdHhcbn1cbiIsImltcG9ydCB0eXBlIHsgQWN0aW9uQ2FsbCB9IGZyb20gXCIuLi9hY3Rpb24vYXBwbHlBY3Rpb25cIlxuaW1wb3J0IHsgaXNIb29rQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9ob29rQWN0aW9uc1wiXG5pbXBvcnQgdHlwZSB7IEFjdGlvbk1pZGRsZXdhcmVEaXNwb3NlciB9IGZyb20gXCIuLi9hY3Rpb24vbWlkZGxld2FyZVwiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLFxuICBBY3Rpb25UcmFja2luZ1JldHVybixcbiAgU2ltcGxlQWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4vYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlXCJcbmltcG9ydCB7IHJvb3RQYXRoVG9UYXJnZXRQYXRoSWRzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIEF0dGFjaGVzIGFuIGFjdGlvbiBtaWRkbGV3YXJlIHRoYXQgaW52b2tlcyBhIGxpc3RlbmVyIGZvciBhbGwgYWN0aW9ucyBvZiBhIGdpdmVuIHRyZWUuXG4gKiBOb3RlIHRoYXQgdGhlIGxpc3RlbmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciB0aGUgdG9wbW9zdCBsZXZlbCBhY3Rpb25zLCBzbyBpdCB3b24ndCBydW4gZm9yIGNoaWxkIGFjdGlvbnMgb3IgaW50ZXJtZWRpYXJ5IGZsb3cgc3RlcHMuXG4gKiBBbHNvIGl0IHdvbid0IHRyaWdnZXIgdGhlIGxpc3RlbmVyIGZvciBjYWxscyB0byBob29rcyBzdWNoIGFzIGBvbkF0dGFjaGVkVG9Sb290U3RvcmVgIG9yIGl0cyByZXR1cm5lZCBkaXNwb3Nlci5cbiAqXG4gKiBJdHMgbWFpbiB1c2UgaXMgdG8ga2VlcCB0cmFjayBvZiB0b3AgbGV2ZWwgYWN0aW9ucyB0aGF0IGNhbiBiZSBsYXRlciByZXBsaWNhdGVkIHZpYSBgYXBwbHlBY3Rpb25gIHNvbWV3aGVyZSBlbHNlIChhbm90aGVyIG1hY2hpbmUsIGV0Yy4pLlxuICpcbiAqIFRoZXJlIGFyZSB0d28ga2luZCBvZiBwb3NzaWJsZSBsaXN0ZW5lcnMsIGBvblN0YXJ0YCBhbmQgYG9uRmluaXNoYCBsaXN0ZW5lcnMuXG4gKiBgb25TdGFydGAgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYmVmb3JlIHRoZSBhY3Rpb24gZXhlY3V0ZXMgYW5kIGFsbG93IGNhbmNlbGxhdGlvbiBieSByZXR1cm5pbmcgYSBuZXcgcmV0dXJuIHZhbHVlICh3aGljaCBtaWdodCBiZSBhIHJldHVybiBvciBhIHRocm93KS5cbiAqIGBvbkZpbmlzaGAgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRlcywgaGF2ZSBhY2Nlc3MgdG8gdGhlIGFjdGlvbiBhY3R1YWwgcmV0dXJuIHZhbHVlIGFuZCBhbGxvdyBvdmVycmlkaW5nIGJ5IHJldHVybmluZyBhXG4gKiBuZXcgcmV0dXJuIHZhbHVlICh3aGljaCBtaWdodCBiZSBhIHJldHVybiBvciBhIHRocm93KS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgYWN0dWFsIGFjdGlvbiBjYWxscyBhcmUgc2VyaWFsaXphYmxlIHlvdSBzaG91bGQgdXNlIGVpdGhlciBgc2VyaWFsaXplQWN0aW9uQ2FsbEFyZ3VtZW50YCBvdmVyIHRoZSBhcmd1bWVudHNcbiAqIG9yIGBzZXJpYWxpemVBY3Rpb25DYWxsYCBvdmVyIHRoZSB3aG9sZSBhY3Rpb24gYmVmb3JlIHNlbmRpbmcgdGhlIGFjdGlvbiBjYWxsIG92ZXIgdGhlIHdpcmUgLyBzdG9yaW5nIHRoZW0gLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBsaXN0ZW5lcnMgTGlzdGVuZXIgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5dGltZSBhIHRvcG1vc3QgYWN0aW9uIGlzIGludm9rZWQgb24gdGhlIG1vZGVsIG9yIGFueSBjaGlsZHJlbi5cbiAqIEByZXR1cm5zIFRoZSBtaWRkbGV3YXJlIGRpc3Bvc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25BY3Rpb25NaWRkbGV3YXJlKFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0LFxuICBsaXN0ZW5lcnM6IHtcbiAgICBvblN0YXJ0PzogKFxuICAgICAgYWN0aW9uQ2FsbDogQWN0aW9uQ2FsbCxcbiAgICAgIGFjdGlvbkNvbnRleHQ6IFNpbXBsZUFjdGlvbkNvbnRleHRcbiAgICApID0+IHZvaWQgfCBBY3Rpb25UcmFja2luZ1JldHVyblxuICAgIG9uRmluaXNoPzogKFxuICAgICAgYWN0aW9uQ2FsbDogQWN0aW9uQ2FsbCxcbiAgICAgIGFjdGlvbkNvbnRleHQ6IFNpbXBsZUFjdGlvbkNvbnRleHQsXG4gICAgICByZXQ6IEFjdGlvblRyYWNraW5nUmV0dXJuXG4gICAgKSA9PiB2b2lkIHwgQWN0aW9uVHJhY2tpbmdSZXR1cm5cbiAgfVxuKTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuICBhc3NlcnRJc09iamVjdChsaXN0ZW5lcnMsIFwibGlzdGVuZXJzXCIpXG5cbiAgcmV0dXJuIGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShzdWJ0cmVlUm9vdCwge1xuICAgIGZpbHRlcihjdHgpIHtcbiAgICAgIGlmIChjdHgucGFyZW50Q29udGV4dCkge1xuICAgICAgICAvLyBzdWItYWN0aW9uLCBkbyBub3RoaW5nXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBza2lwIGhvb2tzXG4gICAgICBpZiAoaXNIb29rQWN0aW9uKGN0eC5hY3Rpb25OYW1lKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgb25TdGFydChjdHgpIHtcbiAgICAgIGlmIChsaXN0ZW5lcnMub25TdGFydCkge1xuICAgICAgICBjb25zdCBhY3Rpb25DYWxsID0gYWN0aW9uQ29udGV4dFRvQWN0aW9uQ2FsbChjdHgpXG4gICAgICAgIHJldHVybiBsaXN0ZW5lcnMub25TdGFydChhY3Rpb25DYWxsLCBjdHgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uRmluaXNoKGN0eCwgcmV0KSB7XG4gICAgICBpZiAobGlzdGVuZXJzLm9uRmluaXNoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkNhbGwgPSBhY3Rpb25Db250ZXh0VG9BY3Rpb25DYWxsKGN0eClcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVycy5vbkZpbmlzaChhY3Rpb25DYWxsLCBjdHgsIHJldClcbiAgICAgIH1cbiAgICB9LFxuICB9KVxufVxuXG5mdW5jdGlvbiBhY3Rpb25Db250ZXh0VG9BY3Rpb25DYWxsKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IEFjdGlvbkNhbGwge1xuICBjb25zdCByb290UGF0aCA9IGZhc3RHZXRSb290UGF0aChjdHgudGFyZ2V0KVxuXG4gIHJldHVybiB7XG4gICAgYWN0aW9uTmFtZTogY3R4LmFjdGlvbk5hbWUsXG4gICAgYXJnczogY3R4LmFyZ3MsXG4gICAgdGFyZ2V0UGF0aDogcm9vdFBhdGgucGF0aCxcbiAgICB0YXJnZXRQYXRoSWRzOiByb290UGF0aFRvVGFyZ2V0UGF0aElkcyhyb290UGF0aCksXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzSG9va0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vaG9va0FjdGlvbnNcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQge1xuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUsXG4gIEFjdGlvblRyYWNraW5nUmVzdWx0LFxuICBTaW1wbGVBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi9hY3Rpb25UcmFja2luZ01pZGRsZXdhcmVcIlxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciByZWFkb25seSBtaWRkbGV3YXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRvbmx5TWlkZGxld2FyZVJldHVybiB7XG4gIGFsbG93V3JpdGU8Uj4oZm46ICgpID0+IFIpOiBSXG5cbiAgZGlzcG9zZTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyXG59XG5cbi8qKlxuICogQXR0YWNoZXMgYW4gYWN0aW9uIG1pZGRsZXdhcmUgdGhhdCB3aWxsIHRocm93IHdoZW4gYW55IGFjdGlvbiBpcyBzdGFydGVkXG4gKiBvdmVyIHRoZSBub2RlIG9yIGFueSBvZiB0aGUgY2hpbGQgbm9kZXMsIHRodXMgZWZmZWN0aXZlbHkgbWFraW5nIHRoZSBzdWJ0cmVlXG4gKiByZWFkb25seS5cbiAqXG4gKiBJdCB3aWxsIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhIGBkaXNwb3NlYCBmdW5jdGlvbiB0byByZW1vdmUgdGhlIG1pZGRsZXdhcmUgYW5kIGEgYGFsbG93V3JpdGVgIGZ1bmN0aW9uXG4gKiB0aGF0IHdpbGwgYWxsb3cgYWN0aW9ucyB0byBiZSBzdGFydGVkIGluc2lkZSB0aGUgcHJvdmlkZWQgY29kZSBibG9jay5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIC8vIGdpdmVuIGEgbW9kZWwgaW5zdGFuY2UgbmFtZWQgdG9kb1xuICogY29uc3QgeyBkaXNwb3NlLCBhbGxvd1dyaXRlIH0gPSByZWFkb25seU1pZGRsZXdhcmUodG9kbylcbiAqXG4gKiAvLyB0aGlzIHdpbGwgdGhyb3dcbiAqIHRvZG8uc2V0RG9uZShmYWxzZSlcbiAqIGF3YWl0IHRvZG8uc2V0RG9uZUFzeW5jKGZhbHNlKVxuICpcbiAqIC8vIHRoaXMgd2lsbCB3b3JrXG4gKiBhbGxvd1dyaXRlKCgpID0+IHRvZG8uc2V0RG9uZShmYWxzZSkpXG4gKiAvLyBub3RlOiBmb3IgYXN5bmMgYWx3YXlzIHVzZSBvbmUgYWN0aW9uIGludm9jYXRpb24gcGVyIGFsbG93V3JpdGUhXG4gKiBhd2FpdCBhbGxvd1dyaXRlKCgpID0+IHRvZG8uc2V0RG9uZUFzeW5jKGZhbHNlKSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBtaWRkbGV3YXJlIGRpc3Bvc2VyIChgZGlzcG9zZWApIGFuZCBhIGBhbGxvd1dyaXRlYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5TWlkZGxld2FyZShzdWJ0cmVlUm9vdDogb2JqZWN0KTogUmVhZG9ubHlNaWRkbGV3YXJlUmV0dXJuIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdChzdWJ0cmVlUm9vdCwgXCJzdWJ0cmVlUm9vdFwiKVxuXG4gIGxldCB3cml0YWJsZSA9IGZhbHNlXG4gIGNvbnN0IHdyaXRhYmxlU3ltYm9sID0gU3ltYm9sKFwid3JpdGFibGVcIilcblxuICBjb25zdCBkaXNwb3NlciA9IGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShzdWJ0cmVlUm9vdCwge1xuICAgIGZpbHRlcihjdHgpIHtcbiAgICAgIC8vIHNraXAgaG9va3NcbiAgICAgIGlmIChpc0hvb2tBY3Rpb24oY3R4LmFjdGlvbk5hbWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBhcmUgaW5zaWRlIGFsbG93V3JpdGUgaXQgaXMgd3JpdGFibGVcbiAgICAgIGxldCBjdXJyZW50bHlXcml0YWJsZSA9IHdyaXRhYmxlXG5cbiAgICAgIGlmICghY3VycmVudGx5V3JpdGFibGUpIHtcbiAgICAgICAgLy8gaWYgYSBwYXJlbnQgY29udGV4dCB3YXMgd3JpdGFibGUgdGhlbiB0aGUgY2hpbGQgc2hvdWxkIGJlIGFzIHdlbGxcbiAgICAgICAgbGV0IGN1cnJlbnRDdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQgfCB1bmRlZmluZWQgPSBjdHhcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRDdHggJiYgIWN1cnJlbnRseVdyaXRhYmxlKSB7XG4gICAgICAgICAgY3VycmVudGx5V3JpdGFibGUgPSAhIWN1cnJlbnRDdHguZGF0YVt3cml0YWJsZVN5bWJvbF1cbiAgICAgICAgICBjdXJyZW50Q3R4ID0gY3VycmVudEN0eC5wYXJlbnRDb250ZXh0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRseVdyaXRhYmxlKSB7XG4gICAgICAgIGN0eC5kYXRhW3dyaXRhYmxlU3ltYm9sXSA9IHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICAvLyBpZiB3ZSBnZXQgaGVyZSAod2Fzbid0IGZpbHRlcmVkIG91dCkgaXQgaXMgbm90IHdyaXRhYmxlXG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93LFxuICAgICAgICB2YWx1ZTogZmFpbHVyZShgdHJpZWQgdG8gaW52b2tlIGFjdGlvbiAnJHtjdHguYWN0aW9uTmFtZX0nIG92ZXIgYSByZWFkb25seSBub2RlYCksXG4gICAgICB9XG4gICAgfSxcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGRpc3Bvc2U6IGRpc3Bvc2VyLFxuICAgIGFsbG93V3JpdGUoZm4pIHtcbiAgICAgIGNvbnN0IG9sZFdyaXRhYmxlID0gd3JpdGFibGVcbiAgICAgIHdyaXRhYmxlID0gdHJ1ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdyaXRhYmxlID0gb2xkV3JpdGFibGVcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi9QYXRjaFwiXG5cbmV4cG9ydCB0eXBlIEpzb25QYXRjaCA9XG4gIHwgSnNvblBhdGNoQWRkT3BlcmF0aW9uPGFueT5cbiAgfCBKc29uUGF0Y2hSZW1vdmVPcGVyYXRpb25cbiAgfCBKc29uUGF0Y2hSZXBsYWNlT3BlcmF0aW9uPGFueT5cblxuZXhwb3J0IGludGVyZmFjZSBKc29uUGF0Y2hCYXNlT3BlcmF0aW9uIHtcbiAgcGF0aDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGNoQWRkT3BlcmF0aW9uPFQ+IGV4dGVuZHMgSnNvblBhdGNoQmFzZU9wZXJhdGlvbiB7XG4gIG9wOiBcImFkZFwiXG4gIHZhbHVlOiBUXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGNoUmVtb3ZlT3BlcmF0aW9uIGV4dGVuZHMgSnNvblBhdGNoQmFzZU9wZXJhdGlvbiB7XG4gIG9wOiBcInJlbW92ZVwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhdGNoUmVwbGFjZU9wZXJhdGlvbjxUPiBleHRlbmRzIEpzb25QYXRjaEJhc2VPcGVyYXRpb24ge1xuICBvcDogXCJyZXBsYWNlXCJcbiAgdmFsdWU6IFRcbn1cblxuLyoqXG4gKiBFc2NhcGVzIGEganNvbiBwb2ludGVyIHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHJhdyBwb2ludGVyXG4gKiBAcmV0dXJuIHRoZSBFc2NhcGVkIHBhdGhcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUGF0aENvbXBvbmVudChwYXRoOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gXCJcIiArIHBhdGhcbiAgfVxuICBpZiAocGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gLTEgJiYgcGF0aC5pbmRleE9mKFwiflwiKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL34vZywgXCJ+MFwiKS5yZXBsYWNlKC9cXC8vZywgXCJ+MVwiKVxufVxuXG4vKipcbiAqIFVuZXNjYXBlcyBhIGpzb24gcG9pbnRlciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBlc2NhcGVkIHBvaW50ZXJcbiAqIEByZXR1cm4gVGhlIHVuZXNjYXBlZCBwYXRoXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlUGF0aENvbXBvbmVudChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9+MS9nLCBcIi9cIikucmVwbGFjZSgvfjAvZywgXCJ+XCIpXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBwYXRoIGludG8gYSBKU09OIHBvaW50ZXIuXG4gKlxuICogQHBhcmFtIHBhdGggUGF0aCB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQ29udmVydGVkIEpTT04gcG9pbnRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhUb0pzb25Qb2ludGVyKHBhdGg6IFBhdGgpOiBzdHJpbmcge1xuICBpZiAocGF0aC5sZW5ndGggPD0gMCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cbiAgcmV0dXJuIFwiL1wiICsgcGF0aC5tYXAoZXNjYXBlUGF0aENvbXBvbmVudCkuam9pbihcIi9cIilcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIEpTT04gcG9pbnRlciBpbnRvIGEgcGF0aC5cbiAqXG4gKiBAcGFyYW0ganNvblBvaW50ZXIgSlNPTiBwb2ludGVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBDb252ZXJ0ZWQgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25Qb2ludGVyVG9QYXRoKGpzb25Qb2ludGVyOiBzdHJpbmcpOiBQYXRoIHtcbiAgaWYgKGpzb25Qb2ludGVyID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgaWYgKCFqc29uUG9pbnRlci5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJhIEpTT04gcG9pbnRlciBtdXN0IHN0YXJ0IHdpdGggJy8nIG9yIGJlIGVtcHR5XCIpXG4gIH1cbiAganNvblBvaW50ZXIgPSBqc29uUG9pbnRlci5zbGljZSgxKVxuICByZXR1cm4ganNvblBvaW50ZXIuc3BsaXQoXCIvXCIpLm1hcCh1bmVzY2FwZVBhdGhDb21wb25lbnQpXG59XG5cbi8qKlxuICogQ29udmVydCBhIHBhdGNoIGludG8gYSBKU09OIHBhdGNoLlxuICpcbiAqIEBwYXJhbSBwYXRjaCBBIHBhdGNoLlxuICogQHJldHVybnMgQSBKU09OIHBhdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hUb0pzb25QYXRjaChwYXRjaDogUGF0Y2gpOiBKc29uUGF0Y2gge1xuICByZXR1cm4ge1xuICAgIC4uLnBhdGNoLFxuICAgIHBhdGg6IHBhdGhUb0pzb25Qb2ludGVyKHBhdGNoLnBhdGgpLFxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHBhdGNoIGludG8gYSBwYXRjaC5cbiAqXG4gKiBAcGFyYW0ganNvblBhdGNoIEEgSlNPTiBwYXRjaC5cbiAqIEByZXR1cm5zIEEgcGF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUGF0Y2hUb1BhdGNoKGpzb25QYXRjaDogSnNvblBhdGNoKTogUGF0Y2gge1xuICByZXR1cm4ge1xuICAgIC4uLmpzb25QYXRjaCxcbiAgICBwYXRoOiBqc29uUG9pbnRlclRvUGF0aChqc29uUGF0Y2gucGF0aCksXG4gIH1cbn1cbiIsImltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBhc3NlcnRUd2Vha2VkT2JqZWN0IH0gZnJvbSBcIi4uL3R3ZWFrZXIvY29yZVwiXG5pbXBvcnQgeyBvbkdsb2JhbFBhdGNoZXMsIG9uUGF0Y2hlcywgT25QYXRjaGVzRGlzcG9zZXIsIE9uUGF0Y2hlc0xpc3RlbmVyIH0gZnJvbSBcIi4vZW1pdFBhdGNoXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi9QYXRjaFwiXG5cbi8qKlxuICogUGF0Y2ggcmVjb3JkZXIgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hSZWNvcmRlckV2ZW50IHtcbiAgLyoqXG4gICAqIFRhcmdldCBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ6IG9iamVjdFxuICAvKipcbiAgICogUmVjb3JkZWQgcGF0Y2hlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoZXM6IFBhdGNoW11cbiAgLyoqXG4gICAqIFJlY29yZGVkIGludmVyc2UgcGF0Y2hlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludmVyc2VQYXRjaGVzOiBQYXRjaFtdXG59XG5cbi8qKlxuICogUGF0Y2ggcmVjb3JkZXIgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoUmVjb3JkZXIge1xuICAvKipcbiAgICogR2V0cy9zZXRzIGlmIHRoZSBwYXRjaCByZWNvcmRlciBpcyBjdXJyZW50bHkgcmVjb3JkaW5nLlxuICAgKi9cbiAgcmVjb3JkaW5nOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgYXJyYXkgb2YgcGF0Y2hpbmcgZXZlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzOiBQYXRjaFJlY29yZGVyRXZlbnRbXVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHRoZSBwYXRjaCByZWNvcmRlci5cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZFxufVxuXG4vKipcbiAqIFBhdGNoIHJlY29yZGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hSZWNvcmRlck9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdGhlIHBhdGNoIHJlY29yZGVyIGlzIGluaXRpYWxseSByZWNvcmRpbmcgd2hlbiBjcmVhdGVkLlxuICAgKi9cbiAgcmVjb3JkaW5nPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBjYWxsYmFjayBmaWx0ZXIgdG8gc2VsZWN0IHdpY2ggcGF0Y2hlcyB0byByZWNvcmQvc2tpcC5cbiAgICogSXQgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIGV2ZW50IGlzIGFkZGVkIHRvIHRoZSBldmVudHMgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGNoZXMgUGF0Y2hlcyBhYm91dCB0byBiZSByZWNvcmRlZC5cbiAgICogQHBhcmFtIGludmVyc2VQYXRjaGVzIEludmVyc2UgcGF0Y2hlcyBhYm91dCB0byBiZSByZWNvcmRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHRvIHJlY29yZCB0aGUgcGF0Y2gsIGBmYWxzZWAgdG8gc2tpcCBpdC5cbiAgICovXG4gIGZpbHRlcj8ocGF0Y2hlczogUGF0Y2hbXSwgaW52ZXJzZVBhdGNoZXM6IFBhdGNoW10pOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHJ1biBvbmNlIGEgcGF0Y2ggaXMgcmVjb3JkZWQuXG4gICAqIEl0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGV2ZW50IGlzIGFkZGVkIHRvIHRoZSBldmVudHMgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGNoZXMgUGF0Y2hlcyBqdXN0IHJlY29yZGVkLlxuICAgKiBAcGFyYW0gaW52ZXJzZVBhdGNoZXMgSW52ZXJzZSBwYXRjaGVzIGp1c3QgcmVjb3JkZWQuXG4gICAqL1xuICBvblBhdGNoZXM/OiBPblBhdGNoZXNMaXN0ZW5lclxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwYXRjaCByZWNvcmRlci5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3RcbiAqIEBwYXJhbSBbb3B0c11cbiAqIEByZXR1cm5zIFRoZSBwYXRjaCByZWNvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoUmVjb3JkZXIoc3VidHJlZVJvb3Q6IG9iamVjdCwgb3B0cz86IFBhdGNoUmVjb3JkZXJPcHRpb25zKTogUGF0Y2hSZWNvcmRlciB7XG4gIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICByZXR1cm4gaW50ZXJuYWxQYXRjaFJlY29yZGVyKHN1YnRyZWVSb290LCBvcHRzKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIENyZWF0ZXMgYSBnbG9iYWwgb3IgbG9jYWwgcGF0Y2ggcmVjb3JkZXIuXG4gKlxuICogQHBhcmFtIHN1YnRyZWVSb290XG4gKiBAcGFyYW0gW29wdHNdXG4gKiBAcmV0dXJucyBUaGUgcGF0Y2ggcmVjb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbFBhdGNoUmVjb3JkZXIoXG4gIHN1YnRyZWVSb290OiBvYmplY3QgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBQYXRjaFJlY29yZGVyT3B0aW9uc1xuKTogUGF0Y2hSZWNvcmRlciB7XG4gIGxldCB7IHJlY29yZGluZywgZmlsdGVyIH0gPSB7XG4gICAgcmVjb3JkaW5nOiB0cnVlLFxuICAgIGZpbHRlcjogYWx3YXlzQWNjZXB0RmlsdGVyLFxuICAgIC4uLm9wdHMsXG4gIH1cblxuICBjb25zdCBldmVudHMgPSBvYnNlcnZhYmxlLmFycmF5PFBhdGNoUmVjb3JkZXJFdmVudD4oW10sIHtcbiAgICBkZWVwOiBmYWxzZSxcbiAgfSlcblxuICBsZXQgb25QYXRjaGVzRGlzcG9zZXI6IE9uUGF0Y2hlc0Rpc3Bvc2VyXG5cbiAgaWYgKHN1YnRyZWVSb290KSB7XG4gICAgb25QYXRjaGVzRGlzcG9zZXIgPSBvblBhdGNoZXMoc3VidHJlZVJvb3QsIChwLCBpbnZQKSA9PiB7XG4gICAgICBpZiAocmVjb3JkaW5nICYmIGZpbHRlcihwLCBpbnZQKSkge1xuICAgICAgICBldmVudHMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBzdWJ0cmVlUm9vdCxcbiAgICAgICAgICBwYXRjaGVzOiBwLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzOiBpbnZQLFxuICAgICAgICB9KVxuICAgICAgICBvcHRzPy5vblBhdGNoZXM/LihwLCBpbnZQKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgb25QYXRjaGVzRGlzcG9zZXIgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcCwgaW52UCkgPT4ge1xuICAgICAgaWYgKHJlY29yZGluZyAmJiBmaWx0ZXIocCwgaW52UCkpIHtcbiAgICAgICAgZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwYXRjaGVzOiBwLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzOiBpbnZQLFxuICAgICAgICB9KVxuICAgICAgICBvcHRzPy5vblBhdGNoZXM/LihwLCBpbnZQKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldCByZWNvcmRpbmcoKSB7XG4gICAgICByZXR1cm4gcmVjb3JkaW5nXG4gICAgfSxcbiAgICBzZXQgcmVjb3JkaW5nKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHJlY29yZGluZyA9IGVuYWJsZWRcbiAgICB9LFxuICAgIGdldCBldmVudHMoKSB7XG4gICAgICByZXR1cm4gZXZlbnRzXG4gICAgfSxcbiAgICBkaXNwb3NlKCkge1xuICAgICAgb25QYXRjaGVzRGlzcG9zZXIoKVxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgYWx3YXlzQWNjZXB0RmlsdGVyID0gKCkgPT4gdHJ1ZVxuIiwiaW1wb3J0IHR5cGUgeyBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgYXNzZXJ0SXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBjaGVja01vZGVsRGVjb3JhdG9yQXJncyB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9jaGVja01vZGVsRGVjb3JhdG9yQXJnc1wiXG5pbXBvcnQgeyBhZGRNb2RlbENsYXNzSW5pdGlhbGl6ZXIgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxDbGFzc0luaXRpYWxpemVyXCJcbmltcG9ydCB7IGFwcGx5UGF0Y2hlcyB9IGZyb20gXCIuLi9wYXRjaFwiXG5pbXBvcnQgeyBpbnRlcm5hbFBhdGNoUmVjb3JkZXIsIFBhdGNoUmVjb3JkZXIgfSBmcm9tIFwiLi4vcGF0Y2gvcGF0Y2hSZWNvcmRlclwiXG5pbXBvcnQgeyBhc3NlcnRJc09iamVjdCwgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQge1xuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUsXG4gIEFjdGlvblRyYWNraW5nUmVzdWx0LFxuICBTaW1wbGVBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi9hY3Rpb25UcmFja2luZ01pZGRsZXdhcmVcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmFuc2FjdGlvbiBtaWRkbGV3YXJlLCB3aGljaCByZXZlcnRzIGNoYW5nZXMgbWFkZSBieSBhbiBhY3Rpb24gLyBjaGlsZFxuICogYWN0aW9ucyB3aGVuIHRoZSByb290IGFjdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGJ5IGFwcGx5aW5nIGludmVyc2UgcGF0Y2hlcy5cbiAqXG4gKiBAdHlwZXBhcmFtIE0gTW9kZWxcbiAqIEBwYXJhbSB0YXJnZXQgT2JqZWN0IHdpdGggdGhlIHJvb3QgdGFyZ2V0IG1vZGVsIG9iamVjdCAoYG1vZGVsYCkgYW5kIHJvb3QgYWN0aW9uIG5hbWUgKGBhY3Rpb25OYW1lYCkuXG4gKiBAcmV0dXJucyBUaGUgbWlkZGxld2FyZSBkaXNwb3Nlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uTWlkZGxld2FyZTxNIGV4dGVuZHMgQW55TW9kZWw+KHRhcmdldDoge1xuICBtb2RlbDogTVxuICBhY3Rpb25OYW1lOiBrZXlvZiBNXG59KTogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyIHtcbiAgYXNzZXJ0SXNPYmplY3QodGFyZ2V0LCBcInRhcmdldFwiKVxuXG4gIGNvbnN0IHsgbW9kZWwsIGFjdGlvbk5hbWUgfSA9IHRhcmdldFxuXG4gIGFzc2VydElzTW9kZWwobW9kZWwsIFwidGFyZ2V0Lm1vZGVsXCIpXG5cbiAgaWYgKHR5cGVvZiBhY3Rpb25OYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcInRhcmdldC5hY3Rpb25OYW1lIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgfVxuXG4gIGNvbnN0IHBhdGNoUmVjb3JkZXJTeW1ib2wgPSBTeW1ib2woXCJwYXRjaFJlY29yZGVyXCIpXG4gIGZ1bmN0aW9uIGluaXRQYXRjaFJlY29yZGVyKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCkge1xuICAgIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdID0gaW50ZXJuYWxQYXRjaFJlY29yZGVyKHVuZGVmaW5lZCwge1xuICAgICAgcmVjb3JkaW5nOiBmYWxzZSxcbiAgICB9KVxuICB9XG4gIGZ1bmN0aW9uIGdldFBhdGNoUmVjb3JkZXIoY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0KTogUGF0Y2hSZWNvcmRlciB7XG4gICAgcmV0dXJuIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdXG4gIH1cblxuICByZXR1cm4gYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlKG1vZGVsLCB7XG4gICAgZmlsdGVyKGN0eCkge1xuICAgICAgLy8gdGhlIHByaW1hcnkgYWN0aW9uIG11c3QgYmUgb24gdGhlIHJvb3Qgb2JqZWN0XG4gICAgICBjb25zdCByb290Q29udGV4dCA9IGN0eC5yb290Q29udGV4dFxuICAgICAgcmV0dXJuIHJvb3RDb250ZXh0LnRhcmdldCA9PT0gbW9kZWwgJiYgcm9vdENvbnRleHQuYWN0aW9uTmFtZSA9PT0gYWN0aW9uTmFtZVxuICAgIH0sXG4gICAgb25TdGFydChjdHgpIHtcbiAgICAgIGlmIChjdHggPT09IGN0eC5yb290Q29udGV4dCkge1xuICAgICAgICBpbml0UGF0Y2hSZWNvcmRlcihjdHgpXG4gICAgICB9XG4gICAgfSxcbiAgICBvblJlc3VtZShjdHgpIHtcbiAgICAgIGdldFBhdGNoUmVjb3JkZXIoY3R4KS5yZWNvcmRpbmcgPSB0cnVlXG4gICAgfSxcbiAgICBvblN1c3BlbmQoY3R4KSB7XG4gICAgICBnZXRQYXRjaFJlY29yZGVyKGN0eCkucmVjb3JkaW5nID0gZmFsc2VcbiAgICB9LFxuICAgIG9uRmluaXNoKGN0eCwgcmV0KSB7XG4gICAgICBpZiAoY3R4ID09PSBjdHgucm9vdENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcGF0Y2hSZWNvcmRlciA9IGdldFBhdGNoUmVjb3JkZXIoY3R4KVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHJldC5yZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93KSB7XG4gICAgICAgICAgICAvLyB1bmRvIGNoYW5nZXMgKGJhY2t3YXJkcyBmb3IgaW52ZXJzZSBwYXRjaGVzKVxuICAgICAgICAgICAgY29uc3QgeyBldmVudHMgfSA9IHBhdGNoUmVjb3JkZXJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBldmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaV1cbiAgICAgICAgICAgICAgYXBwbHlQYXRjaGVzKGV2ZW50LnRhcmdldCwgZXZlbnQuaW52ZXJzZVBhdGNoZXMsIHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHBhdGNoUmVjb3JkZXIuZGlzcG9zZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9KVxufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uIG1pZGRsZXdhcmUgYXMgYSBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHByb3BlcnR5S2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQge1xuICBjaGVja01vZGVsRGVjb3JhdG9yQXJncyhcInRyYW5zYWN0aW9uXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpXG5cbiAgYWRkTW9kZWxDbGFzc0luaXRpYWxpemVyKHRhcmdldC5jb25zdHJ1Y3RvciwgKG1vZGVsSW5zdGFuY2UpID0+IHtcbiAgICB0cmFuc2FjdGlvbk1pZGRsZXdhcmUoe1xuICAgICAgbW9kZWw6IG1vZGVsSW5zdGFuY2UgYXMgQW55TW9kZWwsXG4gICAgICBhY3Rpb25OYW1lOiBwcm9wZXJ0eUtleSBhcyBhbnksXG4gICAgfSlcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHsgTyB9IGZyb20gXCJ0cy10b29sYmVsdFwiXHJcbmltcG9ydCB7IEZyb3plbiB9IGZyb20gXCIuLi8uLi9mcm96ZW4vRnJvemVuXCJcclxuaW1wb3J0IHsgYXNzZXJ0SXNGdW5jdGlvbiwgYXNzZXJ0SXNPYmplY3QsIGlzT2JqZWN0LCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcclxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxyXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUge1xyXG4gIEFueVN0YW5kYXJkVHlwZSxcclxuICBBbnlUeXBlLFxyXG4gIE1vZGVsVHlwZSxcclxuICBPYmplY3RUeXBlRnVuY3Rpb24sXHJcbiAgVHlwZVRvRGF0YSxcclxufSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7XHJcbiAgbGF0ZVR5cGVDaGVja2VyLFxyXG4gIExhdGVUeXBlQ2hlY2tlcixcclxuICBUeXBlQ2hlY2tlcixcclxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxyXG4gIFR5cGVJbmZvLFxyXG4gIFR5cGVJbmZvR2VuLFxyXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcclxuXHJcbmZ1bmN0aW9uIHR5cGVzT2JqZWN0SGVscGVyPFM+KG9iakZuOiBTLCBmcm96ZW46IGJvb2xlYW4sIHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbik6IFMge1xyXG4gIGFzc2VydElzRnVuY3Rpb24ob2JqRm4sIFwib2JqRm5cIilcclxuXHJcbiAgcmV0dXJuIGxhdGVUeXBlQ2hlY2tlcigoKSA9PiB7XHJcbiAgICBjb25zdCBvYmplY3RTY2hlbWE6IHtcclxuICAgICAgW2s6IHN0cmluZ106IFR5cGVDaGVja2VyIHwgTGF0ZVR5cGVDaGVja2VyXHJcbiAgICB9ID0gKG9iakZuIGFzIGFueSkoKVxyXG4gICAgYXNzZXJ0SXNPYmplY3Qob2JqZWN0U2NoZW1hLCBcIm9iamVjdFNjaGVtYVwiKVxyXG5cclxuICAgIGNvbnN0IHNjaGVtYUVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmplY3RTY2hlbWEpXHJcblxyXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb3BzTXNnOiBzdHJpbmdbXSA9IFtdXHJcbiAgICAgIGZvciAoY29uc3QgW2ssIHVucmVzb2x2ZWRUY10gb2Ygc2NoZW1hRW50cmllcykge1xyXG4gICAgICAgIGNvbnN0IHRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKHVucmVzb2x2ZWRUYylcclxuICAgICAgICBsZXQgcHJvcFR5cGVuYW1lID0gXCIuLi5cIlxyXG4gICAgICAgIGlmICghcmVjdXJzaXZlVHlwZUNoZWNrZXJzLmluY2x1ZGVzKHRjKSkge1xyXG4gICAgICAgICAgcHJvcFR5cGVuYW1lID0gdGMuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB0YylcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvcHNNc2cucHVzaChgJHtrfTogJHtwcm9wVHlwZW5hbWV9O2ApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBgeyAke3Byb3BzTXNnLmpvaW4oXCIgXCIpfSB9YFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwcGx5U25hcHNob3RQcm9jZXNzb3IgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbW9kZTogXCJmcm9tXCIgfCBcInRvXCIpID0+IHtcclxuICAgICAgY29uc3QgbmV3T2JqOiB0eXBlb2Ygb2JqID0ge31cclxuXHJcbiAgICAgIC8vIG5vdGU6IHdlIGFsbG93IGV4Y2VzcyBwcm9wZXJ0aWVzIHdoZW4gY2hlY2tpbmcgb2JqZWN0c1xyXG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBrID0ga2V5c1tpXVxyXG4gICAgICAgIGNvbnN0IHVucmVzb2x2ZWRUYyA9IG9iamVjdFNjaGVtYVtrXVxyXG4gICAgICAgIGlmICh1bnJlc29sdmVkVGMpIHtcclxuICAgICAgICAgIGNvbnN0IHRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKHVucmVzb2x2ZWRUYylcclxuICAgICAgICAgIG5ld09ialtrXSA9XHJcbiAgICAgICAgICAgIG1vZGUgPT09IFwiZnJvbVwiID8gdGMuZnJvbVNuYXBzaG90UHJvY2Vzc29yKG9ialtrXSkgOiB0Yy50b1NuYXBzaG90UHJvY2Vzc29yKG9ialtrXSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdW5rbm93biBwcm9wLCBjb3B5IGFzIGlzXHJcbiAgICAgICAgICBuZXdPYmpba10gPSBvYmpba11cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXdPYmpcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcclxuXHJcbiAgICAgIChvYmosIHBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikgfHwgKGZyb3plbiAmJiAhKG9iaiBpbnN0YW5jZW9mIEZyb3plbikpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIG9iailcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG5vdGU6IHdlIGFsbG93IGV4Y2VzcyBwcm9wZXJ0aWVzIHdoZW4gY2hlY2tpbmcgb2JqZWN0c1xyXG4gICAgICAgIGZvciAoY29uc3QgW2ssIHVucmVzb2x2ZWRUY10gb2Ygc2NoZW1hRW50cmllcykge1xyXG4gICAgICAgICAgY29uc3QgdGMgPSByZXNvbHZlVHlwZUNoZWNrZXIodW5yZXNvbHZlZFRjKVxyXG4gICAgICAgICAgY29uc3Qgb2JqVmFsID0gb2JqW2tdXHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWVFcnJvciA9IHRjLmNoZWNrKG9ialZhbCwgWy4uLnBhdGgsIGtdKVxyXG4gICAgICAgICAgaWYgKHZhbHVlRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXJyb3JcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBnZXRUeXBlTmFtZSxcclxuICAgICAgdHlwZUluZm9HZW4sXHJcblxyXG4gICAgICAob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbm90ZTogd2UgYWxsb3cgZXhjZXNzIHByb3BlcnRpZXMgd2hlbiBjaGVja2luZyBvYmplY3RzXHJcbiAgICAgICAgZm9yIChjb25zdCBbaywgdW5yZXNvbHZlZFRjXSBvZiBzY2hlbWFFbnRyaWVzKSB7XHJcbiAgICAgICAgICBjb25zdCB0YyA9IHJlc29sdmVUeXBlQ2hlY2tlcih1bnJlc29sdmVkVGMpXHJcbiAgICAgICAgICBjb25zdCBvYmpWYWwgPSBvYmpba11cclxuXHJcbiAgICAgICAgICBjb25zdCB2YWx1ZUFjdHVhbENoZWNrZXIgPSB0Yy5zbmFwc2hvdFR5cGUob2JqVmFsKVxyXG4gICAgICAgICAgaWYgKCF2YWx1ZUFjdHVhbENoZWNrZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzVGNcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFwcGx5U25hcHNob3RQcm9jZXNzb3Iob2JqLCBcImZyb21cIilcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFwcGx5U25hcHNob3RQcm9jZXNzb3Iob2JqLCBcInRvXCIpXHJcbiAgICAgIH1cclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gdGhpc1RjXHJcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxyXG59XHJcblxyXG4vKipcclxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIHBsYWluIG9iamVjdC5cclxuICogTm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBvYmplY3QuIFRoaXMgaXMgZG9uZSBzbyBvYmplY3RzIGNhbiBzdXBwb3J0IHNlbGYgLyBjcm9zcyB0eXBlcy5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogLy8gbm90aWNlIHRoZSAoeyAuLi4gfSksIG5vdCBqdXN0IHsgLi4uIH1cclxuICogY29uc3QgcG9pbnRUeXBlID0gdHlwZXMub2JqZWN0KCgpID0+ICh7XHJcbiAqICAgeDogdHlwZXMubnVtYmVyLFxyXG4gKiAgIHk6IHR5cGVzLm51bWJlclxyXG4gKiB9KSlcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBUeXBlLlxyXG4gKiBAcGFyYW0gb2JqZWN0RnVuY3Rpb24gRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgYW4gb2JqZWN0IHdpdGggdHlwZXMuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPYmplY3Q8VD4ob2JqZWN0RnVuY3Rpb246IFQpOiBUIHtcclxuICAvLyB3ZSBjYW4ndCB0eXBlIHRoaXMgZnVuY3Rpb24gb3IgZWxzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIG1ha2UgaXQgd29yayByZWN1cnNpdmVseVxyXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgT2JqZWN0VHlwZUluZm8odCwgb2JqZWN0RnVuY3Rpb24gYXMgYW55KVxyXG5cclxuICByZXR1cm4gdHlwZXNPYmplY3RIZWxwZXIob2JqZWN0RnVuY3Rpb24sIGZhbHNlLCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMub2JqZWN0YCB0eXBlIGluZm8gZm9yIGFuIG9iamVjdCBwcm9wcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0VHlwZUluZm9Qcm9wcyB7XHJcbiAgcmVhZG9ubHkgW3Byb3BOYW1lOiBzdHJpbmddOiBSZWFkb25seTx7XHJcbiAgICB0eXBlOiBBbnlTdGFuZGFyZFR5cGVcclxuICAgIHR5cGVJbmZvOiBUeXBlSW5mb1xyXG4gIH0+XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMub2JqZWN0YCB0eXBlIGluZm8uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgT2JqZWN0VHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XHJcbiAgLy8gbWVtb2l6ZSB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG9iamVjdFxyXG4gIHByaXZhdGUgX3Byb3BzID0gbGF6eSgoKSA9PiB7XHJcbiAgICBjb25zdCBvYmpTY2hlbWEgPSB0aGlzLl9vYmpUeXBlRm4oKVxyXG5cclxuICAgIGNvbnN0IHByb3BUeXBlczogTy5Xcml0YWJsZTxPYmplY3RUeXBlSW5mb1Byb3BzPiA9IHt9XHJcbiAgICBPYmplY3Qua2V5cyhvYmpTY2hlbWEpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IHR5cGUgPSByZXNvbHZlU3RhbmRhcmRUeXBlKG9ialNjaGVtYVtwcm9wTmFtZV0pXHJcbiAgICAgIHByb3BUeXBlc1twcm9wTmFtZV0gPSB7IHR5cGUsIHR5cGVJbmZvOiBnZXRUeXBlSW5mbyh0eXBlKSB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHByb3BUeXBlc1xyXG4gIH0pXHJcblxyXG4gIGdldCBwcm9wcygpOiBPYmplY3RUeXBlSW5mb1Byb3BzIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wcygpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLCBwcml2YXRlIF9vYmpUeXBlRm46IE9iamVjdFR5cGVGdW5jdGlvbikge1xyXG4gICAgc3VwZXIodGhpc1R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBmcm96ZW4gZGF0YS5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3QgZnJvemVuTnVtYmVyVHlwZSA9IHR5cGVzLmZyb3plbih0eXBlcy5udW1iZXIpXHJcbiAqIGNvbnN0IGZyb3plbkFueVR5cGUgPSB0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPGFueT4oKSlcclxuICogY29uc3QgZnJvemVuTnVtYmVyQXJyYXlUeXBlID0gdHlwZXMuZnJvemVuKHR5cGVzLmFycmF5KHR5cGVzLm51bWJlcikpXHJcbiAqIGNvbnN0IGZyb3plblVuY2hlY2tlZE51bWJlckFycmF5VHlwZSA9IHR5cGVzLmZyb3plbih0eXBlcy51bmNoZWNrZWQ8bnVtYmVyW10+KCkpXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cclxuICogQHBhcmFtIGRhdGFUeXBlIFR5cGUgb2YgdGhlIGZyb3plbiBkYXRhLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzRnJvemVuPFQgZXh0ZW5kcyBBbnlUeXBlPihkYXRhVHlwZTogVCk6IE1vZGVsVHlwZTxGcm96ZW48VHlwZVRvRGF0YTxUPj4+IHtcclxuICByZXR1cm4gdHlwZXNPYmplY3RIZWxwZXIoXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBkYXRhOiBkYXRhVHlwZSxcclxuICAgIH0pLFxyXG4gICAgdHJ1ZSxcclxuICAgICh0KSA9PiBuZXcgRnJvemVuVHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZShkYXRhVHlwZSkpXHJcbiAgKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy5mcm96ZW5gIHR5cGUgaW5mby5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBGcm96ZW5UeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcclxuICBnZXQgZGF0YVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcclxuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLmRhdGFUeXBlKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgZGF0YVR5cGU6IEFueVN0YW5kYXJkVHlwZSkge1xyXG4gICAgc3VwZXIodGhpc1R5cGUpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IGlkZW50aXR5Rm4gfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxyXG5pbXBvcnQgdHlwZSB7IElkZW50aXR5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcclxuaW1wb3J0IHsgVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyQmFzZVR5cGUsIFR5cGVJbmZvIH0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcclxuXHJcbmNvbnN0IHVuY2hlY2tlZDogSWRlbnRpdHlUeXBlPGFueT4gPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZS5BbnksXHJcbiAgbnVsbCxcclxuICAoKSA9PiBcImFueVwiLFxyXG4gICh0KSA9PiBuZXcgVW5jaGVja2VkVHlwZUluZm8odCksXHJcblxyXG4gICgpID0+IHVuY2hlY2tlZCBhcyBhbnksXHJcblxyXG4gIGlkZW50aXR5Rm4sXHJcbiAgaWRlbnRpdHlGblxyXG4pIGFzIGFueVxyXG5cclxuLyoqXHJcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBnaXZlbiB2YWx1ZSB0aGF0IHdvbid0IGJlIHR5cGUgY2hlY2tlZC5cclxuICogVGhpcyBpcyBiYXNpY2FsbHkgYSB3YXkgdG8gYmFpbCBvdXQgb2YgdGhlIHJ1bnRpbWUgdHlwZSBjaGVja2luZyBzeXN0ZW0uXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IHVuY2hlY2tlZFNvbWVNb2RlbCA9IHR5cGVzLnVuY2hlY2tlZDxTb21lTW9kZWw+KClcclxuICogY29uc3QgYW55VHlwZSA9IHR5cGVzLnVuY2hlY2tlZDxhbnk+KClcclxuICogY29uc3QgY3VzdG9tVW5jaGVja2VkVHlwZSA9IHR5cGVzLnVuY2hlY2tlZDwoQSAmIEIpIHwgQz4oKVxyXG4gKiBgYGBcclxuICpcclxuICogQHR5cGVwYXJhbSBUIFR5cGUgb2YgdGhlIHZhbHVlLCBvciB1bmtvd24gaWYgbm90IGdpdmVuLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzVW5jaGVja2VkPFQgPSBuZXZlcj4oKTogSWRlbnRpdHlUeXBlPFQ+IHtcclxuICByZXR1cm4gdW5jaGVja2VkXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMudW5jaGVja2VkYCB0eXBlIGluZm8uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVW5jaGVja2VkVHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7fVxyXG4iLCJpbXBvcnQgeyBmYWlsdXJlLCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7XG4gIHJlc29sdmVTdGFuZGFyZFR5cGUsXG4gIHJlc29sdmVTdGFuZGFyZFR5cGVOb1Rocm93LFxuICByZXNvbHZlVHlwZUNoZWNrZXIsXG59IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBnZXRUeXBlQ2hlY2tlckJhc2VUeXBlRnJvbVZhbHVlLFxuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuL3R5cGVzVW5jaGVja2VkXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSB1bmlvbiBvZiBzZXZlcmFsIG90aGVyIHR5cGVzIChhIHwgYiB8IGMgfCAuLi4pLlxuICogQWNjZXB0cyBhIGRpc3BhdGNoZXIgdGhhdCwgZ2l2ZW4gYSBzbmFwc2hvdCwgcmV0dXJucyB0aGUgdHlwZVxuICogdGhhdCBzbmFwc2hvdCBpcy5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cbiAqIEBwYXJhbSBkaXNwYXRjaGVyIEZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYSBzbmFwc2hvdCByZXR1cm5zIHRoZSB0eXBlLlxuICogQHBhcmFtIG9yVHlwZXMgUG9zc2libGUgdHlwZXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPcjxUIGV4dGVuZHMgQW55VHlwZVtdPihcbiAgZGlzcGF0Y2hlcjogKHNuOiBhbnkpID0+IFRbbnVtYmVyXSxcbiAgLi4ub3JUeXBlczogVFxuKTogVFtudW1iZXJdXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pb24gb2Ygc2V2ZXJhbCBvdGhlciB0eXBlcyAoYSB8IGIgfCBjIHwgLi4uKS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IGJvb2xlYW5Pck51bWJlclR5cGUgPSB0eXBlcy5vcih0eXBlcy5ib29sZWFuLCB0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVHlwZS5cbiAqIEBwYXJhbSBvclR5cGVzIFBvc3NpYmxlIHR5cGVzLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzT3I8VCBleHRlbmRzIEFueVR5cGVbXT4oLi4ub3JUeXBlczogVCk6IFRbbnVtYmVyXVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNPcihcbiAgZGlzcGF0Y2hlck9yVHlwZTogKChzbjogYW55KSA9PiBBbnlUeXBlKSB8IEFueVR5cGUsXG4gIC4uLm1vcmVPclR5cGVzOiBBbnlUeXBlW11cbik6IEFueVR5cGUge1xuICBjb25zdCBvclR5cGVzID0gbW9yZU9yVHlwZXMuc2xpY2UoKVxuICBsZXQgZmluYWxEaXNwYXRjaGVyOiAoKHNuOiBhbnkpID0+IFR5cGVDaGVja2VyKSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGZpcnN0VHlwZUNoZWNrZXIgPSByZXNvbHZlU3RhbmRhcmRUeXBlTm9UaHJvdyhkaXNwYXRjaGVyT3JUeXBlIGFzIEFueVR5cGUpXG5cbiAgaWYgKGZpcnN0VHlwZUNoZWNrZXIpIHtcbiAgICBvclR5cGVzLnVuc2hpZnQoZmlyc3RUeXBlQ2hlY2tlcilcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlck9yVHlwZSBhcyAoc246IGFueSkgPT4gQW55VHlwZVxuICAgIGZpbmFsRGlzcGF0Y2hlciA9IChzbjogYW55KSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZGlzcGF0Y2hlcihzbilcbiAgICAgIGNvbnN0IHR5cGVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKHR5cGUpXG4gICAgICByZXR1cm4gdHlwZUNoZWNrZXJcbiAgICB9XG4gIH1cblxuICBpZiAob3JUeXBlcy5sZW5ndGggPD0gMCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJvciB0eXBlIG11c3QgaGF2ZSBhdCBsZWFzdCAxIHBvc3NpYmxlIHR5cGVcIilcbiAgfVxuXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PiBuZXcgT3JUeXBlSW5mbyh0LCBvclR5cGVzLm1hcChyZXNvbHZlU3RhbmRhcmRUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBjaGVja2VycyA9IG9yVHlwZXMubWFwKHJlc29sdmVUeXBlQ2hlY2tlcilcblxuICAgIC8vIGlmIHRoZSBvciBpbmNsdWRlcyB1bmNoZWNrZWQgdGhlbiBpdCBpcyB1bmNoZWNrZWRcbiAgICBpZiAoY2hlY2tlcnMuc29tZSgodGMpID0+IHRjLnVuY2hlY2tlZCkpIHtcbiAgICAgIHJldHVybiB0eXBlc1VuY2hlY2tlZCgpIGFzIGFueVxuICAgIH1cblxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZU5hbWVzID0gY2hlY2tlcnMubWFwKCh0YykgPT4ge1xuICAgICAgICBpZiAocmVjdXJzaXZlVHlwZUNoZWNrZXJzLmluY2x1ZGVzKHRjKSkge1xuICAgICAgICAgIHJldHVybiBcIi4uLlwiXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRjLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdGMpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gdHlwZU5hbWVzLmpvaW4oXCIgfCBcIilcbiAgICB9XG5cbiAgICBsZXQgdGhpc1RjQmFzZVR5cGU6IFR5cGVDaGVja2VyQmFzZVR5cGVcbiAgICBpZiAoY2hlY2tlcnMuc29tZSgoYykgPT4gYy5iYXNlVHlwZSAhPT0gY2hlY2tlcnNbMF0uYmFzZVR5cGUpKSB7XG4gICAgICB0aGlzVGNCYXNlVHlwZSA9IFR5cGVDaGVja2VyQmFzZVR5cGUuQW55XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNUY0Jhc2VUeXBlID0gY2hlY2tlcnNbMF0uYmFzZVR5cGVcbiAgICB9XG5cbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgdGhpc1RjQmFzZVR5cGUsXG5cbiAgICAgICh2YWx1ZSwgcGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBzb21lTWF0Y2hpbmdUeXBlID0gY2hlY2tlcnMuc29tZSgodGMpID0+ICF0Yy5jaGVjayh2YWx1ZSwgcGF0aCkpXG4gICAgICAgIGlmIChzb21lTWF0Y2hpbmdUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVCYXNlVHlwZSA9IGdldFR5cGVDaGVja2VyQmFzZVR5cGVGcm9tVmFsdWUodmFsdWUpXG5cbiAgICAgICAgY29uc3QgY2hlY2tlckZvckJhc2VUeXBlID0gY2hlY2tlcnMuZmlsdGVyKFxuICAgICAgICAgIChjKSA9PiBjLmJhc2VUeXBlID09PSB2YWx1ZUJhc2VUeXBlIHx8IGMuYmFzZVR5cGUgPT09IFR5cGVDaGVja2VyQmFzZVR5cGUuQW55XG4gICAgICAgIClcblxuICAgICAgICBpZiAoY2hlY2tlckZvckJhc2VUeXBlLmxlbmd0aCA9PT0gMSAmJiBjaGVja2VyRm9yQmFzZVR5cGVbMF0uYmFzZVR5cGUgPT09IHZhbHVlQmFzZVR5cGUpIHtcbiAgICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIHZhbGlkIG9wdGlvbiBhY2NlcHQgaXQgd2l0aG91dCBhc2tpbmdcbiAgICAgICAgICAvLyB0aGlzIGlzIGRvbmUgYmVjYXVzZTpcbiAgICAgICAgICAvLyAxKSBwZXJmb3JtYW5jZSAoYXZvaWQgY2hlY2tpbmcgc3RydWN0dXJlIGlmIG5vdCBuZWVkZWQpXG4gICAgICAgICAgLy8gMikgc28gd2UgY2FuIGFjY2VwdCB1bnR5cGVkIG1vZGVscyB3aGVuIHBhaXJlZCB3aXRoIHVuZGVmaW5lZCB8IG51bGxcbiAgICAgICAgICByZXR1cm4gY2hlY2tlckZvckJhc2VUeXBlWzBdXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrZXJGb3JCYXNlVHlwZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVHlwZSA9IGNoZWNrZXJGb3JCYXNlVHlwZVtpXS5zbmFwc2hvdFR5cGUodmFsdWUpXG4gICAgICAgICAgaWYgKG1hdGNoaW5nVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoaW5nVHlwZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9LFxuXG4gICAgICAoc24pID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGZpbmFsRGlzcGF0Y2hlciA/IGZpbmFsRGlzcGF0Y2hlcihzbikgOiB0aGlzVGMuc25hcHNob3RUeXBlKHNuKVxuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgICAgYHNuYXBzaG90ICcke0pTT04uc3RyaW5naWZ5KHNuKX0nIGRvZXMgbm90IG1hdGNoIHRoZSBmb2xsb3dpbmcgdHlwZTogJHtnZXRUeXBlTmFtZShcbiAgICAgICAgICAgICAgdGhpc1RjXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHlwZS5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc24pXG4gICAgICB9LFxuXG4gICAgICAoc24pID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGZpbmFsRGlzcGF0Y2hlciA/IGZpbmFsRGlzcGF0Y2hlcihzbikgOiB0aGlzVGMuc25hcHNob3RUeXBlKHNuKVxuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgICAgYHNuYXBzaG90ICcke0pTT04uc3RyaW5naWZ5KHNuKX0nIGRvZXMgbm90IG1hdGNoIHRoZSBmb2xsb3dpbmcgdHlwZTogJHtnZXRUeXBlTmFtZShcbiAgICAgICAgICAgICAgdGhpc1RjXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHlwZS50b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiB0aGlzVGNcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5vcmAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgT3JUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgLy8gbWVtb2l6ZSB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFycmF5IG9uIHRoZSBnZXR0ZXJcbiAgcHJpdmF0ZSBfb3JUeXBlSW5mb3MgPSBsYXp5KCgpID0+IHRoaXMub3JUeXBlcy5tYXAoZ2V0VHlwZUluZm8pKVxuXG4gIGdldCBvclR5cGVJbmZvcygpOiBSZWFkb25seUFycmF5PFR5cGVJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuX29yVHlwZUluZm9zKClcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IG9yVHlwZXM6IFJlYWRvbmx5QXJyYXk8QW55U3RhbmRhcmRUeXBlPikge1xuICAgIHN1cGVyKHRoaXNUeXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBBbnlNb2RlbFByb3AsIE1heWJlT3B0aW9uYWxNb2RlbFByb3AsIE9wdGlvbmFsTW9kZWxQcm9wLCBwcm9wIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHtcbiAgdHlwZXNCb29sZWFuLFxuICB0eXBlc051bGwsXG4gIHR5cGVzTnVtYmVyLFxuICB0eXBlc1N0cmluZyxcbiAgdHlwZXNVbmRlZmluZWQsXG59IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB7IExhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyB0eXBlc09yIH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc09yXCJcblxuLyoqXG4gKiBEZWZpbmVzIGEgc3RyaW5nIG1vZGVsIHByb3BlcnR5IHdpdGggYSBkZWZhdWx0IHZhbHVlLlxuICogRXF1aXZhbGVudCB0byBgdFByb3AodHlwZXMuc3RyaW5nLCBkZWZhdWx0VmFsdWUpYC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHg6IHRQcm9wKFwiZm9vXCIpIC8vIGFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHdpbGwgdGFrZSB0aGUgdmFsdWUgYFwiZm9vXCJgIHdoZW4gdW5kZWZpbmVkLlxuICogYGBgXG4gKlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wKGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogT3B0aW9uYWxNb2RlbFByb3A8c3RyaW5nPlxuXG4vKipcbiAqIERlZmluZXMgYSBudW1iZXIgbW9kZWwgcHJvcGVydHkgd2l0aCBhIGRlZmF1bHQgdmFsdWUuXG4gKiBFcXVpdmFsZW50IHRvIGB0UHJvcCh0eXBlcy5udW1iZXIsIGRlZmF1bHRWYWx1ZSlgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AoNDIpIC8vIGFuIG9wdGlvbmFsIG51bWJlciB0aGF0IHdpbGwgdGFrZSB0aGUgdmFsdWUgYDQyYCB3aGVuIHVuZGVmaW5lZC5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcChkZWZhdWx0VmFsdWU6IG51bWJlcik6IE9wdGlvbmFsTW9kZWxQcm9wPG51bWJlcj5cblxuLyoqXG4gKiBEZWZpbmVzIGEgYm9vbGVhbiBtb2RlbCBwcm9wZXJ0eSB3aXRoIGEgZGVmYXVsdCB2YWx1ZS5cbiAqIEVxdWl2YWxlbnQgdG8gYHRQcm9wKHR5cGVzLmJvb2xlYW4sIGRlZmF1bHRWYWx1ZSlgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AodHJ1ZSkgLy8gYW4gb3B0aW9uYWwgYm9vbGVhbiB0aGF0IHdpbGwgdGFrZSB0aGUgdmFsdWUgYHRydWVgIHdoZW4gdW5kZWZpbmVkLlxuICogYGBgXG4gKlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIG9wdGlvbnMgTW9kZWwgcHJvcGVydHkgb3B0aW9ucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcChkZWZhdWx0VmFsdWU6IGJvb2xlYW4pOiBPcHRpb25hbE1vZGVsUHJvcDxib29sZWFuPlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSwgd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgdmFsdWVcbiAqIGlmIHRoZSBpbnB1dCBzbmFwc2hvdCAvIG1vZGVsIGNyZWF0aW9uIGRhdGEgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIGFuZCB3aXRoIGFuIGFzc29jaWF0ZWQgdHlwZSBjaGVja2VyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AodHlwZXMubnVtYmVyLCAoKSA9PiAxMCkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiAxMFxuICogeDogdFByb3AodHlwZXMuYXJyYXkodHlwZXMubnVtYmVyKSwgKCkgPT4gW10pIC8vIGFuIG9wdGlvbmFsIG51bWJlciBhcnJheSwgd2l0aCBhIGRlZmF1bHQgZW1wdHkgYXJyYXlcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFR5cGUgVHlwZSBjaGVja2VyIHR5cGUuXG4gKlxuICogQHBhcmFtIHR5cGUgVHlwZSBjaGVja2VyLlxuICogQHBhcmFtIGRlZmF1bHRGbiBEZWZhdWx0IHZhbHVlIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0UHJvcDxUVHlwZSBleHRlbmRzIEFueVR5cGU+KFxuICB0eXBlOiBUVHlwZSxcbiAgZGVmYXVsdEZuOiAoKSA9PiBUeXBlVG9EYXRhPFRUeXBlPlxuKTogT3B0aW9uYWxNb2RlbFByb3A8VHlwZVRvRGF0YTxUVHlwZT4+XG5cbi8qKlxuICogRGVmaW5lcyBhIG1vZGVsIHByb3BlcnR5LCB3aXRoIGFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWVcbiAqIGlmIHRoZSBpbnB1dCBzbmFwc2hvdCAvIG1vZGVsIGNyZWF0aW9uIGRhdGEgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIGFuZCB3aXRoIGFuIGFzc29jaWF0ZWQgdHlwZSBjaGVja2VyLlxuICogWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIHdpdGggcHJpbWl0aXZlIHZhbHVlcyBhbmQgbmV2ZXIgd2l0aCBvYmplY3QgdmFsdWVzXG4gKiAoYXJyYXksIG1vZGVsLCBvYmplY3QsIGV0YykuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiB4OiB0UHJvcCh0eXBlcy5udW1iZXIsIDEwKSAvLyBhbiBvcHRpb25hbCBudW1iZXIsIHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mIDEwXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFRUeXBlIFR5cGUgY2hlY2tlciB0eXBlLlxuICpcbiAqIEBwYXJhbSB0eXBlIFR5cGUgY2hlY2tlci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZSBnZW5lcmF0b3IgZnVuY3Rpb24uXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdFByb3A8VFR5cGUgZXh0ZW5kcyBBbnlUeXBlPihcbiAgdHlwZTogVFR5cGUsXG4gIGRlZmF1bHRWYWx1ZTogVHlwZVRvRGF0YTxUVHlwZT5cbik6IE9wdGlvbmFsTW9kZWxQcm9wPFR5cGVUb0RhdGE8VFR5cGU+PlxuXG4vKipcbiAqIERlZmluZXMgYSBtb2RlbCBwcm9wZXJ0eSB3aXRoIG5vIGRlZmF1bHQgdmFsdWUgYW5kIGFuIGFzc29jaWF0ZWQgdHlwZSBjaGVja2VyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogeDogdFByb3AodHlwZXMubnVtYmVyKSAvLyBhIHJlcXVpcmVkIG51bWJlclxuICogeDogdFByb3AodHlwZXMubWF5YmUodHlwZXMubnVtYmVyKSkgLy8gYW4gb3B0aW9uYWwgbnVtYmVyLCB3aGljaCBkZWZhdWx0cyB0byB1bmRlZmluZWRcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVFR5cGUgVHlwZSBjaGVja2VyIHR5cGUuXG4gKlxuICogQHBhcmFtIHR5cGUgVHlwZSBjaGVja2VyLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRQcm9wPFRUeXBlIGV4dGVuZHMgQW55VHlwZT4odHlwZTogVFR5cGUpOiBNYXliZU9wdGlvbmFsTW9kZWxQcm9wPFR5cGVUb0RhdGE8VFR5cGU+PlxuXG5leHBvcnQgZnVuY3Rpb24gdFByb3AodHlwZU9yRGVmYXVsdFZhbHVlOiBhbnksIGRlZj86IGFueSk6IEFueU1vZGVsUHJvcCB7XG4gIGxldCBoYXNEZWZhdWx0VmFsdWUgPSBmYWxzZVxuXG4gIHN3aXRjaCAodHlwZW9mIHR5cGVPckRlZmF1bHRWYWx1ZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiB0UHJvcCh0eXBlc1N0cmluZywgdHlwZU9yRGVmYXVsdFZhbHVlKVxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiB0UHJvcCh0eXBlc051bWJlciwgdHlwZU9yRGVmYXVsdFZhbHVlKVxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gdFByb3AodHlwZXNCb29sZWFuLCB0eXBlT3JEZWZhdWx0VmFsdWUpXG4gIH1cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgLy8gdHlwZSwgZGVmYXVsdFxuICAgIGhhc0RlZmF1bHRWYWx1ZSA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IG5ld1Byb3AgPSBoYXNEZWZhdWx0VmFsdWUgPyBwcm9wKGRlZikgOiBwcm9wKClcblxuICBjb25zdCB0eXBlQ2hlY2tlciA9IHJlc29sdmVTdGFuZGFyZFR5cGUodHlwZU9yRGVmYXVsdFZhbHVlKSBhcyB1bmtub3duIGFzXG4gICAgfCBUeXBlQ2hlY2tlclxuICAgIHwgTGF0ZVR5cGVDaGVja2VyXG5cbiAgY29uc3QgZnJvbVNuYXBzaG90VHlwZUNoZWNrZXIgPSBoYXNEZWZhdWx0VmFsdWVcbiAgICA/IHR5cGVzT3IodHlwZUNoZWNrZXIgYXMgdW5rbm93biBhcyBBbnlUeXBlLCB0eXBlc1VuZGVmaW5lZCwgdHlwZXNOdWxsKVxuICAgIDogdHlwZUNoZWNrZXJcblxuICByZXR1cm4ge1xuICAgIC4uLm5ld1Byb3AsXG4gICAgX2ludGVybmFsOiB7XG4gICAgICAuLi5uZXdQcm9wLl9pbnRlcm5hbCxcblxuICAgICAgdHlwZUNoZWNrZXIsXG5cbiAgICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvcjogKHNuKSA9PiB7XG4gICAgICAgIGNvbnN0IGZzbnAgPSByZXNvbHZlVHlwZUNoZWNrZXIoZnJvbVNuYXBzaG90VHlwZUNoZWNrZXIpLmZyb21TbmFwc2hvdFByb2Nlc3NvclxuICAgICAgICByZXR1cm4gZnNucCA/IGZzbnAoc24pIDogc25cbiAgICAgIH0sXG5cbiAgICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IChzbikgPT4ge1xuICAgICAgICBjb25zdCB0c25wID0gcmVzb2x2ZVR5cGVDaGVja2VyKHR5cGVDaGVja2VyKS50b1NuYXBzaG90UHJvY2Vzc29yXG4gICAgICAgIHJldHVybiB0c25wID8gdHNucChzbikgOiBzblxuICAgICAgfSxcbiAgICB9LFxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY2hhaW5GbnM8RiBleHRlbmRzIEZ1bmN0aW9uPiguLi5mbnM6IChGIHwgdW5kZWZpbmVkKVtdKTogRiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlZmluZWRGbnMgPSBmbnMuZmlsdGVyKChmbikgPT4gISFmbilcbiAgaWYgKGRlZmluZWRGbnMubGVuZ3RoIDw9IDApIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBjaGFpbmVkRm4gPSAodjogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGxldCByZXQgPSB2XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZmluZWRGbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJldCA9IGRlZmluZWRGbnNbaV0hKHJldCwgLi4uYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICByZXR1cm4gY2hhaW5lZEZuIGFzIHVua25vd24gYXMgRlxufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9CYXNlTW9kZWxcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4vQmFzZU1vZGVsU2hhcmVkXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBhY3R1YWxseSBhIGNsYXNzIG9yIGRhdGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIG1vZGVsXG4gKiBAcGFyYW0gYXJnTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNDbGFzc09yRGF0YU1vZGVsQ2xhc3MoXG4gIG1vZGVsOiB1bmtub3duLFxuICBhcmdOYW1lOiBzdHJpbmcsXG4gIGN1c3RvbUVyck1zZyA9IFwibXVzdCBiZSBhIGNsYXNzIG9yIGRhdGEgbW9kZWwgY2xhc3NcIlxuKTogYXNzZXJ0cyBtb2RlbCBpcyBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPiB7XG4gIGlmICghaXNNb2RlbENsYXNzKG1vZGVsKSAmJiAhaXNEYXRhTW9kZWxDbGFzcyhtb2RlbCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGAke2FyZ05hbWV9ICR7Y3VzdG9tRXJyTXNnfWApXG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5U2V0IH0gZnJvbSBcIi4uL2FjdGlvbi9hcHBseVNldFwiXG5pbXBvcnQgeyBnZXRDdXJyZW50QWN0aW9uQ29udGV4dCB9IGZyb20gXCIuLi9hY3Rpb24vY29udGV4dFwiXG5pbXBvcnQgeyBtb2RlbEFjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb24vbW9kZWxBY3Rpb25cIlxuaW1wb3J0IHsgQW55RGF0YU1vZGVsLCBCYXNlRGF0YU1vZGVsLCBiYXNlRGF0YU1vZGVsUHJvcE5hbWVzIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9CYXNlRGF0YU1vZGVsXCJcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsQ29uc3RydWN0b3JPcHRpb25zIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC9EYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcIlxuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi9kYXRhTW9kZWwvZ2V0RGF0YU1vZGVsTWV0YWRhdGFcIlxuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZy9nbG9iYWxDb25maWdcIlxuaW1wb3J0IHsgQW55TW9kZWwsIEJhc2VNb2RlbCwgYmFzZU1vZGVsUHJvcE5hbWVzIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vbW9kZWwvZ2V0TW9kZWxNZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnN0cnVjdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbENvbnN0cnVjdG9yT3B0aW9uc1wiXG5pbXBvcnQgeyB0eXBlc09iamVjdCB9IGZyb20gXCIuLi90eXBlcy9vYmplY3RCYXNlZC90eXBlc09iamVjdFwiXG5pbXBvcnQgeyB0eXBlc1N0cmluZyB9IGZyb20gXCIuLi90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvc2NoZW1hc1wiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgdHlwZSB7IExhdGVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi90eXBlcy9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyB0eXBlc1VuY2hlY2tlZCB9IGZyb20gXCIuLi90eXBlcy91dGlsaXR5L3R5cGVzVW5jaGVja2VkXCJcbmltcG9ydCB7IGFzc2VydElzT2JqZWN0LCBmYWlsdXJlLCBwcm9wTmFtZVRvU2V0dGVyTmFtZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBjaGFpbkZucyB9IGZyb20gXCIuLi91dGlscy9jaGFpbkZuc1wiXG5pbXBvcnQgeyBNb2RlbENsYXNzLCBtb2RlbEluaXRpYWxpemVkU3ltYm9sIH0gZnJvbSBcIi4vQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5pdGlhbGl6ZXJzU3ltYm9sIH0gZnJvbSBcIi4vbW9kZWxDbGFzc0luaXRpYWxpemVyXCJcbmltcG9ydCB7IGdldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbywgc2V0SW50ZXJuYWxNb2RlbENsYXNzUHJvcHNJbmZvIH0gZnJvbSBcIi4vbW9kZWxQcm9wc0luZm9cIlxuaW1wb3J0IHsgbW9kZWxNZXRhZGF0YVN5bWJvbCwgbW9kZWxVbndyYXBwZWRDbGFzc1N5bWJvbCB9IGZyb20gXCIuL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQgeyBBbnlNb2RlbFByb3AsIE1vZGVsUHJvcHMsIHByb3AgfSBmcm9tIFwiLi9wcm9wXCJcbmltcG9ydCB7IGFzc2VydElzQ2xhc3NPckRhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG5mdW5jdGlvbiBfX2V4dGVuZHMoc3ViQ2xhc3M6IGFueSwgc3VwZXJDbGFzczogYW55KSB7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcylcbiAgZnVuY3Rpb24gX18odGhpczogYW55KSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzXG4gIH1cbiAgX18ucHJvdG90eXBlID0gc3VwZXJDbGFzcy5wcm90b3R5cGVcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gbmV3IChfXyBhcyBhbnkpKClcbn1cblxuZnVuY3Rpb24gY3JlYXRlTW9kZWxQcm9wRGVzY3JpcHRvcihcbiAgbW9kZWxQcm9wTmFtZTogc3RyaW5nLFxuICBtb2RlbFByb3A6IEFueU1vZGVsUHJvcCB8IHVuZGVmaW5lZCxcbiAgZW51bWVyYWJsZTogYm9vbGVhblxuKTogUHJvcGVydHlEZXNjcmlwdG9yIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQodGhpczogQW55TW9kZWwgfCBBbnlEYXRhTW9kZWwpIHtcbiAgICAgIHJldHVybiBnZXRNb2RlbEluc3RhbmNlRGF0YUZpZWxkKHRoaXMsIG1vZGVsUHJvcCwgbW9kZWxQcm9wTmFtZSlcbiAgICB9LFxuICAgIHNldCh0aGlzOiBBbnlNb2RlbCB8IEFueURhdGFNb2RlbCwgdj86IGFueSkge1xuICAgICAgLy8gaGFjayB0byBvbmx5IHBlcm1pdCBzZXR0aW5nIHRoZXNlIHZhbHVlcyBvbmNlIGZ1bGx5IGNvbnN0cnVjdGVkXG4gICAgICAvLyB0aGlzIGlzIHRvIGlnbm9yZSBhYnN0cmFjdCBwcm9wZXJ0aWVzIGJlaW5nIHNldCBieSBiYWJlbFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94YXZpZXJnb256L21vYngta2V5c3RvbmUvaXNzdWVzLzE4XG4gICAgICBpZiAoIShtb2RlbEluaXRpYWxpemVkU3ltYm9sIGluIHRoaXMpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2V0TW9kZWxJbnN0YW5jZURhdGFGaWVsZCh0aGlzLCBtb2RlbFByb3AsIG1vZGVsUHJvcE5hbWUsIHYpXG4gICAgfSxcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNb2RlbEluc3RhbmNlRGF0YUZpZWxkPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBtb2RlbFByb3A6IEFueU1vZGVsUHJvcCB8IHVuZGVmaW5lZCxcbiAgbW9kZWxQcm9wTmFtZTogc3RyaW5nXG4pOiBhbnkge1xuICAvLyBubyBuZWVkIHRvIHVzZSBnZXQgc2luY2UgdGhlc2UgdmFycyBhbHdheXMgZ2V0IG9uIHRoZSBpbml0aWFsICRcbiAgY29uc3QgdmFsdWUgPSBtb2RlbC4kW21vZGVsUHJvcE5hbWVdXG5cbiAgaWYgKG1vZGVsUHJvcD8uX2ludGVybmFsLnRyYW5zZm9ybSkge1xuICAgIHJldHVybiBtb2RlbFByb3AuX2ludGVybmFsLnRyYW5zZm9ybS50cmFuc2Zvcm0odmFsdWUsIG1vZGVsLCBtb2RlbFByb3BOYW1lLCAobmV3VmFsdWUpID0+IHtcbiAgICAgIC8vIHVzZSBhcHBseSBzZXQgaW5zdGVhZCB0byB3cmFwIGl0IGluIGFuIGFjdGlvblxuICAgICAgLy8gc2V0IHRoZSAkIG9iamVjdCB0byBzZXQgdGhlIG9yaWdpbmFsIHZhbHVlIGRpcmVjdGx5XG4gICAgICBhcHBseVNldChtb2RlbC4kLCBtb2RlbFByb3BOYW1lLCBuZXdWYWx1ZSlcbiAgICB9KSBhcyBhbnlcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBzZXRNb2RlbEluc3RhbmNlRGF0YUZpZWxkPE0gZXh0ZW5kcyBBbnlNb2RlbCB8IEFueURhdGFNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBtb2RlbFByb3A6IEFueU1vZGVsUHJvcCB8IHVuZGVmaW5lZCxcbiAgbW9kZWxQcm9wTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogYW55XG4pOiB2b2lkIHtcbiAgaWYgKG1vZGVsUHJvcD8uX2ludGVybmFsLnNldHRlciA9PT0gXCJhc3NpZ25cIiAmJiAhZ2V0Q3VycmVudEFjdGlvbkNvbnRleHQoKSkge1xuICAgIC8vIHVzZSBhcHBseSBzZXQgaW5zdGVhZCB0byB3cmFwIGl0IGluIGFuIGFjdGlvblxuICAgIGFwcGx5U2V0KG1vZGVsLCBtb2RlbFByb3BOYW1lIGFzIGFueSwgdmFsdWUpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gbW9kZWxQcm9wPy5faW50ZXJuYWwudHJhbnNmb3JtXG4gICAgPyBtb2RlbFByb3AuX2ludGVybmFsLnRyYW5zZm9ybS51bnRyYW5zZm9ybSh2YWx1ZSwgbW9kZWwsIG1vZGVsUHJvcE5hbWUpXG4gICAgOiB2YWx1ZVxuICAvLyBubyBuZWVkIHRvIHVzZSBzZXQgc2luY2UgdGhlc2UgdmFycyBhbHdheXMgZ2V0IG9uIHRoZSBpbml0aWFsICRcbiAgbW9kZWwuJFttb2RlbFByb3BOYW1lXSA9IHRyYW5zZm9ybWVkVmFsdWVcbn1cblxuY29uc3QgaWRHZW5lcmF0b3IgPSAoKSA9PiBnZXRHbG9iYWxDb25maWcoKS5tb2RlbElkR2VuZXJhdG9yKClcbmNvbnN0IHRQcm9wRm9ySWQgPSB0UHJvcCh0eXBlc1N0cmluZywgaWRHZW5lcmF0b3IpXG50UHJvcEZvcklkLl9pbnRlcm5hbC5pc0lkID0gdHJ1ZVxuY29uc3QgcHJvcEZvcklkID0gcHJvcChpZEdlbmVyYXRvcilcbnByb3BGb3JJZC5faW50ZXJuYWwuaXNJZCA9IHRydWVcblxudHlwZSBGcm9tU25hcHNob3RQcm9jZXNzb3JGbiA9IChzbjogYW55KSA9PiBhbnlcbnR5cGUgVG9TbmFwc2hvdFByb2Nlc3NvckZuID0gKHNuOiBhbnksIGluc3RhbmNlOiBhbnkpID0+IGFueVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkSW50ZXJuYWxNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVEJhc2VNb2RlbCBleHRlbmRzIEFueU1vZGVsIHwgQW55RGF0YU1vZGVsXG4+KHtcbiAgbW9kZWxQcm9wcyxcbiAgYmFzZU1vZGVsLFxuICB0eXBlLFxuICB2YWx1ZVR5cGUsXG4gIGZyb21TbmFwc2hvdFByb2Nlc3NvcixcbiAgdG9TbmFwc2hvdFByb2Nlc3Nvcixcbn06IHtcbiAgbW9kZWxQcm9wczogVFByb3BzXG4gIGJhc2VNb2RlbDogTW9kZWxDbGFzczxUQmFzZU1vZGVsPiB8IHVuZGVmaW5lZFxuICB0eXBlOiBcImNsYXNzXCIgfCBcImRhdGFcIlxuICB2YWx1ZVR5cGU6IGJvb2xlYW5cbiAgZnJvbVNuYXBzaG90UHJvY2Vzc29yOiBGcm9tU25hcHNob3RQcm9jZXNzb3JGbiB8IHVuZGVmaW5lZFxuICB0b1NuYXBzaG90UHJvY2Vzc29yOiBUb1NuYXBzaG90UHJvY2Vzc29yRm4gfCB1bmRlZmluZWRcbn0pOiBhbnkge1xuICBhc3NlcnRJc09iamVjdChtb2RlbFByb3BzLCBcIm1vZGVsUHJvcHNcIilcbiAgaWYgKGJhc2VNb2RlbCkge1xuICAgIGFzc2VydElzQ2xhc3NPckRhdGFNb2RlbENsYXNzKGJhc2VNb2RlbCwgXCJiYXNlTW9kZWxcIilcblxuICAgIC8vIGlmIHRoZSBiYXNlTW9kZWwgaXMgd3JhcHBlZCB3aXRoIHRoZSBtb2RlbCBkZWNvcmF0b3IgZ2V0IHRoZSBvcmlnaW5hbCBvbmVcbiAgICBjb25zdCB1bndyYXBwZWRDbGFzcyA9IChiYXNlTW9kZWwgYXMgYW55KVttb2RlbFVud3JhcHBlZENsYXNzU3ltYm9sXVxuICAgIGlmICh1bndyYXBwZWRDbGFzcykge1xuICAgICAgYmFzZU1vZGVsID0gdW53cmFwcGVkQ2xhc3NcbiAgICAgIGFzc2VydElzQ2xhc3NPckRhdGFNb2RlbENsYXNzKGJhc2VNb2RlbCwgXCJiYXNlTW9kZWxcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBleHRyYURlc2NyaXB0b3JzOiBQcm9wZXJ0eURlc2NyaXB0b3JNYXAgPSB7fVxuXG4gIGNvbnN0IGNvbXBvc2VkTW9kZWxQcm9wczogTW9kZWxQcm9wcyA9IG1vZGVsUHJvcHNcbiAgaWYgKGJhc2VNb2RlbCkge1xuICAgIGNvbnN0IG9sZE1vZGVsUHJvcHMgPSBnZXRJbnRlcm5hbE1vZGVsQ2xhc3NQcm9wc0luZm8oYmFzZU1vZGVsKVxuICAgIGZvciAoY29uc3Qgb2xkTW9kZWxQcm9wS2V5IG9mIE9iamVjdC5rZXlzKG9sZE1vZGVsUHJvcHMpKSB7XG4gICAgICBpZiAobW9kZWxQcm9wc1tvbGRNb2RlbFByb3BLZXldKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGV4dGVuZGVkIG1vZGVsIGNhbm5vdCByZWRlY2xhcmUgYmFzZSBtb2RlbCBwcm9wZXJ0eSBuYW1lZCAnJHtvbGRNb2RlbFByb3BLZXl9J2BcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY29tcG9zZWRNb2RlbFByb3BzW29sZE1vZGVsUHJvcEtleV0gPSBvbGRNb2RlbFByb3BzW29sZE1vZGVsUHJvcEtleV1cbiAgICB9XG4gIH1cblxuICAvLyBsb29rIGZvciBpZCBrZXlzXG4gIGNvbnN0IGlkS2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvc2VkTW9kZWxQcm9wcykuZmlsdGVyKChrKSA9PiB7XG4gICAgY29uc3QgcCA9IGNvbXBvc2VkTW9kZWxQcm9wc1trXVxuICAgIHJldHVybiBwLl9pbnRlcm5hbC5pc0lkXG4gIH0pXG4gIGlmICh0eXBlID09PSBcImNsYXNzXCIpIHtcbiAgICBpZiAoaWRLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYGV4cGVjdGVkIGF0IG1vc3Qgb25lIGlkUHJvcCBidXQgZ290IG1hbnk6ICR7SlNPTi5zdHJpbmdpZnkoaWRLZXlzKX1gKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaWRLZXlzLmxlbmd0aCA+PSAxKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBleHBlY3RlZCBubyBpZFByb3AgYnV0IGdvdCBzb21lOiAke0pTT04uc3RyaW5naWZ5KGlkS2V5cyl9YClcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZWVkc1R5cGVDaGVja2VyID0gT2JqZWN0LnZhbHVlcyhjb21wb3NlZE1vZGVsUHJvcHMpLnNvbWUoXG4gICAgKG1wKSA9PiAhIW1wLl9pbnRlcm5hbC50eXBlQ2hlY2tlclxuICApXG5cbiAgLy8gdHJhbnNmb3JtIGlkIGtleXMgKG9ubHkgb25lIHJlYWxseSlcbiAgbGV0IGlkS2V5OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgaWYgKGlkS2V5cy5sZW5ndGggPj0gMSkge1xuICAgIGlkS2V5ID0gaWRLZXlzWzBdXG4gICAgY29uc3QgaWRQcm9wID0gY29tcG9zZWRNb2RlbFByb3BzW2lkS2V5XVxuICAgIGxldCBiYXNlUHJvcDogQW55TW9kZWxQcm9wID0gbmVlZHNUeXBlQ2hlY2tlciA/IHRQcm9wRm9ySWQgOiBwcm9wRm9ySWRcbiAgICBzd2l0Y2ggKGlkUHJvcD8uX2ludGVybmFsLnNldHRlcikge1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICBiYXNlUHJvcCA9IGJhc2VQcm9wLndpdGhTZXR0ZXIoKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImFzc2lnblwiOlxuICAgICAgICBiYXNlUHJvcCA9IGJhc2VQcm9wLndpdGhTZXR0ZXIoXCJhc3NpZ25cIilcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNvbXBvc2VkTW9kZWxQcm9wc1tpZEtleV0gPSBiYXNlUHJvcFxuICB9XG5cbiAgLy8gY3JlYXRlIHR5cGUgY2hlY2tlciBpZiBuZWVkZWRcbiAgbGV0IGRhdGFUeXBlQ2hlY2tlcjogTGF0ZVR5cGVDaGVja2VyIHwgdW5kZWZpbmVkXG4gIGlmIChuZWVkc1R5cGVDaGVja2VyKSB7XG4gICAgY29uc3QgdHlwZUNoZWNrZXJPYmo6IHtcbiAgICAgIFtrOiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrLCBtcF0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9zZWRNb2RlbFByb3BzKSkge1xuICAgICAgdHlwZUNoZWNrZXJPYmpba10gPSAhbXAuX2ludGVybmFsLnR5cGVDaGVja2VyID8gdHlwZXNVbmNoZWNrZWQoKSA6IG1wLl9pbnRlcm5hbC50eXBlQ2hlY2tlclxuICAgIH1cbiAgICBkYXRhVHlwZUNoZWNrZXIgPSB0eXBlc09iamVjdCgoKSA9PiB0eXBlQ2hlY2tlck9iaikgYXMgYW55XG4gIH1cblxuICBjb25zdCBiYXNlUHJvcE5hbWVzID0gdHlwZSA9PT0gXCJjbGFzc1wiID8gYmFzZU1vZGVsUHJvcE5hbWVzIDogYmFzZURhdGFNb2RlbFByb3BOYW1lc1xuXG4gIC8vIHNraXAgcHJvcHMgdGhhdCBhcmUgb24gYmFzZSBtb2RlbCwgdGhlc2UgaGF2ZSB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoICRcbiAgLy8gd2Ugb25seSBuZWVkIHRvIHByb3h5IG5ldyBwcm9wcywgbm90IG9sZCBvbmVzXG4gIGZvciAoY29uc3QgbW9kZWxQcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhtb2RlbFByb3BzKS5maWx0ZXIoXG4gICAgKG1wKSA9PiAhYmFzZVByb3BOYW1lcy5oYXMobXAgYXMgYW55KVxuICApKSB7XG4gICAgZXh0cmFEZXNjcmlwdG9yc1ttb2RlbFByb3BOYW1lXSA9IGNyZWF0ZU1vZGVsUHJvcERlc2NyaXB0b3IoXG4gICAgICBtb2RlbFByb3BOYW1lLFxuICAgICAgbW9kZWxQcm9wc1ttb2RlbFByb3BOYW1lXSxcbiAgICAgIGZhbHNlXG4gICAgKVxuICB9XG5cbiAgY29uc3QgZXh0cmFQcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhleHRyYURlc2NyaXB0b3JzKVxuICBjb25zdCBleHRyYVByb3BOYW1lc0xlbiA9IGV4dHJhUHJvcE5hbWVzLmxlbmd0aFxuXG4gIGNvbnN0IGJhc2U6IGFueSA9IGJhc2VNb2RlbCA/PyAodHlwZSA9PT0gXCJjbGFzc1wiID8gQmFzZU1vZGVsIDogQmFzZURhdGFNb2RlbClcblxuICAvLyB3ZSB1c2UgdGhpcyB3ZWlyZCBoYWNrIHJhdGhlciB0aGFuIGp1c3QgY2xhc3MgQ3VzdG9tQmFzZU1vZGVsIGV4dGVuZHMgYmFzZSB7fVxuICAvLyBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCBwcm9ibGVtcyB3aXRoIEVTNSBjbGFzc2VzIGV4dGVuZGluZyBFUzYgY2xhc3Nlc1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3hhdmllcmdvbnovbW9ieC1rZXlzdG9uZS9pc3N1ZXMvMTVcbiAgY29uc3QgQ3VzdG9tQmFzZU1vZGVsOiBhbnkgPSAoZnVuY3Rpb24gKF9iYXNlKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbUJhc2VNb2RlbCwgX2Jhc2UpXG5cbiAgICBmdW5jdGlvbiBDdXN0b21CYXNlTW9kZWwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBpbml0aWFsRGF0YTogYW55LFxuICAgICAgY29uc3RydWN0b3JPcHRpb25zPzogTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgfCBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnNcbiAgICApIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBjb25zdHJ1Y3Rvck9wdGlvbnM/Lm1vZGVsQ2xhc3MgPz8gdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgY29uc3QgYmFzZU1vZGVsID0gbmV3IF9iYXNlKGluaXRpYWxEYXRhLCB7XG4gICAgICAgIC4uLmNvbnN0cnVjdG9yT3B0aW9ucyxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgIH0gYXMgTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMgJiBEYXRhTW9kZWxDb25zdHJ1Y3Rvck9wdGlvbnMpXG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBhYnN0cmFjdCBjbGFzc2VzIGRvIG5vdCBvdmVycmlkZSBwcm90b3R5cGUgcHJvcHNcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0cmFQcm9wTmFtZXNMZW47IGkrKykge1xuICAgICAgICBjb25zdCBleHRyYVByb3BOYW1lID0gZXh0cmFQcm9wTmFtZXNbaV1cbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZU1vZGVsLCBleHRyYVByb3BOYW1lKSkge1xuICAgICAgICAgIGRlbGV0ZSBiYXNlTW9kZWxbZXh0cmFQcm9wTmFtZV1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFzZU1vZGVsXG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUJhc2VNb2RlbFxuICB9KShiYXNlKVxuXG4gIGNvbnN0IGluaXRpYWxpemVycyA9IGJhc2VbbW9kZWxJbml0aWFsaXplcnNTeW1ib2xdXG4gIGlmIChpbml0aWFsaXplcnMpIHtcbiAgICBDdXN0b21CYXNlTW9kZWxbbW9kZWxJbml0aWFsaXplcnNTeW1ib2xdID0gaW5pdGlhbGl6ZXJzLnNsaWNlKClcbiAgfVxuXG4gIHNldEludGVybmFsTW9kZWxDbGFzc1Byb3BzSW5mbyhDdXN0b21CYXNlTW9kZWwsIGNvbXBvc2VkTW9kZWxQcm9wcylcblxuICBpZiAodHlwZSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IE1vZGVsTWV0YWRhdGEgPSB7XG4gICAgICBkYXRhVHlwZTogZGF0YVR5cGVDaGVja2VyIGFzIHVua25vd24gYXMgQW55VHlwZSB8IHVuZGVmaW5lZCxcbiAgICAgIG1vZGVsSWRQcm9wZXJ0eTogaWRLZXksXG4gICAgICB2YWx1ZVR5cGUsXG4gICAgfVxuICAgIEN1c3RvbUJhc2VNb2RlbFttb2RlbE1ldGFkYXRhU3ltYm9sXSA9IG1ldGFkYXRhXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IERhdGFNb2RlbE1ldGFkYXRhID0ge1xuICAgICAgZGF0YVR5cGU6IGRhdGFUeXBlQ2hlY2tlciBhcyB1bmtub3duIGFzIEFueVR5cGUgfCB1bmRlZmluZWQsXG4gICAgfVxuICAgIEN1c3RvbUJhc2VNb2RlbFttb2RlbE1ldGFkYXRhU3ltYm9sXSA9IG1ldGFkYXRhXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlLCBleHRyYURlc2NyaXB0b3JzKVxuXG4gIC8vIGFkZCBzZXR0ZXIgYWN0aW9ucyB0byBwcm90b3R5cGVcbiAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BEYXRhXSBvZiBPYmplY3QuZW50cmllcyhtb2RlbFByb3BzKSkge1xuICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuc2V0dGVyID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzZXR0ZXJOYW1lID0gcHJvcE5hbWVUb1NldHRlck5hbWUocHJvcE5hbWUpXG5cbiAgICAgIEN1c3RvbUJhc2VNb2RlbC5wcm90b3R5cGVbc2V0dGVyTmFtZV0gPSBmdW5jdGlvbiAodGhpczogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXNbcHJvcE5hbWVdID0gdmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3UHJvcERlc2NyaXB0b3I6IGFueSA9IG1vZGVsQWN0aW9uKFxuICAgICAgICBDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlLFxuICAgICAgICBzZXR0ZXJOYW1lLFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEN1c3RvbUJhc2VNb2RlbC5wcm90b3R5cGUsIHNldHRlck5hbWUpXG4gICAgICApXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDdXN0b21CYXNlTW9kZWwucHJvdG90eXBlLCBzZXR0ZXJOYW1lLCBuZXdQcm9wRGVzY3JpcHRvcilcbiAgICB9XG4gIH1cblxuICBjb25zdCBtb2RlbFByb3BzRnJvbVNuYXBzaG90UHJvY2Vzc29yID0gZ2V0TW9kZWxQcm9wc0Zyb21TbmFwc2hvdFByb2Nlc3Nvcihjb21wb3NlZE1vZGVsUHJvcHMpXG5cbiAgY29uc3QgbW9kZWxQcm9wc1RvU25hcHNob3RQcm9jZXNzb3IgPSBnZXRNb2RlbFByb3BzVG9TbmFwc2hvdFByb2Nlc3Nvcihjb21wb3NlZE1vZGVsUHJvcHMpXG5cbiAgaWYgKGZyb21TbmFwc2hvdFByb2Nlc3Nvcikge1xuICAgIGNvbnN0IGZuID0gZnJvbVNuYXBzaG90UHJvY2Vzc29yXG4gICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yID0gKHNuKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5mbihzbiksXG4gICAgICAgIFttb2RlbFR5cGVLZXldOiBzblttb2RlbFR5cGVLZXldLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0b1NuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgY29uc3QgZm4gPSB0b1NuYXBzaG90UHJvY2Vzc29yXG4gICAgdG9TbmFwc2hvdFByb2Nlc3NvciA9IChzbiwgbW9kZWxJbnN0YW5jZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZm4oc24sIG1vZGVsSW5zdGFuY2UpLFxuICAgICAgICBbbW9kZWxUeXBlS2V5XTogc25bbW9kZWxUeXBlS2V5XSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBDdXN0b21CYXNlTW9kZWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yID0gY2hhaW5GbnMoXG4gICAgZnJvbVNuYXBzaG90UHJvY2Vzc29yLFxuICAgIG1vZGVsUHJvcHNGcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgKVxuICBDdXN0b21CYXNlTW9kZWwudG9TbmFwc2hvdFByb2Nlc3NvciA9IGNoYWluRm5zKG1vZGVsUHJvcHNUb1NuYXBzaG90UHJvY2Vzc29yLCB0b1NuYXBzaG90UHJvY2Vzc29yKVxuXG4gIHJldHVybiBDdXN0b21CYXNlTW9kZWxcbn1cblxuZnVuY3Rpb24gZ2V0TW9kZWxQcm9wc0Zyb21TbmFwc2hvdFByb2Nlc3NvcihcbiAgY29tcG9zZWRNb2RlbFByb3BzOiBNb2RlbFByb3BzXG4pOiBGcm9tU25hcHNob3RQcm9jZXNzb3JGbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb3BzV2l0aEZyb21TbmFwc2hvdFByb2Nlc3NvciA9IE9iamVjdC5lbnRyaWVzKGNvbXBvc2VkTW9kZWxQcm9wcykuZmlsdGVyKFxuICAgIChbX3Byb3BOYW1lLCBwcm9wRGF0YV0pID0+IHByb3BEYXRhLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3JcbiAgKVxuICBpZiAocHJvcHNXaXRoRnJvbVNuYXBzaG90UHJvY2Vzc29yLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIChzbikgPT4ge1xuICAgIGNvbnN0IG5ld1NuID0geyAuLi5zbiB9XG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BEYXRhXSBvZiBwcm9wc1dpdGhGcm9tU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICAgIGlmIChwcm9wRGF0YS5faW50ZXJuYWwuZnJvbVNuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICAgIG5ld1NuW3Byb3BOYW1lXSA9IHByb3BEYXRhLl9pbnRlcm5hbC5mcm9tU25hcHNob3RQcm9jZXNzb3Ioc25bcHJvcE5hbWVdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3U25cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNb2RlbFByb3BzVG9TbmFwc2hvdFByb2Nlc3NvcihcbiAgY29tcG9zZWRNb2RlbFByb3BzOiBNb2RlbFByb3BzXG4pOiBUb1NuYXBzaG90UHJvY2Vzc29yRm4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9wc1dpdGhUb1NuYXBzaG90UHJvY2Vzc29yID0gT2JqZWN0LmVudHJpZXMoY29tcG9zZWRNb2RlbFByb3BzKS5maWx0ZXIoXG4gICAgKFtfcHJvcE5hbWUsIHByb3BEYXRhXSkgPT4gcHJvcERhdGEuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3JcbiAgKVxuXG4gIGlmIChwcm9wc1dpdGhUb1NuYXBzaG90UHJvY2Vzc29yLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIChzbikgPT4ge1xuICAgIGNvbnN0IG5ld1NuID0geyAuLi5zbiB9XG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BEYXRhXSBvZiBwcm9wc1dpdGhUb1NuYXBzaG90UHJvY2Vzc29yKSB7XG4gICAgICBpZiAocHJvcERhdGEuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3IpIHtcbiAgICAgICAgbmV3U25bcHJvcE5hbWVdID0gcHJvcERhdGEuX2ludGVybmFsLnRvU25hcHNob3RQcm9jZXNzb3Ioc25bcHJvcE5hbWVdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3U25cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ3JlYXRpb25EYXRhLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxQcm9wcyxcbiAgTW9kZWxQcm9wc1RvU2V0dGVyLFxuICBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvU25hcHNob3REYXRhLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBzaGFyZWRJbnRlcm5hbE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3NoYXJlZEludGVybmFsTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2RlbCwgQmFzZU1vZGVsLCBCYXNlTW9kZWxLZXlzLCBNb2RlbElkUHJvcGVydHlOYW1lIH0gZnJvbSBcIi4vQmFzZU1vZGVsXCJcbmltcG9ydCB7IGFzc2VydElzTW9kZWxDbGFzcywgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG5leHBvcnQgdHlwZSBfQ29tcG9zZWRDcmVhdGlvbkRhdGE8XG4gIFN1cGVyTW9kZWwsXG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHNcbj4gPSBTdXBlck1vZGVsIGV4dGVuZHMgQW55TW9kZWxcbiAgPyBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+ICYgTW9kZWxDcmVhdGlvbkRhdGE8U3VwZXJNb2RlbD5cbiAgOiBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgdHlwZSB1c2VkIGJ5IGZyb21TbmFwc2hvdCBiZWZvcmUgcHJvY2Vzc29ycyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgRnJvbVNuYXBzaG90RGVmYXVsdFR5cGU8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4gPVxuICBNb2RlbFByb3BzVG9TbmFwc2hvdENyZWF0aW9uRGF0YTxUUHJvcHM+XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgdHlwZSB1c2VkIGJ5IGdldFNuYXBzaG90IGJlZm9yZSBwcm9jZXNzb3JzIGFyZSBhcHBsaWVkLlxuICovXG5leHBvcnQgdHlwZSBUb1NuYXBzaG90RGVmYXVsdFR5cGU8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4gPSBNb2RlbFByb3BzVG9TbmFwc2hvdERhdGE8VFByb3BzPlxuXG5leHBvcnQgdHlwZSBfTW9kZWxJZDxTdXBlck1vZGVsLCBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPiA9IFN1cGVyTW9kZWwgZXh0ZW5kcyBBbnlNb2RlbFxuICA/IE1vZGVsSWRQcm9wZXJ0eU5hbWU8U3VwZXJNb2RlbD5cbiAgOiBFeHRyYWN0TW9kZWxJZFByb3A8VFByb3BzPiAmIHN0cmluZ1xuXG5leHBvcnQgaW50ZXJmYWNlIF9Nb2RlbDxcbiAgU3VwZXJNb2RlbCxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgRnJvbVNuYXBzaG90T3ZlcnJpZGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUb1NuYXBzaG90T3ZlcnJpZGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+IHtcbiAgbmV3IChkYXRhOiBfQ29tcG9zZWRDcmVhdGlvbkRhdGE8U3VwZXJNb2RlbCwgVFByb3BzPik6IFN1cGVyTW9kZWwgJlxuICAgIEJhc2VNb2RlbDxUUHJvcHMsIEZyb21TbmFwc2hvdE92ZXJyaWRlLCBUb1NuYXBzaG90T3ZlcnJpZGUsIF9Nb2RlbElkPFN1cGVyTW9kZWwsIFRQcm9wcz4+ICZcbiAgICBPbWl0PE1vZGVsUHJvcHNUb1RyYW5zZm9ybWVkRGF0YTxUUHJvcHM+LCBCYXNlTW9kZWxLZXlzPiAmXG4gICAgTW9kZWxQcm9wc1RvU2V0dGVyPFRQcm9wcz5cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBtb2RlbCBpZCBwcm9wZXJ0eSBmcm9tIHRoZSBtb2RlbCBwcm9wcy5cbiAqL1xuZXhwb3J0IHR5cGUgRXh0cmFjdE1vZGVsSWRQcm9wPFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID0ge1xuICBbSyBpbiBrZXlvZiBUUHJvcHNdOiBUUHJvcHNbS11bXCJfaW50ZXJuYWxcIl1bXCIkaXNJZFwiXSBleHRlbmRzIHRydWUgPyBLIDogbmV2ZXJcbn1ba2V5b2YgVFByb3BzXVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscyB0aGF0IGV4dGVuZHMgYW5vdGhlciBtb2RlbC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBOZXcgbW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHR5cGVwYXJhbSBUTW9kZWxDbGFzcyBNb2RlbCBjbGFzcyB0eXBlLlxuICogQHBhcmFtIGdlbkZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYmFzZSBtb2RlbCBhbmQgbW9kZWwgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtb2RlbE9wdGlvbnMgTW9kZWwgb3B0aW9ucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFeHRlbmRlZE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBUTW9kZWxDbGFzcyBleHRlbmRzIEFic3RyYWN0TW9kZWxDbGFzczxBbnlNb2RlbD4sXG4gIEEgZXh0ZW5kcyBbXSxcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KFxuICBnZW5GbjogKC4uLmFyZ3M6IEEpID0+IHtcbiAgICBiYXNlTW9kZWw6IFRNb2RlbENsYXNzXG4gICAgcHJvcHM6IFRQcm9wc1xuICB9LFxuICBtb2RlbE9wdGlvbnM/OiBNb2RlbE9wdGlvbnM8VFByb3BzLCBGUywgVFM+XG4pOiBfTW9kZWw8SW5zdGFuY2VUeXBlPFRNb2RlbENsYXNzPiwgVFByb3BzLCBGUywgVFM+XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgbW9kZWxzIHRoYXQgZXh0ZW5kcyBhbm90aGVyIG1vZGVsLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE5ldyBtb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAdHlwZXBhcmFtIFRNb2RlbENsYXNzIE1vZGVsIGNsYXNzIHR5cGUuXG4gKiBAcGFyYW0gYmFzZU1vZGVsIEJhc2UgbW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFByb3BzIE1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gbW9kZWxPcHRpb25zIE1vZGVsIG9wdGlvbnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWRNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ2xhc3M8QW55TW9kZWw+LFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oXG4gIGJhc2VNb2RlbDogVE1vZGVsQ2xhc3MsXG4gIG1vZGVsUHJvcHM6IFRQcm9wcyxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPEluc3RhbmNlVHlwZTxUTW9kZWxDbGFzcz4sIFRQcm9wcywgRlMsIFRTPiAmIHtcbiAgW1AgaW4gRXhjbHVkZTxrZXlvZiBUTW9kZWxDbGFzcywgXCJwcm90b3R5cGVcIj5dOiBUTW9kZWxDbGFzc1tQXVxufVxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWRNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ2xhc3M8QW55TW9kZWw+LFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4oLi4uYXJnczogYW55W10pOiBfTW9kZWw8SW5zdGFuY2VUeXBlPFRNb2RlbENsYXNzPiwgVFByb3BzLCBGUywgVFM+IHtcbiAgbGV0IGJhc2VNb2RlbFxuICBsZXQgbW9kZWxQcm9wc1xuICBsZXQgbW9kZWxPcHRpb25zXG4gIGlmIChpc01vZGVsQ2xhc3MoYXJnc1swXSkpIHtcbiAgICBiYXNlTW9kZWwgPSBhcmdzWzBdXG4gICAgbW9kZWxQcm9wcyA9IGFyZ3NbMV1cbiAgICBtb2RlbE9wdGlvbnMgPSBhcmdzWzJdXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZ2VuID0gYXJnc1swXSgpXG5cbiAgICBiYXNlTW9kZWwgPSBnZW4uYmFzZU1vZGVsXG4gICAgbW9kZWxQcm9wcyA9IGdlbi5wcm9wc1xuICAgIG1vZGVsT3B0aW9ucyA9IGFyZ3NbMV1cbiAgfVxuXG4gIGFzc2VydElzTW9kZWxDbGFzcyhiYXNlTW9kZWwsIFwiYmFzZU1vZGVsXCIpXG5cbiAgcmV0dXJuIGludGVybmFsTW9kZWwobW9kZWxQcm9wcywgYmFzZU1vZGVsIGFzIGFueSwgbW9kZWxPcHRpb25zKVxufVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIG1vZGVscy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25Jbml0YCBvciBgb25BdHRhY2hlZFRvUm9vdFN0b3JlYCBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEBwYXJhbSBmbk1vZGVsUHJvcHMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgbW9kZWwgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtb2RlbE9wdGlvbnMgTW9kZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBBIGV4dGVuZHMgW10sXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgZm5Nb2RlbFByb3BzOiAoLi4uYXJnczogQSkgPT4gVFByb3BzLFxuICBtb2RlbE9wdGlvbnM/OiBNb2RlbE9wdGlvbnM8VFByb3BzLCBGUywgVFM+XG4pOiBfTW9kZWw8dW5rbm93biwgVFByb3BzLCBGUywgVFM+XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgbW9kZWxzLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkluaXRgIG9yIGBvbkF0dGFjaGVkVG9Sb290U3RvcmVgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHBhcmFtIG1vZGVsUHJvcHMgTW9kZWwgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtb2RlbE9wdGlvbnMgTW9kZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsPFxuICBUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLFxuICBGUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXJcbj4obW9kZWxQcm9wczogVFByb3BzLCBtb2RlbE9wdGlvbnM/OiBNb2RlbE9wdGlvbnM8VFByb3BzLCBGUywgVFM+KTogX01vZGVsPHVua25vd24sIFRQcm9wcywgRlMsIFRTPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIEZTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlclxuPihcbiAgZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzOiAoKCkgPT4gVFByb3BzKSB8IFRQcm9wcyxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPHVua25vd24sIFRQcm9wcywgRlMsIFRTPiB7XG4gIGNvbnN0IG1vZGVsUHJvcHMgPVxuICAgIHR5cGVvZiBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHMoKVxuICAgICAgOiBmbk1vZGVsUHJvcHNPck1vZGVsUHJvcHNcbiAgcmV0dXJuIGludGVybmFsTW9kZWwobW9kZWxQcm9wcywgdW5kZWZpbmVkLCBtb2RlbE9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGludGVybmFsTW9kZWw8XG4gIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHMsXG4gIFRCYXNlTW9kZWwgZXh0ZW5kcyBBbnlNb2RlbCxcbiAgRlMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbmV2ZXIsXG4gIFRTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyXG4+KFxuICBtb2RlbFByb3BzOiBUUHJvcHMsXG4gIGJhc2VNb2RlbDogTW9kZWxDbGFzczxUQmFzZU1vZGVsPiB8IHVuZGVmaW5lZCxcbiAgbW9kZWxPcHRpb25zPzogTW9kZWxPcHRpb25zPFRQcm9wcywgRlMsIFRTPlxuKTogX01vZGVsPFRCYXNlTW9kZWwsIFRQcm9wcywgRlMsIFRTPiB7XG4gIHJldHVybiBzaGFyZWRJbnRlcm5hbE1vZGVsKHtcbiAgICBtb2RlbFByb3BzLFxuICAgIGJhc2VNb2RlbCxcbiAgICB0eXBlOiBcImNsYXNzXCIsXG4gICAgdmFsdWVUeXBlOiBtb2RlbE9wdGlvbnM/LnZhbHVlVHlwZSA/PyBmYWxzZSxcbiAgICBmcm9tU25hcHNob3RQcm9jZXNzb3I6IG1vZGVsT3B0aW9ucz8uZnJvbVNuYXBzaG90UHJvY2Vzc29yLFxuICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IG1vZGVsT3B0aW9ucz8udG9TbmFwc2hvdFByb2Nlc3NvcixcbiAgfSlcbn1cblxuLyoqXG4gKiBNb2RlbCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsT3B0aW9uczxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLCBGUywgVFM+IHtcbiAgLyoqXG4gICAqIEEgdmFsdWUgdHlwZSB3aWxsIGJlIGNsb25lZCBhdXRvbWF0aWNhbGx5IHdoZW4gYmVpbmcgYXR0YWNoZWQgdG8gYSBuZXcgdHJlZS5cbiAgICogVGhlIGRlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIHZhbHVlVHlwZT86IGJvb2xlYW5cblxuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gdGhhdCB3aWxsIGJlIHJ1biB3aGVuIGNvbnZlcnRpbmcgZnJvbSBhIHNuYXBzaG90IHRvIHRoZSBkYXRhIHBhcnQgb2YgdGhlIG1vZGVsLlxuICAgKiBVc2VmdWwgZm9yIGV4YW1wbGUgdG8gZG8gdmVyc2lvbmluZyBhbmQga2VlcCB0aGUgZGF0YSBwYXJ0IHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0gc24gVGhlIGN1c3RvbSBpbnB1dCBzbmFwc2hvdC5cbiAgICogQHJldHVybnMgQW4gaW5wdXQgc25hcHNob3QgdGhhdCBtdXN0IG1hdGNoIHRoZSBleHBlY3RlZCBtb2RlbCBpbnB1dCBzbmFwc2hvdC5cbiAgICovXG4gIGZyb21TbmFwc2hvdFByb2Nlc3Nvcj8oc246IEZTKTogRnJvbVNuYXBzaG90RGVmYXVsdFR5cGU8VFByb3BzPlxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiB0aGF0IHdpbGwgYmUgcnVuIHdoZW4gY29udmVydGluZyB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBtb2RlbCBpbnRvIGEgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBzbiBUaGUgb3V0cHV0IHNuYXBzaG90LlxuICAgKiBAcGFyYW0gbW9kZWxJbnN0YW5jZSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zICBhIGN1c3RvbSBvdXRwdXQgc25hcHNob3QuXG4gICAqL1xuICB0b1NuYXBzaG90UHJvY2Vzc29yPyhzbjogVG9TbmFwc2hvdERlZmF1bHRUeXBlPFRQcm9wcz4sIG1vZGVsSW5zdGFuY2U6IGFueSk6IFRTXG59XG4iLCJpbXBvcnQgeyBIb29rQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbi9ob29rQWN0aW9uc1wiXG5pbXBvcnQgeyB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkIH0gZnJvbSBcIi4uL2FjdGlvbi93cmFwSW5BY3Rpb25cIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwgfSBmcm9tIFwiLi4vZGF0YU1vZGVsL0Jhc2VEYXRhTW9kZWxcIlxuaW1wb3J0IHsgaXNEYXRhTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhTW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnIH0gZnJvbSBcIi4uL2dsb2JhbENvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Jhc2VNb2RlbFwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCJcbmltcG9ydCB7IE1vZGVsQ2xhc3MsIG1vZGVsSW5pdGlhbGl6ZWRTeW1ib2wgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MsIG1vZGVsSW5mb0J5TmFtZSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9tb2RlbEluZm9cIlxuaW1wb3J0IHtcbiAgbW9kZWxVbndyYXBwZWRDbGFzc1N5bWJvbCxcbiAgcnVuQWZ0ZXJNb2RlbERlY29yYXRvclN5bWJvbCxcbn0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsU3ltYm9sc1wiXG5pbXBvcnQge1xuICBhZGRIaWRkZW5Qcm9wLFxuICBmYWlsdXJlLFxuICBnZXRNb2J4VmVyc2lvbixcbiAgbG9nV2FybmluZyxcbiAgbW9ieDYsXG4gIHJ1bkFmdGVyTmV3U3ltYm9sLFxuICBydW5CZWZvcmVPbkluaXRTeW1ib2wsXG4gIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyxcbn0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBtYXJrcyB0aGlzIGNsYXNzICh3aGljaCBNVVNUIGluaGVyaXQgZnJvbSB0aGUgYE1vZGVsYCBvciBgRGF0YU1vZGVsYCBhYnN0cmFjdCBjbGFzc2VzKVxuICogYXMgYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gbmFtZSBVbmlxdWUgbmFtZSBmb3IgdGhlIG1vZGVsIHR5cGUuIE5vdGUgdGhhdCB0aGlzIG5hbWUgbXVzdCBiZSB1bmlxdWUgZm9yIHlvdXIgd2hvbGVcbiAqIGFwcGxpY2F0aW9uLCBzbyBpdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvIHVzZSBzb21lIHByZWZpeCB1bmlxdWUgdG8geW91ciBhcHBsaWNhdGlvbiBkb21haW4uXG4gKi9cbmV4cG9ydCBjb25zdCBtb2RlbCA9XG4gIChuYW1lOiBzdHJpbmcpID0+XG4gIDxNQyBleHRlbmRzIE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+PihjbGF6ejogTUMpOiBNQyA9PiB7XG4gICAgcmV0dXJuIGludGVybmFsTW9kZWwobmFtZSkoY2xhenopXG4gIH1cblxuY29uc3QgaW50ZXJuYWxNb2RlbCA9XG4gIChuYW1lOiBzdHJpbmcpID0+XG4gIDxNQyBleHRlbmRzIE1vZGVsQ2xhc3M8QW55TW9kZWwgfCBBbnlEYXRhTW9kZWw+PihjbGF6ejogTUMpOiBNQyA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGlzTW9kZWxDbGFzcyhjbGF6eikgPyBcImNsYXNzXCIgOiBpc0RhdGFNb2RlbENsYXNzKGNsYXp6KSA/IFwiZGF0YVwiIDogdW5kZWZpbmVkXG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBjbGF6eiBtdXN0IGJlIGEgY2xhc3MgdGhhdCBleHRlbmRzIGZyb20gTW9kZWwvRGF0YU1vZGVsYClcbiAgICB9XG5cbiAgICBpZiAobW9kZWxJbmZvQnlOYW1lW25hbWVdKSB7XG4gICAgICBpZiAoZ2V0R2xvYmFsQ29uZmlnKCkuc2hvd0R1cGxpY2F0ZU1vZGVsTmFtZVdhcm5pbmdzKSB7XG4gICAgICAgIGxvZ1dhcm5pbmcoXG4gICAgICAgICAgXCJ3YXJuXCIsXG4gICAgICAgICAgYGEgbW9kZWwgd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzIChpZiB5b3UgYXJlIHVzaW5nIGhvdC1yZWxvYWRpbmcgeW91IG1heSBzYWZlbHkgaWdub3JlIHRoaXMgd2FybmluZylgLFxuICAgICAgICAgIGBkdXBsaWNhdGVNb2RlbE5hbWUgLSAke25hbWV9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2wgaW4gY2xhenopIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIGNsYXNzIGFscmVhZHkgZGVjb3JhdGVkIHdpdGggYEBtb2RlbGAgY2Fubm90IGJlIHJlLWRlY29yYXRlZFwiKVxuICAgIH1cblxuICAgIC8vIHRyYWNrIGlmIHdlIGZhaWwgc28gd2Ugb25seSB0cnkgaXQgb25jZSBwZXIgY2xhc3NcbiAgICBsZXQgbWFrZU9ic2VydmFibGVGYWlsZWQgPSBmYWxzZVxuXG4gICAgLy8gdHJpY2sgc28gcGxhaW4gbmV3IHdvcmtzXG4gICAgY29uc3QgbmV3Q2xheno6IGFueSA9IGZ1bmN0aW9uICh0aGlzOiBhbnksIGluaXRpYWxEYXRhOiBhbnksIG1vZGVsQ29uc3RydWN0b3JPcHRpb25zOiBhbnkpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IChjbGF6eiBhcyBhbnkpKGluaXRpYWxEYXRhLCBtb2RlbENvbnN0cnVjdG9yT3B0aW9ucylcblxuICAgICAgLy8gc2V0IG9yIGVsc2UgaXQgcG9pbnRzIHRvIHRoZSB1bmRlY29yYXRlZCBjbGFzc1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBuZXdDbGF6eixcbiAgICAgIH0pXG5cbiAgICAgIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyhpbnN0YW5jZSwgcnVuQWZ0ZXJOZXdTeW1ib2wpXG5cbiAgICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBtb2J4IDZcbiAgICAgIGlmICghbWFrZU9ic2VydmFibGVGYWlsZWQgJiYgZ2V0TW9ieFZlcnNpb24oKSA+PSA2KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbW9ieDYubWFrZU9ic2VydmFibGUoaW5zdGFuY2UpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBzYWRseSB3ZSBuZWVkIHRvIHVzZSB0aGlzIGhhY2sgc2luY2UgdGhlIFBSIHRvIGRvIHRoaXMgdGhlIHByb3BlciB3YXlcbiAgICAgICAgICAvLyB3YXMgcmVqZWN0ZWQgb24gdGhlIG1vYnggc2lkZVxuICAgICAgICAgIG1ha2VPYnNlcnZhYmxlRmFpbGVkID0gdHJ1ZVxuXG4gICAgICAgICAgY29uc3QgZXJyID0gZSBhcyBFcnJvclxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVyci5tZXNzYWdlICE9PVxuICAgICAgICAgICAgICBcIltNb2JYXSBObyBhbm5vdGF0aW9ucyB3ZXJlIHBhc3NlZCB0byBtYWtlT2JzZXJ2YWJsZSwgYnV0IG5vIGRlY29yYXRvciBtZW1iZXJzIGhhdmUgYmVlbiBmb3VuZCBlaXRoZXJcIiAmJlxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgIT09XG4gICAgICAgICAgICAgIFwiW01vYlhdIE5vIGFubm90YXRpb25zIHdlcmUgcGFzc2VkIHRvIG1ha2VPYnNlcnZhYmxlLCBidXQgbm8gZGVjb3JhdGVkIG1lbWJlcnMgaGF2ZSBiZWVuIGZvdW5kIGVpdGhlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdGhlIG9iamVjdCBpcyByZWFkeVxuICAgICAgYWRkSGlkZGVuUHJvcChpbnN0YW5jZSwgbW9kZWxJbml0aWFsaXplZFN5bWJvbCwgdHJ1ZSwgZmFsc2UpXG5cbiAgICAgIHJ1bkxhdGVJbml0aWFsaXphdGlvbkZ1bmN0aW9ucyhpbnN0YW5jZSwgcnVuQmVmb3JlT25Jbml0U3ltYm9sKVxuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjbGFzc1wiICYmIGluc3RhbmNlLm9uSW5pdCkge1xuICAgICAgICB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkKGluc3RhbmNlLCBcIm9uSW5pdFwiLCBIb29rQWN0aW9uLk9uSW5pdClcblxuICAgICAgICBpbnN0YW5jZS5vbkluaXQoKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gXCJkYXRhXCIgJiYgaW5zdGFuY2Uub25MYXp5SW5pdCkge1xuICAgICAgICB3cmFwTW9kZWxNZXRob2RJbkFjdGlvbklmTmVlZGVkKGluc3RhbmNlLCBcIm9uTGF6eUluaXRcIiwgSG9va0FjdGlvbi5PbkxhenlJbml0KVxuXG4gICAgICAgIGluc3RhbmNlLm9uTGF6eUluaXQoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICB9XG5cbiAgICBjbGF6ei50b1N0cmluZyA9ICgpID0+IGBjbGFzcyAke2NsYXp6Lm5hbWV9IyR7bmFtZX1gXG4gICAgaWYgKHR5cGUgPT09IFwiY2xhc3NcIikge1xuICAgICAgOyhjbGF6eiBhcyBhbnkpW21vZGVsVHlwZUtleV0gPSBuYW1lXG4gICAgfVxuXG4gICAgLy8gdGhpcyBhbHNvIGdpdmVzIGFjY2VzcyB0byBtb2RlbEluaXRpYWxpemVyc1N5bWJvbCwgbW9kZWxQcm9wZXJ0aWVzU3ltYm9sLCBtb2RlbERhdGFUeXBlQ2hlY2tlclN5bWJvbFxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdDbGF6eiwgY2xhenopXG4gICAgbmV3Q2xhenoucHJvdG90eXBlID0gY2xhenoucHJvdG90eXBlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q2xhenosIFwibmFtZVwiLCB7XG4gICAgICAuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5ld0NsYXp6LCBcIm5hbWVcIiksXG4gICAgICB2YWx1ZTogY2xhenoubmFtZSxcbiAgICB9KVxuICAgIG5ld0NsYXp6W21vZGVsVW53cmFwcGVkQ2xhc3NTeW1ib2xdID0gY2xhenpcblxuICAgIGNvbnN0IG1vZGVsSW5mbyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBjbGFzczogbmV3Q2xhenosXG4gICAgfVxuXG4gICAgbW9kZWxJbmZvQnlOYW1lW25hbWVdID0gbW9kZWxJbmZvXG5cbiAgICBtb2RlbEluZm9CeUNsYXNzLnNldChuZXdDbGF6eiwgbW9kZWxJbmZvKVxuICAgIG1vZGVsSW5mb0J5Q2xhc3Muc2V0KGNsYXp6LCBtb2RlbEluZm8pXG5cbiAgICBydW5MYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbnMoY2xhenosIHJ1bkFmdGVyTW9kZWxEZWNvcmF0b3JTeW1ib2wpXG5cbiAgICByZXR1cm4gbmV3Q2xhenpcbiAgfVxuXG4vLyBiYXNpY2FsbHkgdGFrZW4gZnJvbSBUU1xuZnVuY3Rpb24gdHNEZWNvcmF0ZShkZWNvcmF0b3JzOiBhbnksIHRhcmdldDogYW55LCBrZXk6IGFueSwgZGVzYzogYW55KSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICByID1cbiAgICAgIGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpIDogZGVzYyxcbiAgICBkXG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKFJlZmxlY3QgYXMgYW55KS5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSAoUmVmbGVjdCBhcyBhbnkpLmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKVxuICBlbHNlXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICBpZiAoKGQgPSBkZWNvcmF0b3JzW2ldKSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlcXVlbmNlc1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByXG59XG5cbi8qKlxuICogTWFya3MgYSBjbGFzcyAod2hpY2ggTVVTVCBpbmhlcml0IGZyb20gdGhlIGBNb2RlbGAgYWJzdHJhY3QgY2xhc3MpXG4gKiBhcyBhIG1vZGVsIGFuZCBkZWNvcmF0ZXMgc29tZSBvZiBpdHMgbWV0aG9kcy9wcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBuYW1lIFVuaXF1ZSBuYW1lIGZvciB0aGUgbW9kZWwgdHlwZS4gTm90ZSB0aGF0IHRoaXMgbmFtZSBtdXN0IGJlIHVuaXF1ZSBmb3IgeW91ciB3aG9sZVxuICogYXBwbGljYXRpb24sIHNvIGl0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgdG8gdXNlIHNvbWUgcHJlZml4IHVuaXF1ZSB0byB5b3VyIGFwcGxpY2F0aW9uIGRvbWFpbi5cbiAqIElmIHlvdSBkb24ndCB3YW50IHRvIGFzc2lnbiBhIG5hbWUgeWV0IChlLmcuIGZvciBhIGJhc2UgbW9kZWwpIHBhc3MgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0gY2xhenogTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGVkTW9kZWw8TSwgTUMgZXh0ZW5kcyBhYnN0cmFjdCBuZXcgKC4uLmFnczogYW55KSA9PiBNPihcbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjbGF6ejogTUMsXG4gIGRlY29yYXRvcnM6IHtcbiAgICBbayBpbiBrZXlvZiBNXT86ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBSZWFkb25seUFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gYW55PlxuICB9XG4pOiBNQyB7XG4gIC8vIGRlY29yYXRlIGNsYXNzIG1lbWJlcnNcbiAgZm9yIChjb25zdCBbaywgZGVjb3JhdG9yXSBvZiBPYmplY3QuZW50cmllcyhkZWNvcmF0b3JzKSkge1xuICAgIGNvbnN0IHByb3RvdHlwZVZhbHVlRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2xhenoucHJvdG90eXBlLCBrKVxuICAgIC8vIFRTIHNlZW1zIHRvIHNlbmQgbnVsbCBmb3IgbWV0aG9kcyBpbiB0aGUgcHJvdG90eXBlXG4gICAgLy8gKHdoaWNoIHdlIHN1YnN0aXR1dGUgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGF2b2lkIGEgZG91YmxlIGxvb2stdXApIGFuZCB2b2lkIDAgKHVuZGVmaW5lZCkgZm9yIHByb3BzXG4gICAgdHNEZWNvcmF0ZShcbiAgICAgIEFycmF5LmlzQXJyYXkoZGVjb3JhdG9yKSA/IGRlY29yYXRvciA6IFtkZWNvcmF0b3JdLFxuICAgICAgY2xhenoucHJvdG90eXBlLFxuICAgICAgayxcbiAgICAgIHByb3RvdHlwZVZhbHVlRGVzYyA/IHByb3RvdHlwZVZhbHVlRGVzYyA6IHZvaWQgMFxuICAgIClcbiAgfVxuXG4gIHJldHVybiAobmFtZSA/IG1vZGVsKG5hbWUpKGNsYXp6IGFzIHVua25vd24gYXMgTW9kZWxDbGFzczxBbnlNb2RlbD4pIDogY2xhenopIGFzIE1DXG59XG4iLCJpbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcclxuaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxyXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIEFycmF5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcclxuaW1wb3J0IHtcclxuICBsYXRlVHlwZUNoZWNrZXIsXHJcbiAgVHlwZUNoZWNrZXIsXHJcbiAgVHlwZUNoZWNrZXJCYXNlVHlwZSxcclxuICBUeXBlSW5mbyxcclxuICBUeXBlSW5mb0dlbixcclxufSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxyXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXHJcblxyXG4vKipcclxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgYSBnaXZlbiB0eXBlLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCBudW1iZXJBcnJheVR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5udW1iZXIpXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgSXRlbSB0eXBlLlxyXG4gKiBAcGFyYW0gaXRlbVR5cGUgVHlwZSBvZiBpbm5lciBpdGVtcy5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0FycmF5PFQgZXh0ZW5kcyBBbnlUeXBlPihpdGVtVHlwZTogVCk6IEFycmF5VHlwZTxUW10+IHtcclxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IEFycmF5VHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZShpdGVtVHlwZSkpXHJcblxyXG4gIHJldHVybiBsYXRlVHlwZUNoZWNrZXIoKCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoaXRlbVR5cGUpXHJcblxyXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PlxyXG4gICAgICBgQXJyYXk8JHtpdGVtQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIGl0ZW1DaGVja2VyKX0+YFxyXG5cclxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuQXJyYXksXHJcblxyXG4gICAgICAoYXJyYXksIHBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWlzQXJyYXkoYXJyYXkpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIGFycmF5KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpdGVtQ2hlY2tlci51bmNoZWNrZWQpIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUVycm9yID0gaXRlbUNoZWNrZXIuY2hlY2soYXJyYXlbaV0sIFsuLi5wYXRoLCBpXSlcclxuICAgICAgICAgICAgaWYgKGl0ZW1FcnJvcikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtRXJyb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgfSxcclxuICAgICAgZ2V0VHlwZU5hbWUsXHJcbiAgICAgIHR5cGVJbmZvR2VuLFxyXG5cclxuICAgICAgKGFycmF5KSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXRlbUNoZWNrZXIudW5jaGVja2VkKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BY3R1YWxDaGVja2VyID0gaXRlbUNoZWNrZXIuc25hcHNob3RUeXBlKGFycmF5W2ldKVxyXG4gICAgICAgICAgICBpZiAoIWl0ZW1BY3R1YWxDaGVja2VyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXNUY1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgKHNuOiB1bmtub3duW10pID0+IHtcclxuICAgICAgICBpZiAoaXRlbUNoZWNrZXIudW5jaGVja2VkKSB7XHJcbiAgICAgICAgICByZXR1cm4gc25cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzbi5tYXAoKGl0ZW0pID0+IGl0ZW1DaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihpdGVtKSlcclxuICAgICAgfSxcclxuXHJcbiAgICAgIChzbjogdW5rbm93bltdKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW1DaGVja2VyLnVuY2hlY2tlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc24ubWFwKChpdGVtKSA9PiBpdGVtQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKGl0ZW0pKVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuIHRoaXNUY1xyXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcclxufVxyXG5cclxuLyoqXHJcbiAqIGB0eXBlcy5hcnJheWAgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEFycmF5VHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XHJcbiAgZ2V0IGl0ZW1UeXBlSW5mbygpOiBUeXBlSW5mbyB7XHJcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy5pdGVtVHlwZSlcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IGl0ZW1UeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHtcclxuICAgIHN1cGVyKHRoaXNUeXBlKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNvbXB1dGVkIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHR5cGUgeyBBY3Rpb25NaWRkbGV3YXJlRGlzcG9zZXIgfSBmcm9tIFwiLi4vYWN0aW9uL21pZGRsZXdhcmVcIlxuaW1wb3J0IHsgbW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsQWN0aW9uXCJcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCJcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsRGVjb3JhdG9yXCJcbmltcG9ydCB7IGZhc3RHZXRSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMsIFBhdGNoLCBwYXRjaFJlY29yZGVyLCBQYXRjaFJlY29yZGVyIH0gZnJvbSBcIi4uL3BhdGNoXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IHR5cGVzQXJyYXkgfSBmcm9tIFwiLi4vdHlwZXMvYXJyYXlCYXNlZC90eXBlc0FycmF5XCJcbmltcG9ydCB7IHRQcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3RQcm9wXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkIH0gZnJvbSBcIi4uL3R5cGVzL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWRcIlxuaW1wb3J0IHsgZmFpbHVyZSwgZ2V0TW9ieFZlcnNpb24sIG1vYng2LCBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlLCBTaW1wbGVBY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlXCJcblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gZXZlbnQgd2l0aG91dCBhdHRhY2hlZCBzdGF0ZS5cbiAqL1xuZXhwb3J0IHR5cGUgVW5kb0V2ZW50V2l0aG91dEF0dGFjaGVkU3RhdGUgPSBVbmRvU2luZ2xlRXZlbnQgfCBVbmRvRXZlbnRHcm91cFxuXG4vKipcbiAqIEFuIHVuZG8vcmVkbyBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgVW5kb0V2ZW50ID0gVW5kb0V2ZW50V2l0aG91dEF0dGFjaGVkU3RhdGUgJiB7XG4gIC8qKlxuICAgKiBUaGUgc3RhdGUgc2F2ZWQgYmVmb3JlIHRoZSBldmVudCBhY3Rpb25zIHN0YXJ0ZWQgLyBhZnRlciB0aGUgZXZlbnQgYWN0aW9ucyBmaW5pc2hlZC5cbiAgICovXG4gIGF0dGFjaGVkU3RhdGU6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgc2F2ZWQgYmVmb3JlIHRoZSBldmVudCBhY3Rpb25zIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgYmVmb3JlRXZlbnQ/OiB1bmtub3duXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIHNhdmVkIGFmdGVyIHRoZSBldmVudCBhY3Rpb25zIGZpbmlzaGVkLlxuICAgICAqL1xuICAgIGFmdGVyRXZlbnQ/OiB1bmtub3duXG4gIH1cbn1cblxuLyoqXG4gKiBVbmRvIGV2ZW50IHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIFVuZG9FdmVudFR5cGUge1xuICBTaW5nbGUgPSBcInNpbmdsZVwiLFxuICBHcm91cCA9IFwiZ3JvdXBcIixcbn1cblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gc2luZ2xlIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuZG9TaW5nbGVFdmVudCB7XG4gIC8qKlxuICAgKiBFeHByZXNzZXMgdGhpcyBpcyBhIHNpbmdsZSBldmVudC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFVuZG9FdmVudFR5cGUuU2luZ2xlXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBvYmplY3QgdGhhdCBpbnZva2VkIHRoZSBhY3Rpb24gZnJvbSBpdHMgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGg6IFBhdGhcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IHdhcyBpbnZva2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdpdGggY2hhbmdlcyBkb25lIGluc2lkZSB0aGUgYWN0aW9uLlxuICAgKiBVc2UgYHJlZG8oKWAgaW4gdGhlIGBVbmRvTWFuYWdlcmAgdG8gYXBwbHkgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoZXM6IFJlYWRvbmx5QXJyYXk8UGF0Y2g+XG4gIC8qKlxuICAgKiBQYXRjaGVzIHRvIHVuZG8gdGhlIGNoYW5nZXMgZG9uZSBpbnNpZGUgdGhlIGFjdGlvbi5cbiAgICogVXNlIGB1bmRvKClgIGluIHRoZSBgVW5kb01hbmFnZXJgIHRvIGFwcGx5IHRoZW0uXG4gICAqL1xuICByZWFkb25seSBpbnZlcnNlUGF0Y2hlczogUmVhZG9ubHlBcnJheTxQYXRjaD5cbn1cblxuLyoqXG4gKiBBbiB1bmRvL3JlZG8gZXZlbnQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5kb0V2ZW50R3JvdXAge1xuICAvKipcbiAgICogRXhwcmVzc2VzIHRoaXMgaXMgYW4gZXZlbnQgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBVbmRvRXZlbnRUeXBlLkdyb3VwXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBncm91cCAoaWYgYW55KS5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3VwTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogRXZlbnRzIHRoYXQgY29uZm9ybSB0aGlzIGdyb3VwIChtaWdodCBiZSBzaW5nbGUgZXZlbnRzIG9yIG90aGVyIG5lc3RlZCBncm91cHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzOiBSZWFkb25seUFycmF5PFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlPlxufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUV2ZW50cyhcbiAgZXZlbnQ6IFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlLFxuICByZXZlcnNlOiBib29sZWFuXG4pOiBSZWFkb25seUFycmF5PFVuZG9TaW5nbGVFdmVudD4ge1xuICBpZiAoZXZlbnQudHlwZSA9PT0gVW5kb0V2ZW50VHlwZS5TaW5nbGUpIHJldHVybiBbZXZlbnRdXG4gIGVsc2Uge1xuICAgIGNvbnN0IGFycmF5OiBVbmRvU2luZ2xlRXZlbnRbXSA9IFtdXG4gICAgZm9yIChjb25zdCBlIG9mIGV2ZW50LmV2ZW50cykge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgYXJyYXkudW5zaGlmdCguLi50b1NpbmdsZUV2ZW50cyhlLCB0cnVlKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5LnB1c2goLi4udG9TaW5nbGVFdmVudHMoZSwgZmFsc2UpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlcbiAgfVxufVxuXG4vKipcbiAqIFN0b3JlIG1vZGVsIGluc3RhbmNlIGZvciB1bmRvL3JlZG8gYWN0aW9ucy5cbiAqIERvIG5vdCBtYW5pcHVsYXRlIGRpcmVjdGx5LCBvdGhlciB0aGF0IGNyZWF0aW5nIGl0LlxuICovXG5AbW9kZWwoYCR7bmFtZXNwYWNlfS9VbmRvU3RvcmVgKVxuZXhwb3J0IGNsYXNzIFVuZG9TdG9yZSBleHRlbmRzIE1vZGVsKHtcbiAgLy8gVE9ETzogYWRkIHByb3BlciB0eXBlIGNoZWNraW5nIHRvIHVuZG8gc3RvcmVcbiAgdW5kb0V2ZW50czogdFByb3AodHlwZXNBcnJheSh0eXBlc1VuY2hlY2tlZDxVbmRvRXZlbnQ+KCkpLCAoKSA9PiBbXSksXG4gIHJlZG9FdmVudHM6IHRQcm9wKHR5cGVzQXJyYXkodHlwZXNVbmNoZWNrZWQ8VW5kb0V2ZW50PigpKSwgKCkgPT4gW10pLFxufSkge1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQG1vZGVsQWN0aW9uXG4gIF9jbGVhclVuZG8oKSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgdGhpcy51bmRvRXZlbnRzLmxlbmd0aCA9IDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfY2xlYXJSZWRvKCkge1xuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIHRoaXMucmVkb0V2ZW50cy5sZW5ndGggPSAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAbW9kZWxBY3Rpb25cbiAgX3VuZG8oKSB7XG4gICAgd2l0aG91dFVuZG8oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnVuZG9FdmVudHMucG9wKCkhXG4gICAgICB0aGlzLnJlZG9FdmVudHMucHVzaChldmVudClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBtb2RlbEFjdGlvblxuICBfcmVkbygpIHtcbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHRoaXMucmVkb0V2ZW50cy5wb3AoKSFcbiAgICAgIHRoaXMudW5kb0V2ZW50cy5wdXNoKGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQG1vZGVsQWN0aW9uXG4gIF9hZGRVbmRvKGV2ZW50OiBVbmRvRXZlbnQpIHtcbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0aGlzLnVuZG9FdmVudHMucHVzaChldmVudClcbiAgICAgIC8vIG9uY2UgYW4gdW5kbyBldmVudCBpcyBhZGRlZCByZWRvIHF1ZXVlIGlzIG5vIGxvbmdlciB2YWxpZFxuICAgICAgdGhpcy5yZWRvRXZlbnRzLmxlbmd0aCA9IDBcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBfZ3JvdXBTdGFjazogVW5kb0V2ZW50R3JvdXBbXSA9IFtdXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIF9hZGRVbmRvVG9QYXJlbnRHcm91cChwYXJlbnRHcm91cDogVW5kb0V2ZW50R3JvdXAsIGV2ZW50OiBVbmRvRXZlbnRXaXRob3V0QXR0YWNoZWRTdGF0ZSkge1xuICAgIDsocGFyZW50R3JvdXAuZXZlbnRzIGFzIFVuZG9FdmVudFdpdGhvdXRBdHRhY2hlZFN0YXRlW10pLnB1c2goZXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ2V0IF9jdXJyZW50R3JvdXAoKTogVW5kb0V2ZW50R3JvdXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ncm91cFN0YWNrW3RoaXMuX2dyb3VwU3RhY2subGVuZ3RoIC0gMV1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBfc3RhcnRHcm91cChcbiAgICBncm91cE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdGFydFJ1bm5pbmc6IGJvb2xlYW4sXG4gICAgb3B0aW9uczogVW5kb01pZGRsZXdhcmVPcHRpb25zPHVua25vd24+IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGxldCBydW5uaW5nID0gZmFsc2VcbiAgICBsZXQgZW5kZWQgPSBmYWxzZVxuICAgIGNvbnN0IHBhcmVudEdyb3VwID0gdGhpcy5fY3VycmVudEdyb3VwXG5cbiAgICBjb25zdCBncm91cDogVW5kb0V2ZW50R3JvdXAgPSB7XG4gICAgICB0eXBlOiBVbmRvRXZlbnRUeXBlLkdyb3VwLFxuICAgICAgZ3JvdXBOYW1lLFxuICAgICAgZXZlbnRzOiBbXSxcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQgPSBwYXJlbnRHcm91cCA/IHVuZGVmaW5lZCA6IG9wdGlvbnM/LmF0dGFjaGVkU3RhdGU/LnNhdmUoKVxuXG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgcGF1c2U6ICgpID0+IHtcbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBwYXVzZSBhIGdyb3VwIHdoZW4gaXQgaXMgYWxyZWFkeSBlbmRlZFwiKVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVubmluZykge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcGF1c2UgYSBncm91cCB3aGVuIGl0IGlzIG5vdCBydW5uaW5nXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRHcm91cCAhPT0gZ3JvdXApIHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiZ3JvdXAgb3V0IG9mIG9yZGVyXCIpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ3JvdXBTdGFjay5wb3AoKVxuICAgICAgICBydW5uaW5nID0gZmFsc2VcbiAgICAgIH0sXG4gICAgICByZXN1bWU6ICgpID0+IHtcbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCByZXN1bWUgYSBncm91cCB3aGVuIGl0IGlzIGFscmVhZHkgZW5kZWRcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVzdW1lIGEgZ3JvdXAgd2hlbiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmdcIilcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ncm91cFN0YWNrLnB1c2goZ3JvdXApXG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlXG4gICAgICB9LFxuICAgICAgZW5kOiAoKSA9PiB7XG4gICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgYXBpLnBhdXNlKClcbiAgICAgICAgfVxuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgaWYgKHBhcmVudEdyb3VwKSB7XG4gICAgICAgICAgdGhpcy5fYWRkVW5kb1RvUGFyZW50R3JvdXAocGFyZW50R3JvdXAsIGdyb3VwKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2FkZFVuZG8oe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBhdHRhY2hlZFN0YXRlOiB7XG4gICAgICAgICAgICAgIGJlZm9yZUV2ZW50OiBhdHRhY2hlZFN0YXRlQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICAgIGFmdGVyRXZlbnQ6IG9wdGlvbnM/LmF0dGFjaGVkU3RhdGU/LnNhdmUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRSdW5uaW5nKSB7XG4gICAgICBhcGkucmVzdW1lKClcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpXG4gIH1cbn1cblxuLyoqXG4gKiBNYW5hZ2VyIGNsYXNzIHJldHVybmVkIGJ5IGB1bmRvTWlkZGxld2FyZWAgdGhhdCBhbGxvd3MgeW91IHRvIHBlcmZvcm0gdW5kby9yZWRvIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmRvTWFuYWdlciB7XG4gIC8qKlxuICAgKiBUaGUgc3RvcmUgY3VycmVudGx5IGJlaW5nIHVzZWQgdG8gc3RvcmUgdW5kby9yZWRvIGFjdGlvbiBldmVudHMuXG4gICAqL1xuICByZWFkb25seSBzdG9yZTogVW5kb1N0b3JlXG5cbiAgLyoqXG4gICAqIFRoZSB1bmRvIHN0YWNrLCB3aGVyZSB0aGUgZmlyc3Qgb3BlcmF0aW9uIHRvIHVuZG8gd2lsbCBiZSB0aGUgbGFzdCBvZiB0aGUgYXJyYXkuXG4gICAqIERvIG5vdCBtYW5pcHVsYXRlIHRoaXMgYXJyYXkgZGlyZWN0bHkuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHVuZG9RdWV1ZSgpOiBSZWFkb25seUFycmF5PFVuZG9FdmVudD4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnVuZG9FdmVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkbyBzdGFjaywgd2hlcmUgdGhlIGZpcnN0IG9wZXJhdGlvbiB0byByZWRvIHdpbGwgYmUgdGhlIGxhc3Qgb2YgdGhlIGFycmF5LlxuICAgKiBEbyBub3QgbWFuaXB1bGF0ZSB0aGlzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCByZWRvUXVldWUoKTogUmVhZG9ubHlBcnJheTxVbmRvRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5yZWRvRXZlbnRzXG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB1bmRvIGFjdGlvbnMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB1bmRvTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnVuZG9RdWV1ZS5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB1bmRvIGNhbiBiZSBwZXJmb3JtZWQgKGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB1bmRvIGFjdGlvbiBhdmFpbGFibGUpLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCBjYW5VbmRvKCkge1xuICAgIHJldHVybiB0aGlzLnVuZG9MZXZlbHMgPiAwXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSB1bmRvIHF1ZXVlLlxuICAgKi9cbiAgQGFjdGlvblxuICBjbGVhclVuZG8oKSB7XG4gICAgdGhpcy5zdG9yZS5fY2xlYXJVbmRvKClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJlZG8gYWN0aW9ucyBhdmFpbGFibGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHJlZG9MZXZlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVkb1F1ZXVlLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIElmIHJlZG8gY2FuIGJlIHBlcmZvcm1lZCAoaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZG8gYWN0aW9uIGF2YWlsYWJsZSlcbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgY2FuUmVkbygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWRvTGV2ZWxzID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcmVkbyBxdWV1ZS5cbiAgICovXG4gIEBhY3Rpb25cbiAgY2xlYXJSZWRvKCkge1xuICAgIHRoaXMuc3RvcmUuX2NsZWFyUmVkbygpXG4gIH1cblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbi5cbiAgICogV2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBubyBhY3Rpb24gdG8gdW5kby5cbiAgICovXG4gIEBhY3Rpb25cbiAgdW5kbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuVW5kbykge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIm5vdGhpbmcgdG8gdW5kb1wiKVxuICAgIH1cbiAgICBjb25zdCBldmVudCA9IHRoaXMudW5kb1F1ZXVlW3RoaXMudW5kb1F1ZXVlLmxlbmd0aCAtIDFdXG5cbiAgICB3aXRob3V0VW5kbygoKSA9PiB7XG4gICAgICB0b1NpbmdsZUV2ZW50cyhldmVudCwgdHJ1ZSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdCwgZS5pbnZlcnNlUGF0Y2hlcywgdHJ1ZSlcbiAgICAgIH0pXG5cbiAgICAgIC8vIHJlc3RvcmUgdGhlIGF0dGFjaGVkIHN0YXRlIGJlZm9yZSB0aGUgb3BlcmF0aW9uIHdhcyBtYWRlXG4gICAgICBpZiAoZXZlbnQuYXR0YWNoZWRTdGF0ZT8uYmVmb3JlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5yZXN0b3JlKGV2ZW50LmF0dGFjaGVkU3RhdGUuYmVmb3JlRXZlbnQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuc3RvcmUuX3VuZG8oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgcHJldmlvdXMgYWN0aW9uLlxuICAgKiBXaWxsIHRocm93IGlmIHRoZXJlIGlzIG5vIGFjdGlvbiB0byByZWRvLlxuICAgKi9cbiAgQGFjdGlvblxuICByZWRvKCkge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwibm90aGluZyB0byByZWRvXCIpXG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5yZWRvUXVldWVbdGhpcy5yZWRvUXVldWUubGVuZ3RoIC0gMV1cblxuICAgIHdpdGhvdXRVbmRvKCgpID0+IHtcbiAgICAgIHRvU2luZ2xlRXZlbnRzKGV2ZW50LCBmYWxzZSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdCwgZS5wYXRjaGVzKVxuICAgICAgfSlcblxuICAgICAgLy8gcmVzdG9yZSB0aGUgYXR0YWNoZWQgc3RhdGUgYWZ0ZXIgdGhlIG9wZXJhdGlvbiB3YXMgbWFkZVxuICAgICAgaWYgKGV2ZW50LmF0dGFjaGVkU3RhdGU/LmFmdGVyRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5yZXN0b3JlKGV2ZW50LmF0dGFjaGVkU3RhdGUuYWZ0ZXJFdmVudClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5zdG9yZS5fcmVkbygpXG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIHVuZG8gbWlkZGxld2FyZS5cbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5kaXNwb3NlcigpXG4gIH1cblxuICBwcml2YXRlIF9pc1VuZG9SZWNvcmRpbmdEaXNhYmxlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFJldHVybnMgaWYgdW5kbyByZWNvcmRpbmcgaXMgY3VycmVudGx5IGRpc2FibGVkIG9yIG5vdCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGBVbmRvTWFuYWdlcmAuXG4gICAqL1xuICBnZXQgaXNVbmRvUmVjb3JkaW5nRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkXG4gIH1cblxuICAvKipcbiAgICogU2tpcHMgdGhlIHVuZG8gcmVjb3JkaW5nIG1lY2hhbmlzbSBmb3IgdGhlIGNvZGUgYmxvY2sgdGhhdCBnZXRzIHJ1biBzeW5jaHJvbm91c2x5IGluc2lkZS5cbiAgICpcbiAgICogQHR5cGVwYXJhbSBUIENvZGUgYmxvY2sgcmV0dXJuIHR5cGUuXG4gICAqIEBwYXJhbSBmbiBDb2RlIGJsb2NrIHRvIHJ1bi5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgd2l0aG91dFVuZG88VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBzYXZlZFVuZG9EaXNhYmxlZCA9IHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkXG4gICAgdGhpcy5faXNVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSB0cnVlXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gc2F2ZWRVbmRvRGlzYWJsZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBncm91cCB0aGF0IGNhbiBiZSBjb250aW51ZWQgbXVsdGlwbGUgdGltZXMgYW5kIHRoZW4gZW5kZWQuXG4gICAqIEBwYXJhbSBncm91cE5hbWUgT3B0aW9uYWwgZ3JvdXAgbmFtZS5cbiAgICogQHJldHVybnMgQW4gQVBJIHRvIGNvbnRpbnVlL2VuZCB0aGUgZ3JvdXAuXG4gICAqL1xuICBjcmVhdGVHcm91cChncm91cE5hbWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuc3RvcmUuX3N0YXJ0R3JvdXAoZ3JvdXBOYW1lLCBmYWxzZSwgdGhpcy5vcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRpbnVlPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgICAgIGdyb3VwLnJlc3VtZSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZuKClcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBncm91cC5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVuZCgpIHtcbiAgICAgICAgZ3JvdXAuZW5kKClcbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeW5jaHJvbm91cyBjb2RlIGJsb2NrIGFzIGFuIHVuZG8gZ3JvdXAuXG4gICAqIE5vdGUgdGhhdCBuZXN0ZWQgZ3JvdXBzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JvdXBOYW1lIEdyb3VwIG5hbWUuXG4gICAqIEBwYXJhbSBmbiBDb2RlIGJsb2NrLlxuICAgKiBAcmV0dXJucyBDb2RlIGJsb2NrIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHdpdGhHcm91cDxUPihncm91cE5hbWU6IHN0cmluZywgZm46ICgpID0+IFQpOiBUXG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeW5jaHJvbm91cyBjb2RlIGJsb2NrIGFzIGFuIHVuZG8gZ3JvdXAuXG4gICAqIE5vdGUgdGhhdCBuZXN0ZWQgZ3JvdXBzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAcGFyYW0gZm4gQ29kZSBibG9jay5cbiAgICogQHJldHVybnMgQ29kZSBibG9jayByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB3aXRoR3JvdXA8VD4oZm46ICgpID0+IFQpOiBUXG5cbiAgd2l0aEdyb3VwPFQ+KGFyZzE6IGFueSwgYXJnMj86IGFueSk6IFQge1xuICAgIGxldCBncm91cE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGxldCBmbjogKCkgPT4gVFxuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZ3JvdXBOYW1lID0gYXJnMVxuICAgICAgZm4gPSBhcmcyXG4gICAgfSBlbHNlIHtcbiAgICAgIGZuID0gYXJnMVxuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5zdG9yZS5fc3RhcnRHcm91cChncm91cE5hbWUsIHRydWUsIHRoaXMub3B0aW9ucylcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ3JvdXAuZW5kKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhbiBhc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwTmFtZSBHcm91cCBuYW1lLlxuICAgKiBAcGFyYW0gZm4gRmxvdyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgRmxvdyBmdW5jdGlvbiByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB3aXRoR3JvdXBGbG93PFI+KGdyb3VwTmFtZTogc3RyaW5nLCBmbjogKCkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55Pik6IFByb21pc2U8Uj5cblxuICAvKipcbiAgICogUnVucyBhbiBhc3luY2hyb25vdXMgY29kZSBibG9jayBhcyBhbiB1bmRvIGdyb3VwLlxuICAgKiBOb3RlIHRoYXQgbmVzdGVkIGdyb3VwcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIGZuIEZsb3cgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIEZsb3cgZnVuY3Rpb24gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgd2l0aEdyb3VwRmxvdzxSPihmbjogKCkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55Pik6IFByb21pc2U8Uj5cblxuICB3aXRoR3JvdXBGbG93PFI+KGFyZzE6IGFueSwgYXJnMj86IGFueSk6IFByb21pc2U8Uj4ge1xuICAgIGxldCBncm91cE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGxldCBmbjogKCkgPT4gR2VuZXJhdG9yPGFueSwgUiwgYW55PlxuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZ3JvdXBOYW1lID0gYXJnMVxuICAgICAgZm4gPSBhcmcyXG4gICAgfSBlbHNlIHtcbiAgICAgIGZuID0gYXJnMVxuICAgIH1cblxuICAgIGNvbnN0IGdlbiA9IGZuKClcblxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5zdG9yZS5fc3RhcnRHcm91cChncm91cE5hbWUsIGZhbHNlLCB0aGlzLm9wdGlvbnMpXG5cbiAgICAvLyB1c2UgYm91bmQgZnVuY3Rpb25zIHRvIGZpeCBlczYgY29tcGlsYXRpb25cbiAgICBjb25zdCBnZW5OZXh0ID0gZ2VuLm5leHQuYmluZChnZW4pXG4gICAgY29uc3QgZ2VuVGhyb3cgPSBnZW4udGhyb3chLmJpbmQoZ2VuKVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFI+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbGVkKHJlczogYW55KTogdm9pZCB7XG4gICAgICAgIGdyb3VwLnJlc3VtZSgpXG4gICAgICAgIGxldCByZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBnZW5OZXh0KHJlcylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGdyb3VwLmVuZCgpXG4gICAgICAgICAgcmVqZWN0KGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBncm91cC5wYXVzZSgpXG4gICAgICAgIG5leHQocmV0KVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlamVjdGVkKGVycjogYW55KTogdm9pZCB7XG4gICAgICAgIGdyb3VwLnJlc3VtZSgpXG4gICAgICAgIGxldCByZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBnZW5UaHJvdyhlcnIpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBncm91cC5lbmQoKVxuICAgICAgICAgIHJlamVjdChlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXAucGF1c2UoKVxuICAgICAgICBuZXh0KHJldClcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbmV4dChyZXQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAocmV0ICYmIHR5cGVvZiByZXQudGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gYW4gYXN5bmMgaXRlcmF0b3JcbiAgICAgICAgICByZXQudGhlbihuZXh0LCByZWplY3QpXG4gICAgICAgIH0gZWxzZSBpZiAocmV0LmRvbmUpIHtcbiAgICAgICAgICAvLyBkb25lXG4gICAgICAgICAgZ3JvdXAuZW5kKClcbiAgICAgICAgICByZXNvbHZlKHJldC52YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb250aW51ZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXQudmFsdWUpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb25GdWxmaWxsZWQodW5kZWZpbmVkKSAvLyBraWNrIG9mZiB0aGUgcHJvY2Vzc1xuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFVuZG9NYW5hZ2VyYC5cbiAgICogRG8gbm90IHVzZSBkaXJlY3RseSwgdXNlIGB1bmRvTWlkZGxld2FyZWAgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIGRpc3Bvc2VyXG4gICAqIEBwYXJhbSBzdWJ0cmVlUm9vdFxuICAgKiBAcGFyYW0gW3N0b3JlXVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNwb3NlcjogQWN0aW9uTWlkZGxld2FyZURpc3Bvc2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3VidHJlZVJvb3Q6IG9iamVjdCxcbiAgICBzdG9yZTogVW5kb1N0b3JlIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVW5kb01pZGRsZXdhcmVPcHRpb25zPHVua25vd24+IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGlmIChnZXRNb2J4VmVyc2lvbigpID49IDYpIHtcbiAgICAgIG1vYng2Lm1ha2VPYnNlcnZhYmxlKHRoaXMpXG4gICAgfVxuXG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlID8/IG5ldyBVbmRvU3RvcmUoe30pXG4gIH1cbn1cblxuLyoqXG4gKiBVbmRvIG1pZGRsZXdhcmUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmRvTWlkZGxld2FyZU9wdGlvbnM8Uz4ge1xuICBhdHRhY2hlZFN0YXRlPzoge1xuICAgIHNhdmUoKTogU1xuICAgIHJlc3RvcmUoczogUyk6IHZvaWRcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gdW5kbyBtaWRkbGV3YXJlLlxuICpcbiAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbCBgVW5kb1N0b3JlYCB3aGVyZSB0byBzdG9yZSB0aGUgdW5kby9yZWRvIHF1ZXVlcy4gVXNlIHRoaXMgaWYgeW91IHdhbnQgdG9cbiAqIHN0b3JlIHN1Y2ggcXVldWVzIHNvbWV3aGVyZSBpbiB5b3VyIG1vZGVscy4gSWYgbm9uZSBpcyBwcm92aWRlZCBpdCB3aWxsIHJlc2lkZSBpbiBtZW1vcnkuXG4gKiBAcGFyYW0gb3B0aW9ucyBFeHRyYSBvcHRpb25zLCBzdWNoIGFzIGhvdyB0byBzYXZlIC8gcmVzdG9yZSBjZXJ0YWluIHNuYXBzaG90IG9mIHRoZSBzdGF0ZSB0byBiZSByZXN0b3JlZCB3aGVuIHVuZG9pbmcvcmVkb2luZy5cbiAqIEByZXR1cm5zIEFuIGBVbmRvTWFuYWdlcmAgd2hpY2ggYWxsb3dzIHlvdSB0byBkbyB0aGUgbWFuYWdlIHRoZSB1bmRvL3JlZG8gb3BlcmF0aW9ucyBhbmQgZGlzcG9zZSBvZiB0aGUgbWlkZGxld2FyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuZG9NaWRkbGV3YXJlPFM+KFxuICBzdWJ0cmVlUm9vdDogb2JqZWN0LFxuICBzdG9yZT86IFVuZG9TdG9yZSxcbiAgb3B0aW9ucz86IFVuZG9NaWRkbGV3YXJlT3B0aW9uczxTPlxuKTogVW5kb01hbmFnZXIge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHN1YnRyZWVSb290LCBcInN1YnRyZWVSb290XCIpXG5cbiAgbGV0IG1hbmFnZXI6IFVuZG9NYW5hZ2VyXG5cbiAgaW50ZXJmYWNlIFBhdGNoUmVjb3JkZXJEYXRhIHtcbiAgICByZWNvcmRlcjogUGF0Y2hSZWNvcmRlclxuICAgIHJlY29yZGVyU3RhY2s6IG51bWJlclxuICAgIHVuZG9Sb290Q29udGV4dDogU2ltcGxlQWN0aW9uQ29udGV4dFxuICAgIGdyb3VwOiBVbmRvRXZlbnRHcm91cCB8IHVuZGVmaW5lZFxuICAgIGF0dGFjaGVkU3RhdGVCZWZvcmVFdmVudDogUyB8IHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGF0Y2hSZWNvcmRlclN5bWJvbCA9IFN5bWJvbChcInBhdGNoUmVjb3JkZXJcIilcblxuICBmdW5jdGlvbiBpbml0UGF0Y2hSZWNvcmRlcihjdHg6IFNpbXBsZUFjdGlvbkNvbnRleHQpIHtcbiAgICBjb25zdCBncm91cCA9IG1hbmFnZXIuc3RvcmUuX2N1cnJlbnRHcm91cFxuXG4gICAgY29uc3QgcGF0Y2hSZWNvcmRlckRhdGE6IFBhdGNoUmVjb3JkZXJEYXRhID0ge1xuICAgICAgcmVjb3JkZXI6IHBhdGNoUmVjb3JkZXIoc3VidHJlZVJvb3QsIHtcbiAgICAgICAgcmVjb3JkaW5nOiBmYWxzZSxcbiAgICAgICAgZmlsdGVyOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICFfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQgJiYgIW1hbmFnZXIuaXNVbmRvUmVjb3JkaW5nRGlzYWJsZWRcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgcmVjb3JkZXJTdGFjazogMCxcbiAgICAgIHVuZG9Sb290Q29udGV4dDogY3R4LFxuICAgICAgZ3JvdXAsXG5cbiAgICAgIGF0dGFjaGVkU3RhdGVCZWZvcmVFdmVudDogb3B0aW9ucz8uYXR0YWNoZWRTdGF0ZT8uc2F2ZSgpLFxuICAgIH1cblxuICAgIGN0eC5yb290Q29udGV4dC5kYXRhW3BhdGNoUmVjb3JkZXJTeW1ib2xdID0gcGF0Y2hSZWNvcmRlckRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eDogU2ltcGxlQWN0aW9uQ29udGV4dCk6IFBhdGNoUmVjb3JkZXJEYXRhIHtcbiAgICByZXR1cm4gY3R4LnJvb3RDb250ZXh0LmRhdGFbcGF0Y2hSZWNvcmRlclN5bWJvbF1cbiAgfVxuXG4gIGNvbnN0IG1pZGRsZXdhcmVEaXNwb3NlciA9IGFjdGlvblRyYWNraW5nTWlkZGxld2FyZShzdWJ0cmVlUm9vdCwge1xuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICBpZiAoIWdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eCkpIHtcbiAgICAgICAgaW5pdFBhdGNoUmVjb3JkZXIoY3R4KVxuICAgICAgfVxuICAgIH0sXG4gICAgb25SZXN1bWUoY3R4KSB7XG4gICAgICBjb25zdCBwYXRjaFJlY29yZGVyRGF0YSA9IGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eClcbiAgICAgIHBhdGNoUmVjb3JkZXJEYXRhLnJlY29yZGVyU3RhY2srK1xuICAgICAgcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXIucmVjb3JkaW5nID0gcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJTdGFjayA+IDBcbiAgICB9LFxuICAgIG9uU3VzcGVuZChjdHgpIHtcbiAgICAgIGNvbnN0IHBhdGNoUmVjb3JkZXJEYXRhID0gZ2V0UGF0Y2hSZWNvcmRlckRhdGEoY3R4KVxuICAgICAgcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJTdGFjay0tXG4gICAgICBwYXRjaFJlY29yZGVyRGF0YS5yZWNvcmRlci5yZWNvcmRpbmcgPSBwYXRjaFJlY29yZGVyRGF0YS5yZWNvcmRlclN0YWNrID4gMFxuICAgIH0sXG4gICAgb25GaW5pc2goY3R4KSB7XG4gICAgICBjb25zdCBwYXRjaFJlY29yZGVyRGF0YSA9IGdldFBhdGNoUmVjb3JkZXJEYXRhKGN0eClcbiAgICAgIGlmIChwYXRjaFJlY29yZGVyRGF0YSAmJiBwYXRjaFJlY29yZGVyRGF0YS51bmRvUm9vdENvbnRleHQgPT09IGN0eCkge1xuICAgICAgICBjb25zdCBwYXRjaFJlY29yZGVyID0gcGF0Y2hSZWNvcmRlckRhdGEucmVjb3JkZXJcblxuICAgICAgICBpZiAocGF0Y2hSZWNvcmRlci5ldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgICAgICAgIGNvbnN0IGludmVyc2VQYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgcGF0Y2hSZWNvcmRlci5ldmVudHMpIHtcbiAgICAgICAgICAgIHBhdGNoZXMucHVzaCguLi5ldmVudC5wYXRjaGVzKVxuICAgICAgICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCguLi5ldmVudC5pbnZlcnNlUGF0Y2hlcylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFVuZG9FdmVudFR5cGUuU2luZ2xlLFxuICAgICAgICAgICAgdGFyZ2V0UGF0aDogZmFzdEdldFJvb3RQYXRoKGN0eC50YXJnZXQpLnBhdGgsXG4gICAgICAgICAgICBhY3Rpb25OYW1lOiBjdHguYWN0aW9uTmFtZSxcbiAgICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgICBpbnZlcnNlUGF0Y2hlcyxcbiAgICAgICAgICB9IGFzIGNvbnN0XG5cbiAgICAgICAgICBjb25zdCBwYXJlbnRHcm91cCA9IHBhdGNoUmVjb3JkZXJEYXRhLmdyb3VwXG5cbiAgICAgICAgICBpZiAocGFyZW50R3JvdXApIHtcbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmUuX2FkZFVuZG9Ub1BhcmVudEdyb3VwKHBhcmVudEdyb3VwLCBldmVudClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFuYWdlci5zdG9yZS5fYWRkVW5kbyh7XG4gICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgICBhdHRhY2hlZFN0YXRlOiB7XG4gICAgICAgICAgICAgICAgYmVmb3JlRXZlbnQ6IHBhdGNoUmVjb3JkZXJEYXRhLmF0dGFjaGVkU3RhdGVCZWZvcmVFdmVudCxcbiAgICAgICAgICAgICAgICBhZnRlckV2ZW50OiBvcHRpb25zPy5hdHRhY2hlZFN0YXRlPy5zYXZlKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBhdGNoUmVjb3JkZXIuZGlzcG9zZSgpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcblxuICBtYW5hZ2VyID0gbmV3IFVuZG9NYW5hZ2VyKG1pZGRsZXdhcmVEaXNwb3Nlciwgc3VidHJlZVJvb3QsIHN0b3JlLCBvcHRpb25zKVxuICByZXR1cm4gbWFuYWdlclxufVxuXG5sZXQgX2lzR2xvYmFsVW5kb1JlY29yZGluZ0Rpc2FibGVkID0gZmFsc2VcblxuLyoqXG4gKiBSZXR1cm5zIGlmIHRoZSB1bmRvIHJlY29yZGluZyBtZWNoYW5pc20gaXMgY3VycmVudGx5IGRpc2FibGVkLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQoKSB7XG4gIHJldHVybiBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWRcbn1cblxuLyoqXG4gKiBHbG9iYWxseSBza2lwcyB0aGUgdW5kbyByZWNvcmRpbmcgbWVjaGFuaXNtIGZvciB0aGUgY29kZSBibG9jayB0aGF0IGdldHMgcnVuIHN5bmNocm9ub3VzbHkgaW5zaWRlLlxuICogQ29uc2lkZXIgdXNpbmcgdGhlIGB3aXRob3V0VW5kb2AgbWV0aG9kIG9mIGEgcGFydGljdWxhciBgVW5kb01hbmFnZXJgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIENvZGUgYmxvY2sgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0gZm4gQ29kZSBibG9jayB0byBydW4uXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGNvZGUgYmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0VW5kbzxUPihmbjogKCkgPT4gVCk6IFQge1xuICBjb25zdCBzYXZlZFVuZG9EaXNhYmxlZCA9IF9pc0dsb2JhbFVuZG9SZWNvcmRpbmdEaXNhYmxlZFxuICBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSB0cnVlXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKClcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXNHbG9iYWxVbmRvUmVjb3JkaW5nRGlzYWJsZWQgPSBzYXZlZFVuZG9EaXNhYmxlZFxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBJQXRvbSwgSUNvbXB1dGVkVmFsdWUsIG9ic2VydmFibGUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0UGFyZW50IH0gZnJvbSBcIi4uL3BhcmVudC9wYXRoXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QsIGlzVHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuXG4vKipcbiAqIEEgY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0PFQ+IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRleHQgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldERlZmF1bHQoKTogVFxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb250ZXh0IGRlZmF1bHQgdmFsdWUuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc2V0RGVmYXVsdCh2YWx1ZTogVCk6IHZvaWRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCBkZWZhdWx0IHZhbHVlIHJlc29sdmVyLlxuICAgKiBAcGFyYW0gdmFsdWVGblxuICAgKi9cbiAgc2V0RGVmYXVsdENvbXB1dGVkKHZhbHVlRm46ICgpID0+IFQpOiB2b2lkXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRleHQgdmFsdWUgZm9yIGEgZ2l2ZW4gbm9kZS5cbiAgICogQHBhcmFtIG5vZGVcbiAgICovXG4gIGdldChub2RlOiBvYmplY3QpOiBUXG5cbiAgLyoqXG4gICAqIEdldHMgbm9kZSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgaXQgY29tZXMgZnJvbSB0aGUgZGVmYXVsdC5cbiAgICogQHBhcmFtIG5vZGVcbiAgICovXG4gIGdldFByb3ZpZGVyTm9kZShub2RlOiBvYmplY3QpOiBvYmplY3QgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCB2YWx1ZSBmb3IgYSBnaXZlbiBub2RlLCBlZmZlY3RpdmVseSBtYWtpbmcgaXQgYSBwcm92aWRlci5cbiAgICogQHBhcmFtIG5vZGVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzZXQobm9kZTogb2JqZWN0LCB2YWx1ZTogVCk6IHZvaWRcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29udGV4dCB2YWx1ZSByZXNvbHZlciBmb3IgYSBnaXZlbiBub2RlLCBlZmZlY3RpdmVseSBtYWtpbmcgaXQgYSBwcm92aWRlci5cbiAgICogQHBhcmFtIG5vZGVcbiAgICogQHBhcmFtIHZhbHVlRm5cbiAgICovXG4gIHNldENvbXB1dGVkKG5vZGU6IG9iamVjdCwgdmFsdWVGbjogKCkgPT4gVCk6IHZvaWRcblxuICAvKipcbiAgICogVW5zZXRzIHRoZSBjb250ZXh0IHZhbHVlIGZvciBhIGdpdmVuIG5vZGUsIHRoZXJlZm9yZSBpdCB3b24ndCBiZSBhIHByb3ZpZGVyIGFueW1vcmUuXG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICB1bnNldChub2RlOiBvYmplY3QpOiB2b2lkXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSB2YWx1ZSBvdmVycmlkZSB3aGlsZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgcnVubmluZyBhbmQsIGlmIGEgbm9kZSBpcyByZXR1cm5lZCxcbiAgICogc2V0cyB0aGUgbm9kZSBhcyBhIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGVwYXJhbSBSXG4gICAqIEBwYXJhbSBmbiBGdW5jdGlvbiB0byBydW4uXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhcHBseS5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgYXBwbHk8Uj4oZm46ICgpID0+IFIsIHZhbHVlOiBUKTogUlxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgY29tcHV0ZWQgdmFsdWUgb3ZlcnJpZGUgd2hpbGUgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIHJ1bm5pbmcgYW5kLCBpZiBhIG5vZGUgaXMgcmV0dXJuZWQsXG4gICAqIHNldHMgdGhlIG5vZGUgYXMgYSBwcm92aWRlciBvZiB0aGUgY29tcHV0ZWQgdmFsdWUuXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gUlxuICAgKiBAcGFyYW0gZm4gRnVuY3Rpb24gdG8gcnVuLlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIGFwcGx5Q29tcHV0ZWQ8Uj4oZm46ICgpID0+IFIsIHZhbHVlRm46ICgpID0+IFQpOiBSXG59XG5cbnR5cGUgQ29udGV4dFZhbHVlPFQ+ID1cbiAgfCB7XG4gICAgICB0eXBlOiBcInZhbHVlXCJcbiAgICAgIHZhbHVlOiBUXG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6IFwiY29tcHV0ZWRcIlxuICAgICAgdmFsdWU6IElDb21wdXRlZFZhbHVlPFQ+XG4gICAgfVxuXG5mdW5jdGlvbiByZXNvbHZlQ29udGV4dFZhbHVlPFQ+KGNvbnRleHRWYWx1ZTogQ29udGV4dFZhbHVlPFQ+KTogVCB7XG4gIGlmIChjb250ZXh0VmFsdWUudHlwZSA9PT0gXCJ2YWx1ZVwiKSB7XG4gICAgcmV0dXJuIGNvbnRleHRWYWx1ZS52YWx1ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250ZXh0VmFsdWUudmFsdWUuZ2V0KClcbiAgfVxufVxuXG5jbGFzcyBDb250ZXh0Q2xhc3M8VD4gaW1wbGVtZW50cyBDb250ZXh0PFQ+IHtcbiAgcHJpdmF0ZSBkZWZhdWx0Q29udGV4dFZhbHVlID0gb2JzZXJ2YWJsZS5ib3g8Q29udGV4dFZhbHVlPFQ+Pih1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSlcblxuICBwcml2YXRlIG92ZXJyaWRlQ29udGV4dFZhbHVlID0gb2JzZXJ2YWJsZS5ib3g8Q29udGV4dFZhbHVlPFQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHtcbiAgICBkZWVwOiBmYWxzZSxcbiAgfSlcblxuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVDb250ZXh0VmFsdWUgPSBuZXcgV2Vha01hcDxvYmplY3QsIENvbnRleHRWYWx1ZTxUPj4oKVxuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVBdG9tID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJQXRvbT4oKVxuXG4gIHByaXZhdGUgZ2V0Tm9kZUF0b20obm9kZTogb2JqZWN0KSB7XG4gICAgcmV0dXJuIGdldE9yQ3JlYXRlKHRoaXMubm9kZUF0b20sIG5vZGUsICgpID0+IGNyZWF0ZUF0b20oXCJjb250ZXh0VmFsdWVcIikpXG4gIH1cblxuICBwcml2YXRlIGZhc3RHZXQobm9kZTogb2JqZWN0KTogVCB7XG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBvYnNGb3JOb2RlID0gdGhpcy5ub2RlQ29udGV4dFZhbHVlLmdldChub2RlKVxuICAgIGlmIChvYnNGb3JOb2RlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUNvbnRleHRWYWx1ZShvYnNGb3JOb2RlKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGZhc3RHZXRQYXJlbnQobm9kZSlcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVWYWx1ZSA9IHRoaXMub3ZlcnJpZGVDb250ZXh0VmFsdWUuZ2V0KClcbiAgICAgIGlmIChvdmVycmlkZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29udGV4dFZhbHVlKG92ZXJyaWRlVmFsdWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0R2V0KHBhcmVudClcbiAgfVxuXG4gIGdldChub2RlOiBvYmplY3QpIHtcbiAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGUsIFwibm9kZVwiKVxuXG4gICAgcmV0dXJuIHRoaXMuZmFzdEdldChub2RlKVxuICB9XG5cbiAgcHJpdmF0ZSBmYXN0R2V0UHJvdmlkZXJOb2RlKG5vZGU6IG9iamVjdCk6IG9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBvYnNGb3JOb2RlID0gdGhpcy5ub2RlQ29udGV4dFZhbHVlLmdldChub2RlKVxuICAgIGlmIChvYnNGb3JOb2RlKSB7XG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGZhc3RHZXRQYXJlbnQobm9kZSlcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZhc3RHZXRQcm92aWRlck5vZGUocGFyZW50KVxuICB9XG5cbiAgZ2V0UHJvdmlkZXJOb2RlKG5vZGU6IG9iamVjdCk6IG9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHJldHVybiB0aGlzLmZhc3RHZXRQcm92aWRlck5vZGUobm9kZSlcbiAgfVxuXG4gIGdldERlZmF1bHQoKTogVCB7XG4gICAgcmV0dXJuIHJlc29sdmVDb250ZXh0VmFsdWUodGhpcy5kZWZhdWx0Q29udGV4dFZhbHVlLmdldCgpISlcbiAgfVxuXG4gIHNldERlZmF1bHQgPSBhY3Rpb24oKHZhbHVlOiBUKSA9PiB7XG4gICAgdGhpcy5kZWZhdWx0Q29udGV4dFZhbHVlLnNldCh7XG4gICAgICB0eXBlOiBcInZhbHVlXCIsXG4gICAgICB2YWx1ZSxcbiAgICB9KVxuICB9KVxuXG4gIHNldERlZmF1bHRDb21wdXRlZCA9IGFjdGlvbigodmFsdWVGbjogKCkgPT4gVCkgPT4ge1xuICAgIHRoaXMuZGVmYXVsdENvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJjb21wdXRlZFwiLFxuICAgICAgdmFsdWU6IGNvbXB1dGVkKHZhbHVlRm4pLFxuICAgIH0pXG4gIH0pXG5cbiAgc2V0ID0gYWN0aW9uKChub2RlOiBvYmplY3QsIHZhbHVlOiBUKSA9PiB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHRoaXMubm9kZUNvbnRleHRWYWx1ZS5zZXQobm9kZSwge1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiLFxuICAgICAgdmFsdWUsXG4gICAgfSlcbiAgICB0aGlzLmdldE5vZGVBdG9tKG5vZGUpLnJlcG9ydENoYW5nZWQoKVxuICB9KVxuXG4gIHByaXZhdGUgX3NldENvbXB1dGVkKG5vZGU6IG9iamVjdCwgY29tcHV0ZWRWYWx1ZUZuOiBJQ29tcHV0ZWRWYWx1ZTxUPikge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qobm9kZSwgXCJub2RlXCIpXG5cbiAgICB0aGlzLm5vZGVDb250ZXh0VmFsdWUuc2V0KG5vZGUsIHsgdHlwZTogXCJjb21wdXRlZFwiLCB2YWx1ZTogY29tcHV0ZWRWYWx1ZUZuIH0pXG4gICAgdGhpcy5nZXROb2RlQXRvbShub2RlKS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuXG4gIHNldENvbXB1dGVkID0gYWN0aW9uKChub2RlOiBvYmplY3QsIHZhbHVlRm46ICgpID0+IFQpID0+IHtcbiAgICB0aGlzLl9zZXRDb21wdXRlZChub2RlLCBjb21wdXRlZCh2YWx1ZUZuKSlcbiAgfSlcblxuICB1bnNldCA9IGFjdGlvbigobm9kZTogb2JqZWN0KSA9PiB7XG4gICAgYXNzZXJ0VHdlYWtlZE9iamVjdChub2RlLCBcIm5vZGVcIilcblxuICAgIHRoaXMubm9kZUNvbnRleHRWYWx1ZS5kZWxldGUobm9kZSlcbiAgICB0aGlzLmdldE5vZGVBdG9tKG5vZGUpLnJlcG9ydENoYW5nZWQoKVxuICB9KVxuXG4gIGFwcGx5ID0gYWN0aW9uKDxSPihmbjogKCkgPT4gUiwgdmFsdWU6IFQpOiBSID0+IHtcbiAgICBjb25zdCBvbGQgPSB0aGlzLm92ZXJyaWRlQ29udGV4dFZhbHVlLmdldCgpXG4gICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJ2YWx1ZVwiLFxuICAgICAgdmFsdWUsXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBmbigpXG4gICAgICBpZiAoaXNUd2Vha2VkT2JqZWN0KHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy5zZXQocmV0LCB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQob2xkKVxuICAgIH1cbiAgfSlcblxuICBhcHBseUNvbXB1dGVkID0gYWN0aW9uKDxSPihmbjogKCkgPT4gUiwgdmFsdWVGbjogKCkgPT4gVCk6IFIgPT4ge1xuICAgIGNvbnN0IGNvbXB1dGVkVmFsdWVGbiA9IGNvbXB1dGVkKHZhbHVlRm4pXG5cbiAgICBjb25zdCBvbGQgPSB0aGlzLm92ZXJyaWRlQ29udGV4dFZhbHVlLmdldCgpXG4gICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQoe1xuICAgICAgdHlwZTogXCJjb21wdXRlZFwiLFxuICAgICAgdmFsdWU6IGNvbXB1dGVkVmFsdWVGbixcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKClcbiAgICAgIGlmIChpc1R3ZWFrZWRPYmplY3QocmV0LCB0cnVlKSkge1xuICAgICAgICB0aGlzLl9zZXRDb21wdXRlZChyZXQsIGNvbXB1dGVkVmFsdWVGbilcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vdmVycmlkZUNvbnRleHRWYWx1ZS5zZXQob2xkKVxuICAgIH1cbiAgfSlcblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU/OiBUKSB7XG4gICAgdGhpcy5zZXREZWZhdWx0KGRlZmF1bHRWYWx1ZSBhcyBUKVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IHdpdGggbm8gZGVmYXVsdCB2YWx1ZSwgdGh1cyBtYWtpbmcgaXRzIGRlZmF1bHQgdmFsdWUgdW5kZWZpbmVkLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBDb250ZXh0IHZhbHVlIHR5cGUuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUPigpOiBDb250ZXh0PFQgfCB1bmRlZmluZWQ+XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IHdpdGggYSBkZWZhdWx0IHZhbHVlLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBDb250ZXh0IHZhbHVlIHR5cGUuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUPihkZWZhdWx0VmFsdWU6IFQpOiBDb250ZXh0PFQ+XG5cbi8vIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQ+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0Q2xhc3MoZGVmYXVsdFZhbHVlKVxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgcmVhZG9ubHlNaWRkbGV3YXJlIH0gZnJvbSBcIi4uL2FjdGlvbk1pZGRsZXdhcmVzL3JlYWRvbmx5TWlkZGxld2FyZVwiXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHQvY29udGV4dFwiXG5pbXBvcnQgeyBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4uL2RhdGFNb2RlbC91dGlsc1wiXG5pbXBvcnQgeyBpc01vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIlxuaW1wb3J0IHsgaXNUcmVlTm9kZSB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgdHJ5VW50d2VhaywgdHdlYWsgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyBhZGRMYXRlSW5pdGlhbGl6YXRpb25GdW5jdGlvbiwgZmFpbHVyZSwgcnVuQmVmb3JlT25Jbml0U3ltYm9sIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlIH0gZnJvbSBcIi4uL3V0aWxzL21hcFV0aWxzXCJcblxuY29uc3QgY29tcHV0ZWRUcmVlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoZmFsc2UpXG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIG5vZGUgaXMgYSBjb21wdXRlZCB0cmVlIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBhIGNvbXB1dGVkIHRyZWUgbm9kZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXB1dGVkVHJlZU5vZGUobm9kZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wdXRlZFRyZWVDb250ZXh0LmdldChub2RlKVxufVxuXG5jb25zdCB0d2Vha2VkQ29tcHV0ZWRUcmVlTm9kZXMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcblxuZnVuY3Rpb24gdHdlYWtDb21wdXRlZFRyZWVOb2RlPFQ+KG5ld1ZhbHVlOiBULCBwYXJlbnQ6IHVua25vd24sIHBhdGg6IHN0cmluZyk6IFQge1xuICBjb25zdCB0d2Vha2VkVmFsdWUgPSB0d2VhayhuZXdWYWx1ZSwgeyBwYXJlbnQsIHBhdGggfSlcbiAgaWYgKGlzVHJlZU5vZGUodHdlYWtlZFZhbHVlKSAmJiAhdHdlYWtlZENvbXB1dGVkVHJlZU5vZGVzLmhhcyh0d2Vha2VkVmFsdWUpKSB7XG4gICAgdHdlYWtlZENvbXB1dGVkVHJlZU5vZGVzLmFkZCh0d2Vha2VkVmFsdWUpXG4gICAgcmVhZG9ubHlNaWRkbGV3YXJlKHR3ZWFrZWRWYWx1ZSlcbiAgICBjb21wdXRlZFRyZWVDb250ZXh0LnNldCh0d2Vha2VkVmFsdWUsIHRydWUpXG4gIH1cbiAgcmV0dXJuIHR3ZWFrZWRWYWx1ZVxufVxuXG5jb25zdCBjb21wdXRlZFRyZWVOb2RlSW5mbyA9IG5ldyBXZWFrTWFwPFxuICBvYmplY3QsXG4gIE1hcDxzdHJpbmcsIHsgY29tcHV0ZWQ6IElDb21wdXRlZFZhbHVlPHVua25vd24+OyB2YWx1ZTogdW5rbm93bjsgdHdlYWtlZFZhbHVlOiB1bmtub3duIH0+XG4+KClcblxuZnVuY3Rpb24gZ2V0T3JDcmVhdGVDb21wdXRlZFRyZWVOb2RlSW5mbyhpbnN0YW5jZTogb2JqZWN0KSB7XG4gIHJldHVybiBnZXRPckNyZWF0ZShjb21wdXRlZFRyZWVOb2RlSW5mbywgaW5zdGFuY2UsICgpID0+IG5ldyBNYXAoKSlcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIHR1cm5pbmcgYSBjb21wdXRlZCBwcm9wZXJ0eSBpbnRvIGEgY29tcHV0ZWQgdHJlZSB3aGljaCBzdXBwb3J0cyB0cmVlIHRyYXZlcnNhbFxuICogZnVuY3Rpb25zLCBjb250ZXh0cywgcmVmZXJlbmNlcywgZXRjLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgUHJvdG90eXBlIG9mIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSBOYW1lIG9mIHRoZSBtZW1iZXIuXG4gKiBAcGFyYW0gZGVzY3JpcHRvciBQcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgbWVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWRUcmVlKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4pOiB2b2lkIHtcbiAgaWYgKCFkZXNjcmlwdG9yLmdldCkge1xuICAgIHRocm93IGZhaWx1cmUoXCJAY29tcHV0ZWRUcmVlIHJlcXVpcmVzIGEgJ2dldCcgYWNjZXNzb3JcIilcbiAgfVxuXG4gIGNvbnN0IHRhcmdldENsYXNzID0gdGFyZ2V0LmNvbnN0cnVjdG9yXG4gIGlmICghaXNNb2RlbENsYXNzKHRhcmdldENsYXNzKSAmJiAhaXNEYXRhTW9kZWxDbGFzcyh0YXJnZXRDbGFzcykpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiQGNvbXB1dGVkVHJlZSBjYW4gb25seSBkZWNvcmF0ZSAnZ2V0JyBhY2Nlc3NvcnMgb2YgY2xhc3Mgb3IgZGF0YSBtb2RlbHNcIilcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsID0gZGVzY3JpcHRvci5nZXRcblxuICBkZXNjcmlwdG9yLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbnRyeSA9IGdldE9yQ3JlYXRlQ29tcHV0ZWRUcmVlTm9kZUluZm8odGhpcykuZ2V0KHByb3BlcnR5S2V5KSFcblxuICAgIGNvbnN0IG9sZFZhbHVlID0gZW50cnkudmFsdWVcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGVudHJ5LmNvbXB1dGVkLmdldCgpXG5cbiAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZW50cnkudHdlYWtlZFZhbHVlXG4gICAgfVxuXG4gICAgdHdlYWsob2xkVmFsdWUsIHVuZGVmaW5lZClcbiAgICB0cnlVbnR3ZWFrKG9sZFZhbHVlKVxuXG4gICAgY29uc3QgdHdlYWtlZFZhbHVlID0gdHdlYWtDb21wdXRlZFRyZWVOb2RlKG5ld1ZhbHVlLCB0aGlzLCBwcm9wZXJ0eUtleSlcbiAgICBlbnRyeS52YWx1ZSA9IG5ld1ZhbHVlXG4gICAgZW50cnkudHdlYWtlZFZhbHVlID0gdHdlYWtlZFZhbHVlXG4gICAgcmV0dXJuIHR3ZWFrZWRWYWx1ZVxuICB9XG5cbiAgYWRkTGF0ZUluaXRpYWxpemF0aW9uRnVuY3Rpb24odGFyZ2V0LCBydW5CZWZvcmVPbkluaXRTeW1ib2wsIChpbnN0YW5jZSkgPT4ge1xuICAgIGNvbnN0IGMgPSBjb21wdXRlZCgoKSA9PiBvcmlnaW5hbC5jYWxsKGluc3RhbmNlKSwgeyBrZWVwQWxpdmU6IHRydWUgfSlcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGMuZ2V0KClcbiAgICBjb25zdCB0d2Vha2VkVmFsdWUgPSB0d2Vha0NvbXB1dGVkVHJlZU5vZGUobmV3VmFsdWUsIGluc3RhbmNlLCBwcm9wZXJ0eUtleSlcblxuICAgIGdldE9yQ3JlYXRlQ29tcHV0ZWRUcmVlTm9kZUluZm8oaW5zdGFuY2UpLnNldChwcm9wZXJ0eUtleSwge1xuICAgICAgY29tcHV0ZWQ6IGMsXG4gICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICB0d2Vha2VkVmFsdWUsXG4gICAgfSlcbiAgfSlcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQWJzdHJhY3RNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzLFxuICBNb2RlbENyZWF0aW9uRGF0YSxcbiAgTW9kZWxVbnRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxQcm9wcyxcbiAgTW9kZWxQcm9wc1RvU2V0dGVyLFxuICBNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YSxcbiAgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWREYXRhLFxuICBNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhLFxufSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBzaGFyZWRJbnRlcm5hbE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3NoYXJlZEludGVybmFsTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBBbnlEYXRhTW9kZWwsIEJhc2VEYXRhTW9kZWwsIEJhc2VEYXRhTW9kZWxLZXlzIH0gZnJvbSBcIi4vQmFzZURhdGFNb2RlbFwiXG5pbXBvcnQgeyBhc3NlcnRJc0RhdGFNb2RlbENsYXNzLCBpc0RhdGFNb2RlbENsYXNzIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG5leHBvcnQgdHlwZSBfQ29tcG9zZWREYXRhPFN1cGVyTW9kZWwsIFRQcm9wcyBleHRlbmRzIE1vZGVsUHJvcHM+ID0gU3VwZXJNb2RlbCBleHRlbmRzIEFueURhdGFNb2RlbFxuICA/XG4gICAgICB8IChNb2RlbFByb3BzVG9VbnRyYW5zZm9ybWVkQ3JlYXRpb25EYXRhPFRQcm9wcz4gJiBNb2RlbFVudHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8U3VwZXJNb2RlbD4pXG4gICAgICB8IChNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+ICYgTW9kZWxDcmVhdGlvbkRhdGE8U3VwZXJNb2RlbD4pXG4gIDogTW9kZWxQcm9wc1RvVW50cmFuc2Zvcm1lZENyZWF0aW9uRGF0YTxUUHJvcHM+IHwgTW9kZWxQcm9wc1RvVHJhbnNmb3JtZWRDcmVhdGlvbkRhdGE8VFByb3BzPlxuXG5leHBvcnQgaW50ZXJmYWNlIF9EYXRhTW9kZWw8U3VwZXJNb2RlbCwgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcz4ge1xuICBuZXcgKGRhdGE6IF9Db21wb3NlZERhdGE8U3VwZXJNb2RlbCwgVFByb3BzPik6IFN1cGVyTW9kZWwgJlxuICAgIEJhc2VEYXRhTW9kZWw8VFByb3BzPiAmXG4gICAgT21pdDxNb2RlbFByb3BzVG9UcmFuc2Zvcm1lZERhdGE8VFByb3BzPiwgQmFzZURhdGFNb2RlbEtleXM+ICZcbiAgICBNb2RlbFByb3BzVG9TZXR0ZXI8VFByb3BzPlxufVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGEgbW9kZWxzIHRoYXQgZXh0ZW5kcyBhbm90aGVyIG1vZGVsLlxuICpcbiAqIEB0eXBlcGFyYW0gVFByb3BzIE5ldyBtb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAdHlwZXBhcmFtIFRNb2RlbCBNb2RlbCB0eXBlLlxuICogQHBhcmFtIGdlbkZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYmFzZSBtb2RlbCBhbmQgbW9kZWwgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFeHRlbmRlZERhdGFNb2RlbDxcbiAgVFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcyxcbiAgVE1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsLFxuICBBIGV4dGVuZHMgW11cbj4oXG4gIGdlbkZuOiAoLi4uYXJnczogQSkgPT4ge1xuICAgIGJhc2VNb2RlbDogQWJzdHJhY3RNb2RlbENsYXNzPFRNb2RlbD5cbiAgICBwcm9wczogVFByb3BzXG4gIH1cbik6IF9EYXRhTW9kZWw8VE1vZGVsLCBUUHJvcHM+XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgZGF0YSBtb2RlbHMgdGhhdCBleHRlbmRzIGFub3RoZXIgbW9kZWwuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTmV3IG1vZGVsIHByb3BlcnRpZXMgdHlwZS5cbiAqIEB0eXBlcGFyYW0gVE1vZGVsIE1vZGVsIHR5cGUuXG4gKiBAcGFyYW0gYmFzZU1vZGVsIEJhc2UgbW9kZWwgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFByb3BzIE1vZGVsIHByb3BlcnRpZXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWREYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgVE1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgYmFzZU1vZGVsOiBBYnN0cmFjdE1vZGVsQ2xhc3M8VE1vZGVsPixcbiAgbW9kZWxQcm9wczogVFByb3BzXG4pOiBfRGF0YU1vZGVsPFRNb2RlbCwgVFByb3BzPlxuXG4vLyBiYXNlXG5leHBvcnQgZnVuY3Rpb24gRXh0ZW5kZWREYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgVE1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgLi4uYXJnczogYW55W11cbik6IF9EYXRhTW9kZWw8VE1vZGVsLCBUUHJvcHM+IHtcbiAgbGV0IGJhc2VNb2RlbFxuICBsZXQgbW9kZWxQcm9wc1xuICBpZiAoaXNEYXRhTW9kZWxDbGFzcyhhcmdzWzBdKSkge1xuICAgIGJhc2VNb2RlbCA9IGFyZ3NbMF1cbiAgICBtb2RlbFByb3BzID0gYXJnc1sxXVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGdlbiA9IGFyZ3NbMF0oKVxuXG4gICAgYmFzZU1vZGVsID0gZ2VuLmJhc2VNb2RlbFxuICAgIG1vZGVsUHJvcHMgPSBnZW4ucHJvcHNcbiAgfVxuXG4gIGFzc2VydElzRGF0YU1vZGVsQ2xhc3MoYmFzZU1vZGVsLCBcImJhc2VNb2RlbFwiKVxuXG4gIHJldHVybiBpbnRlcm5hbERhdGFNb2RlbChtb2RlbFByb3BzLCBiYXNlTW9kZWwgYXMgYW55KVxufVxuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRhdGEgbW9kZWxzLlxuICpcbiAqIE5ldmVyIG92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciwgdXNlIGBvbkxhenlJbml0YCBvciBgb25MYXp5QXR0YWNoZWRUb1Jvb3RTdG9yZWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFRQcm9wcyBNb2RlbCBwcm9wZXJ0aWVzIHR5cGUuXG4gKiBAcGFyYW0gZm5Nb2RlbFByb3BzIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIG1vZGVsIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXRhTW9kZWw8VFByb3BzIGV4dGVuZHMgTW9kZWxQcm9wcywgQSBleHRlbmRzIFtdPihcbiAgZm5Nb2RlbFByb3BzOiAoLi4uYXJnczogQSkgPT4gVFByb3BzXG4pOiBfRGF0YU1vZGVsPHVua25vd24sIFRQcm9wcz5cblxuLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGZvciBkYXRhIG1vZGVscy5cbiAqXG4gKiBOZXZlciBvdmVycmlkZSB0aGUgY29uc3RydWN0b3IsIHVzZSBgb25MYXp5SW5pdGAgb3IgYG9uTGF6eUF0dGFjaGVkVG9Sb290U3RvcmVgIGluc3RlYWQuXG4gKlxuICogQHR5cGVwYXJhbSBUUHJvcHMgTW9kZWwgcHJvcGVydGllcyB0eXBlLlxuICogQHBhcmFtIG1vZGVsUHJvcHMgTW9kZWwgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPihcbiAgbW9kZWxQcm9wczogVFByb3BzXG4pOiBfRGF0YU1vZGVsPHVua25vd24sIFRQcm9wcz5cblxuLy8gYmFzZVxuZXhwb3J0IGZ1bmN0aW9uIERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzPihcbiAgZm5Nb2RlbFByb3BzT3JNb2RlbFByb3BzOiAoKCkgPT4gVFByb3BzKSB8IFRQcm9wc1xuKTogX0RhdGFNb2RlbDx1bmtub3duLCBUUHJvcHM+IHtcbiAgY29uc3QgbW9kZWxQcm9wcyA9XG4gICAgdHlwZW9mIGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wcygpXG4gICAgICA6IGZuTW9kZWxQcm9wc09yTW9kZWxQcm9wc1xuICByZXR1cm4gaW50ZXJuYWxEYXRhTW9kZWwobW9kZWxQcm9wcywgdW5kZWZpbmVkKVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbERhdGFNb2RlbDxUUHJvcHMgZXh0ZW5kcyBNb2RlbFByb3BzLCBUQmFzZU1vZGVsIGV4dGVuZHMgQW55RGF0YU1vZGVsPihcbiAgbW9kZWxQcm9wczogVFByb3BzLFxuICBiYXNlTW9kZWw6IE1vZGVsQ2xhc3M8VEJhc2VNb2RlbD4gfCB1bmRlZmluZWRcbik6IF9EYXRhTW9kZWw8VEJhc2VNb2RlbCwgVFByb3BzPiB7XG4gIHJldHVybiBzaGFyZWRJbnRlcm5hbE1vZGVsKHtcbiAgICBtb2RlbFByb3BzLFxuICAgIGJhc2VNb2RlbCxcbiAgICB0eXBlOiBcImRhdGFcIixcbiAgICB2YWx1ZVR5cGU6IGZhbHNlLFxuICAgIGZyb21TbmFwc2hvdFByb2Nlc3NvcjogdW5kZWZpbmVkLFxuICAgIHRvU25hcHNob3RQcm9jZXNzb3I6IHVuZGVmaW5lZCxcbiAgfSlcbn1cbiIsImltcG9ydCB7IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIH0gZnJvbSBcIi4uL2FjdGlvblwiXG5pbXBvcnQge1xuICBhY3Rpb25UcmFja2luZ01pZGRsZXdhcmUsXG4gIEFjdGlvblRyYWNraW5nUmVzdWx0LFxuICBTaW1wbGVBY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi4vYWN0aW9uTWlkZGxld2FyZXNcIlxuaW1wb3J0IHsgZmFzdEdldFJvb3RQYXRoLCBSb290UGF0aCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgeyBhcHBseVNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2FwcGx5U25hcHNob3RcIlxuaW1wb3J0IHsgZ2V0U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvZ2V0U25hcHNob3RcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuXG4vKipcbiAqIENvbm5lY3RzIGEgdHJlZSBub2RlIHRvIGEgcmVkdXggZGV2IHRvb2xzIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSByZW1vdGVkZXZQYWNrYWdlIFRoZSByZW1vdGVkZXYgcGFja2FnZSAodXN1YWxseSB0aGUgcmVzdWx0IG9mIGByZXF1aXJlKFwicmVtb3RlRGV2XCIpYCkgKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JlbW90ZWRldikuXG4gKiBAcGFyYW0gcmVtb3RlZGV2Q29ubmVjdGlvbiBUaGUgcmVzdWx0IG9mIGEgY29ubmVjdCBtZXRob2QgZnJvbSB0aGUgcmVtb3RlZGV2IHBhY2thZ2UgKHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBgcmVtb3RlRGV2LmNvbm5lY3RWaWFFeHRlbnNpb24oLi4uKWApLlxuICogQHBhcmFtIHRhcmdldCBPYmplY3QgdG8gdXNlIGFzIHJvb3QuXG4gKiBAcGFyYW0gc3RvcmVOYW1lIE5hbWUgdG8gYmUgc2hvd24gaW4gdGhlIHJlZHV4IGRldiB0b29scy5cbiAqIEBwYXJhbSBbb3B0aW9uc10gT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QuIGBsb2dBcmdzTmVhck5hbWVgIGlmIGl0IHNob3VsZCBzaG93IHRoZSBhcmd1bWVudHMgbmVhciB0aGUgYWN0aW9uIG5hbWUgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RSZWR1eERldlRvb2xzKFxuICByZW1vdGVkZXZQYWNrYWdlOiBhbnksXG4gIHJlbW90ZWRldkNvbm5lY3Rpb246IGFueSxcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIG9wdGlvbnM/OiB7XG4gICAgbG9nQXJnc05lYXJOYW1lPzogYm9vbGVhblxuICB9XG4pIHtcbiAgYXNzZXJ0VHdlYWtlZE9iamVjdCh0YXJnZXQsIFwidGFyZ2V0XCIpXG5cbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBsb2dBcmdzTmVhck5hbWU6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxuXG4gIGxldCBoYW5kbGluZ01vbml0b3JBY3Rpb24gPSAwXG5cbiAgLy8gc3Vic2NyaWJlIHRvIGNoYW5nZSBzdGF0ZSAoaWYgbmVlZCBtb3JlIHRoYW4ganVzdCBsb2dnaW5nKVxuICByZW1vdGVkZXZDb25uZWN0aW9uLnN1YnNjcmliZSgobWVzc2FnZTogYW55KSA9PiB7XG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJESVNQQVRDSFwiKSB7XG4gICAgICBoYW5kbGVNb25pdG9yQWN0aW9ucyhyZW1vdGVkZXZDb25uZWN0aW9uLCB0YXJnZXQsIG1lc3NhZ2UpXG4gICAgfVxuICB9KVxuXG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGdldFNuYXBzaG90KHRhcmdldClcbiAgcmVtb3RlZGV2Q29ubmVjdGlvbi5pbml0KGluaXRpYWxTdGF0ZSlcblxuICBsZXQgY3VycmVudEFjdGlvbklkID0gMFxuICBjb25zdCBhY3Rpb25JZFN5bWJvbCA9IFN5bWJvbChcImFjdGlvbklkXCIpXG5cbiAgYWN0aW9uVHJhY2tpbmdNaWRkbGV3YXJlKHRhcmdldCwge1xuICAgIG9uU3RhcnQoY3R4KSB7XG4gICAgICBjdHguZGF0YVthY3Rpb25JZFN5bWJvbF0gPSBjdXJyZW50QWN0aW9uSWQrK1xuICAgIH0sXG4gICAgb25SZXN1bWUoY3R4KSB7XG4gICAgICAvLyBnaXZlIGEgY2hhbmNlIHRvIHRoZSBwYXJlbnQgdG8gbG9nIGl0cyBvd24gY2hhbmdlcyBiZWZvcmUgdGhlIGNoaWxkIHN0YXJ0c1xuICAgICAgaWYgKGN0eC5wYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIGxvZyhjdHgucGFyZW50Q29udGV4dCwgdW5kZWZpbmVkKVxuICAgICAgfVxuICAgICAgbG9nKGN0eCwgdW5kZWZpbmVkKVxuICAgIH0sXG4gICAgb25TdXNwZW5kKGN0eCkge1xuICAgICAgbG9nKGN0eCwgdW5kZWZpbmVkKVxuICAgIH0sXG4gICAgb25GaW5pc2goY3R4LCByZXQpIHtcbiAgICAgIGxvZyhjdHgsIHJldC5yZXN1bHQpXG4gICAgfSxcbiAgfSlcblxuICBmdW5jdGlvbiBoYW5kbGVNb25pdG9yQWN0aW9ucyhyZW1vdGVkZXYyOiBhbnksIHRhcmdldDI6IGFueSwgbWVzc2FnZTogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsaW5nTW9uaXRvckFjdGlvbisrXG5cbiAgICAgIHN3aXRjaCAobWVzc2FnZS5wYXlsb2FkLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlJFU0VUXCI6XG4gICAgICAgICAgYXBwbHlTbmFwc2hvdCh0YXJnZXQyLCBpbml0aWFsU3RhdGUpXG4gICAgICAgICAgcmV0dXJuIHJlbW90ZWRldjIuaW5pdChpbml0aWFsU3RhdGUpXG4gICAgICAgIGNhc2UgXCJDT01NSVRcIjpcbiAgICAgICAgICByZXR1cm4gcmVtb3RlZGV2Mi5pbml0KGdldFNuYXBzaG90KHRhcmdldDIpKVxuICAgICAgICBjYXNlIFwiUk9MTEJBQ0tcIjpcbiAgICAgICAgICByZXR1cm4gcmVtb3RlZGV2Mi5pbml0KHJlbW90ZWRldlBhY2thZ2UuZXh0cmFjdFN0YXRlKG1lc3NhZ2UpKVxuICAgICAgICBjYXNlIFwiSlVNUF9UT19TVEFURVwiOlxuICAgICAgICBjYXNlIFwiSlVNUF9UT19BQ1RJT05cIjpcbiAgICAgICAgICBhcHBseVNuYXBzaG90KHRhcmdldDIsIHJlbW90ZWRldlBhY2thZ2UuZXh0cmFjdFN0YXRlKG1lc3NhZ2UpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICBjYXNlIFwiSU1QT1JUX1NUQVRFXCI6XG4gICAgICAgICAgY29uc3QgbmV4dExpZnRlZFN0YXRlID0gbWVzc2FnZS5wYXlsb2FkLm5leHRMaWZ0ZWRTdGF0ZVxuICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3RhdGVzID0gbmV4dExpZnRlZFN0YXRlLmNvbXB1dGVkU3RhdGVzXG4gICAgICAgICAgYXBwbHlTbmFwc2hvdCh0YXJnZXQyLCBjb21wdXRlZFN0YXRlc1tjb21wdXRlZFN0YXRlcy5sZW5ndGggLSAxXS5zdGF0ZSlcbiAgICAgICAgICByZW1vdGVkZXYyLnNlbmQobnVsbCwgbmV4dExpZnRlZFN0YXRlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBoYW5kbGluZ01vbml0b3JBY3Rpb24tLVxuICAgIH1cbiAgfVxuXG4gIGxldCBsYXN0TG9nZ2VkU25hcHNob3QgPSBpbml0aWFsU3RhdGVcblxuICBmdW5jdGlvbiBsb2coY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LCByZXN1bHQ6IEFjdGlvblRyYWNraW5nUmVzdWx0IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGhhbmRsaW5nTW9uaXRvckFjdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc24gPSBnZXRTbmFwc2hvdCh0YXJnZXQpXG5cbiAgICAvLyBpZ25vcmUgYWN0aW9ucyB0aGF0IGRvbid0IGNoYW5nZSBhbnl0aGluZyAodW5sZXNzIGl0IGlzIGEgdGhyb3cpXG4gICAgaWYgKHNuID09PSBsYXN0TG9nZ2VkU25hcHNob3QgJiYgcmVzdWx0ICE9PSBBY3Rpb25UcmFja2luZ1Jlc3VsdC5UaHJvdykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxhc3RMb2dnZWRTbmFwc2hvdCA9IHNuXG5cbiAgICBjb25zdCByb290UGF0aCA9IGZhc3RHZXRSb290UGF0aChjdHgudGFyZ2V0KVxuICAgIGNvbnN0IG5hbWUgPSBnZXRBY3Rpb25Db250ZXh0TmFtZUFuZFR5cGVQYXRoKGN0eCwgcm9vdFBhdGgsIHJlc3VsdClcblxuICAgIGNvbnN0IGNvcHkgPSB7XG4gICAgICB0eXBlOiBuYW1lLFxuICAgICAgcGF0aDogcm9vdFBhdGgucGF0aCxcbiAgICAgIGFyZ3M6IGN0eC5hcmdzLFxuICAgIH1cblxuICAgIHJlbW90ZWRldkNvbm5lY3Rpb24uc2VuZChjb3B5LCBzbilcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFjdGlvbkNvbnRleHROYW1lQW5kVHlwZVBhdGgoXG4gICAgY3R4OiBTaW1wbGVBY3Rpb25Db250ZXh0LFxuICAgIHJvb3RQYXRoOiBSb290UGF0aDxhbnk+LFxuICAgIHJlc3VsdDogQWN0aW9uVHJhY2tpbmdSZXN1bHQgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgY29uc3QgcGF0aFN0ciA9IFwiWy9cIiArIHJvb3RQYXRoLnBhdGguam9pbihcIi9cIikgKyBcIl0gXCJcbiAgICBsZXQgbmFtZSA9IHBhdGhTdHIgKyBjdHguYWN0aW9uTmFtZVxuXG4gICAgaWYgKG9wdHMubG9nQXJnc05lYXJOYW1lKSB7XG4gICAgICBsZXQgYXJncyA9IGN0eC5hcmdzXG4gICAgICAgIC5tYXAoKGEpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gXCIqKnVuc2VyaWFsaXphYmxlKipcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPiA2NCkge1xuICAgICAgICBhcmdzID0gYXJncy5zbGljZSgwLCA2NCkgKyBcIi4uLlwiXG4gICAgICB9XG5cbiAgICAgIG5hbWUgKz0gYCgke2FyZ3N9KWBcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25JZCA9IGN0eC5kYXRhW2FjdGlvbklkU3ltYm9sXVxuXG4gICAgbmFtZSArPSBgIChpZCAke2FjdGlvbklkICE9PSB1bmRlZmluZWQgPyBhY3Rpb25JZCA6IFwiP1wifWBcbiAgICBpZiAoY3R4LnR5cGUgPT09IEFjdGlvbkNvbnRleHRBY3Rpb25UeXBlLkFzeW5jKSB7XG4gICAgICBuYW1lICs9IFwiLCBhc3luY1wiXG4gICAgfVxuICAgIG5hbWUgKz0gXCIpXCJcblxuICAgIGlmIChyZXN1bHQgPT09IEFjdGlvblRyYWNraW5nUmVzdWx0LlRocm93KSB7XG4gICAgICBuYW1lICs9IFwiIC1lcnJvciB0aHJvd24tXCJcbiAgICB9XG5cbiAgICBpZiAoY3R4LnBhcmVudENvbnRleHQpIHtcbiAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBnZXRBY3Rpb25Db250ZXh0TmFtZUFuZFR5cGVQYXRoKFxuICAgICAgICBjdHgucGFyZW50Q29udGV4dCxcbiAgICAgICAgZmFzdEdldFJvb3RQYXRoKGN0eC5wYXJlbnRDb250ZXh0LnRhcmdldCksXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgICAgbmFtZSA9IGAke3BhcmVudE5hbWV9ID4+PiAke25hbWV9YFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gIH1cbn1cbiIsImltcG9ydCB7IEFjdGlvbkNhbGwsIGFwcGx5QWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvblwiXHJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcclxuaW1wb3J0IHsgb25TbmFwc2hvdCwgT25TbmFwc2hvdERpc3Bvc2VyLCBPblNuYXBzaG90TGlzdGVuZXIgfSBmcm9tIFwiLi4vc25hcHNob3Qvb25TbmFwc2hvdFwiXHJcbmltcG9ydCB0eXBlIHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCIuLi9zbmFwc2hvdC9TbmFwc2hvdE9mXCJcclxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjb25zdCByZWR1eEFjdGlvblR5cGUgPSBcImFwcGx5QWN0aW9uXCJcclxuXHJcbi8qKlxyXG4gKiBBIHJlZHV4IGFjdGlvbiBmb3IgbW9ieC1rZXlzdG9uZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVkdXhBY3Rpb24ge1xyXG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiByZWR1eEFjdGlvblR5cGVcclxuICByZWFkb25seSBwYXlsb2FkOiBBY3Rpb25DYWxsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIGFuIGFjdGlvbiBjYWxsIGludG8gYSByZWR1eCBhY3Rpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSBhY3Rpb25DYWxsIEFjdGlvbiBjYWxsLlxyXG4gKiBAcmV0dXJucyBBIHJlZHV4IGFjdGlvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhY3Rpb25DYWxsVG9SZWR1eEFjdGlvbihhY3Rpb25DYWxsOiBBY3Rpb25DYWxsKTogUmVkdXhBY3Rpb24ge1xyXG4gIHJldHVybiB7XHJcbiAgICB0eXBlOiByZWR1eEFjdGlvblR5cGUsXHJcbiAgICBwYXlsb2FkOiBhY3Rpb25DYWxsLFxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcmVkdXggc3RvcmUgZm9yIG1vYngta2V5c3RvbmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4U3RvcmU8VD4ge1xyXG4gIGdldFN0YXRlKCk6IFNuYXBzaG90T3V0T2Y8VD5cclxuICBkaXNwYXRjaChhY3Rpb246IFJlZHV4QWN0aW9uKTogUmVkdXhBY3Rpb25cclxuICBzdWJzY3JpYmUobGlzdGVuZXI6IE9uU25hcHNob3RMaXN0ZW5lcjxUPik6IE9uU25hcHNob3REaXNwb3NlclxyXG59XHJcblxyXG4vKipcclxuICogQSByZWR1eCBydW5uZXIgZm9yIG1vYngta2V5c3RvbmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4UnVubmVyPFQ+IHtcclxuICAobmV4dDogUmVkdXhTdG9yZTxUPltcImRpc3BhdGNoXCJdKTogKGFjdGlvbjogUmVkdXhBY3Rpb24pID0+IFJlZHV4QWN0aW9uXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHJlZHV4IG1pZGRsZXdhcmUgZm9yIG1vYngta2V5c3RvbmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4TWlkZGxld2FyZTxUPiB7XHJcbiAgKHN0b3JlOiBSZWR1eFN0b3JlPFQ+KTogUmVkdXhSdW5uZXI8VD5cclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJlZHV4IGNvbXBhdGlibGUgc3RvcmUgb3V0IG9mIGEgbW9ieC1rZXlzdG9uZSBvYmplY3QuXHJcbiAqXHJcbiAqIEB0eXBlcGFyYW0gVCBPYmplY3QgdHlwZS5cclxuICogQHBhcmFtIHRhcmdldCBSb290IG9iamVjdC5cclxuICogQHBhcmFtIG1pZGRsZXdhcmVzIE9wdGlvbmFsIGxpc3Qgb2YgcmVkdXggbWlkZGxld2FyZXMuXHJcbiAqIEByZXR1cm5zIEEgcmVkdXggY29tcGF0aWJsZSBzdG9yZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhc1JlZHV4U3RvcmU8VCBleHRlbmRzIG9iamVjdD4oXHJcbiAgdGFyZ2V0OiBULFxyXG4gIC4uLm1pZGRsZXdhcmVzOiBSZWR1eE1pZGRsZXdhcmU8VD5bXVxyXG4pOiBSZWR1eFN0b3JlPFQ+IHtcclxuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcclxuXHJcbiAgY29uc3QgZGVmYXVsdERpc3BhdGNoID0gKGFjdGlvbjogUmVkdXhBY3Rpb24pID0+IHtcclxuICAgIGlmIChhY3Rpb24udHlwZSAhPT0gcmVkdXhBY3Rpb25UeXBlKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGFjdGlvbiB0eXBlIHdhcyBleHBlY3RlZCB0byBiZSAnJHtyZWR1eEFjdGlvblR5cGV9JywgYnV0IGl0IHdhcyAnJHthY3Rpb24udHlwZX0nYFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlBY3Rpb24odGFyZ2V0LCBhY3Rpb24ucGF5bG9hZClcclxuICAgIHJldHVybiBhY3Rpb25cclxuICB9XHJcblxyXG4gIGxldCBzdG9yZTogUmVkdXhTdG9yZTxUPiA9IHtcclxuICAgIGdldFN0YXRlKCkge1xyXG4gICAgICByZXR1cm4gZ2V0U25hcHNob3QodGFyZ2V0KVxyXG4gICAgfSxcclxuICAgIGRpc3BhdGNoKGFjdGlvbikge1xyXG4gICAgICByZXR1cm4gcnVuTWlkZGxld2FyZXMoYWN0aW9uLCBydW5uZXJzLCBkZWZhdWx0RGlzcGF0Y2gpXHJcbiAgICB9LFxyXG4gICAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XHJcbiAgICAgIHJldHVybiBvblNuYXBzaG90KHRhcmdldCwgbGlzdGVuZXIpXHJcbiAgICB9LFxyXG4gIH1cclxuXHJcbiAgY29uc3QgcnVubmVycyA9IG1pZGRsZXdhcmVzLm1hcCgobXcpID0+IG13KHN0b3JlKSlcclxuXHJcbiAgcmV0dXJuIHN0b3JlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJ1bk1pZGRsZXdhcmVzPFQ+KFxyXG4gIGluaXRpYWxBY3Rpb246IFJlZHV4QWN0aW9uLFxyXG4gIHJ1bm5lcnM6IFJlYWRvbmx5QXJyYXk8UmVkdXhSdW5uZXI8VD4+LFxyXG4gIG5leHQ6IFJlZHV4U3RvcmU8VD5bXCJkaXNwYXRjaFwiXVxyXG4pOiBSZWR1eEFjdGlvbiB7XHJcbiAgbGV0IGkgPSAwXHJcblxyXG4gIGZ1bmN0aW9uIHJ1bk5leHRNaWRkbGV3YXJlKGFjdGlvbjogUmVkdXhBY3Rpb24pOiBSZWR1eEFjdGlvbiB7XHJcbiAgICBjb25zdCBydW5uZXIgPSBydW5uZXJzW2ldXHJcbiAgICBpKytcclxuICAgIGlmIChydW5uZXIpIHtcclxuICAgICAgcmV0dXJuIHJ1bm5lcihydW5OZXh0TWlkZGxld2FyZSkoYWN0aW9uKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJ1bk5leHRNaWRkbGV3YXJlKGluaXRpYWxBY3Rpb24pXHJcbn1cclxuIiwiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbFR5cGVLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBNb2RlbENsYXNzIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL0Jhc2VNb2RlbFNoYXJlZFwiXG5pbXBvcnQgeyB0eXBlc1N0cmluZyB9IGZyb20gXCIuLi90eXBlcy9wcmltaXRpdmVCYXNlZC90eXBlc1ByaW1pdGl2ZVwiXG5pbXBvcnQgeyB0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90UHJvcFwiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuLyoqXG4gKiBBIHJlZmVyZW5jZSBtb2RlbCBiYXNlIHR5cGUuXG4gKiBVc2UgYGN1c3RvbVJlZmAgdG8gY3JlYXRlIGEgY3VzdG9tIHJlZiBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlZjxUIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE1vZGVsKHtcbiAgLyoqXG4gICAqIFJlZmVyZW5jZSBpZC5cbiAgICovXG4gIGlkOiB0UHJvcCh0eXBlc1N0cmluZyksXG59KSB7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZXNvbHZlKCk6IFQgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0aGlzIHJlZmVyZW5jZSBwb2ludHMgdG8sIG9yIGB1bmRlZmluZWRgIGlmIHRoZSByZWZlcmVuY2UgaXMgY3VycmVudGx5IGludmFsaWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IG1heWJlQ3VycmVudCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcmVmZXJlbmNlIGlzIGN1cnJlbnRseSB2YWxpZC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm1heWJlQ3VycmVudFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdGhpcyByZWZlcmVuY2UgcG9pbnRzIHRvLCBvciB0aHJvd3MgaWYgaW52YWxpZC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgY3VycmVudCgpOiBUIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5tYXliZUN1cnJlbnRcblxuICAgIGlmICghY3VycmVudCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGEgcmVmZXJlbmNlIG9mIHR5cGUgJyR7dGhpc1ttb2RlbFR5cGVLZXldfScgY291bGQgbm90IHJlc29sdmUgYW4gb2JqZWN0IHdpdGggaWQgJyR7dGhpcy5pZH0nYFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBiYWNrIHJlZmVyZW5jZXMgZm9yIHRoaXMgcmVmIGFyZSB1cCB0byBkYXRlLlxuICAgKiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgbW9zdCB1cCB0byBkYXRlXG4gICAqIGJhY2sgcmVmZXJlbmNlcyB3aGlsZSBib3RoIHN0aWxsIGluc2lkZSBhbiBhY3Rpb24gYW5kIHdoaWxlIHRoZSByZWZlcmVuY2VcbiAgICogaXMgbm90IGEgY2hpbGQgb2YgdGhlIHNhbWUgcm9vdCB0aGFuIHRoZSB0YXJnZXQuXG4gICAqL1xuICBhYnN0cmFjdCBmb3JjZVVwZGF0ZUJhY2tSZWZzKCk6IHZvaWRcbn1cblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGN1c3RvbVJlZlR5cGVTeW1ib2w6IHVuaXF1ZSBzeW1ib2xcblxuLyoqIEEgcmVmIGNvbnN0cnVjdG9yIGZvciBjdXN0b20gcmVmcyAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWZDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIDxURSBleHRlbmRzIFQ+KHZhbHVlT3JJRDogVEUgfCBzdHJpbmcpOiBSZWY8VEU+XG5cbiAgcmVmQ2xhc3M6IE1vZGVsQ2xhc3M8UmVmPFQ+PlxuXG4gIFtjdXN0b21SZWZUeXBlU3ltYm9sXTogVCAvLyBqdXN0IGZvciB0eXBpbmdzXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcmVmIG9iamVjdCBpcyBvZiBhIGdpdmVuIHJlZiB0eXBlLlxuICpcbiAqIEB0eXBlcGFyYW0gVCBSZWZlcmVuY2VkIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHJlZiBSZWZlcmVuY2Ugb2JqZWN0LlxuICogQHBhcmFtIHJlZlR5cGUgUmVmZXJlbmNlIHR5cGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgb2YgdGhlIGdpdmVuIHR5cGUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmT2ZUeXBlPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICByZWY6IFJlZjxvYmplY3Q+LFxuICByZWZUeXBlOiBSZWZDb25zdHJ1Y3RvcjxUPlxuKTogcmVmIGlzIFJlZjxUPiB7XG4gIHJldHVybiByZWYgaW5zdGFuY2VvZiByZWZUeXBlLnJlZkNsYXNzXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24sIG9ic2VydmFibGUsIE9ic2VydmFibGVTZXQsIHJlYWN0aW9uLCB3aGVuIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvQmFzZU1vZGVsU2hhcmVkXCJcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL21vZGVsRGVjb3JhdG9yXCJcbmltcG9ydCB7XG4gIGdldERlZXBPYmplY3RDaGlsZHJlbixcbiAgcmVnaXN0ZXJEZWVwT2JqZWN0Q2hpbGRyZW5FeHRlbnNpb24sXG59IGZyb20gXCIuLi9wYXJlbnQvY29yZU9iamVjdENoaWxkcmVuXCJcbmltcG9ydCB7IGdldFJvb3QgfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgQ29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZSwgY29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZSB9IGZyb20gXCIuLi9wYXJlbnQvd2Fsa1RyZWVcIlxuaW1wb3J0IHsgYXNzZXJ0VHdlYWtlZE9iamVjdCB9IGZyb20gXCIuLi90d2Vha2VyL2NvcmVcIlxuaW1wb3J0IHsgYXNzZXJ0SXNPYmplY3QsIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGUgfSBmcm9tIFwiLi4vdXRpbHMvbWFwVXRpbHNcIlxuaW1wb3J0IHsgUmVmLCBSZWZDb25zdHJ1Y3RvciB9IGZyb20gXCIuL1JlZlwiXG5cbmludGVyZmFjZSBCYWNrUmVmczxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGFsbDogT2JzZXJ2YWJsZVNldDxSZWY8VD4+XG4gIGJ5VHlwZTogV2Vha01hcDxSZWZDb25zdHJ1Y3RvcjxUPiwgT2JzZXJ2YWJsZVNldDxSZWY8VD4+PlxufVxuXG4vKipcbiAqIEJhY2stcmVmZXJlbmNlcyBmcm9tIG9iamVjdCB0byB0aGUgcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIGl0LlxuICovXG5jb25zdCBvYmplY3RCYWNrUmVmcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQmFja1JlZnM8YW55Pj4oKVxuXG4vKipcbiAqIFJlZmVyZW5jZSByZXNvbHZlciB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBSZWZSZXNvbHZlcjxUIGV4dGVuZHMgb2JqZWN0PiA9IChyZWY6IFJlZjxUPikgPT4gVCB8IHVuZGVmaW5lZFxuXG4vKipcbiAqIFJlZmVyZW5jZSBJRCByZXNvbHZlciB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBSZWZJZFJlc29sdmVyID0gKHRhcmdldDogb2JqZWN0KSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcblxuLyoqXG4gKiBUeXBlIGZvciB0aGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gYSByZWZlcmVuY2UgcmVzb2x2ZWQgdmFsdWUgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlPFQgZXh0ZW5kcyBvYmplY3Q+ID0gKFxuICByZWY6IFJlZjxUPixcbiAgbmV3VmFsdWU6IFQgfCB1bmRlZmluZWQsXG4gIG9sZFZhbHVlOiBUIHwgdW5kZWZpbmVkXG4pID0+IHZvaWRcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsQ3VzdG9tUmVmPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBtb2RlbFR5cGVJZDogc3RyaW5nLFxuICByZXNvbHZlckdlbjogKHJlZjogUmVmPFQ+KSA9PiBSZWZSZXNvbHZlcjxUPixcbiAgZ2V0SWQ6IFJlZklkUmVzb2x2ZXIsXG4gIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZTogUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlPFQ+IHwgdW5kZWZpbmVkXG4pOiBSZWZDb25zdHJ1Y3RvcjxUPiB7XG4gIEBtb2RlbChtb2RlbFR5cGVJZClcbiAgY2xhc3MgQ3VzdG9tUmVmIGV4dGVuZHMgUmVmPFQ+IHtcbiAgICBwcml2YXRlIHJlc29sdmVyPzogUmVmUmVzb2x2ZXI8VD5cblxuICAgIHJlc29sdmUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoIXRoaXMucmVzb2x2ZXIpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyR2VuKHRoaXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyKHRoaXMpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlZE9sZFRhcmdldDogVCB8IHVuZGVmaW5lZFxuXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEZvcmNlVXBkYXRlQmFja1JlZnMobmV3VGFyZ2V0OiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBvbGRUYXJnZXQgPSB0aGlzLnNhdmVkT2xkVGFyZ2V0XG4gICAgICAvLyB1cGRhdGUgZWFybHkgaW4gY2FzZSBvZiB0aHJvd24gZXhjZXB0aW9uc1xuICAgICAgdGhpcy5zYXZlZE9sZFRhcmdldCA9IG5ld1RhcmdldFxuXG4gICAgICB1cGRhdGVCYWNrUmVmcyh0aGlzLCB0aGlzUmVmQ29uc3RydWN0b3IsIG5ld1RhcmdldCwgb2xkVGFyZ2V0KVxuICAgIH1cblxuICAgIEBhY3Rpb25cbiAgICBmb3JjZVVwZGF0ZUJhY2tSZWZzKCkge1xuICAgICAgdGhpcy5pbnRlcm5hbEZvcmNlVXBkYXRlQmFja1JlZnModGhpcy5tYXliZUN1cnJlbnQpXG4gICAgfVxuXG4gICAgb25Jbml0KCkge1xuICAgICAgLy8gbGlzdGVuIHRvIGNoYW5nZXNcblxuICAgICAgbGV0IHNhdmVkT2xkVGFyZ2V0OiBUIHwgdW5kZWZpbmVkXG4gICAgICBsZXQgc2F2ZWRGaXJzdFRpbWUgPSB0cnVlXG5cbiAgICAgIC8vIGFjY29yZGluZyB0byBtd2VzdHJhdGUgdGhpcyB3b24ndCBsZWFrIGFzIGxvbmcgYXMgd2UgZG9uJ3Qga2VlcCB0aGUgZGlzcG9zZXIgYXJvdW5kXG4gICAgICByZWFjdGlvbihcbiAgICAgICAgKCkgPT4gdGhpcy5tYXliZUN1cnJlbnQsXG4gICAgICAgIChuZXdUYXJnZXQpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVybmFsRm9yY2VVcGRhdGVCYWNrUmVmcyhuZXdUYXJnZXQpXG5cbiAgICAgICAgICBjb25zdCBvbGRUYXJnZXQgPSBzYXZlZE9sZFRhcmdldFxuICAgICAgICAgIGNvbnN0IGZpcnN0VGltZSA9IHNhdmVkRmlyc3RUaW1lXG4gICAgICAgICAgLy8gdXBkYXRlIGVhcmx5IGluIGNhc2Ugb2YgdGhyb3duIGV4Y2VwdGlvbnNcbiAgICAgICAgICBzYXZlZE9sZFRhcmdldCA9IG5ld1RhcmdldFxuICAgICAgICAgIHNhdmVkRmlyc3RUaW1lID0gZmFsc2VcblxuICAgICAgICAgIGlmICghZmlyc3RUaW1lICYmIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSAmJiBuZXdUYXJnZXQgIT09IG9sZFRhcmdldCkge1xuICAgICAgICAgICAgb25SZXNvbHZlZFZhbHVlQ2hhbmdlKHRoaXMsIG5ld1RhcmdldCwgb2xkVGFyZ2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZuID0gKHRhcmdldDogVCkgPT4ge1xuICAgIGxldCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlkID0gdGFyZ2V0XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydElzT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcbiAgICAgIGlkID0gZ2V0SWQodGFyZ2V0KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJyZWYgdGFyZ2V0IG9iamVjdCBtdXN0IGhhdmUgYW4gaWQgb2Ygc3RyaW5nIHR5cGVcIilcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBuZXcgQ3VzdG9tUmVmKHtcbiAgICAgIGlkLFxuICAgIH0pXG5cbiAgICByZXR1cm4gcmVmXG4gIH1cbiAgZm4ucmVmQ2xhc3MgPSBDdXN0b21SZWZcblxuICBjb25zdCB0aGlzUmVmQ29uc3RydWN0b3IgPSBmbiBhcyBhbnkgYXMgUmVmQ29uc3RydWN0b3I8VD5cblxuICByZXR1cm4gdGhpc1JlZkNvbnN0cnVjdG9yXG59XG5cbi8qKlxuICogVXNlcyBhIG1vZGVsIGBnZXRSZWZJZCgpYCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUgdG8gZ2V0IGEgcmVmZXJlbmNlIElELlxuICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhhdCBtZXRob2QgaXQgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqIElmIHRoZSBtb2RlbCBoYXMgYW4gaW1wbGVtZW50YXRpb24sIGJ1dCB0aGF0IGltcGxlbWVudGF0aW9uIHJldHVybnMgYW55dGhpbmcgb3RoZXIgdGhhblxuICogYSBgc3RyaW5nYCBpdCB3aWxsIHRocm93LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBnZXQgdGhlIElEIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIElEIG9yIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxSZWZJZCh0YXJnZXQ6IG9iamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01vZGVsKHRhcmdldCkgJiYgdGFyZ2V0LmdldFJlZklkKSB7XG4gICAgY29uc3QgaWQgPSB0YXJnZXQuZ2V0UmVmSWQoKVxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgZmFpbHVyZShcIidnZXRSZWZJZCgpJyBtdXN0IHJldHVybiBhIHN0cmluZyBvciB1bmRlZmluZWQgd2hlbiBwcmVzZW50XCIpXG4gICAgfVxuICAgIHJldHVybiBpZFxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLy8gb25lIGNvbXB1dGVkIGlkIHRyZWUgcGVyIGlkIGZ1bmN0aW9uXG5jb25zdCBjb21wdXRlZElkVHJlZXMgPSBuZXcgV2Vha01hcDxcbiAgKG5vZGU6IG9iamVjdCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBDb21wdXRlZFdhbGtUcmVlQWdncmVnYXRlPHN0cmluZz5cbj4oKVxuXG4vKipcbiAqIFJlc29sdmVzIGEgbm9kZSBnaXZlbiBpdHMgSUQuXG4gKlxuICogQHR5cGVwYXJhbSBUIFRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSByb290IE5vZGUgd2hlcmUgdG8gc3RhcnQgdGhlIHNlYXJjaC4gVGhlIHNlYXJjaCB3aWxsIGJlIGRvbmUgb24gaXQgYW5kIGFsbCBpdHMgY2hpbGRyZW4uXG4gKiBAcGFyYW0gaWQgSUQgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSBnZXRJZCBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIElEIGZyb20gYW4gb2JqZWN0IChgZ2V0TW9kZWxSZWZJZGAgYnkgZGVmYXVsdCkuXG4gKiBAcmV0dXJucyBUaGUgbm9kZSBmb3VuZCBvciBgdW5kZWZpbmVkYCBpZiBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUlkPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICByb290OiBvYmplY3QsXG4gIGlkOiBzdHJpbmcsXG4gIGdldElkOiBSZWZJZFJlc29sdmVyID0gZ2V0TW9kZWxSZWZJZFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIC8vIGNhY2hlL3JldXNlIGNvbXB1dGVkSWRUcmVlcyBmb3Igc2FtZSBnZXRJZCBmdW5jdGlvblxuICBjb25zdCBjb21wdXRlZElkVHJlZSA9IGdldE9yQ3JlYXRlKGNvbXB1dGVkSWRUcmVlcywgZ2V0SWQsICgpID0+XG4gICAgY29tcHV0ZWRXYWxrVHJlZUFnZ3JlZ2F0ZTxzdHJpbmc+KChub2RlKSA9PiBnZXRJZChub2RlKSlcbiAgKVxuXG4gIGNvbnN0IGlkTWFwID0gY29tcHV0ZWRJZFRyZWUud2Fsayhyb290KVxuICByZXR1cm4gaWRNYXAgPyAoaWRNYXAuZ2V0KGlkKSBhcyBUIHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBnZXRCYWNrUmVmczxUIGV4dGVuZHMgb2JqZWN0PihcbiAgdGFyZ2V0OiBULFxuICByZWZUeXBlPzogUmVmQ29uc3RydWN0b3I8VD5cbik6IE9ic2VydmFibGVTZXQ8UmVmPFQ+PiB7XG4gIGxldCBiYWNrUmVmcyA9IG9iamVjdEJhY2tSZWZzLmdldCh0YXJnZXQpXG4gIGlmICghYmFja1JlZnMpIHtcbiAgICBiYWNrUmVmcyA9IHtcbiAgICAgIGFsbDogb2JzZXJ2YWJsZS5zZXQodW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pLFxuICAgICAgYnlUeXBlOiBuZXcgV2Vha01hcCgpLFxuICAgIH1cbiAgICBvYmplY3RCYWNrUmVmcy5zZXQodGFyZ2V0LCBiYWNrUmVmcylcbiAgfVxuXG4gIGlmICghcmVmVHlwZSkge1xuICAgIHJldHVybiBiYWNrUmVmcy5hbGxcbiAgfSBlbHNlIHtcbiAgICBsZXQgYnlUeXBlID0gYmFja1JlZnMuYnlUeXBlLmdldChyZWZUeXBlKVxuICAgIGlmICghYnlUeXBlKSB7XG4gICAgICBieVR5cGUgPSBvYnNlcnZhYmxlLnNldCh1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSlcbiAgICAgIGJhY2tSZWZzLmJ5VHlwZS5zZXQocmVmVHlwZSwgYnlUeXBlKVxuICAgIH1cbiAgICByZXR1cm4gYnlUeXBlXG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGFsbCByZWZlcmVuY2VzIHRoYXQgcmVzb2x2ZSB0byBhIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgUmVmZXJlbmNlZCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgTm9kZSB0aGUgcmVmZXJlbmNlcyBwb2ludCB0by5cbiAqIEBwYXJhbSByZWZUeXBlIFBhc3MgaXQgdG8gZmlsdGVyIGJ5IG9ubHkgcmVmZXJlbmNlcyBvZiBhIGdpdmVuIHR5cGUsIG9yIG9taXQgLyBwYXNzIGB1bmRlZmluZWRgIHRvIGdldCByZWZlcmVuY2VzIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucy5cbiAqIEByZXR1cm5zIEFuIG9ic2VydmFibGUgc2V0IHdpdGggYWxsIHJlZmVyZW5jZSBvYmplY3RzIHRoYXQgcG9pbnQgdG8gdGhlIGdpdmVuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZnNSZXNvbHZpbmdUbzxUIGV4dGVuZHMgb2JqZWN0PihcbiAgdGFyZ2V0OiBULFxuICByZWZUeXBlPzogUmVmQ29uc3RydWN0b3I8VD4sXG4gIG9wdGlvbnM/OiB7XG4gICAgdXBkYXRlQWxsUmVmc0lmTmVlZGVkPzogYm9vbGVhblxuICB9XG4pOiBPYnNlcnZhYmxlU2V0PFJlZjxUPj4ge1xuICBhc3NlcnRUd2Vha2VkT2JqZWN0KHRhcmdldCwgXCJ0YXJnZXRcIilcblxuICBpZiAob3B0aW9ucz8udXBkYXRlQWxsUmVmc0lmTmVlZGVkICYmIGlzUmVhY3Rpb25EZWxheWVkKCkpIHtcbiAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIHJlZmVyZW5jZSB1cGRhdGUgbWlnaHQgaGF2ZSBiZWVuIGRlbGF5ZWRcbiAgICAvLyBzbyB3ZSB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1cGRhdGUgdGhlbVxuICAgIGNvbnN0IHJlZnNDaGVja2VkID0gbmV3IFNldDxSZWY8b2JqZWN0Pj4oKVxuICAgIGNvbnN0IHVwZGF0ZVJlZiA9IChyZWY6IFJlZjxhbnk+KSA9PiB7XG4gICAgICBpZiAoIXJlZnNDaGVja2VkLmhhcyhyZWYpKSB7XG4gICAgICAgIGlmICghcmVmVHlwZSB8fCByZWYgaW5zdGFuY2VvZiByZWZUeXBlLnJlZkNsYXNzKSB7XG4gICAgICAgICAgcmVmLmZvcmNlVXBkYXRlQmFja1JlZnMoKVxuICAgICAgICB9XG4gICAgICAgIHJlZnNDaGVja2VkLmFkZChyZWYpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQmFja1JlZnMgPSBnZXRCYWNrUmVmcyh0YXJnZXQsIHJlZlR5cGUpXG4gICAgb2xkQmFja1JlZnMuZm9yRWFjaCh1cGRhdGVSZWYpXG5cbiAgICBjb25zdCByZWZzQ2hpbGRyZW5PZlJvb3QgPSBnZXREZWVwQ2hpbGRyZW5SZWZzKGdldERlZXBPYmplY3RDaGlsZHJlbihnZXRSb290KHRhcmdldCkpKVxuICAgIGxldCByZWZzOiBTZXQ8UmVmPG9iamVjdD4+IHwgdW5kZWZpbmVkXG4gICAgaWYgKHJlZlR5cGUpIHtcbiAgICAgIHJlZnMgPSByZWZzQ2hpbGRyZW5PZlJvb3QuYnlUeXBlLmdldChyZWZUeXBlLnJlZkNsYXNzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZWZzID0gcmVmc0NoaWxkcmVuT2ZSb290LmFsbFxuICAgIH1cbiAgICByZWZzPy5mb3JFYWNoKHVwZGF0ZVJlZilcbiAgfVxuXG4gIHJldHVybiBnZXRCYWNrUmVmcyh0YXJnZXQsIHJlZlR5cGUpXG59XG5cbmNvbnN0IHVwZGF0ZUJhY2tSZWZzID0gYWN0aW9uKFxuICBcInVwZGF0ZUJhY2tSZWZzXCIsXG4gIDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICByZWY6IFJlZjxUPixcbiAgICByZWZDbGFzczogUmVmQ29uc3RydWN0b3I8VD4sXG4gICAgbmV3VGFyZ2V0OiBUIHwgdW5kZWZpbmVkLFxuICAgIG9sZFRhcmdldDogVCB8IHVuZGVmaW5lZFxuICApID0+IHtcbiAgICBpZiAobmV3VGFyZ2V0ID09PSBvbGRUYXJnZXQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChvbGRUYXJnZXQpIHtcbiAgICAgIGdldEJhY2tSZWZzKG9sZFRhcmdldCkuZGVsZXRlKHJlZilcbiAgICAgIGdldEJhY2tSZWZzKG9sZFRhcmdldCwgcmVmQ2xhc3MgYXMgUmVmQ29uc3RydWN0b3I8YW55PikuZGVsZXRlKHJlZilcbiAgICB9XG4gICAgaWYgKG5ld1RhcmdldCkge1xuICAgICAgZ2V0QmFja1JlZnMobmV3VGFyZ2V0KS5hZGQocmVmKVxuICAgICAgZ2V0QmFja1JlZnMobmV3VGFyZ2V0LCByZWZDbGFzcyBhcyBSZWZDb25zdHJ1Y3Rvcjxhbnk+KS5hZGQocmVmKVxuICAgIH1cbiAgfVxuKVxuXG5mdW5jdGlvbiBpc1JlYWN0aW9uRGVsYXllZCgpIHtcbiAgbGV0IHJlYWN0aW9uRGVsYXllZCA9IHRydWVcbiAgY29uc3QgZGlzcG9zZSA9IHdoZW4oXG4gICAgKCkgPT4gdHJ1ZSxcbiAgICAoKSA9PiB7XG4gICAgICByZWFjdGlvbkRlbGF5ZWQgPSBmYWxzZVxuICAgIH1cbiAgKVxuICBkaXNwb3NlKClcbiAgcmV0dXJuIHJlYWN0aW9uRGVsYXllZFxufVxuXG5pbnRlcmZhY2UgRGVlcENoaWxkcmVuUmVmcyB7XG4gIGFsbDogU2V0PFJlZjxhbnk+PlxuICBieVR5cGU6IFdlYWtNYXA8TW9kZWxDbGFzczxSZWY8YW55Pj4sIFNldDxSZWY8YW55Pj4+XG59XG5cbmNvbnN0IGdldERlZXBDaGlsZHJlblJlZnMgPSByZWdpc3RlckRlZXBPYmplY3RDaGlsZHJlbkV4dGVuc2lvbjxEZWVwQ2hpbGRyZW5SZWZzPih7XG4gIGluaXREYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbGw6IG5ldyBTZXQoKSxcbiAgICAgIGJ5VHlwZTogbmV3IFdlYWtNYXAoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkTm9kZShub2RlLCBkYXRhKSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWYpIHtcbiAgICAgIGRhdGEuYWxsLmFkZChub2RlKVxuICAgICAgY29uc3QgcmVmc0J5VGhpc1R5cGUgPSBnZXRPckNyZWF0ZShkYXRhLmJ5VHlwZSwgbm9kZS5jb25zdHJ1Y3RvciwgKCkgPT4gbmV3IFNldCgpKVxuICAgICAgcmVmc0J5VGhpc1R5cGUuYWRkKG5vZGUpXG4gICAgfVxuICB9LFxufSlcbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIGdldE1vZGVsUmVmSWQsXG4gIGludGVybmFsQ3VzdG9tUmVmLFxuICBSZWZJZFJlc29sdmVyLFxuICBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2UsXG4gIFJlZlJlc29sdmVyLFxufSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUmVmQ29uc3RydWN0b3IgfSBmcm9tIFwiLi9SZWZcIlxuXG4vKipcbiAqIEN1c3RvbSByZWZlcmVuY2Ugb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SZWZPcHRpb25zPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIE11c3QgcmV0dXJuIHRoZSByZXNvbHV0aW9uIGZvciB0aGUgZ2l2ZW4gcmVmZXJlbmNlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHJlZiBSZWZlcmVuY2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZXNvbHZlOiBSZWZSZXNvbHZlcjxUPlxuXG4gIC8qKlxuICAgKiBNdXN0IHJldHVybiB0aGUgSUQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdCwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgaGFzIG5vIElELlxuICAgKiBJZiBub3QgcHJvdmlkZWQgaXQgd2lsbCB0cnkgdG8gZ2V0IHRoZSByZWZlcmVuY2UgaWQgZnJvbSB0aGUgbW9kZWwgYGdldFJlZklkKClgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCBUYXJnZXQgb2JqZWN0LlxuICAgKi9cbiAgZ2V0SWQ/OiBSZWZJZFJlc29sdmVyXG5cbiAgLyoqXG4gICAqIFdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIHRoZSByZXNvbHZlZCB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVmIFJlZmVyZW5jZSBvYmplY3QuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBOZXcgcmVzb2x2ZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSBPbGQgcmVzb2x2ZWQgdmFsdWUuXG4gICAqL1xuICBvblJlc29sdmVkVmFsdWVDaGFuZ2U/OiBSZWZPblJlc29sdmVkVmFsdWVDaGFuZ2U8VD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIHJlZiB0byBhbiBvYmplY3QsIHdoaWNoIGluIGl0cyBzbmFwc2hvdCBmb3JtIGhhcyBhbiBpZC5cbiAqXG4gKiBAdHlwZXBhcmFtIFQgVGFyZ2V0IG9iamVjdCB0eXBlLlxuICogQHBhcmFtIG1vZGVsVHlwZUlkIFVuaXF1ZSBtb2RlbCB0eXBlIGlkLlxuICogQHBhcmFtIG9wdGlvbnMgQ3VzdG9tIHJlZmVyZW5jZSBvcHRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGFsbG93cyB5b3UgdG8gY29uc3RydWN0IHRoYXQgdHlwZSBvZiBjdXN0b20gcmVmZXJlbmNlLlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9tUmVmOiA8VCBleHRlbmRzIG9iamVjdD4oXG4gIG1vZGVsVHlwZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEN1c3RvbVJlZk9wdGlvbnM8VD5cbikgPT4gUmVmQ29uc3RydWN0b3I8VD4gPSBhY3Rpb24oXCJjdXN0b21SZWZcIiwgKG1vZGVsVHlwZUlkLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGdldElkID0gb3B0aW9ucy5nZXRJZCA/PyBnZXRNb2RlbFJlZklkXG5cbiAgcmV0dXJuIGludGVybmFsQ3VzdG9tUmVmKG1vZGVsVHlwZUlkLCAoKSA9PiBvcHRpb25zLnJlc29sdmUsIGdldElkLCBvcHRpb25zLm9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSlcbn0pXG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBmYXN0R2V0Um9vdCB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQge1xuICBnZXRNb2RlbFJlZklkLFxuICBpbnRlcm5hbEN1c3RvbVJlZixcbiAgUmVmSWRSZXNvbHZlcixcbiAgUmVmT25SZXNvbHZlZFZhbHVlQ2hhbmdlLFxuICBSZWZSZXNvbHZlcixcbiAgcmVzb2x2ZUlkLFxufSBmcm9tIFwiLi9jb3JlXCJcbmltcG9ydCB0eXBlIHsgUmVmLCBSZWZDb25zdHJ1Y3RvciB9IGZyb20gXCIuL1JlZlwiXG5cbi8qKlxuICogQ3VzdG9tIHJlZmVyZW5jZSBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RSZWZPcHRpb25zPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIE11c3QgcmV0dXJuIHRoZSBJRCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiB0YXJnZXQgb2JqZWN0LCBvciBgdW5kZWZpbmVkYCBpZiBpdCBoYXMgbm8gSUQuXG4gICAqIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIHRyeSB0byBnZXQgdGhlIHJlZmVyZW5jZSBpZCBmcm9tIHRoZSBtb2RlbCBgZ2V0UmVmSWQoKWAgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBvYmplY3QuXG4gICAqL1xuICBnZXRJZD86IFJlZklkUmVzb2x2ZXJcblxuICAvKipcbiAgICogV2hhdCBzaG91bGQgaGFwcGVuIHdoZW4gdGhlIHJlc29sdmVkIHZhbHVlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSByZWYgUmVmZXJlbmNlIG9iamVjdC5cbiAgICogQHBhcmFtIG5ld1ZhbHVlIE5ldyByZXNvbHZlZCB2YWx1ZS5cbiAgICogQHBhcmFtIG9sZFZhbHVlIE9sZCByZXNvbHZlZCB2YWx1ZS5cbiAgICovXG4gIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZT86IFJlZk9uUmVzb2x2ZWRWYWx1ZUNoYW5nZTxUPlxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByb290IHJlZiB0byBhbiBvYmplY3QsIHdoaWNoIGluIGl0cyBzbmFwc2hvdCBmb3JtIGhhcyBhbiBpZC5cbiAqIEEgcm9vdCByZWYgd2lsbCBvbmx5IGJlIGFibGUgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIGFzIGxvbmcgYXMgYm90aCB0aGUgUmVmXG4gKiBhbmQgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IHNoYXJlIGEgY29tbW9uIHJvb3QuXG4gKlxuICogQHR5cGVwYXJhbSBUIFRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSBtb2RlbFR5cGVJZCBVbmlxdWUgbW9kZWwgdHlwZSBpZC5cbiAqIEBwYXJhbSBbb3B0aW9uc10gUm9vdCByZWZlcmVuY2Ugb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgeW91IHRvIGNvbnN0cnVjdCB0aGF0IHR5cGUgb2Ygcm9vdCByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCByb290UmVmOiA8VCBleHRlbmRzIG9iamVjdD4oXG4gIG1vZGVsVHlwZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBSb290UmVmT3B0aW9uczxUPiB8IHVuZGVmaW5lZFxuKSA9PiBSZWZDb25zdHJ1Y3RvcjxUPiA9IGFjdGlvbihcbiAgXCJyb290UmVmXCIsXG4gIDxUIGV4dGVuZHMgb2JqZWN0Pihtb2RlbFR5cGVJZDogc3RyaW5nLCBvcHRpb25zPzogUm9vdFJlZk9wdGlvbnM8VD4pOiBSZWZDb25zdHJ1Y3RvcjxUPiA9PiB7XG4gICAgY29uc3QgZ2V0SWQgPSBvcHRpb25zPy5nZXRJZCA/PyBnZXRNb2RlbFJlZklkXG4gICAgY29uc3Qgb25SZXNvbHZlZFZhbHVlQ2hhbmdlID0gb3B0aW9ucz8ub25SZXNvbHZlZFZhbHVlQ2hhbmdlXG5cbiAgICBjb25zdCByZXNvbHZlckdlbiA9IChyZWY6IFJlZjxUPik6IFJlZlJlc29sdmVyPFQ+ID0+IHtcbiAgICAgIGxldCBjYWNoZWRUYXJnZXQ6IFQgfCB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVmUm9vdCA9IGZhc3RHZXRSb290KHJlZilcblxuICAgICAgICBpZiAoaXNSZWZSb290Q2FjaGVkVGFyZ2V0T2socmVmLCByZWZSb290LCBjYWNoZWRUYXJnZXQsIGdldElkKSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZWRUYXJnZXRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gbm90IGZvdW5kLCBldmVyeXRpbWUgYSBjaGlsZCBpcyBhZGRlZC9yZW1vdmVkIG9yIGl0cyBpZCBjaGFuZ2VzIHdlIHdpbGwgcGVyZm9ybSBhbm90aGVyIHNlYXJjaFxuICAgICAgICAvLyB0aGlzIHNlYXJjaCBpcyBvbmx5IGRvbmUgb25jZSBmb3IgZXZlcnkgZGlzdGluY3QgZ2V0SWQgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gcmVzb2x2ZUlkPFQ+KHJlZlJvb3QsIHJlZi5pZCwgZ2V0SWQpXG4gICAgICAgIGlmIChuZXdUYXJnZXQpIHtcbiAgICAgICAgICBjYWNoZWRUYXJnZXQgPSBuZXdUYXJnZXRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VGFyZ2V0XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVybmFsQ3VzdG9tUmVmKG1vZGVsVHlwZUlkLCByZXNvbHZlckdlbiwgZ2V0SWQsIG9uUmVzb2x2ZWRWYWx1ZUNoYW5nZSlcbiAgfVxuKVxuXG5mdW5jdGlvbiBpc1JlZlJvb3RDYWNoZWRUYXJnZXRPazxUIGV4dGVuZHMgb2JqZWN0PihcbiAgcmVmOiBSZWY8VD4sXG4gIHJlZlJvb3Q6IG9iamVjdCxcbiAgY2FjaGVkVGFyZ2V0OiBUIHwgdW5kZWZpbmVkLFxuICBnZXRJZDogUmVmSWRSZXNvbHZlclxuKTogY2FjaGVkVGFyZ2V0IGlzIFQge1xuICBpZiAoIWNhY2hlZFRhcmdldCkgcmV0dXJuIGZhbHNlXG4gIGlmIChyZWYuaWQgIT09IGdldElkKGNhY2hlZFRhcmdldCkpIHJldHVybiBmYWxzZVxuICBpZiAocmVmUm9vdCAhPT0gZmFzdEdldFJvb3QoY2FjaGVkVGFyZ2V0KSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQgeyBhZGRTdGFuZGFsb25lQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uc1wiXG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YW5kYWxvbmUgYWN0aW9uLiBBIHN0YW5kYWxvbmUgYWN0aW9uIG11c3QgYWx3YXlzIHRha2UgYW4gZXhpc3RpbmcgdHJlZSBub2RlIGFzIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBhY3Rpb25OYW1lIFVuaXF1ZSBhY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSBmbiBGdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmdW5jdGlvbiBhcyBhbiBzdGFuZGFsb25lIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW5kYWxvbmVBY3Rpb248Rk4gZXh0ZW5kcyAodGFyZ2V0OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gIGZuOiBGTlxuKTogRk4ge1xuICByZXR1cm4gYWRkU3RhbmRhbG9uZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgZmFsc2UpIGFzIHVua25vd24gYXMgRk5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhbmRhbG9uZSBmbG93LiBBIHN0YW5kYWxvbmUgZmxvdyBtdXN0IGFsd2F5cyB0YWtlIGFuIGV4aXN0aW5nIHRyZWUgbm9kZSBhcyBmaXJzdCBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBVbmlxdWUgYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0gZm4gRnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZnVuY3Rpb24gYXMgYW4gc3RhbmRhbG9uZSBmbG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhbG9uZUZsb3c8XG4gIEZOIGV4dGVuZHMgKHRhcmdldDogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gR2VuZXJhdG9yPGFueSwgYW55LCBhbnk+XG4+KGFjdGlvbk5hbWU6IHN0cmluZywgZm46IEZOKTogRk4ge1xuICByZXR1cm4gYWRkU3RhbmRhbG9uZUFjdGlvbihhY3Rpb25OYW1lLCBmbiwgdHJ1ZSkgYXMgdW5rbm93biBhcyBGTlxufVxuIiwiaW1wb3J0IHsgcmVtb3ZlLCBzZXQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyB0b1RyZWVOb2RlIH0gZnJvbSBcIi4uL3R3ZWFrZXIvdHdlYWtcIlxuaW1wb3J0IHsgbmFtZXNwYWNlIGFzIG5zIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHN0YW5kYWxvbmVBY3Rpb24gfSBmcm9tIFwiLi9zdGFuZGFsb25lQWN0aW9uc1wiXG5cbmZ1bmN0aW9uIF9zcGxpY2UoYXJyYXk6IGFueVtdLCBzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudD86IG51bWJlcik6IGFueVtdXG5mdW5jdGlvbiBfc3BsaWNlKGFycmF5OiBhbnlbXSwgc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IGFueVtdKTogYW55W11cbmZ1bmN0aW9uIF9zcGxpY2UoYXJyYXk6IGFueVtdLCAuLi5hcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgcmV0dXJuIChhcnJheS5zcGxpY2UgYXMgYW55KSguLi5hcmdzKVxufVxuXG5jb25zdCBuYW1lc3BhY2UgPSBgJHtuc30vYXJyYXlBY3Rpb25zYFxuXG5leHBvcnQgY29uc3QgYXJyYXlBY3Rpb25zID0ge1xuICBzZXQ6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6c2V0YCwgPFQ+KGFycmF5OiBUW10sIGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkID0+IHtcbiAgICBzZXQoYXJyYXksIGluZGV4LCB2YWx1ZSlcbiAgfSksXG5cbiAgZGVsZXRlOiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OmRlbGV0ZWAsIDxUPihhcnJheTogVFtdLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIHJlbW92ZShhcnJheSwgXCJcIiArIGluZGV4KVxuICB9KSxcblxuICBzZXRMZW5ndGg6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6c2V0TGVuZ3RoYCwgPFQ+KGFycmF5OiBUW10sIGxlbmd0aDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgYXJyYXkubGVuZ3RoID0gbGVuZ3RoXG4gIH0pLFxuXG4gIGNvbmNhdDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9Ojpjb25jYXRgLFxuICAgIDxUPihhcnJheTogVFtdLCAuLi5pdGVtczogQ29uY2F0QXJyYXk8VD5bXSk6IFRbXSA9PiB7XG4gICAgICByZXR1cm4gYXJyYXkuY29uY2F0KC4uLml0ZW1zKVxuICAgIH1cbiAgKSxcblxuICBjb3B5V2l0aGluOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmNvcHlXaXRoaW5gLFxuICAgIDxUPihhcnJheTogVFtdLCB0YXJnZXQ6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogVFtdID0+IHtcbiAgICAgIHJldHVybiBhcnJheS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZClcbiAgICB9XG4gICksXG5cbiAgZmlsbDogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpmaWxsYCxcbiAgICA8VD4oYXJyYXk6IFRbXSwgdmFsdWU6IFQsIHN0YXJ0PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBlbmQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBUW10gPT4ge1xuICAgICAgcmV0dXJuIGFycmF5LmZpbGwodmFsdWUsIHN0YXJ0LCBlbmQpXG4gICAgfVxuICApLFxuXG4gIHBvcDogc3RhbmRhbG9uZUFjdGlvbihgJHtuYW1lc3BhY2V9Ojpwb3BgLCA8VD4oYXJyYXk6IFRbXSk6IFQgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiBhcnJheS5wb3AoKVxuICB9KSxcblxuICBwdXNoOiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnB1c2hgLCA8VD4oYXJyYXk6IFRbXSwgLi4uaXRlbXM6IFRbXSk6IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIGFycmF5LnB1c2goLi4uaXRlbXMpXG4gIH0pLFxuXG4gIHJldmVyc2U6IHN0YW5kYWxvbmVBY3Rpb24oYCR7bmFtZXNwYWNlfTo6cmV2ZXJzZWAsIDxUPihhcnJheTogVFtdKTogVFtdID0+IHtcbiAgICByZXR1cm4gYXJyYXkucmV2ZXJzZSgpXG4gIH0pLFxuXG4gIHNoaWZ0OiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnNoaWZ0YCwgPFQ+KGFycmF5OiBUW10pOiBUIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gYXJyYXkuc2hpZnQoKVxuICB9KSxcblxuICBzbGljZTogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpzbGljZWAsXG4gICAgPFQ+KGFycmF5OiBUW10sIHN0YXJ0PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBlbmQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBUW10gPT4ge1xuICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgfVxuICApLFxuXG4gIHNvcnQ6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6c29ydGAsXG4gICAgPFQ+KGFycmF5OiBUW10sIGNvbXBhcmVGbj86ICgoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZCk6IFRbXSA9PiB7XG4gICAgICByZXR1cm4gYXJyYXkuc29ydChjb21wYXJlRm4pXG4gICAgfVxuICApLFxuXG4gIHNwbGljZTogc3RhbmRhbG9uZUFjdGlvbihcbiAgICBgJHtuYW1lc3BhY2V9OjpzcGxpY2VgLFxuICAgIF9zcGxpY2UgYXNcbiAgICAgIHwgKDxUPihhcnJheTogVFtdLCBzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudD86IG51bWJlcikgPT4gVFtdKVxuICAgICAgfCAoPFQ+KGFycmF5OiBUW10sIHN0YXJ0OiBudW1iZXIsIGRlbGV0ZUNvdW50OiBudW1iZXIsIC4uLml0ZW1zOiBUW10pID0+IFRbXSlcbiAgKSxcblxuICB1bnNoaWZ0OiBzdGFuZGFsb25lQWN0aW9uKGAke25hbWVzcGFjZX06OnVuc2hpZnRgLCA8VD4oYXJyYXk6IFRbXSwgLi4uaXRlbXM6IFRbXSk6IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpXG4gIH0pLFxuXG4gIHN3YXA6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6c3dhcGAsXG4gICAgPFQ+KGFycmF5OiBUW10sIGluZGV4MTogbnVtYmVyLCBpbmRleDI6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKGluZGV4MSA8IDAgfHwgaW5kZXgyIDwgMCB8fCBpbmRleDEgPj0gYXJyYXkubGVuZ3RoIHx8IGluZGV4MiA+PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoaW5kZXgyIDwgaW5kZXgxKSB7XG4gICAgICAgIDtbaW5kZXgxLCBpbmRleDJdID0gW2luZGV4MiwgaW5kZXgxXVxuICAgICAgfVxuICAgICAgLy8gc2luY2UgYSBzYW1lIG5vZGUgY2Fubm90IGJlIGluIHR3byBwbGFjZXMgYXQgb25jZSB3ZSB3aWxsIHJlbW92ZVxuICAgICAgLy8gYm90aCB0aGVuIHJlaW5zZXJ0IHRoZW1cbiAgICAgIGNvbnN0IFt2MV0gPSBhcnJheS5zcGxpY2UoaW5kZXgxLCAxKVxuICAgICAgY29uc3QgW3YyXSA9IGFycmF5LnNwbGljZShpbmRleDIgLSAxLCAxKVxuICAgICAgYXJyYXkuc3BsaWNlKGluZGV4MSwgMCwgdjIpXG4gICAgICBhcnJheS5zcGxpY2UoaW5kZXgyLCAwLCB2MSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICApLFxuXG4gIGNyZWF0ZTogPFQ+KGRhdGE6IFRbXSk6IFRbXSA9PiB0b1RyZWVOb2RlKGRhdGEpLFxufVxuIiwiaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCByZW1vdmUsIHNldCB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IHRvVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHdlYWtlci90d2Vha1wiXG5pbXBvcnQgeyBhc3NlcnRJc09iamVjdCwgbmFtZXNwYWNlIGFzIG5zIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHN0YW5kYWxvbmVBY3Rpb24gfSBmcm9tIFwiLi9zdGFuZGFsb25lQWN0aW9uc1wiXG5cbmNvbnN0IG5hbWVzcGFjZSA9IGAke25zfS9vYmplY3RBY3Rpb25zYFxuXG5leHBvcnQgY29uc3Qgb2JqZWN0QWN0aW9ucyA9IHtcbiAgc2V0OiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OnNldGAsXG4gICAgPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPih0YXJnZXQ6IFQsIGtleTogSywgdmFsdWU6IFRbS10pOiB2b2lkID0+IHtcbiAgICAgIGlmIChpc09ic2VydmFibGUodGFyZ2V0KSkge1xuICAgICAgICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgKSxcblxuICBhc3NpZ246IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6YXNzaWduYCxcbiAgICA8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBULCBwYXJ0aWFsT2JqZWN0OiBQYXJ0aWFsPFQ+KTogdm9pZCA9PiB7XG4gICAgICBhc3NlcnRJc09iamVjdChwYXJ0aWFsT2JqZWN0LCBcInBhcnRpYWxPYmplY3RcIilcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwYXJ0aWFsT2JqZWN0KVxuXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgIHNldCh0YXJnZXQsIGtleSwgKHBhcnRpYWxPYmplY3QgYXMgYW55KVtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgOyh0YXJnZXQgYXMgYW55KVtrZXldID0gKHBhcnRpYWxPYmplY3QgYXMgYW55KVtrZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICksXG5cbiAgZGVsZXRlOiBzdGFuZGFsb25lQWN0aW9uKFxuICAgIGAke25hbWVzcGFjZX06OmRlbGV0ZWAsXG4gICAgPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPih0YXJnZXQ6IFQsIGtleTogSyk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIHJlbW92ZSh0YXJnZXQsIGtleSBhcyBhbnkpXG4gICAgfVxuICApLFxuXG4gIGNhbGw6IHN0YW5kYWxvbmVBY3Rpb24oXG4gICAgYCR7bmFtZXNwYWNlfTo6Y2FsbGAsXG4gICAgPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIHRhcmdldDogVCxcbiAgICAgIG1ldGhvZE5hbWU6IEssXG4gICAgICAuLi5hcmdzOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBQYXJhbWV0ZXJzPFRbS10+IDogbmV2ZXJcbiAgICApOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBSZXR1cm5UeXBlPFRbS10+IDogbmV2ZXIgPT4ge1xuICAgICAgcmV0dXJuICh0YXJnZXQgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgIH1cbiAgKSxcblxuICBjcmVhdGU6IDxUIGV4dGVuZHMgb2JqZWN0PihkYXRhOiBUKTogVCA9PiB0b1RyZWVOb2RlKGRhdGEpLFxufVxuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdGFnIGRhdGEgYWNjZXNzb3IgZm9yIGEgdGFyZ2V0IG9iamVjdCBvZiBhIGNlcnRhaW4gdHlwZS5cbiAqIFRhZyBkYXRhIHdpbGwgYmUgbGF6eSBjcmVhdGVkIG9uIGFjY2VzcyBhbmQgcmV1c2VkIGZvciB0aGUgc2FtZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEB0eXBlcGFyYW0gVGFyZ2V0IFRhcmdldCB0eXBlLlxuICogQHR5cGVwYXJhbSBUYWdEYXRhIFRhZyBkYXRhIHR5cGUuXG4gKiBAcGFyYW0gdGFnRGF0YUNvbnN0cnVjdG9yIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgdGhlIHRhZ1xuICogZm9yIGEgZ2l2ZW4gb2JqZWN0IGlzIHJlcXVlc3RlZC5cbiAqIEByZXR1cm5zIFRoZSB0YWcgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWc8VGFyZ2V0IGV4dGVuZHMgb2JqZWN0LCBUYWdEYXRhPihcbiAgdGFnRGF0YUNvbnN0cnVjdG9yOiAodGFyZ2V0OiBUYXJnZXQpID0+IFRhZ0RhdGFcbik6IHtcbiAgZm9yKHRhcmdldDogVGFyZ2V0KTogVGFnRGF0YVxufSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBXZWFrTWFwPFRhcmdldCwgVGFnRGF0YT4oKVxuXG4gIHJldHVybiB7XG4gICAgZm9yKHRhcmdldCk6IFRhZ0RhdGEge1xuICAgICAgaWYgKCFtYXAuaGFzKHRhcmdldCkpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRhZ0RhdGFDb25zdHJ1Y3Rvcih0YXJnZXQpXG4gICAgICAgIG1hcC5zZXQodGFyZ2V0LCBkYXRhKVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQodGFyZ2V0KSFcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQge1xuICBhY3Rpb24sXG4gIElNYXBXaWxsQ2hhbmdlLFxuICBpbnRlcmNlcHQsXG4gIElPYmplY3REaWRDaGFuZ2UsXG4gIElPYnNlcnZhYmxlQXJyYXksXG4gIGlzT2JzZXJ2YWJsZUFycmF5LFxuICBpc09ic2VydmFibGVPYmplY3QsXG4gIG9ic2VydmFibGUsXG4gIE9ic2VydmFibGVNYXAsXG4gIG9ic2VydmUsXG4gIHJlbW92ZSxcbiAgc2V0LFxufSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBhc3NlcnRJc01hcCxcbiAgYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXksXG4gIGFzc2VydElzT2JzZXJ2YWJsZU9iamVjdCxcbiAgZmFpbHVyZSxcbiAgZ2V0TW9ieFZlcnNpb24sXG4gIGluRGV2TW9kZSxcbiAgaXNBcnJheSxcbn0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IHRhZyB9IGZyb20gXCIuLi91dGlscy90YWdcIlxuXG5jb25zdCBvYnNlcnZhYmxlTWFwQmFja2VkQnlPYnNlcnZhYmxlT2JqZWN0ID0gYWN0aW9uKFxuICA8VD4oXG4gICAgb2JqOiBvYmplY3RcbiAgKTogT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFQ+ICYge1xuICAgIGRhdGFPYmplY3Q6IHR5cGVvZiBvYmpcbiAgfSA9PiB7XG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoIWlzT2JzZXJ2YWJsZU9iamVjdChvYmopKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXCJhc3NlcnRpb24gZmFpbGVkOiBleHBlY3RlZCBhbiBvYnNlcnZhYmxlIG9iamVjdFwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG9ic2VydmFibGUubWFwKClcbiAgICA7KG1hcCBhcyBhbnkpLmRhdGFPYmplY3QgPSBvYmpcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgbWFwLnNldChrLCAob2JqIGFzIGFueSlba10pXG4gICAgfVxuXG4gICAgbGV0IG1hcEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgb2JqZWN0QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuXG4gICAgLy8gd2hlbiB0aGUgb2JqZWN0IGNoYW5nZXMgdGhlIG1hcCBjaGFuZ2VzXG4gICAgb2JzZXJ2ZShcbiAgICAgIG9iaixcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBJT2JqZWN0RGlkQ2hhbmdlKSA9PiB7XG4gICAgICAgIGlmIChtYXBBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgb2JqZWN0QWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgbWFwLnNldChjaGFuZ2UubmFtZSwgY2hhbmdlLm5ld1ZhbHVlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgICAgbWFwLmRlbGV0ZShjaGFuZ2UubmFtZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgb2JqZWN0QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIC8vIHdoZW4gdGhlIG1hcCBjaGFuZ2VzIGFsc28gY2hhbmdlIHRoZSBvYmplY3RcbiAgICBpbnRlcmNlcHQoXG4gICAgICBtYXAsXG4gICAgICBhY3Rpb24oKGNoYW5nZTogSU1hcFdpbGxDaGFuZ2U8c3RyaW5nLCBUPikgPT4ge1xuICAgICAgICBpZiAobWFwQWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iamVjdEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwQWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgc2V0KG9iaiwgY2hhbmdlLm5hbWUsIGNoYW5nZS5uZXdWYWx1ZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVwiOiB7XG4gICAgICAgICAgICAgIHJlbW92ZShvYmosIGNoYW5nZS5uYW1lKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBtYXBBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgcmV0dXJuIG1hcCBhcyBhbnlcbiAgfVxuKVxuXG5jb25zdCBvYnNlcnZhYmxlTWFwQmFja2VkQnlPYnNlcnZhYmxlQXJyYXkgPSBhY3Rpb24oXG4gIDxUPihcbiAgICBhcnJheTogSU9ic2VydmFibGVBcnJheTxbc3RyaW5nLCBUXT5cbiAgKTogT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFQ+ICYgeyBkYXRhT2JqZWN0OiB0eXBlb2YgYXJyYXkgfSA9PiB7XG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoIWlzT2JzZXJ2YWJsZUFycmF5KGFycmF5KSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwiYXNzZXJ0aW9uIGZhaWxlZDogZXhwZWN0ZWQgYW4gb2JzZXJ2YWJsZSBhcnJheVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtYXA6IE9ic2VydmFibGVNYXA8c3RyaW5nLCBUPlxuICAgIGlmIChnZXRNb2J4VmVyc2lvbigpID49IDYpIHtcbiAgICAgIG1hcCA9IG9ic2VydmFibGUubWFwKGFycmF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXAgPSBvYnNlcnZhYmxlLm1hcCgpXG4gICAgICBhcnJheS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgbWFwLnNldChrLCB2KVxuICAgICAgfSlcbiAgICB9XG4gICAgOyhtYXAgYXMgYW55KS5kYXRhT2JqZWN0ID0gYXJyYXlcblxuICAgIGlmIChtYXAuc2l6ZSAhPT0gYXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYXJyYXlzIGJhY2tpbmcgYSBtYXAgY2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGtleXNcIilcbiAgICB9XG5cbiAgICBsZXQgbWFwQWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBhcnJheUFscmVhZHlDaGFuZ2VkID0gZmFsc2VcblxuICAgIC8vIGZvciBzcGVlZCByZWFzb25zIHdlIHdpbGwganVzdCBhc3N1bWUgZGlzdGluY3QgdmFsdWVzIGFyZSBvbmx5IG9uY2UgaW4gdGhlIGFycmF5XG4gICAgLy8gYWxzbyB3ZSBhc3N1bWUgdHVwbGVzIHRoZW1zZWx2ZXMgYXJlIGltbXV0YWJsZVxuXG4gICAgLy8gd2hlbiB0aGUgYXJyYXkgY2hhbmdlcyB0aGUgbWFwIGNoYW5nZXNcbiAgICBvYnNlcnZlKFxuICAgICAgYXJyYXksXG4gICAgICBhY3Rpb24oKGNoYW5nZTogYW55IC8qSUFycmF5RGlkQ2hhbmdlPFtzdHJpbmcsIFRdPiovKSA9PiB7XG4gICAgICAgIGlmIChtYXBBbHJlYWR5Q2hhbmdlZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IHRydWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3BsaWNlXCI6IHtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjaGFuZ2UucmVtb3ZlZFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgbWFwLmRlbGV0ZShyZW1vdmVkW2ldWzBdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRlZCA9IGNoYW5nZS5hZGRlZFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIG1hcC5zZXQoYWRkZWRbaV1bMF0sIGFkZGVkW2ldWzFdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgICBtYXAuZGVsZXRlKGNoYW5nZS5vbGRWYWx1ZVswXSlcbiAgICAgICAgICAgICAgbWFwLnNldChjaGFuZ2UubmV3VmFsdWVbMF0sIGNoYW5nZS5uZXdWYWx1ZVsxXSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgLy8gd2hlbiB0aGUgbWFwIGNoYW5nZXMgYWxzbyBjaGFuZ2UgdGhlIGFycmF5XG4gICAgaW50ZXJjZXB0KFxuICAgICAgbWFwLFxuICAgICAgYWN0aW9uKChjaGFuZ2U6IElNYXBXaWxsQ2hhbmdlPHN0cmluZywgVD4pID0+IHtcbiAgICAgICAgaWYgKG1hcEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJheUFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwQWxyZWFkeUNoYW5nZWQgPSB0cnVlXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgd2hvbGUgdHVwbGUgdG8ga2VlcCB0dXBsZSBpbW11dGFiaWxpdHlcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGFycmF5LmZpbmRJbmRleCgoaSkgPT4gaVswXSA9PT0gY2hhbmdlLm5hbWUpXG4gICAgICAgICAgICAgIGFycmF5W2ldID0gW2NoYW5nZS5uYW1lLCBjaGFuZ2UubmV3VmFsdWUhXVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgICAgICAgYXJyYXkucHVzaChbY2hhbmdlLm5hbWUsIGNoYW5nZS5uZXdWYWx1ZSFdKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIFwiZGVsZXRlXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGFycmF5LmZpbmRJbmRleCgoaSkgPT4gaVswXSA9PT0gY2hhbmdlLm5hbWUpXG4gICAgICAgICAgICAgIGlmIChpID49IDApIHtcbiAgICAgICAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBtYXBBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuXG4gICAgcmV0dXJuIG1hcCBhcyBhbnlcbiAgfVxuKVxuXG5jb25zdCBhc01hcFRhZyA9IHRhZygob2JqT3JBcnJheTogUmVjb3JkPHN0cmluZywgYW55PiB8IEFycmF5PFtzdHJpbmcsIGFueV0+KSA9PiB7XG4gIGlmIChpc0FycmF5KG9iak9yQXJyYXkpKSB7XG4gICAgYXNzZXJ0SXNPYnNlcnZhYmxlQXJyYXkob2JqT3JBcnJheSwgXCJvYmpPckFycmF5XCIpXG4gICAgcmV0dXJuIG9ic2VydmFibGVNYXBCYWNrZWRCeU9ic2VydmFibGVBcnJheShvYmpPckFycmF5KVxuICB9IGVsc2Uge1xuICAgIGFzc2VydElzT2JzZXJ2YWJsZU9iamVjdChvYmpPckFycmF5LCBcIm9iak9yQXJyYXlcIilcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU1hcEJhY2tlZEJ5T2JzZXJ2YWJsZU9iamVjdChvYmpPckFycmF5KVxuICB9XG59KVxuXG4vKipcbiAqIFdyYXBzIGFuIG9ic2VydmFibGUgb2JqZWN0IG9yIGEgdHVwbGUgYXJyYXkgdG8gb2ZmZXIgYSBtYXAgbGlrZSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIGFycmF5IEFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNNYXA8SywgVj4oXG4gIGFycmF5OiBBcnJheTxbSywgVl0+XG4pOiBPYnNlcnZhYmxlTWFwPEssIFY+ICYgeyBkYXRhT2JqZWN0OiBBcnJheTxbSywgVl0+IH1cblxuLyoqXG4gKiBXcmFwcyBhbiBvYnNlcnZhYmxlIG9iamVjdCBvciBhIHR1cGxlIGFycmF5IHRvIG9mZmVyIGEgbWFwIGxpa2UgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmplY3QgT2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNNYXA8VD4oXG4gIG9iamVjdDogUmVjb3JkPHN0cmluZywgVD5cbik6IE9ic2VydmFibGVNYXA8c3RyaW5nLCBUPiAmIHsgZGF0YU9iamVjdDogUmVjb3JkPHN0cmluZywgVD4gfVxuXG4vKipcbiAqIFdyYXBzIGFuIG9ic2VydmFibGUgb2JqZWN0IG9yIGEgdHVwbGUgYXJyYXkgdG8gb2ZmZXIgYSBtYXAgbGlrZSBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIG9iak9yQXJyYXkgT2JqZWN0IG9yIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNNYXAoXG4gIG9iak9yQXJyYXk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgQXJyYXk8W3Vua25vd24sIHVua25vd25dPlxuKTogT2JzZXJ2YWJsZU1hcDx1bmtub3duLCB1bmtub3duPiAmIHsgZGF0YU9iamVjdDogdHlwZW9mIG9iak9yQXJyYXkgfSB7XG4gIHJldHVybiBhc01hcFRhZy5mb3Iob2JqT3JBcnJheSkgYXMgYW55XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBtYXAgdG8gYW4gb2JqZWN0LiBJZiB0aGUgbWFwIGlzIGEgY29sbGVjdGlvbiB3cmFwcGVyIGl0IHdpbGwgcmV0dXJuIHRoZSBiYWNrZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBtYXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvT2JqZWN0PFQ+KG1hcDogTWFwPHN0cmluZywgVD4pOiBSZWNvcmQ8c3RyaW5nLCBUPiB7XG4gIGFzc2VydElzTWFwKG1hcCwgXCJtYXBcIilcblxuICBjb25zdCBkYXRhT2JqZWN0ID0gKG1hcCBhcyBhbnkpLmRhdGFPYmplY3RcbiAgaWYgKGRhdGFPYmplY3QgJiYgIWlzQXJyYXkoZGF0YU9iamVjdCkpIHtcbiAgICByZXR1cm4gZGF0YU9iamVjdFxuICB9XG5cbiAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBUPiA9IHt9XG4gIGZvciAoY29uc3QgayBvZiBtYXAua2V5cygpKSB7XG4gICAgb2JqW2tdID0gbWFwLmdldChrKSFcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG1hcCB0byBhbiBhcnJheS4gSWYgdGhlIG1hcCBpcyBhIGNvbGxlY3Rpb24gd3JhcHBlciBpdCB3aWxsIHJldHVybiB0aGUgYmFja2VkIGFycmF5LlxuICpcbiAqIEBwYXJhbSBtYXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvQXJyYXk8SywgVj4obWFwOiBNYXA8SywgVj4pOiBBcnJheTxbSywgVl0+IHtcbiAgYXNzZXJ0SXNNYXAobWFwLCBcIm1hcFwiKVxuXG4gIGNvbnN0IGRhdGFPYmplY3QgPSAobWFwIGFzIGFueSkuZGF0YU9iamVjdFxuICBpZiAoZGF0YU9iamVjdCAmJiBpc0FycmF5KGRhdGFPYmplY3QpKSB7XG4gICAgcmV0dXJuIGRhdGFPYmplY3RcbiAgfVxuXG4gIGNvbnN0IGFycjogW0ssIFZdW10gPSBbXVxuICBmb3IgKGNvbnN0IGsgb2YgbWFwLmtleXMoKSkge1xuICAgIGFyci5wdXNoKFtrLCBtYXAuZ2V0KGspIV0pXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsUHJvcFRyYW5zZm9ybSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IGFzTWFwIH0gZnJvbSBcIi4uL3dyYXBwZXJzL2FzTWFwXCJcblxuY29uc3QgX29iamVjdFRvTWFwVHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08UmVjb3JkPHN0cmluZywgdW5rbm93bj4sIE1hcDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZTogb2JqLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlOiBjYWNoZWRNYXAgfSkge1xuICAgIHJldHVybiBjYWNoZWRNYXAgPz8gYXNNYXAob2JqKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZTogbWFwIH0pIHtcbiAgICAvLyBkbyBub3QgY2FjaGUgbWFwIDwtPiBvYmogcmVsYXRpb25zaGlwXG5cbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IGsgb2YgbWFwLmtleXMoKSkge1xuICAgICAgb2JqW2tdID0gbWFwLmdldChrKSFcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBvYmplY3RUb01hcFRyYW5zZm9ybSA9IDxUPigpID0+XG4gIF9vYmplY3RUb01hcFRyYW5zZm9ybSBhcyBNb2RlbFByb3BUcmFuc2Zvcm08UmVjb3JkPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIFQ+PlxuXG5jb25zdCBfYXJyYXlUb01hcFRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPEFycmF5PFt1bmtub3duLCB1bmtub3duXT4sIE1hcDx1bmtub3duLCB1bmtub3duPj4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWU6IGFyciwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogY2FjaGVkTWFwIH0pIHtcbiAgICByZXR1cm4gY2FjaGVkTWFwID8/IGFzTWFwKGFycilcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWU6IG1hcCB9KSB7XG4gICAgLy8gZG8gbm90IGNhY2hlIG1hcCA8LT4gYXJyIHJlbGF0aW9uc2hpcFxuXG4gICAgY29uc3QgYXJyOiBBcnJheTxbdW5rbm93biwgdW5rbm93bl0+ID0gW11cbiAgICBmb3IgKGNvbnN0IGsgb2YgbWFwLmtleXMoKSkge1xuICAgICAgYXJyLnB1c2goW2ssIG1hcC5nZXQoaykhXSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwVHJhbnNmb3JtID0gPEssIFY+KCkgPT5cbiAgX2FycmF5VG9NYXBUcmFuc2Zvcm0gYXMgTW9kZWxQcm9wVHJhbnNmb3JtPEFycmF5PFtLLCBWXT4sIE1hcDxLLCBWPj5cbiIsImltcG9ydCB7XG4gIGFjdGlvbixcbiAgaW50ZXJjZXB0LFxuICBJT2JzZXJ2YWJsZUFycmF5LFxuICBJU2V0V2lsbENoYW5nZSxcbiAgaXNPYnNlcnZhYmxlQXJyYXksXG4gIG9ic2VydmFibGUsXG4gIE9ic2VydmFibGVTZXQsXG4gIG9ic2VydmUsXG59IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IGFzc2VydElzT2JzZXJ2YWJsZUFycmF5LCBhc3NlcnRJc1NldCwgZmFpbHVyZSwgZ2V0TW9ieFZlcnNpb24sIGluRGV2TW9kZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyB0YWcgfSBmcm9tIFwiLi4vdXRpbHMvdGFnXCJcblxuY29uc3Qgb2JzZXJ2YWJsZVNldEJhY2tlZEJ5T2JzZXJ2YWJsZUFycmF5ID0gYWN0aW9uKFxuICA8VD4oYXJyYXk6IElPYnNlcnZhYmxlQXJyYXk8VD4pOiBPYnNlcnZhYmxlU2V0PFQ+ICYgeyBkYXRhT2JqZWN0OiB0eXBlb2YgYXJyYXkgfSA9PiB7XG4gICAgaWYgKGluRGV2TW9kZSgpKSB7XG4gICAgICBpZiAoIWlzT2JzZXJ2YWJsZUFycmF5KGFycmF5KSkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwiYXNzZXJ0aW9uIGZhaWxlZDogZXhwZWN0ZWQgYW4gb2JzZXJ2YWJsZSBhcnJheVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzZXQ6IE9ic2VydmFibGVTZXQ8VD5cbiAgICBpZiAoZ2V0TW9ieFZlcnNpb24oKSA+PSA2KSB7XG4gICAgICBzZXQgPSBvYnNlcnZhYmxlLnNldChhcnJheSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0ID0gb2JzZXJ2YWJsZS5zZXQoKVxuICAgICAgYXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBzZXQuYWRkKGl0ZW0pXG4gICAgICB9KVxuICAgIH1cbiAgICA7KHNldCBhcyBhbnkpLmRhdGFPYmplY3QgPSBhcnJheVxuXG4gICAgaWYgKHNldC5zaXplICE9PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhcnJheXMgYmFja2luZyBhIHNldCBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgdmFsdWVzXCIpXG4gICAgfVxuXG4gICAgbGV0IHNldEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgYXJyYXlBbHJlYWR5Q2hhbmdlZCA9IGZhbHNlXG5cbiAgICAvLyBmb3Igc3BlZWQgcmVhc29ucyB3ZSB3aWxsIGp1c3QgYXNzdW1lIGRpc3RpbmN0IHZhbHVlcyBhcmUgb25seSBvbmNlIGluIHRoZSBhcnJheVxuXG4gICAgLy8gd2hlbiB0aGUgYXJyYXkgY2hhbmdlcyB0aGUgc2V0IGNoYW5nZXNcbiAgICBvYnNlcnZlKFxuICAgICAgYXJyYXksXG4gICAgICBhY3Rpb24oKGNoYW5nZTogYW55IC8qSUFycmF5RGlkQ2hhbmdlPFQ+Ki8pID0+IHtcbiAgICAgICAgaWYgKHNldEFscmVhZHlDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUFscmVhZHlDaGFuZ2VkID0gdHJ1ZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInNwbGljZVwiOiB7XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkID0gY2hhbmdlLnJlbW92ZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW92ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUocmVtb3ZlZFtpXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBjaGFuZ2UuYWRkZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBzZXQuYWRkKGFkZGVkW2ldKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgICBzZXQuZGVsZXRlKGNoYW5nZS5vbGRWYWx1ZSlcbiAgICAgICAgICAgICAgc2V0LmFkZChjaGFuZ2UubmV3VmFsdWUpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGFycmF5QWxyZWFkeUNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcblxuICAgIC8vIHdoZW4gdGhlIHNldCBjaGFuZ2VzIGFsc28gY2hhbmdlIHRoZSBhcnJheVxuICAgIGludGVyY2VwdChcbiAgICAgIHNldCxcbiAgICAgIGFjdGlvbigoY2hhbmdlOiBJU2V0V2lsbENoYW5nZTxUPikgPT4ge1xuICAgICAgICBpZiAoc2V0QWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycmF5QWxyZWFkeUNoYW5nZWQpIHtcbiAgICAgICAgICByZXR1cm4gY2hhbmdlXG4gICAgICAgIH1cblxuICAgICAgICBzZXRBbHJlYWR5Q2hhbmdlZCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgICAgICBhcnJheS5wdXNoKGNoYW5nZS5uZXdWYWx1ZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBhcnJheS5pbmRleE9mKGNoYW5nZS5vbGRWYWx1ZSlcbiAgICAgICAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoYW5nZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldEFscmVhZHlDaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gc2V0IGFzIGFueVxuICB9XG4pXG5cbmNvbnN0IGFzU2V0VGFnID0gdGFnKChhcnJheTogQXJyYXk8YW55PikgPT4ge1xuICBhc3NlcnRJc09ic2VydmFibGVBcnJheShhcnJheSwgXCJhcnJheVwiKVxuICByZXR1cm4gb2JzZXJ2YWJsZVNldEJhY2tlZEJ5T2JzZXJ2YWJsZUFycmF5KGFycmF5KVxufSlcblxuLyoqXG4gKiBXcmFwcyBhbiBvYnNlcnZhYmxlIGFycmF5IHRvIG9mZmVyIGEgc2V0IGxpa2UgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNTZXQ8VD4oYXJyYXk6IEFycmF5PFQ+KTogT2JzZXJ2YWJsZVNldDxUPiAmIHsgZGF0YU9iamVjdDogdHlwZW9mIGFycmF5IH0ge1xuICByZXR1cm4gYXNTZXRUYWcuZm9yKGFycmF5KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNldCB0byBhbiBhcnJheS4gSWYgdGhlIHNldCBpcyBhIGNvbGxlY3Rpb24gd3JhcHBlciBpdCB3aWxsIHJldHVybiB0aGUgYmFja2VkIGFycmF5LlxuICpcbiAqIEBwYXJhbSBzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRvQXJyYXk8VD4oc2V0OiBTZXQ8VD4pOiBBcnJheTxUPiB7XG4gIGFzc2VydElzU2V0KHNldCwgXCJzZXRcIilcblxuICBjb25zdCBkYXRhT2JqZWN0ID0gKHNldCBhcyBhbnkpLmRhdGFPYmplY3RcbiAgaWYgKGRhdGFPYmplY3QpIHtcbiAgICByZXR1cm4gZGF0YU9iamVjdFxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oc2V0LnZhbHVlcygpKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5pbXBvcnQgeyBhc1NldCB9IGZyb20gXCIuLi93cmFwcGVycy9hc1NldFwiXG5cbmNvbnN0IF9hcnJheVRvU2V0VHJhbnNmb3JtOiBNb2RlbFByb3BUcmFuc2Zvcm08QXJyYXk8dW5rbm93bj4sIFNldDx1bmtub3duPj4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWU6IGFyciwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZTogY2FjaGVkU2V0IH0pIHtcbiAgICByZXR1cm4gY2FjaGVkU2V0ID8/IGFzU2V0KGFycilcbiAgfSxcblxuICB1bnRyYW5zZm9ybSh7IHRyYW5zZm9ybWVkVmFsdWU6IHNldCB9KSB7XG4gICAgLy8gZG8gbm90IGNhY2hlIHNldCA8LT4gYXJyIHJlbGF0aW9uc2hpcFxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2V0LnZhbHVlcygpKVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgYXJyYXlUb1NldFRyYW5zZm9ybSA9IDxUPigpID0+XG4gIF9hcnJheVRvU2V0VHJhbnNmb3JtIGFzIE1vZGVsUHJvcFRyYW5zZm9ybTxBcnJheTxUPiwgU2V0PFQ+PlxuIiwiaW1wb3J0IHR5cGUgeyBNb2RlbFByb3BUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvcHJvcFwiXG5cbmNvbnN0IF9zdHJpbmdUb0JpZ0ludFRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPHN0cmluZywgYmlnaW50PiA9IHtcbiAgdHJhbnNmb3JtKHsgb3JpZ2luYWxWYWx1ZSwgY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSB9KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgPz8gQmlnSW50KG9yaWdpbmFsVmFsdWUpXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlLCBjYWNoZVRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKClcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkVmFsdWUudG9TdHJpbmcoKVxuICB9LFxufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9CaWdJbnRUcmFuc2Zvcm0gPSAoKSA9PiBfc3RyaW5nVG9CaWdJbnRUcmFuc2Zvcm1cbiIsImltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltbXV0YWJsZURhdGVcbiAgZXh0ZW5kcyBPbWl0PFxuICAgIERhdGUsXG4gICAgfCBcInNldFRpbWVcIlxuICAgIHwgXCJzZXRNaWxsaXNlY29uZHNcIlxuICAgIHwgXCJzZXRVVENNaWxsaXNlY29uZHNcIlxuICAgIHwgXCJzZXRTZWNvbmRzXCJcbiAgICB8IFwic2V0VVRDU2Vjb25kc1wiXG4gICAgfCBcInNldE1pbnV0ZXNcIlxuICAgIHwgXCJzZXRVVENNaW51dGVzXCJcbiAgICB8IFwic2V0SG91cnNcIlxuICAgIHwgXCJzZXRVVENIb3Vyc1wiXG4gICAgfCBcInNldERhdGVcIlxuICAgIHwgXCJzZXRVVENEYXRlXCJcbiAgICB8IFwic2V0TW9udGhcIlxuICAgIHwgXCJzZXRVVENNb250aFwiXG4gICAgfCBcInNldEZ1bGxZZWFyXCJcbiAgICB8IFwic2V0VVRDRnVsbFllYXJcIlxuICA+IHt9XG5cbmNvbnN0IGVyck1lc3NhZ2UgPSBcInRoaXMgRGF0ZSBvYmplY3QgaXMgaW1tdXRhYmxlXCJcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEltbXV0YWJsZURhdGUgZXh0ZW5kcyBEYXRlIHtcbiAgLy8gZGlzYWJsZSBtdXRhYmxlIG1ldGhvZHNcblxuICBzZXRUaW1lKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0TWlsbGlzZWNvbmRzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDTWlsbGlzZWNvbmRzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0U2Vjb25kcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ1NlY29uZHMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRNaW51dGVzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDTWludXRlcygpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldEhvdXJzKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDSG91cnMoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXREYXRlKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDRGF0ZSgpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldE1vbnRoKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG5cbiAgc2V0VVRDTW9udGgoKTogYW55IHtcbiAgICB0aHJvdyBmYWlsdXJlKGVyck1lc3NhZ2UpXG4gIH1cblxuICBzZXRGdWxsWWVhcigpOiBhbnkge1xuICAgIHRocm93IGZhaWx1cmUoZXJyTWVzc2FnZSlcbiAgfVxuXG4gIHNldFVUQ0Z1bGxZZWFyKCk6IGFueSB7XG4gICAgdGhyb3cgZmFpbHVyZShlcnJNZXNzYWdlKVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsUHJvcFRyYW5zZm9ybSB9IGZyb20gXCIuLi9tb2RlbFNoYXJlZC9wcm9wXCJcbmltcG9ydCB7IEltbXV0YWJsZURhdGUgfSBmcm9tIFwiLi9JbW11dGFibGVEYXRlXCJcblxuY29uc3QgX3RpbWVzdGFtcFRvRGF0ZVRyYW5zZm9ybTogTW9kZWxQcm9wVHJhbnNmb3JtPG51bWJlciwgRGF0ZT4gPSB7XG4gIHRyYW5zZm9ybSh7IG9yaWdpbmFsVmFsdWUsIGNhY2hlZFRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlID8/IG5ldyBJbW11dGFibGVEYXRlKG9yaWdpbmFsVmFsdWUpXG4gIH0sXG5cbiAgdW50cmFuc2Zvcm0oeyB0cmFuc2Zvcm1lZFZhbHVlLCBjYWNoZVRyYW5zZm9ybWVkVmFsdWUgfSkge1xuICAgIGlmICh0cmFuc2Zvcm1lZFZhbHVlIGluc3RhbmNlb2YgSW1tdXRhYmxlRGF0ZSkge1xuICAgICAgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlKClcbiAgICB9XG4gICAgcmV0dXJuICt0cmFuc2Zvcm1lZFZhbHVlXG4gIH0sXG59XG5cbmV4cG9ydCBjb25zdCB0aW1lc3RhbXBUb0RhdGVUcmFuc2Zvcm0gPSAoKSA9PiBfdGltZXN0YW1wVG9EYXRlVHJhbnNmb3JtXG5cbmNvbnN0IF9pc29TdHJpbmdUb0RhdGVUcmFuc2Zvcm06IE1vZGVsUHJvcFRyYW5zZm9ybTxzdHJpbmcsIERhdGU+ID0ge1xuICB0cmFuc2Zvcm0oeyBvcmlnaW5hbFZhbHVlLCBjYWNoZWRUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtZWRWYWx1ZSA/PyBuZXcgSW1tdXRhYmxlRGF0ZShvcmlnaW5hbFZhbHVlKVxuICB9LFxuXG4gIHVudHJhbnNmb3JtKHsgdHJhbnNmb3JtZWRWYWx1ZSwgY2FjaGVUcmFuc2Zvcm1lZFZhbHVlIH0pIHtcbiAgICBpZiAodHJhbnNmb3JtZWRWYWx1ZSBpbnN0YW5jZW9mIEltbXV0YWJsZURhdGUpIHtcbiAgICAgIGNhY2hlVHJhbnNmb3JtZWRWYWx1ZSgpXG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lZFZhbHVlLnRvSVNPU3RyaW5nKClcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IGlzb1N0cmluZ1RvRGF0ZVRyYW5zZm9ybSA9ICgpID0+IF9pc29TdHJpbmdUb0RhdGVUcmFuc2Zvcm1cbiIsImltcG9ydCB7IGFjdGlvbiwgY29tcHV0ZWQgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBwYXRoVG9UYXJnZXRQYXRoSWRzIH0gZnJvbSBcIi4uL2FjdGlvbk1pZGRsZXdhcmVzL3V0aWxzXCJcbmltcG9ydCB7IHJlc29sdmVQYXRoLCByZXNvbHZlUGF0aENoZWNraW5nSWRzLCBza2lwSWRDaGVja2luZyB9IGZyb20gXCIuLi9wYXJlbnQvcGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhUeXBlc1wiXG5pbXBvcnQgeyBhcHBseVBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvYXBwbHlQYXRjaGVzXCJcbmltcG9ydCB7IGFwcGx5U25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvYXBwbHlTbmFwc2hvdFwiXG5pbXBvcnQgeyBmcm9tU25hcHNob3QgfSBmcm9tIFwiLi4vc25hcHNob3QvZnJvbVNuYXBzaG90XCJcbmltcG9ydCB7IGdldFNuYXBzaG90IH0gZnJvbSBcIi4uL3NuYXBzaG90L2dldFNuYXBzaG90XCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgZGVlcEVxdWFscyB9IGZyb20gXCIuL2RlZXBFcXVhbHNcIlxuXG4vKipcbiAqIEEgY2xhc3Mgd2l0aCB0aGUgaW1wbGVtZW50YXRpb25tIG9mIGRyYWZ0LlxuICogVXNlIGBkcmFmdGAgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gKlxuICogQHR5cGVwYXJhbSBUIERhdGEgdHlwZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERyYWZ0PFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIERyYWZ0IGRhdGEgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogVFxuXG4gIC8qKlxuICAgKiBDb21taXRzIGN1cnJlbnQgZHJhZnQgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgKi9cbiAgQGFjdGlvblxuICBjb21taXQoKTogdm9pZCB7XG4gICAgYXBwbHlTbmFwc2hvdCh0aGlzLm9yaWdpbmFsRGF0YSwgZ2V0U25hcHNob3QodGhpcy5kYXRhKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJ0aWFsbHkgY29tbWl0cyBjdXJyZW50IGRyYWZ0IGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICogSWYgdGhlIHBhdGggY2Fubm90IGJlIHJlc29sdmVkIGluIGVpdGhlciB0aGUgZHJhZnQgb3IgdGhlIG9yaWdpbmFsIG9iamVjdCBpdCB3aWxsIHRocm93LlxuICAgKiBOb3RlIHRoYXQgbW9kZWwgSURzIGFyZSBjaGVja2VkIHRvIGJlIHRoZSBzYW1lIHdoZW4gcmVzb2x2aW5nIHRoZSBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byBjb21taXQuXG4gICAqL1xuICBAYWN0aW9uXG4gIGNvbW1pdEJ5UGF0aChwYXRoOiBQYXRoKTogdm9pZCB7XG4gICAgY29uc3QgZHJhZnRUYXJnZXQgPSByZXNvbHZlUGF0aCh0aGlzLmRhdGEsIHBhdGgpXG4gICAgaWYgKCFkcmFmdFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW4gZHJhZnQgb2JqZWN0YClcbiAgICB9XG5cbiAgICBjb25zdCBkcmFmdFBhdGhJZHMgPSBwYXRoVG9UYXJnZXRQYXRoSWRzSWdub3JpbmdMYXN0KHRoaXMuZGF0YSwgcGF0aClcblxuICAgIGNvbnN0IG9yaWdpbmFsVGFyZ2V0ID0gcmVzb2x2ZVBhdGhDaGVja2luZ0lkcyh0aGlzLm9yaWdpbmFsRGF0YSwgcGF0aCwgZHJhZnRQYXRoSWRzKVxuICAgIGlmICghb3JpZ2luYWxUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gY291bGQgbm90IGJlIHJlc29sdmVkIGluIG9yaWdpbmFsIG9iamVjdGApXG4gICAgfVxuXG4gICAgYXBwbHlQYXRjaGVzKHRoaXMub3JpZ2luYWxEYXRhLCBbXG4gICAgICB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgdmFsdWU6IGdldFNuYXBzaG90KGRyYWZ0VGFyZ2V0LnZhbHVlKSxcbiAgICAgIH0sXG4gICAgXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGRyYWZ0IHRvIGJlIGFuIGV4YWN0IGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICovXG4gIEBhY3Rpb25cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgYXBwbHlTbmFwc2hvdCh0aGlzLmRhdGEsIHRoaXMub3JpZ2luYWxTbmFwc2hvdClcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJ0aWFsbHkgcmVzZXRzIGN1cnJlbnQgZHJhZnQgY2hhbmdlcyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgKiBJZiB0aGUgcGF0aCBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gZWl0aGVyIHRoZSBkcmFmdCBvciB0aGUgb3JpZ2luYWwgb2JqZWN0IGl0IHdpbGwgdGhyb3cuXG4gICAqIE5vdGUgdGhhdCBtb2RlbCBJRHMgYXJlIGNoZWNrZWQgdG8gYmUgdGhlIHNhbWUgd2hlbiByZXNvbHZpbmcgdGhlIHBhdGhzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHJlc2V0LlxuICAgKi9cbiAgQGFjdGlvblxuICByZXNldEJ5UGF0aChwYXRoOiBQYXRoKTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luYWxUYXJnZXQgPSByZXNvbHZlUGF0aCh0aGlzLm9yaWdpbmFsRGF0YSwgcGF0aClcbiAgICBpZiAoIW9yaWdpbmFsVGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbiBvcmlnaW5hbCBvYmplY3RgKVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsUGF0aElkcyA9IHBhdGhUb1RhcmdldFBhdGhJZHNJZ25vcmluZ0xhc3QodGhpcy5vcmlnaW5hbERhdGEsIHBhdGgpXG5cbiAgICBjb25zdCBkcmFmdFRhcmdldCA9IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHModGhpcy5kYXRhLCBwYXRoLCBvcmlnaW5hbFBhdGhJZHMpXG4gICAgaWYgKCFkcmFmdFRhcmdldC5yZXNvbHZlZCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW4gZHJhZnQgb2JqZWN0YClcbiAgICB9XG5cbiAgICBhcHBseVBhdGNoZXModGhpcy5kYXRhLCBbXG4gICAgICB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgdmFsdWU6IGdldFNuYXBzaG90KG9yaWdpbmFsVGFyZ2V0LnZhbHVlKSxcbiAgICAgIH0sXG4gICAgXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZHJhZnQgaGFzIGNoYW5nZWQgY29tcGFyZWQgdG8gdGhlIG9yaWdpbmFsIG9iamVjdCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IGlzRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFkZWVwRXF1YWxzKGdldFNuYXBzaG90KHRoaXMuZGF0YSksIHRoaXMub3JpZ2luYWxTbmFwc2hvdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGggb2YgdGhlIGRyYWZ0IGhhcyBjaGFuZ2VkIGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAqIElmIHRoZSBwYXRoIGNhbm5vdCBiZSByZXNvbHZlZCBpbiB0aGUgZHJhZnQgaXQgd2lsbCB0aHJvdy5cbiAgICogSWYgdGhlIHBhdGggY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBvcmlnaW5hbCBvYmplY3QgaXQgd2lsbCByZXR1cm4gYHRydWVgLlxuICAgKiBOb3RlIHRoYXQgbW9kZWwgSURzIGFyZSBjaGVja2VkIHRvIGJlIHRoZSBzYW1lIHdoZW4gcmVzb2x2aW5nIHRoZSBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byBjaGVjay5cbiAgICovXG4gIGlzRGlydHlCeVBhdGgocGF0aDogUGF0aCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRyYWZ0VGFyZ2V0ID0gcmVzb2x2ZVBhdGgodGhpcy5kYXRhLCBwYXRoKVxuICAgIGlmICghZHJhZnRUYXJnZXQucmVzb2x2ZWQpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gY291bGQgbm90IGJlIHJlc29sdmVkIGluIGRyYWZ0IG9iamVjdGApXG4gICAgfVxuXG4gICAgY29uc3QgZHJhZnRQYXRoSWRzID0gcGF0aFRvVGFyZ2V0UGF0aElkc0lnbm9yaW5nTGFzdCh0aGlzLmRhdGEsIHBhdGgpXG5cbiAgICBjb25zdCBvcmlnaW5hbFRhcmdldCA9IHJlc29sdmVQYXRoQ2hlY2tpbmdJZHModGhpcy5vcmlnaW5hbERhdGEsIHBhdGgsIGRyYWZ0UGF0aElkcylcbiAgICBpZiAoIW9yaWdpbmFsVGFyZ2V0LnJlc29sdmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiAhZGVlcEVxdWFscyhkcmFmdFRhcmdldC52YWx1ZSwgb3JpZ2luYWxUYXJnZXQudmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogT3JpZ2luYWwgZGF0YSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbERhdGE6IFRcblxuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgb3JpZ2luYWxTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gZ2V0U25hcHNob3QodGhpcy5vcmlnaW5hbERhdGEpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEcmFmdC5cbiAgICogRG8gbm90IHVzZSBkaXJlY3RseSwgdXNlIGBkcmFmdGAgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcmlnaW5hbDogVCkge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qob3JpZ2luYWwsIFwib3JpZ2luYWxcIilcblxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gb3JpZ2luYWxcbiAgICB0aGlzLmRhdGEgPSBmcm9tU25hcHNob3QodGhpcy5vcmlnaW5hbFNuYXBzaG90LCB7IGdlbmVyYXRlTmV3SWRzOiBmYWxzZSB9KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGNvcHkgb2YgYSB0cmVlIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uXG4gKlxuICogQHR5cGVwYXJhbSBUIERhdGEgdHlwZS5cbiAqIEBwYXJhbSBvcmlnaW5hbCBPcmlnaW5hbCBub2RlLlxuICogQHJldHVybnMgVGhlIGRyYWZ0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0PFQgZXh0ZW5kcyBvYmplY3Q+KG9yaWdpbmFsOiBUKTogRHJhZnQ8VD4ge1xuICByZXR1cm4gbmV3IERyYWZ0KG9yaWdpbmFsKVxufVxuXG5mdW5jdGlvbiBwYXRoVG9UYXJnZXRQYXRoSWRzSWdub3JpbmdMYXN0KHJvb3Q6IGFueSwgcGF0aDogUGF0aCkge1xuICBjb25zdCBwYXRoSWRzOiAoc3RyaW5nIHwgbnVsbCB8IHR5cGVvZiBza2lwSWRDaGVja2luZylbXSA9IHBhdGhUb1RhcmdldFBhdGhJZHMocm9vdCwgcGF0aClcbiAgaWYgKHBhdGhJZHMubGVuZ3RoID49IDEpIHtcbiAgICAvLyBuZXZlciBjaGVjayB0aGUgbGFzdCBvYmplY3QgaWRcbiAgICBwYXRoSWRzW3BhdGhJZHMubGVuZ3RoIC0gMV0gPSBza2lwSWRDaGVja2luZ1xuICB9XG5cbiAgcmV0dXJuIHBhdGhJZHNcbn1cbiIsImltcG9ydCB7IHJlYWN0aW9uLCBydW5JbkFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIHJlYWRvbmx5TWlkZGxld2FyZSxcbiAgUmVhZG9ubHlNaWRkbGV3YXJlUmV0dXJuLFxufSBmcm9tIFwiLi4vYWN0aW9uTWlkZGxld2FyZXMvcmVhZG9ubHlNaWRkbGV3YXJlXCJcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwiLi4vY29udGV4dFwiXG5pbXBvcnQgeyBnZXRQYXJlbnRUb0NoaWxkUGF0aCwgcmVzb2x2ZVBhdGggfSBmcm9tIFwiLi4vcGFyZW50L3BhdGhcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaGVzIH0gZnJvbSBcIi4uL3BhdGNoL2FwcGx5UGF0Y2hlc1wiXG5pbXBvcnQgeyBvblBhdGNoZXMgfSBmcm9tIFwiLi4vcGF0Y2gvZW1pdFBhdGNoXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2ggfSBmcm9tIFwiLi4vcGF0Y2gvUGF0Y2hcIlxuaW1wb3J0IHsgUGF0Y2hSZWNvcmRlciwgcGF0Y2hSZWNvcmRlciB9IGZyb20gXCIuLi9wYXRjaC9wYXRjaFJlY29yZGVyXCJcbmltcG9ydCB7IGlzUm9vdFN0b3JlLCByZWdpc3RlclJvb3RTdG9yZSwgdW5yZWdpc3RlclJvb3RTdG9yZSB9IGZyb20gXCIuLi9yb290U3RvcmUvcm9vdFN0b3JlXCJcbmltcG9ydCB7IGNsb25lIH0gZnJvbSBcIi4uL3NuYXBzaG90L2Nsb25lXCJcbmltcG9ydCB7IGFzc2VydFR3ZWFrZWRPYmplY3QgfSBmcm9tIFwiLi4vdHdlYWtlci9jb3JlXCJcbmltcG9ydCB7IGFzc2VydElzRnVuY3Rpb24sIGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIENvbnRleHQgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzYW5kYm94IG1hbmFnZXIgdGhpcyBub2RlIHJ1bnMgdW5kZXIgKGlmIGFueSkuXG4gKi9cbmNvbnN0IHNhbmRib3hNYW5hZ2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8U2FuZGJveE1hbmFnZXI+KClcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzYW5kYm94IG1hbmFnZXIgb2YgYSBub2RlLCBvciBgdW5kZWZpbmVkYCBpZiBub25lLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgc2FuZGJveCBtYW5hZ2VyIG9mIGEgbm9kZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVTYW5kYm94TWFuYWdlcihub2RlOiBvYmplY3QpOiBTYW5kYm94TWFuYWdlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzYW5kYm94TWFuYWdlckNvbnRleHQuZ2V0KG5vZGUpXG59XG5cbi8qKlxuICogUmV0dXJucyBpZiBhIGdpdmVuIG5vZGUgaXMgYSBzYW5kYm94ZWQgbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIGl0IGlzIHNhbmRib3hlZCwgYGZhbHNlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYW5kYm94ZWROb2RlKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXROb2RlU2FuZGJveE1hbmFnZXIobm9kZSlcbn1cblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgYFNhbmRib3hNYW5hZ2VyLndpdGhTYW5kYm94YC5cbiAqL1xuZXhwb3J0IHR5cGUgV2l0aFNhbmRib3hDYWxsYmFjazxUIGV4dGVuZHMgcmVhZG9ubHkgW29iamVjdCwgLi4ub2JqZWN0W11dLCBSPiA9IChcbiAgLi4ubm9kZXM6IFRcbikgPT4gYm9vbGVhbiB8IHsgY29tbWl0OiBib29sZWFuOyByZXR1cm46IFIgfVxuXG4vKipcbiAqIE1hbmFnZXIgY2xhc3MgcmV0dXJuZWQgYnkgYHNhbmRib3hgIHRoYXQgYWxsb3dzIHlvdSB0byBtYWtlIGNoYW5nZXMgdG8gYSBzYW5kYm94IGNvcHkgb2YgdGhlXG4gKiBvcmlnaW5hbCBzdWJ0cmVlIGFuZCBhcHBseSB0aGVtIHRvIHRoZSBvcmlnaW5hbCBzdWJ0cmVlIG9yIHJlamVjdCB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgU2FuZGJveE1hbmFnZXIge1xuICAvKipcbiAgICogVGhlIHNhbmRib3ggY29weSBvZiB0aGUgb3JpZ2luYWwgc3VidHJlZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VidHJlZVJvb3RDbG9uZTogb2JqZWN0XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBkaXNwb3Nlci5cbiAgICovXG4gIHByaXZhdGUgZGlzcG9zZXI6ICgpID0+IHZvaWRcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGB3aXRoU2FuZGJveGAgcGF0Y2ggcmVjb3JkZXIuIElmIGB1bmRlZmluZWRgLCBubyBgd2l0aFNhbmRib3hgIGNhbGwgaXMgYmVpbmdcbiAgICogZXhlY3V0ZWQuXG4gICAqL1xuICBwcml2YXRlIHdpdGhTYW5kYm94UGF0Y2hSZWNvcmRlcjogUGF0Y2hSZWNvcmRlciB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBmcm9tIGByZWFkb25seU1pZGRsZXdhcmVgIHRoYXQgd2lsbCBhbGxvdyBhY3Rpb25zIHRvIGJlIHN0YXJ0ZWQgaW5zaWRlIHRoZSBwcm92aWRlZFxuICAgKiBjb2RlIGJsb2NrIG9uIGEgcmVhZG9ubHkgbm9kZS5cbiAgICovXG4gIHByaXZhdGUgYWxsb3dXcml0ZTogUmVhZG9ubHlNaWRkbGV3YXJlUmV0dXJuW1wiYWxsb3dXcml0ZVwiXVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNoYW5nZXMgbWFkZSBpbiB0aGUgc2FuZGJveCBhcmUgY3VycmVudGx5IGJlaW5nIGNvbW1pdHRlZCB0byB0aGUgb3JpZ2luYWwgc3VidHJlZS5cbiAgICovXG4gIHByaXZhdGUgaXNDb21taXR0aW5nOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBgU2FuZGJveE1hbmFnZXJgLlxuICAgKiBEbyBub3QgdXNlIGRpcmVjdGx5LCB1c2UgYHNhbmRib3hgIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBzdWJ0cmVlUm9vdCBTdWJ0cmVlIHJvb3QgdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc3VidHJlZVJvb3Q6IG9iamVjdCkge1xuICAgIGFzc2VydFR3ZWFrZWRPYmplY3Qoc3VidHJlZVJvb3QsIFwic3VidHJlZVJvb3RcIilcblxuICAgIC8vIHdlIHRlbXBvcmFyaWx5IHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udGV4dCBtYW5hZ2VyIHNvIHRoYXRcbiAgICAvLyBjbG9uZWQgbm9kZXMgY2FuIGFjY2VzcyBpdCB3aGlsZSBpbiB0aGVpciBvbkluaXQgcGhhc2VcblxuICAgIGxldCBwcmV2aW91c0NvbnRleHREZWZhdWx0ID0gc2FuZGJveE1hbmFnZXJDb250ZXh0LmdldERlZmF1bHQoKVxuICAgIHNhbmRib3hNYW5hZ2VyQ29udGV4dC5zZXREZWZhdWx0KHRoaXMpXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3VidHJlZVJvb3RDbG9uZSA9IGNsb25lKHN1YnRyZWVSb290LCB7IGdlbmVyYXRlTmV3SWRzOiBmYWxzZSB9KVxuICAgICAgc2FuZGJveE1hbmFnZXJDb250ZXh0LnNldCh0aGlzLnN1YnRyZWVSb290Q2xvbmUsIHRoaXMpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2FuZGJveE1hbmFnZXJDb250ZXh0LnNldERlZmF1bHQocHJldmlvdXNDb250ZXh0RGVmYXVsdClcbiAgICB9XG5cbiAgICBsZXQgd2FzUlMgPSBmYWxzZVxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblJTID0gcmVhY3Rpb24oXG4gICAgICAoKSA9PiBpc1Jvb3RTdG9yZShzdWJ0cmVlUm9vdCksXG4gICAgICAoaXNSUykgPT4ge1xuICAgICAgICBpZiAoaXNSUyAhPT0gd2FzUlMpIHtcbiAgICAgICAgICB3YXNSUyA9IGlzUlNcbiAgICAgICAgICBpZiAoaXNSUykge1xuICAgICAgICAgICAgcmVnaXN0ZXJSb290U3RvcmUodGhpcy5zdWJ0cmVlUm9vdENsb25lKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bnJlZ2lzdGVyUm9vdFN0b3JlKHRoaXMuc3VidHJlZVJvb3RDbG9uZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhzdWJ0cmVlUm9vdCwgKHBhdGNoZXMpID0+IHtcbiAgICAgIGlmICh0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlcikge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFwib3JpZ2luYWwgc3VidHJlZSBtdXN0IG5vdCBjaGFuZ2Ugd2hpbGUgJ3dpdGhTYW5kYm94JyBleGVjdXRlc1wiKVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ29tbWl0dGluZykge1xuICAgICAgICB0aGlzLmFsbG93V3JpdGUoKCkgPT4ge1xuICAgICAgICAgIGFwcGx5UGF0Y2hlcyh0aGlzLnN1YnRyZWVSb290Q2xvbmUsIHBhdGNoZXMpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHsgYWxsb3dXcml0ZSwgZGlzcG9zZTogZGlzcG9zZVJlYWRvbmx5TVcgfSA9IHJlYWRvbmx5TWlkZGxld2FyZSh0aGlzLnN1YnRyZWVSb290Q2xvbmUpXG4gICAgdGhpcy5hbGxvd1dyaXRlID0gYWxsb3dXcml0ZVxuXG4gICAgdGhpcy5kaXNwb3NlciA9ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblJTKClcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZVJlYWRvbmx5TVcoKVxuICAgICAgaWYgKGlzUm9vdFN0b3JlKHRoaXMuc3VidHJlZVJvb3RDbG9uZSkpIHtcbiAgICAgICAgdW5yZWdpc3RlclJvb3RTdG9yZSh0aGlzLnN1YnRyZWVSb290Q2xvbmUpXG4gICAgICB9XG4gICAgICB0aGlzLmRpc3Bvc2VyID0gKCkgPT4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYGZuYCB3aXRoIHNhbmRib3ggY29waWVzIG9mIHRoZSBlbGVtZW50cyBvZiBgbm9kZXNgLiBUaGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBzYW5kYm94XG4gICAqIGluIGBmbmAgY2FuIGJlIGFjY2VwdGVkLCBpLmUuIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHN1YnRyZWUsIG9yIHJlamVjdGVkLlxuICAgKlxuICAgKiBAdHlwZXBhcmFtIFQgT2JqZWN0IHR5cGUuXG4gICAqIEB0eXBlcGFyYW0gUiBSZXR1cm4gdHlwZS5cbiAgICogQHBhcmFtIG5vZGVzIFR1cGxlIG9mIG9iamVjdHMgZm9yIHdoaWNoIHRvIG9idGFpbiBzYW5kYm94IGNvcGllcy5cbiAgICogQHBhcmFtIGZuIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdpdGggc2FuZGJveCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIG9mIGBub2Rlc2AuIEFueSBjaGFuZ2VzXG4gICAqIG1hZGUgdG8gdGhlIHNhbmRib3ggYXJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHN1YnRyZWUgd2hlbiBgZm5gIHJldHVybnMgYHRydWVgIG9yXG4gICAqIGB7IGNvbW1pdDogdHJ1ZSwgLi4uIH1gLiBXaGVuIGBmbmAgcmV0dXJucyBgZmFsc2VgIG9yIGB7IGNvbW1pdDogZmFsc2UsIC4uLiB9YCB0aGUgY2hhbmdlcyBtYWRlXG4gICAqIHRvIHRoZSBzYW5kYm94IGFyZSByZWplY3RlZC5cbiAgICogQHJldHVybnMgVmFsdWUgb2YgdHlwZSBgUmAgd2hlbiBgZm5gIHJldHVybnMgYW4gb2JqZWN0IG9mIHR5cGUgYHsgY29tbWl0OiBib29sZWFuOyByZXR1cm46IFIgfWBcbiAgICogb3IgYHZvaWRgIHdoZW4gYGZuYCByZXR1cm5zIGEgYm9vbGVhbi5cbiAgICovXG4gIHdpdGhTYW5kYm94PFQgZXh0ZW5kcyByZWFkb25seSBbb2JqZWN0LCAuLi5vYmplY3RbXV0sIFIgPSB2b2lkPihcbiAgICBub2RlczogVCxcbiAgICBmbjogV2l0aFNhbmRib3hDYWxsYmFjazxULCBSPlxuICApOiBSIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhc3NlcnRUd2Vha2VkT2JqZWN0KG5vZGVzW2ldLCBgbm9kZXNbJHtpfV1gKVxuICAgIH1cbiAgICBhc3NlcnRJc0Z1bmN0aW9uKGZuLCBcImZuXCIpXG5cbiAgICBjb25zdCB7IHNhbmRib3hOb2RlcywgYXBwbHlSZWNvcmRlckNoYW5nZXMgfSA9IHRoaXMucHJlcGFyZVNhbmRib3hDaGFuZ2VzKG5vZGVzKVxuXG4gICAgbGV0IGNvbW1pdCA9IGZhbHNlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gdGhpcy5hbGxvd1dyaXRlKCgpID0+IGZuKC4uLnNhbmRib3hOb2RlcykpXG4gICAgICBpZiAodHlwZW9mIHJldHVyblZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBjb21taXQgPSByZXR1cm5WYWx1ZVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWl0ID0gcmV0dXJuVmFsdWUuY29tbWl0XG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZS5yZXR1cm5cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXBwbHlSZWNvcmRlckNoYW5nZXMoY29tbWl0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0aGUgc2FuZGJveC5cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlcigpXG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVTYW5kYm94Q2hhbmdlczxUIGV4dGVuZHMgcmVhZG9ubHkgW29iamVjdCwgLi4ub2JqZWN0W11dPihcbiAgICBub2RlczogVFxuICApOiB7IHNhbmRib3hOb2RlczogVDsgYXBwbHlSZWNvcmRlckNoYW5nZXM6IChjb21taXQ6IGJvb2xlYW4pID0+IHZvaWQgfSB7XG4gICAgY29uc3QgaXNOZXN0ZWRXaXRoU2FuZGJveENhbGwgPSAhIXRoaXMud2l0aFNhbmRib3hQYXRjaFJlY29yZGVyXG5cbiAgICBjb25zdCBzYW5kYm94Tm9kZXMgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChcbiAgICAgICAgaXNOZXN0ZWRXaXRoU2FuZGJveENhbGwgPyB0aGlzLnN1YnRyZWVSb290Q2xvbmUgOiB0aGlzLnN1YnRyZWVSb290LFxuICAgICAgICBub2RlXG4gICAgICApXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShgbm9kZSBpcyBub3QgYSBjaGlsZCBvZiBzdWJ0cmVlUm9vdCR7aXNOZXN0ZWRXaXRoU2FuZGJveENhbGwgPyBcIkNsb25lXCIgOiBcIlwifWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbmRib3hOb2RlID0gcmVzb2x2ZVBhdGg8dHlwZW9mIG5vZGU+KHRoaXMuc3VidHJlZVJvb3RDbG9uZSwgcGF0aCkudmFsdWVcbiAgICAgIGlmICghc2FuZGJveE5vZGUpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcInBhdGggY291bGQgbm90IGJlIHJlc29sdmVkIC0gc2FuZGJveCBtYXkgYmUgb3V0IG9mIHN5bmMgd2l0aCBvcmlnaW5hbCB0cmVlXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzYW5kYm94Tm9kZVxuICAgIH0pIGFzIHVua25vd24gYXMgVFxuXG4gICAgaWYgKCF0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlcikge1xuICAgICAgdGhpcy53aXRoU2FuZGJveFBhdGNoUmVjb3JkZXIgPSBwYXRjaFJlY29yZGVyKHRoaXMuc3VidHJlZVJvb3RDbG9uZSlcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlclxuICAgIGNvbnN0IG51bVJlY29yZGVyRXZlbnRzID0gcmVjb3JkZXIuZXZlbnRzLmxlbmd0aFxuXG4gICAgY29uc3QgYXBwbHlSZWNvcmRlckNoYW5nZXMgPSAoY29tbWl0OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzTmVzdGVkV2l0aFNhbmRib3hDYWxsKSB7XG4gICAgICAgIHJlY29yZGVyLmRpc3Bvc2UoKVxuICAgICAgICB0aGlzLndpdGhTYW5kYm94UGF0Y2hSZWNvcmRlciA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdCkge1xuICAgICAgICBpZiAoIWlzTmVzdGVkV2l0aFNhbmRib3hDYWxsKSB7XG4gICAgICAgICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gICAgICAgICAgY29uc3QgbGVuID0gcmVjb3JkZXIuZXZlbnRzLmxlbmd0aFxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHBhdGNoZXMucHVzaCguLi5yZWNvcmRlci5ldmVudHNbaV0ucGF0Y2hlcylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NvbW1pdHRpbmcgPSB0aGlzLmlzQ29tbWl0dGluZ1xuICAgICAgICAgIHRoaXMuaXNDb21taXR0aW5nID0gdHJ1ZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcHBseVBhdGNoZXModGhpcy5zdWJ0cmVlUm9vdCwgcGF0Y2hlcylcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5pc0NvbW1pdHRpbmcgPSBpc0NvbW1pdHRpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsb3dXcml0ZSgoKSA9PiB7XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSByZWNvcmRlci5ldmVudHMubGVuZ3RoXG4gICAgICAgICAgICB3aGlsZSAoaS0tID4gbnVtUmVjb3JkZXJFdmVudHMpIHtcbiAgICAgICAgICAgICAgYXBwbHlQYXRjaGVzKHRoaXMuc3VidHJlZVJvb3RDbG9uZSwgcmVjb3JkZXIuZXZlbnRzW2ldLmludmVyc2VQYXRjaGVzLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2FuZGJveE5vZGVzLCBhcHBseVJlY29yZGVyQ2hhbmdlcyB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2FuZGJveC5cbiAqXG4gKiBAcGFyYW0gc3VidHJlZVJvb3QgU3VidHJlZSByb290IHRhcmdldCBvYmplY3QuXG4gKiBAcmV0dXJucyBBIGBTYW5kYm94TWFuYWdlcmAgd2hpY2ggYWxsb3dzIHlvdSB0byBtYW5hZ2UgdGhlIHNhbmRib3ggb3BlcmF0aW9ucyBhbmQgZGlzcG9zZSBvZiB0aGVcbiAqIHNhbmRib3guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5kYm94KHN1YnRyZWVSb290OiBvYmplY3QpOiBTYW5kYm94TWFuYWdlciB7XG4gIHJldHVybiBuZXcgU2FuZGJveE1hbmFnZXIoc3VidHJlZVJvb3QpXG59XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBsYXp5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIEFycmF5VHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFuIHR1cGxlIG9mIHZhbHVlcyBvZiBhIGdpdmVuIHR5cGUuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zdCBzdHJpbmdOdW1iZXJUdXBsZVR5cGUgPSB0eXBlcy50dXBsZSh0eXBlcy5zdHJpbmcsIHR5cGVzLm51bWJlcilcbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBJdGVtIHR5cGVzLlxuICogQHBhcmFtIGl0ZW1UeXBlIFR5cGUgb2YgaW5uZXIgaXRlbXMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNUdXBsZTxUIGV4dGVuZHMgQW55VHlwZVtdPiguLi5pdGVtVHlwZXM6IFQpOiBBcnJheVR5cGU8VD4ge1xuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IFR1cGxlVHlwZUluZm8odCwgaXRlbVR5cGVzLm1hcChyZXNvbHZlU3RhbmRhcmRUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBjaGVja2VycyA9IGl0ZW1UeXBlcy5tYXAocmVzb2x2ZVR5cGVDaGVja2VyKVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlTmFtZXMgPSBjaGVja2Vycy5tYXAoKHRjKSA9PiB7XG4gICAgICAgIGlmIChyZWN1cnNpdmVUeXBlQ2hlY2tlcnMuaW5jbHVkZXModGMpKSB7XG4gICAgICAgICAgcmV0dXJuIFwiLi4uXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGMuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB0YylcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBcIltcIiArIHR5cGVOYW1lcy5qb2luKFwiLCBcIikgKyBcIl1cIlxuICAgIH1cblxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLkFycmF5LFxuXG4gICAgICAoYXJyYXksIHBhdGgpID0+IHtcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggIT09IGl0ZW1UeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIGdldFR5cGVOYW1lKHRoaXNUYyksIGFycmF5KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGl0ZW1FcnJvciA9IGNoZWNrZXJzW2ldLmNoZWNrKGFycmF5W2ldLCBbLi4ucGF0aCwgaV0pXG4gICAgICAgICAgaWYgKGl0ZW1FcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1FcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAoYXJyYXkpID0+IHtcbiAgICAgICAgaWYgKCFpc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggIT09IGl0ZW1UeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGl0ZW1BY3R1YWxDaGVja2VyID0gY2hlY2tlcnNbaV0uc25hcHNob3RUeXBlKGFycmF5W2ldKVxuICAgICAgICAgIGlmICghaXRlbUFjdHVhbENoZWNrZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNUY1xuICAgICAgfSxcblxuICAgICAgKGFycmF5OiB1bmtub3duW10pID0+IHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGVja2Vyc1tpXS5mcm9tU25hcHNob3RQcm9jZXNzb3IoaXRlbSlcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIChhcnJheTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tlcnNbaV0udG9TbmFwc2hvdFByb2Nlc3NvcihpdGVtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiB0aGlzVGNcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy50dXBsZWAgdHlwZSBpbmZvLlxuICovXG5leHBvcnQgY2xhc3MgVHVwbGVUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgLy8gbWVtb2l6ZSB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFycmF5IG9uIHRoZSBnZXR0ZXJcbiAgcHJpdmF0ZSBfaXRlbVR5cGVJbmZvcyA9IGxhenkoKCkgPT4gdGhpcy5pdGVtVHlwZXMubWFwKGdldFR5cGVJbmZvKSlcblxuICBnZXQgaXRlbVR5cGVJbmZvcygpOiBSZWFkb25seUFycmF5PFR5cGVJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1UeXBlSW5mb3MoKVxuICB9XG5cbiAgY29uc3RydWN0b3IodGhpc1R5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgaXRlbVR5cGVzOiBSZWFkb25seUFycmF5PEFueVN0YW5kYXJkVHlwZT4pIHtcbiAgICBzdXBlcih0aGlzVHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsQWN0aW9uXCJcbmltcG9ydCB7IG1vZGVsSWRLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxEZWNvcmF0b3JcIlxuaW1wb3J0IHsgaWRQcm9wIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgdHlwZXNBcnJheSB9IGZyb20gXCIuLi90eXBlcy9hcnJheUJhc2VkL3R5cGVzQXJyYXlcIlxuaW1wb3J0IHsgdFByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdFByb3BcIlxuaW1wb3J0IHsgdHlwZXNVbmNoZWNrZWQgfSBmcm9tIFwiLi4vdHlwZXMvdXRpbGl0eS90eXBlc1VuY2hlY2tlZFwiXG5pbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgc2V0IHRoYXQgaXMgYmFja2VkIGJ5IGFuIGFycmF5LlxuICogVXNlIGBhcnJheVNldGAgdG8gY3JlYXRlIGl0LlxuICovXG5AbW9kZWwoYCR7bmFtZXNwYWNlfS9BcnJheVNldGApXG5leHBvcnQgY2xhc3MgQXJyYXlTZXQ8Vj5cbiAgZXh0ZW5kcyBNb2RlbCh7XG4gICAgW21vZGVsSWRLZXldOiBpZFByb3AsXG4gICAgaXRlbXM6IHRQcm9wKHR5cGVzQXJyYXkodHlwZXNVbmNoZWNrZWQ8YW55PigpKSwgKCkgPT4gW10pLCAvLyB3aWxsIGJlIHByb3Blcmx5IGNoZWNrZWQgYnkgdHlwZXMuYXJyYXlTZXQoc3ViVHlwZSlcbiAgfSlcbiAgaW1wbGVtZW50cyBTZXQ8Vj5cbntcbiAgQG1vZGVsQWN0aW9uXG4gIGFkZCh2YWx1ZTogVik6IHRoaXMge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgaWYgKCFpdGVtcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgIGl0ZW1zLnB1c2godmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBAbW9kZWxBY3Rpb25cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtcy5sZW5ndGggPSAwXG4gIH1cblxuICBAbW9kZWxBY3Rpb25cbiAgZGVsZXRlKHZhbHVlOiBWKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgodCkgPT4gdCA9PT0gdmFsdWUpXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBWLCB2YWx1ZTI6IFYsIHNldDogU2V0PFY+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XG4gICAgLy8gd2UgY2Fubm90IHVzZSB0aGUgc2V0IGltcGxlbWVudGF0aW9uIHNpbmNlIHdlIG5lZWQgdG8gcGFzcyB0aGlzIGFzIHNldFxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuICAgIGNvbnN0IGxlbiA9IGl0ZW1zLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBpdGVtc1tpXVxuICAgICAgY2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsIGssIGssIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgaGFzKHZhbHVlOiBWKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuaW5jbHVkZXModmFsdWUpXG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLmxlbmd0aFxuICB9XG5cbiAga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMoKSAvLyB5ZXMsIHZhbHVlc1xuICB9XG5cbiAgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Vj4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgcmV0dXJuIHZhbHVlcyhpdGVtcylbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIH1cblxuICBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W1YsIFZdPiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zXG5cbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiBpdGVtcy5tYXAoKHYpID0+IFt2LCB2XSBhcyBbViwgVl0pLnZhbHVlcygpXG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMoKVxuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiQXJyYXlTZXRcIlxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBBcnJheVNldCBtb2RlbCBpbnN0YW5jZS5cbiAqXG4gKiBAdHlwZXBhcmFtIFYgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSBbZW50cmllc10gT3B0aW9uYWwgaW5pdGlhbCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVNldDxWPih2YWx1ZXM/OiBSZWFkb25seUFycmF5PFY+IHwgbnVsbCk6IEFycmF5U2V0PFY+IHtcbiAgY29uc3QgaW5pdGlhbEFycjogVltdID0gdmFsdWVzID8gdmFsdWVzLnNsaWNlKCkgOiBbXVxuXG4gIHJldHVybiBuZXcgQXJyYXlTZXQoeyBpdGVtczogaW5pdGlhbEFyciB9KVxufVxuIiwiaW1wb3J0IHsgbW9kZWxUeXBlS2V5IH0gZnJvbSBcIi4uLy4uL21vZGVsL21ldGFkYXRhXCJcbmltcG9ydCB7IG1vZGVsSW5mb0J5Q2xhc3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxTaGFyZWQvbW9kZWxJbmZvXCJcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IEFycmF5U2V0IH0gZnJvbSBcIi4uLy4uL3dyYXBwZXJzL0FycmF5U2V0XCJcbmltcG9ydCB7IHR5cGVzQXJyYXkgfSBmcm9tIFwiLi4vYXJyYXlCYXNlZC90eXBlc0FycmF5XCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIE1vZGVsVHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IHR5cGVzT2JqZWN0IH0gZnJvbSBcIi4vdHlwZXNPYmplY3RcIlxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYW4gYXJyYXkgYmFja2VkIHNldCBBcnJheVNldC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IG51bWJlclNldFR5cGUgPSB0eXBlcy5hcnJheVNldCh0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZVR5cGUgVmFsdWUgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc0FycmF5U2V0PFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpOiBNb2RlbFR5cGU8QXJyYXlTZXQ8VHlwZVRvRGF0YTxUPj4+IHtcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHQpID0+IG5ldyBBcnJheVNldFR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUodmFsdWVUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChBcnJheVNldCkhXG5cbiAgICBjb25zdCB2YWx1ZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodmFsdWVUeXBlKVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PlxuICAgICAgYEFycmF5U2V0PCR7dmFsdWVDaGVja2VyLmdldFR5cGVOYW1lKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VycywgdmFsdWVDaGVja2VyKX0+YFxuXG4gICAgY29uc3QgZGF0YVR5cGVDaGVja2VyID0gdHlwZXNPYmplY3QoKCkgPT4gKHtcbiAgICAgIGl0ZW1zOiB0eXBlc0FycmF5KHZhbHVlQ2hlY2tlciBhcyBhbnkpLFxuICAgIH0pKVxuXG4gICAgY29uc3QgdGhpc1RjOiBUeXBlQ2hlY2tlciA9IG5ldyBUeXBlQ2hlY2tlcihcbiAgICAgIFR5cGVDaGVja2VyQmFzZVR5cGUuT2JqZWN0LCAvLyBiZWNhdXNlIGl0IGlzIHJlYWxseSBhIG1vZGVsXG5cbiAgICAgIChvYmosIHBhdGgpID0+IHtcbiAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQXJyYXlTZXQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBvYmopXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZFRjID0gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkVGMuY2hlY2sob2JqLiQsIHBhdGgpXG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAob2JqKSA9PiB7XG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqW21vZGVsVHlwZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZhc3QgY2hlY2tcbiAgICAgICAgICByZXR1cm4gb2JqW21vZGVsVHlwZUtleV0gPT09IG1vZGVsSW5mby5uYW1lID8gdGhpc1RjIDogbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRUYyA9IHJlc29sdmVUeXBlQ2hlY2tlcihkYXRhVHlwZUNoZWNrZXIpXG4gICAgICAgIHJldHVybiByZXNvbHZlZFRjLnNuYXBzaG90VHlwZShvYmopID8gdGhpc1RjIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiB1bmtub3duW10gfSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgICAgICAgICBpdGVtczogc24uaXRlbXMubWFwKCh2KSA9PiB2YWx1ZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHYpKSxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiB1bmtub3duW107IFttb2RlbFR5cGVLZXldPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc25Db3B5ID0ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIGl0ZW1zOiBzbi5pdGVtcy5tYXAoKHYpID0+IHZhbHVlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHYpKSxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzbkNvcHlcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMuYXJyYXlTZXRgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIEFycmF5U2V0VHlwZUluZm8gZXh0ZW5kcyBUeXBlSW5mbyB7XG4gIGdldCB2YWx1ZVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcbiAgICByZXR1cm4gZ2V0VHlwZUluZm8odGhpcy52YWx1ZVR5cGUpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcmlnaW5hbFR5cGU6IEFueVN0YW5kYXJkVHlwZSwgcmVhZG9ubHkgdmFsdWVUeXBlOiBBbnlTdGFuZGFyZFR5cGUpIHtcbiAgICBzdXBlcihvcmlnaW5hbFR5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIFJlY29yZFR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQge1xuICBsYXRlVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyLFxuICBUeXBlQ2hlY2tlckJhc2VUeXBlLFxuICBUeXBlSW5mbyxcbiAgVHlwZUluZm9HZW4sXG59IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiBvYmplY3QtbGlrZSBtYXAsIGFuIG9iamVjdCB3aXRoIHN0cmluZyBrZXlzIGFuZCB2YWx1ZXMgYWxsIG9mIGEgc2FtZSBnaXZlbiB0eXBlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogLy8geyBbazogc3RyaW5nXTogbnVtYmVyIH1cbiAqIGNvbnN0IG51bWJlck1hcFR5cGUgPSB0eXBlcy5yZWNvcmQodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0LWxpa2UgbWFwLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzUmVjb3JkPFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpOiBSZWNvcmRUeXBlPFQ+IHtcbiAgY29uc3QgdHlwZUluZm9HZW46IFR5cGVJbmZvR2VuID0gKHRjKSA9PiBuZXcgUmVjb3JkVHlwZUluZm8odGMsIHJlc29sdmVTdGFuZGFyZFR5cGUodmFsdWVUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCB2YWx1ZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIodmFsdWVUeXBlKVxuXG4gICAgY29uc3QgZ2V0VHlwZU5hbWUgPSAoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzOiBUeXBlQ2hlY2tlcltdKSA9PlxuICAgICAgYFJlY29yZDwke3ZhbHVlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIHZhbHVlQ2hlY2tlcil9PmBcblxuICAgIGNvbnN0IGFwcGx5U25hcHNob3RQcm9jZXNzb3IgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbW9kZTogXCJmcm9tXCIgfCBcInRvXCIpID0+IHtcbiAgICAgIGlmICh2YWx1ZUNoZWNrZXIudW5jaGVja2VkKSB7XG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3T2JqOiB0eXBlb2Ygb2JqID0ge31cblxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgICBjb25zdCB2ID1cbiAgICAgICAgICBtb2RlID09PSBcImZyb21cIlxuICAgICAgICAgICAgPyB2YWx1ZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKG9ialtrXSlcbiAgICAgICAgICAgIDogdmFsdWVDaGVja2VyLnRvU25hcHNob3RQcm9jZXNzb3Iob2JqW2tdKVxuICAgICAgICBuZXdPYmpba10gPSB2XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmpcbiAgICB9XG5cbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxuICAgICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAgIChvYmosIHBhdGgpID0+IHtcbiAgICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBvYmopXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlQ2hlY2tlci51bmNoZWNrZWQpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgICAgICAgIGNvbnN0IHYgPSBvYmpba11cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlRXJyb3IgPSB2YWx1ZUNoZWNrZXIuY2hlY2sodiwgWy4uLnBhdGgsIGtdKVxuICAgICAgICAgICAgaWYgKHZhbHVlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfSxcblxuICAgICAgZ2V0VHlwZU5hbWUsXG4gICAgICB0eXBlSW5mb0dlbixcblxuICAgICAgKG9iaikgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKCF2YWx1ZUNoZWNrZXIudW5jaGVja2VkKSB7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICAgICAgICBjb25zdCB2ID0gb2JqW2tdXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFjdHVhbENoZWNrZXIgPSB2YWx1ZUNoZWNrZXIuc25hcHNob3RUeXBlKHYpXG4gICAgICAgICAgICBpZiAoIXZhbHVlQWN0dWFsQ2hlY2tlcikge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzVGNcbiAgICAgIH0sXG5cbiAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIHJldHVybiBhcHBseVNuYXBzaG90UHJvY2Vzc29yKG9iaiwgXCJmcm9tXCIpXG4gICAgICB9LFxuXG4gICAgICAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICByZXR1cm4gYXBwbHlTbmFwc2hvdFByb2Nlc3NvcihvYmosIFwidG9cIilcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMucmVjb3JkYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgZ2V0IHZhbHVlVHlwZUluZm8oKTogVHlwZUluZm8ge1xuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLnZhbHVlVHlwZSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IHZhbHVlVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IGVudHJpZXMsIGdldCwgaGFzLCBrZXlzLCByZW1vdmUsIHNldCwgdmFsdWVzIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHsgbW9kZWxBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9uL21vZGVsQWN0aW9uXCJcbmltcG9ydCB7IG1vZGVsSWRLZXkgfSBmcm9tIFwiLi4vbW9kZWwvbWV0YWRhdGFcIlxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIlxuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxTaGFyZWQvbW9kZWxEZWNvcmF0b3JcIlxuaW1wb3J0IHsgaWRQcm9wIH0gZnJvbSBcIi4uL21vZGVsU2hhcmVkL3Byb3BcIlxuaW1wb3J0IHsgdHlwZXNSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvb2JqZWN0QmFzZWQvdHlwZXNSZWNvcmRcIlxuaW1wb3J0IHsgdFByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdFByb3BcIlxuaW1wb3J0IHsgdHlwZXNVbmNoZWNrZWQgfSBmcm9tIFwiLi4vdHlwZXMvdXRpbGl0eS90eXBlc1VuY2hlY2tlZFwiXG5pbXBvcnQgeyBuYW1lc3BhY2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG4vKipcbiAqIEEgbWFwIHRoYXQgaXMgYmFja2VkIGJ5IGFuIG9iamVjdC1saWtlIG1hcC5cbiAqIFVzZSBgb2JqZWN0TWFwYCB0byBjcmVhdGUgaXQuXG4gKi9cbkBtb2RlbChgJHtuYW1lc3BhY2V9L09iamVjdE1hcGApXG5leHBvcnQgY2xhc3MgT2JqZWN0TWFwPFY+XG4gIGV4dGVuZHMgTW9kZWwoe1xuICAgIFttb2RlbElkS2V5XTogaWRQcm9wLFxuICAgIGl0ZW1zOiB0UHJvcCh0eXBlc1JlY29yZCh0eXBlc1VuY2hlY2tlZDxhbnk+KCkpLCAoKSA9PiAoe30pKSwgLy8gd2lsbCBiZSBwcm9wZXJseSBjaGVja2VkIGJ5IHR5cGVzLm9iamVjdE1hcChzdWJUeXBlKVxuICB9KVxuICBpbXBsZW1lbnRzIE1hcDxzdHJpbmcsIFY+XG57XG4gIEBtb2RlbEFjdGlvblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXNcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtcylcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICByZW1vdmUoaXRlbXMsIGspXG4gICAgfVxuICB9XG5cbiAgQG1vZGVsQWN0aW9uXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc0tleSA9IHRoaXMuaGFzKGtleSlcbiAgICBpZiAoaGFzS2V5KSB7XG4gICAgICByZW1vdmUodGhpcy5pdGVtcywga2V5KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IFYsIGtleTogc3RyaW5nLCBtYXA6IE1hcDxzdHJpbmcsIFY+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XG4gICAgLy8gd2UgY2Fubm90IHVzZSB0aGUgbWFwIGltcGxlbWVudGF0aW9uIHNpbmNlIHdlIG5lZWQgdG8gcGFzcyB0aGlzIGFzIG1hcFxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtc1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW1zKVxuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgIGNhbGxiYWNrZm4uY2FsbCh0aGlzQXJnLCBpdGVtc1trXSwgaywgdGhpcylcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBWIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMuaXRlbXMsIGtleSlcbiAgfVxuXG4gIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoYXModGhpcy5pdGVtcywga2V5KVxuICB9XG5cbiAgQG1vZGVsQWN0aW9uXG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFYpOiB0aGlzIHtcbiAgICBzZXQodGhpcy5pdGVtcywga2V5LCB2YWx1ZSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4ga2V5cyh0aGlzLml0ZW1zKS5sZW5ndGhcbiAgfVxuXG4gIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiBrZXlzKHRoaXMuaXRlbXMpW1N5bWJvbC5pdGVyYXRvcl0oKSBhcyBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz5cbiAgfVxuXG4gIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFY+IHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiB2YWx1ZXModGhpcy5pdGVtcylbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIH1cblxuICBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgVl0+IHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdXNlIGFuIGFjdHVhbCBpdGVyYXRvclxuICAgIHJldHVybiBlbnRyaWVzKHRoaXMuaXRlbXMpW1N5bWJvbC5pdGVyYXRvcl0oKVxuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBWXT4ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMoKVxuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiT2JqZWN0TWFwXCJcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgT2JqZWN0TWFwIG1vZGVsIGluc3RhbmNlLlxuICpcbiAqIEB0eXBlcGFyYW0gViBWYWx1ZSB0eXBlLlxuICogQHBhcmFtIFtlbnRyaWVzXSBPcHRpb25hbCBpbml0aWFsIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdE1hcDxWPihlbnRyaWVzPzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBWXT4gfCBudWxsKTogT2JqZWN0TWFwPFY+IHtcbiAgY29uc3QgaW5pdGlhbE9iajogeyBbazogc3RyaW5nXTogViB9ID0ge31cblxuICBpZiAoZW50cmllcykge1xuICAgIGxldCBsZW4gPSBlbnRyaWVzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgaW5pdGlhbE9ialtlbnRyeVswXV0gPSBlbnRyeVsxXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgT2JqZWN0TWFwKHsgaXRlbXM6IGluaXRpYWxPYmogfSlcbn1cbiIsImltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi8uLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiXG5pbXBvcnQgeyBPYmplY3RNYXAgfSBmcm9tIFwiLi4vLi4vd3JhcHBlcnMvT2JqZWN0TWFwXCJcbmltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcbmltcG9ydCB7IHJlc29sdmVTdGFuZGFyZFR5cGUsIHJlc29sdmVUeXBlQ2hlY2tlciB9IGZyb20gXCIuLi9yZXNvbHZlVHlwZUNoZWNrZXJcIlxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIE1vZGVsVHlwZSwgVHlwZVRvRGF0YSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7XG4gIGxhdGVUeXBlQ2hlY2tlcixcbiAgVHlwZUNoZWNrZXIsXG4gIFR5cGVDaGVja2VyQmFzZVR5cGUsXG4gIFR5cGVJbmZvLFxuICBUeXBlSW5mb0dlbixcbn0gZnJvbSBcIi4uL1R5cGVDaGVja2VyXCJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcbmltcG9ydCB7IHR5cGVzT2JqZWN0IH0gZnJvbSBcIi4vdHlwZXNPYmplY3RcIlxuaW1wb3J0IHsgdHlwZXNSZWNvcmQgfSBmcm9tIFwiLi90eXBlc1JlY29yZFwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbiBvYmplY3QtbGlrZSBtYXAgT2JqZWN0TWFwLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgbnVtYmVyTWFwVHlwZSA9IHR5cGVzLm9iamVjdE1hcCh0eXBlcy5udW1iZXIpXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVmFsdWUgdHlwZS5cbiAqIEBwYXJhbSB2YWx1ZVR5cGUgVmFsdWUgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc09iamVjdE1hcDxUIGV4dGVuZHMgQW55VHlwZT4oXG4gIHZhbHVlVHlwZTogVFxuKTogTW9kZWxUeXBlPE9iamVjdE1hcDxUeXBlVG9EYXRhPFQ+Pj4ge1xuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT4gbmV3IE9iamVjdE1hcFR5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUodmFsdWVUeXBlKSlcblxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcbiAgICBjb25zdCBtb2RlbEluZm8gPSBtb2RlbEluZm9CeUNsYXNzLmdldChPYmplY3RNYXApIVxuXG4gICAgY29uc3QgdmFsdWVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKHZhbHVlVHlwZSlcblxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT5cbiAgICAgIGBPYmplY3RNYXA8JHt2YWx1ZUNoZWNrZXIuZ2V0VHlwZU5hbWUoLi4ucmVjdXJzaXZlVHlwZUNoZWNrZXJzLCB2YWx1ZUNoZWNrZXIpfT5gXG5cbiAgICBjb25zdCBkYXRhVHlwZUNoZWNrZXIgPSB0eXBlc09iamVjdCgoKSA9PiAoe1xuICAgICAgaXRlbXM6IHR5cGVzUmVjb3JkKHZhbHVlQ2hlY2tlciBhcyBhbnkpLFxuICAgIH0pKVxuICAgIGNvbnN0IHJlc29sdmVkRGF0YVR5cGVDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGRhdGFUeXBlQ2hlY2tlcilcblxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgICBUeXBlQ2hlY2tlckJhc2VUeXBlLk9iamVjdCxcblxuICAgICAgKG9iaiwgcGF0aCkgPT4ge1xuICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBPYmplY3RNYXApKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUeXBlQ2hlY2tFcnJvcihwYXRoLCBnZXRUeXBlTmFtZSh0aGlzVGMpLCBvYmopXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhVHlwZUNoZWNrZXIuY2hlY2sob2JqLiQsIHBhdGgpXG4gICAgICB9LFxuXG4gICAgICBnZXRUeXBlTmFtZSxcbiAgICAgIHR5cGVJbmZvR2VuLFxuXG4gICAgICAob2JqKSA9PiB7XG4gICAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqW21vZGVsVHlwZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZhc3QgY2hlY2tcbiAgICAgICAgICByZXR1cm4gb2JqW21vZGVsVHlwZUtleV0gPT09IG1vZGVsSW5mby5uYW1lID8gdGhpc1RjIDogbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVR5cGVDaGVja2VyLnNuYXBzaG90VHlwZShvYmopID8gdGhpc1RjIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zOiB0eXBlb2Ygc25bXCJpdGVtc1wiXSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNuLml0ZW1zKSkge1xuICAgICAgICAgIG5ld0l0ZW1zW2tdID0gdmFsdWVDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3Nvcihzbi5pdGVtc1trXSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc24sXG4gICAgICAgICAgW21vZGVsVHlwZUtleV06IG1vZGVsSW5mby5uYW1lLFxuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgKHNuOiB7IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgW21vZGVsVHlwZUtleV0/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJdGVtczogdHlwZW9mIHNuW1wiaXRlbXNcIl0gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzbi5pdGVtcykpIHtcbiAgICAgICAgICBuZXdJdGVtc1trXSA9IHZhbHVlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHNuLml0ZW1zW2tdKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc25Db3B5ID0ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzbkNvcHlcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gdGhpc1RjXG4gIH0sIHR5cGVJbmZvR2VuKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBgdHlwZXMub2JqZWN0TWFwYCB0eXBlIGluZm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBPYmplY3RNYXBUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcbiAgZ2V0IHZhbHVlVHlwZUluZm8oKTogVHlwZUluZm8ge1xuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLnZhbHVlVHlwZSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsIHJlYWRvbmx5IHZhbHVlVHlwZTogQW55U3RhbmRhcmRUeXBlKSB7XG4gICAgc3VwZXIodGhpc1R5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsVHlwZUtleSB9IGZyb20gXCIuLi8uLi9tb2RlbC9tZXRhZGF0YVwiXG5pbXBvcnQgeyBtb2RlbEluZm9CeUNsYXNzIH0gZnJvbSBcIi4uLy4uL21vZGVsU2hhcmVkL21vZGVsSW5mb1wiXG5pbXBvcnQgeyBSZWYsIFJlZkNvbnN0cnVjdG9yIH0gZnJvbSBcIi4uLy4uL3JlZi9SZWZcIlxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IHsgdHlwZXNTdHJpbmcgfSBmcm9tIFwiLi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHsgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXG5pbXBvcnQgdHlwZSB7IE1vZGVsVHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzXCJcbmltcG9ydCB7IFR5cGVDaGVja2VyLCBUeXBlQ2hlY2tlckJhc2VUeXBlLCBUeXBlSW5mbyB9IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXG5pbXBvcnQgeyBUeXBlQ2hlY2tFcnJvciB9IGZyb20gXCIuLi9UeXBlQ2hlY2tFcnJvclwiXG5pbXBvcnQgeyB0eXBlc09iamVjdCB9IGZyb20gXCIuL3R5cGVzT2JqZWN0XCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvciBtb2RlbC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IHJlZlRvU29tZU9iamVjdCA9IHR5cGVzLnJlZihTb21lT2JqZWN0KVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBPIE9iamVjdCBvciBtb2RlbCB0eXBlLlxuICogQHBhcmFtIHJlZkNvbnN0cnVjdG9yIFJlZiBvYmplY3QgdHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc1JlZjxPIGV4dGVuZHMgb2JqZWN0PihyZWZDb25zdHJ1Y3RvcjogUmVmQ29uc3RydWN0b3I8Tz4pOiBNb2RlbFR5cGU8UmVmPE8+PiB7XG4gIGNvbnN0IHR5cGVOYW1lID0gXCJSZWZcIlxuXG4gIGNvbnN0IG1vZGVsSW5mbyA9IG1vZGVsSW5mb0J5Q2xhc3MuZ2V0KHJlZkNvbnN0cnVjdG9yLnJlZkNsYXNzKSFcblxuICBjb25zdCByZWZEYXRhVHlwZUNoZWNrZXIgPSByZXNvbHZlVHlwZUNoZWNrZXIoXG4gICAgdHlwZXNPYmplY3QoKCkgPT4gKHtcbiAgICAgIGlkOiB0eXBlc1N0cmluZyxcbiAgICB9KSlcbiAgKVxuXG4gIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXG4gICAgVHlwZUNoZWNrZXJCYXNlVHlwZS5PYmplY3QsXG5cbiAgICAodmFsdWUsIHBhdGgpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUmVmKSkge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVDaGVja0Vycm9yKHBhdGgsIHR5cGVOYW1lLCB2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZkRhdGFUeXBlQ2hlY2tlci5jaGVjayh2YWx1ZS4kLCBwYXRoKVxuICAgIH0sXG5cbiAgICAoKSA9PiB0eXBlTmFtZSxcbiAgICAodCkgPT4gbmV3IFJlZlR5cGVJbmZvKHQpLFxuXG4gICAgKG9iaikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGlmIChvYmpbbW9kZWxUeXBlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGZhc3QgY2hlY2tcbiAgICAgICAgcmV0dXJuIG9ialttb2RlbFR5cGVLZXldID09PSBtb2RlbEluZm8ubmFtZSA/IHRoaXNUYyA6IG51bGxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZkRhdGFUeXBlQ2hlY2tlci5zbmFwc2hvdFR5cGUob2JqKSA/IHRoaXNUYyA6IG51bGxcbiAgICB9LFxuXG4gICAgKHNuOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgaWYgKHNuW21vZGVsVHlwZUtleV0pIHtcbiAgICAgICAgcmV0dXJuIHNuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNuLFxuICAgICAgICAgIFttb2RlbFR5cGVLZXldOiBtb2RlbEluZm8ubmFtZSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAoc24pID0+IHNuXG4gIClcblxuICByZXR1cm4gdGhpc1RjIGFzIGFueVxufVxuXG4vKipcbiAqIGB0eXBlcy5yZWZgIHR5cGUgaW5mby5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZlR5cGVJbmZvIGV4dGVuZHMgVHlwZUluZm8ge31cbiIsImltcG9ydCB7IGFzc2VydElzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCJcbmltcG9ydCB0eXBlIHsgSWRlbnRpdHlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxuaW1wb3J0IHsgdHlwZXNPciB9IGZyb20gXCIuLi91dGlsaXR5L3R5cGVzT3JcIlxuaW1wb3J0IHsgdHlwZXNMaXRlcmFsIH0gZnJvbSBcIi4vdHlwZXNQcmltaXRpdmVcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqIEVudW0gbGlrZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW51bUxpa2Uge1xuICBbazogc3RyaW5nXTogbnVtYmVyIHwgc3RyaW5nXG4gIFt2OiBudW1iZXJdOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudW1WYWx1ZXMoZTogRW51bUxpa2UpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgY29uc3QgdmFsczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdXG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhlKSkge1xuICAgIGNvbnN0IHYgPSBlW2tdXG4gICAgLy8gd2UgaGF2ZSB0byBkbyB0aGlzIHNpbmNlIFRTIGRvZXMgc29tZXRoaW5nIHdlaXJkXG4gICAgLy8gdG8gbnVtYmVyIHZhbHVlc1xuICAgIC8vIEhpID0gMCAtPiB7IEhpOiAwLCAwOiBcIkhpXCIgfVxuICAgIC8vIGFuZCBTV0MgY3VycmVudGx5IGdlbmVyYXRlcyBlbnVtIGNvZGUgaW5jb25zaXN0ZW50IHdpdGggVFMvQmFiZWxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3djLXByb2plY3Qvc3djL2lzc3Vlcy8zNzExXG4gICAgaWYgKCF2YWxzLmluY2x1ZGVzKHYpICYmICgodHlwZW9mIHYgIT09IFwic3RyaW5nXCIgJiYgdiAhPT0gK2spIHx8IGVbdl0gIT09ICtrKSkge1xuICAgICAgdmFscy5wdXNoKHYpXG4gICAgfVxuICB9XG4gIHJldHVybiB2YWxzXG59XG5cbi8qKlxuICogQGlnbm9yZVxuICogRXh0cmFjdCBlbnVtIHZhbHVlcyBvdXQgb2YgYSBlbnVtIG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgRW51bVZhbHVlczxFIGV4dGVuZHMgRW51bUxpa2U+ID0gRSBleHRlbmRzIFJlY29yZDxcbiAgaW5mZXIgX0ssIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGluZmVyIFZcbj5cbiAgPyBWXG4gIDogbmV2ZXJcblxuLyoqXG4gKiBBbiBlbnVtIHR5cGUsIGJhc2VkIG9uIGEgVHlwZVNjcmlwdCBhbGlrZSBlbnVtIG9iamVjdC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLm9yKC4uLmVudW1fdmFsdWVzLm1hcCh0eXBlcy5saXRlcmFsKSlgXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBlbnVtIENvbG9yIHtcbiAqICAgUmVkID0gXCJyZWRcIixcbiAqICAgR3JlZW4gPSBcImdyZWVuXCJcbiAqIH1cbiAqXG4gKiBjb25zdCBjb2xvclR5cGUgPSB0eXBlcy5lbnVtKENvbG9yKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBFIEVudW0gdHlwZS5cbiAqIEBwYXJhbSBlbnVtT2JqZWN0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNFbnVtPEUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bU9iamVjdDogRSk6IElkZW50aXR5VHlwZTxFbnVtVmFsdWVzPEU+PiB7XG4gIGFzc2VydElzT2JqZWN0KGVudW1PYmplY3QsIFwiZW51bU9iamVjdFwiKVxuXG4gIGNvbnN0IGxpdGVyYWxzID0gZW51bVZhbHVlcyhlbnVtT2JqZWN0KS5tYXAoKGUpID0+IHR5cGVzTGl0ZXJhbChlKSlcbiAgcmV0dXJuIHR5cGVzT3IoLi4ubGl0ZXJhbHMpIGFzIGFueVxufVxuIiwiaW1wb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi4vZ2V0VHlwZUluZm9cIlxyXG5pbXBvcnQgeyByZXNvbHZlU3RhbmRhcmRUeXBlLCByZXNvbHZlVHlwZUNoZWNrZXIgfSBmcm9tIFwiLi4vcmVzb2x2ZVR5cGVDaGVja2VyXCJcclxuaW1wb3J0IHR5cGUgeyBBbnlTdGFuZGFyZFR5cGUsIEFueVR5cGUsIFR5cGVUb0RhdGEgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXHJcbmltcG9ydCB7IGxhdGVUeXBlQ2hlY2tlciwgVHlwZUNoZWNrZXIsIFR5cGVJbmZvLCBUeXBlSW5mb0dlbiB9IGZyb20gXCIuLi9UeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB7IFR5cGVDaGVja0Vycm9yIH0gZnJvbSBcIi4uL1R5cGVDaGVja0Vycm9yXCJcclxuXHJcbi8qKlxyXG4gKiBBIHJlZmluZW1lbnQgb3ZlciBhIGdpdmVuIHR5cGUuIFRoaXMgYWxsb3dzIHlvdSB0byBkbyBleHRyYSBjaGVja3NcclxuICogb3ZlciBtb2RlbHMsIGVuc3VyZSBudW1iZXJzIGFyZSBpbnRlZ2VycywgZXRjLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCBpbnRlZ2VyVHlwZSA9IHR5cGVzLnJlZmluZW1lbnQodHlwZXMubnVtYmVyLCAobikgPT4ge1xyXG4gKiAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pXHJcbiAqIH0sIFwiaW50ZWdlclwiKVxyXG4gKlxyXG4gKiBjb25zdCBzdW1Nb2RlbFR5cGUgPSB0eXBlcy5yZWZpbmVtZW50KHR5cGVzLm1vZGVsKFN1bSksIChzdW0pID0+IHtcclxuICogICAvLyBpbWFnaW5lIHRoYXQgZm9yIHNvbWUgcmVhc29uIHN1bSBpbmNsdWRlcyBhIG51bWJlciAnYScsIGEgbnVtYmVyICdiJ1xyXG4gKiAgIC8vIGFuZCB0aGUgcmVzdWx0XHJcbiAqXHJcbiAqICAgY29uc3QgcmlnaHRSZXN1bHQgPSBzdW0uYSArIHN1bS5iID09PSBzdW0ucmVzdWx0XHJcbiAqXHJcbiAqICAgLy8gc2ltcGxlIG1vZGUgdGhhdCB3aWxsIGp1c3QgcmV0dXJuIHRoYXQgdGhlIHdob2xlIG1vZGVsIGlzIGluY29ycmVjdFxyXG4gKiAgIHJldHVybiByaWdodFJlc3VsdFxyXG4gKlxyXG4gKiAgIC8vIHRoaXMgd2lsbCByZXR1cm4gdGhhdCB0aGUgcmVzdWx0IGZpZWxkIGlzIHdyb25nXHJcbiAqICAgcmV0dXJuIHJpZ2h0UmVzdWx0ID8gbnVsbCA6IG5ldyBUeXBlQ2hlY2tFcnJvcihbXCJyZXN1bHRcIl0sIFwiYStiXCIsIHN1bS5yZXN1bHQpXHJcbiAqIH0pXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHlwZXBhcmFtIFQgQmFzZSB0eXBlLlxyXG4gKiBAcGFyYW0gYmFzZVR5cGUgQmFzZSB0eXBlLlxyXG4gKiBAcGFyYW0gY2hlY2tGbiBGdW5jdGlvbiB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZGF0YSAoaWYgaXQgcGFzc2VzIHRoZSBiYXNlIHR5cGVcclxuICogY2hlY2spIGFuZCByZXR1cm4gbnVsbCBvciBmYWxzZSBpZiB0aGVyZSB3ZXJlIG5vIGVycm9ycyBvciBlaXRoZXIgYSBUeXBlQ2hlY2tFcnJvciBpbnN0YW5jZSBvclxyXG4gKiB0cnVlIGlmIHRoZXJlIHdlcmUuXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHlwZXNSZWZpbmVtZW50PFQgZXh0ZW5kcyBBbnlUeXBlPihcclxuICBiYXNlVHlwZTogVCxcclxuICBjaGVja0ZuOiAoZGF0YTogVHlwZVRvRGF0YTxUPikgPT4gVHlwZUNoZWNrRXJyb3IgfCBudWxsIHwgYm9vbGVhbixcclxuICB0eXBlTmFtZT86IHN0cmluZ1xyXG4pOiBUIHtcclxuICBjb25zdCB0eXBlSW5mb0dlbjogVHlwZUluZm9HZW4gPSAodCkgPT5cclxuICAgIG5ldyBSZWZpbmVtZW50VHlwZUluZm8odCwgcmVzb2x2ZVN0YW5kYXJkVHlwZShiYXNlVHlwZSksIGNoZWNrRm4sIHR5cGVOYW1lKVxyXG5cclxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcclxuICAgIGNvbnN0IGJhc2VDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGJhc2VUeXBlKVxyXG5cclxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xyXG4gICAgICBjb25zdCBiYXNlVHlwZU5hbWUgPSBiYXNlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIGJhc2VDaGVja2VyKVxyXG4gICAgICBjb25zdCByZWZpbmVtZW50TmFtZSA9IHR5cGVOYW1lIHx8IFwicmVmaW5lbWVudE9mXCJcclxuICAgICAgcmV0dXJuIGAke3JlZmluZW1lbnROYW1lfTwke2Jhc2VUeXBlTmFtZX0+YFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRoaXNUYzogVHlwZUNoZWNrZXIgPSBuZXcgVHlwZUNoZWNrZXIoXHJcbiAgICAgIGJhc2VDaGVja2VyLmJhc2VUeXBlLFxyXG5cclxuICAgICAgKGRhdGEsIHBhdGgpID0+IHtcclxuICAgICAgICBjb25zdCBiYXNlRXJyID0gYmFzZUNoZWNrZXIuY2hlY2soZGF0YSwgcGF0aClcclxuICAgICAgICBpZiAoYmFzZUVycikge1xyXG4gICAgICAgICAgcmV0dXJuIGJhc2VFcnJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZmluZW1lbnRFcnIgPSBjaGVja0ZuKGRhdGEpXHJcblxyXG4gICAgICAgIGlmIChyZWZpbmVtZW50RXJyID09PSB0cnVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH0gZWxzZSBpZiAocmVmaW5lbWVudEVyciA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgVHlwZUNoZWNrRXJyb3IocGF0aCwgZ2V0VHlwZU5hbWUodGhpc1RjKSwgZGF0YSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlZmluZW1lbnRFcnIgPz8gbnVsbFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuXHJcbiAgICAgIGdldFR5cGVOYW1lLFxyXG4gICAgICB0eXBlSW5mb0dlbixcclxuXHJcbiAgICAgIC8vIHdlIGNhbm5vdCBjaGVjayByZWZpbmVtZW50IGhlcmUgc2luY2UgaXQgY2hlY2tzIGRhdGEgaW5zdGFuY2VzLCBub3Qgc25hcHNob3RzXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIuc25hcHNob3RUeXBlKHNuKSxcclxuXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIuZnJvbVNuYXBzaG90UHJvY2Vzc29yKHNuKSxcclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci50b1NuYXBzaG90UHJvY2Vzc29yKHNuKVxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiB0aGlzVGNcclxuICB9LCB0eXBlSW5mb0dlbikgYXMgYW55XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgdHlwZXMucmVmaW5lbWVudGAgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlZmluZW1lbnRUeXBlSW5mbyBleHRlbmRzIFR5cGVJbmZvIHtcclxuICBnZXQgYmFzZVR5cGVJbmZvKCk6IFR5cGVJbmZvIHtcclxuICAgIHJldHVybiBnZXRUeXBlSW5mbyh0aGlzLmJhc2VUeXBlKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0aGlzVHlwZTogQW55U3RhbmRhcmRUeXBlLFxyXG4gICAgcmVhZG9ubHkgYmFzZVR5cGU6IEFueVN0YW5kYXJkVHlwZSxcclxuICAgIHJlYWRvbmx5IGNoZWNrRnVuY3Rpb246IChkYXRhOiBhbnkpID0+IFR5cGVDaGVja0Vycm9yIHwgbnVsbCB8IGJvb2xlYW4sXHJcbiAgICByZWFkb25seSB0eXBlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICBzdXBlcih0aGlzVHlwZSlcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZXNSZWZpbmVtZW50IH0gZnJvbSBcIi4uL3V0aWxpdHkvdHlwZXNSZWZpbmVtZW50XCJcbmltcG9ydCB7IHR5cGVzTnVtYmVyLCB0eXBlc1N0cmluZyB9IGZyb20gXCIuL3R5cGVzUHJpbWl0aXZlXCJcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBpbnRlZ2VyIG51bWJlciB2YWx1ZS5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLnJlZmluZW1lbnQodHlwZXMubnVtYmVyLCBuID0+IE51bWJlci5pc0ludGVnZXIobiksIFwiaW50ZWdlclwiKWBcbiAqXG4gKiBgYGB0c1xuICogdHlwZXMuaW50ZWdlclxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB0eXBlc0ludGVnZXIgPSB0eXBlc1JlZmluZW1lbnQodHlwZXNOdW1iZXIsIChuKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKG4pLCBcImludGVnZXJcIilcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGFueSBzdHJpbmcgdmFsdWUgb3RoZXIgdGhhbiBcIlwiLlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBgdHlwZXMucmVmaW5lbWVudCh0eXBlcy5zdHJpbmcsIHMgPT4gcyAhPT0gXCJcIiwgXCJub25FbXB0eVwiKWBcbiAqXG4gKiBgYGB0c1xuICogdHlwZXMubm9uRW1wdHlTdHJpbmdcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHlwZXNOb25FbXB0eVN0cmluZyA9IHR5cGVzUmVmaW5lbWVudCh0eXBlc1N0cmluZywgKHMpID0+IHMgIT09IFwiXCIsIFwibm9uRW1wdHlcIilcbiIsImltcG9ydCB7IHR5cGVzTnVsbCwgdHlwZXNVbmRlZmluZWQgfSBmcm9tIFwiLi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNQcmltaXRpdmVcIlxuaW1wb3J0IHR5cGUgeyBBbnlUeXBlLCBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vc2NoZW1hc1wiXG5pbXBvcnQgeyB0eXBlc09yIH0gZnJvbSBcIi4vdHlwZXNPclwiXG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBlaXRoZXIgYSB0eXBlIG9yIHVuZGVmaW5lZC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLm9yKGJhc2VUeXBlLCB0eXBlcy51bmRlZmluZWQpYFxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0c1xuICogY29uc3QgbnVtYmVyT3JVbmRlZmluZWRUeXBlID0gdHlwZXMubWF5YmUodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gYmFzZVR5cGUgVHlwZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlc01heWJlPFQgZXh0ZW5kcyBBbnlUeXBlPihiYXNlVHlwZTogVCk6IFQgfCBJZGVudGl0eVR5cGU8dW5kZWZpbmVkPiB7XG4gIHJldHVybiB0eXBlc09yKGJhc2VUeXBlLCB0eXBlc1VuZGVmaW5lZClcbn1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGVpdGhlciBhIHR5cGUgb3IgbnVsbC5cbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYHR5cGVzLm9yKGJhc2VUeXBlLCB0eXBlcy5udWxsKWBcbiAqXG4gKiAgKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnN0IG51bWJlck9yTnVsbFR5cGUgPSB0eXBlcy5tYXliZU51bGwodHlwZXMubnVtYmVyKVxuICogYGBgXG4gKlxuICogQHR5cGVwYXJhbSBUIFR5cGUuXG4gKiBAcGFyYW0gdHlwZSBUeXBlLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzTWF5YmVOdWxsPFQgZXh0ZW5kcyBBbnlUeXBlPih0eXBlOiBUKTogVCB8IElkZW50aXR5VHlwZTxudWxsPiB7XG4gIHJldHVybiB0eXBlc09yKHR5cGUsIHR5cGVzTnVsbClcbn1cbiIsImltcG9ydCB7IGdldFR5cGVJbmZvIH0gZnJvbSBcIi4uL2dldFR5cGVJbmZvXCJcclxuaW1wb3J0IHsgcmVzb2x2ZVN0YW5kYXJkVHlwZSwgcmVzb2x2ZVR5cGVDaGVja2VyIH0gZnJvbSBcIi4uL3Jlc29sdmVUeXBlQ2hlY2tlclwiXHJcbmltcG9ydCB0eXBlIHsgQW55U3RhbmRhcmRUeXBlLCBBbnlUeXBlIH0gZnJvbSBcIi4uL3NjaGVtYXNcIlxyXG5pbXBvcnQgeyBsYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2VyLCBUeXBlSW5mbywgVHlwZUluZm9HZW4gfSBmcm9tIFwiLi4vVHlwZUNoZWNrZXJcIlxyXG5cclxuLyoqXHJcbiAqIFdyYXAgYSBnaXZlbiB0eXBlIHdpdGggdGFnIGluZm9ybWF0aW9uLlxyXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGggdGhlIHR5cGUgb2YgYSBwcm9wIHRoYXRcclxuICogeW91IGNhbiB1c2UgYXQgcnVudGltZS5cclxuICpcclxuICogRXhhbXBsZTpcclxuICogYGBgdHNcclxuICogY29uc3Qgd2lkdGhUeXBlID0gdHlwZXMudGFnKHR5cGVzLm51bWJlciwgeyBkaXNwbGF5TmFtZTogXCJXaWR0aCBpbiBJbmNoZXNcIiwgcmVxdWlyZWQ6IHRydWUgfSwgXCJkaW1lbnNpb25cIilcclxuICogY29uc3QgaGVpZ2h0VHlwZSA9IHR5cGVzLnRhZyh0eXBlcy5udW1iZXIsIHsgZGlzcGxheU5hbWU6IFwiSGVpZ2h0IGluIEluY2hlc1wiLCByZXF1aXJlZDogdHJ1ZSB9LCBcImRpbWVuc2lvblwiKVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlc2UgY2FuIHRoZW4gYmUgYWNjZXNzZWQgYXQgcnVudGltZSB0aHJvdWdoIGluc3BlY3Rpb24gQVBJcywgZS5nLlxyXG4gKiBgYGBcclxuICogQG1vZGVsKCdNeU1vZGVsJylcclxuICogY2xhc3MgTXlNb2RlbCBleHRlbmRzIE1vZGVsKHtcclxuICogICB3aWR0aDogdFByb3Aod2lkdGhUeXBlLCAxMCksXHJcbiAqICAgaGVpZ2h0OiB0UHJvcChoZWlnaHRUeXBlLCAxMClcclxuICogfSkge31cclxuICpcclxuICogY29uc3QgbSA9IG5ldyBNeU1vZGVsKHt9KVxyXG4gKiBjb25zdCB0eXBlID0gdHlwZXMubW9kZWw8dHlwZW9mIE1vZGVsPihtLmNvbnN0cnVjdG9yKVxyXG4gKiBjb25zdCBtb2RlbFR5cGVJbmZvID0gZ2V0VHlwZUluZm8odHlwZSkgYXMgTW9kZWxUeXBlSW5mb1xyXG4gKiBjb25zdCBwcm9wVHlwZUluZm8gPSBtb2RlbFR5cGVJbmZvLnByb3BzLndpZHRoLnR5cGVJbmZvIGFzIFRhZ1R5cGVJbmZvXHJcbiAqIGNvbnN0IGRpc3BsYXlOYW1lID0gcHJvcFR5cGVJbmZvLmRpc3BsYXlOYW1lXHJcbiAqIGBgYFxyXG4gKiBAdHlwZXBhcmFtIFQgQmFzZSB0eXBlLlxyXG4gKiBAcGFyYW0gYmFzZVR5cGUgQmFzZSB0eXBlLlxyXG4gKiBAdHlwZXBhcmFtIEEgVGFnIG9iamVjdC5cclxuICogQHBhcmFtIHRhZyBBYml0cmFyeSBvYmplY3QgdGhhdCBjYW4gYmUgcXVlcmllZCBhdCBydW50aW1lLlxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVzVGFnPFQgZXh0ZW5kcyBBbnlUeXBlLCBBPihiYXNlVHlwZTogVCwgdGFnOiBBLCB0eXBlTmFtZT86IHN0cmluZyk6IFQge1xyXG4gIGNvbnN0IHR5cGVJbmZvR2VuOiBUeXBlSW5mb0dlbiA9ICh0KSA9PlxyXG4gICAgbmV3IFRhZ1R5cGVJbmZvKHQsIHJlc29sdmVTdGFuZGFyZFR5cGUoYmFzZVR5cGUpLCB0YWcsIHR5cGVOYW1lKVxyXG5cclxuICByZXR1cm4gbGF0ZVR5cGVDaGVja2VyKCgpID0+IHtcclxuICAgIGNvbnN0IGJhc2VDaGVja2VyID0gcmVzb2x2ZVR5cGVDaGVja2VyKGJhc2VUeXBlKVxyXG5cclxuICAgIGNvbnN0IGdldFR5cGVOYW1lID0gKC4uLnJlY3Vyc2l2ZVR5cGVDaGVja2VyczogVHlwZUNoZWNrZXJbXSkgPT4ge1xyXG4gICAgICBjb25zdCBiYXNlVHlwZU5hbWUgPSBiYXNlQ2hlY2tlci5nZXRUeXBlTmFtZSguLi5yZWN1cnNpdmVUeXBlQ2hlY2tlcnMsIGJhc2VDaGVja2VyKVxyXG4gICAgICBjb25zdCB0YWdnZWROYW1lID0gdHlwZU5hbWUgfHwgXCJ0YWdnZWRcIlxyXG4gICAgICByZXR1cm4gYCR7dGFnZ2VkTmFtZX08JHtiYXNlVHlwZU5hbWV9PmBcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzVGM6IFR5cGVDaGVja2VyID0gbmV3IFR5cGVDaGVja2VyKFxyXG4gICAgICBiYXNlQ2hlY2tlci5iYXNlVHlwZSxcclxuICAgICAgYmFzZUNoZWNrZXIuY2hlY2ssXHJcbiAgICAgIGdldFR5cGVOYW1lLFxyXG4gICAgICB0eXBlSW5mb0dlbixcclxuICAgICAgKHNuKSA9PiBiYXNlQ2hlY2tlci5zbmFwc2hvdFR5cGUoc24pLFxyXG4gICAgICAoc24pID0+IGJhc2VDaGVja2VyLmZyb21TbmFwc2hvdFByb2Nlc3NvcihzbiksXHJcbiAgICAgIChzbikgPT4gYmFzZUNoZWNrZXIudG9TbmFwc2hvdFByb2Nlc3NvcihzbilcclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gdGhpc1RjXHJcbiAgfSwgdHlwZUluZm9HZW4pIGFzIGFueVxyXG59XHJcblxyXG4vKipcclxuICogYHR5cGVzLnRhZ2AgdHlwZSBpbmZvLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRhZ1R5cGVJbmZvPEE+IGV4dGVuZHMgVHlwZUluZm8ge1xyXG4gIGdldCBiYXNlVHlwZUluZm8oKTogVHlwZUluZm8ge1xyXG4gICAgcmV0dXJuIGdldFR5cGVJbmZvKHRoaXMuYmFzZVR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHRoaXNUeXBlOiBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgICByZWFkb25seSBiYXNlVHlwZTogQW55U3RhbmRhcmRUeXBlLFxyXG4gICAgcmVhZG9ubHkgdGFnOiBBLFxyXG4gICAgcmVhZG9ubHkgdHlwZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgc3VwZXIodGhpc1R5cGUpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEFycmF5VHlwZUluZm8sIHR5cGVzQXJyYXkgfSBmcm9tIFwiLi9hcnJheUJhc2VkL3R5cGVzQXJyYXlcIlxuaW1wb3J0IHsgVHVwbGVUeXBlSW5mbywgdHlwZXNUdXBsZSB9IGZyb20gXCIuL2FycmF5QmFzZWQvdHlwZXNUdXBsZVwiXG5pbXBvcnQgeyBBcnJheVNldFR5cGVJbmZvLCB0eXBlc0FycmF5U2V0IH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNBcnJheVNldFwiXG5pbXBvcnQgeyB0eXBlc0RhdGFNb2RlbERhdGEgfSBmcm9tIFwiLi9vYmplY3RCYXNlZC90eXBlc0RhdGFNb2RlbERhdGFcIlxuaW1wb3J0IHsgTW9kZWxUeXBlSW5mbywgTW9kZWxUeXBlSW5mb1Byb3BzLCB0eXBlc01vZGVsIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNNb2RlbFwiXG5pbXBvcnQge1xuICBGcm96ZW5UeXBlSW5mbyxcbiAgT2JqZWN0VHlwZUluZm8sXG4gIE9iamVjdFR5cGVJbmZvUHJvcHMsXG4gIHR5cGVzRnJvemVuLFxuICB0eXBlc09iamVjdCxcbn0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNPYmplY3RcIlxuaW1wb3J0IHsgT2JqZWN0TWFwVHlwZUluZm8sIHR5cGVzT2JqZWN0TWFwIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNPYmplY3RNYXBcIlxuaW1wb3J0IHsgUmVjb3JkVHlwZUluZm8sIHR5cGVzUmVjb3JkIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNSZWNvcmRcIlxuaW1wb3J0IHsgUmVmVHlwZUluZm8sIHR5cGVzUmVmIH0gZnJvbSBcIi4vb2JqZWN0QmFzZWQvdHlwZXNSZWZcIlxuaW1wb3J0IHsgdHlwZXNFbnVtIH0gZnJvbSBcIi4vcHJpbWl0aXZlQmFzZWQvdHlwZXNFbnVtXCJcbmltcG9ydCB7XG4gIEJvb2xlYW5UeXBlSW5mbyxcbiAgTGl0ZXJhbFR5cGVJbmZvLFxuICBOdW1iZXJUeXBlSW5mbyxcbiAgU3RyaW5nVHlwZUluZm8sXG4gIHR5cGVzQm9vbGVhbixcbiAgdHlwZXNMaXRlcmFsLFxuICB0eXBlc051bGwsXG4gIHR5cGVzTnVtYmVyLFxuICB0eXBlc1N0cmluZyxcbiAgdHlwZXNVbmRlZmluZWQsXG59IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUHJpbWl0aXZlXCJcbmltcG9ydCB7IHR5cGVzSW50ZWdlciwgdHlwZXNOb25FbXB0eVN0cmluZyB9IGZyb20gXCIuL3ByaW1pdGl2ZUJhc2VkL3R5cGVzUmVmaW5lZFByaW1pdGl2ZVwiXG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzXCJcbmltcG9ydCB7IHR5cGVzTWF5YmUsIHR5cGVzTWF5YmVOdWxsIH0gZnJvbSBcIi4vdXRpbGl0eS90eXBlc01heWJlXCJcbmltcG9ydCB7IE9yVHlwZUluZm8sIHR5cGVzT3IgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzT3JcIlxuaW1wb3J0IHsgUmVmaW5lbWVudFR5cGVJbmZvLCB0eXBlc1JlZmluZW1lbnQgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzUmVmaW5lbWVudFwiXG5pbXBvcnQgeyBUYWdUeXBlSW5mbywgdHlwZXNUYWcgfSBmcm9tIFwiLi91dGlsaXR5L3R5cGVzVGFnXCJcbmltcG9ydCB7IHR5cGVzVW5jaGVja2VkLCBVbmNoZWNrZWRUeXBlSW5mbyB9IGZyb20gXCIuL3V0aWxpdHkvdHlwZXNVbmNoZWNrZWRcIlxuZXhwb3J0IHsgZ2V0VHlwZUluZm8gfSBmcm9tIFwiLi9nZXRUeXBlSW5mb1wiXG5leHBvcnQgeyBUeXBlSW5mbyB9IGZyb20gXCIuL1R5cGVDaGVja2VyXCJcbmV4cG9ydCB0eXBlIHsgT2JqZWN0VHlwZUluZm9Qcm9wcywgTW9kZWxUeXBlSW5mb1Byb3BzIH1cbmV4cG9ydCB7XG4gIEJvb2xlYW5UeXBlSW5mbyxcbiAgTGl0ZXJhbFR5cGVJbmZvLFxuICBOdW1iZXJUeXBlSW5mbyxcbiAgU3RyaW5nVHlwZUluZm8sXG4gIEZyb3plblR5cGVJbmZvLFxuICBPYmplY3RNYXBUeXBlSW5mbyxcbiAgVGFnVHlwZUluZm8sXG4gIFJlZmluZW1lbnRUeXBlSW5mbyxcbiAgUmVjb3JkVHlwZUluZm8sXG4gIFJlZlR5cGVJbmZvLFxuICBVbmNoZWNrZWRUeXBlSW5mbyxcbiAgT2JqZWN0VHlwZUluZm8sXG4gIEFycmF5U2V0VHlwZUluZm8sXG4gIEFycmF5VHlwZUluZm8sXG4gIE1vZGVsVHlwZUluZm8sXG4gIE9yVHlwZUluZm8sXG4gIFR1cGxlVHlwZUluZm8sXG59XG5cbmV4cG9ydCBjb25zdCB0eXBlcyA9IHtcbiAgbGl0ZXJhbDogdHlwZXNMaXRlcmFsLFxuICB1bmRlZmluZWQ6IHR5cGVzVW5kZWZpbmVkLFxuICBudWxsOiB0eXBlc051bGwsXG4gIGJvb2xlYW46IHR5cGVzQm9vbGVhbixcbiAgbnVtYmVyOiB0eXBlc051bWJlcixcbiAgc3RyaW5nOiB0eXBlc1N0cmluZyxcbiAgb3I6IHR5cGVzT3IsXG4gIG1heWJlOiB0eXBlc01heWJlLFxuICBtYXliZU51bGw6IHR5cGVzTWF5YmVOdWxsLFxuICBhcnJheTogdHlwZXNBcnJheSxcbiAgcmVjb3JkOiB0eXBlc1JlY29yZCxcbiAgdW5jaGVja2VkOiB0eXBlc1VuY2hlY2tlZCxcbiAgbW9kZWw6IHR5cGVzTW9kZWwsXG4gIGRhdGFNb2RlbERhdGE6IHR5cGVzRGF0YU1vZGVsRGF0YSxcbiAgb2JqZWN0OiB0eXBlc09iamVjdCxcbiAgcmVmOiB0eXBlc1JlZixcbiAgZnJvemVuOiB0eXBlc0Zyb3plbixcbiAgZW51bTogdHlwZXNFbnVtLFxuICB0YWc6IHR5cGVzVGFnLFxuICByZWZpbmVtZW50OiB0eXBlc1JlZmluZW1lbnQsXG4gIGludGVnZXI6IHR5cGVzSW50ZWdlcixcbiAgbm9uRW1wdHlTdHJpbmc6IHR5cGVzTm9uRW1wdHlTdHJpbmcsXG4gIG9iamVjdE1hcDogdHlwZXNPYmplY3RNYXAsXG4gIGFycmF5U2V0OiB0eXBlc0FycmF5U2V0LFxuICB0dXBsZTogdHlwZXNUdXBsZSxcblxuICBtYXBBcnJheTxUIGV4dGVuZHMgQW55VHlwZT4odmFsdWVUeXBlOiBUKSB7XG4gICAgcmV0dXJuIHR5cGVzQXJyYXkodHlwZXNUdXBsZSh0eXBlc1N0cmluZywgdmFsdWVUeXBlKSlcbiAgfSxcbiAgc2V0QXJyYXk8VCBleHRlbmRzIEFueVR5cGU+KHZhbHVlVHlwZTogVCkge1xuICAgIHJldHVybiB0eXBlc0FycmF5KHZhbHVlVHlwZSlcbiAgfSxcbiAgbWFwT2JqZWN0PFQgZXh0ZW5kcyBBbnlUeXBlPih2YWx1ZVR5cGU6IFQpIHtcbiAgICByZXR1cm4gdHlwZXNSZWNvcmQodmFsdWVUeXBlKVxuICB9LFxuICBkYXRlU3RyaW5nOiB0eXBlc05vbkVtcHR5U3RyaW5nLFxuICBkYXRlVGltZXN0YW1wOiB0eXBlc0ludGVnZXIsXG59XG4iXSwibmFtZXMiOlsiQnVpbHRJbkFjdGlvbiIsIkFjdGlvbkNvbnRleHRBY3Rpb25UeXBlIiwiQWN0aW9uQ29udGV4dEFzeW5jU3RlcFR5cGUiLCJpc09ic2VydmFibGVNYXAiLCJpc09ic2VydmFibGVTZXQiLCJpc09ic2VydmFibGVBcnJheSIsImlzT2JzZXJ2YWJsZU9iamVjdCIsIm1vYngiLCJuYW1lc3BhY2UiLCJjcmVhdGVBdG9tIiwicnVubmluZ1dpdGhvdXRTbmFwc2hvdE9yUGF0Y2hlcyIsInN0YW5kYXJkVHlwZVJlc29sdmVycyIsImFjdGlvbiIsIk1vZGVsQXV0b1R5cGVDaGVja2luZ01vZGUiLCJIb29rQWN0aW9uIiwib2JzZXJ2YWJsZSIsIldhbGtUcmVlTW9kZSIsImNvbXB1dGVkIiwiaXNBY3Rpb24iLCJGcm96ZW5DaGVja01vZGUiLCJyZWFjdGlvbiIsImlzT2JzZXJ2YWJsZSIsInRvSlMiLCJmYXN0RGVlcEVxdWFsIiwib2JzZXJ2YWJsZU9wdGlvbnMiLCJpbnRlcmNlcHQiLCJvYnNlcnZlIiwiQWN0aW9uVHJhY2tpbmdSZXN1bHQiLCJpbnRlcm5hbE1vZGVsIiwiVW5kb0V2ZW50VHlwZSIsIlVuZG9TdG9yZSIsIndoZW4iLCJucyIsInJlbW92ZSIsInZhbHVlcyIsIkFycmF5U2V0IiwiZ2V0IiwiaGFzIiwia2V5cyIsImVudHJpZXMiLCJPYmplY3RNYXAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxRQUFNLDhDQUE4Qjs4QkFXRDtXQUMxQix3QkFBd0IsSUFBSSxjQUFjO0FBQUEsRUFDbkQ7OEJBTUUsZ0JBQ0EsYUFDQTs0QkFFd0IsSUFBSSxnQkFBZ0I7QUFBQSxNQUMxQztBQUFBLE1BQ0E7QUFBQSxLQUNEO0FBQUEsRUFDSDs7WUMzQlk7Ozs7Ozs7RUF5QlosR0F6QllBO0FBMkJaLFFBQU0sc0JBQTJDLElBQUksSUFBSSxPQUFPLE9BQU9BLHNCQUFhLENBQUM7MkJBV3JEO1dBQ3ZCLG9CQUFvQixJQUFJLFVBQVU7QUFBQSxFQUMzQzs7WUNTWTs7O0VBR1osR0FIWUM7O1lBUUE7Ozs7OztFQXFCWixHQXJCWUM7QUF1QlosTUFBSTs7V0FRSztBQUFBLEVBQ1Q7bUNBU3dDOzJCQUNmO0FBQUEsRUFDekI7UUNwR2Esb0JBQW9CLE9BQU8sYUFBYTt5QkFRdkI7V0FDckIsT0FBTyxPQUFPLGNBQWMscUJBQXFCO0FBQUEsRUFDMUQ7UUNWYSxlQUFlO1FBS2YsYUFBYTs4QkFTUztXQUcxQixRQUFRO0FBQUEsRUFDakI7UUNOYSwwQkFBMEI7SUFDckMsWUFBWTtZQUNKLEdBQUc7YUFHRixlQUFlLE1BQU0sa0JBQWtCLFNBQVM7QUFBQTs7bUJBT25DO1dBQ2YsSUFBSSxrQkFBa0IsR0FBRztBQUFBLEVBQ2xDO0FBRUEsUUFBTSwrQkFBbUQ7QUFBQSxJQUN2RCxZQUFZO0FBQUEsSUFDWixVQUFVO0FBQUEsSUFDVixjQUFjO0FBQUEsSUFDZCxPQUFPO0FBQUE7eUJBTXFCLFFBQWEsVUFB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
|