breeze-client 2.1.5 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -1
  2. package/breeze-client.metadata.json +1 -1
  3. package/bundles/breeze-client-adapter-data-service-odata.umd.js +4 -0
  4. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +1 -1
  5. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +1 -1
  6. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +1 -1
  7. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +8 -1
  8. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +1 -1
  9. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +1 -1
  10. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +1 -1
  11. package/bundles/breeze-client.umd.js +103 -20
  12. package/bundles/breeze-client.umd.js.map +1 -1
  13. package/bundles/breeze-client.umd.min.js +1 -1
  14. package/bundles/breeze-client.umd.min.js.map +1 -1
  15. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +5 -1
  16. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +9 -2
  17. package/esm2015/src/abstract-data-service-adapter.js +1 -1
  18. package/esm2015/src/core.js +14 -9
  19. package/esm2015/src/data-type.js +60 -1
  20. package/esm2015/src/entity-action.js +1 -1
  21. package/esm2015/src/entity-aspect.js +6 -8
  22. package/esm2015/src/entity-manager.js +1 -1
  23. package/esm2015/src/entity-metadata.js +1 -1
  24. package/esm2015/src/entity-query.js +1 -1
  25. package/esm2015/src/entity-state.js +9 -1
  26. package/esm2015/src/enum.js +1 -1
  27. package/esm2015/src/key-generator.js +1 -1
  28. package/esm2015/src/mapping-context.js +9 -3
  29. package/esm2015/src/predicate.js +12 -5
  30. package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +5 -1
  31. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +9 -2
  32. package/esm5/src/abstract-data-service-adapter.js +1 -1
  33. package/esm5/src/core.js +13 -8
  34. package/esm5/src/data-type.js +60 -1
  35. package/esm5/src/entity-action.js +1 -1
  36. package/esm5/src/entity-aspect.js +6 -8
  37. package/esm5/src/entity-manager.js +1 -1
  38. package/esm5/src/entity-metadata.js +1 -1
  39. package/esm5/src/entity-query.js +1 -1
  40. package/esm5/src/entity-state.js +9 -1
  41. package/esm5/src/enum.js +1 -1
  42. package/esm5/src/key-generator.js +1 -1
  43. package/esm5/src/mapping-context.js +9 -3
  44. package/esm5/src/predicate.js +12 -5
  45. package/fesm2015/breeze-client-adapter-data-service-odata.js +4 -0
  46. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +1 -1
  47. package/fesm2015/breeze-client-adapter-data-service-webapi.js +9 -2
  48. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +1 -1
  49. package/fesm2015/breeze-client.js +104 -21
  50. package/fesm2015/breeze-client.js.map +1 -1
  51. package/fesm5/breeze-client-adapter-data-service-odata.js +4 -0
  52. package/fesm5/breeze-client-adapter-data-service-odata.js.map +1 -1
  53. package/fesm5/breeze-client-adapter-data-service-webapi.js +9 -2
  54. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +1 -1
  55. package/fesm5/breeze-client.js +103 -20
  56. package/fesm5/breeze-client.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/abstract-data-service-adapter.d.ts +0 -1
  59. package/src/data-type.d.ts +5 -0
  60. package/src/entity-aspect.d.ts +5 -5
  61. package/src/entity-manager.d.ts +4 -4
  62. package/src/entity-metadata.d.ts +37 -27
  63. package/src/entity-state.d.ts +4 -0
  64. package/src/mapping-context.d.ts +1 -1
  65. package/src/predicate.d.ts +4 -7
@@ -2109,4 +2109,4 @@ function coHasOriginalValues(co) {
2109
2109
  function getSerializerFn(stype) {
2110
2110
  return stype.serializerFn || (stype.metadataStore && stype.metadataStore.serializerFn);
2111
2111
  }
2112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL2VudGl0eS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxJQUFJLEVBQTJCLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQXFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQWUsWUFBWSxFQUFzQixvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25JLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFB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R0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDL0I7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsRUFBaUI7SUFDNUMseURBQXlEO0lBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEUsZ0RBQWdEO0lBQ2hELE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ3ZELE9BQU8sbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBQStCO0lBQ3RELE9BQU8sS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNlcnZpY2VBZGFwdGVyIH0gZnJvbSAnLi9pbnRlcmZhY2UtcmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb3JlLCBDYWxsYmFjaywgRXJyb3JDYWxsYmFjayB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IGFzc2VydFBhcmFtLCBhc3NlcnRDb25maWcgfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgQnJlZXplRXZlbnQgfSBmcm9tICcuL2V2ZW50JztcclxuaW1wb3J0IHsgRW50aXR5QXNwZWN0LCBFbnRpdHksIENvbXBsZXhPYmplY3QsIFN0cnVjdHVyYWxPYmplY3QsIFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncyB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IE1ldGFkYXRhU3RvcmUsIEVudGl0eVR5cGUsIENvbXBsZXhUeXBlLCBEYXRhUHJvcGVydHksIE5hdmlnYXRpb25Qcm9wZXJ0eSwgQXV0b0dlbmVyYXRlZEtleVR5cGUgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eUtleSB9IGZyb20gJy4vZW50aXR5LWtleSc7XHJcbmltcG9ydCB7IEVudGl0eUFjdGlvbiAgfSBmcm9tICcuL2VudGl0eS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBFbnRpdHlTdGF0ZSB9IGZyb20gJy4vZW50aXR5LXN0YXRlJztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuL2RhdGEtc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL3ZhbGlkYXRlJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk9wdGlvbnMgfSBmcm9tICcuL3ZhbGlkYXRpb24tb3B0aW9ucyc7XHJcbmltcG9ydCB7IFF1ZXJ5T3B0aW9ucywgTWVyZ2VTdHJhdGVneSwgRmV0Y2hTdHJhdGVneSB9IGZyb20gJy4vcXVlcnktb3B0aW9ucyc7XHJcbmltcG9ydCB7IFNhdmVPcHRpb25zIH0gZnJvbSAnLi9zYXZlLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBLZXlHZW5lcmF0b3IgfSBmcm9tICcuL2tleS1nZW5lcmF0b3InO1xyXG5pbXBvcnQgeyBFbnRpdHlHcm91cCB9IGZyb20gJy4vZW50aXR5LWdyb3VwJztcclxuaW1wb3J0IHsgTWFwcGluZ0NvbnRleHQgfSBmcm9tICcuL21hcHBpbmctY29udGV4dCc7XHJcbmltcG9ydCB7IEVudGl0eVF1ZXJ5IH0gZnJvbSAnLi9lbnRpdHktcXVlcnknO1xyXG5pbXBvcnQgeyBVbmF0dGFjaGVkQ2hpbGRyZW5NYXAgfSBmcm9tICcuL3VuYXR0YWNoZWQtY2hpbGRyZW4tbWFwJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSHR0cFJlc3BvbnNlIHtcclxuICBjb25maWc6IGFueTtcclxuICBkYXRhOiBhbnk7XHJcbiAgZXJyb3I/OiBhbnk7XHJcbiAgc2F2ZUNvbnRleHQ/OiBhbnk7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbiAgZ2V0SGVhZGVycyhoZWFkZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0UmVzdWx0IHtcclxuICBlbnRpdGllczogRW50aXR5W107XHJcbiAgdGVtcEtleU1hcHBpbmc6IElUZW1wS2V5TWFwO1xyXG59XHJcblxyXG4vLyBzdWJjbGFzc2VzIG9mIEVycm9yXHJcblxyXG4vKiogQmFzZSBzaGFwZSBvZiBhbnkgZXJyb3JzIHJldHVybmVkIGZyb20gdGhlIHNlcnZlci4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZTtcclxuICBzdGF0dXM6IG51bWJlcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgc3RhdHVzVGV4dD86IHN0cmluZztcclxuICBib2R5PzogYW55O1xyXG4gIHVybD86IHN0cmluZztcclxufVxyXG5cclxuLyoqIFNoYXBlIG9mIGEgc2F2ZSBlcnJvciByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuIFxyXG5Gb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gQGludGVybmFsIFxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVFcnJvckZyb21TZXJ2ZXIgZXh0ZW5kcyBTZXJ2ZXJFcnJvciB7XHJcbiAgZW50aXR5RXJyb3JzOiBFbnRpdHlFcnJvckZyb21TZXJ2ZXJbXTtcclxufVxyXG5cclxuLyoqIFNoYXBlIG9mIGEgc2F2ZSBlcnJvciB3aGVuIHJldHVybmVkIHRvIHRoZSBjbGllbnQuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUVycm9yIGV4dGVuZHMgU2VydmVyRXJyb3Ige1xyXG4gIGVudGl0eUVycm9yczogRW50aXR5RXJyb3JbXTtcclxufVxyXG5cclxuLy8gbm90IHN1YmNsYXNzZXMgb2YgRXJyb3JcclxuLyoqIFxyXG5Gb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gQGludGVybmFsIFxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUVycm9yRnJvbVNlcnZlciB7XHJcbiAgZW50aXR5VHlwZU5hbWU6IHN0cmluZztcclxuICBrZXlWYWx1ZXM6IGFueVtdO1xyXG5cclxuICBlcnJvck5hbWU6IHN0cmluZztcclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcclxuICBjdXN0b20/OiBhbnk7XHJcbn1cclxuXHJcbi8qKiBTaGFwZSBvZiBhbiBlcnJvciBvbiBhIHNwZWNpZmljIGVudGl0eS4gIFBhcnQgb2YgYSBbW0lTYXZlRXJyb3JdXSAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUVycm9yIHtcclxuICBlbnRpdHk6IEVudGl0eTtcclxuICBlcnJvck5hbWU6IHN0cmluZztcclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcclxuICBpc1NlcnZlckVycm9yOiBib29sZWFuO1xyXG4gIGN1c3RvbT86IGFueTtcclxufVxyXG5cclxuLyoqIFRoZSBzaGFwZSBvZiB0aGUgUHJvbWlzZSByZXR1cm5lZCBieSBhbiBbW0VudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5XV0gY2FsbC4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBRdWVyeVJlc3VsdCB7XHJcbiAgLyoqIFRvcCBsZXZlbCBlbnRpdGllcyByZXR1cm5lZCAqL1xyXG4gIHJlc3VsdHM6IGFueVtdO1xyXG4gIC8qKiBRdWVyeSB0aGF0IHdhcyBleGVjdXRlZCAqL1xyXG4gIHF1ZXJ5OiBFbnRpdHlRdWVyeSB8IHN0cmluZztcclxuICAvKiogRW50aXR5TWFuYWdlciB0aGF0IGV4ZWN1dGVkIHRoZSBxdWVyeSAqL1xyXG4gIGVudGl0eU1hbmFnZXI/OiBFbnRpdHlNYW5hZ2VyO1xyXG4gIC8qKiBUb3RhbCBudW1iZXIgb2YgcmVzdWx0cyBhdmFpbGFibGUgb24gdGhlIHNlcnZlciAqL1xyXG4gIGlubGluZUNvdW50PzogbnVtYmVyO1xyXG4gIC8qKiBBbGwgZW50aXRpZXMgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5LiAgRGlmZmVycyBmcm9tIHJlc3VsdHMgd2hlbiBhbiBleHBhbmQgaXMgdXNlZC4gKi9cclxuICByZXRyaWV2ZWRFbnRpdGllcz86IEVudGl0eVtdO1xyXG4gICAgLyoqIFJhdyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgKi9cclxuICBodHRwUmVzcG9uc2U/OiBIdHRwUmVzcG9uc2U7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlTdWNjZXNzQ2FsbGJhY2sge1xyXG4gIChkYXRhOiBRdWVyeVJlc3VsdCk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlFcnJvckNhbGxiYWNrIHtcclxuICAoZXJyb3I6IHsgcXVlcnk6IEVudGl0eVF1ZXJ5OyBodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZTsgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcjsgbWVzc2FnZT86IHN0cmluZzsgc3RhY2s/OiBzdHJpbmcgfSk6IHZvaWQ7XHJcbn1cclxuXHJcbi8qKiBLZXkgbWFwcGluZyBpbmZvcm1hdGlvbiByZXR1cm5lZCBhcyBwYXJ0IG9mIGFuIFtbSVNhdmVSZXN1bHRdXS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBLZXlNYXBwaW5nIHtcclxuICBlbnRpdHlUeXBlTmFtZTogc3RyaW5nO1xyXG4gIHRlbXBWYWx1ZTogYW55O1xyXG4gIHJlYWxWYWx1ZTogYW55O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVRlbXBLZXlNYXAge1xyXG4gIFtpbmRleDogc3RyaW5nXTogRW50aXR5S2V5O1xyXG59XHJcblxyXG4vKiogQ29uZmlndXJhdGlvbiBpbmZvIHRvIGJlIHBhc3NlZCB0byB0aGUgW1tFbnRpdHlNYW5hZ2VyLmltcG9ydEVudGl0aWVzXV0gbWV0aG9kICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0Q29uZmlnIHtcclxuICAvKiogSWYgdHJ1ZSwgbWVyZ2UgQWRkZWQgZW50aXRpZXMgKHdpdGggdGVtcCBrZXlzKSBhcyB3ZWxsLiAgVGhpcyBjYW4gYmUgZGFuZ2Vyb3VzLiAqL1xyXG4gIG1lcmdlQWRkcz86IGJvb2xlYW47XHJcbiAgbWVyZ2VTdHJhdGVneT86IE1lcmdlU3RyYXRlZ3k7ICBcclxuICBtZXRhZGF0YVZlcnNpb25Gbj86IChhcmc6IHsgbWV0YWRhdGFWZXJzaW9uOiBhbnksIG1ldGFkYXRhU3RvcmVOYW1lOiBhbnkgfSkgPT4gdm9pZDtcclxufVxyXG5cclxuaW50ZXJmYWNlIEltcG9ydENvbmZpZ0V4dCBleHRlbmRzIEltcG9ydENvbmZpZyB7XHJcbiAgdGVtcEtleU1hcD86IElUZW1wS2V5TWFwO1xyXG59XHJcblxyXG4vKiogVGhlIHNoYXBlIG9mIHRoZSBQcm9taXNlIHJldHVybmVkIGJ5IGFuIFtbRW50aXR5TWFuYWdlci5zYXZlQ2hhbmdlc11dIGNhbGwuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZVJlc3VsdCB7XHJcbiAgZW50aXRpZXM6IEVudGl0eVtdO1xyXG4gIGtleU1hcHBpbmdzOiBLZXlNYXBwaW5nW107XHJcbiAgZGVsZXRlZEtleXM/OiB7IGVudGl0eVR5cGVOYW1lOiBzdHJpbmcsIGtleVZhbHVlczogYW55W119W107XHJcbiAgaHR0cFJlc3BvbnNlPzogSHR0cFJlc3BvbnNlO1xyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbi4gXHJcbkBhZGFwdGVyIChzZWUgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVDb250ZXh0IHtcclxuICBlbnRpdHlNYW5hZ2VyOiBFbnRpdHlNYW5hZ2VyO1xyXG4gIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcclxuICBwcm9jZXNzU2F2ZWRFbnRpdGllczogKHNhdmVSZXN1bHQ6IFNhdmVSZXN1bHQpID0+IEVudGl0eVtdO1xyXG4gIHJlc291cmNlTmFtZTogc3RyaW5nO1xyXG4gIGFkYXB0ZXI/OiBEYXRhU2VydmljZUFkYXB0ZXI7XHJcbiAgcm91dGVQcmVmaXg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gXHJcbiovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUJ1bmRsZSB7XHJcbiAgZW50aXRpZXM6IEVudGl0eVtdO1xyXG4gIHNhdmVPcHRpb25zOiBTYXZlT3B0aW9ucztcclxufVxyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gaW5mbyB0byBiZSBwYXNzZWQgdG8gdGhlIFtbRW50aXR5TWFuYWdlcl1dIGNvbnN0cnVjdG9yICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5TWFuYWdlckNvbmZpZyB7XHJcbiAgLyoqIFRoZSBzZXJ2aWNlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gICoqL1xyXG4gIHNlcnZpY2VOYW1lPzogc3RyaW5nO1xyXG4gIC8qKiBUaGUgRGF0YVNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gKiovXHJcbiAgZGF0YVNlcnZpY2U/OiBEYXRhU2VydmljZTtcclxuICAvKiogVGhlIFtbUXVlcnlPcHRpb25zXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gICoqL1xyXG4gIHF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9ucztcclxuICAvKiogVGhlIFtbU2F2ZU9wdGlvbnNdXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiAqKi9cclxuICBzYXZlT3B0aW9ucz86IFNhdmVPcHRpb25zO1xyXG4gIC8qKiBUaGUgW1tWYWxpZGF0aW9uT3B0aW9uc11dIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuICAqKi9cclxuICB2YWxpZGF0aW9uT3B0aW9ucz86IFZhbGlkYXRpb25PcHRpb25zO1xyXG4gIC8qKiBUaGUgW1tLZXlHZW5lcmF0b3JdXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiAqKi9cclxuICBrZXlHZW5lcmF0b3I/OiBLZXlHZW5lcmF0b3I7XHJcbiAgLyoqIFRoZSBbW0tleUdlbmVyYXRvcl1dIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuICoqL1xyXG4gIGtleUdlbmVyYXRvckN0b3I/OiB7IG5ldyAoKTogS2V5R2VuZXJhdG9yIH07IC8vIFRPRE86IHJldmlldyB0aGlzXHJcbiAgLyoqIFRoZSBbW01ldGFkYXRhU3RvcmVdXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiAqKi9cclxuICBtZXRhZGF0YVN0b3JlPzogTWV0YWRhdGFTdG9yZTtcclxufVxyXG5cclxuLyoqIFRoZSBzaGFwZSByZXR1cm5lZCBieSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIFtbRW50aXR5TWFuYWdlci5lbnRpdHlDaGFuZ2VkXV0gZXZlbnQgKi9cclxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlDaGFuZ2VkRXZlbnRBcmdzIHtcclxuICBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbjtcclxuICBlbnRpdHk/OiBFbnRpdHk7XHJcbiAgYXJncz86IFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uRXJyb3JzQ2hhbmdlZEV2ZW50QXJncyB7XHJcbiAgZW50aXR5OiBFbnRpdHk7IFxyXG4gIGFkZGVkOiBWYWxpZGF0aW9uRXJyb3JbXTsgXHJcbiAgcmVtb3ZlZDogVmFsaWRhdGlvbkVycm9yW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSGFzQ2hhbmdlc0NoYW5nZWRFdmVudEFyZ3Mge1xyXG4gIGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXI7IFxyXG4gIGhhc0NoYW5nZXM6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG5JbnN0YW5jZXMgb2YgdGhlIEVudGl0eU1hbmFnZXIgY29udGFpbiBhbmQgbWFuYWdlIGNvbGxlY3Rpb25zIG9mIGVudGl0aWVzLCBlaXRoZXIgcmV0cmlldmVkIGZyb20gYSBiYWNrZW5kIGRhdGFzdG9yZSBvciBjcmVhdGVkIG9uIHRoZSBjbGllbnQuXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5TWFuYWdlciB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBhY3R1YWxseSBkZWZpbmVkIG9uIHByb3RvdHlwZVxyXG5cclxuICAvKiogVGhlIHNlcnZpY2UgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiBfX1JlYWQgT25seV9fICoqL1xyXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBEYXRhU2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiBfX1JlYWQgT25seV9fICoqL1xyXG4gIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcclxuICAvKiogVGhlIFtbUXVlcnlPcHRpb25zXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBxdWVyeU9wdGlvbnM6IFF1ZXJ5T3B0aW9ucztcclxuICAvKiogVGhlIFtbU2F2ZU9wdGlvbnNdXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiBfX1JlYWQgT25seV9fICoqL1xyXG4gIHNhdmVPcHRpb25zOiBTYXZlT3B0aW9ucztcclxuICAvKiogVGhlIFtbVmFsaWRhdGlvbk9wdGlvbnNdXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiBfX1JlYWQgT25seV9fICoqL1xyXG4gIHZhbGlkYXRpb25PcHRpb25zOiBWYWxpZGF0aW9uT3B0aW9ucztcclxuICAvKiogVGhlIFtbS2V5R2VuZXJhdG9yXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvcjtcclxuICAvKiogVGhlIFtbS2V5R2VuZXJhdG9yXV0gY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBrZXlHZW5lcmF0b3JDdG9yOiB7IG5ldyAoKTogS2V5R2VuZXJhdG9yIH07IC8vIFRPRE86IHJldmlldyB0aGlzXHJcbiAgLyoqIFRoZSBbW01ldGFkYXRhU3RvcmVdXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiBfX1JlYWQgT25seV9fICoqL1xyXG4gIG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmU7XHJcbiAgaXNMb2FkaW5nOiBib29sZWFuO1xyXG4gIGlzUmVqZWN0aW5nQ2hhbmdlczogYm9vbGVhbjtcclxuXHJcbiAgLy8gZXZlbnRzXHJcbiAgLyoqXHJcbiAgQSBbW0JyZWV6ZUV2ZW50XV0gdGhhdCBmaXJlcyB3aGVuZXZlciBhIGNoYW5nZSB0byBhbnkgZW50aXR5IGluIHRoaXMgRW50aXR5TWFuYWdlciBvY2N1cnMuIF9fUmVhZCBPbmx5X19cclxuXHJcbiAgQGV2ZW50QXJncyAtIFxyXG4gIC0gZW50aXR5QWN0aW9uIC0gVGhlIFtbRW50aXR5QWN0aW9uXV0gdGhhdCBvY2N1cmVkLlxyXG4gIC0gZW50aXR5IC0gVGhlIGVudGl0eSB0aGF0IGNoYW5nZWQuICBJZiB0aGlzIGlzIG51bGwsIHRoZW4gYWxsIGVudGl0aWVzIGluIHRoZSBlbnRpdHlNYW5hZ2VyIHdlcmUgYWZmZWN0ZWQuXHJcbiAgLSBhcmdzIC0gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV2ZW50LiBUaGlzIHdpbGwgZGlmZmVyIGJhc2VkIG9uIHRoZSBlbnRpdHlBY3Rpb24uXHJcblxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcigge3NlcnZpY2VOYW1lOiBcImJyZWV6ZS9Ob3J0aHdpbmRJQk1vZGVsXCIgfSk7XHJcbiAgPiAgICAgIGVtLmVudGl0eUNoYW5nZWQuc3Vic2NyaWJlKGZ1bmN0aW9uKGNoYW5nZUFyZ3MpIHtcclxuICA+ICAgICAgICAgIC8vIFRoaXMgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIGFueSB0aW1lIGFueSBlbnRpdHkgd2l0aGluIHRoZSBlbnRpdHlNYW5hZ2VyIFxyXG4gID4gICAgICAgICAgLy8gaXMgYWRkZWQsIG1vZGlmaWVkLCBkZWxldGVkIG9yIGRldGFjaGVkIGZvciBhbnkgcmVhc29uLlxyXG4gID4gICAgICAgICAgbGV0IGFjdGlvbiA9IGNoYW5nZUFyZ3MuZW50aXR5QWN0aW9uO1xyXG4gID4gICAgICAgICAgbGV0IGVudGl0eSA9IGNoYW5nZUFyZ3MuZW50aXR5O1xyXG4gID4gICAgICAgICAgLy8gLi4gZG8gc29tZXRoaW5nIHRvIHRoaXMgZW50aXR5IHdoZW4gaXQgaXMgY2hhbmdlZC5cclxuICA+ICAgICAgfSk7XHJcbiAgPiAgfSk7XHJcbiAgQGV2ZW50XHJcbiAgKiovXHJcbiAgZW50aXR5Q2hhbmdlZDogQnJlZXplRXZlbnQ8RW50aXR5Q2hhbmdlZEV2ZW50QXJncz47XHJcblxyXG4gIC8qKlxyXG4gIEFuIFtbQnJlZXplRXZlbnRdXSB0aGF0IGZpcmVzIHdoZW5ldmVyIHZhbGlkYXRpb25FcnJvcnMgY2hhbmdlIGZvciBhbnkgZW50aXR5IGluIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfX1xyXG4gIEBldmVudEFyZ3MgLVxyXG4gICAgLSBlbnRpdHkgLSBUaGUgZW50aXR5IG9uIHdoaWNoIHRoZSB2YWxpZGF0aW9uIGVycm9ycyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC5cclxuICAgIC0gYWRkZWQgLSBBbiBhcnJheSBjb250YWluaW5nIGFueSBuZXdseSBhZGRlZCBbW1ZhbGlkYXRpb25FcnJvcl1dc1xyXG4gICAgLSByZW1vdmVkIC0gQW4gYXJyYXkgY29udGFpbmluZyBhbnkgbmV3bHkgcmVtb3ZlZCBbW1ZhbGlkYXRpb25FcnJvcl1dcy4gVGhpcyBpcyB0aG9zZSBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gJ2ZpeGVkJyAgXHJcblxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcigge3NlcnZpY2VOYW1lOiBcImJyZWV6ZS9Ob3J0aHdpbmRJQk1vZGVsXCIgfSk7XHJcbiAgPiAgICAgIGVtLnZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkLnN1YnNjcmliZShmdW5jdGlvbihjaGFuZ2VBcmdzKSB7XHJcbiAgPiAgICAgICAgICAgICAgLy8gVGhpcyBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQgYW55IHRpbWUgYW55IGVudGl0eSB3aXRoaW4gdGhlIGVudGl0eU1hbmFnZXIgZXhwZXJpZW5jZXMgYSBjaGFuZ2UgdG8gaXRzIHZhbGlkYXRpb25FcnJvcnMgY29sbGVjdGlvbi5cclxuICA+ICAgICAgICAgICAgICBmdW5jdGlvbiAodmFsaWRhdGlvbkNoYW5nZUFyZ3MpIHtcclxuICA+ICAgICAgICAgICAgICAgICAgbGV0IGVudGl0eSA9PSB2YWxpZGF0aW9uQ2hhbmdlQXJncy5lbnRpdHk7XHJcbiAgPiAgICAgICAgICAgICAgICAgIGxldCBlcnJvcnNBZGRlZCA9IHZhbGlkYXRpb25DaGFuZ2VBcmdzLmFkZGVkO1xyXG4gID4gICAgICAgICAgICAgICAgICBsZXQgZXJyb3JzQ2xlYXJlZCA9IHZhbGlkYXRpb25DaGFuZ2VBcmdzLnJlbW92ZWQ7XHJcbiAgPiAgICAgICAgICAgICAgICAgIC8vIC4uLiBkbyBzb21ldGhpbmcgaW50ZXJlc3Rpbmcgd2l0aCB0aGUgb3JkZXIuXHJcbiAgPiAgICAgICAgICAgICAgfSk7XHJcbiAgPiAgICAgICAgICB9KTtcclxuICA+ICAgICAgfSk7XHJcbiAgQGV2ZW50XHJcbiAgKiovXHJcbiAgdmFsaWRhdGlvbkVycm9yc0NoYW5nZWQ6IEJyZWV6ZUV2ZW50PFZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkRXZlbnRBcmdzPjtcclxuXHJcbiAgLyoqXHJcbiAgQSBbW0JyZWV6ZUV2ZW50XV0gdGhhdCBmaXJlcyB3aGVuZXZlciBhbiBFbnRpdHlNYW5hZ2VyIHRyYW5zaXRpb25zIHRvIG9yIGZyb20gaGF2aW5nIGNoYW5nZXMuIF9fUmVhZCBPbmx5X19cclxuICBAZXZlbnRBcmdzIC1cclxuICAgIC0gZW50aXR5TWFuYWdlciAtIFRoZSBFbnRpdHlNYW5hZ2VyIHdob3NlICdoYXNDaGFuZ2VzJyBzdGF0dXMgaGFzIGNoYW5nZWQuXHJcbiAgICAtIGhhc0NoYW5nZXMgLSBXaGV0aGVyIG9yIG5vdCB0aGlzIEVudGl0eU1hbmFnZXIgaGFzIGNoYW5nZXMuXHJcblxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcigge3NlcnZpY2VOYW1lOiBcImJyZWV6ZS9Ob3J0aHdpbmRJQk1vZGVsXCIgfSk7XHJcbiAgPiAgICAgIGVtLmhhc0NoYW5nZXNDaGFuZ2VkLnN1YnNjcmliZShmdW5jdGlvbihhcmdzKSB7XHJcbiAgPiAgICAgICAgICAgICAgbGV0IGhhc0NoYW5nZXNDaGFuZ2VkID0gYXJncy5oYXNDaGFuZ2VzO1xyXG4gID4gICAgICAgICAgICAgIGxldCBlbnRpdHlNYW5hZ2VyID0gYXJncy5lbnRpdHlNYW5hZ2VyO1xyXG4gID4gICAgICAgICAgfSk7XHJcbiAgPiAgICAgIH0pO1xyXG4gIEBldmVudCBcclxuICAqKi9cclxuICBoYXNDaGFuZ2VzQ2hhbmdlZDogQnJlZXplRXZlbnQ8SGFzQ2hhbmdlc0NoYW5nZWRFdmVudEFyZ3M+O1xyXG5cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3BlbmRpbmdQdWJzPzogYW55W107IC8vIFRPRE86IHJlZmluZSBsYXRlclxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9oYXNDaGFuZ2VzQWN0aW9uPzogKCgpID0+IGJvb2xlYW4pOyAvLyBUT0RPIHJlZmluZSBsYXRlclxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9oYXNDaGFuZ2VzOiBib29sZWFuO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9lbnRpdHlHcm91cE1hcDogeyBbaW5kZXg6IHN0cmluZ106IEVudGl0eUdyb3VwIH07XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3VuYXR0YWNoZWRDaGlsZHJlbk1hcDogVW5hdHRhY2hlZENoaWxkcmVuTWFwO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9pbktleUZpeHVwOiBib29sZWFuO1xyXG5cclxuICBoZWxwZXIgPSB7XHJcbiAgICB1bndyYXBJbnN0YW5jZTogdW53cmFwSW5zdGFuY2UsXHJcbiAgICB1bndyYXBPcmlnaW5hbFZhbHVlczogdW53cmFwT3JpZ2luYWxWYWx1ZXMsXHJcbiAgICB1bndyYXBDaGFuZ2VkVmFsdWVzOiB1bndyYXBDaGFuZ2VkVmFsdWVzXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgRW50aXR5TWFuYWdlciBjb25zdHJ1Y3Rvci5cclxuXHJcbiAgQXQgaXRzIG1vc3QgYmFzaWMgYW4gRW50aXR5TWFuYWdlciBjYW4gYmUgY29uc3RydWN0ZWQgd2l0aCBqdXN0IGEgc2VydmljZSBuYW1lXHJcbiAgPiAgICAgbGV0IGVudGl0eU1hbmFnZXIgPSBuZXcgRW50aXR5TWFuYWdlciggXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiKTtcclxuXHJcbiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIGl0IHdpdGggdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9iamVjdFxyXG4gID4gICAgIGxldCBlbnRpdHlNYW5hZ2VyID0gbmV3IEVudGl0eU1hbmFnZXIoIHtzZXJ2aWNlTmFtZTogXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiIH0pO1xyXG5cclxuICBVc3VhbGx5IGhvd2V2ZXIsIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB3aWxsIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgdGhlICdzZXJ2aWNlTmFtZSc7XHJcbiAgPiAgICAgbGV0IG1ldGFkYXRhU3RvcmUgPSBuZXcgTWV0YWRhdGFTdG9yZSgpO1xyXG4gID4gICAgIGxldCBlbnRpdHlNYW5hZ2VyID0gbmV3IEVudGl0eU1hbmFnZXIoIHtcclxuICA+ICAgICAgIHNlcnZpY2VOYW1lOiBcImJyZWV6ZS9Ob3J0aHdpbmRJQk1vZGVsXCIsXHJcbiAgPiAgICAgICBtZXRhZGF0YVN0b3JlOiBtZXRhZGF0YVN0b3JlXHJcbiAgPiAgICAgfSk7XHJcblxyXG4gIG9yXHJcbiAgPiAgICAgcmV0dXJuIG5ldyBRdWVyeU9wdGlvbnMoe1xyXG4gID4gICAgICAgICBtZXJnZVN0cmF0ZWd5OiBvYmosXHJcbiAgPiAgICAgICAgIGZldGNoU3RyYXRlZ3k6IHRoaXMuZmV0Y2hTdHJhdGVneVxyXG4gID4gICAgIH0pO1xyXG4gID4gICAgIGxldCBxdWVyeU9wdGlvbnMgPSBuZXcgUXVlcnlPcHRpb25zKHtcclxuICA+ICAgICAgICAgbWVyZ2VTdHJhdGVneTogTWVyZ2VTdHJhdGVneS5PdmVyd3JpdGVDaGFuZ2VzLFxyXG4gID4gICAgICAgICBmZXRjaFN0cmF0ZWd5OiBGZXRjaFN0cmF0ZWd5LkZyb21TZXJ2ZXJcclxuICA+ICAgICB9KTtcclxuICA+ICAgICBsZXQgdmFsaWRhdGlvbk9wdGlvbnMgPSBuZXcgVmFsaWRhdGlvbk9wdGlvbnMoe1xyXG4gID4gICAgICAgICB2YWxpZGF0ZU9uQXR0YWNoOiB0cnVlLFxyXG4gID4gICAgICAgICB2YWxpZGF0ZU9uU2F2ZTogdHJ1ZSxcclxuICA+ICAgICAgICAgdmFsaWRhdGVPblF1ZXJ5OiBmYWxzZVxyXG4gID4gICAgIH0pO1xyXG4gID4gICAgIGxldCBlbnRpdHlNYW5hZ2VyID0gbmV3IEVudGl0eU1hbmFnZXIoe1xyXG4gID4gICAgICAgICBzZXJ2aWNlTmFtZTogXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiLFxyXG4gID4gICAgICAgICBxdWVyeU9wdGlvbnM6IHF1ZXJ5T3B0aW9ucyxcclxuICA+ICAgICAgICAgdmFsaWRhdGlvbk9wdGlvbnM6IHZhbGlkYXRpb25PcHRpb25zXHJcbiAgPiAgICAgfSk7XHJcbiAgQHBhcmFtIGVtQ29uZmlnIC0gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBvciBhIHNlcnZpY2UgbmFtZS4gIFxyXG4gICoqL1xyXG4gIGNvbnN0cnVjdG9yKGVtQ29uZmlnPzogRW50aXR5TWFuYWdlckNvbmZpZyB8IHN0cmluZykge1xyXG5cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgRW50aXR5TWFuYWdlciBjdG9yIGhhcyBhIHNpbmdsZSBvcHRpb25hbCBhcmd1bWVudCB0aGF0IGlzIGVpdGhlciBhICdzZXJ2aWNlTmFtZScgb3IgYSBjb25maWd1cmF0aW9uIG9iamVjdC5cIik7XHJcbiAgICB9XHJcbiAgICBsZXQgY29uZmlnOiBFbnRpdHlNYW5hZ2VyQ29uZmlnO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uZmlnID0geyBzZXJ2aWNlTmFtZTogXCJcIiB9O1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW1Db25maWcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbmZpZyA9IHsgc2VydmljZU5hbWU6IGVtQ29uZmlnIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25maWcgPSBlbUNvbmZpZyB8fCB7fTtcclxuICAgIH1cclxuXHJcbiAgICBFbnRpdHlNYW5hZ2VyLl91cGRhdGVXaXRoQ29uZmlnKHRoaXMsIGNvbmZpZywgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5lbnRpdHlDaGFuZ2VkID0gbmV3IEJyZWV6ZUV2ZW50KFwiZW50aXR5Q2hhbmdlZFwiLCB0aGlzKTtcclxuICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc0NoYW5nZWQgPSBuZXcgQnJlZXplRXZlbnQoXCJ2YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZFwiLCB0aGlzKTtcclxuICAgIHRoaXMuaGFzQ2hhbmdlc0NoYW5nZWQgPSBuZXcgQnJlZXplRXZlbnQoXCJoYXNDaGFuZ2VzQ2hhbmdlZFwiLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgR2VuZXJhbCBwdXJwb3NlIHByb3BlcnR5IHNldCBtZXRob2QuICBBbnkgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhlIFtbRW50aXR5TWFuYWdlckNvbmZpZ11dXHJcbiAgbWF5IGJlIHNldC5cclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhIHByZXZpb3VzbHkgY3JlYXRlZCBFbnRpdHlNYW5hZ2VyXHJcbiAgPiAgICAgIC8vIHdoZXJlIHdlIHdhbnQgdG8gY2hhbmdlIHNvbWUgb2YgaXRzIHNldHRpbmdzLlxyXG4gID4gICAgICBlbTEuc2V0UHJvcGVydGllcygge1xyXG4gID4gICAgICAgICAgc2VydmljZU5hbWU6IFwiYnJlZXplL2Zvb1wiXHJcbiAgPiAgICAgIH0pO1xyXG4gIEBwYXJhbSBjb25maWcgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgcHJvcGVydGllcyBhbmQgdmFsdWVzIHRvIHNldC5cclxuICAqKi9cclxuICBzZXRQcm9wZXJ0aWVzKGNvbmZpZzogRW50aXR5TWFuYWdlckNvbmZpZykge1xyXG4gICAgRW50aXR5TWFuYWdlci5fdXBkYXRlV2l0aENvbmZpZyh0aGlzLCBjb25maWcsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIHN0YXRpYyBfdXBkYXRlV2l0aENvbmZpZyhlbTogRW50aXR5TWFuYWdlciwgY29uZmlnOiBFbnRpdHlNYW5hZ2VyQ29uZmlnLCBpc0N0b3I6IGJvb2xlYW4pIHtcclxuICAgIGxldCBkZWZhdWx0UXVlcnlPcHRpb25zID0gaXNDdG9yID8gUXVlcnlPcHRpb25zLmRlZmF1bHRJbnN0YW5jZSA6IGVtLnF1ZXJ5T3B0aW9ucztcclxuICAgIGxldCBkZWZhdWx0U2F2ZU9wdGlvbnMgPSBpc0N0b3IgPyBTYXZlT3B0aW9ucy5kZWZhdWx0SW5zdGFuY2UgOiBlbS5zYXZlT3B0aW9ucztcclxuICAgIGxldCBkZWZhdWx0VmFsaWRhdGlvbk9wdGlvbnMgPSBpc0N0b3IgPyBWYWxpZGF0aW9uT3B0aW9ucy5kZWZhdWx0SW5zdGFuY2UgOiBlbS52YWxpZGF0aW9uT3B0aW9ucztcclxuXHJcbiAgICBsZXQgY29uZmlnUGFyYW0gPSBhc3NlcnRDb25maWcoY29uZmlnKVxyXG4gICAgICAud2hlcmVQYXJhbShcInNlcnZpY2VOYW1lXCIpLmlzT3B0aW9uYWwoKS5pc1N0cmluZygpXHJcbiAgICAgIC53aGVyZVBhcmFtKFwiZGF0YVNlcnZpY2VcIikuaXNPcHRpb25hbCgpLmlzSW5zdGFuY2VPZihEYXRhU2VydmljZSlcclxuICAgICAgLndoZXJlUGFyYW0oXCJxdWVyeU9wdGlvbnNcIikuaXNJbnN0YW5jZU9mKFF1ZXJ5T3B0aW9ucykuaXNPcHRpb25hbCgpLndpdGhEZWZhdWx0KGRlZmF1bHRRdWVyeU9wdGlvbnMpXHJcbiAgICAgIC53aGVyZVBhcmFtKFwic2F2ZU9wdGlvbnNcIikuaXNJbnN0YW5jZU9mKFNhdmVPcHRpb25zKS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQoZGVmYXVsdFNhdmVPcHRpb25zKVxyXG4gICAgICAud2hlcmVQYXJhbShcInZhbGlkYXRpb25PcHRpb25zXCIpLmlzSW5zdGFuY2VPZihWYWxpZGF0aW9uT3B0aW9ucykuaXNPcHRpb25hbCgpLndpdGhEZWZhdWx0KGRlZmF1bHRWYWxpZGF0aW9uT3B0aW9ucylcclxuICAgICAgLndoZXJlUGFyYW0oXCJrZXlHZW5lcmF0b3JDdG9yXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCk7XHJcbiAgICBpZiAoaXNDdG9yKSB7XHJcbiAgICAgIGNvbmZpZ1BhcmFtID0gY29uZmlnUGFyYW1cclxuICAgICAgICAud2hlcmVQYXJhbShcIm1ldGFkYXRhU3RvcmVcIikuaXNJbnN0YW5jZU9mKE1ldGFkYXRhU3RvcmUpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdChuZXcgTWV0YWRhdGFTdG9yZSgpKTtcclxuICAgIH1cclxuICAgIGNvbmZpZ1BhcmFtLmFwcGx5QWxsKGVtKTtcclxuXHJcbiAgICAvLyBpbnN1cmUgdGhhdCBlbnRpdHlNYW5hZ2VyJ3Mgb3B0aW9ucyB2ZXJzaW9ucyBhcmUgY29tcGxldGVseSBwb3B1bGF0ZWRcclxuICAgIGNvcmUudXBkYXRlV2l0aERlZmF1bHRzKGVtLnF1ZXJ5T3B0aW9ucywgZGVmYXVsdFF1ZXJ5T3B0aW9ucyk7XHJcbiAgICBjb3JlLnVwZGF0ZVdpdGhEZWZhdWx0cyhlbS5zYXZlT3B0aW9ucywgZGVmYXVsdFNhdmVPcHRpb25zKTtcclxuICAgIGNvcmUudXBkYXRlV2l0aERlZmF1bHRzKGVtLnZhbGlkYXRpb25PcHRpb25zLCBkZWZhdWx0VmFsaWRhdGlvbk9wdGlvbnMpO1xyXG5cclxuICAgIGlmIChjb25maWcuc2VydmljZU5hbWUpIHtcclxuICAgICAgZW0uZGF0YVNlcnZpY2UgPSBuZXcgRGF0YVNlcnZpY2Uoe1xyXG4gICAgICAgIHNlcnZpY2VOYW1lOiBlbS5zZXJ2aWNlTmFtZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVtLnNlcnZpY2VOYW1lID0gZW0uZGF0YVNlcnZpY2UgJiYgZW0uZGF0YVNlcnZpY2Uuc2VydmljZU5hbWU7XHJcblxyXG4gICAgZW0ua2V5R2VuZXJhdG9yQ3RvciA9IGVtLmtleUdlbmVyYXRvckN0b3IgfHwgS2V5R2VuZXJhdG9yO1xyXG4gICAgaWYgKGlzQ3RvciB8fCBjb25maWcua2V5R2VuZXJhdG9yQ3Rvcikge1xyXG4gICAgICBlbS5rZXlHZW5lcmF0b3IgPSBuZXcgZW0ua2V5R2VuZXJhdG9yQ3RvcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlRW50aXR5KHR5cGVOYW1lOiBzdHJpbmcsIGluaXRpYWxWYWx1ZXM/OiBPYmplY3QsIGVudGl0eVN0YXRlPzogRW50aXR5U3RhdGUsIG1lcmdlU3RyYXRlZ3k/OiBNZXJnZVN0cmF0ZWd5KTogRW50aXR5O1xyXG4gIGNyZWF0ZUVudGl0eShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBpbml0aWFsVmFsdWVzPzogT2JqZWN0LCBlbnRpdHlTdGF0ZT86IEVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5PzogTWVyZ2VTdHJhdGVneSk6IEVudGl0eTtcclxuICAvKipcclxuICBDcmVhdGVzIGEgbmV3IGVudGl0eSBvZiBhIHNwZWNpZmllZCB0eXBlIGFuZCBvcHRpb25hbGx5IGluaXRpYWxpemVzIGl0LiBCeSBkZWZhdWx0IHRoZSBuZXcgZW50aXR5IGlzIGNyZWF0ZWQgd2l0aCBhbiBFbnRpdHlTdGF0ZSBvZiBBZGRlZFxyXG4gIGJ1dCB5b3UgY2FuIGFsc28gb3B0aW9uYWxseSBzcGVjaWZ5IGFuIEVudGl0eVN0YXRlLiAgQW4gRW50aXR5U3RhdGUgb2YgJ0RldGFjaGVkJyB3aWxsIGluc3VyZSB0aGF0IHRoZSBlbnRpdHkgaXMgY3JlYXRlZCBidXQgbm90IHlldCBhZGRlZFxyXG4gIHRvIHRoZSBFbnRpdHlNYW5hZ2VyLiBcclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIC8vIGNyZWF0ZSBhbmQgYWRkIGFuIGVudGl0eTtcclxuICA+ICAgICAgbGV0IGVtcDEgPSBlbTEuY3JlYXRlRW50aXR5KFwiRW1wbG95ZWVcIik7XHJcbiAgPiAgICAgIC8vIGNyZWF0ZSBhbmQgYWRkIGFuIGluaXRpYWxpemVkIGVudGl0eTtcclxuICA+ICAgICAgbGV0IGVtcDIgPSBlbTEuY3JlYXRlRW50aXR5KFwiRW1wbG95ZWVcIiwgeyBsYXN0TmFtZTogXCJTbWl0aFwiLCBmaXJzdE5hbWU6IFwiSm9oblwiIH0pO1xyXG4gID4gICAgICAvLyBjcmVhdGUgYW5kIGF0dGFjaCAobm90IGFkZCkgYW4gaW5pdGlhbGl6ZWQgZW50aXR5XHJcbiAgPiAgICAgIGxldCBlbXAzID0gZW0xLmNyZWF0ZUVudGl0eShcIkVtcGxveWVlXCIsIHsgaWQ6IDQzNSwgbGFzdE5hbWU6IFwiU21pdGhcIiwgZmlyc3ROYW1lOiBcIkpvaG5cIiB9LCBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQpO1xyXG4gID4gICAgICAvLyBjcmVhdGUgYnV0IGRvbid0IGF0dGFjaCBhbiBlbnRpdHk7XHJcbiAgPiAgICAgIGxldCBlbXA0ID0gZW0xLmNyZWF0ZUVudGl0eShcIkVtcGxveWVlXCIsIHsgaWQ6IDQzNSwgbGFzdE5hbWU6IFwiU21pdGhcIiwgZmlyc3ROYW1lOiBcIkpvaG5cIiB9LCBFbnRpdHlTdGF0ZS5EZXRhY2hlZCk7XHJcbiAgQHBhcmFtIHR5cGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEVudGl0eVR5cGUgZm9yIHdoaWNoIGFuIGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkLlxyXG4gIEBwYXJhbSBlbnRpdHlUeXBlIC0gVGhlIEVudGl0eVR5cGUgb2YgdGhlIHR5cGUgZm9yIHdoaWNoIGFuIGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkLlxyXG4gIEBwYXJhbSBpbml0aWFsVmFsdWVzIC0gKGRlZmF1bHQ9bnVsbCkgQ29uZmlndXJhdGlvbiBvYmplY3Qgb2YgdGhlIHByb3BlcnRpZXMgdG8gc2V0IGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uLlxyXG4gIEBwYXJhbSBlbnRpdHlTdGF0ZSAtIChkZWZhdWx0ID0gW1tFbnRpdHlTdGF0ZS5BZGRlZF1dKSBUaGUgRW50aXR5U3RhdGUgb2YgdGhlIGVudGl0eSBhZnRlciBiZWluZyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGlzIEVudGl0eU1hbmFnZXIuXHJcbiAgQHBhcmFtIG1lcmdlU3RyYXRlZ3kgLSAoZGVmYXVsdCA9IFtbTWVyZ2VTdHJhdGVneS5EaXNhbGxvd2VkXV0pIC0gSG93IHRvIGhhbmRsZSBjb25mbGljdHMgaWYgYW4gZW50aXR5IHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGhpbiB0aGlzIEVudGl0eU1hbmFnZXIuXHJcbiAgQHJldHVybiB7RW50aXR5fSBBIG5ldyBFbnRpdHkgb2YgdGhlIHNwZWNpZmllZCB0eXBlLiBcclxuICAqL1xyXG4gIGNyZWF0ZUVudGl0eShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgc3RyaW5nLCBpbml0aWFsVmFsdWVzOiBPYmplY3QsIGVudGl0eVN0YXRlOiBFbnRpdHlTdGF0ZSwgbWVyZ2VTdHJhdGVneTogTWVyZ2VTdHJhdGVneSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5VHlwZSwgXCJlbnRpdHlUeXBlXCIpLmlzU3RyaW5nKCkub3IoKS5pc0luc3RhbmNlT2YoRW50aXR5VHlwZSkuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eVN0YXRlLCBcImVudGl0eVN0YXRlXCIpLmlzRW51bU9mKEVudGl0eVN0YXRlKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKG1lcmdlU3RyYXRlZ3ksIFwibWVyZ2VTdHJhdGVneVwiKS5pc0VudW1PZihNZXJnZVN0cmF0ZWd5KS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuXHJcbiAgICBsZXQgZXQgPSAodHlwZW9mIGVudGl0eVR5cGUgPT09IFwic3RyaW5nXCIpID8gdGhpcy5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShlbnRpdHlUeXBlKSBhcyBFbnRpdHlUeXBlIDogZW50aXR5VHlwZTtcclxuICAgIGVudGl0eVN0YXRlID0gZW50aXR5U3RhdGUgfHwgRW50aXR5U3RhdGUuQWRkZWQ7XHJcbiAgICBsZXQgZW50aXR5ID0ge30gYXMgRW50aXR5O1xyXG4gICAgY29yZS51c2luZyh0aGlzLCBcImlzTG9hZGluZ1wiLCB0cnVlLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGVudGl0eSA9IGV0LmNyZWF0ZUVudGl0eShpbml0aWFsVmFsdWVzKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKGVudGl0eVN0YXRlICE9PSBFbnRpdHlTdGF0ZS5EZXRhY2hlZCkge1xyXG4gICAgICBlbnRpdHkgPSB0aGlzLmF0dGFjaEVudGl0eShlbnRpdHksIGVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbnRpdHk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaW1wb3J0RW50aXRpZXMoZXhwb3J0ZWRTdHJpbmc6IHN0cmluZywgY29uZmlnPzogSW1wb3J0Q29uZmlnKTogRW50aXR5TWFuYWdlcjtcclxuICBzdGF0aWMgaW1wb3J0RW50aXRpZXMoZXhwb3J0ZWREYXRhOiBPYmplY3QsIGNvbmZpZz86IEltcG9ydENvbmZpZyk6IEVudGl0eU1hbmFnZXI7XHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhIG5ldyBFbnRpdHlNYW5hZ2VyIGFuZCBpbXBvcnRzIGEgcHJldmlvdXNseSBleHBvcnRlZCByZXN1bHQgaW50byBpdC5cclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoKTtcclxuICA+ICAgICAgLy8gY2FuIGJlIHN0b3JlZCB2aWEgdGhlIHdlYiBzdG9yYWdlIGFwaVxyXG4gID4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJteUVudGl0eU1hbmFnZXJcIiwgYnVuZGxlKTtcclxuICA+ICAgICAgLy8gYXNzdW1lIHRoZSBjb2RlIGJlbG93IG9jY3VycyBpbiBhIGRpZmZlcmVudCBzZXNzaW9uLlxyXG4gID4gICAgICBsZXQgYnVuZGxlRnJvbVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJteUVudGl0eU1hbmFnZXJcIik7XHJcbiAgPiAgICAgIC8vIGFuZCBpbXBvcnRlZFxyXG4gID4gICAgICBsZXQgZW0yID0gRW50aXR5TWFuYWdlci5pbXBvcnRFbnRpdGllcyhidW5kbGVGcm9tU3RvcmFnZSk7XHJcbiAgPiAgICAgIC8vIGVtMiB3aWxsIG5vdyBoYXZlIGEgY29tcGxldGUgY29weSBvZiB3aGF0IHdhcyBpbiBlbTFcclxuICBAcGFyYW0gZXhwb3J0ZWRTdHJpbmcgLSBUaGUgcmVzdWx0IG9mIGEgcHJldmlvdXMgJ2V4cG9ydEVudGl0aWVzJyBjYWxsIGFzIGEgc3RyaW5nXHJcbiAgQHBhcmFtIGV4cG9ydGVkRGF0YSAtIFRoZSByZXN1bHQgb2YgYSBwcmV2aW91cyAnZXhwb3J0RW50aXRpZXMnIGNhbGwgYXMgYW4gT2JqZWN0LlxyXG4gIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gIEBwYXJhbSBjb25maWcubWVyZ2VTdHJhdGVneSAtIEEgIFtbTWVyZ2VTdHJhdGVneV1dIHRvIHVzZSB3aGVuIFxyXG4gIG1lcmdpbmcgaW50byBhbiBleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gIEBwYXJhbSBjb25maWcubWV0YWRhdGFWZXJzaW9uRm4gLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cyAodGhlIGN1cnJlbnQgbWV0YWRhdGFWZXJzaW9uIGFuZCB0aGUgaW1wb3J0ZWQgc3RvcmUncyAnbmFtZScpXHJcbiAgYW5kIG1heSBiZSB1c2VkIHRvIHBlcmZvcm0gdmVyc2lvbiBjaGVja2luZy5cclxuICBAcmV0dXJuIEEgbmV3IEVudGl0eU1hbmFnZXIuICBOb3RlIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBjYWxsIGlzIGRpZmZlcmVudCBmcm9tIHRoYXRcclxuICBwcm92aWRlZCBieSB0aGUgc2FtZSBuYW1lZCBtZXRob2Qgb24gYW4gRW50aXR5TWFuYWdlciBpbnN0YW5jZS4gVXNlIHRoYXQgbWV0aG9kIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cclxuICByZWdhcmRpbmcgdGhlIGltcG9ydGVkIGVudGl0aWVzLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBpbXBvcnRFbnRpdGllcyhleHBvcnRlZDogc3RyaW5nIHwgT2JqZWN0LCBjb25maWc/OiBJbXBvcnRDb25maWcpIHtcclxuICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKCk7XHJcbiAgICBlbS5pbXBvcnRFbnRpdGllcyhleHBvcnRlZCwgY29uZmlnKTtcclxuICAgIHJldHVybiBlbTtcclxuICB9XHJcblxyXG4gIC8vIGluc3RhbmNlIG1ldGhvZHNcclxuXHJcbiAgLyoqXHJcbiAgQ2FsbHMgW1tFbnRpdHlBc3BlY3QuYWNjZXB0Q2hhbmdlc11dIG9uIGV2ZXJ5IGNoYW5nZWQgZW50aXR5IGluIHRoaXMgRW50aXR5TWFuYWdlci5cclxuICAqKi9cclxuICBhY2NlcHRDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5nZXRDaGFuZ2VzKCkubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcclxuICAgICAgcmV0dXJuIGVudGl0eS5lbnRpdHlBc3BlY3QuX2NoZWNrT3BlcmF0aW9uKFwiYWNjZXB0Q2hhbmdlc1wiKTtcclxuICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGFzcGVjdCkge1xyXG4gICAgICBhc3BlY3QuYWNjZXB0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBFeHBvcnRzIHNlbGVjdGVkIGVudGl0aWVzLCBhbGwgZW50aXRpZXMgb2Ygc2VsZWN0ZWQgdHlwZXMsIG9yIGFuIGVudGlyZSBFbnRpdHlNYW5hZ2VyIGNhY2hlLlxyXG5cclxuICBUaGlzIG1ldGhvZCB0YWtlcyBhIHNuYXBzaG90IG9mIGFuIEVudGl0eU1hbmFnZXIgdGhhdCBjYW4gYmUgc3RvcmVkIG9mZmxpbmUgb3IgaGVsZCBpbiBtZW1vcnkuXHJcbiAgVXNlIHRoZSBbW0VudGl0eU1hbmFnZXIuaW1wb3J0RW50aXRpZXNdXSBtZXRob2QgdG8gcmVzdG9yZSBvciBtZXJnZSB0aGUgc25hcHNob3RcclxuICBpbnRvIGFub3RoZXIgRW50aXR5TWFuYWdlciBhdCBzb21lIGxhdGVyIHRpbWUuXHJcbiAgPiAgICAgIC8vIGxldCBlbTEgYmUgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgIC8vIGV4cG9ydCBldmVyeSBlbnRpdHkgaW4gZW0xLlxyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoKTtcclxuICA+ICAgICAvLyBzYXZlIHRvIHRoZSBicm93c2VyJ3MgbG9jYWwgc3RvcmFnZVxyXG4gID4gICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm15RW50aXR5TWFuYWdlclwiLCBidW5kbGUpO1xyXG4gID4gICAgIC8vIGxhdGVyIHJldHJpZXZlIHRoZSBleHBvcnRcclxuICA+ICAgICBsZXQgYnVuZGxlRnJvbVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJteUVudGl0eU1hbmFnZXJcIik7XHJcbiAgPiAgICAgLy8gaW1wb3J0IHRoZSByZXRyaWV2ZWQgZXhwb3J0IGJ1bmRsZSBpbnRvIGFub3RoZXIgbWFuYWdlclxyXG4gID4gICAgIGxldCBlbTIgPSBlbTEuY3JlYXRlRW1wdHlDb3B5KCk7XHJcbiAgPiAgICAgZW0yLmltcG9ydEVudGl0aWVzKGJ1bmRsZUZyb21TdG9yYWdlKTtcclxuICA+ICAgICAvLyBlbTIgbm93IGhhcyBhIGNvbXBsZXRlLCBmYWl0aGZ1bCBjb3B5IG9mIHRoZSBlbnRpdGllcyB0aGF0IHdlcmUgaW4gZW0xXHJcblxyXG4gIFlvdSBjYW4gYWxzbyBjb250cm9sIGV4YWN0bHkgd2hpY2ggZW50aXRpZXMgYXJlIGV4cG9ydGVkLlxyXG4gID4gICAgIC8vIGdldCBlbTEncyB1bnNhdmVkIGNoYW5nZXMgKGFuIGFycmF5KSBhbmQgZXhwb3J0IHRoZW0uXHJcbiAgPiAgICAgbGV0IGNoYW5nZXMgPSBlbTEuZ2V0Q2hhbmdlcygpO1xyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoY2hhbmdlcyk7XHJcbiAgPiAgICAgLy8gbWVyZ2UgdGhlc2UgZW50aXRpZXMgaW50byBlbTIgd2hpY2ggbWF5IGNvbnRhaW5zIHNvbWUgb2YgdGhlIHNhbWUgZW50aXRpZXMuXHJcbiAgPiAgICAgLy8gZG8gTk9UIG92ZXJ3cml0ZSB0aGUgZW50aXRpZXMgaW4gZW0yIGlmIHRoZXkgdGhlbXNlbHZlcyBoYXZlIHVuc2F2ZWQgY2hhbmdlcy5cclxuICA+ICAgICBlbTIuaW1wb3J0RW50aXRpZXMoYnVuZGxlLCB7IG1lcmdlU3RyYXRlZ3k6IE1lcmdlU3RyYXRlZ3kuUHJlc2VydmVDaGFuZ2VzfSApO1xyXG5cclxuICBNZXRhZGF0YSBhcmUgaW5jbHVkZWQgaW4gYW4gZXhwb3J0IGJ5IGRlZmF1bHQuIFlvdSBtYXkgd2FudCB0byBleGNsdWRlIHRoZSBtZXRhZGF0YVxyXG4gIGVzcGVjaWFsbHkgaWYgeW91J3JlIGV4cG9ydGluZyBqdXN0IGEgZmV3IGVudGl0aWVzIGZvciBsb2NhbCBzdG9yYWdlLlxyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoYXJyYXlPZlNlbGVjdGVkRW50aXRpZXMsIHtpbmNsdWRlTWV0YWRhdGE6IGZhbHNlfSk7XHJcbiAgPiAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ29vZFN0dWZmXCIsIGJ1bmRsZSk7XHJcblxyXG4gIFlvdSBtYXkgc3RpbGwgZXhwcmVzcyB0aGlzIG9wdGlvbiBhcyBhIGJvb2xlYW4gdmFsdWUgYWx0aG91Z2ggdGhpcyBvbGRlciBzeW50YXggaXMgZGVwcmVjYXRlZC5cclxuICA+ICAgICAvLyBFeGNsdWRlIHRoZSBtZXRhZGF0YSAoZGVwcmVjYXRlZCBzeW50YXgpXHJcbiAgPiAgICAgbGV0IGJ1bmRsZSA9IGVtMS5leHBvcnRFbnRpdGllcyhhcnJheU9mU2VsZWN0ZWRFbnRpdGllcywgZmFsc2UpO1xyXG5cclxuICBZb3UgY2FuIGV4cG9ydCBhbGwgZW50aXRpZXMgb2Ygb25lIG9yIG1vcmUgc3BlY2lmaWVkIEVudGl0eVR5cGVzLlxyXG4gID4gICAgIC8vIEV4cG9ydCBhbGwgQ3VzdG9tZXIgYW5kIEVtcGxveWVlIGVudGl0aWVzIChhbmQgYWxzbyBleGNsdWRlIG1ldGFkYXRhKVxyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoWydDdXN0b21lcicsICdFbXBsb3llZSddLCB7aW5jbHVkZU1ldGFkYXRhOiBmYWxzZX0pO1xyXG5cclxuICBBbGwgb2YgdGhlIGFib3ZlIGV4YW1wbGVzIHJldHVybiBhbiBleHBvcnQgYnVuZGxlIGFzIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGZvcm1hdC5cclxuICBZb3UgY2FuIGV4cG9ydCB0aGUgYnVuZGxlIGFzIEpTT04gaWYgeW91IHByZWZlciBieSBzZXR0aW5nIHRoZSBgYXNTdHJpbmdgIG9wdGlvbiB0byBmYWxzZS5cclxuICA+ICAgICAvLyBFeHBvcnQgYWxsIEN1c3RvbWVyIGFuZCBFbXBsb3llZSBlbnRpdGllcyBhcyBKU09OIGFuZCBleGNsdWRlIHRoZSBtZXRhZGF0YVxyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoWydDdXN0b21lcicsICdFbXBsb3llZSddLFxyXG4gID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2FzU3RyaW5nOiBmYWxzZSwgaW5jbHVkZU1ldGFkYXRhOiBmYWxzZX0pO1xyXG4gID4gICAgIC8vIHN0b3JlIEpTT04gYnVuZGxlIHNvbWV3aGVyZSAuLi4gcGVyaGFwcyBpbmRleERiIC4uLiBhbmQgbGF0ZXIgaW1wb3J0IGFzIHdlIGRvIGhlcmUuXHJcbiAgPiAgICAgZW0yLmltcG9ydEVudGl0aWVzKGJ1bmRsZSk7XHJcbiAgQHBhcmFtIGVudGl0aWVzIC0gVGhlIGVudGl0aWVzIHRvIGV4cG9ydCBvciB0aGUgRW50aXR5VHlwZShzKSBvZiB0aGUgZW50aXRpZXMgdG8gZXhwb3J0O1xyXG4gICAgYWxsIGVudGl0aWVzIGFyZSBleHBvcnRlZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkIG9yIG51bGwuXHJcbiAgQHBhcmFtIGV4cG9ydENvbmZpZyAtIEV4cG9ydCBjb25maWd1cmF0aW9uIG9wdGlvbnMgb3IgYSBib29sZWFuXHJcbiAgICAtIGFzU3RyaW5nIC0gKGJvb2xlYW4pIC0gSWYgdHJ1ZSAoZGVmYXVsdCksIHJldHVybiBleHBvcnQgYnVuZGxlIGFzIGEgc3RyaW5nLlxyXG4gICAgLSBpbmNsdWRlTWV0YWRhdGEgLSAoYm9vbGVhbikgLSBJZiB0cnVlIChkZWZhdWx0KSwgaW5jbHVkZSBtZXRhZGF0YSBpbiB0aGUgZXhwb3J0IGJ1bmRsZS5cclxuICBAcmV0dXJuIFRoZSBleHBvcnQgYnVuZGxlIGVpdGhlciBzZXJpYWxpemVkIGFzIGEgc3RyaW5nIChkZWZhdWx0KSBvciBhcyBhIEpTT04gb2JqZWN0LlxyXG4gIFRoZSBidW5kbGUgY29udGFpbnMgdGhlIG1ldGFkYXRhICh1bmxlc3MgZXhjbHVkZWQpIGFuZCB0aGUgZW50aXR5IGRhdGEgZ3JvdXBlZCBieSB0eXBlLlxyXG4gIFRoZSBlbnRpdHkgZGF0YSBpbmNsdWRlIHByb3BlcnR5IHZhbHVlcywgY2hhbmdlLXN0YXRlLCBhbmQgdGVtcG9yYXJ5IGtleSBtYXBwaW5ncyAoaWYgYW55KS5cclxuXHJcbiAgVGhlIGV4cG9ydCBidW5kbGUgaW50ZXJuYWxzIGFyZSBkZWxpYmVyYXRlbHkgdW5kb2N1bWVudGVkLiAgVGhpcyBCcmVlemUtaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgZW50aXR5IGRhdGEgaXNcclxuICBzdWl0YWJsZSBmb3IgZXhwb3J0LCBzdG9yYWdlLCBhbmQgaW1wb3J0LiBUaGUgc2NoZW1hIGFuZCBjb250ZW50cyBvZiB0aGUgYnVuZGxlIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zIG9mIEJyZWV6ZS5cclxuICBNYW5pcHVsYXRlIGl0IGF0IHlvdXIgb3duIHJpc2sgd2l0aCBhcHByb3ByaWF0ZSBjYXV0aW9uLlxyXG4gICoqL1xyXG4gIGV4cG9ydEVudGl0aWVzKGVudGl0aWVzPzogRW50aXR5W10gfCBFbnRpdHlUeXBlW10gfCBzdHJpbmdbXSwgZXhwb3J0Q29uZmlnPzogeyBhc1N0cmluZz86IGJvb2xlYW4sIGluY2x1ZGVNZXRhZGF0YT86IGJvb2xlYW4gfSB8IGJvb2xlYW4pOiBzdHJpbmcgfCBPYmplY3Qge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXRpZXMsIFwiZW50aXRpZXNcIikuaXNBcnJheSgpLmlzRW50aXR5KClcclxuICAgICAgLm9yKCkuaXNOb25FbXB0eUFycmF5KCkuaXNJbnN0YW5jZU9mKEVudGl0eVR5cGUpXHJcbiAgICAgIC5vcigpLmlzTm9uRW1wdHlBcnJheSgpLmlzU3RyaW5nKClcclxuICAgICAgLm9yKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcblxyXG4gICAgLy8gYXNzZXJ0UGFyYW0oZXhwb3J0Q29uZmlnLCBcImV4cG9ydENvbmZpZ1wiKS5pc09iamVjdCgpXHJcbiAgICAvLyAgIC5vcigpLmlzQm9vbGVhbigpXHJcbiAgICAvLyAgIC5vcigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG5cclxuICAgIGlmIChleHBvcnRDb25maWcgPT0gbnVsbCkge1xyXG4gICAgICBleHBvcnRDb25maWcgPSB7IGluY2x1ZGVNZXRhZGF0YTogdHJ1ZSwgYXNTdHJpbmc6IHRydWUgfTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydENvbmZpZyA9PT0gJ2Jvb2xlYW4nKSB7IC8vIGRlcHJlY2F0ZWRcclxuICAgICAgZXhwb3J0Q29uZmlnID0geyBpbmNsdWRlTWV0YWRhdGE6IGV4cG9ydENvbmZpZywgYXNTdHJpbmc6IHRydWUgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3NlcnRDb25maWcoZXhwb3J0Q29uZmlnKVxyXG4gICAgICAud2hlcmVQYXJhbShcImFzU3RyaW5nXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdCh0cnVlKVxyXG4gICAgICAud2hlcmVQYXJhbShcImluY2x1ZGVNZXRhZGF0YVwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQodHJ1ZSlcclxuICAgICAgLmFwcGx5QWxsKGV4cG9ydENvbmZpZyk7XHJcblxyXG4gICAgbGV0IGV4cG9ydEJ1bmRsZSA9IGV4cG9ydEVudGl0eUdyb3Vwcyh0aGlzLCBlbnRpdGllcyk7XHJcbiAgICBsZXQganNvbiA9IGNvcmUuZXh0ZW5kKHt9LCBleHBvcnRCdW5kbGUsIFtcInRlbXBLZXlzXCIsIFwiZW50aXR5R3JvdXBNYXBcIl0pO1xyXG5cclxuICAgIGlmIChleHBvcnRDb25maWcuaW5jbHVkZU1ldGFkYXRhKSB7XHJcbiAgICAgIGpzb24gPSBjb3JlLmV4dGVuZChqc29uLCB0aGlzLCBbXCJkYXRhU2VydmljZVwiLCBcInNhdmVPcHRpb25zXCIsIFwicXVlcnlPcHRpb25zXCIsIFwidmFsaWRhdGlvbk9wdGlvbnNcIl0pO1xyXG4gICAgICAoanNvbiBhcyBhbnkpLm1ldGFkYXRhU3RvcmUgPSB0aGlzLm1ldGFkYXRhU3RvcmUuZXhwb3J0TWV0YWRhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIChqc29uIGFzIGFueSkubWV0YWRhdGFWZXJzaW9uID0gTWV0YWRhdGFTdG9yZS5tZXRhZGF0YVZlcnNpb247XHJcbiAgICAgIChqc29uIGFzIGFueSkubWV0YWRhdGFTdG9yZU5hbWUgPSB0aGlzLm1ldGFkYXRhU3RvcmUubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0ID0gZXhwb3J0Q29uZmlnLmFzU3RyaW5nID8gSlNPTi5zdHJpbmdpZnkoanNvbiwgbnVsbCwgY29uZmlnLnN0cmluZ2lmeVBhZCkgOiBqc29uO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IHR5cGUgdGhlIHJldHVybiB2YWx1ZSB7IGVudGl0aWVzOiBlbnRpdGllc1RvTGluaywgdGVtcEtleU1hcHBpbmc6IHRlbXBLZXlNYXAgfVxyXG4gIGltcG9ydEVudGl0aWVzKGV4cG9ydGVkU3RyaW5nOiBzdHJpbmcsIGNvbmZpZz86IEltcG9ydENvbmZpZyk6IEltcG9ydFJlc3VsdDtcclxuICBpbXBvcnRFbnRpdGllcyhleHBvcnRlZERhdGE6IE9iamVjdCwgY29uZmlnPzogSW1wb3J0Q29uZmlnKTogSW1wb3J0UmVzdWx0O1xyXG4gIC8qKlxyXG4gIEltcG9ydHMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIHJlc3VsdCBpbnRvIHRoaXMgRW50aXR5TWFuYWdlci5cclxuXHJcbiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIGNvbXBsZXRlIGNvcHkgb2YgYW55IHByZXZpb3VzbHkgY3JlYXRlZCBlbnRpdHlNYW5hZ2VyLCBldmVuIGlmIGNyZWF0ZWRcclxuICBpbiBhIHByZXZpb3VzIHNlc3Npb24gYW5kIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuIFRoZSBzdGF0aWMgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCBwZXJmb3JtcyBhXHJcbiAgdmVyeSBzaW1pbGFyIHByb2Nlc3MuXHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgbGV0IGJ1bmRsZSA9IGVtMS5leHBvcnRFbnRpdGllcygpO1xyXG4gID4gICAgIC8vIGJ1bmRsZSBjYW4gYmUgc3RvcmVkIGluIHdpbmRvdy5sb2NhbFN0b3JhZ2Ugb3IganVzdCBoZWxkIGluIG1lbW9yeS5cclxuICA+ICAgICBsZXQgZW0yID0gbmV3IEVudGl0eU1hbmFnZXIoe1xyXG4gID4gICAgICAgICBzZXJ2aWNlTmFtZTogZW0xLnNlcnZpY2VOYW1lLFxyXG4gID4gICAgICAgICBtZXRhZGF0YVN0b3JlOiBlbTEubWV0YWRhdGFTdG9yZVxyXG4gID4gICAgIH0pO1xyXG4gID4gICAgIGVtMi5pbXBvcnRFbnRpdGllcyhidW5kbGUpO1xyXG4gID4gICAgIC8vIGVtMiB3aWxsIG5vdyBoYXZlIGEgY29tcGxldGUgY29weSBvZiB3aGF0IHdhcyBpbiBlbTFcclxuXHJcbiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBtZXJnZSB0aGUgY29udGVudHMgb2YgYSBwcmV2aW91c2x5IGNyZWF0ZWQgRW50aXR5TWFuYWdlciB3aXRoIGFuXHJcbiAgZXhpc3RpbmcgRW50aXR5TWFuYWdlciB3aXRoIGNvbnRyb2wgb3ZlciBob3cgdGhlIHR3byBhcmUgbWVyZ2VkLlxyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoKTtcclxuICA+ICAgICAvLyBhc3N1bWUgZW0yIGlzIGFub3RoZXIgZW50aXR5TWFuYWdlciBjb250YWluaW5nIHNvbWUgb2YgdGhlIHNhbWUgZW50aXRpZXMgcG9zc2libHkgd2l0aCBtb2RpZmljYXRpb25zLlxyXG4gID4gICAgIGVtMi5pbXBvcnRFbnRpdGllcyhidW5kbGUsIHsgbWVyZ2VTdHJhdGVneTogTWVyZ2VTdHJhdGVneS5QcmVzZXJ2ZUNoYW5nZXN9ICk7XHJcbiAgPiAgICAgLy8gZW0yIHdpbGwgbm93IGNvbnRhaW4gYWxsIG9mIHRoZSBlbnRpdGllcyBmcm9tIGJvdGggZW0xIGFuZCBlbTIuICBBbnkgZW0yIGVudGl0aWVzIHdpdGggcHJldmlvdXNseVxyXG4gID4gICAgIC8vIG1hZGUgbW9kaWZpY2F0aW9ucyB3aWxsIG5vdCBoYXZlIGJlZW4gdG91Y2hlZCwgYnV0IGFsbCBvdGhlciBlbnRpdGllcyBmcm9tIGVtMSB3aWxsIGhhdmUgYmVlbiBpbXBvcnRlZC5cclxuICBAcGFyYW0gZXhwb3J0ZWRTdHJpbmcgLSBUaGUgcmVzdWx0IG9mIGEgcHJldmlvdXMgJ2V4cG9ydCcgY2FsbC5cclxuICBAcGFyYW0gaW1wb3J0Q29uZmlnIC0gQSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICBAcGFyYW0gaW1wb3J0Q29uZmlnLm1lcmdlU3RyYXRlZ3kgLSAgQSBbW01lcmdlU3RyYXRlZ3ldXSB0byB1c2Ugd2hlblxyXG4gIG1lcmdpbmcgaW50byBhbiBleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gIEBwYXJhbSBpbXBvcnRDb25maWcubWV0YWRhdGFWZXJzaW9uRm4gLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cyAodGhlIGN1cnJlbnQgbWV0YWRhdGFWZXJzaW9uIGFuZCB0aGUgaW1wb3J0ZWQgc3RvcmUncyAnbmFtZScpXHJcbiAgYW5kIG1heSBiZSB1c2VkIHRvIHBlcmZvcm0gdmVyc2lvbiBjaGVja2luZy5cclxuICBAcmV0dXJuIHJlc3VsdCBcclxuICAgIC0gcmVzdWx0LmVudGl0aWVzIHtBcnJheSBvZiBFbnRpdGllc30gVGhlIGVudGl0aWVzIHRoYXQgd2VyZSBpbXBvcnRlZC5cclxuICAgIC0gcmVzdWx0LnRlbXBLZXlNYXAge09iamVjdH0gTWFwcGluZyBmcm9tIG9yaWdpbmFsIEVudGl0eUtleSBpbiB0aGUgaW1wb3J0IGJ1bmRsZSB0byBpdHMgY29ycmVzcG9uZGluZyBFbnRpdHlLZXkgaW4gdGhpcyBFbnRpdHlNYW5hZ2VyLlxyXG4gICoqL1xyXG4gIGltcG9ydEVudGl0aWVzKGV4cG9ydGVkOiBzdHJpbmcgfCBPYmplY3QsIGltcG9ydENvbmZpZz86IEltcG9ydENvbmZpZykge1xyXG4gICAgaW1wb3J0Q29uZmlnID0gaW1wb3J0Q29uZmlnIHx8IHt9O1xyXG4gICAgYXNzZXJ0Q29uZmlnKGltcG9ydENvbmZpZylcclxuICAgICAgLndoZXJlUGFyYW0oXCJtZXJnZVN0cmF0ZWd5XCIpLmlzRW51bU9mKE1lcmdlU3RyYXRlZ3kpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdCh0aGlzLnF1ZXJ5T3B0aW9ucy5tZXJnZVN0cmF0ZWd5KVxyXG4gICAgICAud2hlcmVQYXJhbShcIm1ldGFkYXRhVmVyc2lvbkZuXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKClcclxuICAgICAgLndoZXJlUGFyYW0oXCJtZXJnZUFkZHNcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgIC5hcHBseUFsbChpbXBvcnRDb25maWcpO1xyXG5cclxuICAgIGxldCBqc29uID0gKHR5cGVvZiBleHBvcnRlZCA9PT0gXCJzdHJpbmdcIikgPyBKU09OLnBhcnNlKGV4cG9ydGVkKSA6IGV4cG9ydGVkO1xyXG4gICAgaWYgKGpzb24ubWV0YWRhdGFTdG9yZSkge1xyXG4gICAgICB0aGlzLm1ldGFkYXRhU3RvcmUuaW1wb3J0TWV0YWRhdGEoanNvbi5tZXRhZGF0YVN0b3JlKTtcclxuICAgICAgLy8gdGhlIHx8IGNsYXVzZSBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdCB3aXRoIGFuIGVhcmxpZXIgc2VyaWFsaXphdGlvbiBmb3JtYXQuXHJcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSAoanNvbi5kYXRhU2VydmljZSAmJiBEYXRhU2VydmljZS5mcm9tSlNPTihqc29uLmRhdGFTZXJ2aWNlKSkgfHwgbmV3IERhdGFTZXJ2aWNlKHsgc2VydmljZU5hbWU6IGpzb24uc2VydmljZU5hbWUgfSk7XHJcblxyXG4gICAgICB0aGlzLnNhdmVPcHRpb25zID0gbmV3IFNhdmVPcHRpb25zKGpzb24uc2F2ZU9wdGlvbnMpO1xyXG4gICAgICB0aGlzLnF1ZXJ5T3B0aW9ucyA9IFF1ZXJ5T3B0aW9ucy5mcm9tSlNPTihqc29uLnF1ZXJ5T3B0aW9ucyk7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk9wdGlvbnMgPSBuZXcgVmFsaWRhdGlvbk9wdGlvbnMoanNvbi52YWxpZGF0aW9uT3B0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbXBvcnRDb25maWcubWV0YWRhdGFWZXJzaW9uRm4gJiYgaW1wb3J0Q29uZmlnLm1ldGFkYXRhVmVyc2lvbkZuKHtcclxuICAgICAgICBtZXRhZGF0YVZlcnNpb246IGpzb24ubWV0YWRhdGFWZXJzaW9uLFxyXG4gICAgICAgIG1ldGFkYXRhU3RvcmVOYW1lOiBqc29uLm1ldGFkYXRhU3RvcmVOYW1lXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0ZW1wS2V5TWFwOiBJVGVtcEtleU1hcCA9IHt9O1xyXG4gICAganNvbi50ZW1wS2V5cy5mb3JFYWNoKChrOiBhbnkpID0+IHtcclxuICAgICAgbGV0IG9sZEtleSA9IEVudGl0eUtleS5mcm9tSlNPTihrLCB0aGlzLm1ldGFkYXRhU3RvcmUpO1xyXG4gICAgICAvLyB0cnkgdG8gdXNlIG9sZEtleSBpZiBub3QgYWxyZWFkeSB1c2VkIGluIHRoaXMga2V5R2VuZXJhdG9yLlxyXG4gICAgICB0ZW1wS2V5TWFwW29sZEtleS50b1N0cmluZygpXSA9IG5ldyBFbnRpdHlLZXkob2xkS2V5LmVudGl0eVR5cGUsIHRoaXMua2V5R2VuZXJhdG9yLmdlbmVyYXRlVGVtcEtleVZhbHVlKG9sZEtleS5lbnRpdHlUeXBlLCBvbGRLZXkudmFsdWVzWzBdKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgZW50aXRpZXNUb0xpbms6IEVudGl0eVtdID0gW107XHJcbiAgICBsZXQgaW1wQ29uZmlnID0gaW1wb3J0Q29uZmlnIGFzIEltcG9ydENvbmZpZ0V4dDtcclxuXHJcbiAgICBpbXBDb25maWcudGVtcEtleU1hcCA9IHRlbXBLZXlNYXA7XHJcbiAgICBjb3JlLndyYXBFeGVjdXRpb24oKCkgPT4ge1xyXG4gICAgICB0aGlzLl9wZW5kaW5nUHVicyA9IFtdO1xyXG4gICAgfSwgKHN0YXRlKSA9PiB7XHJcbiAgICAgIHRoaXMuX3BlbmRpbmdQdWJzIS5mb3JFYWNoKChmbikgPT4gZm4oKSk7XHJcbiAgICAgIHRoaXMuX3BlbmRpbmdQdWJzID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9oYXNDaGFuZ2VzQWN0aW9uICYmIHRoaXMuX2hhc0NoYW5nZXNBY3Rpb24oKTtcclxuICAgIH0sICgpID0+IHtcclxuICAgICAgY29yZS5vYmplY3RGb3JFYWNoKGpzb24uZW50aXR5R3JvdXBNYXAsIChlbnRpdHlUeXBlTmFtZSwganNvbkdyb3VwKSA9PiB7XHJcbiAgICAgICAgbGV0IGVudGl0eVR5cGUgPSB0aGlzLm1ldGFkYXRhU3RvcmUuX2dldFN0cnVjdHVyYWxUeXBlKGVudGl0eVR5cGVOYW1lLCBmYWxzZSkgYXMgRW50aXR5VHlwZTtcclxuICAgICAgICBsZXQgdGFyZ2V0RW50aXR5R3JvdXAgPSBmaW5kT3JDcmVhdGVFbnRpdHlHcm91cCh0aGlzLCBlbnRpdHlUeXBlKTtcclxuICAgICAgICBsZXQgZW50aXRpZXMgPSBpbXBvcnRFbnRpdHlHcm91cCh0YXJnZXRFbnRpdHlHcm91cCwganNvbkdyb3VwLCBpbXBDb25maWcpO1xyXG4gICAgICAgIGlmIChlbnRpdGllcyAmJiBlbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGVudGl0aWVzVG9MaW5rID0gZW50aXRpZXNUb0xpbmsuY29uY2F0KGVudGl0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBlbnRpdGllc1RvTGluay5mb3JFYWNoKChlbnRpdHkpID0+IHtcclxuICAgICAgICBpZiAoIWVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgICAgIHRoaXMuX2xpbmtSZWxhdGVkRW50aXRpZXMoZW50aXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBlbnRpdGllczogZW50aXRpZXNUb0xpbmssXHJcbiAgICAgIHRlbXBLZXlNYXBwaW5nOiB0ZW1wS2V5TWFwXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ2xlYXJzIHRoaXMgRW50aXR5TWFuYWdlcidzIGNhY2hlIGJ1dCBrZWVwcyBhbGwgb3RoZXIgc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGlzXHJcbiAgbWV0aG9kIGlzIG5vdCBhcyBmYXN0IGFzIGNyZWF0aW5nIGEgbmV3IEVudGl0eU1hbmFnZXIgdmlhICduZXcgRW50aXR5TWFuYWdlcicuXHJcbiAgVGhpcyBpcyBiZWNhdXNlIGNsZWFyIGFjdHVhbGx5IGRldGFjaGVzIGFsbCBvZiB0aGUgZW50aXRpZXMgZnJvbSB0aGUgRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICBlbTEuY2xlYXIoKTtcclxuICA+ICAgICAvLyBlbTEgaXMgd2lsbCBub3cgY29udGFpbiBubyBlbnRpdGllcywgYnV0IGFsbCBvdGhlciBzZXR0aW5nIHdpbGwgYmUgbWFpbnRhaW5lZC5cclxuICAqKi9cclxuICBjbGVhcigpIHtcclxuICAgIGNvcmUub2JqZWN0TWFwKHRoaXMuX2VudGl0eUdyb3VwTWFwLCBmdW5jdGlvbiAoa2V5OiBzdHJpbmcsIGVudGl0eUdyb3VwOiBFbnRpdHlHcm91cCkge1xyXG4gICAgICByZXR1cm4gZW50aXR5R3JvdXAuX2NoZWNrT3BlcmF0aW9uKCdjbGVhcicpO1xyXG4gICAgfSkuZm9yRWFjaCgoZW50aXR5R3JvdXA6IEVudGl0eUdyb3VwKSA9PiB7XHJcbiAgICAgIGVudGl0eUdyb3VwLl9jbGVhcigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fZW50aXR5R3JvdXBNYXAgPSB7fTtcclxuICAgIHRoaXMuX3VuYXR0YWNoZWRDaGlsZHJlbk1hcCA9IG5ldyBVbmF0dGFjaGVkQ2hpbGRyZW5NYXAoKTtcclxuICAgIHRoaXMua2V5R2VuZXJhdG9yID0gbmV3IHRoaXMua2V5R2VuZXJhdG9yQ3RvcigpO1xyXG4gICAgdGhpcy5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5DbGVhciB9KTtcclxuICAgIHRoaXMuX3NldEhhc0NoYW5nZXMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhbiBlbXB0eSBjb3B5IG9mIHRoaXMgRW50aXR5TWFuYWdlciBidXQgd2l0aCB0aGUgc2FtZSBEYXRhU2VydmljZSwgTWV0YWRhdGFTdG9yZSwgUXVlcnlPcHRpb25zLCBTYXZlT3B0aW9ucywgVmFsaWRhdGlvbk9wdGlvbnMsIGV0Yy4gXHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgbGV0IGVtMiA9IGVtMS5jcmVhdGVFbXB0eUNvcHkoKTtcclxuICA+ICAgICAvLyBlbTIgaXMgYSBuZXcgRW50aXR5TWFuYWdlciB3aXRoIGFsbCBvZiBlbTEncyBzZXR0aW5nc1xyXG4gID4gICAgIC8vIGJ1dCBubyBlbnRpdGllcy5cclxuICBAcmV0dXJuIEEgbmV3IEVudGl0eU1hbmFnZXIuXHJcbiAgKiovXHJcbiAgY3JlYXRlRW1wdHlDb3B5KCkge1xyXG4gICAgbGV0IGNvcHkgPSBuZXcgRW50aXR5TWFuYWdlcihjb3JlLmV4dGVuZCh7fSwgdGhpcyxcclxuICAgICAgW1wiZGF0YVNlcnZpY2VcIiwgXCJtZXRhZGF0YVN0b3JlXCIsIFwicXVlcnlPcHRpb25zXCIsIFwic2F2ZU9wdGlvbnNcIiwgXCJ2YWxpZGF0aW9uT3B0aW9uc1wiLCBcImtleUdlbmVyYXRvckN0b3JcIl0pKTtcclxuICAgIHJldHVybiBjb3B5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQXR0YWNoZXMgYW4gZW50aXR5IHRvIHRoaXMgRW50aXR5TWFuYWdlciB3aXRoIGFuICBbW0VudGl0eVN0YXRlXV0gb2YgJ0FkZGVkJy5cclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICBsZXQgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgPiAgICAgbGV0IGN1c3QxID0gY3VzdFR5cGUuY3JlYXRlRW50aXR5KCk7XHJcbiAgPiAgICAgZW0xLmFkZEVudGl0eShjdXN0MSk7XHJcblxyXG4gIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIHVzaW5nICdhdHRhY2hFbnRpdHknIHdpdGggYW4gW1tFbnRpdHlTdGF0ZV1dIG9mICdBZGRlZCcuXHJcblxyXG4gID4gICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgIGxldCBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICA+ICAgICBsZXQgY3VzdDEgPSBjdXN0VHlwZS5jcmVhdGVFbnRpdHkoKTtcclxuICA+ICAgICBlbTEuYXR0YWNoRW50aXR5KGN1c3QxLCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gYWRkLlxyXG4gIEByZXR1cm4gVGhlIGFkZGVkIGVudGl0eS5cclxuICAqKi9cclxuICBhZGRFbnRpdHkoZW50aXR5OiBFbnRpdHkpIHtcclxuICAgIHJldHVybiB0aGlzLmF0dGFjaEVudGl0eShlbnRpdHksIEVudGl0eVN0YXRlLkFkZGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEF0dGFjaGVzIGFuIGVudGl0eSB0byB0aGlzIEVudGl0eU1hbmFnZXIgd2l0aCBhIHNwZWNpZmllZCBbW0VudGl0eVN0YXRlXV0uXHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgIGxldCBjdXN0MSA9IGN1c3RUeXBlLmNyZWF0ZUVudGl0eSgpO1xyXG4gID4gICAgIGVtMS5hdHRhY2hFbnRpdHkoY3VzdDEsIEVudGl0eVN0YXRlLkFkZGVkKTtcclxuICBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBhZGQuXHJcbiAgQHBhcmFtIGVudGl0eVN0YXRlIC0gKGRlZmF1bHQ9RW50aXR5U3RhdGUuVW5jaGFuZ2VkKSBUaGUgRW50aXR5U3RhdGUgb2YgdGhlIG5ld2x5IGF0dGFjaGVkIGVudGl0eS4gSWYgb21pdHRlZCB0aGlzIGRlZmF1bHRzIHRvIEVudGl0eVN0YXRlLlVuY2hhbmdlZC5cclxuICBAcGFyYW0gbWVyZ2VTdHJhdGVneSAtIChkZWZhdWx0ID0gTWVyZ2VTdHJhdGVneS5EaXNhbGxvd2VkKSBIb3cgdGhlIHNwZWNpZmllZCBlbnRpdHkgc2hvdWxkIGJlIG1lcmdlZCBpbnRvIHRoZSBFbnRpdHlNYW5hZ2VyIGlmIHRoaXMgRW50aXR5TWFuYWdlciBhbHJlYWR5IGNvbnRhaW5zIGFuIGVudGl0eSB3aXRoIHRoZSBzYW1lIGtleS5cclxuICBAcmV0dXJuIFRoZSBhdHRhY2hlZCBlbnRpdHkuXHJcbiAgKiovXHJcbiAgYXR0YWNoRW50aXR5KGVudGl0eTogRW50aXR5LCBlbnRpdHlTdGF0ZT86IEVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5PzogTWVyZ2VTdHJhdGVneSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5LCBcImVudGl0eVwiKS5pc1JlcXVpcmVkKCkuY2hlY2soKTtcclxuICAgIHRoaXMubWV0YWRhdGFTdG9yZS5fY2hlY2tFbnRpdHlUeXBlKGVudGl0eSk7XHJcbiAgICBsZXQgZXNTeW1ib2wgPSBhc3NlcnRQYXJhbShlbnRpdHlTdGF0ZSwgXCJlbnRpdHlTdGF0ZVwiKS5pc0VudW1PZihFbnRpdHlTdGF0ZSkuaXNPcHRpb25hbCgpLmNoZWNrKEVudGl0eVN0YXRlLlVuY2hhbmdlZCkgYXMgRW50aXR5U3RhdGU7XHJcbiAgICBsZXQgbXNTeW1ib2wgPSBhc3NlcnRQYXJhbShtZXJnZVN0cmF0ZWd5LCBcIm1lcmdlU3RyYXRlZ3lcIikuaXNFbnVtT2YoTWVyZ2VTdHJhdGVneSkuaXNPcHRpb25hbCgpLmNoZWNrKE1lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZCkgYXMgTWVyZ2VTdHJhdGVneTtcclxuXHJcbiAgICBpZiAoZW50aXR5LmVudGl0eVR5cGUubWV0YWRhdGFTdG9yZSAhPT0gdGhpcy5tZXRhZGF0YVN0b3JlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhdHRhY2ggdGhpcyBlbnRpdHkgYmVjYXVzZSB0aGUgRW50aXR5VHlwZSAoXCIgKyBlbnRpdHkuZW50aXR5VHlwZS5uYW1lICtcclxuICAgICAgICBcIikgYW5kIE1ldGFkYXRhU3RvcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50aXR5IGRvZXMgbm90IG1hdGNoIHRoaXMgRW50aXR5TWFuYWdlcidzIE1ldGFkYXRhU3RvcmUuXCIpO1xyXG4gICAgfVxyXG4gICAgbGV0IGFzcGVjdCA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgICBpZiAoYXNwZWN0KSB7XHJcbiAgICAgIC8vIHRvIGF2b2lkIHJlYXR0YWNoaW5nIGFuIGVudGl0eSBpbiBwcm9ncmVzc1xyXG4gICAgICBpZiAoYXNwZWN0Ll9pblByb2Nlc3NFbnRpdHkpIHJldHVybiBhc3BlY3QuX2luUHJvY2Vzc0VudGl0eTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMgb2NjdXIncyB3aGVuIGF0dGFjaGluZyBhbiBlbnRpdHkgY3JlYXRlZCB2aWEgbmV3IGluc3RlYWQgb2YgdmlhIGNyZWF0ZUVudGl0eS5cclxuICAgICAgYXNwZWN0ID0gbmV3IEVudGl0eUFzcGVjdChlbnRpdHkpO1xyXG4gICAgfVxyXG4gICAgbGV0IG1hbmFnZXIgPSBhc3BlY3QuZW50aXR5TWFuYWdlcjtcclxuICAgIGlmIChtYW5hZ2VyKSB7XHJcbiAgICAgIGlmIChtYW5hZ2VyID09PSB0aGlzKSB7XHJcbiAgICAgICAgcmV0dXJuIGVudGl0eTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGVudGl0eSBhbHJlYWR5IGJlbG9uZ3MgdG8gYW5vdGhlciBFbnRpdHlNYW5hZ2VyXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGF0dGFjaGVkRW50aXR5ID0ge30gYXMgRW50aXR5O1xyXG4gICAgY29yZS51c2luZyh0aGlzLCBcImlzTG9hZGluZ1wiLCB0cnVlLCAoKSA9PiB7XHJcbiAgICAgIGlmIChlc1N5bWJvbC5pc0FkZGVkKCkpIHtcclxuICAgICAgICBjaGVja0VudGl0eUtleSh0aGlzLCBlbnRpdHkpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGF0dGFjaGVkRW50aXR5ID09PSBlbnRpdHkgRVhDRVBUIGluIHRoZSBjYXNlIG9mIGEgbWVyZ2UuXHJcbiAgICAgIGF0dGFjaGVkRW50aXR5ID0gdGhpcy5fYXR0YWNoRW50aXR5Q29yZShlbnRpdHksIGVzU3ltYm9sLCBtc1N5bWJvbCk7XHJcbiAgICAgIGFzcGVjdC5faW5Qcm9jZXNzRW50aXR5ID0gYXR0YWNoZWRFbnRpdHk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gZW50aXR5ICggbm90IGF0dGFjaGVkRW50aXR5KSBpcyBkZWxpYmVyYXRlIGhlcmUuXHJcbiAgICAgICAgYXR0YWNoUmVsYXRlZEVudGl0aWVzKHRoaXMsIGVudGl0eSwgZXNTeW1ib2wsIG1zU3ltYm9sKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAvLyBpbnN1cmUgdGhhdCBfaW5Qcm9jZXNzRW50aXR5IGlzIGNsZWFyZWQuXHJcbiAgICAgICAgYXNwZWN0Ll9pblByb2Nlc3NFbnRpdHkgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMudmFsaWRhdGlvbk9wdGlvbnMudmFsaWRhdGVPbkF0dGFjaCkge1xyXG4gICAgICBhdHRhY2hlZEVudGl0eS5lbnRpdHlBc3BlY3QudmFsaWRhdGVFbnRpdHkoKTtcclxuICAgIH1cclxuICAgIGlmICghZXNTeW1ib2wuaXNVbmNoYW5nZWQoKSkge1xyXG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShhdHRhY2hlZEVudGl0eSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eUNoYW5nZWQucHVibGlzaCh7IGVudGl0eUFjdGlvbjogRW50aXR5QWN0aW9uLkF0dGFjaCwgZW50aXR5OiBhdHRhY2hlZEVudGl0eSB9KTtcclxuXHJcbiAgICByZXR1cm4gYXR0YWNoZWRFbnRpdHk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgRGV0YWNoZXMgYW4gZW50aXR5IGZyb20gdGhpcyBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgIC8vIGFzc3VtZSBjdXN0MSBpcyBhIGN1c3RvbWVyIEVudGl0eSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGVtMVxyXG4gID4gICAgIGVtMS5kZXRhY2hFbnRpdHkoY3VzdDEpO1xyXG4gID4gICAgIC8vIGVtMSB3aWxsIG5vdyBubyBsb25nZXIgY29udGFpbiBjdXN0MSBhbmQgY3VzdDEgd2lsbCBoYXZlIGFuXHJcbiAgPiAgICAgLy8gZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlIG9mIEVudGl0eVN0YXRlLkRldGFjaGVkXHJcbiAgQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZGV0YWNoLlxyXG4gIEByZXR1cm4gV2hldGhlciB0aGUgZW50aXR5IGNvdWxkIGJlIGRldGFjaGVkLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGlmIHRoZSBlbnRpdHkgaXMgYWxyZWFkeSBkZXRhY2hlZCBvciB3YXMgbmV2ZXIgYXR0YWNoZWQuXHJcbiAgKiovXHJcbiAgZGV0YWNoRW50aXR5KGVudGl0eTogRW50aXR5KSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdHksIFwiZW50aXR5XCIpLmlzRW50aXR5KCkuY2hlY2soKTtcclxuICAgIGxldCBhc3BlY3QgPSBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gICAgaWYgKCFhc3BlY3QpIHtcclxuICAgICAgLy8gbm8gYXNwZWN0IG1lYW5zIGluIGNvdWxkbid0IGFwcGVhciBpbiBhbnkgZ3JvdXBcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhc3BlY3QuZW50aXR5TWFuYWdlciAhPT0gdGhpcykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGVudGl0eSBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBFbnRpdHlNYW5hZ2VyLlwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhc3BlY3Quc2V0RGV0YWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEZldGNoZXMgdGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgRW50aXR5TWFuYWdlcidzIGN1cnJlbnQgJ3NlcnZpY2VOYW1lJy4gIFRoaXMgY2FsbFxyXG4gIG9jY3VycyBpbnRlcm5hbGx5IGJlZm9yZSB0aGUgZmlyc3QgcXVlcnkgdG8gYW55IHNlcnZpY2UgaWYgdGhlIG1ldGFkYXRhIGhhc24ndCBhbHJlYWR5IGJlZW5cclxuICBsb2FkZWQuIF9fQXN5bmNfX1xyXG5cclxuICBVc3VhbGx5IHlvdSB3aWxsIG5vdCBhY3R1YWxseSBwcm9jZXNzIHRoZSByZXN1bHRzIG9mIGEgZmV0Y2hNZXRhZGF0YSBjYWxsIGRpcmVjdGx5LCBidXQgd2lsbCBpbnN0ZWFkXHJcbiAgYXNrIGZvciB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgRW50aXR5TWFuYWdlciBhZnRlciB0aGUgZmV0Y2hNZXRhZGF0YSBjYWxsIHJldHVybnMuXHJcbiAgPiAgICAgbGV0IGVtMSA9IG5ldyBFbnRpdHlNYW5hZ2VyKCBcImJyZWV6ZS9Ob3J0aHdpbmRJQk1vZGVsXCIpO1xyXG4gID4gICAgIGVtMS5mZXRjaE1ldGFkYXRhKClcclxuICA+ICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xyXG4gID4gICAgICAgICAgIGxldCBtZXRhZGF0YVN0b3JlID0gZW0xLm1ldGFkYXRhU3RvcmU7XHJcbiAgPiAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIG1ldGFkYXRhXHJcbiAgPiAgICAgICB9KS5jYXRjaChmdW5jdGlvbihleGNlcHRpb24pIHtcclxuICA+ICAgICAgICAgICAvLyBoYW5kbGUgZXhjZXB0aW9uIGhlcmVcclxuICA+ICAgICAgIH0pO1xyXG4gIFxyXG4gIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIGNhbGxlZCBvbiBzdWNjZXNzLlxyXG4gIEBwYXJhbSBlcnJvckNhbGxiYWNrIC0gRnVuY3Rpb24gY2FsbGVkIG9uIGZhaWx1cmUuXHJcbiAgQHJldHVybiB7UHJvbWlzZX1cclxuICAgIC0gc2NoZW1hIHtPYmplY3R9IFRoZSByYXcgU2NoZW1hIG9iamVjdCBmcm9tIG1ldGFkYXRhIHByb3ZpZGVyIC0gQmVjYXVzZSB0aGlzIHNjaGVtYSB3aWxsIGRpZmZlciBkZXBlbmRpbmcgb24gdGhlIG1ldGFkYXRhIHByb3ZpZGVyXHJcbiAgICAgICAgaXQgaXMgdXN1YWxseSBiZXR0ZXIgdG8gYWNjZXNzIG1ldGFkYXRhIHZpYSB0aGUgJ21ldGFkYXRhU3RvcmUnIHByb3BlcnR5IG9mIHRoZSBFbnRpdHlNYW5hZ2VyIGluc3RlYWQgb2YgdXNpbmcgdGhpcyAncmF3JyBkYXRhLlxyXG4gICoqL1xyXG4gIGZldGNoTWV0YWRhdGEoZGF0YVNlcnZpY2U/OiBEYXRhU2VydmljZSwgY2FsbGJhY2s/OiBDYWxsYmFjaywgZXJyb3JDYWxsYmFjaz86IEVycm9yQ2FsbGJhY2spIHtcclxuICAgIGlmICh0eXBlb2YgKGRhdGFTZXJ2aWNlKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIC8vIGxlZ2FjeSBzdXBwb3J0IGZvciB3aGVuIGRhdGFTZXJ2aWNlIHdhcyBub3QgYW4gYXJnLiBpLmUuIGZpcnN0IGFyZyB3YXMgY2FsbGJhY2tcclxuICAgICAgZXJyb3JDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICBjYWxsYmFjayA9IGRhdGFTZXJ2aWNlO1xyXG4gICAgICBkYXRhU2VydmljZSA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFzc2VydFBhcmFtKGRhdGFTZXJ2aWNlLCBcImRhdGFTZXJ2aWNlXCIpLmlzSW5zdGFuY2VPZihEYXRhU2VydmljZSkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICAgIGFzc2VydFBhcmFtKGNhbGxiYWNrLCBcImNhbGxiYWNrXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgICAgYXNzZXJ0UGFyYW0oZXJyb3JDYWxsYmFjaywgXCJlcnJvckNhbGxiYWNrXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMubWV0YWRhdGFTdG9yZS5mZXRjaE1ldGFkYXRhKGRhdGFTZXJ2aWNlIHx8IHRoaXMuZGF0YVNlcnZpY2UpO1xyXG4gICAgcmV0dXJuIHByb21pc2VXaXRoQ2FsbGJhY2tzKHByb21pc2UsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcclxuICB9XHJcblxyXG5cclxuICBleGVjdXRlUXVlcnkocXVlcnk6IHN0cmluZywgY2FsbGJhY2s/OiBRdWVyeVN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaz86IFF1ZXJ5RXJyb3JDYWxsYmFjayk6IFByb21pc2U8UXVlcnlSZXN1bHQ+O1xyXG4gIGV4ZWN1dGVRdWVyeShxdWVyeTogRW50aXR5UXVlcnksIGNhbGxiYWNrPzogUXVlcnlTdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBRdWVyeUVycm9yQ2FsbGJhY2spOiBQcm9taXNlPFF1ZXJ5UmVzdWx0PjtcclxuICAvKipcclxuICBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIHF1ZXJ5LiBfX0FzeW5jX18gXHJcbiAgXHJcbiAgPiAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKTtcclxuICA+ICAgICBlbS5leGVjdXRlUXVlcnkocXVlcnkpLnRoZW4oIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgbGV0IG9yZGVycyA9IGRhdGEucmVzdWx0cztcclxuICA+ICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICB9KS5jYXRjaCggZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgfSk7XHJcblxyXG4gIG9yIHdpdGggY2FsbGJhY2tzXHJcbiAgPiAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKTtcclxuICA+ICAgICBlbS5leGVjdXRlUXVlcnkocXVlcnksXHJcbiAgPiAgICAgICAgIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgICAgIGxldCBvcmRlcnMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgPiAgICAgICAgICAgICAuLi4gcXVlcnkgcmVzdWx0cyBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICAgICB9LFxyXG4gID4gICAgICAgICBmdW5jdGlvbihlcnIpIHtcclxuICA+ICAgICAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgICAgIH0pO1xyXG5cclxuICBFaXRoZXIgd2F5IHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgdGhlIFRoZSBbW0VudGl0eVF1ZXJ5XV0gJ2V4ZWN1dGUnIG1ldGhvZC5cclxuICA+ICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpLnVzaW5nKGVtKTtcclxuICA+ICAgICBxdWVyeS5leGVjdXRlKCkudGhlbiggZnVuY3Rpb24oZGF0YSkge1xyXG4gID4gICAgICAgICBsZXQgb3JkZXJzID0gZGF0YS5yZXN1bHRzO1xyXG4gID4gICAgICAgICAuLi4gcXVlcnkgcmVzdWx0cyBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgIH0pLmNhdGNoKCBmdW5jdGlvbihlcnIpIHtcclxuICA+ICAgICAgICAgLi4uIHF1ZXJ5IGZhaWx1cmUgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICB9KTtcclxuICBAcGFyYW0gcXVlcnkgLSBUaGUgW1tFbnRpdHlRdWVyeV1dIG9yIE9EYXRhIHF1ZXJ5IHN0cmluZyB0byBleGVjdXRlLlxyXG4gIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIGNhbGxlZCBvbiBzdWNjZXNzLlxyXG4gIEBwYXJhbSBlcnJvckNhbGxiYWNrIC0ge0Z1bmN0aW9ufSBGdW5jdGlvbiBjYWxsZWQgb24gZmFpbHVyZS5cclxuICBAcmV0dXJuIFByb21pc2Ugb2YgXHJcbiAgICAtIHJlc3VsdHMgLSBBbiBhcnJheSBvZiBlbnRpdGllc1xyXG4gICAgLSByZXRyaWV2ZWRFbnRpdGllcyAtIEEgYXJyYXkgb2YgYWxsIG9mIHRoZSBlbnRpdGllcyByZXR1cm5lZCBieSB0aGUgcXVlcnkuICBEaWZmZXJzIGZyb20gcmVzdWx0cyAoYWJvdmUpIHdoZW4gLmV4cGFuZCgpIGlzIHVzZWQuXHJcbiAgICAtIHF1ZXJ5IC0gVGhlIG9yaWdpbmFsIFtbRW50aXR5UXVlcnldXSBvciBxdWVyeSBzdHJpbmdcclxuICAgIC0gZW50aXR5TWFuYWdlciAtICBUaGUgRW50aXR5TWFuYWdlci5cclxuICAgIC0gaHR0cFJlc3BvbnNlIC0gVGhlIFtbSUh0dHBSZXNwb25zZV1dIHJldHVybmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgIC0gaW5saW5lQ291bnQgLSAgT25seSBhdmFpbGFibGUgaWYgJ2lubGluZUNvdW50KHRydWUpJyB3YXMgYXBwbGllZCB0byB0aGUgcXVlcnkuICBSZXR1cm5zIHRoZSBjb3VudCBvZlxyXG4gICAgaXRlbXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5IGJlZm9yZSBhcHBseWluZyBhbnkgc2tpcCBvciB0YWtlIG9wZXJhdG9ycywgYnV0IGFmdGVyIGFueSBmaWx0ZXIvd2hlcmUgcHJlZGljYXRlc1xyXG4gICAgd291bGQgaGF2ZSBiZWVuIGFwcGxpZWQuXHJcbiAgKiovXHJcbiAgZXhlY3V0ZVF1ZXJ5KHF1ZXJ5OiBFbnRpdHlRdWVyeSB8IHN0cmluZywgY2FsbGJhY2s/OiBRdWVyeVN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaz86IFF1ZXJ5RXJyb3JDYWxsYmFjaykge1xyXG4gICAgYXNzZXJ0UGFyYW0ocXVlcnksIFwicXVlcnlcIikuaXNJbnN0YW5jZU9mKEVudGl0eVF1ZXJ5KS5vcigpLmlzU3RyaW5nKCkuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKGNhbGxiYWNrLCBcImNhbGxiYWNrXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKGVycm9yQ2FsbGJhY2ssIFwiZXJyb3JDYWxsYmFja1wiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBsZXQgcHJvbWlzZTogUHJvbWlzZTxhbnk+O1xyXG4gICAgLy8gJ3Jlc29sdmUnIG1ldGhvZHMgY3JlYXRlIGEgbmV3IHR5cGVkIG9iamVjdCB3aXRoIGFsbCBvZiBpdHMgcHJvcGVydGllcyBmdWxseSByZXNvbHZlZCBhZ2FpbnN0IGEgbGlzdCBvZiBzb3VyY2VzLlxyXG4gICAgLy8gVGhvdWdodCBhYm91dCBjcmVhdGluZyBhICdub3JtYWxpemVkJyBxdWVyeSB3aXRoIHRoZXNlICdyZXNvbHZlZCcgb2JqZWN0c1xyXG4gICAgLy8gYnV0IGRlY2lkZWQgbm90IHRvIGJlY2F1c2UgdGhlICdxdWVyeScgbWF5IG5vdCBiZSBhbiBFbnRpdHlRdWVyeSAoaXQgY2FuIGJlIGEgc3RyaW5nKSBhbmQgaGVuY2UgbWlnaHQgbm90IGhhdmUgYSBxdWVyeU9wdGlvbnMgb3IgZGF0YVNlcnZpY2VzIHByb3BlcnR5IG9uIGl0LlxyXG4gICAgbGV0IHF1ZXJ5T3B0aW9ucyA9IFF1ZXJ5T3B0aW9ucy5yZXNvbHZlKFsocXVlcnkgYXMgYW55KS5xdWVyeU9wdGlvbnMsIHRoaXMucXVlcnlPcHRpb25zLCBRdWVyeU9wdGlvbnMuZGVmYXVsdEluc3RhbmNlXSk7XHJcbiAgICBsZXQgZGF0YVNlcnZpY2UgPSBEYXRhU2VydmljZS5yZXNvbHZlKFsocXVlcnkgYXMgYW55KS5kYXRhU2VydmljZSEsIHRoaXMuZGF0YVNlcnZpY2VdKTtcclxuXHJcbiAgICBpZiAoKCFkYXRhU2VydmljZS5oYXNTZXJ2ZXJNZXRhZGF0YSkgfHwgdGhpcy5tZXRhZGF0YVN0b3JlLmhhc01ldGFkYXRhRm9yKGRhdGFTZXJ2aWNlLnNlcnZpY2VOYW1lKSkge1xyXG4gICAgICBwcm9taXNlID0gZXhlY3V0ZVF1ZXJ5Q29yZSh0aGlzLCBxdWVyeSwgcXVlcnlPcHRpb25zLCBkYXRhU2VydmljZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9taXNlID0gdGhpcy5mZXRjaE1ldGFkYXRhKGRhdGFTZXJ2aWNlKS50aGVuKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gZXhlY3V0ZVF1ZXJ5Q29yZSh0aGlzLCBxdWVyeSwgcXVlcnlPcHRpb25zLCBkYXRhU2VydmljZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwcm9taXNlV2l0aENhbGxiYWNrcyhwcm9taXNlLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayBhcyBFcnJvckNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgcXVlcnkgYWdhaW5zdCB0aGlzIEVudGl0eU1hbmFnZXIncyBsb2NhbCBjYWNoZS5cclxuXHJcbiAgQmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSB0aGVyZSBpcyBubyBuZWVkIGZvciBhIHByb21pc2Ugb3IgYSBjYWxsYmFja1xyXG4gID4gICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIik7XHJcbiAgPiAgICAgbGV0IG9yZGVycyA9IGVtLmV4ZWN1dGVRdWVyeUxvY2FsbHkocXVlcnkpO1xyXG5cclxuICBOb3RlIHRoYXQgdGhpcyBjYW4gYWxzbyBiZSBhY2NvbXBsaXNoZWQgdXNpbmcgdGhlICdleGVjdXRlUXVlcnknIG1ldGhvZCB3aXRoXHJcbiAgYSBGZXRjaFN0cmF0ZWd5IG9mIEZyb21Mb2NhbENhY2hlIGFuZCBtYWtpbmcgdXNlIG9mIHRoZSBQcm9taXNlIG9yIGNhbGxiYWNrXHJcbiAgPiAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKS51c2luZyhGZXRjaFN0cmF0ZWd5LkZyb21Mb2NhbENhY2hlKTtcclxuICA+ICAgICBlbS5leGVjdXRlUXVlcnkocXVlcnkpLnRoZW4oIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgbGV0IG9yZGVycyA9IGRhdGEucmVzdWx0cztcclxuICA+ICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICB9KS5jYXRjaCggZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgfSk7XHJcbiAgQHBhcmFtIHF1ZXJ5IC0gVGhlIFtbRW50aXR5UXVlcnldXSB0byBleGVjdXRlLlxyXG4gIEByZXR1cm4gIHtBcnJheSBvZiBFbnRpdHl9ICBBcnJheSBvZiBlbnRpdGllcyBmcm9tIGNhY2hlIHRoYXQgc2F0aXNmeSB0aGUgcXVlcnlcclxuICAqKi9cclxuICBleGVjdXRlUXVlcnlMb2NhbGx5KHF1ZXJ5OiBFbnRpdHlRdWVyeSkge1xyXG4gICAgcmV0dXJuIGV4ZWN1dGVRdWVyeUxvY2FsbHlDb3JlKHRoaXMsIHF1ZXJ5KS5yZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgU2F2ZXMgZWl0aGVyIGEgbGlzdCBvZiBzcGVjaWZpZWQgZW50aXRpZXMgb3IgYWxsIGNoYW5nZWQgZW50aXRpZXMgd2l0aGluIHRoaXMgRW50aXR5TWFuYWdlci4gSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gYW55IG9mIHRoZSBlbnRpdGllc1xyXG4gIHNwZWNpZmllZCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gc2VydmVyIHNpZGUgY2FsbCBtYWRlIGJ1dCBhIHZhbGlkICdlbXB0eScgc2F2ZVJlc3VsdCB3aWxsIHN0aWxsIGJlIHJldHVybmVkLiBfX0FzeW5jX19cclxuXHJcbiAgT2Z0ZW4gd2Ugd2lsbCBiZSBzYXZpbmcgYWxsIG9mIHRoZSBlbnRpdGllcyB3aXRoaW4gYW4gRW50aXR5TWFuYWdlciB0aGF0IGFyZSBlaXRoZXIgYWRkZWQsIG1vZGlmaWVkIG9yIGRlbGV0ZWRcclxuICBhbmQgd2Ugd2lsbCBsZXQgdGhlICdzYXZlQ2hhbmdlcycgY2FsbCBkZXRlcm1pbmUgd2hpY2ggZW50aXRpZXMgdGhlc2UgYXJlLlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgLy8gVGhpcyBjb3VsZCBpbmNsdWRlIGFkZGVkLCBtb2RpZmllZCBhbmQgZGVsZXRlZCBlbnRpdGllcy5cclxuICA+ICAgICAgZW0uc2F2ZUNoYW5nZXMoKS50aGVuKGZ1bmN0aW9uKHNhdmVSZXN1bHQpIHtcclxuICA+ICAgICAgICAgIGxldCBzYXZlZEVudGl0aWVzID0gc2F2ZVJlc3VsdC5lbnRpdGllcztcclxuICA+ICAgICAgICAgIGxldCBrZXlNYXBwaW5ncyA9IHNhdmVSZXN1bHQua2V5TWFwcGluZ3M7XHJcbiAgPiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgPiAgICAgICAgICAvLyBlIGlzIGFueSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duLlxyXG4gID4gICAgICB9KTtcclxuXHJcbiAgQnV0IHdlIGNhbiBhbHNvIGNvbnRyb2wgZXhhY3RseSB3aGljaCBlbnRpdGllcyB0byBzYXZlIGFuZCBjYW4gc3BlY2lmeSBzcGVjaWZpYyBTYXZlT3B0aW9uc1xyXG5cclxuICA+ICAgICAgLy8gYXNzdW1lIGVudGl0aWVzVG9TYXZlIGlzIGFuIGFycmF5IG9mIGVudGl0aWVzIHRvIHNhdmUuXHJcbiAgPiAgICAgIGxldCBzYXZlT3B0aW9ucyA9IG5ldyBTYXZlT3B0aW9ucyh7IGFsbG93Q29uY3VycmVudFNhdmVzOiB0cnVlIH0pO1xyXG4gID4gICAgICBlbS5zYXZlQ2hhbmdlcyhlbnRpdGllc1RvU2F2ZSwgc2F2ZU9wdGlvbnMpLnRoZW4oZnVuY3Rpb24oc2F2ZVJlc3VsdCkge1xyXG4gID4gICAgICAgICAgbGV0IHNhdmVkRW50aXRpZXMgPSBzYXZlUmVzdWx0LmVudGl0aWVzO1xyXG4gID4gICAgICAgICAgbGV0IGtleU1hcHBpbmdzID0gc2F2ZVJlc3VsdC5rZXlNYXBwaW5ncztcclxuICA+ICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcclxuICA+ICAgICAgICAgIC8vIGUgaXMgYW55IGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24uXHJcbiAgPiAgICAgIH0pO1xyXG5cclxuICBDYWxsYmFjayBtZXRob2RzIGNhbiBhbHNvIGJlIHVzZWRcclxuICA+ICAgICAgZW0uc2F2ZUNoYW5nZXMoZW50aXRpZXNUb1NhdmUsIG51bGwsXHJcbiAgPiAgICAgICAgICBmdW5jdGlvbihzYXZlUmVzdWx0KSB7XHJcbiAgPiAgICAgICAgICAgICAgbGV0IHNhdmVkRW50aXRpZXMgPSBzYXZlUmVzdWx0LmVudGl0aWVzO1xyXG4gID4gICAgICAgICAgICAgIGxldCBrZXlNYXBwaW5ncyA9IHNhdmVSZXN1bHQua2V5TWFwcGluZ3M7XHJcbiAgPiAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xyXG4gID4gICAgICAgICAgICAgIC8vIGUgaXMgYW55IGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24uXHJcbiAgPiAgICAgICAgICB9XHJcbiAgPiAgICAgICk7XHJcblxyXG4gIEBwYXJhbSBlbnRpdGllcyAtIFRoZSBsaXN0IG9mIGVudGl0aWVzIHRvIHNhdmUuXHJcbiAgRXZlcnkgZW50aXR5IGluIHRoYXQgbGlzdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlciwgd2hldGhlciBjaGFuZ2VkIG9yIHVuY2hhbmdlZCxcclxuICBhcyBsb25nIGFzIGl0IGlzIGF0dGFjaGVkIHRvIHRoaXMgRW50aXR5TWFuYWdlci5cclxuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBudWxsIG9yIGVtcHR5ICh0aGUgdXN1YWwgY2FzZSksXHJcbiAgZXZlcnkgZW50aXR5IHdpdGggcGVuZGluZyBjaGFuZ2VzIGluIHRoaXMgRW50aXR5TWFuYWdlciB3aWxsIGJlIHNhdmVkLlxyXG4gIEBwYXJhbSBzYXZlT3B0aW9ucyAtIFtbU2F2ZU9wdGlvbnNdXSBmb3IgdGhlIHNhdmUgLSB3aWxsIGRlZmF1bHQgdG9cclxuICBbW0VudGl0eU1hbmFnZXIuc2F2ZU9wdGlvbnNdXSBpZiBudWxsLlxyXG4gIEBwYXJhbSBjYWxsYmFjayAtICBGdW5jdGlvbiBjYWxsZWQgb24gc3VjY2Vzcy5cclxuICBAcGFyYW0gZXJyb3JDYWxsYmFjayAtIEZ1bmN0aW9uIGNhbGxlZCBvbiBmYWlsdXJlLlxyXG4gIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2VcclxuICAqKi9cclxuICBzYXZlQ2hhbmdlcyhlbnRpdGllcz86IEVudGl0eVtdIHwgbnVsbCwgc2F2ZU9wdGlvbnM/OiBTYXZlT3B0aW9ucywgY2FsbGJhY2s/OiBGdW5jdGlvbiwgZXJyb3JDYWxsYmFjaz86IEZ1bmN0aW9uKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdGllcywgXCJlbnRpdGllc1wiKS5pc09wdGlvbmFsKCkuaXNBcnJheSgpLmlzRW50aXR5KCkuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKHNhdmVPcHRpb25zLCBcInNhdmVPcHRpb25zXCIpLmlzSW5zdGFuY2VPZihTYXZlT3B0aW9ucykuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShjYWxsYmFjaywgXCJjYWxsYmFja1wiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShlcnJvckNhbGxiYWNrLCBcImVycm9yQ2FsbGJhY2tcIikuaXNGdW5jdGlvbigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG5cclxuICAgIHNhdmVPcHRpb25zID0gc2F2ZU9wdGlvbnMgfHwgdGhpcy5zYXZlT3B0aW9ucyB8fCBTYXZlT3B0aW9ucy5kZWZhdWx0SW5zdGFuY2U7XHJcblxyXG4gICAgbGV0IGVudGl0aWVzVG9TYXZlID0gZ2V0RW50aXRpZXNUb1NhdmUodGhpcywgZW50aXRpZXMgPyBlbnRpdGllcyA6IHVuZGVmaW5lZCk7XHJcblxyXG4gICAgaWYgKGVudGl0aWVzVG9TYXZlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0geyBlbnRpdGllczogW10sIGtleU1hcHBpbmdzOiBbXSB9IGFzIFNhdmVSZXN1bHQ7XHJcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2socmVzdWx0KTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc2F2ZU9wdGlvbnMuYWxsb3dDb25jdXJyZW50U2F2ZXMpIHtcclxuICAgICAgbGV0IGFueVBlbmRpbmdTYXZlcyA9IGVudGl0aWVzVG9TYXZlLnNvbWUoZnVuY3Rpb24gKGVudGl0eSkge1xyXG4gICAgICAgIHJldHVybiBlbnRpdHkuZW50aXR5QXNwZWN0LmlzQmVpbmdTYXZlZDtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChhbnlQZW5kaW5nU2F2ZXMpIHtcclxuICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKFwiQ29uY3VycmVudCBzYXZlcyBub3QgYWxsb3dlZCAtIFNhdmVPcHRpb25zLmFsbG93Q29uY3VycmVudFNhdmVzIGlzIGZhbHNlXCIpO1xyXG4gICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhclNlcnZlckVycm9ycyhlbnRpdGllc1RvU2F2ZSk7XHJcblxyXG4gICAgbGV0IHZhbEVycm9yID0gdGhpcy5zYXZlQ2hhbmdlc1ZhbGlkYXRlT25DbGllbnQoZW50aXRpZXNUb1NhdmUpO1xyXG4gICAgaWYgKHZhbEVycm9yKSB7XHJcbiAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKHZhbEVycm9yKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHZhbEVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YVNlcnZpY2UgPSBEYXRhU2VydmljZS5yZXNvbHZlKFtzYXZlT3B0aW9ucy5kYXRhU2VydmljZSwgdGhpcy5kYXRhU2VydmljZV0pO1xyXG4gICAgbGV0IHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCA9IHtcclxuICAgICAgZW50aXR5TWFuYWdlcjogdGhpcyxcclxuICAgICAgZGF0YVNlcnZpY2U6IGRhdGFTZXJ2aWNlLFxyXG4gICAgICBwcm9jZXNzU2F2ZWRFbnRpdGllczogcHJvY2Vzc1NhdmVkRW50aXRpZXMsXHJcbiAgICAgIHJlc291cmNlTmFtZTogc2F2ZU9wdGlvbnMucmVzb3VyY2VOYW1lIHx8IHRoaXMuc2F2ZU9wdGlvbnMucmVzb3VyY2VOYW1lIHx8IFwiU2F2ZUNoYW5nZXNcIlxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIHRoYXQgaWYgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCBzYXZlIHRoYXQgYWxsIGVudGl0aWVzIHdob3NlIHRlbXAga2V5c1xyXG4gICAgLy8gYXJlIHJlZmVyZW5jZWQgYXJlIGFsc28gaW4gdGhlIHBhcnRpYWwgc2F2ZSBncm91cFxyXG5cclxuICAgIGxldCBzYXZlQnVuZGxlID0geyBlbnRpdGllczogZW50aXRpZXNUb1NhdmUsIHNhdmVPcHRpb25zOiBzYXZlT3B0aW9ucyB9O1xyXG5cclxuXHJcbiAgICB0cnkgeyAvLyBHdWFyZCBhZ2FpbnN0IGV4Y2VwdGlvbiB0aHJvd24gaW4gZGF0YXNlcnZpY2UgYWRhcHRlciBiZWZvcmUgaXQgZ29lcyBhc3luY1xyXG4gICAgICB1cGRhdGVDb25jdXJyZW5jeVByb3BlcnRpZXMoZW50aXRpZXNUb1NhdmUpO1xyXG4gICAgICByZXR1cm4gZGF0YVNlcnZpY2UuYWRhcHRlckluc3RhbmNlIS5zYXZlQ2hhbmdlcyhzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSlcclxuICAgICAgICAudGhlbihzYXZlU3VjY2VzcykudGhlbigocikgPT4gciwgc2F2ZUZhaWwpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIC8vIHVuZG8gdGhlIG1hcmtpbmcgYnkgdXBkYXRlQ29uY3VycmVuY3lQcm9wZXJ0aWVzXHJcbiAgICAgIG1hcmtJc0JlaW5nU2F2ZWQoZW50aXRpZXNUb1NhdmUsIGZhbHNlKTtcclxuICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soZXJyKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2F2ZVN1Y2Nlc3Moc2F2ZVJlc3VsdDogU2F2ZVJlc3VsdCkge1xyXG4gICAgICBsZXQgZW0gPSBzYXZlQ29udGV4dC5lbnRpdHlNYW5hZ2VyO1xyXG4gICAgICBtYXJrSXNCZWluZ1NhdmVkKGVudGl0aWVzVG9TYXZlLCBmYWxzZSk7XHJcbiAgICAgIGxldCBzYXZlZEVudGl0aWVzID0gc2F2ZUNvbnRleHQucHJvY2Vzc1NhdmVkRW50aXRpZXMoc2F2ZVJlc3VsdCk7XHJcbiAgICAgIHNhdmVSZXN1bHQuZW50aXRpZXMgPSBzYXZlZEVudGl0aWVzO1xyXG5cclxuICAgICAgLy8gdXBkYXRlIF9oYXNDaGFuZ2VzIGFmdGVyIHNhdmUuXHJcbiAgICAgIGVtLl9zZXRIYXNDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAvLyBjYW4ndCBkbyB0aGlzIGFueW1vcmUgYmVjYXVzZSBvdGhlciBjaGFuZ2VzIG1pZ2h0IGhhdmUgYmVlbiBtYWRlIHdoaWxlIHNhdmVkIGVudGl0aWVzIGluIGZsaWdodC5cclxuICAgICAgLy8gICAgICBsZXQgaGFzQ2hhbmdlcyA9IChpc0Z1bGxTYXZlICYmIGhhdmVTYW1lQ29udGVudHMoZW50aXRpZXNUb1NhdmUsIHNhdmVkRW50aXRpZXMpKSA/IGZhbHNlIDogbnVsbDtcclxuICAgICAgLy8gICAgICBlbS5fc2V0SGFzQ2hhbmdlcyhoYXNDaGFuZ2VzKTtcclxuXHJcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soc2F2ZVJlc3VsdCk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc2F2ZVJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1NhdmVkRW50aXRpZXMoc2F2ZVJlc3VsdDogU2F2ZVJlc3VsdCkge1xyXG4gICAgICBsZXQgc2F2ZWRFbnRpdGllcyA9IHNhdmVSZXN1bHQuZW50aXRpZXM7XHJcbiAgICAgIGxldCBkZWxldGVkS2V5cyA9IHNhdmVSZXN1bHQuZGVsZXRlZEtleXMgfHwgW107XHJcbiAgICAgIGlmIChzYXZlZEVudGl0aWVzLmxlbmd0aCA9PT0gMCAmJiBkZWxldGVkS2V5cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGtleU1hcHBpbmdzID0gc2F2ZVJlc3VsdC5rZXlNYXBwaW5ncztcclxuICAgICAgbGV0IGVtID0gc2F2ZUNvbnRleHQuZW50aXR5TWFuYWdlcjtcclxuXHJcbiAgICAgIC8vIG11c3Qgb2NjdXIgb3V0c2lkZSBvZiBpc0xvYWRpbmcgYmxvY2tcclxuICAgICAgZml4dXBLZXlzKGVtLCBrZXlNYXBwaW5ncyk7XHJcblxyXG4gICAgICBjb3JlLnVzaW5nKGVtLCBcImlzTG9hZGluZ1wiLCB0cnVlLCAoKSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBtYXBwaW5nQ29udGV4dCA9IG5ldyBNYXBwaW5nQ29udGV4dCh7XHJcbiAgICAgICAgICBxdWVyeTogdW5kZWZpbmVkLCAvLyB0ZWxscyB2aXNpdEFuZE1lcmdlIHRoaXMgaXMgYSBzYXZlIGluc3RlYWQgb2YgYSBxdWVyeVxyXG4gICAgICAgICAgZW50aXR5TWFuYWdlcjogZW0sXHJcbiAgICAgICAgICBtZXJnZU9wdGlvbnM6IHsgbWVyZ2VTdHJhdGVneTogTWVyZ2VTdHJhdGVneS5PdmVyd3JpdGVDaGFuZ2VzIH0sXHJcbiAgICAgICAgICBkYXRhU2VydmljZTogZGF0YVNlcnZpY2VcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gVGhlIHZpc2l0QW5kTWVyZ2Ugb3BlcmF0aW9uIGhhcyBiZWVuIG9wdGltaXplZCBzbyB0aGF0IHdlIGRvIG5vdCBhY3R1YWxseSBwZXJmb3JtIGEgbWVyZ2UgaWYgdGhlXHJcbiAgICAgICAgLy8gdGhlIHNhdmUgb3BlcmF0aW9uIGRpZCBub3QgYWN0dWFsbHkgcmV0dXJuIHRoZSBlbnRpdHkgLSBpLmUuIGR1cmluZyBPRGF0YSBhbmQgTW9uZ28gdXBkYXRlcyBhbmQgZGVsZXRlcy5cclxuICAgICAgICBzYXZlZEVudGl0aWVzID0gbWFwcGluZ0NvbnRleHQudmlzaXRBbmRNZXJnZShzYXZlZEVudGl0aWVzLCB7IG5vZGVUeXBlOiBcInJvb3RcIiB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBkZXRhY2ggYW55IGVudGl0aWVzIGZvdW5kIGluIHRoZSBlbSB0aGF0IGFwcGVhciBpbiB0aGUgZGVsZXRlZEtleXMgbGlzdC4gXHJcbiAgICAgIGRlbGV0ZWRLZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBsZXQgZW50aXR5VHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuX2dldFN0cnVjdHVyYWxUeXBlKGtleS5lbnRpdHlUeXBlTmFtZSkgYXMgRW50aXR5VHlwZTtcclxuICAgICAgICBsZXQgZWtleSA9IG5ldyBFbnRpdHlLZXkoZW50aXR5VHlwZSwga2V5LmtleVZhbHVlcyk7XHJcbiAgICAgICAgbGV0IGVudGl0eSA9IGVtLmdldEVudGl0eUJ5S2V5KGVrZXkpO1xyXG4gICAgICAgIGlmIChlbnRpdHkpIHtcclxuICAgICAgICAgIGVudGl0eS5lbnRpdHlBc3BlY3Quc2V0RGV0YWNoZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHNhdmVkRW50aXRpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2F2ZUZhaWwoc2VydmVyRXJyb3I6IFNhdmVFcnJvckZyb21TZXJ2ZXIpIHtcclxuICAgICAgbWFya0lzQmVpbmdTYXZlZChlbnRpdGllc1RvU2F2ZSwgZmFsc2UpO1xyXG4gICAgICBsZXQgY2xpZW50RXJyb3IgPSBwcm9jZXNzU2VydmVyRXJyb3JzKHNhdmVDb250ZXh0LCBzZXJ2ZXJFcnJvcik7XHJcbiAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKGNsaWVudEVycm9yKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGNsaWVudEVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJ1biB0aGUgXCJzYXZlQ2hhbmdlc1wiIHByZS1zYXZlIGNsaWVudCB2YWxpZGF0aW9uIGxvZ2ljLlxyXG4gIFxyXG4gIFRoaXMgaXMgTk9UIGEgZ2VuZXJhbCBwdXJwb3NlIHZhbGlkYXRpb24gbWV0aG9kLlxyXG4gIEl0IGlzIGludGVuZGVkIGZvciB1dGlsaXRpZXMgdGhhdCBtdXN0IGtub3cgaWYgc2F2ZUNoYW5nZXNcclxuICB3b3VsZCByZWplY3QgdGhlIHNhdmUgZHVlIHRvIGNsaWVudCB2YWxpZGF0aW9uIGVycm9ycy5cclxuICBcclxuICBJdCBvbmx5IHZhbGlkYXRlcyBlbnRpdGllcyBpZiB0aGUgRW50aXR5TWFuYWdlcidzXHJcbiAgW1tWYWxpZGF0aW9uT3B0aW9uc11dLnZhbGlkYXRlT25TYXZlIGlzIHRydWUuXHJcbiAgXHJcbiAgQHBhcmFtIGVudGl0aWVzVG9TYXZlIHtBcnJheSBvZiBFbnRpdHl9IFRoZSBsaXN0IG9mIGVudGl0aWVzIHRvIHNhdmUgKHRvIHZhbGlkYXRlKS5cclxuICBAcmV0dXJuIHtFcnJvcn0gVmFsaWRhdGlvbiBlcnJvciBvciBudWxsIGlmIG5vIGVycm9yXHJcbiAgKiovXHJcbiAgc2F2ZUNoYW5nZXNWYWxpZGF0ZU9uQ2xpZW50KGVudGl0aWVzVG9TYXZlOiBFbnRpdHlbXSkge1xyXG5cclxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25PcHRpb25zLnZhbGlkYXRlT25TYXZlKSB7XHJcbiAgICAgIGxldCBmYWlsZWRFbnRpdGllcyA9IGVudGl0aWVzVG9TYXZlLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5KSB7XHJcbiAgICAgICAgbGV0IGFzcGVjdCA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgICAgICAgbGV0IGlzVmFsaWQgPSBhc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkgfHwgYXNwZWN0LnZhbGlkYXRlRW50aXR5KCk7XHJcbiAgICAgICAgcmV0dXJuICFpc1ZhbGlkO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGZhaWxlZEVudGl0aWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgdmFsRXJyb3IgPSBuZXcgRXJyb3IoXCJDbGllbnQgc2lkZSB2YWxpZGF0aW9uIGVycm9ycyBlbmNvdW50ZXJlZCAtIHNlZSB0aGUgZW50aXR5RXJyb3JzIGNvbGxlY3Rpb24gb24gdGhpcyBvYmplY3QgZm9yIG1vcmUgZGV0YWlsXCIpO1xyXG4gICAgICAgICh2YWxFcnJvciBhcyBhbnkpLmVudGl0eUVycm9ycyA9IGNyZWF0ZUVudGl0eUVycm9ycyhmYWlsZWRFbnRpdGllcyk7XHJcbiAgICAgICAgcmV0dXJuIHZhbEVycm9yOyAvLyBUT0RPOiB0eXBlIHRoaXMuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2ZpbmRFbnRpdHlHcm91cChlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5R3JvdXBNYXBbZW50aXR5VHlwZS5uYW1lXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGVtcGxveWVlVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJFbXBsb3llZVwiKTtcclxuICA+ICAgICAgbGV0IGVtcGxveWVlS2V5ID0gbmV3IEVudGl0eUtleShlbXBsb3llZVR5cGUsIDEpO1xyXG4gID4gICAgICBsZXQgZW1wbG95ZWUgPSBlbTEuZ2V0RW50aXR5QnlLZXkoZW1wbG95ZWVLZXkpO1xyXG4gID4gICAgICAvLyBlbXBsb3llZSB3aWxsIGVpdGhlciBiZSBhbiBlbnRpdHkgb3IgbnVsbC5cclxuICAqKi9cclxuICBnZXRFbnRpdHlCeUtleShlbnRpdHlLZXk6IEVudGl0eUtleSk6IEVudGl0eSB8IG51bGw7XHJcblxyXG4gIC8qKiAgXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgZW1wbG95ZWUgPSBlbTEuZ2V0RW50aXR5QnlLZXkoXCJFbXBsb3llZVwiLCAxKTtcclxuICA+ICAgICAgLy8gZW1wbG95ZWUgd2lsbCBlaXRoZXIgYmUgYW4gZW50aXR5IG9yIG51bGwuXHJcbiAgKiovXHJcbiAgZ2V0RW50aXR5QnlLZXkodHlwZU5hbWU6IHN0cmluZywga2V5VmFsdWVzOiBhbnkgfCBhbnlbXSk6IEVudGl0eSB8IG51bGw7XHJcblxyXG4gIC8qKiAgXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgZW1wbG95ZWVUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkVtcGxveWVlXCIpO1xyXG4gID4gICAgICBsZXQgZW1wbG95ZWUgPSBlbTEuZ2V0RW50aXR5QnlLZXkoZW1wbG95ZWVUeXBlLCAxKTtcclxuICA+ICAgICAgLy8gZW1wbG95ZWUgd2lsbCBlaXRoZXIgYmUgYW4gZW50aXR5IG9yIG51bGwuXHJcbiAgKiovXHJcbiAgZ2V0RW50aXR5QnlLZXkodHlwZTogRW50aXR5VHlwZSwga2V5VmFsdWVzOiBhbnkgfCBhbnlbXSk6IEVudGl0eSB8IG51bGw7XHJcblxyXG4gIC8qKiAgXHJcbiAgQXR0ZW1wdHMgdG8gbG9jYXRlIGFuIGVudGl0eSB3aXRoaW4gdGhpcyBFbnRpdHlNYW5hZ2VyIGJ5IGl0cyBbRW50aXR5S2V5XS5cclxuICBAcGFyYW0gZW50aXR5S2V5IC0gVGhlIFtbRW50aXR5S2V5XV0gb2YgdGhlIEVudGl0eSB0byBiZSBsb2NhdGVkLlxyXG4gIEBwYXJhbSB0eXBlIC0gVGhlIFtbRW50aXR5VHlwZV1dIGZvciB0aGlzIGtleS5cclxuICBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgRW50aXR5VHlwZSBuYW1lIGZvciB0aGlzIGtleS5cclxuICBAcGFyYW0ga2V5VmFsdWVzIC0gVGhlIHZhbHVlcyBmb3IgdGhpcyBrZXkgLSB3aWxsIHVzdWFsbHkganVzdCBiZSBhIHNpbmdsZSB2YWx1ZTsgYW4gYXJyYXkgaXMgb25seSBuZWVkZWQgZm9yIG11bHRpcGFydCBrZXlzLiAgXHJcbiAgQHJldHVybiBBbiBFbnRpdHkgb3IgbnVsbDtcclxuICAqKi9cclxuICBnZXRFbnRpdHlCeUtleSguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IGVudGl0eUtleSA9IGNyZWF0ZUVudGl0eUtleSh0aGlzLCBhcmdzKS5lbnRpdHlLZXk7XHJcbiAgICBsZXQgZW50aXR5VHlwZXMgPSBlbnRpdHlLZXkuX3N1YnR5cGVzIHx8IFtlbnRpdHlLZXkuZW50aXR5VHlwZV07XHJcbiAgICBsZXQgZTogRW50aXR5IHwgdW5kZWZpbmVkO1xyXG4gICAgLy8gaGFjayB1c2Ugb2Ygc29tZSB0byBzaW11bGF0ZSBtYXBGaXJzdCBsb2dpYy5cclxuICAgIGVudGl0eVR5cGVzLnNvbWUoKGV0KSA9PiB7XHJcbiAgICAgIGxldCBncm91cCA9IHRoaXMuX2ZpbmRFbnRpdHlHcm91cChldCk7XHJcbiAgICAgIC8vIGdyb3VwIHZlcnNpb24gb2YgZmluZEVudGl0eUJ5S2V5IGRvZXNuJ3QgY2FyZSBhYm91dCBlbnRpdHlUeXBlXHJcbiAgICAgIGUgPSBncm91cCAmJiBncm91cC5maW5kRW50aXR5QnlLZXkoZW50aXR5S2V5KTtcclxuICAgICAgcmV0dXJuIGUgIT0gbnVsbDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGUgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGZldGNoRW50aXR5QnlLZXkodHlwZU5hbWU6IHN0cmluZywga2V5VmFsdWVzOiBhbnkgfCBhbnlbXSwgY2hlY2tMb2NhbENhY2hlRmlyc3Q/OiBib29sZWFuKTogUHJvbWlzZTxJRW50aXR5QnlLZXlSZXN1bHQ+O1xyXG4gIGZldGNoRW50aXR5QnlLZXkoZW50aXR5VHlwZTogRW50aXR5VHlwZSwga2V5VmFsdWVzOiBhbnkgfCBhbnlbXSwgY2hlY2tMb2NhbENhY2hlRmlyc3Q/OiBib29sZWFuKTogUHJvbWlzZTxJRW50aXR5QnlLZXlSZXN1bHQ+O1xyXG4gIGZldGNoRW50aXR5QnlLZXkoZW50aXR5S2V5OiBFbnRpdHlLZXksIGNoZWNrTG9jYWxDYWNoZUZpcnN0PzogYm9vbGVhbik6IFByb21pc2U8SUVudGl0eUJ5S2V5UmVzdWx0PjtcclxuICAvKipcclxuICBBdHRlbXB0cyB0byBmZXRjaCBhbiBlbnRpdHkgZnJvbSB0aGUgc2VydmVyIGJ5IGl0cyBbW0VudGl0eUtleV1dIHdpdGhcclxuICBhbiBvcHRpb24gdG8gY2hlY2sgdGhlIGxvY2FsIGNhY2hlIGZpcnN0LiBOb3RlIHRoZSB0aGlzIEVudGl0eU1hbmFnZXIncyBxdWVyeU9wdGlvbnMubWVyZ2VTdHJhdGVneVxyXG4gIHdpbGwgYmUgdXNlZCB0byBtZXJnZSBhbnkgc2VydmVyIHNpZGUgZW50aXR5IHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gID4gICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgIGxldCBlbXBsb3llZVR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRW1wbG95ZWVcIik7XHJcbiAgPiAgICAgbGV0IGVtcGxveWVlS2V5ID0gbmV3IEVudGl0eUtleShlbXBsb3llZVR5cGUsIDEpO1xyXG4gID4gICAgIGVtMS5mZXRjaEVudGl0eUJ5S2V5KGVtcGxveWVlS2V5KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xyXG4gID4gICAgICAgbGV0IGVtcGxveWVlID0gcmVzdWx0LmVudGl0eTtcclxuICA+ICAgICAgIGxldCBlbnRpdHlLZXkgPSByZXN1bHQuZW50aXR5S2V5O1xyXG4gID4gICAgICAgbGV0IGZyb21DYWNoZSA9IHJlc3VsdC5mcm9tQ2FjaGU7XHJcbiAgPiAgICAgfSk7XHJcbiAgQHBhcmFtIHR5cGVOYW1lICAtIFRoZSBFbnRpdHlUeXBlIG5hbWUgZm9yIHRoaXMga2V5LlxyXG4gIEBwYXJhbSBlbnRpdHlUeXBlICAtIFRoZSBFbnRpdHlUeXBlIGZvciB0aGlzIGtleS5cclxuICBAcGFyYW0ga2V5VmFsdWVzIC0gVGhlIHZhbHVlcyBmb3IgdGhpcyBrZXkgLSB3aWxsIHVzdWFsbHkganVzdCBiZSBhIHNpbmdsZSB2YWx1ZTsgYW4gYXJyYXkgaXMgb25seSBuZWVkZWQgZm9yIG11bHRpcGFydCBrZXlzLlxyXG4gIEBwYXJhbSBlbnRpdHlLZXkgLSBUaGUgW1tFbnRpdHlLZXldXSBvZiB0aGUgRW50aXR5IHRvIGJlIGxvY2F0ZWQuXHJcbiAgQHBhcmFtIGNoZWNrTG9jYWxDYWNoZUZpcnN0IC0gKGRlZmF1bHQgPSBmYWxzZSkgLSBXaGV0aGVyIHRvIGNoZWNrIHRoaXMgRW50aXR5TWFuYWdlciBmaXJzdCBiZWZvcmUgZ29pbmcgdG8gdGhlIHNlcnZlci4gQnkgZGVmYXVsdCwgdGhlIHF1ZXJ5IHdpbGwgTk9UIGRvIHRoaXMuXHJcbiAgQHJldHVybiB7UHJvbWlzZX1cclxuICAgIC0gUHJvcGVydGllcyBvbiB0aGUgcHJvbWlzZSBzdWNjZXNzIHJlc3VsdFxyXG4gICAgICAtIGVudGl0eSB7T2JqZWN0fSBUaGUgZW50aXR5IHJldHVybmVkIG9yIG51bGxcclxuICAgICAgLSBlbnRpdHlLZXkge0VudGl0eUtleX0gVGhlIGVudGl0eUtleSBvZiB0aGUgZW50aXR5IHRvIGZldGNoLlxyXG4gICAgICAtIGZyb21DYWNoZSB7Qm9vbGVhbn0gV2hldGhlciB0aGlzIGVudGl0eSB3YXMgZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIgb3Igd2FzIGZvdW5kIGluIHRoZSBsb2NhbCBjYWNoZS5cclxuICAqKi9cclxuICBmZXRjaEVudGl0eUJ5S2V5KC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQgZGF0YVNlcnZpY2UgPSBEYXRhU2VydmljZS5yZXNvbHZlKFt0aGlzLmRhdGFTZXJ2aWNlXSk7XHJcbiAgICBpZiAoKCFkYXRhU2VydmljZS5oYXNTZXJ2ZXJNZXRhZGF0YSkgfHwgdGhpcy5tZXRhZGF0YVN0b3JlLmhhc01ldGFkYXRhRm9yKGRhdGFTZXJ2aWNlLnNlcnZpY2VOYW1lKSkge1xyXG4gICAgICByZXR1cm4gZmV0Y2hFbnRpdHlCeUtleUNvcmUodGhpcywgYXJncyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5mZXRjaE1ldGFkYXRhKGRhdGFTZXJ2aWNlKS50aGVuKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gZmV0Y2hFbnRpdHlCeUtleUNvcmUodGhpcywgYXJncyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgW0RlcHJlY2F0ZWRdIC0gQXR0ZW1wdHMgdG8gbG9jYXRlIGFuIGVudGl0eSB3aXRoaW4gdGhpcyBFbnRpdHlNYW5hZ2VyIGJ5IGl0cyAgW1tFbnRpdHlLZXldXS5cclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICBsZXQgZW1wbG95ZWVUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkVtcGxveWVlXCIpO1xyXG4gID4gICAgIGxldCBlbXBsb3llZUtleSA9IG5ldyBFbnRpdHlLZXkoZW1wbG95ZWVUeXBlLCAxKTtcclxuICA+ICAgICBsZXQgZW1wbG95ZWUgPSBlbTEuZmluZEVudGl0eUJ5S2V5KGVtcGxveWVlS2V5KTtcclxuICA+ICAgICAvLyBlbXBsb3llZSB3aWxsIGVpdGhlciBiZSBhbiBlbnRpdHkgb3IgbnVsbC5cclxuICBAZGVwcmVjYXRlZCAgICBVc2UgZ2V0RW50aXR5QnlLZXkgaW5zdGVhZFxyXG4gIEBwYXJhbSBlbnRpdHlLZXkgLSBUaGUgIFtbRW50aXR5S2V5XV0gb2YgdGhlIEVudGl0eSB0byBiZSBsb2NhdGVkLlxyXG4gIEByZXR1cm4gQW4gRW50aXR5IG9yIG51bGw7XHJcbiAgKiovXHJcbiAgZmluZEVudGl0eUJ5S2V5KGVudGl0eUtleTogRW50aXR5S2V5KSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRFbnRpdHlCeUtleShlbnRpdHlLZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgR2VuZXJhdGVzIGEgdGVtcG9yYXJ5IGtleSBmb3IgdGhlIHNwZWNpZmllZCBlbnRpdHkuICBUaGlzIGlzIHVzZWQgdG8gaW5zdXJlIHRoYXQgbmV3bHlcclxuICBjcmVhdGVkIGVudGl0aWVzIGhhdmUgdW5pcXVlIGtleXMgYW5kIHRvIHJlZ2lzdGVyIHRoYXQgdGhlc2Uga2V5cyBhcmUgdGVtcG9yYXJ5IGFuZFxyXG4gIG5lZWQgdG8gYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoICdyZWFsJyBrZXkgdmFsdWVzIG9uY2UgdGhlc2UgZW50aXRpZXMgYXJlIHNhdmVkLlxyXG4gIFxyXG4gIFRoZSBbW0VudGl0eU1hbmFnZXIua2V5R2VuZXJhdG9yQ3Rvcl1dIHByb3BlcnR5IGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGlzIG1ldGhvZCB0byBhY3R1YWxseSBnZW5lcmF0ZVxyXG4gIHRoZSBrZXlzIC0gU2VlIHRoZSAgS2V5R2VuZXJhdG9yIGludGVyZmFjZSBpbnRlcmZhY2UgZGVzY3JpcHRpb24gdG8gc2VlXHJcbiAgaG93IGEgY3VzdG9tIGtleSBnZW5lcmF0b3IgY2FuIGJlIHBsdWdnZWQgaW4uXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgPiAgICAgIGxldCBjdXN0b21lciA9IGN1c3RUeXBlLmNyZWF0ZUVudGl0eSgpO1xyXG4gID4gICAgICBsZXQgY3VzdG9tZXJJZCA9IGVtLmdlbmVyYXRlVGVtcEtleVZhbHVlKGN1c3RvbWVyKTtcclxuICA+ICAgICAgLy8gVGhlICdjdXN0b21lcicgZW50aXR5ICdDdXN0b21lcklEJyBwcm9wZXJ0eSBpcyBub3cgc2V0IHRvIGEgbmV3bHkgZ2VuZXJhdGVkIHVuaXF1ZSBpZCB2YWx1ZVxyXG4gID4gICAgICAvLyBUaGlzIHByb3BlcnR5IHdpbGwgY2hhbmdlIGFnYWluIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzYXZlIG9mIHRoZSAnY3VzdG9tZXInIGVudGl0eS5cclxuICA+ICBcclxuICA+ICAgICAgZW0xLnNhdmVDaGFuZ2VzKCkudGhlbiggZnVuY3Rpb24oIGRhdGEpIHtcclxuICA+ICAgICAgICAgIGxldCBzYW1lQ3VzdDEgPSBkYXRhLnJlc3VsdHNbMF07XHJcbiAgPiAgICAgICAgICAvLyBjdXN0MSA9PT0gc2FtZUN1c3QxO1xyXG4gID4gICAgICAgICAgLy8gYnV0IGN1c3QxLmdldFByb3BlcnR5KFwiQ3VzdG9tZXJJZFwiKSAhPSBjdXN0b21lcklkXHJcbiAgPiAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBzZXJ2ZXIgd2lsbCBoYXZlIGdlbmVyYXRlZCBhIG5ldyBpZFxyXG4gID4gICAgICAgICAgLy8gYW5kIHRoZSBjbGllbnQgd2lsbCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIHRoaXNcclxuICA+ICAgICAgICAgIC8vIG5ldyBpZC5cclxuICA+ICAgICAgfSlcclxuICBAcGFyYW0gZW50aXR5IC0gVGhlIEVudGl0eSB0byBnZW5lcmF0ZSBhIGtleSBmb3IuXHJcbiAgQHJldHVybiBUaGUgbmV3IGtleSB2YWx1ZVxyXG4gICoqL1xyXG4gIGdlbmVyYXRlVGVtcEtleVZhbHVlKGVudGl0eTogRW50aXR5KSB7XHJcbiAgICAvLyBUT0RPIC0gY2hlY2sgaWYgdGhpcyBlbnRpdHkgaXMgYXR0YWNoZWQgdG8gdGhpcyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5LCBcImVudGl0eVwiKS5pc0VudGl0eSgpLmNoZWNrKCk7XHJcbiAgICBsZXQgZW50aXR5VHlwZSA9IGVudGl0eS5lbnRpdHlUeXBlO1xyXG4gICAgbGV0IG5leHRLZXlWYWx1ZSA9IHRoaXMua2V5R2VuZXJhdG9yLmdlbmVyYXRlVGVtcEtleVZhbHVlKGVudGl0eVR5cGUpO1xyXG4gICAgbGV0IGtleVByb3AgPSBlbnRpdHlUeXBlLmtleVByb3BlcnRpZXNbMF07XHJcbiAgICBlbnRpdHkuc2V0UHJvcGVydHkoa2V5UHJvcC5uYW1lLCBuZXh0S2V5VmFsdWUpO1xyXG4gICAgZW50aXR5LmVudGl0eUFzcGVjdC5oYXNUZW1wS2V5ID0gdHJ1ZTtcclxuICAgIHJldHVybiBuZXh0S2V5VmFsdWU7XHJcbiAgfVxyXG5cclxuICBoYXNDaGFuZ2VzKCk6IGJvb2xlYW47XHJcbiAgaGFzQ2hhbmdlcyhlbnRpdHlUeXBlTmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbjtcclxuICBoYXNDaGFuZ2VzKGVudGl0eVR5cGVzOiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdKTogYm9vbGVhbjtcclxuICAvKipcclxuICBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjaGFuZ2VkIGVudGl0aWVzIG9mIHRoZSBzcGVjaWZpZWQgW1tFbnRpdHlUeXBlXV1zLiBBICdjaGFuZ2VkJyBFbnRpdHkgaGFzXHJcbiAgaGFzIGFuIFtbRW50aXR5U3RhdGVdXSBvZiBlaXRoZXIgQWRkZWQsIE1vZGlmaWVkIG9yIERlbGV0ZWQuXHJcblxyXG4gIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBFbnRpdHlNYW5hZ2VyIGhhcyBhbnkgY2hhbmdlc1xyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgaWYgKCBlbTEuaGFzQ2hhbmdlcygpIHtcclxuICA+ICAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBpbnRlcmVzdGluZ1xyXG4gID4gICAgICB9XHJcblxyXG4gIG9yIGlmIGl0IGhhcyBhbnkgY2hhbmdlcyBvbiB0byBhIHNwZWNpZmljIFtbRW50aXR5VHlwZV1dLlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgICBpZiAoIGVtMS5oYXNDaGFuZ2VzKGN1c3RUeXBlKSB7XHJcbiAgPiAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgaW50ZXJlc3RpbmdcclxuICA+ICAgICAgfVxyXG5cclxuICBvciB0byBhIGNvbGxlY3Rpb24gb2YgW1tFbnRpdHlUeXBlXV1zXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgPiAgICAgIGxldCBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgPiAgICAgIGlmICggZW0xLmhhc0NoYW5nZXMoIFtjdXN0VHlwZSwgb3JkZXJUeXBlXSkge1xyXG4gID4gICAgICAgICAgLy8gZG8gc29tZXRoaW5nIGludGVyZXN0aW5nXHJcbiAgPiAgICAgIH1cclxuICBAcGFyYW0gZW50aXR5VHlwZXMgLSBUaGUgW1tFbnRpdHlUeXBlXV0gb3IgRW50aXR5VHlwZXMgZm9yIHdoaWNoICdjaGFuZ2VkJyBlbnRpdGllcyB3aWxsIGJlIGZvdW5kLlxyXG4gIEBwYXJhbSBlbnRpdHlUeXBlTmFtZXMgLSBUaGUgW1tFbnRpdHlUeXBlXV0gbmFtZSBvciBuYW1lcyBmb3Igd2hpY2ggJ2NoYW5nZWQnIGVudGl0aWVzIHdpbGwgYmUgZm91bmQuXHJcbiAgQHJldHVybiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY2hhbmdlZCBlbnRpdGllcyB0aGF0IG1hdGNoIHRoZSB0eXBlcyBzcGVjaWZpZWQuLlxyXG4gICoqL1xyXG4gIGhhc0NoYW5nZXMoZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdIHwgc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIGlmICghdGhpcy5faGFzQ2hhbmdlcykgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKGVudGl0eVR5cGVzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9oYXNDaGFuZ2VzO1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc0NoYW5nZXNDb3JlKGVudGl0eVR5cGVzKTtcclxuICB9XHJcblxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICAvLyBiYWNrZG9vciB0byBcInJlYWxseVwiIGNoZWNrIGZvciBjaGFuZ2VzLlxyXG4gIF9oYXNDaGFuZ2VzQ29yZShlbnRpdHlUeXBlcz86IEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10gfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgbGV0IGV0cyA9IGNoZWNrRW50aXR5VHlwZXModGhpcywgZW50aXR5VHlwZXMpO1xyXG4gICAgbGV0IGVudGl0eUdyb3VwcyA9IGdldEVudGl0eUdyb3Vwcyh0aGlzLCBldHMpO1xyXG4gICAgcmV0dXJuIGVudGl0eUdyb3Vwcy5zb21lKGZ1bmN0aW9uIChlZykge1xyXG4gICAgICByZXR1cm4gZWcgJiYgZWcuaGFzQ2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRDaGFuZ2VzKCk6IEVudGl0eVtdO1xyXG4gIGdldENoYW5nZXMoZW50aXR5VHlwZU5hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IEVudGl0eVtdO1xyXG4gIGdldENoYW5nZXMoZW50aXR5VHlwZXM6IEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10pOiBFbnRpdHlbXTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgYXJyYXkgb2YgYWxsIGNoYW5nZWQgZW50aXRpZXMgb2YgdGhlIHNwZWNpZmllZCBbW0VudGl0eVR5cGVdXXMuIEEgJ2NoYW5nZWQnIEVudGl0eSBoYXNcclxuICBoYXMgYW4gW1tFbnRpdHlTdGF0ZV1dIG9mIGVpdGhlciBBZGRlZCwgTW9kaWZpZWQgb3IgRGVsZXRlZC5cclxuICBcclxuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBnZXQgYWxsIG9mIHRoZSBjaGFuZ2VkIGVudGl0aWVzIHdpdGhpbiBhbiBFbnRpdHlNYW5hZ2VyXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgY2hhbmdlZEVudGl0aWVzID0gZW0xLmdldENoYW5nZXMoKTtcclxuXHJcbiAgb3IgeW91IGNhbiBzcGVjaWZ5IHRoYXQgeW91IG9ubHkgd2FudCB0aGUgY2hhbmdlcyBvbiBhIHNwZWNpZmljIFtbRW50aXR5VHlwZV1dXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgPiAgICAgIGxldCBjaGFuZ2VkQ3VzdG9tZXJzID0gZW0xLmdldENoYW5nZXMoY3VzdFR5cGUpO1xyXG5cclxuICBvciB0byBhIGNvbGxlY3Rpb24gb2YgW1tFbnRpdHlUeXBlXV1zXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgPiAgICAgIGxldCBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgPiAgICAgIGxldCBjaGFuZ2VkQ3VzdG9tZXJzQW5kT3JkZXJzID0gZW0xLmdldENoYW5nZXMoW2N1c3RUeXBlLCBvcmRlclR5cGVdKTtcclxuICBAcGFyYW0gZW50aXR5VHlwZXMgLSBUaGUgW1tFbnRpdHlUeXBlXV0gb3IgRW50aXR5VHlwZXMgZm9yIHdoaWNoICdjaGFuZ2VkJyBlbnRpdGllcyB3aWxsIGJlIGZvdW5kLlxyXG4gIEBwYXJhbSBlbnRpdHlUeXBlTmFtZXMgLSBUaGUgW1tFbnRpdHlUeXBlXV0gbmFtZSBvciBuYW1lcyBmb3Igd2hpY2ggJ2NoYW5nZWQnIGVudGl0aWVzIHdpbGwgYmUgZm91bmQuXHJcbiAgQHJldHVybiBBbiBhcnJheSBvZiBFbnRpdGllc1xyXG4gICoqL1xyXG4gIGdldENoYW5nZXMoZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdIHwgc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIGxldCBldHMgPSBjaGVja0VudGl0eVR5cGVzKHRoaXMsIGVudGl0eVR5cGVzKTtcclxuICAgIHJldHVybiBnZXRDaGFuZ2VzQ29yZSh0aGlzLCBldHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmVqZWN0cyAocmV2ZXJzZXMgdGhlIGVmZmVjdHMpIGFsbCBvZiB0aGUgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zIGFuZCBkZWxldGVzIGZyb20gdGhpcyBFbnRpdHlNYW5hZ2VyLlxyXG4gIENhbGxzIFtbRW50aXR5QXNwZWN0LnJlamVjdENoYW5nZXNdXSBvbiBldmVyeSBjaGFuZ2VkIGVudGl0eSBpbiB0aGlzIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgZW50aXRpZXMgPSBlbTEucmVqZWN0Q2hhbmdlcygpO1xyXG4gIEByZXR1cm4gVGhlIGVudGl0aWVzIHdob3NlIGNoYW5nZXMgd2VyZSByZWplY3RlZC4gVGhlc2UgZW50aXRpZXMgd2lsbCBhbGwgaGF2ZSBFbnRpdHlTdGF0ZXMgb2ZcclxuICBlaXRoZXIgJ1VuY2hhbmdlZCcgb3IgJ0RldGFjaGVkJ1xyXG4gICoqL1xyXG4gIHJlamVjdENoYW5nZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2hhc0NoYW5nZXMpIHJldHVybiBbXTtcclxuICAgIGxldCBjaGFuZ2VzID0gZ2V0Q2hhbmdlc0NvcmUodGhpcyk7XHJcbiAgICAvLyBuZXh0IGxpbmUgc3RvcHMgaW5kaXZpZHVhbCByZWplY3QgY2hhbmdlcyBmcm9tIGVhY2ggY2FsbGluZyBfaGFzQ2hhbmdlc0NvcmVcclxuICAgIGxldCBhc3BlY3RzID0gY2hhbmdlcy5tYXAoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgcmV0dXJuIGUuZW50aXR5QXNwZWN0Ll9jaGVja09wZXJhdGlvbihcInJlamVjdENoYW5nZXNcIik7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX2hhc0NoYW5nZXMgPSBmYWxzZTtcclxuICAgIGFzcGVjdHMuZm9yRWFjaChmdW5jdGlvbiAoYXNwZWN0KSB7XHJcbiAgICAgIGFzcGVjdC5yZWplY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuaGFzQ2hhbmdlc0NoYW5nZWQucHVibGlzaCh7IGVudGl0eU1hbmFnZXI6IHRoaXMsIGhhc0NoYW5nZXM6IGZhbHNlIH0pO1xyXG4gICAgcmV0dXJuIGNoYW5nZXM7XHJcbiAgfVxyXG5cclxuICBnZXRFbnRpdGllcyhlbnRpdHlUeXBlTmFtZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSwgZW50aXR5U3RhdGVzPzogRW50aXR5U3RhdGUgfCBFbnRpdHlTdGF0ZVtdKTogRW50aXR5W107XHJcbiAgZ2V0RW50aXRpZXMoZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdLCBlbnRpdHlTdGF0ZXM/OiBFbnRpdHlTdGF0ZSB8IEVudGl0eVN0YXRlW10pOiBFbnRpdHlbXTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgYXJyYXkgb2YgYWxsIGVudGl0aWVzIG9mIHRoZSBzcGVjaWZpZWQgW1tFbnRpdHlUeXBlXV1zIHdpdGggdGhlIHNwZWNpZmllZCBbW0VudGl0eVN0YXRlXV1zLlxyXG5cclxuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBnZXQgYWxsIG9mIHRoZSBlbnRpdGllcyB3aXRoaW4gYW4gRW50aXR5TWFuYWdlclxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGVudGl0aWVzID0gZW0xLmdldEVudGl0aWVzKCk7XHJcblxyXG4gIG9yIHlvdSBjYW4gc3BlY2lmeSB0aGF0IHlvdSBvbmx5IHdhbnQgdGhlIGNoYW5nZXMgb24gYSBzcGVjaWZpYyBbW0VudGl0eVR5cGVdXVxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgICBsZXQgY3VzdG9tZXJzID0gZW0xLmdldEVudGl0aWVzKGN1c3RUeXBlKTtcclxuXHJcbiAgb3IgdG8gYSBjb2xsZWN0aW9uIG9mIFtbRW50aXR5VHlwZV1dc1xyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgICBsZXQgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gID4gICAgICBsZXQgY3VzdG9tZXJzQW5kT3JkZXJzID0gZW0xLmdldENoYW5nZXMoW2N1c3RUeXBlLCBvcmRlclR5cGVdKTtcclxuXHJcbiAgWW91IGNhbiBhbHNvIGFzayBmb3IgZW50aXRpZXMgd2l0aCBhIHBhcnRpY3VsYXIgW1tFbnRpdHlTdGF0ZV1dIG9yIEVudGl0eVN0YXRlcy5cclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGxldCBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICA+ICAgICAgbGV0IG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICA+ICAgICAgbGV0IGFkZGVkQ3VzdG9tZXJzQW5kT3JkZXJzID0gZW0xLmdldEVudGl0aWVzKFtjdXN0VHlwZSwgb3JkZXJUeXBlXSwgRW50aXR5U3RhdGUuQWRkZWQpO1xyXG4gXHJcbiAgQHBhcmFtIGVudGl0eVR5cGVOYW1lIC0gVGhlIFtbRW50aXR5VHlwZV1dIG5hbWUgb3IgbmFtZXMgZm9yIHdoaWNoIGVudGl0aWVzIHdpbGwgYmUgZm91bmQuXHJcbiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgYWxsIEVudGl0eVR5cGVzIGFyZSBzZWFyY2hlZC4gIFxyXG4gIEBwYXJhbSBlbnRpdHlUeXBlcyAtIFRoZSBbW0VudGl0eVR5cGVdXSBvciBFbnRpdHlUeXBlcyBmb3Igd2hpY2ggZW50aXRpZXMgd2lsbCBiZSBmb3VuZC5cclxuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhbGwgRW50aXR5VHlwZXMgYXJlIHNlYXJjaGVkLiBcclxuICBAcGFyYW0gZW50aXR5U3RhdGVzIC0gVGhlIFtbRW50aXR5U3RhdGVdXXMgZm9yIHdoaWNoIGVudGl0aWVzIHdpbGwgYmUgZm91bmQuXHJcbiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgZW50aXRpZXMgb2YgYWxsIEVudGl0eVN0YXRlcyBhcmUgcmV0dXJuZWQuXHJcbiAgQHJldHVybiBBbiBhcnJheSBvZiBFbnRpdGllc1xyXG4gICoqL1xyXG4gIGdldEVudGl0aWVzKGVudGl0eVR5cGVzPzogRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSB8IHN0cmluZyB8IHN0cmluZ1tdLCBlbnRpdHlTdGF0ZXM/OiBFbnRpdHlTdGF0ZSB8IEVudGl0eVN0YXRlW10pIHtcclxuICAgIGxldCBlbnRUeXBlcyA9IGNoZWNrRW50aXR5VHlwZXModGhpcywgZW50aXR5VHlwZXMpO1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5U3RhdGVzLCBcImVudGl0eVN0YXRlc1wiKS5pc09wdGlvbmFsKCkuaXNFbnVtT2YoRW50aXR5U3RhdGUpLm9yKCkuaXNOb25FbXB0eUFycmF5KCkuaXNFbnVtT2YoRW50aXR5U3RhdGUpLmNoZWNrKCk7XHJcblxyXG4gICAgbGV0IHN0YXRlcyA9IHZhbGlkYXRlRW50aXR5U3RhdGVzKHRoaXMsIGVudGl0eVN0YXRlcyk7XHJcbiAgICByZXR1cm4gZ2V0RW50aXRpZXNDb3JlKHRoaXMsIGVudFR5cGVzLCBzdGF0ZXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIHByb3RlY3RlZCBtZXRob2RzXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX25vdGlmeVN0YXRlQ2hhbmdlKGVudGl0eTogRW50aXR5LCBuZWVkc1NhdmU6IGJvb2xlYW4pIHtcclxuICAgIGxldCBlY0FyZ3MgPSB7IGVudGl0eUFjdGlvbjogRW50aXR5QWN0aW9uLkVudGl0eVN0YXRlQ2hhbmdlLCBlbnRpdHk6IGVudGl0eSB9O1xyXG5cclxuICAgIGlmIChuZWVkc1NhdmUpIHtcclxuICAgICAgaWYgKCF0aGlzLl9oYXNDaGFuZ2VzKSB0aGlzLl9zZXRIYXNDaGFuZ2VzKHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gY2FsbGVkIHdoZW4gcmVqZWN0aW5nIGEgY2hhbmdlIG9yIG1lcmdpbmcgYW4gdW5jaGFuZ2VkIHJlY29yZC5cclxuICAgICAgLy8gTk9URTogdGhpcyBjYW4gYmUgc2xvdyB3aXRoIGxvdHMgb2YgZW50aXRpZXMgaW4gdGhlIGNhY2hlLlxyXG4gICAgICAvLyBzbyBkZWZlciBpdCBkdXJpbmcgYSBxdWVyeS9pbXBvcnQgb3Igc2F2ZSBhbmQgY2FsbCBpdCBvbmNlIHdoZW4gY29tcGxldGUgKCBpZiBuZWVkZWQpLlxyXG4gICAgICBpZiAodGhpcy5faGFzQ2hhbmdlcykge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xyXG4gICAgICAgICAgdGhpcy5faGFzQ2hhbmdlc0FjdGlvbiA9IHRoaXMuX2hhc0NoYW5nZXNBY3Rpb24gfHwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRIYXNDaGFuZ2VzKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLmVudGl0eUNoYW5nZWQucHVibGlzaChlY0FyZ3MpO1xyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXRIYXNDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eUNoYW5nZWQucHVibGlzaChlY0FyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3NldEhhc0NoYW5nZXMoaGFzQ2hhbmdlcz86IGJvb2xlYW4pIHtcclxuICAgIGlmIChoYXNDaGFuZ2VzID09IG51bGwpIGhhc0NoYW5nZXMgPSB0aGlzLl9oYXNDaGFuZ2VzQ29yZSgpO1xyXG4gICAgbGV0IGhhZENoYW5nZXMgPSB0aGlzLl9oYXNDaGFuZ2VzO1xyXG4gICAgdGhpcy5faGFzQ2hhbmdlcyA9IGhhc0NoYW5nZXM7XHJcbiAgICBpZiAoaGFzQ2hhbmdlcyAhPT0gaGFkQ2hhbmdlcykge1xyXG4gICAgICB0aGlzLmhhc0NoYW5nZXNDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlNYW5hZ2VyOiB0aGlzLCBoYXNDaGFuZ2VzOiBoYXNDaGFuZ2VzIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faGFzQ2hhbmdlc0FjdGlvbiA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9saW5rUmVsYXRlZEVudGl0aWVzKGVudGl0eTogRW50aXR5KSB7XHJcbiAgICBsZXQgZW0gPSB0aGlzO1xyXG4gICAgbGV0IGVudGl0eUFzcGVjdCA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgICAvLyB3ZSBkbyBub3Qgd2FudCBlbnRpdHlTdGF0ZSB0byBjaGFuZ2UgYXMgYSByZXN1bHQgb2YgbGlua2FnZS5cclxuICAgIGNvcmUudXNpbmcoZW0sIFwiaXNMb2FkaW5nXCIsIHRydWUsIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgIGxldCB1bmF0dGFjaGVkTWFwID0gZW0uX3VuYXR0YWNoZWRDaGlsZHJlbk1hcDtcclxuICAgICAgbGV0IGVudGl0eUtleSA9IGVudGl0eUFzcGVjdC5nZXRLZXkoKTtcclxuICAgICAgbGV0IGVudGl0eVR5cGUgPSBlbnRpdHlLZXkuZW50aXR5VHlwZTtcclxuXHJcbiAgICAgIHdoaWxlIChlbnRpdHlUeXBlKSB7XHJcbiAgICAgICAgbGV0IGtleXN0cmluZyA9IGVudGl0eUtleS50b1N0cmluZyhlbnRpdHlUeXBlKTtcclxuXHJcbiAgICAgICAgLy8gYXR0YWNoIGFueSB1bmF0dGFjaGVkQ2hpbGRyZW5cclxuICAgICAgICBsZXQgdHVwbGVzID0gdW5hdHRhY2hlZE1hcC5nZXRUdXBsZXNCeVN0cmluZyhrZXlzdHJpbmcpO1xyXG4gICAgICAgIGlmICh0dXBsZXMpIHtcclxuICAgICAgICAgIHR1cGxlcy5zbGljZSgwKS5mb3JFYWNoKGZ1bmN0aW9uICh0cGwpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCB1bmF0dGFjaGVkQ2hpbGRyZW4gPSB0cGwuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlICE9PSBFbnRpdHlTdGF0ZS5EZXRhY2hlZDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2hpbGRUb1BhcmVudE5wOiBOYXZpZ2F0aW9uUHJvcGVydHk7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRUb0NoaWxkTnA6IE5hdmlnYXRpb25Qcm9wZXJ0eTtcclxuXHJcbiAgICAgICAgICAgIC8vIG5wIGlzIHVzdWFsbHkgY2hpbGRUb1BhcmVudE5wXHJcbiAgICAgICAgICAgIC8vIGV4Y2VwdCB3aXRoIHVuaWRpcmVjdGlvbmFsIDEtbiB3aGVyZSBpdCBpcyBwYXJlbnRUb0NoaWxkTnA7XHJcbiAgICAgICAgICAgIGxldCBucCA9IHRwbC5uYXZpZ2F0aW9uUHJvcGVydHk7XHJcblxyXG4gICAgICAgICAgICBsZXQgaW52ZXJzZU5wID0gbnAuaW52ZXJzZTtcclxuICAgICAgICAgICAgaWYgKGludmVyc2VOcCkge1xyXG4gICAgICAgICAgICAgIC8vIGJpZGlyZWN0aW9uYWxcclxuICAgICAgICAgICAgICBjaGlsZFRvUGFyZW50TnAgPSBucDtcclxuICAgICAgICAgICAgICBwYXJlbnRUb0NoaWxkTnAgPSBpbnZlcnNlTnA7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChwYXJlbnRUb0NoaWxkTnAuaXNTY2FsYXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBvbmx5Q2hpbGQgPSB1bmF0dGFjaGVkQ2hpbGRyZW5bMF07XHJcbiAgICAgICAgICAgICAgICBlbnRpdHkuc2V0UHJvcGVydHkocGFyZW50VG9DaGlsZE5wLm5hbWUsIG9ubHlDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICBvbmx5Q2hpbGQuc2V0UHJvcGVydHkoY2hpbGRUb1BhcmVudE5wLm5hbWUsIGVudGl0eSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50Q2hpbGRyZW4gPSBlbnRpdHkuZ2V0UHJvcGVydHkocGFyZW50VG9DaGlsZE5wLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgdW5hdHRhY2hlZENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0UHJvcGVydHkoY2hpbGRUb1BhcmVudE5wLm5hbWUsIGVudGl0eSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdW5hdHRhY2hlZE1hcC5yZW1vdmVDaGlsZHJlbihrZXlzdHJpbmcsIGNoaWxkVG9QYXJlbnROcCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gdW5pZGlyZWN0aW9uYWxcclxuICAgICAgICAgICAgICAvLyBpZiAobnAuaXNTY2FsYXIgfHwgbnAucGFyZW50VHlwZSAhPT0gZW50aXR5LmVudGl0eVR5cGUpIHtcclxuICAgICAgICAgICAgICBpZiAobnAuaXNTY2FsYXIpIHtcclxuICAgICAgICAgICAgICAgIC8vIG4gLT4gMSAgZWc6IGNoaWxkOiBPcmRlckRldGFpbCBwYXJlbnQ6IFByb2R1Y3RcclxuICAgICAgICAgICAgICAgIC8vIDEgLT4gMSBlZyBjaGlsZDogRW1wbG95ZWUgcGFyZW50OiBFbXBsb3llZSAoIG9ubHkgTWFuYWdlciwgbm8gRGlyZWN0UmVwb3J0cyBwcm9wZXJ0eSlcclxuICAgICAgICAgICAgICAgIGNoaWxkVG9QYXJlbnROcCA9IG5wO1xyXG4gICAgICAgICAgICAgICAgdW5hdHRhY2hlZENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNoaWxkLnNldFByb3BlcnR5KGNoaWxkVG9QYXJlbnROcC5uYW1lLCBlbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB1bmF0dGFjaGVkTWFwLnJlbW92ZUNoaWxkcmVuKGtleXN0cmluZywgY2hpbGRUb1BhcmVudE5wKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gMSAtPiBuICBlZzogcGFyZW50OiBSZWdpb24gY2hpbGQ6IFRlcnJcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IG5lZWQgdG8gcmVtb3ZlIHVuYXR0YWNoZWQgY2hpbGRyZW4gZnJvbSB0aGUgbWFwIGFmdGVyIHRoaXM7IG9ubHkgYSBwZXJmIGlzc3VlLlxyXG4gICAgICAgICAgICAgICAgcGFyZW50VG9DaGlsZE5wID0gbnA7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudENoaWxkcmVuID0gZW50aXR5LmdldFByb3BlcnR5KHBhcmVudFRvQ2hpbGROcC5uYW1lKTtcclxuICAgICAgICAgICAgICAgIHVuYXR0YWNoZWRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IGlmIGNhbid0IGFscmVhZHkgYmUgdGhlcmUuXHJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGlsZHJlbi5fcHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbnRpdHlUeXBlID0gZW50aXR5VHlwZS5iYXNlRW50aXR5VHlwZTsgLy8gbG9vayBmb3IgcmVsYXRpb25zaGlwcyB1cCB0aGUgaGllcmFyY2h5XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICAvLyBub3cgYWRkIHRvIHVuYXR0YWNoZWRNYXAgaWYgbmVlZGVkLlxyXG4gICAgICBlbnRpdHkuZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChucCkge1xyXG4gICAgICAgIGlmIChucC5pc1NjYWxhcikge1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gZW50aXR5LmdldFByb3BlcnR5KG5wLm5hbWUpO1xyXG4gICAgICAgICAgLy8gcHJvcGVydHkgaXMgYWxyZWFkeSBsaW5rZWQgdXBcclxuICAgICAgICAgIGlmICh2YWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZmlyc3QgZGV0ZXJtaW5lIGlmIG5wIGNvbnRhaW5zIGEgcGFyZW50IG9yIGNoaWxkXHJcbiAgICAgICAgLy8gaGF2aW5nIGEgcGFyZW50S2V5IG1lYW5zIHRoYXQgdGhpcyBpcyBhIGNoaWxkXHJcbiAgICAgICAgLy8gaWYgYSBwYXJlbnQgdGhlbiBubyBuZWVkIGZvciBtb3JlIHdvcmsgYmVjYXVzZSBjaGlsZHJlbiB3aWxsIGF0dGFjaCB0byBpdC5cclxuICAgICAgICBsZXQgcGFyZW50S2V5ID0gZW50aXR5QXNwZWN0LmdldFBhcmVudEtleShucCk7XHJcbiAgICAgICAgaWYgKHBhcmVudEtleSkge1xyXG4gICAgICAgICAgLy8gY2hlY2sgZm9yIGVtcHR5IGtleXMgLSBtZWFuaW5nIHRoYXQgcGFyZW50IGlkJ3MgYXJlIG5vdCB5ZXQgc2V0LlxyXG4gICAgICAgICAgaWYgKHBhcmVudEtleS5faXNFbXB0eSgpKSByZXR1cm47XHJcbiAgICAgICAgICAvLyBpZiBhIGNoaWxkIC0gbG9vayBmb3IgcGFyZW50IGluIHRoZSBlbSBjYWNoZVxyXG4gICAgICAgICAgaWYgKG5wLmludkZvcmVpZ25LZXlOYW1lcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgLy8gbnAgcmVsYXRlcyB0byBub24tUEsgcHJvcGVydHkgb2YgcGFyZW50IGVudGl0eVxyXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShwYXJlbnRLZXkuZW50aXR5VHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKS53aGVyZShucC5pbnZGb3JlaWduS2V5TmFtZXNbMF0sICdlcScsIHBhcmVudEtleS52YWx1ZXNbMF0pO1xyXG4gICAgICAgICAgICBjb25zdCBxcmVzdWx0ID0gZW0uZXhlY3V0ZVF1ZXJ5TG9jYWxseShxdWVyeSk7XHJcbiAgICAgICAgICAgIGlmIChxcmVzdWx0Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBxcmVzdWx0WzBdO1xyXG4gICAgICAgICAgICAgIGVudGl0eS5zZXRQcm9wZXJ0eShucC5uYW1lLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBucCByZWxhdGVzIHRvIFBLIG9mIHBhcmVudCBlbnRpdHlcclxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVtLmdldEVudGl0eUJ5S2V5KHBhcmVudEtleSk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgICAvLyBpZiBmb3VuZCBob29rIGl0IHVwXHJcbiAgICAgICAgICAgICAgZW50aXR5LnNldFByb3BlcnR5KG5wLm5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gZWxzZSBhZGQgcGFyZW50IHRvIHVucmVzb2x2ZWRQYXJlbnRNYXA7XHJcbiAgICAgICAgICAgICAgdW5hdHRhY2hlZE1hcC5hZGRDaGlsZChwYXJlbnRLZXksIG5wLCBlbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChucC5pbnZlcnNlICYmIG5wLmludmVyc2UuaW52Rm9yZWlnbktleU5hbWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgLy8gbnAgcmVsYXRlcyB0byBub24tUEsgcHJvcGVydHkgb2YgcGFyZW50IGVudGl0eTsgcXVlcnkgZW50aXRpZXMgYnkgRktcclxuICAgICAgICAgIGNvbnN0IGFrVmFsdWUgPSBlbnRpdHkuZ2V0UHJvcGVydHkobnAuaW52ZXJzZS5pbnZGb3JlaWduS2V5TmFtZXNbMF0pO1xyXG4gICAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkobnAuZW50aXR5VHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKS53aGVyZShucC5pbnZGb3JlaWduS2V5TmFtZXNbMF0sICdlcScsIGFrVmFsdWUpO1xyXG4gICAgICAgICAgY29uc3QgcXJlc3VsdCA9IGVtLmV4ZWN1dGVRdWVyeUxvY2FsbHkocXVlcnkpO1xyXG4gICAgICAgICAgcXJlc3VsdC5mb3JFYWNoKChjaGlsZDogRW50aXR5KSA9PiB7XHJcbiAgICAgICAgICAgIGNoaWxkLnNldFByb3BlcnR5KG5wLmludmVyc2UubmFtZSwgZW50aXR5KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBoYW5kbGUgdW5pZGlyZWN0aW9uYWwgMS14IHdoZXJlIHdlIHNldCB4LmZrXHJcbiAgICAgIGVudGl0eS5lbnRpdHlUeXBlLmZvcmVpZ25LZXlQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGZrUHJvcCkge1xyXG4gICAgICAgIGxldCBpbnZOcCA9IGZrUHJvcC5pbnZlcnNlTmF2aWdhdGlvblByb3BlcnR5O1xyXG4gICAgICAgIGlmICghaW52TnApIHJldHVybjtcclxuICAgICAgICAvLyB1bmlkaXJlY3Rpb25hbCBmayBwcm9wcyBvbmx5XHJcbiAgICAgICAgbGV0IGZrVmFsdWUgPSBlbnRpdHkuZ2V0UHJvcGVydHkoZmtQcm9wLm5hbWUpO1xyXG4gICAgICAgIGxldCBwYXJlbnRLZXkgPSBuZXcgRW50aXR5S2V5KGludk5wLnBhcmVudFR5cGUsIFtma1ZhbHVlXSk7XHJcbiAgICAgICAgbGV0IHBhcmVudCA9IGVtLmdldEVudGl0eUJ5S2V5KHBhcmVudEtleSk7XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgIGlmIChpbnZOcC5pc1NjYWxhcikge1xyXG4gICAgICAgICAgICBwYXJlbnQuc2V0UHJvcGVydHkoaW52TnAubmFtZSwgZW50aXR5KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChlbS5pc0xvYWRpbmcpIHtcclxuICAgICAgICAgICAgICBwYXJlbnQuZ2V0UHJvcGVydHkoaW52TnAubmFtZSkuX3B1c2goZW50aXR5KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBwYXJlbnQuZ2V0UHJvcGVydHkoaW52TnAubmFtZSkucHVzaChlbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGVsc2UgYWRkIHBhcmVudCB0byB1bnJlc29sdmVkUGFyZW50TWFwO1xyXG4gICAgICAgICAgdW5hdHRhY2hlZE1hcC5hZGRDaGlsZChwYXJlbnRLZXksIGludk5wLCBlbnRpdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfYXR0YWNoRW50aXR5Q29yZShlbnRpdHk6IEVudGl0eSwgZW50aXR5U3RhdGU6IEVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5OiBNZXJnZVN0cmF0ZWd5KSB7XHJcbiAgICBsZXQgZ3JvdXAgPSBmaW5kT3JDcmVhdGVFbnRpdHlHcm91cCh0aGlzLCBlbnRpdHkuZW50aXR5VHlwZSk7XHJcbiAgICBsZXQgYXR0YWNoZWRFbnRpdHkgPSBncm91cC5hdHRhY2hFbnRpdHkoZW50aXR5LCBlbnRpdHlTdGF0ZSwgbWVyZ2VTdHJhdGVneSk7XHJcbiAgICB0aGlzLl9saW5rUmVsYXRlZEVudGl0aWVzKGF0dGFjaGVkRW50aXR5KTtcclxuICAgIHJldHVybiBhdHRhY2hlZEVudGl0eTtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF91cGRhdGVGa1ZhbChma1Byb3A6IERhdGFQcm9wZXJ0eSwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkge1xyXG4gICAgbGV0IGdyb3VwID0gdGhpcy5fZW50aXR5R3JvdXBNYXBbZmtQcm9wLnBhcmVudFR5cGUubmFtZV07XHJcbiAgICBpZiAoIWdyb3VwKSByZXR1cm47XHJcbiAgICBncm91cC5fdXBkYXRlRmtWYWwoZmtQcm9wLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gIH1cclxufVxyXG5cclxuRW50aXR5TWFuYWdlci5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiRW50aXR5TWFuYWdlclwiO1xyXG5cclxuQnJlZXplRXZlbnQuYnViYmxlRXZlbnQoRW50aXR5TWFuYWdlci5wcm90b3R5cGUpO1xyXG5cclxuZnVuY3Rpb24gY2xlYXJTZXJ2ZXJFcnJvcnMoZW50aXRpZXM6IEVudGl0eVtdKSB7XHJcbiAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XHJcbiAgICBsZXQgc2VydmVyS2V5czogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCBhc3BlY3QgPSBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gICAgY29yZS5vYmplY3RGb3JFYWNoKGFzcGVjdC5fdmFsaWRhdGlvbkVycm9ycywgZnVuY3Rpb24gKGtleSwgdmUpIHtcclxuICAgICAgaWYgKHZlLmlzU2VydmVyRXJyb3IpIHNlcnZlcktleXMucHVzaChrZXkpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoc2VydmVyS2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgIGFzcGVjdC5fcHJvY2Vzc1ZhbGlkYXRpb25PcEFuZFB1Ymxpc2goZnVuY3Rpb24gKCkge1xyXG4gICAgICBzZXJ2ZXJLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIGFzcGVjdC5fcmVtb3ZlVmFsaWRhdGlvbkVycm9yKGtleSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUVudGl0eUVycm9ycyhlbnRpdGllczogRW50aXR5W10pIHtcclxuICBsZXQgZW50aXR5RXJyb3JzOiBFbnRpdHlFcnJvcltdID0gW107XHJcbiAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XHJcbiAgICBjb3JlLm9iamVjdEZvckVhY2goZW50aXR5LmVudGl0eUFzcGVjdC5fdmFsaWRhdGlvbkVycm9ycywgZnVuY3Rpb24gKGtleSwgdmUpIHtcclxuICAgICAgbGV0IGNmZyA9IGNvcmUuZXh0ZW5kKHtcclxuICAgICAgICBlbnRpdHk6IGVudGl0eSxcclxuICAgICAgICBlcnJvck5hbWU6IHZlLnZhbGlkYXRvci5uYW1lXHJcbiAgICAgIH0sIHZlLCBbXCJlcnJvck1lc3NhZ2VcIiwgXCJwcm9wZXJ0eU5hbWVcIiwgXCJpc1NlcnZlckVycm9yXCIsIFwiY3VzdG9tXCJdKSBhcyBFbnRpdHlFcnJvcjtcclxuICAgICAgZW50aXR5RXJyb3JzLnB1c2goY2ZnKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG4gIHJldHVybiBlbnRpdHlFcnJvcnM7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzU2VydmVyRXJyb3JzKHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCwgc2F2ZUVycm9yOiBTYXZlRXJyb3JGcm9tU2VydmVyKSB7XHJcbiAgLy8gY29udmVydGluZyBJU2F2ZUVycm9yRnJvbVNlcnZlciAtPiBJU2F2ZUVycm9yXHJcbiAgbGV0IHNlcnZlckVycm9ycyA9IHNhdmVFcnJvci5lbnRpdHlFcnJvcnM7XHJcbiAgaWYgKCFzZXJ2ZXJFcnJvcnMpIHJldHVybiA8U2F2ZUVycm9yPiA8YW55PiBzYXZlRXJyb3I7XHJcbiAgbGV0IGVudGl0eU1hbmFnZXIgPSBzYXZlQ29udGV4dC5lbnRpdHlNYW5hZ2VyO1xyXG4gIGxldCBtZXRhZGF0YVN0b3JlID0gZW50aXR5TWFuYWdlci5tZXRhZGF0YVN0b3JlO1xyXG4gIGxldCBlbnRpdHlFcnJvcnMgPSBzZXJ2ZXJFcnJvcnMubWFwKChzZXJyKSA9PiB7XHJcbiAgICBsZXQgZW50aXR5OiBFbnRpdHkgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKHNlcnIua2V5VmFsdWVzKSB7XHJcbiAgICAgIGVudGl0eVR5cGUgPSBtZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShzZXJyLmVudGl0eVR5cGVOYW1lKSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgICBsZXQgZWtleSA9IG5ldyBFbnRpdHlLZXkoZW50aXR5VHlwZSwgc2Vyci5rZXlWYWx1ZXMpO1xyXG4gICAgICBlbnRpdHkgPSBlbnRpdHlNYW5hZ2VyLmdldEVudGl0eUJ5S2V5KGVrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbnRpdHlUeXBlICYmIGVudGl0eSkge1xyXG4gICAgICBsZXQgY29udGV4dCA9IHNlcnIucHJvcGVydHlOYW1lID9cclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHNlcnIucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgcHJvcGVydHk6IGVudGl0eVR5cGUuZ2V0UHJvcGVydHkoc2Vyci5wcm9wZXJ0eU5hbWUpXHJcbiAgICAgICAgfSA6IHtcclxuICAgICAgICB9O1xyXG4gICAgICBsZXQga2V5ID0gVmFsaWRhdGlvbkVycm9yLmdldEtleShzZXJyLmVycm9yTmFtZSB8fCBzZXJyLmVycm9yTWVzc2FnZSwgc2Vyci5wcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgICAgbGV0IHZlID0gbmV3IFZhbGlkYXRpb25FcnJvcihudWxsLCBjb250ZXh0LCBzZXJyLmVycm9yTWVzc2FnZSwga2V5KTtcclxuICAgICAgdmUuaXNTZXJ2ZXJFcnJvciA9IHRydWU7XHJcbiAgICAgIGVudGl0eS5lbnRpdHlBc3BlY3QuYWRkVmFsaWRhdGlvbkVycm9yKHZlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZW50aXR5RXJyb3IgPSBjb3JlLmV4dGVuZCh7XHJcbiAgICAgIGVudGl0eTogZW50aXR5LFxyXG4gICAgICBpc1NlcnZlckVycm9yOiB0cnVlXHJcbiAgICB9LCBzZXJyLCBbXCJlcnJvck5hbWVcIiwgXCJlcnJvck1lc3NhZ2VcIiwgXCJwcm9wZXJ0eU5hbWVcIiwgXCJjdXN0b21cIl0pIGFzIEVudGl0eUVycm9yO1xyXG4gICAgcmV0dXJuIGVudGl0eUVycm9yO1xyXG4gIH0pO1xyXG4gIC8vIGNvbnZlcnRpbmcgSVNhdmVFcnJvckZyb21TZXJ2ZXIgLT4gSVNhdmVFcnJvciBcclxuICBzYXZlRXJyb3IuZW50aXR5RXJyb3JzID0gZW50aXR5RXJyb3JzIGFzIGFueTtcclxuICByZXR1cm4gPFNhdmVFcnJvcj4gPGFueT4gc2F2ZUVycm9yO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFbnRpdHlCeUtleVJlc3VsdCB7XHJcbiAgZW50aXR5PzogRW50aXR5O1xyXG4gIGVudGl0eUtleTogRW50aXR5S2V5O1xyXG4gIGZyb21DYWNoZTogYm9vbGVhbjtcclxufVxyXG5cclxuZnVuY3Rpb24gZmV0Y2hFbnRpdHlCeUtleUNvcmUoZW06IEVudGl0eU1hbmFnZXIsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxJRW50aXR5QnlLZXlSZXN1bHQ+IHtcclxuICBsZXQgdHBsID0gY3JlYXRlRW50aXR5S2V5KGVtLCBhcmdzKTtcclxuICBsZXQgZW50aXR5S2V5ID0gdHBsLmVudGl0eUtleTtcclxuXHJcbiAgbGV0IGNoZWNrTG9jYWxDYWNoZUZpcnN0ID0gdHBsLnJlbWFpbmluZ0FyZ3MubGVuZ3RoID09PSAwID8gZmFsc2UgOiAhIXRwbC5yZW1haW5pbmdBcmdzWzBdO1xyXG4gIGxldCBlbnRpdHk6IEVudGl0eSB8IG51bGwgPSBudWxsO1xyXG4gIGxldCBmb3VuZEl0ID0gZmFsc2U7XHJcbiAgaWYgKGNoZWNrTG9jYWxDYWNoZUZpcnN0KSB7XHJcbiAgICBlbnRpdHkgPSBlbS5nZXRFbnRpdHlCeUtleShlbnRpdHlLZXkpO1xyXG4gICAgZm91bmRJdCA9IGVudGl0eSAhPSBudWxsO1xyXG4gICAgaWYgKGVudGl0eSAhPSBudWxsICYmXHJcbiAgICAgIC8vIG51bGwgdGhlIGVudGl0eSBpZiBpdCBpcyBkZWxldGVkIGFuZCB3ZSBzaG91bGQgZXhjbHVkZSBkZWxldGVkIGVudGl0aWVzXHJcbiAgICAgICFlbS5xdWVyeU9wdGlvbnMuaW5jbHVkZURlbGV0ZWQgJiYgZW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc0RlbGV0ZWQoKSkge1xyXG4gICAgICBlbnRpdHkgPSBudWxsO1xyXG4gICAgICAvLyBidXQgcmVzdW1lIGxvb2tpbmcgaWYgd2UnZCBvdmVyd3JpdGUgZGVsZXRlZCBlbnRpdHkgd2l0aCBhIHJlbW90ZSBlbnRpdHlcclxuICAgICAgLy8gbm90ZTogZW0ucXVlcnlPcHRpb25zIGlzIGFsd2F5cyBmdWxseSByZXNvbHZlZCBieSBub3dcclxuICAgICAgZm91bmRJdCA9IGVtLnF1ZXJ5T3B0aW9ucy5tZXJnZVN0cmF0ZWd5ICE9PSBNZXJnZVN0cmF0ZWd5Lk92ZXJ3cml0ZUNoYW5nZXM7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChmb3VuZEl0KSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZW50aXR5OiBlbnRpdHkgfHwgdW5kZWZpbmVkLCBlbnRpdHlLZXk6IGVudGl0eUtleSwgZnJvbUNhY2hlOiB0cnVlIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gRW50aXR5UXVlcnkuZnJvbUVudGl0eUtleShlbnRpdHlLZXkpLnVzaW5nKGVtKS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgIGVudGl0eSA9IChkYXRhLnJlc3VsdHMubGVuZ3RoID09PSAwKSA/IG51bGwgOiBkYXRhLnJlc3VsdHNbMF07XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBlbnRpdHk6IGVudGl0eSB8fCB1bmRlZmluZWQsIGVudGl0eUtleTogZW50aXR5S2V5LCBmcm9tQ2FjaGU6IGZhbHNlIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8gcHJpdmF0ZSBmbnNcclxuXHJcbi8vIHRha2VzIGluIGVudGl0eVR5cGVzIGFzIGVpdGhlciBzdHJpbmdzIG9yIGVudGl0eVR5cGVzIG9yIGFycmF5cyBvZiBlaXRoZXJcclxuLy8gYW5kIHJldHVybnMgZWl0aGVyIGFuIGVudGl0eVR5cGUgb3IgYW4gYXJyYXkgb2YgZW50aXR5VHlwZXMgb3IgdGhyb3dzIGFuIGVycm9yXHJcbmZ1bmN0aW9uIGNoZWNrRW50aXR5VHlwZXMoZW06IEVudGl0eU1hbmFnZXIsIGVudGl0eVR5cGVzPzogRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSB8IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgYXNzZXJ0UGFyYW0oZW50aXR5VHlwZXMsIFwiZW50aXR5VHlwZXNcIikuaXNTdHJpbmcoKS5pc09wdGlvbmFsKCkub3IoKS5pc05vbkVtcHR5QXJyYXkoKS5pc1N0cmluZygpXHJcbiAgICAub3IoKS5pc0luc3RhbmNlT2YoRW50aXR5VHlwZSkub3IoKS5pc05vbkVtcHR5QXJyYXkoKS5pc0luc3RhbmNlT2YoRW50aXR5VHlwZSkuY2hlY2soKTtcclxuICBsZXQgcmVzdWx0VHlwZXM6IEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQ7XHJcbiAgaWYgKHR5cGVvZiBlbnRpdHlUeXBlcyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgcmVzdWx0VHlwZXMgPSBlbS5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShlbnRpdHlUeXBlcywgZmFsc2UpIGFzIChFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdKTtcclxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZW50aXR5VHlwZXMpICYmIHR5cGVvZiBlbnRpdHlUeXBlc1swXSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgcmVzdWx0VHlwZXMgPSAoZW50aXR5VHlwZXMgYXMgc3RyaW5nW10pLm1hcChmdW5jdGlvbiAoZXROYW1lKSB7XHJcbiAgICAgIHJldHVybiBlbS5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShldE5hbWUsIGZhbHNlKSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJlc3VsdFR5cGVzID0gZW50aXR5VHlwZXMgYXMgKEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdFR5cGVzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDaGFuZ2VzQ29yZShlbTogRW50aXR5TWFuYWdlciwgZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdKSB7XHJcbiAgbGV0IGVudGl0eUdyb3VwcyA9IGdldEVudGl0eUdyb3VwcyhlbSwgZW50aXR5VHlwZXMpO1xyXG5cclxuICAvLyBUT0RPOiB0aGluayBhYm91dCB3cml0aW5nIGEgY29yZS5tYXBNYW55IG1ldGhvZCBpZiB3ZSBzZWUgbW9yZSBvZiB0aGVzZS5cclxuICBsZXQgc2VsZWN0ZWQ6IEVudGl0eVtdID0gW107XHJcbiAgZW50aXR5R3JvdXBzLmZvckVhY2goZnVuY3Rpb24gKGVnKSB7XHJcbiAgICAvLyBlZyBtYXkgYmUgdW5kZWZpbmVkIG9yIG51bGxcclxuICAgIGlmICghZWcpIHJldHVybjtcclxuICAgIGxldCBlbnRpdGllcyA9IGVnLmdldENoYW5nZXMoKTtcclxuICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZC5jb25jYXQoZW50aXRpZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0ZWQgPSBlbnRpdGllcztcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gc2VsZWN0ZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEVudGl0aWVzQ29yZShlbTogRW50aXR5TWFuYWdlciwgZW50aXR5VHlwZXM6IEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQsIGVudGl0eVN0YXRlczogRW50aXR5U3RhdGVbXSkge1xyXG4gIGxldCBlbnRpdHlHcm91cHMgPSBnZXRFbnRpdHlHcm91cHMoZW0sIGVudGl0eVR5cGVzKTtcclxuXHJcbiAgLy8gVE9ETzogdGhpbmsgYWJvdXQgd3JpdGluZyBhIGNvcmUubWFwTWFueSBtZXRob2QgaWYgd2Ugc2VlIG1vcmUgb2YgdGhlc2UuXHJcbiAgbGV0IHNlbGVjdGVkOiBFbnRpdHlbXSA9IFtdO1xyXG4gIGVudGl0eUdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uIChlZykge1xyXG4gICAgLy8gZWcgbWF5IGJlIHVuZGVmaW5lZCBvciBudWxsXHJcbiAgICBpZiAoIWVnKSByZXR1cm47XHJcbiAgICBsZXQgZW50aXRpZXMgPSBlZy5nZXRFbnRpdGllcyhlbnRpdHlTdGF0ZXMpO1xyXG4gICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCkge1xyXG4gICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkLmNvbmNhdChlbnRpdGllcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZWxlY3RlZCA9IGVudGl0aWVzO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBzZWxlY3RlZDtcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUVudGl0eUtleShlbTogRW50aXR5TWFuYWdlciwgYXJnczogYW55W10pIHtcclxuICB0cnkge1xyXG4gICAgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBFbnRpdHlLZXkpIHtcclxuICAgICAgcmV0dXJuIHsgZW50aXR5S2V5OiBhcmdzWzBdIGFzIEVudGl0eUtleSwgcmVtYWluaW5nQXJnczogY29yZS5hcnJheVNsaWNlKGFyZ3MsIDEpIH07XHJcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID49IDIpIHtcclxuICAgICAgbGV0IGVudGl0eVR5cGUgPSAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSA/IGVtLm1ldGFkYXRhU3RvcmUuX2dldFN0cnVjdHVyYWxUeXBlKGFyZ3NbMF0sIGZhbHNlKSA6IGFyZ3NbMF07XHJcbiAgICAgIHJldHVybiB7IGVudGl0eUtleTogbmV3IEVudGl0eUtleShlbnRpdHlUeXBlLCBhcmdzWzFdKSwgcmVtYWluaW5nQXJnczogY29yZS5hcnJheVNsaWNlKGFyZ3MsIDIpIH07XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZSkgey8qIHRocm93IGJlbG93ICovXHJcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IHN1cHBseSBhbiBFbnRpdHlLZXkgT1IgYW4gRW50aXR5VHlwZSBuYW1lIG9yIEVudGl0eVR5cGUgZm9sbG93ZWQgYnkgYSBrZXkgdmFsdWUgb3IgYW4gYXJyYXkgb2Yga2V5IHZhbHVlcy5cIik7XHJcbiAgfVxyXG4gIHRocm93IG5ldyBFcnJvcihcIk11c3Qgc3VwcGx5IGFuIEVudGl0eUtleSBPUiBhbiBFbnRpdHlUeXBlIG5hbWUgb3IgRW50aXR5VHlwZSBmb2xsb3dlZCBieSBhIGtleSB2YWx1ZSBvciBhbiBhcnJheSBvZiBrZXkgdmFsdWVzLlwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWFya0lzQmVpbmdTYXZlZChlbnRpdGllczogRW50aXR5W10sIGZsYWc6IGJvb2xlYW4pIHtcclxuICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcclxuICAgIGVudGl0eS5lbnRpdHlBc3BlY3QuaXNCZWluZ1NhdmVkID0gZmxhZztcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZXhwb3J0RW50aXR5R3JvdXBzKGVtOiBFbnRpdHlNYW5hZ2VyLCBlbnRpdGllc09yRW50aXR5VHlwZXM6IEVudGl0eVtdIHwgRW50aXR5VHlwZVtdIHwgc3RyaW5nW10pIHtcclxuICBsZXQgZW50aXR5R3JvdXBNYXA6IHsgW2luZGV4OiBzdHJpbmddOiBFbnRpdHlHcm91cCB9O1xyXG4gIGxldCBmaXJzdCA9IGVudGl0aWVzT3JFbnRpdHlUeXBlcyAmJiBlbnRpdGllc09yRW50aXR5VHlwZXNbMF07XHJcbiAgLy8gY2hlY2sgaWYgYXJyYXlcclxuICBpZiAoZmlyc3QpIHtcclxuICAgIC8vIGdyb3VwIGVudGl0aWVzIGJ5IGVudGl0eVR5cGUgYW5kXHJcbiAgICAvLyBjcmVhdGUgJ2dyb3VwcycgdGhhdCBsb29rIGxpa2UgZW50aXR5R3JvdXBzLlxyXG4gICAgZW50aXR5R3JvdXBNYXAgPSB7fTtcclxuICAgIGlmICgoZmlyc3QgYXMgYW55KS5lbnRpdHlUeXBlKSB7XHJcbiAgICAgIGxldCBlbnRpdGllcyA9IGVudGl0aWVzT3JFbnRpdHlUeXBlcyBhcyBFbnRpdHlbXTtcclxuICAgICAgLy8gYXNzdW1lIFwiZW50aXRpZXNcIiBpcyBhbiBhcnJheSBvZiBlbnRpdGllcztcclxuICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmIChlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZSA9PT0gRW50aXR5U3RhdGUuRGV0YWNoZWQpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBleHBvcnQgYW4gZW50aXR5IHdpdGggYW4gRW50aXR5U3RhdGUgb2YgJ0RldGFjaGVkJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGdyb3VwID0gZW50aXR5R3JvdXBNYXBbZS5lbnRpdHlUeXBlLm5hbWVdO1xyXG4gICAgICAgIGlmICghZ3JvdXApIHtcclxuICAgICAgICAgIGdyb3VwID0ge30gYXMgRW50aXR5R3JvdXA7XHJcbiAgICAgICAgICBncm91cC5lbnRpdHlUeXBlID0gZS5lbnRpdHlUeXBlO1xyXG4gICAgICAgICAgZ3JvdXAuX2VudGl0aWVzID0gW107XHJcbiAgICAgICAgICBlbnRpdHlHcm91cE1hcFtlLmVudGl0eVR5cGUubmFtZV0gPSBncm91cDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ3JvdXAuX2VudGl0aWVzLnB1c2goZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gYXNzdW1lIFwiZW50aXRpZXNcIiBpcyBhbiBhcnJheSBvZiBFbnRpdHlUeXBlcyAob3IgbmFtZXMpXHJcbiAgICAgIGxldCBlbnRpdHlUeXBlcyA9IGNoZWNrRW50aXR5VHlwZXMoZW0sIGVudGl0aWVzT3JFbnRpdHlUeXBlcyBhcyBFbnRpdHlUeXBlW10gfCBzdHJpbmdbXSkgYXMgRW50aXR5VHlwZVtdO1xyXG4gICAgICBpZiAoZW50aXR5VHlwZXMgIT0gbnVsbCkge1xyXG4gICAgICAgIGVudGl0eVR5cGVzLmZvckVhY2goKGV0KSA9PiB7XHJcbiAgICAgICAgICBsZXQgZ3JvdXAgPSBlbS5fZW50aXR5R3JvdXBNYXBbZXQubmFtZV07XHJcbiAgICAgICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuX2VudGl0aWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBlbnRpdHlHcm91cE1hcFtldC5uYW1lXSA9IGdyb3VwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChlbnRpdGllc09yRW50aXR5VHlwZXMgJiYgZW50aXRpZXNPckVudGl0eVR5cGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgLy8gZW1wdHkgYXJyYXkgPSBleHBvcnQgbm90aGluZ1xyXG4gICAgZW50aXR5R3JvdXBNYXAgPSB7fTtcclxuICB9IGVsc2Uge1xyXG4gICAgZW50aXR5R3JvdXBNYXAgPSBlbS5fZW50aXR5R3JvdXBNYXA7XHJcbiAgfVxyXG5cclxuICBsZXQgdGVtcEtleXM6IElUZW1wS2V5W10gPSBbXTtcclxuICBsZXQgbmV3R3JvdXBNYXAgPSB7fTtcclxuICBjb3JlLm9iamVjdEZvckVhY2goZW50aXR5R3JvdXBNYXAsIChlbnRpdHlUeXBlTmFtZSwgZW50aXR5R3JvdXApID0+IHtcclxuICAgIG5ld0dyb3VwTWFwW2VudGl0eVR5cGVOYW1lXSA9IGV4cG9ydEVudGl0eUdyb3VwKGVudGl0eUdyb3VwLCB0ZW1wS2V5cyk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiB7IGVudGl0eUdyb3VwTWFwOiBuZXdHcm91cE1hcCwgdGVtcEtleXM6IHRlbXBLZXlzIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4cG9ydEVudGl0eUdyb3VwKGVudGl0eUdyb3VwOiBFbnRpdHlHcm91cCwgdGVtcEtleXM6IElUZW1wS2V5W10pIHtcclxuICBsZXQgcmVzdWx0R3JvdXAgPSB7fSBhcyB7IGVudGl0aWVzOiBhbnlbXSB9O1xyXG4gIGxldCBlbnRpdHlUeXBlID0gZW50aXR5R3JvdXAuZW50aXR5VHlwZTtcclxuICBsZXQgZHBzID0gZW50aXR5VHlwZS5kYXRhUHJvcGVydGllcztcclxuICBsZXQgc2VyaWFsaXplckZuID0gZ2V0U2VyaWFsaXplckZuKGVudGl0eVR5cGUpO1xyXG4gIGxldCByYXdFbnRpdGllczogYW55W10gPSBbXTtcclxuICBlbnRpdHlHcm91cC5fZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XHJcbiAgICBpZiAoZW50aXR5KSB7XHJcbiAgICAgIGxldCByYXdFbnRpdHkgPSBzdHJ1Y3R1cmFsT2JqZWN0VG9Kc29uKGVudGl0eSwgZHBzLCBzZXJpYWxpemVyRm4sIHRlbXBLZXlzKTtcclxuICAgICAgcmF3RW50aXRpZXMucHVzaChyYXdFbnRpdHkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJlc3VsdEdyb3VwLmVudGl0aWVzID0gcmF3RW50aXRpZXM7XHJcbiAgcmV0dXJuIHJlc3VsdEdyb3VwO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdHJ1Y3R1cmFsT2JqZWN0VG9Kc29uKHNvOiBTdHJ1Y3R1cmFsT2JqZWN0LCBkcHM6IERhdGFQcm9wZXJ0eVtdLCBzZXJpYWxpemVyRm4/OiAoZHA6IERhdGFQcm9wZXJ0eSwgdmFsdWU6IGFueSkgPT4gYW55LCB0ZW1wS2V5cz86IElUZW1wS2V5W10pIHtcclxuXHJcbiAgbGV0IHJlc3VsdCA9IHt9O1xyXG4gIGRwcy5mb3JFYWNoKGZ1bmN0aW9uIChkcCkge1xyXG4gICAgbGV0IGRwTmFtZSA9IGRwLm5hbWU7XHJcbiAgICBsZXQgdmFsdWUgPSBzby5nZXRQcm9wZXJ0eShkcE5hbWUpO1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwgJiYgZHAuZGVmYXVsdFZhbHVlID09IG51bGwpIHJldHVybjtcclxuXHJcbiAgICBpZiAodmFsdWUgJiYgZHAuaXNDb21wbGV4UHJvcGVydHkpIHtcclxuICAgICAgbGV0IGNvRHBzID0gKGRwLmRhdGFUeXBlIGFzIENvbXBsZXhUeXBlKS5kYXRhUHJvcGVydGllcztcclxuICAgICAgdmFsdWUgPSBjb3JlLm1hcCh2YWx1ZSwgZnVuY3Rpb24gKHY6IENvbXBsZXhPYmplY3QpIHtcclxuICAgICAgICByZXR1cm4gc3RydWN0dXJhbE9iamVjdFRvSnNvbih2LCBjb0Rwcywgc2VyaWFsaXplckZuKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWx1ZSA9IHNlcmlhbGl6ZXJGbiA/IHNlcmlhbGl6ZXJGbihkcCwgdmFsdWUpIDogdmFsdWU7XHJcbiAgICAgIGlmIChkcC5pc1VubWFwcGVkKSB7XHJcbiAgICAgICAgdmFsdWUgPSBjb3JlLnRvSlNPTlNhZmUodmFsdWUsIGNvcmUudG9KU09OU2FmZVJlcGxhY2VyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgIHJlc3VsdFtkcE5hbWVdID0gdmFsdWU7XHJcbiAgfSk7XHJcblxyXG4gIC8vIGlmIChzby5lbnRpdHlBc3BlY3QpIHtcclxuICBpZiAoRW50aXR5QXNwZWN0LmlzRW50aXR5KHNvKSkge1xyXG4gICAgbGV0IGFzcGVjdCA9IHNvLmVudGl0eUFzcGVjdDtcclxuICAgIGxldCBlbnRpdHlTdGF0ZSA9IGFzcGVjdC5lbnRpdHlTdGF0ZTtcclxuICAgIGxldCBuZXdBc3BlY3QgPSB7XHJcbiAgICAgIHRlbXBOYXZQcm9wTmFtZXM6IGV4cG9ydFRlbXBLZXlJbmZvKGFzcGVjdCwgdGVtcEtleXMgfHwgW10pLFxyXG4gICAgICBlbnRpdHlTdGF0ZTogZW50aXR5U3RhdGUubmFtZVxyXG4gICAgfSBhcyBhbnk7XHJcbiAgICBpZiAoYXNwZWN0LmV4dHJhTWV0YWRhdGEpIHtcclxuICAgICAgbmV3QXNwZWN0LmV4dHJhTWV0YWRhdGEgPSBhc3BlY3QuZXh0cmFNZXRhZGF0YTtcclxuICAgIH1cclxuICAgIGlmIChlbnRpdHlTdGF0ZS5pc01vZGlmaWVkKCkgfHwgZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgbmV3QXNwZWN0Lm9yaWdpbmFsVmFsdWVzTWFwID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgfVxyXG4gICAgKHJlc3VsdCBhcyBhbnkpLmVudGl0eUFzcGVjdCA9IG5ld0FzcGVjdDtcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IGFzcGVjdCA9IHNvLmNvbXBsZXhBc3BlY3Q7XHJcbiAgICBsZXQgbmV3QXNwZWN0ID0ge30gYXMgYW55O1xyXG4gICAgaWYgKGFzcGVjdC5vcmlnaW5hbFZhbHVlcyAmJiAhY29yZS5pc0VtcHR5KGFzcGVjdC5vcmlnaW5hbFZhbHVlcykpIHtcclxuICAgICAgbmV3QXNwZWN0Lm9yaWdpbmFsVmFsdWVzTWFwID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgfVxyXG5cclxuICAgIChyZXN1bHQgYXMgYW55KS5jb21wbGV4QXNwZWN0ID0gbmV3QXNwZWN0O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElUZW1wS2V5IHtcclxuICBlbnRpdHlUeXBlOiBzdHJpbmc7XHJcbiAgdmFsdWVzOiBhbnlbXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZXhwb3J0VGVtcEtleUluZm8oZW50aXR5QXNwZWN0OiBFbnRpdHlBc3BlY3QsIHRlbXBLZXlzOiBJVGVtcEtleVtdKSB7XHJcbiAgbGV0IGVudGl0eSA9IGVudGl0eUFzcGVjdC5lbnRpdHkgYXMgRW50aXR5O1xyXG4gIGlmIChlbnRpdHlBc3BlY3QuaGFzVGVtcEtleSkge1xyXG4gICAgdGVtcEtleXMucHVzaChlbnRpdHlBc3BlY3QuZ2V0S2V5KCkudG9KU09OKCkpO1xyXG4gIH1cclxuICAvLyBjcmVhdGUgbWFwIGZvciB0aGlzIGVudGl0eSB3aXRoIGZvcmVpZ25LZXlzIHRoYXQgYXJlICd0ZW1wb3JhcnknXHJcbiAgLy8gbWFwIC0+IGtleTogdGVtcEtleSwgdmFsdWU6IGZrUHJvcE5hbWVcclxuICBsZXQgdGVtcE5hdlByb3BOYW1lczogc3RyaW5nW10gPSBbXTtcclxuICBlbnRpdHkuZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChucCkge1xyXG4gICAgaWYgKG5wLnJlbGF0ZWREYXRhUHJvcGVydGllcykge1xyXG4gICAgICBsZXQgcmVsYXRlZFZhbHVlID0gZW50aXR5LmdldFByb3BlcnR5KG5wLm5hbWUpO1xyXG4gICAgICBpZiAocmVsYXRlZFZhbHVlICYmIHJlbGF0ZWRWYWx1ZS5lbnRpdHlBc3BlY3QuaGFzVGVtcEtleSkge1xyXG4gICAgICAgIHRlbXBOYXZQcm9wTmFtZXMucHVzaChucC5uYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiB0ZW1wTmF2UHJvcE5hbWVzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbXBvcnRFbnRpdHlHcm91cChlbnRpdHlHcm91cDogRW50aXR5R3JvdXAsIGpzb25Hcm91cDogeyBlbnRpdGllczogYW55W10gfSwgaW1wb3J0Q29uZmlnOiBJbXBvcnRDb25maWdFeHQpIHtcclxuXHJcbiAgbGV0IHRlbXBLZXlNYXAgPSBpbXBvcnRDb25maWcudGVtcEtleU1hcDtcclxuICBsZXQgbWVyZ2VBZGRzID0gISFpbXBvcnRDb25maWcubWVyZ2VBZGRzO1xyXG5cclxuICBsZXQgZW50aXR5VHlwZSA9IGVudGl0eUdyb3VwLmVudGl0eVR5cGU7XHJcbiAgbGV0IG1lcmdlU3RyYXRlZ3kgPSBpbXBvcnRDb25maWcubWVyZ2VTdHJhdGVneTtcclxuXHJcbiAgbGV0IHRhcmdldEVudGl0eTogRW50aXR5IHwgdW5kZWZpbmVkO1xyXG5cclxuICBsZXQgZW0gPSBlbnRpdHlHcm91cC5lbnRpdHlNYW5hZ2VyO1xyXG4gIGxldCBlbnRpdHlDaGFuZ2VkID0gZW0uZW50aXR5Q2hhbmdlZDtcclxuICBsZXQgZW50aXRpZXNUb0xpbms6IEVudGl0eVtdID0gW107XHJcbiAgbGV0IHJhd1ZhbHVlRm4gPSBEYXRhUHJvcGVydHkuZ2V0UmF3VmFsdWVGcm9tQ2xpZW50O1xyXG4gIGpzb25Hcm91cC5lbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChyYXdFbnRpdHk6IGFueSkge1xyXG4gICAgbGV0IG5ld0FzcGVjdCA9IHJhd0VudGl0eS5lbnRpdHlBc3BlY3Q7XHJcblxyXG4gICAgbGV0IGVudGl0eUtleSA9IGVudGl0eVR5cGUuZ2V0RW50aXR5S2V5RnJvbVJhd0VudGl0eShyYXdFbnRpdHksIHJhd1ZhbHVlRm4pO1xyXG4gICAgbGV0IGVudGl0eVN0YXRlID0gRW50aXR5U3RhdGUuZnJvbU5hbWUobmV3QXNwZWN0LmVudGl0eVN0YXRlKSBhcyBFbnRpdHlTdGF0ZTtcclxuICAgIGlmICghZW50aXR5U3RhdGUgfHwgZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLkRldGFjaGVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgZW50aXRpZXMgd2l0aCBhIG5vbiBkZXRhY2hlZCBlbnRpdHkgc3RhdGUgbWF5IGJlIGltcG9ydGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNZXJnZSBpZiByYXcgZW50aXR5IGlzIGluIGNhY2hlIFVOTEVTUyB0aGlzIGlzIGEgbmV3IGVudGl0eSB3LyBhIHRlbXAga2V5XHJcbiAgICAvLyBDYW5ub3Qgc2FmZWx5IG1lcmdlIHN1Y2ggZW50aXRpZXMgZXZlbiBpZiBjb3VsZCBtYXRjaCB0ZW1wIGtleSB0byBhbiBlbnRpdHkgaW4gY2FjaGUuXHJcbiAgICAvLyBDYW4gZW5hYmxlIG1lcmdlIG9mIGVudGl0aWVzIHcvdGVtcCBrZXkgdXNpbmcgXCJtZXJnZUFkZHNcIiAtIHVzZSBhdCB5b3VyIG93biByaXNrIVxyXG4gICAgbGV0IG5ld1RlbXBLZXkgPSAhbWVyZ2VBZGRzICYmIGVudGl0eVN0YXRlLmlzQWRkZWQoKSAmJiBnZXRNYXBwZWRLZXkodGVtcEtleU1hcCEsIGVudGl0eUtleSk7XHJcbiAgICB0YXJnZXRFbnRpdHkgPSBuZXdUZW1wS2V5ID8gdW5kZWZpbmVkIDogZW50aXR5R3JvdXAuZmluZEVudGl0eUJ5S2V5KGVudGl0eUtleSk7XHJcblxyXG4gICAgaWYgKHRhcmdldEVudGl0eSkge1xyXG4gICAgICBpZiAobWVyZ2VTdHJhdGVneSA9PT0gTWVyZ2VTdHJhdGVneS5Ta2lwTWVyZ2UpIHtcclxuICAgICAgICAvLyBkZWxpYmVyYXRlIGZhbGwgdGhydVxyXG4gICAgICB9IGVsc2UgaWYgKG1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgTWVyZ2VTdHJhdGVneSBvZiAnRGlzYWxsb3dlZCcgcHJldmVudHMgXCIgKyBlbnRpdHlLZXkudG9TdHJpbmcoKSArIFwiIGZyb20gYmVpbmcgbWVyZ2VkXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCB0YXJnZXRFbnRpdHlTdGF0ZSA9IHRhcmdldEVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGU7XHJcbiAgICAgICAgbGV0IHdhc1VuY2hhbmdlZCA9IHRhcmdldEVudGl0eVN0YXRlLmlzVW5jaGFuZ2VkKCk7XHJcbiAgICAgICAgaWYgKG1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuT3ZlcndyaXRlQ2hhbmdlcyB8fCB3YXNVbmNoYW5nZWQpIHtcclxuICAgICAgICAgIGVudGl0eVR5cGUuX3VwZGF0ZVRhcmdldEZyb21SYXcodGFyZ2V0RW50aXR5LCByYXdFbnRpdHksIHJhd1ZhbHVlRm4pO1xyXG4gICAgICAgICAgdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5zZXRFbnRpdHlTdGF0ZShlbnRpdHlTdGF0ZSk7XHJcbiAgICAgICAgICBlbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5NZXJnZU9uSW1wb3J0LCBlbnRpdHk6IHRhcmdldEVudGl0eSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRhcmdldEVudGl0eSA9IGVudGl0eVR5cGUuX2NyZWF0ZUluc3RhbmNlQ29yZSgpIGFzIEVudGl0eTtcclxuICAgICAgZW50aXR5VHlwZS5fdXBkYXRlVGFyZ2V0RnJvbVJhdyh0YXJnZXRFbnRpdHksIHJhd0VudGl0eSwgcmF3VmFsdWVGbik7XHJcbiAgICAgIGlmIChuZXdUZW1wS2V5KSB7XHJcbiAgICAgICAgdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5oYXNUZW1wS2V5ID0gdHJ1ZTtcclxuICAgICAgICAvLyBmaXh1cCBwa1xyXG4gICAgICAgIHRhcmdldEVudGl0eS5zZXRQcm9wZXJ0eShlbnRpdHlUeXBlLmtleVByb3BlcnRpZXNbMF0ubmFtZSwgbmV3VGVtcEtleS52YWx1ZXNbMF0pO1xyXG5cclxuICAgICAgICAvLyBmaXh1cCBmb3JlaWduIGtleXNcclxuICAgICAgICAvLyBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgZW50aXR5IGlzIGRldGFjaGVkIGhlcmUgYW5kIHRoZXJlZm9yZSBvcmlnaW5hbFZhbHVlcyB3aWxsIG5vdCBiZSB1cGRhdGVkLlxyXG4gICAgICAgIGlmIChuZXdBc3BlY3QudGVtcE5hdlByb3BOYW1lcykge1xyXG4gICAgICAgICAgbmV3QXNwZWN0LnRlbXBOYXZQcm9wTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobnBOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgbGV0IG5wID0gZW50aXR5VHlwZS5nZXROYXZpZ2F0aW9uUHJvcGVydHkobnBOYW1lKTtcclxuICAgICAgICAgICAgbGV0IGZrUHJvcE5hbWUgPSBucCEucmVsYXRlZERhdGFQcm9wZXJ0aWVzWzBdLm5hbWU7XHJcbiAgICAgICAgICAgIGxldCBvbGRGa1ZhbHVlID0gdGFyZ2V0RW50aXR5IS5nZXRQcm9wZXJ0eShma1Byb3BOYW1lKTtcclxuICAgICAgICAgICAgbGV0IGZrID0gbmV3IEVudGl0eUtleShucCEuZW50aXR5VHlwZSwgW29sZEZrVmFsdWVdKTtcclxuICAgICAgICAgICAgbGV0IG5ld0ZrID0gZ2V0TWFwcGVkS2V5KHRlbXBLZXlNYXAhLCBmayk7XHJcbiAgICAgICAgICAgIHRhcmdldEVudGl0eSEuc2V0UHJvcGVydHkoZmtQcm9wTmFtZSwgbmV3RmshLnZhbHVlc1swXSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gTm93IHBlcmZvcm1lZCBpbiBhdHRhY2hFbnRpdHlcclxuICAgICAgdGFyZ2V0RW50aXR5ID0gZW50aXR5R3JvdXAuYXR0YWNoRW50aXR5KHRhcmdldEVudGl0eSwgZW50aXR5U3RhdGUpO1xyXG4gICAgICBlbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5BdHRhY2hPbkltcG9ydCwgZW50aXR5OiB0YXJnZXRFbnRpdHkgfSk7XHJcbiAgICAgIGlmICghZW50aXR5U3RhdGUuaXNVbmNoYW5nZWQoKSkge1xyXG4gICAgICAgIGVtLl9ub3RpZnlTdGF0ZUNoYW5nZSh0YXJnZXRFbnRpdHksIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZW50aXRpZXNUb0xpbmsucHVzaCh0YXJnZXRFbnRpdHkpO1xyXG4gIH0pO1xyXG4gIHJldHVybiBlbnRpdGllc1RvTGluaztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TWFwcGVkS2V5KHRlbXBLZXlNYXA6IElUZW1wS2V5TWFwLCBlbnRpdHlLZXk6IEVudGl0eUtleSkge1xyXG4gIGxldCBuZXdLZXkgPSB0ZW1wS2V5TWFwW2VudGl0eUtleS50b1N0cmluZygpXTtcclxuICBpZiAobmV3S2V5KSByZXR1cm4gbmV3S2V5O1xyXG4gIGxldCBzdWJ0eXBlcyA9IGVudGl0eUtleS5fc3VidHlwZXM7XHJcbiAgaWYgKCFzdWJ0eXBlcykgcmV0dXJuIG51bGw7XHJcbiAgZm9yIChsZXQgaSA9IDAsIGogPSBzdWJ0eXBlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgIG5ld0tleSA9IHRlbXBLZXlNYXBbZW50aXR5S2V5LnRvU3RyaW5nKHN1YnR5cGVzW2ldKV07XHJcbiAgICBpZiAobmV3S2V5KSByZXR1cm4gbmV3S2V5O1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvbWlzZVdpdGhDYWxsYmFja3M8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgY2FsbGJhY2s/OiBDYWxsYmFjaywgZXJyb3JDYWxsYmFjaz86IEVycm9yQ2FsbGJhY2spIHtcclxuICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGRhdGEpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcclxuICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKGVycm9yKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHByb21pc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEVudGl0aWVzVG9TYXZlKGVtOiBFbnRpdHlNYW5hZ2VyLCBlbnRpdGllcz86IEVudGl0eVtdKSB7XHJcbiAgbGV0IGVudGl0aWVzVG9TYXZlOiBFbnRpdHlbXTtcclxuICBpZiAoZW50aXRpZXMpIHtcclxuICAgIGVudGl0aWVzVG9TYXZlID0gZW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGlmIChlLmVudGl0eUFzcGVjdC5lbnRpdHlNYW5hZ2VyICE9PSBlbSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgZW50aXRpZXMgaW4gdGhpcyBlbnRpdHlNYW5hZ2VyIG1heSBiZSBzYXZlZFwiKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gIWUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBlbnRpdGllc1RvU2F2ZSA9IGVtLmdldENoYW5nZXMoKTtcclxuICB9XHJcbiAgcmV0dXJuIGVudGl0aWVzVG9TYXZlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaXh1cEtleXMoZW06IEVudGl0eU1hbmFnZXIsIGtleU1hcHBpbmdzOiBLZXlNYXBwaW5nW10pIHtcclxuICBlbS5faW5LZXlGaXh1cCA9IHRydWU7XHJcbiAga2V5TWFwcGluZ3MuZm9yRWFjaChmdW5jdGlvbiAoa20pIHtcclxuICAgIGxldCBncm91cCA9IGVtLl9lbnRpdHlHcm91cE1hcFtrbS5lbnRpdHlUeXBlTmFtZV07XHJcbiAgICBpZiAoIWdyb3VwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBmdWxseSBxdWFsaWZpZWQgRW50aXR5VHlwZSBuYW1lOiBcIiArIGttLmVudGl0eVR5cGVOYW1lKTtcclxuICAgIH1cclxuICAgIGdyb3VwLl9maXh1cEtleShrbS50ZW1wVmFsdWUsIGttLnJlYWxWYWx1ZSk7XHJcbiAgfSk7XHJcbiAgZW0uX2luS2V5Rml4dXAgPSBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RW50aXR5R3JvdXBzKGVtOiBFbnRpdHlNYW5hZ2VyLCBlbnRpdHlUeXBlcz86IEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10pIHtcclxuICBsZXQgZ3JvdXBNYXAgPSBlbS5fZW50aXR5R3JvdXBNYXA7XHJcbiAgaWYgKGVudGl0eVR5cGVzKSB7XHJcbiAgICByZXR1cm4gY29yZS50b0FycmF5KGVudGl0eVR5cGVzKS5tYXAoZnVuY3Rpb24gKGV0OiBFbnRpdHlUeXBlKSB7XHJcbiAgICAgIGlmIChldCBpbnN0YW5jZW9mIEVudGl0eVR5cGUpIHtcclxuICAgICAgICByZXR1cm4gZ3JvdXBNYXBbZXQubmFtZV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIEVudGl0eU1hbmFnZXIuZ2V0Q2hhbmdlcygpICdlbnRpdHlUeXBlcycgcGFyYW1ldGVyIG11c3QgYmUgZWl0aGVyIGFuIGVudGl0eVR5cGUgb3IgYW4gYXJyYXkgb2YgZW50aXR5VHlwZXMgb3IgbnVsbFwiKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBjb3JlLmdldE93blByb3BlcnR5VmFsdWVzKGdyb3VwTWFwKSBhcyBFbnRpdHlHcm91cFtdO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tFbnRpdHlLZXkoZW06IEVudGl0eU1hbmFnZXIsIGVudGl0eTogRW50aXR5KSB7XHJcbiAgbGV0IGVrID0gZW50aXR5LmVudGl0eUFzcGVjdC5nZXRLZXkoKTtcclxuICAvLyByZXR1cm4gcHJvcGVydGllcyB0aGF0IGFyZSA9IHRvIGRlZmF1bHRWYWx1ZXNcclxuICBsZXQga2V5UHJvcHNXaXRoRGVmYXVsdFZhbHVlcyA9IGNvcmUuYXJyYXlaaXAoZW50aXR5LmVudGl0eVR5cGUua2V5UHJvcGVydGllcywgZWsudmFsdWVzLCBmdW5jdGlvbiAoa3AsIGt2KSB7XHJcbiAgICByZXR1cm4gKGtwLmRlZmF1bHRWYWx1ZSA9PT0ga3YpID8ga3AgOiBudWxsO1xyXG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoa3ApIHtcclxuICAgIHJldHVybiBrcCAhPT0gbnVsbDtcclxuICB9KTtcclxuICBpZiAoa2V5UHJvcHNXaXRoRGVmYXVsdFZhbHVlcy5sZW5ndGgpIHtcclxuICAgIGlmIChlbnRpdHkuZW50aXR5VHlwZS5hdXRvR2VuZXJhdGVkS2V5VHlwZSAhPT0gQXV0b0dlbmVyYXRlZEtleVR5cGUuTm9uZSkge1xyXG4gICAgICBlbS5nZW5lcmF0ZVRlbXBLZXlWYWx1ZShlbnRpdHkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gd2Ugd2lsbCBhbGxvdyBhdHRhY2hlcyBvZiBlbnRpdGllcyB3aGVyZSBvbmx5IHBhcnQgb2YgdGhlIGtleSBpcyBzZXQuXHJcbiAgICAgIGlmIChrZXlQcm9wc1dpdGhEZWZhdWx0VmFsdWVzLmxlbmd0aCA9PT0gZWsudmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhdHRhY2ggYW4gb2JqZWN0IG9mIHR5cGUgIChcIiArIGVudGl0eS5lbnRpdHlUeXBlLm5hbWUgKyBcIikgdG8gYW4gRW50aXR5TWFuYWdlciB3aXRob3V0IGZpcnN0IHNldHRpbmcgaXRzIGtleSBvciBzZXR0aW5nIGl0cyBlbnRpdHlUeXBlICdBdXRvR2VuZXJhdGVkS2V5VHlwZScgcHJvcGVydHkgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gJ05vbmUnXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZUVudGl0eVN0YXRlcyhlbTogRW50aXR5TWFuYWdlciwgZW50aXR5U3RhdGVzPzogRW50aXR5U3RhdGUgfCBFbnRpdHlTdGF0ZVtdKSB7XHJcbiAgaWYgKCFlbnRpdHlTdGF0ZXMpIHJldHVybiBbXSBhcyBFbnRpdHlTdGF0ZVtdO1xyXG4gIGxldCBlbnRTdGF0ZXMgPSBjb3JlLnRvQXJyYXkoZW50aXR5U3RhdGVzKSBhcyBFbnRpdHlTdGF0ZVtdO1xyXG4gIGVudFN0YXRlcy5mb3JFYWNoKChlcykgPT4ge1xyXG4gICAgaWYgKCEoZXMgaW5zdGFuY2VvZiBFbnRpdHlTdGF0ZSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIEVudGl0eU1hbmFnZXIuZ2V0Q2hhbmdlcygpICdlbnRpdHlTdGF0ZXMnIHBhcmFtZXRlciBtdXN0IGVpdGhlciBiZSBudWxsLCBhbiBlbnRpdHlTdGF0ZSBvciBhbiBhcnJheSBvZiBlbnRpdHlTdGF0ZXNcIik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGVudFN0YXRlcztcclxufVxyXG5cclxuZnVuY3Rpb24gYXR0YWNoUmVsYXRlZEVudGl0aWVzKGVtOiBFbnRpdHlNYW5hZ2VyLCBlbnRpdHk6IEVudGl0eSwgZW50aXR5U3RhdGU6IEVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5OiBNZXJnZVN0cmF0ZWd5KSB7XHJcbiAgbGV0IG5hdlByb3BzID0gZW50aXR5LmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXM7XHJcbiAgbmF2UHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobnApIHtcclxuICAgIGxldCByZWxhdGVkID0gZW50aXR5LmdldFByb3BlcnR5KG5wLm5hbWUpO1xyXG4gICAgaWYgKG5wLmlzU2NhbGFyKSB7XHJcbiAgICAgIGlmICghcmVsYXRlZCkgcmV0dXJuO1xyXG4gICAgICBlbS5hdHRhY2hFbnRpdHkocmVsYXRlZCwgZW50aXR5U3RhdGUsIG1lcmdlU3RyYXRlZ3kpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVsYXRlZC5mb3JFYWNoKGZ1bmN0aW9uIChlOiBFbnRpdHkpIHtcclxuICAgICAgICBlbS5hdHRhY2hFbnRpdHkoZSwgZW50aXR5U3RhdGUsIG1lcmdlU3RyYXRlZ3kpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuLy8gcmV0dXJucyBhIHByb21pc2VcclxuZnVuY3Rpb24gZXhlY3V0ZVF1ZXJ5Q29yZShlbTogRW50aXR5TWFuYWdlciwgcXVlcnk6IEVudGl0eVF1ZXJ5IHwgc3RyaW5nLCBxdWVyeU9wdGlvbnM6IFF1ZXJ5T3B0aW9ucywgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlKTogUHJvbWlzZTxRdWVyeVJlc3VsdD4ge1xyXG4gIHRyeSB7XHJcbiAgICBsZXQgcmVzdWx0czogYW55W107XHJcbiAgICBsZXQgbWV0YWRhdGFTdG9yZSA9IGVtLm1ldGFkYXRhU3RvcmU7XHJcblxyXG4gICAgaWYgKG1ldGFkYXRhU3RvcmUuaXNFbXB0eSgpICYmIGRhdGFTZXJ2aWNlLmhhc1NlcnZlck1ldGFkYXRhKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBleGVjdXRlIF9leGVjdXRlUXVlcnlDb3JlIHVudGlsIG1ldGFkYXRhU3RvcmUgaXMgcG9wdWxhdGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocXVlcnlPcHRpb25zLmZldGNoU3RyYXRlZ3kgPT09IEZldGNoU3RyYXRlZ3kuRnJvbUxvY2FsQ2FjaGUpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IGV4ZWN1dGUgJ3N0cmluZycgRW50aXR5UXVlcnkgbG9jYWxseS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBxciA9IGV4ZWN1dGVRdWVyeUxvY2FsbHlDb3JlKGVtLCBxdWVyeSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHJlc3VsdHM6IHFyLnJlc3VsdHMsIGVudGl0eU1hbmFnZXI6IGVtLCBpbmxpbmVDb3VudDogcXIuaW5saW5lQ291bnQsIHF1ZXJ5OiBxdWVyeSB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXBwaW5nQ29udGV4dDogTWFwcGluZ0NvbnRleHQgfCB1bmRlZmluZWQgPSBuZXcgTWFwcGluZ0NvbnRleHQoe1xyXG4gICAgICBxdWVyeTogcXVlcnksXHJcbiAgICAgIGVudGl0eU1hbmFnZXI6IGVtLFxyXG4gICAgICBkYXRhU2VydmljZTogZGF0YVNlcnZpY2UsXHJcbiAgICAgIG1lcmdlT3B0aW9uczoge1xyXG4gICAgICAgIG1lcmdlU3RyYXRlZ3k6IHF1ZXJ5T3B0aW9ucy5tZXJnZVN0cmF0ZWd5LFxyXG4gICAgICAgIG5vVHJhY2tpbmc6ICEhKHF1ZXJ5IGFzIGFueSkubm9UcmFja2luZ0VuYWJsZWQsXHJcbiAgICAgICAgaW5jbHVkZURlbGV0ZWQ6IHF1ZXJ5T3B0aW9ucy5pbmNsdWRlRGVsZXRlZFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgdmFsaWRhdGVPblF1ZXJ5ID0gZW0udmFsaWRhdGlvbk9wdGlvbnMudmFsaWRhdGVPblF1ZXJ5O1xyXG5cclxuICAgIHJldHVybiBkYXRhU2VydmljZS5hZGFwdGVySW5zdGFuY2UhLmV4ZWN1dGVRdWVyeShtYXBwaW5nQ29udGV4dCkudGhlbihmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBjb3JlLndyYXBFeGVjdXRpb24oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzdGF0ZSA9IHsgaXNMb2FkaW5nOiBlbS5pc0xvYWRpbmcgfTtcclxuICAgICAgICBlbS5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGVtLl9wZW5kaW5nUHVicyA9IFtdO1xyXG4gICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgfSwgZnVuY3Rpb24gKHN0YXRlKSB7XHJcbiAgICAgICAgLy8gY2xlYW51cFxyXG4gICAgICAgIGVtLmlzTG9hZGluZyA9IHN0YXRlLmlzTG9hZGluZztcclxuICAgICAgICBlbS5fcGVuZGluZ1B1YnMhLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XHJcbiAgICAgICAgICBmbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGVtLl9wZW5kaW5nUHVicyA9IHVuZGVmaW5lZDtcclxuICAgICAgICBlbS5faGFzQ2hhbmdlc0FjdGlvbiAmJiBlbS5faGFzQ2hhbmdlc0FjdGlvbigpO1xyXG4gICAgICAgIC8vIFRPRE86IHJlbW92ZWQgLSBub3Qgc3VyZSB3aHkgbmVlZGVkIGluIGZpcnN0IHBsYWNlLi4uXHJcbiAgICAgICAgLy8gLy8gSEFDSyBmb3IgR0NcclxuICAgICAgICAvLyBxdWVyeSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBtYXBwaW5nQ29udGV4dCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyBIQUNLOiBzb21lIGVycm9ycyB0aHJvd24gaW4gbmV4dCBmdW5jdGlvbiBkbyBub3QgcHJvcG9nYXRlIHByb3Blcmx5IC0gdGhpcyBjYXRjaGVzIHRoZW0uXHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5lcnJvcikge1xyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHN0YXRlLmVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IG5vZGVzID0gZGF0YVNlcnZpY2UuanNvblJlc3VsdHNBZGFwdGVyLmV4dHJhY3RSZXN1bHRzKGRhdGEpO1xyXG4gICAgICAgIG5vZGVzID0gY29yZS50b0FycmF5KG5vZGVzKTtcclxuXHJcbiAgICAgICAgcmVzdWx0cyA9IG1hcHBpbmdDb250ZXh0IS52aXNpdEFuZE1lcmdlKG5vZGVzLCB7IG5vZGVUeXBlOiBcInJvb3RcIiB9KTtcclxuICAgICAgICBpZiAodmFsaWRhdGVPblF1ZXJ5KSB7XHJcbiAgICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHI6IGFueSkge1xyXG4gICAgICAgICAgICAvLyBhbm9uIHR5cGVzIGFuZCBzaW1wbGUgdHlwZXMgd2lsbCBub3QgaGF2ZSBhbiBlbnRpdHlBc3BlY3QuXHJcbiAgICAgICAgICAgIHIuZW50aXR5QXNwZWN0ICYmIHIuZW50aXR5QXNwZWN0LnZhbGlkYXRlRW50aXR5KCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFwcGluZ0NvbnRleHQhLnByb2Nlc3NEZWZlcnJlZCgpO1xyXG4gICAgICAgIC8vIGlmIHF1ZXJ5IGhhcyBleHBhbmQgY2xhdXNlcyB3YWxrIGVhY2ggb2YgdGhlICdyZXN1bHRzJyBhbmQgbWFyayB0aGUgZXhwYW5kZWQgcHJvcHMgYXMgbG9hZGVkLlxyXG4gICAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIEVudGl0eVF1ZXJ5KSB7XHJcbiAgICAgICAgICBtYXJrTG9hZGVkTmF2UHJvcHMocmVzdWx0cywgcXVlcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmV0cmlldmVkRW50aXRpZXMgPSBjb3JlLm9iamVjdE1hcChtYXBwaW5nQ29udGV4dCEucmVmTWFwKTtcclxuICAgICAgICByZXR1cm4geyByZXN1bHRzOiByZXN1bHRzLCBxdWVyeTogcXVlcnksIGVudGl0eU1hbmFnZXI6IGVtLCBodHRwUmVzcG9uc2U6IGRhdGEuaHR0cFJlc3BvbnNlLCBpbmxpbmVDb3VudDogZGF0YS5pbmxpbmVDb3VudCwgcmV0cmlldmVkRW50aXRpZXM6IHJldHJpZXZlZEVudGl0aWVzIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICB9LCBmdW5jdGlvbiAoZTogYW55KSB7XHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgZS5xdWVyeSA9IHF1ZXJ5O1xyXG4gICAgICAgIGUuZW50aXR5TWFuYWdlciA9IGVtO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcclxuICAgIH0pO1xyXG5cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBpZiAoZSkge1xyXG4gICAgICBlLnF1ZXJ5ID0gcXVlcnk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBtYXJrTG9hZGVkTmF2UHJvcHMoZW50aXRpZXM6IEVudGl0eVtdLCBxdWVyeTogRW50aXR5UXVlcnkpIHtcclxuICBpZiAocXVlcnkubm9UcmFja2luZ0VuYWJsZWQpIHJldHVybjtcclxuICBsZXQgZXhwYW5kQ2xhdXNlID0gcXVlcnkuZXhwYW5kQ2xhdXNlO1xyXG4gIGlmIChleHBhbmRDbGF1c2UgPT0gbnVsbCkgcmV0dXJuO1xyXG4gIGV4cGFuZENsYXVzZS5wcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xyXG4gICAgbGV0IHByb3BOYW1lcyA9IHByb3BlcnR5UGF0aC5zcGxpdCgnLicpO1xyXG4gICAgbWFya0xvYWRlZE5hdlBhdGgoZW50aXRpZXMsIHByb3BOYW1lcyk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcmtMb2FkZWROYXZQYXRoKGVudGl0aWVzOiBFbnRpdHlbXSwgcHJvcE5hbWVzOiBzdHJpbmdbXSkge1xyXG4gIGxldCBwcm9wTmFtZSA9IHByb3BOYW1lc1swXTtcclxuICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHkpID0+IHtcclxuICAgIGxldCBlYSA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgICBpZiAoIWVhKSByZXR1cm47IC8vIGVudGl0eSBtYXkgbm90IGJlIGEgJ3JlYWwnIGVudGl0eSBpbiB0aGUgY2FzZSBvZiBhIHByb2plY3Rpb24uXHJcbiAgICBlYS5fbWFya0FzTG9hZGVkKHByb3BOYW1lKTtcclxuICAgIGlmIChwcm9wTmFtZXMubGVuZ3RoID09PSAxKSByZXR1cm47XHJcbiAgICBsZXQgbmV4dCA9IGVudGl0eS5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7XHJcbiAgICBpZiAoIW5leHQpIHJldHVybjsgLy8gbm8gY2hpbGRyZW4gdG8gcHJvY2Vzcy5cclxuICAgIC8vIHN0cmFuZ2UgbG9naWMgYmVjYXVzZSBub25zY2FsYXIgbmF2IHZhbHVlcyBhcmUgTk9UIHJlYWxseSBhcnJheXNcclxuICAgIC8vIG90aGVyd2lzZSB3ZSBjb3VsZCB1c2UgQXJyYXkuaXNBcnJheVxyXG4gICAgaWYgKCFuZXh0LmFycmF5Q2hhbmdlZCkgbmV4dCA9IFtuZXh0XTtcclxuICAgIG1hcmtMb2FkZWROYXZQYXRoKG5leHQsIHByb3BOYW1lcy5zbGljZSgxKSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUNvbmN1cnJlbmN5UHJvcGVydGllcyhlbnRpdGllczogRW50aXR5W10pIHtcclxuICBsZXQgY2FuZGlkYXRlcyA9IGVudGl0aWVzLmZpbHRlcigoZSkgPT4ge1xyXG4gICAgZS5lbnRpdHlBc3BlY3QuaXNCZWluZ1NhdmVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc01vZGlmaWVkKClcclxuICAgICAgJiYgZS5lbnRpdHlUeXBlLmNvbmN1cnJlbmN5UHJvcGVydGllcy5sZW5ndGggPiAwO1xyXG5cclxuICB9KTtcclxuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybjtcclxuICBjYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcclxuICAgIGMuZW50aXR5VHlwZS5jb25jdXJyZW5jeVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY3ApIHtcclxuICAgICAgdXBkYXRlQ29uY3VycmVuY3lQcm9wZXJ0eShjLCBjcCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlQ29uY3VycmVuY3lQcm9wZXJ0eShlbnRpdHk6IEVudGl0eSwgcHJvcGVydHk6IERhdGFQcm9wZXJ0eSkge1xyXG4gIC8vIGNoZWNrIGlmIHByb3BlcnR5IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZFxyXG4gIGlmIChlbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzW3Byb3BlcnR5Lm5hbWVdKSByZXR1cm47XHJcbiAgbGV0IHZhbHVlID0gZW50aXR5LmdldFByb3BlcnR5KHByb3BlcnR5Lm5hbWUpO1xyXG4gIGxldCBkYXRhVHlwZSA9IHByb3BlcnR5LmRhdGFUeXBlIGFzIERhdGFUeXBlO1xyXG4gIGlmICghdmFsdWUpIHZhbHVlID0gZGF0YVR5cGUuZGVmYXVsdFZhbHVlO1xyXG4gIGlmIChkYXRhVHlwZS5pc051bWVyaWMpIHtcclxuICAgIGVudGl0eS5zZXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lLCB2YWx1ZSArIDEpO1xyXG4gIH0gZWxzZSBpZiAoZGF0YVR5cGUuZ2V0Q29uY3VycmVuY3lWYWx1ZSkge1xyXG4gICAgLy8gRGF0YVR5cGUgaGFzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cclxuICAgIGxldCBuZXh0VmFsdWUgPSBkYXRhVHlwZS5nZXRDb25jdXJyZW5jeVZhbHVlKHZhbHVlKTtcclxuICAgIGVudGl0eS5zZXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lLCBuZXh0VmFsdWUpO1xyXG4gIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09IERhdGFUeXBlLkJpbmFyeSkge1xyXG4gICAgLy8gYmVzdCBndWVzcyAtIHRoYXQgdGhpcyBpcyBhIHRpbWVzdGFtcCBjb2x1bW4gYW5kIGlzIGNvbXB1dGVkIG9uIHRoZSBzZXJ2ZXIgZHVyaW5nIHNhdmVcclxuICAgIC8vIC0gc28gbm8gbmVlZCB0byBzZXQgaXQgaGVyZS5cclxuICAgIHJldHVybjtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gdGhpcyBqdXN0IGxlYXZlcyBEYXRhVHlwZXMgb2YgQm9vbGVhbiwgU3RyaW5nIGFuZCBCeXRlIC0gbm9uZSBvZiB3aGljaCBzaG91bGQgYmUgdGhlXHJcbiAgICAvLyB0eXBlIGZvciBhIGNvbmN1cnJlbmN5IGNvbHVtbi5cclxuICAgIC8vIE5PVEU6IHRob3VnaHQgYWJvdXQganVzdCByZXR1cm5pbmcgaGVyZSBidXQgd291bGQgcmF0aGVyIGJlIHNhZmUgZm9yIG5vdy5cclxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byB1cGRhdGUgdGhlIHZhbHVlIG9mIGNvbmN1cnJlbmN5IHByb3BlcnR5IGJlZm9yZSBzYXZpbmc6IFwiICsgcHJvcGVydHkubmFtZSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZmluZE9yQ3JlYXRlRW50aXR5R3JvdXAoZW06IEVudGl0eU1hbmFnZXIsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICBsZXQgZ3JvdXAgPSBlbS5fZW50aXR5R3JvdXBNYXBbZW50aXR5VHlwZS5uYW1lXTtcclxuICBpZiAoIWdyb3VwKSB7XHJcbiAgICBncm91cCA9IG5ldyBFbnRpdHlHcm91cChlbSwgZW50aXR5VHlwZSk7XHJcbiAgICBlbS5fZW50aXR5R3JvdXBNYXBbZW50aXR5VHlwZS5uYW1lXSA9IGdyb3VwO1xyXG4gIH1cclxuICByZXR1cm4gZ3JvdXA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZpbmRPckNyZWF0ZUVudGl0eUdyb3VwcyhlbTogRW50aXR5TWFuYWdlciwgZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xyXG4gIGxldCBlbnRpdHlUeXBlcyA9IGVudGl0eVR5cGUuZ2V0U2VsZkFuZFN1YnR5cGVzKCk7XHJcbiAgcmV0dXJuIGVudGl0eVR5cGVzLm1hcCgoZXQpID0+IHtcclxuICAgIHJldHVybiBmaW5kT3JDcmVhdGVFbnRpdHlHcm91cChlbSwgZXQpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1bndyYXBJbnN0YW5jZShzdHJ1Y3RPYmo6IFN0cnVjdHVyYWxPYmplY3QsIHRyYW5zZm9ybUZuPzogKGRwOiBEYXRhUHJvcGVydHksIHZhbDogYW55KSA9PiBhbnkpIHtcclxuXHJcbiAgbGV0IHJhd09iamVjdDogYW55ID0ge307XHJcbiAgbGV0IHN0eXBlID0gRW50aXR5QXNwZWN0LmlzRW50aXR5KHN0cnVjdE9iaikgPyBzdHJ1Y3RPYmouZW50aXR5VHlwZSA6IHN0cnVjdE9iai5jb21wbGV4VHlwZTtcclxuICBsZXQgc2VyaWFsaXplckZuID0gZ2V0U2VyaWFsaXplckZuKHN0eXBlKTtcclxuICBsZXQgdW5tYXBwZWQgPSB7fTtcclxuICBzdHlwZS5kYXRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChkcCkge1xyXG4gICAgaWYgKGRwLmlzQ29tcGxleFByb3BlcnR5KSB7XHJcbiAgICAgIHJhd09iamVjdFtkcC5uYW1lT25TZXJ2ZXJdID0gY29yZS5tYXAoc3RydWN0T2JqLmdldFByb3BlcnR5KGRwLm5hbWUpLCBmdW5jdGlvbiAoY28pIHtcclxuICAgICAgICByZXR1cm4gdW53cmFwSW5zdGFuY2UoY28sIHRyYW5zZm9ybUZuKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdmFsID0gc3RydWN0T2JqLmdldFByb3BlcnR5KGRwLm5hbWUpO1xyXG4gICAgICB2YWwgPSB0cmFuc2Zvcm1GbiA/IHRyYW5zZm9ybUZuKGRwLCB2YWwpIDogdmFsO1xyXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgdmFsID0gc2VyaWFsaXplckZuID8gc2VyaWFsaXplckZuKGRwLCB2YWwpIDogdmFsO1xyXG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoZHAuaXNVbm1hcHBlZCkge1xyXG4gICAgICAgICAgdW5tYXBwZWRbZHAubmFtZU9uU2VydmVyXSA9IGNvcmUudG9KU09OU2FmZSh2YWwsIGNvcmUudG9KU09OU2FmZVJlcGxhY2VyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmF3T2JqZWN0W2RwLm5hbWVPblNlcnZlcl0gPSB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGlmICghY29yZS5pc0VtcHR5KHVubWFwcGVkKSkge1xyXG4gICAgLy8gVE9ETzogcmV2aWV3IHRoaXMuXHJcbiAgICAocmF3T2JqZWN0IGFzIGFueSkuX191bm1hcHBlZCA9IHVubWFwcGVkO1xyXG4gIH1cclxuICByZXR1cm4gcmF3T2JqZWN0O1xyXG59XHJcblxyXG5mdW5jdGlvbiB1bndyYXBPcmlnaW5hbFZhbHVlcyh0YXJnZXQ6IFN0cnVjdHVyYWxPYmplY3QsIG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUsIHRyYW5zZm9ybUZuPzogKGRwOiBEYXRhUHJvcGVydHksIHZhbDogYW55KSA9PiBhbnkpIHtcclxuICBsZXQgc3R5cGUgPSBFbnRpdHlBc3BlY3QuaXNFbnRpdHkodGFyZ2V0KSA/IHRhcmdldC5lbnRpdHlUeXBlIDogdGFyZ2V0LmNvbXBsZXhUeXBlO1xyXG4gIGxldCBhc3BlY3QgPSBFbnRpdHlBc3BlY3QuaXNFbnRpdHkodGFyZ2V0KSA/IHRhcmdldC5lbnRpdHlBc3BlY3QgOiB0YXJnZXQuY29tcGxleEFzcGVjdDtcclxuICBsZXQgZm4gPSBtZXRhZGF0YVN0b3JlLm5hbWluZ0NvbnZlbnRpb24uY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI7XHJcbiAgbGV0IHJlc3VsdCA9IHt9O1xyXG4gIGNvcmUub2JqZWN0Rm9yRWFjaChhc3BlY3Qub3JpZ2luYWxWYWx1ZXMsIGZ1bmN0aW9uIChwcm9wTmFtZSwgdmFsKSB7XHJcbiAgICBsZXQgcHJvcCA9IHN0eXBlLmdldFByb3BlcnR5KHByb3BOYW1lKSBhcyBEYXRhUHJvcGVydHk7XHJcbiAgICB2YWwgPSB0cmFuc2Zvcm1GbiA/IHRyYW5zZm9ybUZuKHByb3AsIHZhbCkgOiB2YWw7XHJcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzdWx0W2ZuKHByb3BOYW1lLCBwcm9wKV0gPSB2YWw7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgc3R5cGUuY29tcGxleFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY3ApIHtcclxuICAgIGxldCBuZXh0VGFyZ2V0ID0gdGFyZ2V0LmdldFByb3BlcnR5KGNwLm5hbWUpO1xyXG4gICAgaWYgKGNwLmlzU2NhbGFyKSB7XHJcbiAgICAgIGxldCB1bndyYXBwZWRDbyA9IHVud3JhcE9yaWdpbmFsVmFsdWVzKG5leHRUYXJnZXQsIG1ldGFkYXRhU3RvcmUsIHRyYW5zZm9ybUZuKTtcclxuICAgICAgaWYgKCFjb3JlLmlzRW1wdHkodW53cmFwcGVkQ28pKSB7XHJcbiAgICAgICAgcmVzdWx0W2ZuKGNwLm5hbWUsIGNwKV0gPSB1bndyYXBwZWRDbztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHVud3JhcHBlZENvcyA9IG5leHRUYXJnZXQubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gdW53cmFwT3JpZ2luYWxWYWx1ZXMoaXRlbSwgbWV0YWRhdGFTdG9yZSwgdHJhbnNmb3JtRm4pO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0W2ZuKGNwLm5hbWUsIGNwKV0gPSB1bndyYXBwZWRDb3M7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdW53cmFwQ2hhbmdlZFZhbHVlcyhlbnRpdHk6IEVudGl0eSwgbWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSwgdHJhbnNmb3JtRm46IChkcDogRGF0YVByb3BlcnR5LCB2YWw6IGFueSkgPT4gYW55KSB7XHJcbiAgbGV0IHN0eXBlID0gZW50aXR5LmVudGl0eVR5cGU7XHJcbiAgbGV0IHNlcmlhbGl6ZXJGbiA9IGdldFNlcmlhbGl6ZXJGbihzdHlwZSk7XHJcbiAgbGV0IGZuID0gbWV0YWRhdGFTdG9yZS5uYW1pbmdDb252ZW50aW9uLmNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyO1xyXG4gIGxldCByZXN1bHQgPSB7fTtcclxuICBjb3JlLm9iamVjdEZvckVhY2goZW50aXR5LmVudGl0eUFzcGVjdC5vcmlnaW5hbFZhbHVlcywgZnVuY3Rpb24gKHByb3BOYW1lLCB2YWx1ZSkge1xyXG4gICAgbGV0IHByb3AgPSBzdHlwZS5nZXRQcm9wZXJ0eShwcm9wTmFtZSkgYXMgRGF0YVByb3BlcnR5O1xyXG4gICAgbGV0IHZhbCA9IGVudGl0eS5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7XHJcbiAgICB2YWwgPSB0cmFuc2Zvcm1GbiA/IHRyYW5zZm9ybUZuKHByb3AsIHZhbCkgOiB2YWw7XHJcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgIHZhbCA9IHNlcmlhbGl6ZXJGbiA/IHNlcmlhbGl6ZXJGbihwcm9wLCB2YWwpIDogdmFsO1xyXG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlc3VsdFtmbihwcm9wTmFtZSwgcHJvcCldID0gdmFsO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIC8vIGFueSBjaGFuZ2UgdG8gYW55IGNvbXBsZXggb2JqZWN0IG9yIGFycmF5IG9mIGNvbXBsZXggb2JqZWN0cyByZXR1cm5zIHRoZSBFTlRJUkVcclxuICAvLyBjdXJyZW50IGNvbXBsZXggb2JqZWN0IG9yIGNvbXBsZXggb2JqZWN0IGFycmF5LiAgVGhpcyBpcyBieSBkZXNpZ24uIENvbXBsZXggT2JqZWN0c1xyXG4gIC8vIGFyZSBhdG9taWMuXHJcbiAgc3R5cGUuY29tcGxleFByb3BlcnRpZXMuZm9yRWFjaCgoY3ApID0+IHtcclxuICAgIGlmIChjcEhhc09yaWdpbmFsVmFsdWVzKGVudGl0eSwgY3ApKSB7XHJcbiAgICAgIGxldCBjb09yQ29zID0gZW50aXR5LmdldFByb3BlcnR5KGNwLm5hbWUpO1xyXG4gICAgICByZXN1bHRbZm4oY3AubmFtZSwgY3ApXSA9IGNvcmUubWFwKGNvT3JDb3MsIGZ1bmN0aW9uIChjbykge1xyXG4gICAgICAgIHJldHVybiB1bndyYXBJbnN0YW5jZShjbywgdHJhbnNmb3JtRm4pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcEhhc09yaWdpbmFsVmFsdWVzKHN0cnVjdHVyYWxPYmplY3Q6IFN0cnVjdHVyYWxPYmplY3QsIGNwOiBEYXRhUHJvcGVydHkpOiBib29sZWFuIHtcclxuICBsZXQgY29PckNvcyA9IHN0cnVjdHVyYWxPYmplY3QuZ2V0UHJvcGVydHkoY3AubmFtZSk7XHJcbiAgaWYgKGNwLmlzU2NhbGFyKSB7XHJcbiAgICByZXR1cm4gY29IYXNPcmlnaW5hbFZhbHVlcyhjb09yQ29zKTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gdGhpcyBvY2N1cnMgd2hlbiBhIG5vbnNjYWxhciBjbyBhcnJheSBoYXMgaGFkIGNvcyBhZGRlZCBvciByZW1vdmVkLlxyXG4gICAgaWYgKGNvT3JDb3MuX29yaWdWYWx1ZXMpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGNvT3JDb3Muc29tZShmdW5jdGlvbiAoY286IENvbXBsZXhPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIGNvSGFzT3JpZ2luYWxWYWx1ZXMoY28pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBleGVjdXRlUXVlcnlMb2NhbGx5Q29yZShlbTogRW50aXR5TWFuYWdlciwgcXVlcnk6IEVudGl0eVF1ZXJ5KSB7XHJcbiAgYXNzZXJ0UGFyYW0ocXVlcnksIFwicXVlcnlcIikuaXNJbnN0YW5jZU9mKEVudGl0eVF1ZXJ5KS5jaGVjaygpO1xyXG5cclxuICBsZXQgbWV0YWRhdGFTdG9yZSA9IGVtLm1ldGFkYXRhU3RvcmU7XHJcbiAgbGV0IGVudGl0eVR5cGUgPSBxdWVyeS5fZ2V0RnJvbUVudGl0eVR5cGUobWV0YWRhdGFTdG9yZSwgdHJ1ZSk7XHJcbiAgLy8gdGhlcmUgbWF5IGJlIG11bHRpcGxlIGdyb3VwcyBpcyB0aGlzIGlzIGEgYmFzZSBlbnRpdHkgdHlwZS5cclxuICBsZXQgZ3JvdXBzID0gZmluZE9yQ3JlYXRlRW50aXR5R3JvdXBzKGVtLCBlbnRpdHlUeXBlISk7XHJcbiAgLy8gZmlsdGVyIHRoZW4gb3JkZXIgdGhlbiBza2lwIHRoZW4gdGFrZVxyXG4gIGxldCBmaWx0ZXJGdW5jID0gcXVlcnkud2hlcmVQcmVkaWNhdGUgJiYgcXVlcnkud2hlcmVQcmVkaWNhdGUudG9GdW5jdGlvbih7IGVudGl0eVR5cGU6IGVudGl0eVR5cGUgfSk7XHJcblxyXG4gIGxldCBxdWVyeU9wdGlvbnMgPSBRdWVyeU9wdGlvbnMucmVzb2x2ZShbcXVlcnkucXVlcnlPcHRpb25zLCBlbS5xdWVyeU9wdGlvbnMsIFF1ZXJ5T3B0aW9ucy5kZWZhdWx0SW5zdGFuY2VdKTtcclxuICBsZXQgaW5jbHVkZURlbGV0ZWQgPSBxdWVyeU9wdGlvbnMuaW5jbHVkZURlbGV0ZWQgPT09IHRydWU7XHJcblxyXG4gIGxldCBuZXdGaWx0ZXJGdW5jID0gZnVuY3Rpb24gKGVudGl0eTogRW50aXR5KSB7XHJcbiAgICByZXR1cm4gZW50aXR5ICYmIChpbmNsdWRlRGVsZXRlZCB8fCAhZW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc0RlbGV0ZWQoKSkgJiYgKGZpbHRlckZ1bmMgPyBmaWx0ZXJGdW5jKGVudGl0eSkgOiB0cnVlKTtcclxuICB9O1xyXG5cclxuICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIC8vIFRPRE86IG1hcE1hbnlcclxuICBncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcclxuICAgIGxldCBlbnRpdGllcyA9IGdyb3VwLl9lbnRpdGllcy5maWx0ZXIobmV3RmlsdGVyRnVuYykgYXMgRW50aXR5W107XHJcbiAgICBpZiAoZW50aXRpZXMubGVuZ3RoKSB7XHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5sZW5ndGggPyByZXN1bHQuY29uY2F0KGVudGl0aWVzKSA6IGVudGl0aWVzO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBsZXQgb3JkZXJCeUNvbXBhcmVyID0gcXVlcnkub3JkZXJCeUNsYXVzZSAmJiBxdWVyeS5vcmRlckJ5Q2xhdXNlLmdldENvbXBhcmVyKGVudGl0eVR5cGUhKTtcclxuICBpZiAob3JkZXJCeUNvbXBhcmVyKSB7XHJcbiAgICByZXN1bHQuc29ydChvcmRlckJ5Q29tcGFyZXIpO1xyXG4gIH1cclxuXHJcbiAgbGV0IGlubGluZUNvdW50ID0gcXVlcnkuaW5saW5lQ291bnRFbmFibGVkID8gcmVzdWx0Lmxlbmd0aCA6IHVuZGVmaW5lZDtcclxuXHJcbiAgbGV0IHNraXBDb3VudCA9IHF1ZXJ5LnNraXBDb3VudDtcclxuICBpZiAoc2tpcENvdW50KSB7XHJcbiAgICByZXN1bHQgPSByZXN1bHQuc2xpY2Uoc2tpcENvdW50KTtcclxuICB9XHJcbiAgbGV0IHRha2VDb3VudCA9IHF1ZXJ5LnRha2VDb3VudDtcclxuICBpZiAodGFrZUNvdW50KSB7XHJcbiAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgdGFrZUNvdW50KTtcclxuICB9XHJcblxyXG4gIGxldCBzZWxlY3RDbGF1c2UgPSBxdWVyeS5zZWxlY3RDbGF1c2U7XHJcbiAgaWYgKHNlbGVjdENsYXVzZSkge1xyXG4gICAgbGV0IHNlbGVjdEZuID0gc2VsZWN0Q2xhdXNlLnRvRnVuY3Rpb24oKTtcclxuICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoc2VsZWN0Rm4pO1xyXG4gIH1cclxuICByZXR1cm4geyByZXN1bHRzOiByZXN1bHQsIGlubGluZUNvdW50OiBpbmxpbmVDb3VudCB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb0hhc09yaWdpbmFsVmFsdWVzKGNvOiBDb21wbGV4T2JqZWN0KSB7XHJcbiAgLy8gbmV4dCBsaW5lIGNoZWNrcyBhbGwgbm9uIGNvbXBsZXggcHJvcGVydGllcyBvZiB0aGUgY28uXHJcbiAgaWYgKCFjb3JlLmlzRW1wdHkoY28uY29tcGxleEFzcGVjdC5vcmlnaW5hbFZhbHVlcykpIHJldHVybiB0cnVlO1xyXG4gIC8vIG5vdyBuZWVkIHRvIHJlY3Vyc2l2ZWx5IGNoZWNrIGVhY2ggb2YgdGhlIGNwc1xyXG4gIHJldHVybiBjby5jb21wbGV4VHlwZS5jb21wbGV4UHJvcGVydGllcy5zb21lKGZ1bmN0aW9uIChjcCkge1xyXG4gICAgcmV0dXJuIGNwSGFzT3JpZ2luYWxWYWx1ZXMoY28sIGNwKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U2VyaWFsaXplckZuKHN0eXBlOiBFbnRpdHlUeXBlIHwgQ29tcGxleFR5cGUpIHtcclxuICByZXR1cm4gc3R5cGUuc2VyaWFsaXplckZuIHx8IChzdHlwZS5tZXRhZGF0YVN0b3JlICYmIHN0eXBlLm1ldGFkYXRhU3RvcmUuc2VyaWFsaXplckZuKTtcclxufVxyXG5cclxuIl19
2112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL2VudGl0eS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxJQUFJLEVBQTJCLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQXFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQWUsWUFBWSxFQUFzQixvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25JLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFB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USxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUMvQjtJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxFQUFpQjtJQUM1Qyx5REFBeUQ7SUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNoRSxnREFBZ0Q7SUFDaEQsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDdkQsT0FBTyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsS0FBK0I7SUFDdEQsT0FBTyxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU2VydmljZUFkYXB0ZXIgfSBmcm9tICcuL2ludGVyZmFjZS1yZWdpc3RyeSc7XHJcbmltcG9ydCB7IGNvcmUsIENhbGxiYWNrLCBFcnJvckNhbGxiYWNrIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgYXNzZXJ0UGFyYW0sIGFzc2VydENvbmZpZyB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBCcmVlemVFdmVudCB9IGZyb20gJy4vZXZlbnQnO1xyXG5pbXBvcnQgeyBFbnRpdHlBc3BlY3QsIEVudGl0eSwgQ29tcGxleE9iamVjdCwgU3RydWN0dXJhbE9iamVjdCwgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzIH0gZnJvbSAnLi9lbnRpdHktYXNwZWN0JztcclxuaW1wb3J0IHsgTWV0YWRhdGFTdG9yZSwgRW50aXR5VHlwZSwgQ29tcGxleFR5cGUsIERhdGFQcm9wZXJ0eSwgTmF2aWdhdGlvblByb3BlcnR5LCBBdXRvR2VuZXJhdGVkS2V5VHlwZSB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuaW1wb3J0IHsgRW50aXR5S2V5IH0gZnJvbSAnLi9lbnRpdHkta2V5JztcclxuaW1wb3J0IHsgRW50aXR5QWN0aW9uICB9IGZyb20gJy4vZW50aXR5LWFjdGlvbic7XHJcbmltcG9ydCB7IEVudGl0eVN0YXRlIH0gZnJvbSAnLi9lbnRpdHktc3RhdGUnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4vZGF0YS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL2RhdGEtdHlwZSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uT3B0aW9ucyB9IGZyb20gJy4vdmFsaWRhdGlvbi1vcHRpb25zJztcclxuaW1wb3J0IHsgUXVlcnlPcHRpb25zLCBNZXJnZVN0cmF0ZWd5LCBGZXRjaFN0cmF0ZWd5IH0gZnJvbSAnLi9xdWVyeS1vcHRpb25zJztcclxuaW1wb3J0IHsgU2F2ZU9wdGlvbnMgfSBmcm9tICcuL3NhdmUtb3B0aW9ucyc7XHJcbmltcG9ydCB7IEtleUdlbmVyYXRvciB9IGZyb20gJy4va2V5LWdlbmVyYXRvcic7XHJcbmltcG9ydCB7IEVudGl0eUdyb3VwIH0gZnJvbSAnLi9lbnRpdHktZ3JvdXAnO1xyXG5pbXBvcnQgeyBNYXBwaW5nQ29udGV4dCB9IGZyb20gJy4vbWFwcGluZy1jb250ZXh0JztcclxuaW1wb3J0IHsgRW50aXR5UXVlcnkgfSBmcm9tICcuL2VudGl0eS1xdWVyeSc7XHJcbmltcG9ydCB7IFVuYXR0YWNoZWRDaGlsZHJlbk1hcCB9IGZyb20gJy4vdW5hdHRhY2hlZC1jaGlsZHJlbi1tYXAnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVzcG9uc2Uge1xyXG4gIGNvbmZpZzogYW55O1xyXG4gIGRhdGE6IGFueTtcclxuICBlcnJvcj86IGFueTtcclxuICBzYXZlQ29udGV4dD86IGFueTtcclxuICBzdGF0dXM6IG51bWJlcjtcclxuICBnZXRIZWFkZXJzKGhlYWRlck5hbWU6IHN0cmluZyk6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRSZXN1bHQge1xyXG4gIGVudGl0aWVzOiBFbnRpdHlbXTtcclxuICB0ZW1wS2V5TWFwcGluZzogSVRlbXBLZXlNYXA7XHJcbn1cclxuXHJcbi8vIHN1YmNsYXNzZXMgb2YgRXJyb3JcclxuXHJcbi8qKiBCYXNlIHNoYXBlIG9mIGFueSBlcnJvcnMgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlO1xyXG4gIHN0YXR1czogbnVtYmVyO1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICBzdGF0dXNUZXh0Pzogc3RyaW5nO1xyXG4gIGJvZHk/OiBhbnk7XHJcbiAgdXJsPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogU2hhcGUgb2YgYSBzYXZlIGVycm9yIHJldHVybmVkIGZyb20gdGhlIHNlcnZlci4gXHJcbkZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBAaW50ZXJuYWwgXHJcbiovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUVycm9yRnJvbVNlcnZlciBleHRlbmRzIFNlcnZlckVycm9yIHtcclxuICBlbnRpdHlFcnJvcnM6IEVudGl0eUVycm9yRnJvbVNlcnZlcltdO1xyXG59XHJcblxyXG4vKiogU2hhcGUgb2YgYSBzYXZlIGVycm9yIHdoZW4gcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTYXZlRXJyb3IgZXh0ZW5kcyBTZXJ2ZXJFcnJvciB7XHJcbiAgZW50aXR5RXJyb3JzOiBFbnRpdHlFcnJvcltdO1xyXG59XHJcblxyXG4vLyBub3Qgc3ViY2xhc3NlcyBvZiBFcnJvclxyXG4vKiogXHJcbkZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBAaW50ZXJuYWwgXHJcbiovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RXJyb3JGcm9tU2VydmVyIHtcclxuICBlbnRpdHlUeXBlTmFtZTogc3RyaW5nO1xyXG4gIGtleVZhbHVlczogYW55W107XHJcblxyXG4gIGVycm9yTmFtZTogc3RyaW5nO1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG4gIGN1c3RvbT86IGFueTtcclxufVxyXG5cclxuLyoqIFNoYXBlIG9mIGFuIGVycm9yIG9uIGEgc3BlY2lmaWMgZW50aXR5LiAgUGFydCBvZiBhIFtbSVNhdmVFcnJvcl1dICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RXJyb3Ige1xyXG4gIGVudGl0eTogRW50aXR5O1xyXG4gIGVycm9yTmFtZTogc3RyaW5nO1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG4gIGlzU2VydmVyRXJyb3I6IGJvb2xlYW47XHJcbiAgY3VzdG9tPzogYW55O1xyXG59XHJcblxyXG4vKiogVGhlIHNoYXBlIG9mIHRoZSBQcm9taXNlIHJldHVybmVkIGJ5IGFuIFtbRW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnldXSBjYWxsLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UmVzdWx0IHtcclxuICAvKiogVG9wIGxldmVsIGVudGl0aWVzIHJldHVybmVkLiAgRXhjbHVkZXMgZW50aXRpZXMgdGhhdCBhcmUgRGVsZXRlZC4gKi9cclxuICByZXN1bHRzOiBhbnlbXTtcclxuICAvKiogUXVlcnkgdGhhdCB3YXMgZXhlY3V0ZWQgKi9cclxuICBxdWVyeTogRW50aXR5UXVlcnkgfCBzdHJpbmc7XHJcbiAgLyoqIEVudGl0eU1hbmFnZXIgdGhhdCBleGVjdXRlZCB0aGUgcXVlcnkgKi9cclxuICBlbnRpdHlNYW5hZ2VyPzogRW50aXR5TWFuYWdlcjtcclxuICAvKiogVG90YWwgbnVtYmVyIG9mIHJlc3VsdHMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIgKi9cclxuICBpbmxpbmVDb3VudD86IG51bWJlcjtcclxuICAvKiogQWxsIGVudGl0aWVzIHJldHVybmVkIGJ5IHRoZSBxdWVyeS4gIERpZmZlcnMgZnJvbSBgcmVzdWx0c2Agd2hlbiBhbiBleHBhbmQgaXMgdXNlZC4gIEluY2x1ZGVzIGVudGl0aWVzIHRoYXQgYXJlIERlbGV0ZWQuICovXHJcbiAgcmV0cmlldmVkRW50aXRpZXM/OiBFbnRpdHlbXTtcclxuICAgIC8qKiBSYXcgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyICovXHJcbiAgaHR0cFJlc3BvbnNlPzogSHR0cFJlc3BvbnNlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5U3VjY2Vzc0NhbGxiYWNrIHtcclxuICAoZGF0YTogUXVlcnlSZXN1bHQpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5RXJyb3JDYWxsYmFjayB7XHJcbiAgKGVycm9yOiB7IHF1ZXJ5OiBFbnRpdHlRdWVyeTsgaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2U7IGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXI7IG1lc3NhZ2U/OiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nIH0pOiB2b2lkO1xyXG59XHJcblxyXG4vKiogS2V5IG1hcHBpbmcgaW5mb3JtYXRpb24gcmV0dXJuZWQgYXMgcGFydCBvZiBhbiBbW0lTYXZlUmVzdWx0XV0uICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgS2V5TWFwcGluZyB7XHJcbiAgZW50aXR5VHlwZU5hbWU6IHN0cmluZztcclxuICB0ZW1wVmFsdWU6IGFueTtcclxuICByZWFsVmFsdWU6IGFueTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElUZW1wS2V5TWFwIHtcclxuICBbaW5kZXg6IHN0cmluZ106IEVudGl0eUtleTtcclxufVxyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gaW5mbyB0byBiZSBwYXNzZWQgdG8gdGhlIFtbRW50aXR5TWFuYWdlci5pbXBvcnRFbnRpdGllc11dIG1ldGhvZCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydENvbmZpZyB7XHJcbiAgLyoqIElmIHRydWUsIG1lcmdlIEFkZGVkIGVudGl0aWVzICh3aXRoIHRlbXAga2V5cykgYXMgd2VsbC4gIFRoaXMgY2FuIGJlIGRhbmdlcm91cy4gKi9cclxuICBtZXJnZUFkZHM/OiBib29sZWFuO1xyXG4gIG1lcmdlU3RyYXRlZ3k/OiBNZXJnZVN0cmF0ZWd5OyAgXHJcbiAgbWV0YWRhdGFWZXJzaW9uRm4/OiAoYXJnOiB7IG1ldGFkYXRhVmVyc2lvbjogYW55LCBtZXRhZGF0YVN0b3JlTmFtZTogYW55IH0pID0+IHZvaWQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJbXBvcnRDb25maWdFeHQgZXh0ZW5kcyBJbXBvcnRDb25maWcge1xyXG4gIHRlbXBLZXlNYXA/OiBJVGVtcEtleU1hcDtcclxufVxyXG5cclxuLyoqIFRoZSBzaGFwZSBvZiB0aGUgUHJvbWlzZSByZXR1cm5lZCBieSBhbiBbW0VudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXNdXSBjYWxsLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVSZXN1bHQge1xyXG4gIGVudGl0aWVzOiBFbnRpdHlbXTtcclxuICBrZXlNYXBwaW5nczogS2V5TWFwcGluZ1tdO1xyXG4gIGRlbGV0ZWRLZXlzPzogeyBlbnRpdHlUeXBlTmFtZTogc3RyaW5nLCBrZXlWYWx1ZXM6IGFueVtdfVtdO1xyXG4gIGh0dHBSZXNwb25zZT86IEh0dHBSZXNwb25zZTtcclxufVxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGludGVyZmFjZSBTYXZlQ29udGV4dCB7XHJcbiAgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcjtcclxuICBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XHJcbiAgcHJvY2Vzc1NhdmVkRW50aXRpZXM6IChzYXZlUmVzdWx0OiBTYXZlUmVzdWx0KSA9PiBFbnRpdHlbXTtcclxuICByZXNvdXJjZU5hbWU6IHN0cmluZztcclxuICBhZGFwdGVyPzogRGF0YVNlcnZpY2VBZGFwdGVyO1xyXG4gIHJvdXRlUHJlZml4Pzogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbi4gXHJcbkBhZGFwdGVyIChzZWUgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVCdW5kbGUge1xyXG4gIGVudGl0aWVzOiBFbnRpdHlbXTtcclxuICBzYXZlT3B0aW9uczogU2F2ZU9wdGlvbnM7XHJcbn1cclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBbW0VudGl0eU1hbmFnZXJdXSBjb25zdHJ1Y3RvciAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eU1hbmFnZXJDb25maWcge1xyXG4gIC8qKiBUaGUgc2VydmljZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuICAqKi9cclxuICBzZXJ2aWNlTmFtZT86IHN0cmluZztcclxuICAvKiogVGhlIERhdGFTZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuICoqL1xyXG4gIGRhdGFTZXJ2aWNlPzogRGF0YVNlcnZpY2U7XHJcbiAgLyoqIFRoZSBbW1F1ZXJ5T3B0aW9uc11dIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuICAqKi9cclxuICBxdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbnM7XHJcbiAgLyoqIFRoZSBbW1NhdmVPcHRpb25zXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gKiovXHJcbiAgc2F2ZU9wdGlvbnM/OiBTYXZlT3B0aW9ucztcclxuICAvKiogVGhlIFtbVmFsaWRhdGlvbk9wdGlvbnNdXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiAgKiovXHJcbiAgdmFsaWRhdGlvbk9wdGlvbnM/OiBWYWxpZGF0aW9uT3B0aW9ucztcclxuICAvKiogVGhlIFtbS2V5R2VuZXJhdG9yXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gKiovXHJcbiAga2V5R2VuZXJhdG9yPzogS2V5R2VuZXJhdG9yO1xyXG4gIC8qKiBUaGUgW1tLZXlHZW5lcmF0b3JdXSBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHlNYW5hZ2VyLiAqKi9cclxuICBrZXlHZW5lcmF0b3JDdG9yPzogeyBuZXcgKCk6IEtleUdlbmVyYXRvciB9OyAvLyBUT0RPOiByZXZpZXcgdGhpc1xyXG4gIC8qKiBUaGUgW1tNZXRhZGF0YVN0b3JlXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gKiovXHJcbiAgbWV0YWRhdGFTdG9yZT86IE1ldGFkYXRhU3RvcmU7XHJcbn1cclxuXHJcbi8qKiBUaGUgc2hhcGUgcmV0dXJuZWQgYnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBbW0VudGl0eU1hbmFnZXIuZW50aXR5Q2hhbmdlZF1dIGV2ZW50ICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5Q2hhbmdlZEV2ZW50QXJncyB7XHJcbiAgZW50aXR5QWN0aW9uOiBFbnRpdHlBY3Rpb247XHJcbiAgZW50aXR5PzogRW50aXR5O1xyXG4gIGFyZ3M/OiBQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3M7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkVycm9yc0NoYW5nZWRFdmVudEFyZ3Mge1xyXG4gIGVudGl0eTogRW50aXR5OyBcclxuICBhZGRlZDogVmFsaWRhdGlvbkVycm9yW107IFxyXG4gIHJlbW92ZWQ6IFZhbGlkYXRpb25FcnJvcltdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhhc0NoYW5nZXNDaGFuZ2VkRXZlbnRBcmdzIHtcclxuICBlbnRpdHlNYW5hZ2VyOiBFbnRpdHlNYW5hZ2VyOyBcclxuICBoYXNDaGFuZ2VzOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuSW5zdGFuY2VzIG9mIHRoZSBFbnRpdHlNYW5hZ2VyIGNvbnRhaW4gYW5kIG1hbmFnZSBjb2xsZWN0aW9ucyBvZiBlbnRpdGllcywgZWl0aGVyIHJldHJpZXZlZCBmcm9tIGEgYmFja2VuZCBkYXRhc3RvcmUgb3IgY3JlYXRlZCBvbiB0aGUgY2xpZW50LlxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEVudGl0eU1hbmFnZXIge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gYWN0dWFsbHkgZGVmaW5lZCBvbiBwcm90b3R5cGVcclxuXHJcbiAgLyoqIFRoZSBzZXJ2aWNlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xyXG4gIC8qKiBUaGUgRGF0YVNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XHJcbiAgLyoqIFRoZSBbW1F1ZXJ5T3B0aW9uc11dIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAgcXVlcnlPcHRpb25zOiBRdWVyeU9wdGlvbnM7XHJcbiAgLyoqIFRoZSBbW1NhdmVPcHRpb25zXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBzYXZlT3B0aW9uczogU2F2ZU9wdGlvbnM7XHJcbiAgLyoqIFRoZSBbW1ZhbGlkYXRpb25PcHRpb25zXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICB2YWxpZGF0aW9uT3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnM7XHJcbiAgLyoqIFRoZSBbW0tleUdlbmVyYXRvcl1dIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAga2V5R2VuZXJhdG9yOiBLZXlHZW5lcmF0b3I7XHJcbiAgLyoqIFRoZSBbW0tleUdlbmVyYXRvcl1dIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAga2V5R2VuZXJhdG9yQ3RvcjogeyBuZXcgKCk6IEtleUdlbmVyYXRvciB9OyAvLyBUT0RPOiByZXZpZXcgdGhpc1xyXG4gIC8qKiBUaGUgW1tNZXRhZGF0YVN0b3JlXV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBtZXRhZGF0YVN0b3JlOiBNZXRhZGF0YVN0b3JlO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcclxuICBpc1JlamVjdGluZ0NoYW5nZXM6IGJvb2xlYW47XHJcblxyXG4gIC8vIGV2ZW50c1xyXG4gIC8qKlxyXG4gIEEgW1tCcmVlemVFdmVudF1dIHRoYXQgZmlyZXMgd2hlbmV2ZXIgYSBjaGFuZ2UgdG8gYW55IGVudGl0eSBpbiB0aGlzIEVudGl0eU1hbmFnZXIgb2NjdXJzLiBfX1JlYWQgT25seV9fXHJcblxyXG4gIEBldmVudEFyZ3MgLSBcclxuICAtIGVudGl0eUFjdGlvbiAtIFRoZSBbW0VudGl0eUFjdGlvbl1dIHRoYXQgb2NjdXJlZC5cclxuICAtIGVudGl0eSAtIFRoZSBlbnRpdHkgdGhhdCBjaGFuZ2VkLiAgSWYgdGhpcyBpcyBudWxsLCB0aGVuIGFsbCBlbnRpdGllcyBpbiB0aGUgZW50aXR5TWFuYWdlciB3ZXJlIGFmZmVjdGVkLlxyXG4gIC0gYXJncyAtIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBldmVudC4gVGhpcyB3aWxsIGRpZmZlciBiYXNlZCBvbiB0aGUgZW50aXR5QWN0aW9uLlxyXG5cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoIHtzZXJ2aWNlTmFtZTogXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiIH0pO1xyXG4gID4gICAgICBlbS5lbnRpdHlDaGFuZ2VkLnN1YnNjcmliZShmdW5jdGlvbihjaGFuZ2VBcmdzKSB7XHJcbiAgPiAgICAgICAgICAvLyBUaGlzIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBhbnkgdGltZSBhbnkgZW50aXR5IHdpdGhpbiB0aGUgZW50aXR5TWFuYWdlciBcclxuICA+ICAgICAgICAgIC8vIGlzIGFkZGVkLCBtb2RpZmllZCwgZGVsZXRlZCBvciBkZXRhY2hlZCBmb3IgYW55IHJlYXNvbi5cclxuICA+ICAgICAgICAgIGxldCBhY3Rpb24gPSBjaGFuZ2VBcmdzLmVudGl0eUFjdGlvbjtcclxuICA+ICAgICAgICAgIGxldCBlbnRpdHkgPSBjaGFuZ2VBcmdzLmVudGl0eTtcclxuICA+ICAgICAgICAgIC8vIC4uIGRvIHNvbWV0aGluZyB0byB0aGlzIGVudGl0eSB3aGVuIGl0IGlzIGNoYW5nZWQuXHJcbiAgPiAgICAgIH0pO1xyXG4gID4gIH0pO1xyXG4gIEBldmVudFxyXG4gICoqL1xyXG4gIGVudGl0eUNoYW5nZWQ6IEJyZWV6ZUV2ZW50PEVudGl0eUNoYW5nZWRFdmVudEFyZ3M+O1xyXG5cclxuICAvKipcclxuICBBbiBbW0JyZWV6ZUV2ZW50XV0gdGhhdCBmaXJlcyB3aGVuZXZlciB2YWxpZGF0aW9uRXJyb3JzIGNoYW5nZSBmb3IgYW55IGVudGl0eSBpbiB0aGlzIEVudGl0eU1hbmFnZXIuIF9fUmVhZCBPbmx5X19cclxuICBAZXZlbnRBcmdzIC1cclxuICAgIC0gZW50aXR5IC0gVGhlIGVudGl0eSBvbiB3aGljaCB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgaGF2ZSBiZWVuIGFkZGVkIG9yIHJlbW92ZWQuXHJcbiAgICAtIGFkZGVkIC0gQW4gYXJyYXkgY29udGFpbmluZyBhbnkgbmV3bHkgYWRkZWQgW1tWYWxpZGF0aW9uRXJyb3JdXXNcclxuICAgIC0gcmVtb3ZlZCAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYW55IG5ld2x5IHJlbW92ZWQgW1tWYWxpZGF0aW9uRXJyb3JdXXMuIFRoaXMgaXMgdGhvc2UgZXJyb3JzIHRoYXQgaGF2ZSBiZWVuICdmaXhlZCcgIFxyXG5cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoIHtzZXJ2aWNlTmFtZTogXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiIH0pO1xyXG4gID4gICAgICBlbS52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZC5zdWJzY3JpYmUoZnVuY3Rpb24oY2hhbmdlQXJncykge1xyXG4gID4gICAgICAgICAgICAgIC8vIFRoaXMgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIGFueSB0aW1lIGFueSBlbnRpdHkgd2l0aGluIHRoZSBlbnRpdHlNYW5hZ2VyIGV4cGVyaWVuY2VzIGEgY2hhbmdlIHRvIGl0cyB2YWxpZGF0aW9uRXJyb3JzIGNvbGxlY3Rpb24uXHJcbiAgPiAgICAgICAgICAgICAgZnVuY3Rpb24gKHZhbGlkYXRpb25DaGFuZ2VBcmdzKSB7XHJcbiAgPiAgICAgICAgICAgICAgICAgIGxldCBlbnRpdHkgPT0gdmFsaWRhdGlvbkNoYW5nZUFyZ3MuZW50aXR5O1xyXG4gID4gICAgICAgICAgICAgICAgICBsZXQgZXJyb3JzQWRkZWQgPSB2YWxpZGF0aW9uQ2hhbmdlQXJncy5hZGRlZDtcclxuICA+ICAgICAgICAgICAgICAgICAgbGV0IGVycm9yc0NsZWFyZWQgPSB2YWxpZGF0aW9uQ2hhbmdlQXJncy5yZW1vdmVkO1xyXG4gID4gICAgICAgICAgICAgICAgICAvLyAuLi4gZG8gc29tZXRoaW5nIGludGVyZXN0aW5nIHdpdGggdGhlIG9yZGVyLlxyXG4gID4gICAgICAgICAgICAgIH0pO1xyXG4gID4gICAgICAgICAgfSk7XHJcbiAgPiAgICAgIH0pO1xyXG4gIEBldmVudFxyXG4gICoqL1xyXG4gIHZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkOiBCcmVlemVFdmVudDxWYWxpZGF0aW9uRXJyb3JzQ2hhbmdlZEV2ZW50QXJncz47XHJcblxyXG4gIC8qKlxyXG4gIEEgW1tCcmVlemVFdmVudF1dIHRoYXQgZmlyZXMgd2hlbmV2ZXIgYW4gRW50aXR5TWFuYWdlciB0cmFuc2l0aW9ucyB0byBvciBmcm9tIGhhdmluZyBjaGFuZ2VzLiBfX1JlYWQgT25seV9fXHJcbiAgQGV2ZW50QXJncyAtXHJcbiAgICAtIGVudGl0eU1hbmFnZXIgLSBUaGUgRW50aXR5TWFuYWdlciB3aG9zZSAnaGFzQ2hhbmdlcycgc3RhdHVzIGhhcyBjaGFuZ2VkLlxyXG4gICAgLSBoYXNDaGFuZ2VzIC0gV2hldGhlciBvciBub3QgdGhpcyBFbnRpdHlNYW5hZ2VyIGhhcyBjaGFuZ2VzLlxyXG5cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoIHtzZXJ2aWNlTmFtZTogXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiIH0pO1xyXG4gID4gICAgICBlbS5oYXNDaGFuZ2VzQ2hhbmdlZC5zdWJzY3JpYmUoZnVuY3Rpb24oYXJncykge1xyXG4gID4gICAgICAgICAgICAgIGxldCBoYXNDaGFuZ2VzQ2hhbmdlZCA9IGFyZ3MuaGFzQ2hhbmdlcztcclxuICA+ICAgICAgICAgICAgICBsZXQgZW50aXR5TWFuYWdlciA9IGFyZ3MuZW50aXR5TWFuYWdlcjtcclxuICA+ICAgICAgICAgIH0pO1xyXG4gID4gICAgICB9KTtcclxuICBAZXZlbnQgXHJcbiAgKiovXHJcbiAgaGFzQ2hhbmdlc0NoYW5nZWQ6IEJyZWV6ZUV2ZW50PEhhc0NoYW5nZXNDaGFuZ2VkRXZlbnRBcmdzPjtcclxuXHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9wZW5kaW5nUHVicz86IGFueVtdOyAvLyBUT0RPOiByZWZpbmUgbGF0ZXJcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfaGFzQ2hhbmdlc0FjdGlvbj86ICgoKSA9PiBib29sZWFuKTsgLy8gVE9ETyByZWZpbmUgbGF0ZXJcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfaGFzQ2hhbmdlczogYm9vbGVhbjtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZW50aXR5R3JvdXBNYXA6IHsgW2luZGV4OiBzdHJpbmddOiBFbnRpdHlHcm91cCB9O1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF91bmF0dGFjaGVkQ2hpbGRyZW5NYXA6IFVuYXR0YWNoZWRDaGlsZHJlbk1hcDtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfaW5LZXlGaXh1cDogYm9vbGVhbjtcclxuXHJcbiAgaGVscGVyID0ge1xyXG4gICAgdW53cmFwSW5zdGFuY2U6IHVud3JhcEluc3RhbmNlLFxyXG4gICAgdW53cmFwT3JpZ2luYWxWYWx1ZXM6IHVud3JhcE9yaWdpbmFsVmFsdWVzLFxyXG4gICAgdW53cmFwQ2hhbmdlZFZhbHVlczogdW53cmFwQ2hhbmdlZFZhbHVlc1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIEVudGl0eU1hbmFnZXIgY29uc3RydWN0b3IuXHJcblxyXG4gIEF0IGl0cyBtb3N0IGJhc2ljIGFuIEVudGl0eU1hbmFnZXIgY2FuIGJlIGNvbnN0cnVjdGVkIHdpdGgganVzdCBhIHNlcnZpY2UgbmFtZVxyXG4gID4gICAgIGxldCBlbnRpdHlNYW5hZ2VyID0gbmV3IEVudGl0eU1hbmFnZXIoIFwiYnJlZXplL05vcnRod2luZElCTW9kZWxcIik7XHJcblxyXG4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBpdCB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBvYmplY3RcclxuICA+ICAgICBsZXQgZW50aXR5TWFuYWdlciA9IG5ldyBFbnRpdHlNYW5hZ2VyKCB7c2VydmljZU5hbWU6IFwiYnJlZXplL05vcnRod2luZElCTW9kZWxcIiB9KTtcclxuXHJcbiAgVXN1YWxseSBob3dldmVyLCBjb25maWd1cmF0aW9uIG9iamVjdHMgd2lsbCBjb250YWluIG1vcmUgdGhhbiBqdXN0IHRoZSAnc2VydmljZU5hbWUnO1xyXG4gID4gICAgIGxldCBtZXRhZGF0YVN0b3JlID0gbmV3IE1ldGFkYXRhU3RvcmUoKTtcclxuICA+ICAgICBsZXQgZW50aXR5TWFuYWdlciA9IG5ldyBFbnRpdHlNYW5hZ2VyKCB7XHJcbiAgPiAgICAgICBzZXJ2aWNlTmFtZTogXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiLFxyXG4gID4gICAgICAgbWV0YWRhdGFTdG9yZTogbWV0YWRhdGFTdG9yZVxyXG4gID4gICAgIH0pO1xyXG5cclxuICBvclxyXG4gID4gICAgIHJldHVybiBuZXcgUXVlcnlPcHRpb25zKHtcclxuICA+ICAgICAgICAgbWVyZ2VTdHJhdGVneTogb2JqLFxyXG4gID4gICAgICAgICBmZXRjaFN0cmF0ZWd5OiB0aGlzLmZldGNoU3RyYXRlZ3lcclxuICA+ICAgICB9KTtcclxuICA+ICAgICBsZXQgcXVlcnlPcHRpb25zID0gbmV3IFF1ZXJ5T3B0aW9ucyh7XHJcbiAgPiAgICAgICAgIG1lcmdlU3RyYXRlZ3k6IE1lcmdlU3RyYXRlZ3kuT3ZlcndyaXRlQ2hhbmdlcyxcclxuICA+ICAgICAgICAgZmV0Y2hTdHJhdGVneTogRmV0Y2hTdHJhdGVneS5Gcm9tU2VydmVyXHJcbiAgPiAgICAgfSk7XHJcbiAgPiAgICAgbGV0IHZhbGlkYXRpb25PcHRpb25zID0gbmV3IFZhbGlkYXRpb25PcHRpb25zKHtcclxuICA+ICAgICAgICAgdmFsaWRhdGVPbkF0dGFjaDogdHJ1ZSxcclxuICA+ICAgICAgICAgdmFsaWRhdGVPblNhdmU6IHRydWUsXHJcbiAgPiAgICAgICAgIHZhbGlkYXRlT25RdWVyeTogZmFsc2VcclxuICA+ICAgICB9KTtcclxuICA+ICAgICBsZXQgZW50aXR5TWFuYWdlciA9IG5ldyBFbnRpdHlNYW5hZ2VyKHtcclxuICA+ICAgICAgICAgc2VydmljZU5hbWU6IFwiYnJlZXplL05vcnRod2luZElCTW9kZWxcIixcclxuICA+ICAgICAgICAgcXVlcnlPcHRpb25zOiBxdWVyeU9wdGlvbnMsXHJcbiAgPiAgICAgICAgIHZhbGlkYXRpb25PcHRpb25zOiB2YWxpZGF0aW9uT3B0aW9uc1xyXG4gID4gICAgIH0pO1xyXG4gIEBwYXJhbSBlbUNvbmZpZyAtIENvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgb3IgYSBzZXJ2aWNlIG5hbWUuICBcclxuICAqKi9cclxuICBjb25zdHJ1Y3RvcihlbUNvbmZpZz86IEVudGl0eU1hbmFnZXJDb25maWcgfCBzdHJpbmcpIHtcclxuXHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIEVudGl0eU1hbmFnZXIgY3RvciBoYXMgYSBzaW5nbGUgb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBlaXRoZXIgYSAnc2VydmljZU5hbWUnIG9yIGEgY29uZmlndXJhdGlvbiBvYmplY3QuXCIpO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvbmZpZzogRW50aXR5TWFuYWdlckNvbmZpZztcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbmZpZyA9IHsgc2VydmljZU5hbWU6IFwiXCIgfTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtQ29uZmlnID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25maWcgPSB7IHNlcnZpY2VOYW1lOiBlbUNvbmZpZyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uZmlnID0gZW1Db25maWcgfHwge307XHJcbiAgICB9XHJcblxyXG4gICAgRW50aXR5TWFuYWdlci5fdXBkYXRlV2l0aENvbmZpZyh0aGlzLCBjb25maWcsIHRydWUpO1xyXG5cclxuICAgIHRoaXMuZW50aXR5Q2hhbmdlZCA9IG5ldyBCcmVlemVFdmVudChcImVudGl0eUNoYW5nZWRcIiwgdGhpcyk7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkID0gbmV3IEJyZWV6ZUV2ZW50KFwidmFsaWRhdGlvbkVycm9yc0NoYW5nZWRcIiwgdGhpcyk7XHJcbiAgICB0aGlzLmhhc0NoYW5nZXNDaGFuZ2VkID0gbmV3IEJyZWV6ZUV2ZW50KFwiaGFzQ2hhbmdlc0NoYW5nZWRcIiwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5jbGVhcigpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEdlbmVyYWwgcHVycG9zZSBwcm9wZXJ0eSBzZXQgbWV0aG9kLiAgQW55IG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBbW0VudGl0eU1hbmFnZXJDb25maWddXVxyXG4gIG1heSBiZSBzZXQuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYSBwcmV2aW91c2x5IGNyZWF0ZWQgRW50aXR5TWFuYWdlclxyXG4gID4gICAgICAvLyB3aGVyZSB3ZSB3YW50IHRvIGNoYW5nZSBzb21lIG9mIGl0cyBzZXR0aW5ncy5cclxuICA+ICAgICAgZW0xLnNldFByb3BlcnRpZXMoIHtcclxuICA+ICAgICAgICAgIHNlcnZpY2VOYW1lOiBcImJyZWV6ZS9mb29cIlxyXG4gID4gICAgICB9KTtcclxuICBAcGFyYW0gY29uZmlnIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB0byBzZXQuXHJcbiAgKiovXHJcbiAgc2V0UHJvcGVydGllcyhjb25maWc6IEVudGl0eU1hbmFnZXJDb25maWcpIHtcclxuICAgIEVudGl0eU1hbmFnZXIuX3VwZGF0ZVdpdGhDb25maWcodGhpcywgY29uZmlnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBzdGF0aWMgX3VwZGF0ZVdpdGhDb25maWcoZW06IEVudGl0eU1hbmFnZXIsIGNvbmZpZzogRW50aXR5TWFuYWdlckNvbmZpZywgaXNDdG9yOiBib29sZWFuKSB7XHJcbiAgICBsZXQgZGVmYXVsdFF1ZXJ5T3B0aW9ucyA9IGlzQ3RvciA/IFF1ZXJ5T3B0aW9ucy5kZWZhdWx0SW5zdGFuY2UgOiBlbS5xdWVyeU9wdGlvbnM7XHJcbiAgICBsZXQgZGVmYXVsdFNhdmVPcHRpb25zID0gaXNDdG9yID8gU2F2ZU9wdGlvbnMuZGVmYXVsdEluc3RhbmNlIDogZW0uc2F2ZU9wdGlvbnM7XHJcbiAgICBsZXQgZGVmYXVsdFZhbGlkYXRpb25PcHRpb25zID0gaXNDdG9yID8gVmFsaWRhdGlvbk9wdGlvbnMuZGVmYXVsdEluc3RhbmNlIDogZW0udmFsaWRhdGlvbk9wdGlvbnM7XHJcblxyXG4gICAgbGV0IGNvbmZpZ1BhcmFtID0gYXNzZXJ0Q29uZmlnKGNvbmZpZylcclxuICAgICAgLndoZXJlUGFyYW0oXCJzZXJ2aWNlTmFtZVwiKS5pc09wdGlvbmFsKCkuaXNTdHJpbmcoKVxyXG4gICAgICAud2hlcmVQYXJhbShcImRhdGFTZXJ2aWNlXCIpLmlzT3B0aW9uYWwoKS5pc0luc3RhbmNlT2YoRGF0YVNlcnZpY2UpXHJcbiAgICAgIC53aGVyZVBhcmFtKFwicXVlcnlPcHRpb25zXCIpLmlzSW5zdGFuY2VPZihRdWVyeU9wdGlvbnMpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdChkZWZhdWx0UXVlcnlPcHRpb25zKVxyXG4gICAgICAud2hlcmVQYXJhbShcInNhdmVPcHRpb25zXCIpLmlzSW5zdGFuY2VPZihTYXZlT3B0aW9ucykuaXNPcHRpb25hbCgpLndpdGhEZWZhdWx0KGRlZmF1bHRTYXZlT3B0aW9ucylcclxuICAgICAgLndoZXJlUGFyYW0oXCJ2YWxpZGF0aW9uT3B0aW9uc1wiKS5pc0luc3RhbmNlT2YoVmFsaWRhdGlvbk9wdGlvbnMpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdChkZWZhdWx0VmFsaWRhdGlvbk9wdGlvbnMpXHJcbiAgICAgIC53aGVyZVBhcmFtKFwia2V5R2VuZXJhdG9yQ3RvclwiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpO1xyXG4gICAgaWYgKGlzQ3Rvcikge1xyXG4gICAgICBjb25maWdQYXJhbSA9IGNvbmZpZ1BhcmFtXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJtZXRhZGF0YVN0b3JlXCIpLmlzSW5zdGFuY2VPZihNZXRhZGF0YVN0b3JlKS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQobmV3IE1ldGFkYXRhU3RvcmUoKSk7XHJcbiAgICB9XHJcbiAgICBjb25maWdQYXJhbS5hcHBseUFsbChlbSk7XHJcblxyXG4gICAgLy8gaW5zdXJlIHRoYXQgZW50aXR5TWFuYWdlcidzIG9wdGlvbnMgdmVyc2lvbnMgYXJlIGNvbXBsZXRlbHkgcG9wdWxhdGVkXHJcbiAgICBjb3JlLnVwZGF0ZVdpdGhEZWZhdWx0cyhlbS5xdWVyeU9wdGlvbnMsIGRlZmF1bHRRdWVyeU9wdGlvbnMpO1xyXG4gICAgY29yZS51cGRhdGVXaXRoRGVmYXVsdHMoZW0uc2F2ZU9wdGlvbnMsIGRlZmF1bHRTYXZlT3B0aW9ucyk7XHJcbiAgICBjb3JlLnVwZGF0ZVdpdGhEZWZhdWx0cyhlbS52YWxpZGF0aW9uT3B0aW9ucywgZGVmYXVsdFZhbGlkYXRpb25PcHRpb25zKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLnNlcnZpY2VOYW1lKSB7XHJcbiAgICAgIGVtLmRhdGFTZXJ2aWNlID0gbmV3IERhdGFTZXJ2aWNlKHtcclxuICAgICAgICBzZXJ2aWNlTmFtZTogZW0uc2VydmljZU5hbWVcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbS5zZXJ2aWNlTmFtZSA9IGVtLmRhdGFTZXJ2aWNlICYmIGVtLmRhdGFTZXJ2aWNlLnNlcnZpY2VOYW1lO1xyXG5cclxuICAgIGVtLmtleUdlbmVyYXRvckN0b3IgPSBlbS5rZXlHZW5lcmF0b3JDdG9yIHx8IEtleUdlbmVyYXRvcjtcclxuICAgIGlmIChpc0N0b3IgfHwgY29uZmlnLmtleUdlbmVyYXRvckN0b3IpIHtcclxuICAgICAgZW0ua2V5R2VuZXJhdG9yID0gbmV3IGVtLmtleUdlbmVyYXRvckN0b3IoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZUVudGl0eSh0eXBlTmFtZTogc3RyaW5nLCBpbml0aWFsVmFsdWVzPzogT2JqZWN0LCBlbnRpdHlTdGF0ZT86IEVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5PzogTWVyZ2VTdHJhdGVneSk6IEVudGl0eTtcclxuICBjcmVhdGVFbnRpdHkoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgaW5pdGlhbFZhbHVlcz86IE9iamVjdCwgZW50aXR5U3RhdGU/OiBFbnRpdHlTdGF0ZSwgbWVyZ2VTdHJhdGVneT86IE1lcmdlU3RyYXRlZ3kpOiBFbnRpdHk7XHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhIG5ldyBlbnRpdHkgb2YgYSBzcGVjaWZpZWQgdHlwZSBhbmQgb3B0aW9uYWxseSBpbml0aWFsaXplcyBpdC4gQnkgZGVmYXVsdCB0aGUgbmV3IGVudGl0eSBpcyBjcmVhdGVkIHdpdGggYW4gRW50aXR5U3RhdGUgb2YgQWRkZWRcclxuICBidXQgeW91IGNhbiBhbHNvIG9wdGlvbmFsbHkgc3BlY2lmeSBhbiBFbnRpdHlTdGF0ZS4gIEFuIEVudGl0eVN0YXRlIG9mICdEZXRhY2hlZCcgd2lsbCBpbnN1cmUgdGhhdCB0aGUgZW50aXR5IGlzIGNyZWF0ZWQgYnV0IG5vdCB5ZXQgYWRkZWRcclxuICB0byB0aGUgRW50aXR5TWFuYWdlci4gXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICAvLyBjcmVhdGUgYW5kIGFkZCBhbiBlbnRpdHk7XHJcbiAgPiAgICAgIGxldCBlbXAxID0gZW0xLmNyZWF0ZUVudGl0eShcIkVtcGxveWVlXCIpO1xyXG4gID4gICAgICAvLyBjcmVhdGUgYW5kIGFkZCBhbiBpbml0aWFsaXplZCBlbnRpdHk7XHJcbiAgPiAgICAgIGxldCBlbXAyID0gZW0xLmNyZWF0ZUVudGl0eShcIkVtcGxveWVlXCIsIHsgbGFzdE5hbWU6IFwiU21pdGhcIiwgZmlyc3ROYW1lOiBcIkpvaG5cIiB9KTtcclxuICA+ICAgICAgLy8gY3JlYXRlIGFuZCBhdHRhY2ggKG5vdCBhZGQpIGFuIGluaXRpYWxpemVkIGVudGl0eVxyXG4gID4gICAgICBsZXQgZW1wMyA9IGVtMS5jcmVhdGVFbnRpdHkoXCJFbXBsb3llZVwiLCB7IGlkOiA0MzUsIGxhc3ROYW1lOiBcIlNtaXRoXCIsIGZpcnN0TmFtZTogXCJKb2huXCIgfSwgRW50aXR5U3RhdGUuVW5jaGFuZ2VkKTtcclxuICA+ICAgICAgLy8gY3JlYXRlIGJ1dCBkb24ndCBhdHRhY2ggYW4gZW50aXR5O1xyXG4gID4gICAgICBsZXQgZW1wNCA9IGVtMS5jcmVhdGVFbnRpdHkoXCJFbXBsb3llZVwiLCB7IGlkOiA0MzUsIGxhc3ROYW1lOiBcIlNtaXRoXCIsIGZpcnN0TmFtZTogXCJKb2huXCIgfSwgRW50aXR5U3RhdGUuRGV0YWNoZWQpO1xyXG4gIEBwYXJhbSB0eXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBFbnRpdHlUeXBlIGZvciB3aGljaCBhbiBpbnN0YW5jZSBzaG91bGQgYmUgY3JlYXRlZC5cclxuICBAcGFyYW0gZW50aXR5VHlwZSAtIFRoZSBFbnRpdHlUeXBlIG9mIHRoZSB0eXBlIGZvciB3aGljaCBhbiBpbnN0YW5jZSBzaG91bGQgYmUgY3JlYXRlZC5cclxuICBAcGFyYW0gaW5pdGlhbFZhbHVlcyAtIChkZWZhdWx0PW51bGwpIENvbmZpZ3VyYXRpb24gb2JqZWN0IG9mIHRoZSBwcm9wZXJ0aWVzIHRvIHNldCBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGlvbi5cclxuICBAcGFyYW0gZW50aXR5U3RhdGUgLSAoZGVmYXVsdCA9IFtbRW50aXR5U3RhdGUuQWRkZWRdXSkgVGhlIEVudGl0eVN0YXRlIG9mIHRoZSBlbnRpdHkgYWZ0ZXIgYmVpbmcgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhpcyBFbnRpdHlNYW5hZ2VyLlxyXG4gIEBwYXJhbSBtZXJnZVN0cmF0ZWd5IC0gKGRlZmF1bHQgPSBbW01lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZF1dKSAtIEhvdyB0byBoYW5kbGUgY29uZmxpY3RzIGlmIGFuIGVudGl0eSB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoaW4gdGhpcyBFbnRpdHlNYW5hZ2VyLlxyXG4gIEByZXR1cm4ge0VudGl0eX0gQSBuZXcgRW50aXR5IG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gXHJcbiAgKi9cclxuICBjcmVhdGVFbnRpdHkoZW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHN0cmluZywgaW5pdGlhbFZhbHVlczogT2JqZWN0LCBlbnRpdHlTdGF0ZTogRW50aXR5U3RhdGUsIG1lcmdlU3RyYXRlZ3k6IE1lcmdlU3RyYXRlZ3kpIHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eVR5cGUsIFwiZW50aXR5VHlwZVwiKS5pc1N0cmluZygpLm9yKCkuaXNJbnN0YW5jZU9mKEVudGl0eVR5cGUpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdHlTdGF0ZSwgXCJlbnRpdHlTdGF0ZVwiKS5pc0VudW1PZihFbnRpdHlTdGF0ZSkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShtZXJnZVN0cmF0ZWd5LCBcIm1lcmdlU3RyYXRlZ3lcIikuaXNFbnVtT2YoTWVyZ2VTdHJhdGVneSkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcblxyXG4gICAgbGV0IGV0ID0gKHR5cGVvZiBlbnRpdHlUeXBlID09PSBcInN0cmluZ1wiKSA/IHRoaXMubWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUoZW50aXR5VHlwZSkgYXMgRW50aXR5VHlwZSA6IGVudGl0eVR5cGU7XHJcbiAgICBlbnRpdHlTdGF0ZSA9IGVudGl0eVN0YXRlIHx8IEVudGl0eVN0YXRlLkFkZGVkO1xyXG4gICAgbGV0IGVudGl0eSA9IHt9IGFzIEVudGl0eTtcclxuICAgIGNvcmUudXNpbmcodGhpcywgXCJpc0xvYWRpbmdcIiwgdHJ1ZSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICBlbnRpdHkgPSBldC5jcmVhdGVFbnRpdHkoaW5pdGlhbFZhbHVlcyk7XHJcbiAgICB9KTtcclxuICAgIGlmIChlbnRpdHlTdGF0ZSAhPT0gRW50aXR5U3RhdGUuRGV0YWNoZWQpIHtcclxuICAgICAgZW50aXR5ID0gdGhpcy5hdHRhY2hFbnRpdHkoZW50aXR5LCBlbnRpdHlTdGF0ZSwgbWVyZ2VTdHJhdGVneSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50aXR5O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGltcG9ydEVudGl0aWVzKGV4cG9ydGVkU3RyaW5nOiBzdHJpbmcsIGNvbmZpZz86IEltcG9ydENvbmZpZyk6IEVudGl0eU1hbmFnZXI7XHJcbiAgc3RhdGljIGltcG9ydEVudGl0aWVzKGV4cG9ydGVkRGF0YTogT2JqZWN0LCBjb25maWc/OiBJbXBvcnRDb25maWcpOiBFbnRpdHlNYW5hZ2VyO1xyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYSBuZXcgRW50aXR5TWFuYWdlciBhbmQgaW1wb3J0cyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgcmVzdWx0IGludG8gaXQuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgYnVuZGxlID0gZW0xLmV4cG9ydEVudGl0aWVzKCk7XHJcbiAgPiAgICAgIC8vIGNhbiBiZSBzdG9yZWQgdmlhIHRoZSB3ZWIgc3RvcmFnZSBhcGlcclxuICA+ICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibXlFbnRpdHlNYW5hZ2VyXCIsIGJ1bmRsZSk7XHJcbiAgPiAgICAgIC8vIGFzc3VtZSB0aGUgY29kZSBiZWxvdyBvY2N1cnMgaW4gYSBkaWZmZXJlbnQgc2Vzc2lvbi5cclxuICA+ICAgICAgbGV0IGJ1bmRsZUZyb21TdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibXlFbnRpdHlNYW5hZ2VyXCIpO1xyXG4gID4gICAgICAvLyBhbmQgaW1wb3J0ZWRcclxuICA+ICAgICAgbGV0IGVtMiA9IEVudGl0eU1hbmFnZXIuaW1wb3J0RW50aXRpZXMoYnVuZGxlRnJvbVN0b3JhZ2UpO1xyXG4gID4gICAgICAvLyBlbTIgd2lsbCBub3cgaGF2ZSBhIGNvbXBsZXRlIGNvcHkgb2Ygd2hhdCB3YXMgaW4gZW0xXHJcbiAgQHBhcmFtIGV4cG9ydGVkU3RyaW5nIC0gVGhlIHJlc3VsdCBvZiBhIHByZXZpb3VzICdleHBvcnRFbnRpdGllcycgY2FsbCBhcyBhIHN0cmluZ1xyXG4gIEBwYXJhbSBleHBvcnRlZERhdGEgLSBUaGUgcmVzdWx0IG9mIGEgcHJldmlvdXMgJ2V4cG9ydEVudGl0aWVzJyBjYWxsIGFzIGFuIE9iamVjdC5cclxuICBAcGFyYW0gY29uZmlnIC0gQSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICBAcGFyYW0gY29uZmlnLm1lcmdlU3RyYXRlZ3kgLSBBICBbW01lcmdlU3RyYXRlZ3ldXSB0byB1c2Ugd2hlbiBcclxuICBtZXJnaW5nIGludG8gYW4gZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICBAcGFyYW0gY29uZmlnLm1ldGFkYXRhVmVyc2lvbkZuIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIHR3byBhcmd1bWVudHMgKHRoZSBjdXJyZW50IG1ldGFkYXRhVmVyc2lvbiBhbmQgdGhlIGltcG9ydGVkIHN0b3JlJ3MgJ25hbWUnKVxyXG4gIGFuZCBtYXkgYmUgdXNlZCB0byBwZXJmb3JtIHZlcnNpb24gY2hlY2tpbmcuXHJcbiAgQHJldHVybiBBIG5ldyBFbnRpdHlNYW5hZ2VyLiAgTm90ZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QgY2FsbCBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0XHJcbiAgcHJvdmlkZWQgYnkgdGhlIHNhbWUgbmFtZWQgbWV0aG9kIG9uIGFuIEVudGl0eU1hbmFnZXIgaW5zdGFuY2UuIFVzZSB0aGF0IG1ldGhvZCBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXHJcbiAgcmVnYXJkaW5nIHRoZSBpbXBvcnRlZCBlbnRpdGllcy5cclxuICAqKi9cclxuICBzdGF0aWMgaW1wb3J0RW50aXRpZXMoZXhwb3J0ZWQ6IHN0cmluZyB8IE9iamVjdCwgY29uZmlnPzogSW1wb3J0Q29uZmlnKSB7XHJcbiAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcigpO1xyXG4gICAgZW0uaW1wb3J0RW50aXRpZXMoZXhwb3J0ZWQsIGNvbmZpZyk7XHJcbiAgICByZXR1cm4gZW07XHJcbiAgfVxyXG5cclxuICAvLyBpbnN0YW5jZSBtZXRob2RzXHJcblxyXG4gIC8qKlxyXG4gIENhbGxzIFtbRW50aXR5QXNwZWN0LmFjY2VwdENoYW5nZXNdXSBvbiBldmVyeSBjaGFuZ2VkIGVudGl0eSBpbiB0aGlzIEVudGl0eU1hbmFnZXIuXHJcbiAgKiovXHJcbiAgYWNjZXB0Q2hhbmdlcygpIHtcclxuICAgIHRoaXMuZ2V0Q2hhbmdlcygpLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XHJcbiAgICAgIHJldHVybiBlbnRpdHkuZW50aXR5QXNwZWN0Ll9jaGVja09wZXJhdGlvbihcImFjY2VwdENoYW5nZXNcIik7XHJcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChhc3BlY3QpIHtcclxuICAgICAgYXNwZWN0LmFjY2VwdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgRXhwb3J0cyBzZWxlY3RlZCBlbnRpdGllcywgYWxsIGVudGl0aWVzIG9mIHNlbGVjdGVkIHR5cGVzLCBvciBhbiBlbnRpcmUgRW50aXR5TWFuYWdlciBjYWNoZS5cclxuXHJcbiAgVGhpcyBtZXRob2QgdGFrZXMgYSBzbmFwc2hvdCBvZiBhbiBFbnRpdHlNYW5hZ2VyIHRoYXQgY2FuIGJlIHN0b3JlZCBvZmZsaW5lIG9yIGhlbGQgaW4gbWVtb3J5LlxyXG4gIFVzZSB0aGUgW1tFbnRpdHlNYW5hZ2VyLmltcG9ydEVudGl0aWVzXV0gbWV0aG9kIHRvIHJlc3RvcmUgb3IgbWVyZ2UgdGhlIHNuYXBzaG90XHJcbiAgaW50byBhbm90aGVyIEVudGl0eU1hbmFnZXIgYXQgc29tZSBsYXRlciB0aW1lLlxyXG4gID4gICAgICAvLyBsZXQgZW0xIGJlIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAvLyBleHBvcnQgZXZlcnkgZW50aXR5IGluIGVtMS5cclxuICA+ICAgICBsZXQgYnVuZGxlID0gZW0xLmV4cG9ydEVudGl0aWVzKCk7XHJcbiAgPiAgICAgLy8gc2F2ZSB0byB0aGUgYnJvd3NlcidzIGxvY2FsIHN0b3JhZ2VcclxuICA+ICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJteUVudGl0eU1hbmFnZXJcIiwgYnVuZGxlKTtcclxuICA+ICAgICAvLyBsYXRlciByZXRyaWV2ZSB0aGUgZXhwb3J0XHJcbiAgPiAgICAgbGV0IGJ1bmRsZUZyb21TdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibXlFbnRpdHlNYW5hZ2VyXCIpO1xyXG4gID4gICAgIC8vIGltcG9ydCB0aGUgcmV0cmlldmVkIGV4cG9ydCBidW5kbGUgaW50byBhbm90aGVyIG1hbmFnZXJcclxuICA+ICAgICBsZXQgZW0yID0gZW0xLmNyZWF0ZUVtcHR5Q29weSgpO1xyXG4gID4gICAgIGVtMi5pbXBvcnRFbnRpdGllcyhidW5kbGVGcm9tU3RvcmFnZSk7XHJcbiAgPiAgICAgLy8gZW0yIG5vdyBoYXMgYSBjb21wbGV0ZSwgZmFpdGhmdWwgY29weSBvZiB0aGUgZW50aXRpZXMgdGhhdCB3ZXJlIGluIGVtMVxyXG5cclxuICBZb3UgY2FuIGFsc28gY29udHJvbCBleGFjdGx5IHdoaWNoIGVudGl0aWVzIGFyZSBleHBvcnRlZC5cclxuICA+ICAgICAvLyBnZXQgZW0xJ3MgdW5zYXZlZCBjaGFuZ2VzIChhbiBhcnJheSkgYW5kIGV4cG9ydCB0aGVtLlxyXG4gID4gICAgIGxldCBjaGFuZ2VzID0gZW0xLmdldENoYW5nZXMoKTtcclxuICA+ICAgICBsZXQgYnVuZGxlID0gZW0xLmV4cG9ydEVudGl0aWVzKGNoYW5nZXMpO1xyXG4gID4gICAgIC8vIG1lcmdlIHRoZXNlIGVudGl0aWVzIGludG8gZW0yIHdoaWNoIG1heSBjb250YWlucyBzb21lIG9mIHRoZSBzYW1lIGVudGl0aWVzLlxyXG4gID4gICAgIC8vIGRvIE5PVCBvdmVyd3JpdGUgdGhlIGVudGl0aWVzIGluIGVtMiBpZiB0aGV5IHRoZW1zZWx2ZXMgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuXHJcbiAgPiAgICAgZW0yLmltcG9ydEVudGl0aWVzKGJ1bmRsZSwgeyBtZXJnZVN0cmF0ZWd5OiBNZXJnZVN0cmF0ZWd5LlByZXNlcnZlQ2hhbmdlc30gKTtcclxuXHJcbiAgTWV0YWRhdGEgYXJlIGluY2x1ZGVkIGluIGFuIGV4cG9ydCBieSBkZWZhdWx0LiBZb3UgbWF5IHdhbnQgdG8gZXhjbHVkZSB0aGUgbWV0YWRhdGFcclxuICBlc3BlY2lhbGx5IGlmIHlvdSdyZSBleHBvcnRpbmcganVzdCBhIGZldyBlbnRpdGllcyBmb3IgbG9jYWwgc3RvcmFnZS5cclxuICA+ICAgICBsZXQgYnVuZGxlID0gZW0xLmV4cG9ydEVudGl0aWVzKGFycmF5T2ZTZWxlY3RlZEVudGl0aWVzLCB7aW5jbHVkZU1ldGFkYXRhOiBmYWxzZX0pO1xyXG4gID4gICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImdvb2RTdHVmZlwiLCBidW5kbGUpO1xyXG5cclxuICBZb3UgbWF5IHN0aWxsIGV4cHJlc3MgdGhpcyBvcHRpb24gYXMgYSBib29sZWFuIHZhbHVlIGFsdGhvdWdoIHRoaXMgb2xkZXIgc3ludGF4IGlzIGRlcHJlY2F0ZWQuXHJcbiAgPiAgICAgLy8gRXhjbHVkZSB0aGUgbWV0YWRhdGEgKGRlcHJlY2F0ZWQgc3ludGF4KVxyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoYXJyYXlPZlNlbGVjdGVkRW50aXRpZXMsIGZhbHNlKTtcclxuXHJcbiAgWW91IGNhbiBleHBvcnQgYWxsIGVudGl0aWVzIG9mIG9uZSBvciBtb3JlIHNwZWNpZmllZCBFbnRpdHlUeXBlcy5cclxuICA+ICAgICAvLyBFeHBvcnQgYWxsIEN1c3RvbWVyIGFuZCBFbXBsb3llZSBlbnRpdGllcyAoYW5kIGFsc28gZXhjbHVkZSBtZXRhZGF0YSlcclxuICA+ICAgICBsZXQgYnVuZGxlID0gZW0xLmV4cG9ydEVudGl0aWVzKFsnQ3VzdG9tZXInLCAnRW1wbG95ZWUnXSwge2luY2x1ZGVNZXRhZGF0YTogZmFsc2V9KTtcclxuXHJcbiAgQWxsIG9mIHRoZSBhYm92ZSBleGFtcGxlcyByZXR1cm4gYW4gZXhwb3J0IGJ1bmRsZSBhcyBhIHN0cmluZyB3aGljaCBpcyB0aGUgZGVmYXVsdCBmb3JtYXQuXHJcbiAgWW91IGNhbiBleHBvcnQgdGhlIGJ1bmRsZSBhcyBKU09OIGlmIHlvdSBwcmVmZXIgYnkgc2V0dGluZyB0aGUgYGFzU3RyaW5nYCBvcHRpb24gdG8gZmFsc2UuXHJcbiAgPiAgICAgLy8gRXhwb3J0IGFsbCBDdXN0b21lciBhbmQgRW1wbG95ZWUgZW50aXRpZXMgYXMgSlNPTiBhbmQgZXhjbHVkZSB0aGUgbWV0YWRhdGFcclxuICA+ICAgICBsZXQgYnVuZGxlID0gZW0xLmV4cG9ydEVudGl0aWVzKFsnQ3VzdG9tZXInLCAnRW1wbG95ZWUnXSxcclxuICA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthc1N0cmluZzogZmFsc2UsIGluY2x1ZGVNZXRhZGF0YTogZmFsc2V9KTtcclxuICA+ICAgICAvLyBzdG9yZSBKU09OIGJ1bmRsZSBzb21ld2hlcmUgLi4uIHBlcmhhcHMgaW5kZXhEYiAuLi4gYW5kIGxhdGVyIGltcG9ydCBhcyB3ZSBkbyBoZXJlLlxyXG4gID4gICAgIGVtMi5pbXBvcnRFbnRpdGllcyhidW5kbGUpO1xyXG4gIEBwYXJhbSBlbnRpdGllcyAtIFRoZSBlbnRpdGllcyB0byBleHBvcnQgb3IgdGhlIEVudGl0eVR5cGUocykgb2YgdGhlIGVudGl0aWVzIHRvIGV4cG9ydDtcclxuICAgIGFsbCBlbnRpdGllcyBhcmUgZXhwb3J0ZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCBvciBudWxsLlxyXG4gIEBwYXJhbSBleHBvcnRDb25maWcgLSBFeHBvcnQgY29uZmlndXJhdGlvbiBvcHRpb25zIG9yIGEgYm9vbGVhblxyXG4gICAgLSBhc1N0cmluZyAtIChib29sZWFuKSAtIElmIHRydWUgKGRlZmF1bHQpLCByZXR1cm4gZXhwb3J0IGJ1bmRsZSBhcyBhIHN0cmluZy5cclxuICAgIC0gaW5jbHVkZU1ldGFkYXRhIC0gKGJvb2xlYW4pIC0gSWYgdHJ1ZSAoZGVmYXVsdCksIGluY2x1ZGUgbWV0YWRhdGEgaW4gdGhlIGV4cG9ydCBidW5kbGUuXHJcbiAgQHJldHVybiBUaGUgZXhwb3J0IGJ1bmRsZSBlaXRoZXIgc2VyaWFsaXplZCBhcyBhIHN0cmluZyAoZGVmYXVsdCkgb3IgYXMgYSBKU09OIG9iamVjdC5cclxuICBUaGUgYnVuZGxlIGNvbnRhaW5zIHRoZSBtZXRhZGF0YSAodW5sZXNzIGV4Y2x1ZGVkKSBhbmQgdGhlIGVudGl0eSBkYXRhIGdyb3VwZWQgYnkgdHlwZS5cclxuICBUaGUgZW50aXR5IGRhdGEgaW5jbHVkZSBwcm9wZXJ0eSB2YWx1ZXMsIGNoYW5nZS1zdGF0ZSwgYW5kIHRlbXBvcmFyeSBrZXkgbWFwcGluZ3MgKGlmIGFueSkuXHJcblxyXG4gIFRoZSBleHBvcnQgYnVuZGxlIGludGVybmFscyBhcmUgZGVsaWJlcmF0ZWx5IHVuZG9jdW1lbnRlZC4gIFRoaXMgQnJlZXplLWludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGVudGl0eSBkYXRhIGlzXHJcbiAgc3VpdGFibGUgZm9yIGV4cG9ydCwgc3RvcmFnZSwgYW5kIGltcG9ydC4gVGhlIHNjaGVtYSBhbmQgY29udGVudHMgb2YgdGhlIGJ1bmRsZSBtYXkgY2hhbmdlIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBCcmVlemUuXHJcbiAgTWFuaXB1bGF0ZSBpdCBhdCB5b3VyIG93biByaXNrIHdpdGggYXBwcm9wcmlhdGUgY2F1dGlvbi5cclxuICAqKi9cclxuICBleHBvcnRFbnRpdGllcyhlbnRpdGllcz86IEVudGl0eVtdIHwgRW50aXR5VHlwZVtdIHwgc3RyaW5nW10sIGV4cG9ydENvbmZpZz86IHsgYXNTdHJpbmc/OiBib29sZWFuLCBpbmNsdWRlTWV0YWRhdGE/OiBib29sZWFuIH0gfCBib29sZWFuKTogc3RyaW5nIHwgT2JqZWN0IHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0aWVzLCBcImVudGl0aWVzXCIpLmlzQXJyYXkoKS5pc0VudGl0eSgpXHJcbiAgICAgIC5vcigpLmlzTm9uRW1wdHlBcnJheSgpLmlzSW5zdGFuY2VPZihFbnRpdHlUeXBlKVxyXG4gICAgICAub3IoKS5pc05vbkVtcHR5QXJyYXkoKS5pc1N0cmluZygpXHJcbiAgICAgIC5vcigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG5cclxuICAgIC8vIGFzc2VydFBhcmFtKGV4cG9ydENvbmZpZywgXCJleHBvcnRDb25maWdcIikuaXNPYmplY3QoKVxyXG4gICAgLy8gICAub3IoKS5pc0Jvb2xlYW4oKVxyXG4gICAgLy8gICAub3IoKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuXHJcbiAgICBpZiAoZXhwb3J0Q29uZmlnID09IG51bGwpIHtcclxuICAgICAgZXhwb3J0Q29uZmlnID0geyBpbmNsdWRlTWV0YWRhdGE6IHRydWUsIGFzU3RyaW5nOiB0cnVlIH07XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRDb25maWcgPT09ICdib29sZWFuJykgeyAvLyBkZXByZWNhdGVkXHJcbiAgICAgIGV4cG9ydENvbmZpZyA9IHsgaW5jbHVkZU1ldGFkYXRhOiBleHBvcnRDb25maWcsIGFzU3RyaW5nOiB0cnVlIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXNzZXJ0Q29uZmlnKGV4cG9ydENvbmZpZylcclxuICAgICAgLndoZXJlUGFyYW0oXCJhc1N0cmluZ1wiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQodHJ1ZSlcclxuICAgICAgLndoZXJlUGFyYW0oXCJpbmNsdWRlTWV0YWRhdGFcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLndpdGhEZWZhdWx0KHRydWUpXHJcbiAgICAgIC5hcHBseUFsbChleHBvcnRDb25maWcpO1xyXG5cclxuICAgIGxldCBleHBvcnRCdW5kbGUgPSBleHBvcnRFbnRpdHlHcm91cHModGhpcywgZW50aXRpZXMpO1xyXG4gICAgbGV0IGpzb24gPSBjb3JlLmV4dGVuZCh7fSwgZXhwb3J0QnVuZGxlLCBbXCJ0ZW1wS2V5c1wiLCBcImVudGl0eUdyb3VwTWFwXCJdKTtcclxuXHJcbiAgICBpZiAoZXhwb3J0Q29uZmlnLmluY2x1ZGVNZXRhZGF0YSkge1xyXG4gICAgICBqc29uID0gY29yZS5leHRlbmQoanNvbiwgdGhpcywgW1wiZGF0YVNlcnZpY2VcIiwgXCJzYXZlT3B0aW9uc1wiLCBcInF1ZXJ5T3B0aW9uc1wiLCBcInZhbGlkYXRpb25PcHRpb25zXCJdKTtcclxuICAgICAgKGpzb24gYXMgYW55KS5tZXRhZGF0YVN0b3JlID0gdGhpcy5tZXRhZGF0YVN0b3JlLmV4cG9ydE1ldGFkYXRhKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAoanNvbiBhcyBhbnkpLm1ldGFkYXRhVmVyc2lvbiA9IE1ldGFkYXRhU3RvcmUubWV0YWRhdGFWZXJzaW9uO1xyXG4gICAgICAoanNvbiBhcyBhbnkpLm1ldGFkYXRhU3RvcmVOYW1lID0gdGhpcy5tZXRhZGF0YVN0b3JlLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3VsdCA9IGV4cG9ydENvbmZpZy5hc1N0cmluZyA/IEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIGNvbmZpZy5zdHJpbmdpZnlQYWQpIDoganNvbjtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiB0eXBlIHRoZSByZXR1cm4gdmFsdWUgeyBlbnRpdGllczogZW50aXRpZXNUb0xpbmssIHRlbXBLZXlNYXBwaW5nOiB0ZW1wS2V5TWFwIH1cclxuICBpbXBvcnRFbnRpdGllcyhleHBvcnRlZFN0cmluZzogc3RyaW5nLCBjb25maWc/OiBJbXBvcnRDb25maWcpOiBJbXBvcnRSZXN1bHQ7XHJcbiAgaW1wb3J0RW50aXRpZXMoZXhwb3J0ZWREYXRhOiBPYmplY3QsIGNvbmZpZz86IEltcG9ydENvbmZpZyk6IEltcG9ydFJlc3VsdDtcclxuICAvKipcclxuICBJbXBvcnRzIGEgcHJldmlvdXNseSBleHBvcnRlZCByZXN1bHQgaW50byB0aGlzIEVudGl0eU1hbmFnZXIuXHJcblxyXG4gIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBjb21wbGV0ZSBjb3B5IG9mIGFueSBwcmV2aW91c2x5IGNyZWF0ZWQgZW50aXR5TWFuYWdlciwgZXZlbiBpZiBjcmVhdGVkXHJcbiAgaW4gYSBwcmV2aW91cyBzZXNzaW9uIGFuZCBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLiBUaGUgc3RhdGljIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgcGVyZm9ybXMgYVxyXG4gIHZlcnkgc2ltaWxhciBwcm9jZXNzLlxyXG4gID4gICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgIGxldCBidW5kbGUgPSBlbTEuZXhwb3J0RW50aXRpZXMoKTtcclxuICA+ICAgICAvLyBidW5kbGUgY2FuIGJlIHN0b3JlZCBpbiB3aW5kb3cubG9jYWxTdG9yYWdlIG9yIGp1c3QgaGVsZCBpbiBtZW1vcnkuXHJcbiAgPiAgICAgbGV0IGVtMiA9IG5ldyBFbnRpdHlNYW5hZ2VyKHtcclxuICA+ICAgICAgICAgc2VydmljZU5hbWU6IGVtMS5zZXJ2aWNlTmFtZSxcclxuICA+ICAgICAgICAgbWV0YWRhdGFTdG9yZTogZW0xLm1ldGFkYXRhU3RvcmVcclxuICA+ICAgICB9KTtcclxuICA+ICAgICBlbTIuaW1wb3J0RW50aXRpZXMoYnVuZGxlKTtcclxuICA+ICAgICAvLyBlbTIgd2lsbCBub3cgaGF2ZSBhIGNvbXBsZXRlIGNvcHkgb2Ygd2hhdCB3YXMgaW4gZW0xXHJcblxyXG4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gbWVyZ2UgdGhlIGNvbnRlbnRzIG9mIGEgcHJldmlvdXNseSBjcmVhdGVkIEVudGl0eU1hbmFnZXIgd2l0aCBhblxyXG4gIGV4aXN0aW5nIEVudGl0eU1hbmFnZXIgd2l0aCBjb250cm9sIG92ZXIgaG93IHRoZSB0d28gYXJlIG1lcmdlZC5cclxuICA+ICAgICBsZXQgYnVuZGxlID0gZW0xLmV4cG9ydEVudGl0aWVzKCk7XHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMiBpcyBhbm90aGVyIGVudGl0eU1hbmFnZXIgY29udGFpbmluZyBzb21lIG9mIHRoZSBzYW1lIGVudGl0aWVzIHBvc3NpYmx5IHdpdGggbW9kaWZpY2F0aW9ucy5cclxuICA+ICAgICBlbTIuaW1wb3J0RW50aXRpZXMoYnVuZGxlLCB7IG1lcmdlU3RyYXRlZ3k6IE1lcmdlU3RyYXRlZ3kuUHJlc2VydmVDaGFuZ2VzfSApO1xyXG4gID4gICAgIC8vIGVtMiB3aWxsIG5vdyBjb250YWluIGFsbCBvZiB0aGUgZW50aXRpZXMgZnJvbSBib3RoIGVtMSBhbmQgZW0yLiAgQW55IGVtMiBlbnRpdGllcyB3aXRoIHByZXZpb3VzbHlcclxuICA+ICAgICAvLyBtYWRlIG1vZGlmaWNhdGlvbnMgd2lsbCBub3QgaGF2ZSBiZWVuIHRvdWNoZWQsIGJ1dCBhbGwgb3RoZXIgZW50aXRpZXMgZnJvbSBlbTEgd2lsbCBoYXZlIGJlZW4gaW1wb3J0ZWQuXHJcbiAgQHBhcmFtIGV4cG9ydGVkU3RyaW5nIC0gVGhlIHJlc3VsdCBvZiBhIHByZXZpb3VzICdleHBvcnQnIGNhbGwuXHJcbiAgQHBhcmFtIGltcG9ydENvbmZpZyAtIEEgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgQHBhcmFtIGltcG9ydENvbmZpZy5tZXJnZVN0cmF0ZWd5IC0gIEEgW1tNZXJnZVN0cmF0ZWd5XV0gdG8gdXNlIHdoZW5cclxuICBtZXJnaW5nIGludG8gYW4gZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICBAcGFyYW0gaW1wb3J0Q29uZmlnLm1ldGFkYXRhVmVyc2lvbkZuIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIHR3byBhcmd1bWVudHMgKHRoZSBjdXJyZW50IG1ldGFkYXRhVmVyc2lvbiBhbmQgdGhlIGltcG9ydGVkIHN0b3JlJ3MgJ25hbWUnKVxyXG4gIGFuZCBtYXkgYmUgdXNlZCB0byBwZXJmb3JtIHZlcnNpb24gY2hlY2tpbmcuXHJcbiAgQHJldHVybiByZXN1bHQgXHJcbiAgICAtIHJlc3VsdC5lbnRpdGllcyB7QXJyYXkgb2YgRW50aXRpZXN9IFRoZSBlbnRpdGllcyB0aGF0IHdlcmUgaW1wb3J0ZWQuXHJcbiAgICAtIHJlc3VsdC50ZW1wS2V5TWFwIHtPYmplY3R9IE1hcHBpbmcgZnJvbSBvcmlnaW5hbCBFbnRpdHlLZXkgaW4gdGhlIGltcG9ydCBidW5kbGUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgRW50aXR5S2V5IGluIHRoaXMgRW50aXR5TWFuYWdlci5cclxuICAqKi9cclxuICBpbXBvcnRFbnRpdGllcyhleHBvcnRlZDogc3RyaW5nIHwgT2JqZWN0LCBpbXBvcnRDb25maWc/OiBJbXBvcnRDb25maWcpIHtcclxuICAgIGltcG9ydENvbmZpZyA9IGltcG9ydENvbmZpZyB8fCB7fTtcclxuICAgIGFzc2VydENvbmZpZyhpbXBvcnRDb25maWcpXHJcbiAgICAgIC53aGVyZVBhcmFtKFwibWVyZ2VTdHJhdGVneVwiKS5pc0VudW1PZihNZXJnZVN0cmF0ZWd5KS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQodGhpcy5xdWVyeU9wdGlvbnMubWVyZ2VTdHJhdGVneSlcclxuICAgICAgLndoZXJlUGFyYW0oXCJtZXRhZGF0YVZlcnNpb25GblwiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgIC53aGVyZVBhcmFtKFwibWVyZ2VBZGRzXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAuYXBwbHlBbGwoaW1wb3J0Q29uZmlnKTtcclxuXHJcbiAgICBsZXQganNvbiA9ICh0eXBlb2YgZXhwb3J0ZWQgPT09IFwic3RyaW5nXCIpID8gSlNPTi5wYXJzZShleHBvcnRlZCkgOiBleHBvcnRlZDtcclxuICAgIGlmIChqc29uLm1ldGFkYXRhU3RvcmUpIHtcclxuICAgICAgdGhpcy5tZXRhZGF0YVN0b3JlLmltcG9ydE1ldGFkYXRhKGpzb24ubWV0YWRhdGFTdG9yZSk7XHJcbiAgICAgIC8vIHRoZSB8fCBjbGF1c2UgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXQgd2l0aCBhbiBlYXJsaWVyIHNlcmlhbGl6YXRpb24gZm9ybWF0LlxyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlID0gKGpzb24uZGF0YVNlcnZpY2UgJiYgRGF0YVNlcnZpY2UuZnJvbUpTT04oanNvbi5kYXRhU2VydmljZSkpIHx8IG5ldyBEYXRhU2VydmljZSh7IHNlcnZpY2VOYW1lOiBqc29uLnNlcnZpY2VOYW1lIH0pO1xyXG5cclxuICAgICAgdGhpcy5zYXZlT3B0aW9ucyA9IG5ldyBTYXZlT3B0aW9ucyhqc29uLnNhdmVPcHRpb25zKTtcclxuICAgICAgdGhpcy5xdWVyeU9wdGlvbnMgPSBRdWVyeU9wdGlvbnMuZnJvbUpTT04oanNvbi5xdWVyeU9wdGlvbnMpO1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25PcHRpb25zID0gbmV3IFZhbGlkYXRpb25PcHRpb25zKGpzb24udmFsaWRhdGlvbk9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW1wb3J0Q29uZmlnLm1ldGFkYXRhVmVyc2lvbkZuICYmIGltcG9ydENvbmZpZy5tZXRhZGF0YVZlcnNpb25Gbih7XHJcbiAgICAgICAgbWV0YWRhdGFWZXJzaW9uOiBqc29uLm1ldGFkYXRhVmVyc2lvbixcclxuICAgICAgICBtZXRhZGF0YVN0b3JlTmFtZToganNvbi5tZXRhZGF0YVN0b3JlTmFtZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGVtcEtleU1hcDogSVRlbXBLZXlNYXAgPSB7fTtcclxuICAgIGpzb24udGVtcEtleXMuZm9yRWFjaCgoazogYW55KSA9PiB7XHJcbiAgICAgIGxldCBvbGRLZXkgPSBFbnRpdHlLZXkuZnJvbUpTT04oaywgdGhpcy5tZXRhZGF0YVN0b3JlKTtcclxuICAgICAgLy8gdHJ5IHRvIHVzZSBvbGRLZXkgaWYgbm90IGFscmVhZHkgdXNlZCBpbiB0aGlzIGtleUdlbmVyYXRvci5cclxuICAgICAgdGVtcEtleU1hcFtvbGRLZXkudG9TdHJpbmcoKV0gPSBuZXcgRW50aXR5S2V5KG9sZEtleS5lbnRpdHlUeXBlLCB0aGlzLmtleUdlbmVyYXRvci5nZW5lcmF0ZVRlbXBLZXlWYWx1ZShvbGRLZXkuZW50aXR5VHlwZSwgb2xkS2V5LnZhbHVlc1swXSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IGVudGl0aWVzVG9MaW5rOiBFbnRpdHlbXSA9IFtdO1xyXG4gICAgbGV0IGltcENvbmZpZyA9IGltcG9ydENvbmZpZyBhcyBJbXBvcnRDb25maWdFeHQ7XHJcblxyXG4gICAgaW1wQ29uZmlnLnRlbXBLZXlNYXAgPSB0ZW1wS2V5TWFwO1xyXG4gICAgY29yZS53cmFwRXhlY3V0aW9uKCgpID0+IHtcclxuICAgICAgdGhpcy5fcGVuZGluZ1B1YnMgPSBbXTtcclxuICAgIH0sIChzdGF0ZSkgPT4ge1xyXG4gICAgICB0aGlzLl9wZW5kaW5nUHVicyEuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xyXG4gICAgICB0aGlzLl9wZW5kaW5nUHVicyA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5faGFzQ2hhbmdlc0FjdGlvbiAmJiB0aGlzLl9oYXNDaGFuZ2VzQWN0aW9uKCk7XHJcbiAgICB9LCAoKSA9PiB7XHJcbiAgICAgIGNvcmUub2JqZWN0Rm9yRWFjaChqc29uLmVudGl0eUdyb3VwTWFwLCAoZW50aXR5VHlwZU5hbWUsIGpzb25Hcm91cCkgPT4ge1xyXG4gICAgICAgIGxldCBlbnRpdHlUeXBlID0gdGhpcy5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShlbnRpdHlUeXBlTmFtZSwgZmFsc2UpIGFzIEVudGl0eVR5cGU7XHJcbiAgICAgICAgbGV0IHRhcmdldEVudGl0eUdyb3VwID0gZmluZE9yQ3JlYXRlRW50aXR5R3JvdXAodGhpcywgZW50aXR5VHlwZSk7XHJcbiAgICAgICAgbGV0IGVudGl0aWVzID0gaW1wb3J0RW50aXR5R3JvdXAodGFyZ2V0RW50aXR5R3JvdXAsIGpzb25Hcm91cCwgaW1wQ29uZmlnKTtcclxuICAgICAgICBpZiAoZW50aXRpZXMgJiYgZW50aXRpZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBlbnRpdGllc1RvTGluayA9IGVudGl0aWVzVG9MaW5rLmNvbmNhdChlbnRpdGllcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgZW50aXRpZXNUb0xpbmsuZm9yRWFjaCgoZW50aXR5KSA9PiB7XHJcbiAgICAgICAgaWYgKCFlbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSB7XHJcbiAgICAgICAgICB0aGlzLl9saW5rUmVsYXRlZEVudGl0aWVzKGVudGl0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZW50aXRpZXM6IGVudGl0aWVzVG9MaW5rLFxyXG4gICAgICB0ZW1wS2V5TWFwcGluZzogdGVtcEtleU1hcFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIENsZWFycyB0aGlzIEVudGl0eU1hbmFnZXIncyBjYWNoZSBidXQga2VlcHMgYWxsIG90aGVyIHNldHRpbmdzLiBOb3RlIHRoYXQgdGhpc1xyXG4gIG1ldGhvZCBpcyBub3QgYXMgZmFzdCBhcyBjcmVhdGluZyBhIG5ldyBFbnRpdHlNYW5hZ2VyIHZpYSAnbmV3IEVudGl0eU1hbmFnZXInLlxyXG4gIFRoaXMgaXMgYmVjYXVzZSBjbGVhciBhY3R1YWxseSBkZXRhY2hlcyBhbGwgb2YgdGhlIGVudGl0aWVzIGZyb20gdGhlIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgZW0xLmNsZWFyKCk7XHJcbiAgPiAgICAgLy8gZW0xIGlzIHdpbGwgbm93IGNvbnRhaW4gbm8gZW50aXRpZXMsIGJ1dCBhbGwgb3RoZXIgc2V0dGluZyB3aWxsIGJlIG1haW50YWluZWQuXHJcbiAgKiovXHJcbiAgY2xlYXIoKSB7XHJcbiAgICBjb3JlLm9iamVjdE1hcCh0aGlzLl9lbnRpdHlHcm91cE1hcCwgZnVuY3Rpb24gKGtleTogc3RyaW5nLCBlbnRpdHlHcm91cDogRW50aXR5R3JvdXApIHtcclxuICAgICAgcmV0dXJuIGVudGl0eUdyb3VwLl9jaGVja09wZXJhdGlvbignY2xlYXInKTtcclxuICAgIH0pLmZvckVhY2goKGVudGl0eUdyb3VwOiBFbnRpdHlHcm91cCkgPT4ge1xyXG4gICAgICBlbnRpdHlHcm91cC5fY2xlYXIoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX2VudGl0eUdyb3VwTWFwID0ge307XHJcbiAgICB0aGlzLl91bmF0dGFjaGVkQ2hpbGRyZW5NYXAgPSBuZXcgVW5hdHRhY2hlZENoaWxkcmVuTWFwKCk7XHJcbiAgICB0aGlzLmtleUdlbmVyYXRvciA9IG5ldyB0aGlzLmtleUdlbmVyYXRvckN0b3IoKTtcclxuICAgIHRoaXMuZW50aXR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5QWN0aW9uOiBFbnRpdHlBY3Rpb24uQ2xlYXIgfSk7XHJcbiAgICB0aGlzLl9zZXRIYXNDaGFuZ2VzKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYW4gZW1wdHkgY29weSBvZiB0aGlzIEVudGl0eU1hbmFnZXIgYnV0IHdpdGggdGhlIHNhbWUgRGF0YVNlcnZpY2UsIE1ldGFkYXRhU3RvcmUsIFF1ZXJ5T3B0aW9ucywgU2F2ZU9wdGlvbnMsIFZhbGlkYXRpb25PcHRpb25zLCBldGMuIFxyXG4gID4gICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgIGxldCBlbTIgPSBlbTEuY3JlYXRlRW1wdHlDb3B5KCk7XHJcbiAgPiAgICAgLy8gZW0yIGlzIGEgbmV3IEVudGl0eU1hbmFnZXIgd2l0aCBhbGwgb2YgZW0xJ3Mgc2V0dGluZ3NcclxuICA+ICAgICAvLyBidXQgbm8gZW50aXRpZXMuXHJcbiAgQHJldHVybiBBIG5ldyBFbnRpdHlNYW5hZ2VyLlxyXG4gICoqL1xyXG4gIGNyZWF0ZUVtcHR5Q29weSgpIHtcclxuICAgIGxldCBjb3B5ID0gbmV3IEVudGl0eU1hbmFnZXIoY29yZS5leHRlbmQoe30sIHRoaXMsXHJcbiAgICAgIFtcImRhdGFTZXJ2aWNlXCIsIFwibWV0YWRhdGFTdG9yZVwiLCBcInF1ZXJ5T3B0aW9uc1wiLCBcInNhdmVPcHRpb25zXCIsIFwidmFsaWRhdGlvbk9wdGlvbnNcIiwgXCJrZXlHZW5lcmF0b3JDdG9yXCJdKSk7XHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEF0dGFjaGVzIGFuIGVudGl0eSB0byB0aGlzIEVudGl0eU1hbmFnZXIgd2l0aCBhbiAgW1tFbnRpdHlTdGF0ZV1dIG9mICdBZGRlZCcuXHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgIGxldCBjdXN0MSA9IGN1c3RUeXBlLmNyZWF0ZUVudGl0eSgpO1xyXG4gID4gICAgIGVtMS5hZGRFbnRpdHkoY3VzdDEpO1xyXG5cclxuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcyB1c2luZyAnYXR0YWNoRW50aXR5JyB3aXRoIGFuIFtbRW50aXR5U3RhdGVdXSBvZiAnQWRkZWQnLlxyXG5cclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICBsZXQgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgPiAgICAgbGV0IGN1c3QxID0gY3VzdFR5cGUuY3JlYXRlRW50aXR5KCk7XHJcbiAgPiAgICAgZW0xLmF0dGFjaEVudGl0eShjdXN0MSwgRW50aXR5U3RhdGUuQWRkZWQpO1xyXG4gIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGFkZC5cclxuICBAcmV0dXJuIFRoZSBhZGRlZCBlbnRpdHkuXHJcbiAgKiovXHJcbiAgYWRkRW50aXR5KGVudGl0eTogRW50aXR5KSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRhY2hFbnRpdHkoZW50aXR5LCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBBdHRhY2hlcyBhbiBlbnRpdHkgdG8gdGhpcyBFbnRpdHlNYW5hZ2VyIHdpdGggYSBzcGVjaWZpZWQgW1tFbnRpdHlTdGF0ZV1dLlxyXG4gID4gICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgIGxldCBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICA+ICAgICBsZXQgY3VzdDEgPSBjdXN0VHlwZS5jcmVhdGVFbnRpdHkoKTtcclxuICA+ICAgICBlbTEuYXR0YWNoRW50aXR5KGN1c3QxLCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gYWRkLlxyXG4gIEBwYXJhbSBlbnRpdHlTdGF0ZSAtIChkZWZhdWx0PUVudGl0eVN0YXRlLlVuY2hhbmdlZCkgVGhlIEVudGl0eVN0YXRlIG9mIHRoZSBuZXdseSBhdHRhY2hlZCBlbnRpdHkuIElmIG9taXR0ZWQgdGhpcyBkZWZhdWx0cyB0byBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQuXHJcbiAgQHBhcmFtIG1lcmdlU3RyYXRlZ3kgLSAoZGVmYXVsdCA9IE1lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZCkgSG93IHRoZSBzcGVjaWZpZWQgZW50aXR5IHNob3VsZCBiZSBtZXJnZWQgaW50byB0aGUgRW50aXR5TWFuYWdlciBpZiB0aGlzIEVudGl0eU1hbmFnZXIgYWxyZWFkeSBjb250YWlucyBhbiBlbnRpdHkgd2l0aCB0aGUgc2FtZSBrZXkuXHJcbiAgQHJldHVybiBUaGUgYXR0YWNoZWQgZW50aXR5LlxyXG4gICoqL1xyXG4gIGF0dGFjaEVudGl0eShlbnRpdHk6IEVudGl0eSwgZW50aXR5U3RhdGU/OiBFbnRpdHlTdGF0ZSwgbWVyZ2VTdHJhdGVneT86IE1lcmdlU3RyYXRlZ3kpIHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eSwgXCJlbnRpdHlcIikuaXNSZXF1aXJlZCgpLmNoZWNrKCk7XHJcbiAgICB0aGlzLm1ldGFkYXRhU3RvcmUuX2NoZWNrRW50aXR5VHlwZShlbnRpdHkpO1xyXG4gICAgbGV0IGVzU3ltYm9sID0gYXNzZXJ0UGFyYW0oZW50aXR5U3RhdGUsIFwiZW50aXR5U3RhdGVcIikuaXNFbnVtT2YoRW50aXR5U3RhdGUpLmlzT3B0aW9uYWwoKS5jaGVjayhFbnRpdHlTdGF0ZS5VbmNoYW5nZWQpIGFzIEVudGl0eVN0YXRlO1xyXG4gICAgbGV0IG1zU3ltYm9sID0gYXNzZXJ0UGFyYW0obWVyZ2VTdHJhdGVneSwgXCJtZXJnZVN0cmF0ZWd5XCIpLmlzRW51bU9mKE1lcmdlU3RyYXRlZ3kpLmlzT3B0aW9uYWwoKS5jaGVjayhNZXJnZVN0cmF0ZWd5LkRpc2FsbG93ZWQpIGFzIE1lcmdlU3RyYXRlZ3k7XHJcblxyXG4gICAgaWYgKGVudGl0eS5lbnRpdHlUeXBlLm1ldGFkYXRhU3RvcmUgIT09IHRoaXMubWV0YWRhdGFTdG9yZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYXR0YWNoIHRoaXMgZW50aXR5IGJlY2F1c2UgdGhlIEVudGl0eVR5cGUgKFwiICsgZW50aXR5LmVudGl0eVR5cGUubmFtZSArXHJcbiAgICAgICAgXCIpIGFuZCBNZXRhZGF0YVN0b3JlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudGl0eSBkb2VzIG5vdCBtYXRjaCB0aGlzIEVudGl0eU1hbmFnZXIncyBNZXRhZGF0YVN0b3JlLlwiKTtcclxuICAgIH1cclxuICAgIGxldCBhc3BlY3QgPSBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gICAgaWYgKGFzcGVjdCkge1xyXG4gICAgICAvLyB0byBhdm9pZCByZWF0dGFjaGluZyBhbiBlbnRpdHkgaW4gcHJvZ3Jlc3NcclxuICAgICAgaWYgKGFzcGVjdC5faW5Qcm9jZXNzRW50aXR5KSByZXR1cm4gYXNwZWN0Ll9pblByb2Nlc3NFbnRpdHk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB0aGlzIG9jY3VyJ3Mgd2hlbiBhdHRhY2hpbmcgYW4gZW50aXR5IGNyZWF0ZWQgdmlhIG5ldyBpbnN0ZWFkIG9mIHZpYSBjcmVhdGVFbnRpdHkuXHJcbiAgICAgIGFzcGVjdCA9IG5ldyBFbnRpdHlBc3BlY3QoZW50aXR5KTtcclxuICAgIH1cclxuICAgIGxldCBtYW5hZ2VyID0gYXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgICBpZiAobWFuYWdlcikge1xyXG4gICAgICBpZiAobWFuYWdlciA9PT0gdGhpcykge1xyXG4gICAgICAgIHJldHVybiBlbnRpdHk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBlbnRpdHkgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgRW50aXR5TWFuYWdlclwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBhdHRhY2hlZEVudGl0eSA9IHt9IGFzIEVudGl0eTtcclxuICAgIGNvcmUudXNpbmcodGhpcywgXCJpc0xvYWRpbmdcIiwgdHJ1ZSwgKCkgPT4ge1xyXG4gICAgICBpZiAoZXNTeW1ib2wuaXNBZGRlZCgpKSB7XHJcbiAgICAgICAgY2hlY2tFbnRpdHlLZXkodGhpcywgZW50aXR5KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBhdHRhY2hlZEVudGl0eSA9PT0gZW50aXR5IEVYQ0VQVCBpbiB0aGUgY2FzZSBvZiBhIG1lcmdlLlxyXG4gICAgICBhdHRhY2hlZEVudGl0eSA9IHRoaXMuX2F0dGFjaEVudGl0eUNvcmUoZW50aXR5LCBlc1N5bWJvbCwgbXNTeW1ib2wpO1xyXG4gICAgICBhc3BlY3QuX2luUHJvY2Vzc0VudGl0eSA9IGF0dGFjaGVkRW50aXR5O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIGVudGl0eSAoIG5vdCBhdHRhY2hlZEVudGl0eSkgaXMgZGVsaWJlcmF0ZSBoZXJlLlxyXG4gICAgICAgIGF0dGFjaFJlbGF0ZWRFbnRpdGllcyh0aGlzLCBlbnRpdHksIGVzU3ltYm9sLCBtc1N5bWJvbCk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgLy8gaW5zdXJlIHRoYXQgX2luUHJvY2Vzc0VudGl0eSBpcyBjbGVhcmVkLlxyXG4gICAgICAgIGFzcGVjdC5faW5Qcm9jZXNzRW50aXR5ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25PcHRpb25zLnZhbGlkYXRlT25BdHRhY2gpIHtcclxuICAgICAgYXR0YWNoZWRFbnRpdHkuZW50aXR5QXNwZWN0LnZhbGlkYXRlRW50aXR5KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWVzU3ltYm9sLmlzVW5jaGFuZ2VkKCkpIHtcclxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoYXR0YWNoZWRFbnRpdHksIHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5BdHRhY2gsIGVudGl0eTogYXR0YWNoZWRFbnRpdHkgfSk7XHJcblxyXG4gICAgcmV0dXJuIGF0dGFjaGVkRW50aXR5O1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gIERldGFjaGVzIGFuIGVudGl0eSBmcm9tIHRoaXMgRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAvLyBhc3N1bWUgY3VzdDEgaXMgYSBjdXN0b21lciBFbnRpdHkgcHJldmlvdXNseSBhdHRhY2hlZCB0byBlbTFcclxuICA+ICAgICBlbTEuZGV0YWNoRW50aXR5KGN1c3QxKTtcclxuICA+ICAgICAvLyBlbTEgd2lsbCBub3cgbm8gbG9uZ2VyIGNvbnRhaW4gY3VzdDEgYW5kIGN1c3QxIHdpbGwgaGF2ZSBhblxyXG4gID4gICAgIC8vIGVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZSBvZiBFbnRpdHlTdGF0ZS5EZXRhY2hlZFxyXG4gIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGRldGFjaC5cclxuICBAcmV0dXJuIFdoZXRoZXIgdGhlIGVudGl0eSBjb3VsZCBiZSBkZXRhY2hlZC4gVGhpcyB3aWxsIHJldHVybiBmYWxzZSBpZiB0aGUgZW50aXR5IGlzIGFscmVhZHkgZGV0YWNoZWQgb3Igd2FzIG5ldmVyIGF0dGFjaGVkLlxyXG4gICoqL1xyXG4gIGRldGFjaEVudGl0eShlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5LCBcImVudGl0eVwiKS5pc0VudGl0eSgpLmNoZWNrKCk7XHJcbiAgICBsZXQgYXNwZWN0ID0gZW50aXR5LmVudGl0eUFzcGVjdDtcclxuICAgIGlmICghYXNwZWN0KSB7XHJcbiAgICAgIC8vIG5vIGFzcGVjdCBtZWFucyBpbiBjb3VsZG4ndCBhcHBlYXIgaW4gYW55IGdyb3VwXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYXNwZWN0LmVudGl0eU1hbmFnZXIgIT09IHRoaXMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBlbnRpdHkgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgRW50aXR5TWFuYWdlci5cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXNwZWN0LnNldERldGFjaGVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBGZXRjaGVzIHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEVudGl0eU1hbmFnZXIncyBjdXJyZW50ICdzZXJ2aWNlTmFtZScuICBUaGlzIGNhbGxcclxuICBvY2N1cnMgaW50ZXJuYWxseSBiZWZvcmUgdGhlIGZpcnN0IHF1ZXJ5IHRvIGFueSBzZXJ2aWNlIGlmIHRoZSBtZXRhZGF0YSBoYXNuJ3QgYWxyZWFkeSBiZWVuXHJcbiAgbG9hZGVkLiBfX0FzeW5jX19cclxuXHJcbiAgVXN1YWxseSB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgcHJvY2VzcyB0aGUgcmVzdWx0cyBvZiBhIGZldGNoTWV0YWRhdGEgY2FsbCBkaXJlY3RseSwgYnV0IHdpbGwgaW5zdGVhZFxyXG4gIGFzayBmb3IgdGhlIG1ldGFkYXRhIGZyb20gdGhlIEVudGl0eU1hbmFnZXIgYWZ0ZXIgdGhlIGZldGNoTWV0YWRhdGEgY2FsbCByZXR1cm5zLlxyXG4gID4gICAgIGxldCBlbTEgPSBuZXcgRW50aXR5TWFuYWdlciggXCJicmVlemUvTm9ydGh3aW5kSUJNb2RlbFwiKTtcclxuICA+ICAgICBlbTEuZmV0Y2hNZXRhZGF0YSgpXHJcbiAgPiAgICAgICAudGhlbihmdW5jdGlvbigpIHtcclxuICA+ICAgICAgICAgICBsZXQgbWV0YWRhdGFTdG9yZSA9IGVtMS5tZXRhZGF0YVN0b3JlO1xyXG4gID4gICAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBtZXRhZGF0YVxyXG4gID4gICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXhjZXB0aW9uKSB7XHJcbiAgPiAgICAgICAgICAgLy8gaGFuZGxlIGV4Y2VwdGlvbiBoZXJlXHJcbiAgPiAgICAgICB9KTtcclxuICBcclxuICBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiBjYWxsZWQgb24gc3VjY2Vzcy5cclxuICBAcGFyYW0gZXJyb3JDYWxsYmFjayAtIEZ1bmN0aW9uIGNhbGxlZCBvbiBmYWlsdXJlLlxyXG4gIEByZXR1cm4ge1Byb21pc2V9XHJcbiAgICAtIHNjaGVtYSB7T2JqZWN0fSBUaGUgcmF3IFNjaGVtYSBvYmplY3QgZnJvbSBtZXRhZGF0YSBwcm92aWRlciAtIEJlY2F1c2UgdGhpcyBzY2hlbWEgd2lsbCBkaWZmZXIgZGVwZW5kaW5nIG9uIHRoZSBtZXRhZGF0YSBwcm92aWRlclxyXG4gICAgICAgIGl0IGlzIHVzdWFsbHkgYmV0dGVyIHRvIGFjY2VzcyBtZXRhZGF0YSB2aWEgdGhlICdtZXRhZGF0YVN0b3JlJyBwcm9wZXJ0eSBvZiB0aGUgRW50aXR5TWFuYWdlciBpbnN0ZWFkIG9mIHVzaW5nIHRoaXMgJ3JhdycgZGF0YS5cclxuICAqKi9cclxuICBmZXRjaE1ldGFkYXRhKGRhdGFTZXJ2aWNlPzogRGF0YVNlcnZpY2UsIGNhbGxiYWNrPzogQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBFcnJvckNhbGxiYWNrKSB7XHJcbiAgICBpZiAodHlwZW9mIChkYXRhU2VydmljZSkgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAvLyBsZWdhY3kgc3VwcG9ydCBmb3Igd2hlbiBkYXRhU2VydmljZSB3YXMgbm90IGFuIGFyZy4gaS5lLiBmaXJzdCBhcmcgd2FzIGNhbGxiYWNrXHJcbiAgICAgIGVycm9yQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICAgICAgY2FsbGJhY2sgPSBkYXRhU2VydmljZTtcclxuICAgICAgZGF0YVNlcnZpY2UgPSB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhc3NlcnRQYXJhbShkYXRhU2VydmljZSwgXCJkYXRhU2VydmljZVwiKS5pc0luc3RhbmNlT2YoRGF0YVNlcnZpY2UpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgICBhc3NlcnRQYXJhbShjYWxsYmFjaywgXCJjYWxsYmFja1wiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICAgIGFzc2VydFBhcmFtKGVycm9yQ2FsbGJhY2ssIFwiZXJyb3JDYWxsYmFja1wiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLm1ldGFkYXRhU3RvcmUuZmV0Y2hNZXRhZGF0YShkYXRhU2VydmljZSB8fCB0aGlzLmRhdGFTZXJ2aWNlKTtcclxuICAgIHJldHVybiBwcm9taXNlV2l0aENhbGxiYWNrcyhwcm9taXNlLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhlY3V0ZVF1ZXJ5KHF1ZXJ5OiBzdHJpbmcsIGNhbGxiYWNrPzogUXVlcnlTdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBRdWVyeUVycm9yQ2FsbGJhY2spOiBQcm9taXNlPFF1ZXJ5UmVzdWx0PjtcclxuICBleGVjdXRlUXVlcnkocXVlcnk6IEVudGl0eVF1ZXJ5LCBjYWxsYmFjaz86IFF1ZXJ5U3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrPzogUXVlcnlFcnJvckNhbGxiYWNrKTogUHJvbWlzZTxRdWVyeVJlc3VsdD47XHJcbiAgLyoqXHJcbiAgRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBxdWVyeS4gX19Bc3luY19fIFxyXG4gIFxyXG4gID4gICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIik7XHJcbiAgPiAgICAgZW0uZXhlY3V0ZVF1ZXJ5KHF1ZXJ5KS50aGVuKCBmdW5jdGlvbihkYXRhKSB7XHJcbiAgPiAgICAgICAgIGxldCBvcmRlcnMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgPiAgICAgICAgIC4uLiBxdWVyeSByZXN1bHRzIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgfSkuY2F0Y2goIGZ1bmN0aW9uKGVycikge1xyXG4gID4gICAgICAgICAuLi4gcXVlcnkgZmFpbHVyZSBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgIH0pO1xyXG5cclxuICBvciB3aXRoIGNhbGxiYWNrc1xyXG4gID4gICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIik7XHJcbiAgPiAgICAgZW0uZXhlY3V0ZVF1ZXJ5KHF1ZXJ5LFxyXG4gID4gICAgICAgICBmdW5jdGlvbihkYXRhKSB7XHJcbiAgPiAgICAgICAgICAgICBsZXQgb3JkZXJzID0gZGF0YS5yZXN1bHRzO1xyXG4gID4gICAgICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgICAgfSxcclxuICA+ICAgICAgICAgZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgICAgICAuLi4gcXVlcnkgZmFpbHVyZSBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICAgICB9KTtcclxuXHJcbiAgRWl0aGVyIHdheSB0aGlzIG1ldGhvZCBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIHRoZSBUaGUgW1tFbnRpdHlRdWVyeV1dICdleGVjdXRlJyBtZXRob2QuXHJcbiAgPiAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKS51c2luZyhlbSk7XHJcbiAgPiAgICAgcXVlcnkuZXhlY3V0ZSgpLnRoZW4oIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgbGV0IG9yZGVycyA9IGRhdGEucmVzdWx0cztcclxuICA+ICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICB9KS5jYXRjaCggZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgfSk7XHJcbiAgQHBhcmFtIHF1ZXJ5IC0gVGhlIFtbRW50aXR5UXVlcnldXSBvciBPRGF0YSBxdWVyeSBzdHJpbmcgdG8gZXhlY3V0ZS5cclxuICBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiBjYWxsZWQgb24gc3VjY2Vzcy5cclxuICBAcGFyYW0gZXJyb3JDYWxsYmFjayAtIHtGdW5jdGlvbn0gRnVuY3Rpb24gY2FsbGVkIG9uIGZhaWx1cmUuXHJcbiAgQHJldHVybiBQcm9taXNlIG9mIFxyXG4gICAgLSByZXN1bHRzIC0gQW4gYXJyYXkgb2YgZW50aXRpZXNcclxuICAgIC0gcmV0cmlldmVkRW50aXRpZXMgLSBBIGFycmF5IG9mIGFsbCBvZiB0aGUgZW50aXRpZXMgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5LiAgRGlmZmVycyBmcm9tIHJlc3VsdHMgKGFib3ZlKSB3aGVuIC5leHBhbmQoKSBpcyB1c2VkLlxyXG4gICAgLSBxdWVyeSAtIFRoZSBvcmlnaW5hbCBbW0VudGl0eVF1ZXJ5XV0gb3IgcXVlcnkgc3RyaW5nXHJcbiAgICAtIGVudGl0eU1hbmFnZXIgLSAgVGhlIEVudGl0eU1hbmFnZXIuXHJcbiAgICAtIGh0dHBSZXNwb25zZSAtIFRoZSBbW0lIdHRwUmVzcG9uc2VdXSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAtIGlubGluZUNvdW50IC0gIE9ubHkgYXZhaWxhYmxlIGlmICdpbmxpbmVDb3VudCh0cnVlKScgd2FzIGFwcGxpZWQgdG8gdGhlIHF1ZXJ5LiAgUmV0dXJucyB0aGUgY291bnQgb2ZcclxuICAgIGl0ZW1zIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IHRoZSBxdWVyeSBiZWZvcmUgYXBwbHlpbmcgYW55IHNraXAgb3IgdGFrZSBvcGVyYXRvcnMsIGJ1dCBhZnRlciBhbnkgZmlsdGVyL3doZXJlIHByZWRpY2F0ZXNcclxuICAgIHdvdWxkIGhhdmUgYmVlbiBhcHBsaWVkLlxyXG4gICoqL1xyXG4gIGV4ZWN1dGVRdWVyeShxdWVyeTogRW50aXR5UXVlcnkgfCBzdHJpbmcsIGNhbGxiYWNrPzogUXVlcnlTdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBRdWVyeUVycm9yQ2FsbGJhY2spIHtcclxuICAgIGFzc2VydFBhcmFtKHF1ZXJ5LCBcInF1ZXJ5XCIpLmlzSW5zdGFuY2VPZihFbnRpdHlRdWVyeSkub3IoKS5pc1N0cmluZygpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShjYWxsYmFjaywgXCJjYWxsYmFja1wiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShlcnJvckNhbGxiYWNrLCBcImVycm9yQ2FsbGJhY2tcIikuaXNGdW5jdGlvbigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgbGV0IHByb21pc2U6IFByb21pc2U8YW55PjtcclxuICAgIC8vICdyZXNvbHZlJyBtZXRob2RzIGNyZWF0ZSBhIG5ldyB0eXBlZCBvYmplY3Qgd2l0aCBhbGwgb2YgaXRzIHByb3BlcnRpZXMgZnVsbHkgcmVzb2x2ZWQgYWdhaW5zdCBhIGxpc3Qgb2Ygc291cmNlcy5cclxuICAgIC8vIFRob3VnaHQgYWJvdXQgY3JlYXRpbmcgYSAnbm9ybWFsaXplZCcgcXVlcnkgd2l0aCB0aGVzZSAncmVzb2x2ZWQnIG9iamVjdHNcclxuICAgIC8vIGJ1dCBkZWNpZGVkIG5vdCB0byBiZWNhdXNlIHRoZSAncXVlcnknIG1heSBub3QgYmUgYW4gRW50aXR5UXVlcnkgKGl0IGNhbiBiZSBhIHN0cmluZykgYW5kIGhlbmNlIG1pZ2h0IG5vdCBoYXZlIGEgcXVlcnlPcHRpb25zIG9yIGRhdGFTZXJ2aWNlcyBwcm9wZXJ0eSBvbiBpdC5cclxuICAgIGxldCBxdWVyeU9wdGlvbnMgPSBRdWVyeU9wdGlvbnMucmVzb2x2ZShbKHF1ZXJ5IGFzIGFueSkucXVlcnlPcHRpb25zLCB0aGlzLnF1ZXJ5T3B0aW9ucywgUXVlcnlPcHRpb25zLmRlZmF1bHRJbnN0YW5jZV0pO1xyXG4gICAgbGV0IGRhdGFTZXJ2aWNlID0gRGF0YVNlcnZpY2UucmVzb2x2ZShbKHF1ZXJ5IGFzIGFueSkuZGF0YVNlcnZpY2UhLCB0aGlzLmRhdGFTZXJ2aWNlXSk7XHJcblxyXG4gICAgaWYgKCghZGF0YVNlcnZpY2UuaGFzU2VydmVyTWV0YWRhdGEpIHx8IHRoaXMubWV0YWRhdGFTdG9yZS5oYXNNZXRhZGF0YUZvcihkYXRhU2VydmljZS5zZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgcHJvbWlzZSA9IGV4ZWN1dGVRdWVyeUNvcmUodGhpcywgcXVlcnksIHF1ZXJ5T3B0aW9ucywgZGF0YVNlcnZpY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHJvbWlzZSA9IHRoaXMuZmV0Y2hNZXRhZGF0YShkYXRhU2VydmljZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVRdWVyeUNvcmUodGhpcywgcXVlcnksIHF1ZXJ5T3B0aW9ucywgZGF0YVNlcnZpY2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJvbWlzZVdpdGhDYWxsYmFja3MocHJvbWlzZSwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2sgYXMgRXJyb3JDYWxsYmFjayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IGFnYWluc3QgdGhpcyBFbnRpdHlNYW5hZ2VyJ3MgbG9jYWwgY2FjaGUuXHJcblxyXG4gIEJlY2F1c2UgdGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBwcm9taXNlIG9yIGEgY2FsbGJhY2tcclxuICA+ICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpO1xyXG4gID4gICAgIGxldCBvcmRlcnMgPSBlbS5leGVjdXRlUXVlcnlMb2NhbGx5KHF1ZXJ5KTtcclxuXHJcbiAgTm90ZSB0aGF0IHRoaXMgY2FuIGFsc28gYmUgYWNjb21wbGlzaGVkIHVzaW5nIHRoZSAnZXhlY3V0ZVF1ZXJ5JyBtZXRob2Qgd2l0aFxyXG4gIGEgRmV0Y2hTdHJhdGVneSBvZiBGcm9tTG9jYWxDYWNoZSBhbmQgbWFraW5nIHVzZSBvZiB0aGUgUHJvbWlzZSBvciBjYWxsYmFja1xyXG4gID4gICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIikudXNpbmcoRmV0Y2hTdHJhdGVneS5Gcm9tTG9jYWxDYWNoZSk7XHJcbiAgPiAgICAgZW0uZXhlY3V0ZVF1ZXJ5KHF1ZXJ5KS50aGVuKCBmdW5jdGlvbihkYXRhKSB7XHJcbiAgPiAgICAgICAgIGxldCBvcmRlcnMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgPiAgICAgICAgIC4uLiBxdWVyeSByZXN1bHRzIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgfSkuY2F0Y2goIGZ1bmN0aW9uKGVycikge1xyXG4gID4gICAgICAgICAuLi4gcXVlcnkgZmFpbHVyZSBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgIH0pO1xyXG4gIEBwYXJhbSBxdWVyeSAtIFRoZSBbW0VudGl0eVF1ZXJ5XV0gdG8gZXhlY3V0ZS5cclxuICBAcmV0dXJuICB7QXJyYXkgb2YgRW50aXR5fSAgQXJyYXkgb2YgZW50aXRpZXMgZnJvbSBjYWNoZSB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5XHJcbiAgKiovXHJcbiAgZXhlY3V0ZVF1ZXJ5TG9jYWxseShxdWVyeTogRW50aXR5UXVlcnkpIHtcclxuICAgIHJldHVybiBleGVjdXRlUXVlcnlMb2NhbGx5Q29yZSh0aGlzLCBxdWVyeSkucmVzdWx0cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFNhdmVzIGVpdGhlciBhIGxpc3Qgb2Ygc3BlY2lmaWVkIGVudGl0aWVzIG9yIGFsbCBjaGFuZ2VkIGVudGl0aWVzIHdpdGhpbiB0aGlzIEVudGl0eU1hbmFnZXIuIElmIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRvIGFueSBvZiB0aGUgZW50aXRpZXNcclxuICBzcGVjaWZpZWQgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIHNlcnZlciBzaWRlIGNhbGwgbWFkZSBidXQgYSB2YWxpZCAnZW1wdHknIHNhdmVSZXN1bHQgd2lsbCBzdGlsbCBiZSByZXR1cm5lZC4gX19Bc3luY19fXHJcblxyXG4gIE9mdGVuIHdlIHdpbGwgYmUgc2F2aW5nIGFsbCBvZiB0aGUgZW50aXRpZXMgd2l0aGluIGFuIEVudGl0eU1hbmFnZXIgdGhhdCBhcmUgZWl0aGVyIGFkZGVkLCBtb2RpZmllZCBvciBkZWxldGVkXHJcbiAgYW5kIHdlIHdpbGwgbGV0IHRoZSAnc2F2ZUNoYW5nZXMnIGNhbGwgZGV0ZXJtaW5lIHdoaWNoIGVudGl0aWVzIHRoZXNlIGFyZS5cclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIC8vIFRoaXMgY291bGQgaW5jbHVkZSBhZGRlZCwgbW9kaWZpZWQgYW5kIGRlbGV0ZWQgZW50aXRpZXMuXHJcbiAgPiAgICAgIGVtLnNhdmVDaGFuZ2VzKCkudGhlbihmdW5jdGlvbihzYXZlUmVzdWx0KSB7XHJcbiAgPiAgICAgICAgICBsZXQgc2F2ZWRFbnRpdGllcyA9IHNhdmVSZXN1bHQuZW50aXRpZXM7XHJcbiAgPiAgICAgICAgICBsZXQga2V5TWFwcGluZ3MgPSBzYXZlUmVzdWx0LmtleU1hcHBpbmdzO1xyXG4gID4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xyXG4gID4gICAgICAgICAgLy8gZSBpcyBhbnkgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93bi5cclxuICA+ICAgICAgfSk7XHJcblxyXG4gIEJ1dCB3ZSBjYW4gYWxzbyBjb250cm9sIGV4YWN0bHkgd2hpY2ggZW50aXRpZXMgdG8gc2F2ZSBhbmQgY2FuIHNwZWNpZnkgc3BlY2lmaWMgU2F2ZU9wdGlvbnNcclxuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbnRpdGllc1RvU2F2ZSBpcyBhbiBhcnJheSBvZiBlbnRpdGllcyB0byBzYXZlLlxyXG4gID4gICAgICBsZXQgc2F2ZU9wdGlvbnMgPSBuZXcgU2F2ZU9wdGlvbnMoeyBhbGxvd0NvbmN1cnJlbnRTYXZlczogdHJ1ZSB9KTtcclxuICA+ICAgICAgZW0uc2F2ZUNoYW5nZXMoZW50aXRpZXNUb1NhdmUsIHNhdmVPcHRpb25zKS50aGVuKGZ1bmN0aW9uKHNhdmVSZXN1bHQpIHtcclxuICA+ICAgICAgICAgIGxldCBzYXZlZEVudGl0aWVzID0gc2F2ZVJlc3VsdC5lbnRpdGllcztcclxuICA+ICAgICAgICAgIGxldCBrZXlNYXBwaW5ncyA9IHNhdmVSZXN1bHQua2V5TWFwcGluZ3M7XHJcbiAgPiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgPiAgICAgICAgICAvLyBlIGlzIGFueSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duLlxyXG4gID4gICAgICB9KTtcclxuXHJcbiAgQ2FsbGJhY2sgbWV0aG9kcyBjYW4gYWxzbyBiZSB1c2VkXHJcbiAgPiAgICAgIGVtLnNhdmVDaGFuZ2VzKGVudGl0aWVzVG9TYXZlLCBudWxsLFxyXG4gID4gICAgICAgICAgZnVuY3Rpb24oc2F2ZVJlc3VsdCkge1xyXG4gID4gICAgICAgICAgICAgIGxldCBzYXZlZEVudGl0aWVzID0gc2F2ZVJlc3VsdC5lbnRpdGllcztcclxuICA+ICAgICAgICAgICAgICBsZXQga2V5TWFwcGluZ3MgPSBzYXZlUmVzdWx0LmtleU1hcHBpbmdzO1xyXG4gID4gICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcclxuICA+ICAgICAgICAgICAgICAvLyBlIGlzIGFueSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duLlxyXG4gID4gICAgICAgICAgfVxyXG4gID4gICAgICApO1xyXG5cclxuICBAcGFyYW0gZW50aXRpZXMgLSBUaGUgbGlzdCBvZiBlbnRpdGllcyB0byBzYXZlLlxyXG4gIEV2ZXJ5IGVudGl0eSBpbiB0aGF0IGxpc3Qgd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIsIHdoZXRoZXIgY2hhbmdlZCBvciB1bmNoYW5nZWQsXHJcbiAgYXMgbG9uZyBhcyBpdCBpcyBhdHRhY2hlZCB0byB0aGlzIEVudGl0eU1hbmFnZXIuXHJcbiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgbnVsbCBvciBlbXB0eSAodGhlIHVzdWFsIGNhc2UpLFxyXG4gIGV2ZXJ5IGVudGl0eSB3aXRoIHBlbmRpbmcgY2hhbmdlcyBpbiB0aGlzIEVudGl0eU1hbmFnZXIgd2lsbCBiZSBzYXZlZC5cclxuICBAcGFyYW0gc2F2ZU9wdGlvbnMgLSBbW1NhdmVPcHRpb25zXV0gZm9yIHRoZSBzYXZlIC0gd2lsbCBkZWZhdWx0IHRvXHJcbiAgW1tFbnRpdHlNYW5hZ2VyLnNhdmVPcHRpb25zXV0gaWYgbnVsbC5cclxuICBAcGFyYW0gY2FsbGJhY2sgLSAgRnVuY3Rpb24gY2FsbGVkIG9uIHN1Y2Nlc3MuXHJcbiAgQHBhcmFtIGVycm9yQ2FsbGJhY2sgLSBGdW5jdGlvbiBjYWxsZWQgb24gZmFpbHVyZS5cclxuICBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlXHJcbiAgKiovXHJcbiAgc2F2ZUNoYW5nZXMoZW50aXRpZXM/OiBFbnRpdHlbXSB8IG51bGwsIHNhdmVPcHRpb25zPzogU2F2ZU9wdGlvbnMsIGNhbGxiYWNrPzogRnVuY3Rpb24sIGVycm9yQ2FsbGJhY2s/OiBGdW5jdGlvbikge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXRpZXMsIFwiZW50aXRpZXNcIikuaXNPcHRpb25hbCgpLmlzQXJyYXkoKS5pc0VudGl0eSgpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShzYXZlT3B0aW9ucywgXCJzYXZlT3B0aW9uc1wiKS5pc0luc3RhbmNlT2YoU2F2ZU9wdGlvbnMpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgYXNzZXJ0UGFyYW0oY2FsbGJhY2ssIFwiY2FsbGJhY2tcIikuaXNGdW5jdGlvbigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgYXNzZXJ0UGFyYW0oZXJyb3JDYWxsYmFjaywgXCJlcnJvckNhbGxiYWNrXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuXHJcbiAgICBzYXZlT3B0aW9ucyA9IHNhdmVPcHRpb25zIHx8IHRoaXMuc2F2ZU9wdGlvbnMgfHwgU2F2ZU9wdGlvbnMuZGVmYXVsdEluc3RhbmNlO1xyXG5cclxuICAgIGxldCBlbnRpdGllc1RvU2F2ZSA9IGdldEVudGl0aWVzVG9TYXZlKHRoaXMsIGVudGl0aWVzID8gZW50aXRpZXMgOiB1bmRlZmluZWQpO1xyXG5cclxuICAgIGlmIChlbnRpdGllc1RvU2F2ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHsgZW50aXRpZXM6IFtdLCBrZXlNYXBwaW5nczogW10gfSBhcyBTYXZlUmVzdWx0O1xyXG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXNhdmVPcHRpb25zLmFsbG93Q29uY3VycmVudFNhdmVzKSB7XHJcbiAgICAgIGxldCBhbnlQZW5kaW5nU2F2ZXMgPSBlbnRpdGllc1RvU2F2ZS5zb21lKGZ1bmN0aW9uIChlbnRpdHkpIHtcclxuICAgICAgICByZXR1cm4gZW50aXR5LmVudGl0eUFzcGVjdC5pc0JlaW5nU2F2ZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoYW55UGVuZGluZ1NhdmVzKSB7XHJcbiAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcihcIkNvbmN1cnJlbnQgc2F2ZXMgbm90IGFsbG93ZWQgLSBTYXZlT3B0aW9ucy5hbGxvd0NvbmN1cnJlbnRTYXZlcyBpcyBmYWxzZVwiKTtcclxuICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjayhlcnIpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTZXJ2ZXJFcnJvcnMoZW50aXRpZXNUb1NhdmUpO1xyXG5cclxuICAgIGxldCB2YWxFcnJvciA9IHRoaXMuc2F2ZUNoYW5nZXNWYWxpZGF0ZU9uQ2xpZW50KGVudGl0aWVzVG9TYXZlKTtcclxuICAgIGlmICh2YWxFcnJvcikge1xyXG4gICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjayh2YWxFcnJvcik7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWxFcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRhdGFTZXJ2aWNlID0gRGF0YVNlcnZpY2UucmVzb2x2ZShbc2F2ZU9wdGlvbnMuZGF0YVNlcnZpY2UsIHRoaXMuZGF0YVNlcnZpY2VdKTtcclxuICAgIGxldCBzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQgPSB7XHJcbiAgICAgIGVudGl0eU1hbmFnZXI6IHRoaXMsXHJcbiAgICAgIGRhdGFTZXJ2aWNlOiBkYXRhU2VydmljZSxcclxuICAgICAgcHJvY2Vzc1NhdmVkRW50aXRpZXM6IHByb2Nlc3NTYXZlZEVudGl0aWVzLFxyXG4gICAgICByZXNvdXJjZU5hbWU6IHNhdmVPcHRpb25zLnJlc291cmNlTmFtZSB8fCB0aGlzLnNhdmVPcHRpb25zLnJlc291cmNlTmFtZSB8fCBcIlNhdmVDaGFuZ2VzXCJcclxuICAgIH07XHJcblxyXG4gICAgLy8gVE9ETzogbmVlZCB0byBjaGVjayB0aGF0IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgc2F2ZSB0aGF0IGFsbCBlbnRpdGllcyB3aG9zZSB0ZW1wIGtleXNcclxuICAgIC8vIGFyZSByZWZlcmVuY2VkIGFyZSBhbHNvIGluIHRoZSBwYXJ0aWFsIHNhdmUgZ3JvdXBcclxuXHJcbiAgICBsZXQgc2F2ZUJ1bmRsZSA9IHsgZW50aXRpZXM6IGVudGl0aWVzVG9TYXZlLCBzYXZlT3B0aW9uczogc2F2ZU9wdGlvbnMgfTtcclxuXHJcblxyXG4gICAgdHJ5IHsgLy8gR3VhcmQgYWdhaW5zdCBleGNlcHRpb24gdGhyb3duIGluIGRhdGFzZXJ2aWNlIGFkYXB0ZXIgYmVmb3JlIGl0IGdvZXMgYXN5bmNcclxuICAgICAgdXBkYXRlQ29uY3VycmVuY3lQcm9wZXJ0aWVzKGVudGl0aWVzVG9TYXZlKTtcclxuICAgICAgcmV0dXJuIGRhdGFTZXJ2aWNlLmFkYXB0ZXJJbnN0YW5jZSEuc2F2ZUNoYW5nZXMoc2F2ZUNvbnRleHQsIHNhdmVCdW5kbGUpXHJcbiAgICAgICAgLnRoZW4oc2F2ZVN1Y2Nlc3MpLnRoZW4oKHIpID0+IHIsIHNhdmVGYWlsKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAvLyB1bmRvIHRoZSBtYXJraW5nIGJ5IHVwZGF0ZUNvbmN1cnJlbmN5UHJvcGVydGllc1xyXG4gICAgICBtYXJrSXNCZWluZ1NhdmVkKGVudGl0aWVzVG9TYXZlLCBmYWxzZSk7XHJcbiAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKGVycik7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNhdmVTdWNjZXNzKHNhdmVSZXN1bHQ6IFNhdmVSZXN1bHQpIHtcclxuICAgICAgbGV0IGVtID0gc2F2ZUNvbnRleHQuZW50aXR5TWFuYWdlcjtcclxuICAgICAgbWFya0lzQmVpbmdTYXZlZChlbnRpdGllc1RvU2F2ZSwgZmFsc2UpO1xyXG4gICAgICBsZXQgc2F2ZWRFbnRpdGllcyA9IHNhdmVDb250ZXh0LnByb2Nlc3NTYXZlZEVudGl0aWVzKHNhdmVSZXN1bHQpO1xyXG4gICAgICBzYXZlUmVzdWx0LmVudGl0aWVzID0gc2F2ZWRFbnRpdGllcztcclxuXHJcbiAgICAgIC8vIHVwZGF0ZSBfaGFzQ2hhbmdlcyBhZnRlciBzYXZlLlxyXG4gICAgICBlbS5fc2V0SGFzQ2hhbmdlcygpO1xyXG5cclxuICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBhbnltb3JlIGJlY2F1c2Ugb3RoZXIgY2hhbmdlcyBtaWdodCBoYXZlIGJlZW4gbWFkZSB3aGlsZSBzYXZlZCBlbnRpdGllcyBpbiBmbGlnaHQuXHJcbiAgICAgIC8vICAgICAgbGV0IGhhc0NoYW5nZXMgPSAoaXNGdWxsU2F2ZSAmJiBoYXZlU2FtZUNvbnRlbnRzKGVudGl0aWVzVG9TYXZlLCBzYXZlZEVudGl0aWVzKSkgPyBmYWxzZSA6IG51bGw7XHJcbiAgICAgIC8vICAgICAgZW0uX3NldEhhc0NoYW5nZXMoaGFzQ2hhbmdlcyk7XHJcblxyXG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKHNhdmVSZXN1bHQpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNhdmVSZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHByb2Nlc3NTYXZlZEVudGl0aWVzKHNhdmVSZXN1bHQ6IFNhdmVSZXN1bHQpIHtcclxuICAgICAgbGV0IHNhdmVkRW50aXRpZXMgPSBzYXZlUmVzdWx0LmVudGl0aWVzO1xyXG4gICAgICBsZXQgZGVsZXRlZEtleXMgPSBzYXZlUmVzdWx0LmRlbGV0ZWRLZXlzIHx8IFtdO1xyXG4gICAgICBpZiAoc2F2ZWRFbnRpdGllcy5sZW5ndGggPT09IDAgJiYgZGVsZXRlZEtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBrZXlNYXBwaW5ncyA9IHNhdmVSZXN1bHQua2V5TWFwcGluZ3M7XHJcbiAgICAgIGxldCBlbSA9IHNhdmVDb250ZXh0LmVudGl0eU1hbmFnZXI7XHJcblxyXG4gICAgICAvLyBtdXN0IG9jY3VyIG91dHNpZGUgb2YgaXNMb2FkaW5nIGJsb2NrXHJcbiAgICAgIGZpeHVwS2V5cyhlbSwga2V5TWFwcGluZ3MpO1xyXG5cclxuICAgICAgY29yZS51c2luZyhlbSwgXCJpc0xvYWRpbmdcIiwgdHJ1ZSwgKCkgPT4ge1xyXG5cclxuICAgICAgICBsZXQgbWFwcGluZ0NvbnRleHQgPSBuZXcgTWFwcGluZ0NvbnRleHQoe1xyXG4gICAgICAgICAgcXVlcnk6IHVuZGVmaW5lZCwgLy8gdGVsbHMgdmlzaXRBbmRNZXJnZSB0aGlzIGlzIGEgc2F2ZSBpbnN0ZWFkIG9mIGEgcXVlcnlcclxuICAgICAgICAgIGVudGl0eU1hbmFnZXI6IGVtLFxyXG4gICAgICAgICAgbWVyZ2VPcHRpb25zOiB7IG1lcmdlU3RyYXRlZ3k6IE1lcmdlU3RyYXRlZ3kuT3ZlcndyaXRlQ2hhbmdlcyB9LFxyXG4gICAgICAgICAgZGF0YVNlcnZpY2U6IGRhdGFTZXJ2aWNlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFRoZSB2aXNpdEFuZE1lcmdlIG9wZXJhdGlvbiBoYXMgYmVlbiBvcHRpbWl6ZWQgc28gdGhhdCB3ZSBkbyBub3QgYWN0dWFsbHkgcGVyZm9ybSBhIG1lcmdlIGlmIHRoZVxyXG4gICAgICAgIC8vIHRoZSBzYXZlIG9wZXJhdGlvbiBkaWQgbm90IGFjdHVhbGx5IHJldHVybiB0aGUgZW50aXR5IC0gaS5lLiBkdXJpbmcgT0RhdGEgYW5kIE1vbmdvIHVwZGF0ZXMgYW5kIGRlbGV0ZXMuXHJcbiAgICAgICAgc2F2ZWRFbnRpdGllcyA9IG1hcHBpbmdDb250ZXh0LnZpc2l0QW5kTWVyZ2Uoc2F2ZWRFbnRpdGllcywgeyBub2RlVHlwZTogXCJyb290XCIgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gZGV0YWNoIGFueSBlbnRpdGllcyBmb3VuZCBpbiB0aGUgZW0gdGhhdCBhcHBlYXIgaW4gdGhlIGRlbGV0ZWRLZXlzIGxpc3QuIFxyXG4gICAgICBkZWxldGVkS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgbGV0IGVudGl0eVR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShrZXkuZW50aXR5VHlwZU5hbWUpIGFzIEVudGl0eVR5cGU7XHJcbiAgICAgICAgbGV0IGVrZXkgPSBuZXcgRW50aXR5S2V5KGVudGl0eVR5cGUsIGtleS5rZXlWYWx1ZXMpO1xyXG4gICAgICAgIGxldCBlbnRpdHkgPSBlbS5nZXRFbnRpdHlCeUtleShla2V5KTtcclxuICAgICAgICBpZiAoZW50aXR5KSB7XHJcbiAgICAgICAgICBlbnRpdHkuZW50aXR5QXNwZWN0LnNldERldGFjaGVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBzYXZlZEVudGl0aWVzO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNhdmVGYWlsKHNlcnZlckVycm9yOiBTYXZlRXJyb3JGcm9tU2VydmVyKSB7XHJcbiAgICAgIG1hcmtJc0JlaW5nU2F2ZWQoZW50aXRpZXNUb1NhdmUsIGZhbHNlKTtcclxuICAgICAgbGV0IGNsaWVudEVycm9yID0gcHJvY2Vzc1NlcnZlckVycm9ycyhzYXZlQ29udGV4dCwgc2VydmVyRXJyb3IpO1xyXG4gICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjayhjbGllbnRFcnJvcik7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjbGllbnRFcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSdW4gdGhlIFwic2F2ZUNoYW5nZXNcIiBwcmUtc2F2ZSBjbGllbnQgdmFsaWRhdGlvbiBsb2dpYy5cclxuICBcclxuICBUaGlzIGlzIE5PVCBhIGdlbmVyYWwgcHVycG9zZSB2YWxpZGF0aW9uIG1ldGhvZC5cclxuICBJdCBpcyBpbnRlbmRlZCBmb3IgdXRpbGl0aWVzIHRoYXQgbXVzdCBrbm93IGlmIHNhdmVDaGFuZ2VzXHJcbiAgd291bGQgcmVqZWN0IHRoZSBzYXZlIGR1ZSB0byBjbGllbnQgdmFsaWRhdGlvbiBlcnJvcnMuXHJcbiAgXHJcbiAgSXQgb25seSB2YWxpZGF0ZXMgZW50aXRpZXMgaWYgdGhlIEVudGl0eU1hbmFnZXInc1xyXG4gIFtbVmFsaWRhdGlvbk9wdGlvbnNdXS52YWxpZGF0ZU9uU2F2ZSBpcyB0cnVlLlxyXG4gIFxyXG4gIEBwYXJhbSBlbnRpdGllc1RvU2F2ZSB7QXJyYXkgb2YgRW50aXR5fSBUaGUgbGlzdCBvZiBlbnRpdGllcyB0byBzYXZlICh0byB2YWxpZGF0ZSkuXHJcbiAgQHJldHVybiB7RXJyb3J9IFZhbGlkYXRpb24gZXJyb3Igb3IgbnVsbCBpZiBubyBlcnJvclxyXG4gICoqL1xyXG4gIHNhdmVDaGFuZ2VzVmFsaWRhdGVPbkNsaWVudChlbnRpdGllc1RvU2F2ZTogRW50aXR5W10pIHtcclxuXHJcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uT3B0aW9ucy52YWxpZGF0ZU9uU2F2ZSkge1xyXG4gICAgICBsZXQgZmFpbGVkRW50aXRpZXMgPSBlbnRpdGllc1RvU2F2ZS5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eSkge1xyXG4gICAgICAgIGxldCBhc3BlY3QgPSBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gICAgICAgIGxldCBpc1ZhbGlkID0gYXNwZWN0LmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpIHx8IGFzcGVjdC52YWxpZGF0ZUVudGl0eSgpO1xyXG4gICAgICAgIHJldHVybiAhaXNWYWxpZDtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChmYWlsZWRFbnRpdGllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHZhbEVycm9yID0gbmV3IEVycm9yKFwiQ2xpZW50IHNpZGUgdmFsaWRhdGlvbiBlcnJvcnMgZW5jb3VudGVyZWQgLSBzZWUgdGhlIGVudGl0eUVycm9ycyBjb2xsZWN0aW9uIG9uIHRoaXMgb2JqZWN0IGZvciBtb3JlIGRldGFpbFwiKTtcclxuICAgICAgICAodmFsRXJyb3IgYXMgYW55KS5lbnRpdHlFcnJvcnMgPSBjcmVhdGVFbnRpdHlFcnJvcnMoZmFpbGVkRW50aXRpZXMpO1xyXG4gICAgICAgIHJldHVybiB2YWxFcnJvcjsgLy8gVE9ETzogdHlwZSB0aGlzLlxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9maW5kRW50aXR5R3JvdXAoZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eUdyb3VwTWFwW2VudGl0eVR5cGUubmFtZV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGxldCBlbXBsb3llZVR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRW1wbG95ZWVcIik7XHJcbiAgPiAgICAgIGxldCBlbXBsb3llZUtleSA9IG5ldyBFbnRpdHlLZXkoZW1wbG95ZWVUeXBlLCAxKTtcclxuICA+ICAgICAgbGV0IGVtcGxveWVlID0gZW0xLmdldEVudGl0eUJ5S2V5KGVtcGxveWVlS2V5KTtcclxuICA+ICAgICAgLy8gZW1wbG95ZWUgd2lsbCBlaXRoZXIgYmUgYW4gZW50aXR5IG9yIG51bGwuXHJcbiAgKiovXHJcbiAgZ2V0RW50aXR5QnlLZXkoZW50aXR5S2V5OiBFbnRpdHlLZXkpOiBFbnRpdHkgfCBudWxsO1xyXG5cclxuICAvKiogIFxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGVtcGxveWVlID0gZW0xLmdldEVudGl0eUJ5S2V5KFwiRW1wbG95ZWVcIiwgMSk7XHJcbiAgPiAgICAgIC8vIGVtcGxveWVlIHdpbGwgZWl0aGVyIGJlIGFuIGVudGl0eSBvciBudWxsLlxyXG4gICoqL1xyXG4gIGdldEVudGl0eUJ5S2V5KHR5cGVOYW1lOiBzdHJpbmcsIGtleVZhbHVlczogYW55IHwgYW55W10pOiBFbnRpdHkgfCBudWxsO1xyXG5cclxuICAvKiogIFxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGVtcGxveWVlVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJFbXBsb3llZVwiKTtcclxuICA+ICAgICAgbGV0IGVtcGxveWVlID0gZW0xLmdldEVudGl0eUJ5S2V5KGVtcGxveWVlVHlwZSwgMSk7XHJcbiAgPiAgICAgIC8vIGVtcGxveWVlIHdpbGwgZWl0aGVyIGJlIGFuIGVudGl0eSBvciBudWxsLlxyXG4gICoqL1xyXG4gIGdldEVudGl0eUJ5S2V5KHR5cGU6IEVudGl0eVR5cGUsIGtleVZhbHVlczogYW55IHwgYW55W10pOiBFbnRpdHkgfCBudWxsO1xyXG5cclxuICAvKiogIFxyXG4gIEF0dGVtcHRzIHRvIGxvY2F0ZSBhbiBlbnRpdHkgd2l0aGluIHRoaXMgRW50aXR5TWFuYWdlciBieSBpdHMgW0VudGl0eUtleV0uXHJcbiAgQHBhcmFtIGVudGl0eUtleSAtIFRoZSBbW0VudGl0eUtleV1dIG9mIHRoZSBFbnRpdHkgdG8gYmUgbG9jYXRlZC5cclxuICBAcGFyYW0gdHlwZSAtIFRoZSBbW0VudGl0eVR5cGVdXSBmb3IgdGhpcyBrZXkuXHJcbiAgQHBhcmFtIHR5cGVOYW1lIC0gVGhlIEVudGl0eVR5cGUgbmFtZSBmb3IgdGhpcyBrZXkuXHJcbiAgQHBhcmFtIGtleVZhbHVlcyAtIFRoZSB2YWx1ZXMgZm9yIHRoaXMga2V5IC0gd2lsbCB1c3VhbGx5IGp1c3QgYmUgYSBzaW5nbGUgdmFsdWU7IGFuIGFycmF5IGlzIG9ubHkgbmVlZGVkIGZvciBtdWx0aXBhcnQga2V5cy4gIFxyXG4gIEByZXR1cm4gQW4gRW50aXR5IG9yIG51bGw7XHJcbiAgKiovXHJcbiAgZ2V0RW50aXR5QnlLZXkoLi4uYXJnczogYW55W10pIHtcclxuICAgIGxldCBlbnRpdHlLZXkgPSBjcmVhdGVFbnRpdHlLZXkodGhpcywgYXJncykuZW50aXR5S2V5O1xyXG4gICAgbGV0IGVudGl0eVR5cGVzID0gZW50aXR5S2V5Ll9zdWJ0eXBlcyB8fCBbZW50aXR5S2V5LmVudGl0eVR5cGVdO1xyXG4gICAgbGV0IGU6IEVudGl0eSB8IHVuZGVmaW5lZDtcclxuICAgIC8vIGhhY2sgdXNlIG9mIHNvbWUgdG8gc2ltdWxhdGUgbWFwRmlyc3QgbG9naWMuXHJcbiAgICBlbnRpdHlUeXBlcy5zb21lKChldCkgPT4ge1xyXG4gICAgICBsZXQgZ3JvdXAgPSB0aGlzLl9maW5kRW50aXR5R3JvdXAoZXQpO1xyXG4gICAgICAvLyBncm91cCB2ZXJzaW9uIG9mIGZpbmRFbnRpdHlCeUtleSBkb2Vzbid0IGNhcmUgYWJvdXQgZW50aXR5VHlwZVxyXG4gICAgICBlID0gZ3JvdXAgJiYgZ3JvdXAuZmluZEVudGl0eUJ5S2V5KGVudGl0eUtleSk7XHJcbiAgICAgIHJldHVybiBlICE9IG51bGw7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBlIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBmZXRjaEVudGl0eUJ5S2V5KHR5cGVOYW1lOiBzdHJpbmcsIGtleVZhbHVlczogYW55IHwgYW55W10sIGNoZWNrTG9jYWxDYWNoZUZpcnN0PzogYm9vbGVhbik6IFByb21pc2U8SUVudGl0eUJ5S2V5UmVzdWx0PjtcclxuICBmZXRjaEVudGl0eUJ5S2V5KGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGtleVZhbHVlczogYW55IHwgYW55W10sIGNoZWNrTG9jYWxDYWNoZUZpcnN0PzogYm9vbGVhbik6IFByb21pc2U8SUVudGl0eUJ5S2V5UmVzdWx0PjtcclxuICBmZXRjaEVudGl0eUJ5S2V5KGVudGl0eUtleTogRW50aXR5S2V5LCBjaGVja0xvY2FsQ2FjaGVGaXJzdD86IGJvb2xlYW4pOiBQcm9taXNlPElFbnRpdHlCeUtleVJlc3VsdD47XHJcbiAgLyoqXHJcbiAgQXR0ZW1wdHMgdG8gZmV0Y2ggYW4gZW50aXR5IGZyb20gdGhlIHNlcnZlciBieSBpdHMgW1tFbnRpdHlLZXldXSB3aXRoXHJcbiAgYW4gb3B0aW9uIHRvIGNoZWNrIHRoZSBsb2NhbCBjYWNoZSBmaXJzdC4gTm90ZSB0aGUgdGhpcyBFbnRpdHlNYW5hZ2VyJ3MgcXVlcnlPcHRpb25zLm1lcmdlU3RyYXRlZ3lcclxuICB3aWxsIGJlIHVzZWQgdG8gbWVyZ2UgYW55IHNlcnZlciBzaWRlIGVudGl0eSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC5cclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICBsZXQgZW1wbG95ZWVUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkVtcGxveWVlXCIpO1xyXG4gID4gICAgIGxldCBlbXBsb3llZUtleSA9IG5ldyBFbnRpdHlLZXkoZW1wbG95ZWVUeXBlLCAxKTtcclxuICA+ICAgICBlbTEuZmV0Y2hFbnRpdHlCeUtleShlbXBsb3llZUtleSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuICA+ICAgICAgIGxldCBlbXBsb3llZSA9IHJlc3VsdC5lbnRpdHk7XHJcbiAgPiAgICAgICBsZXQgZW50aXR5S2V5ID0gcmVzdWx0LmVudGl0eUtleTtcclxuICA+ICAgICAgIGxldCBmcm9tQ2FjaGUgPSByZXN1bHQuZnJvbUNhY2hlO1xyXG4gID4gICAgIH0pO1xyXG4gIEBwYXJhbSB0eXBlTmFtZSAgLSBUaGUgRW50aXR5VHlwZSBuYW1lIGZvciB0aGlzIGtleS5cclxuICBAcGFyYW0gZW50aXR5VHlwZSAgLSBUaGUgRW50aXR5VHlwZSBmb3IgdGhpcyBrZXkuXHJcbiAgQHBhcmFtIGtleVZhbHVlcyAtIFRoZSB2YWx1ZXMgZm9yIHRoaXMga2V5IC0gd2lsbCB1c3VhbGx5IGp1c3QgYmUgYSBzaW5nbGUgdmFsdWU7IGFuIGFycmF5IGlzIG9ubHkgbmVlZGVkIGZvciBtdWx0aXBhcnQga2V5cy5cclxuICBAcGFyYW0gZW50aXR5S2V5IC0gVGhlIFtbRW50aXR5S2V5XV0gb2YgdGhlIEVudGl0eSB0byBiZSBsb2NhdGVkLlxyXG4gIEBwYXJhbSBjaGVja0xvY2FsQ2FjaGVGaXJzdCAtIChkZWZhdWx0ID0gZmFsc2UpIC0gV2hldGhlciB0byBjaGVjayB0aGlzIEVudGl0eU1hbmFnZXIgZmlyc3QgYmVmb3JlIGdvaW5nIHRvIHRoZSBzZXJ2ZXIuIEJ5IGRlZmF1bHQsIHRoZSBxdWVyeSB3aWxsIE5PVCBkbyB0aGlzLlxyXG4gIEByZXR1cm4ge1Byb21pc2V9XHJcbiAgICAtIFByb3BlcnRpZXMgb24gdGhlIHByb21pc2Ugc3VjY2VzcyByZXN1bHRcclxuICAgICAgLSBlbnRpdHkge09iamVjdH0gVGhlIGVudGl0eSByZXR1cm5lZCBvciBudWxsXHJcbiAgICAgIC0gZW50aXR5S2V5IHtFbnRpdHlLZXl9IFRoZSBlbnRpdHlLZXkgb2YgdGhlIGVudGl0eSB0byBmZXRjaC5cclxuICAgICAgLSBmcm9tQ2FjaGUge0Jvb2xlYW59IFdoZXRoZXIgdGhpcyBlbnRpdHkgd2FzIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyIG9yIHdhcyBmb3VuZCBpbiB0aGUgbG9jYWwgY2FjaGUuXHJcbiAgKiovXHJcbiAgZmV0Y2hFbnRpdHlCeUtleSguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IGRhdGFTZXJ2aWNlID0gRGF0YVNlcnZpY2UucmVzb2x2ZShbdGhpcy5kYXRhU2VydmljZV0pO1xyXG4gICAgaWYgKCghZGF0YVNlcnZpY2UuaGFzU2VydmVyTWV0YWRhdGEpIHx8IHRoaXMubWV0YWRhdGFTdG9yZS5oYXNNZXRhZGF0YUZvcihkYXRhU2VydmljZS5zZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgcmV0dXJuIGZldGNoRW50aXR5QnlLZXlDb3JlKHRoaXMsIGFyZ3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hNZXRhZGF0YShkYXRhU2VydmljZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZldGNoRW50aXR5QnlLZXlDb3JlKHRoaXMsIGFyZ3MpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFtEZXByZWNhdGVkXSAtIEF0dGVtcHRzIHRvIGxvY2F0ZSBhbiBlbnRpdHkgd2l0aGluIHRoaXMgRW50aXR5TWFuYWdlciBieSBpdHMgIFtbRW50aXR5S2V5XV0uXHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgbGV0IGVtcGxveWVlVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJFbXBsb3llZVwiKTtcclxuICA+ICAgICBsZXQgZW1wbG95ZWVLZXkgPSBuZXcgRW50aXR5S2V5KGVtcGxveWVlVHlwZSwgMSk7XHJcbiAgPiAgICAgbGV0IGVtcGxveWVlID0gZW0xLmZpbmRFbnRpdHlCeUtleShlbXBsb3llZUtleSk7XHJcbiAgPiAgICAgLy8gZW1wbG95ZWUgd2lsbCBlaXRoZXIgYmUgYW4gZW50aXR5IG9yIG51bGwuXHJcbiAgQGRlcHJlY2F0ZWQgICAgVXNlIGdldEVudGl0eUJ5S2V5IGluc3RlYWRcclxuICBAcGFyYW0gZW50aXR5S2V5IC0gVGhlICBbW0VudGl0eUtleV1dIG9mIHRoZSBFbnRpdHkgdG8gYmUgbG9jYXRlZC5cclxuICBAcmV0dXJuIEFuIEVudGl0eSBvciBudWxsO1xyXG4gICoqL1xyXG4gIGZpbmRFbnRpdHlCeUtleShlbnRpdHlLZXk6IEVudGl0eUtleSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW50aXR5QnlLZXkoZW50aXR5S2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEdlbmVyYXRlcyBhIHRlbXBvcmFyeSBrZXkgZm9yIHRoZSBzcGVjaWZpZWQgZW50aXR5LiAgVGhpcyBpcyB1c2VkIHRvIGluc3VyZSB0aGF0IG5ld2x5XHJcbiAgY3JlYXRlZCBlbnRpdGllcyBoYXZlIHVuaXF1ZSBrZXlzIGFuZCB0byByZWdpc3RlciB0aGF0IHRoZXNlIGtleXMgYXJlIHRlbXBvcmFyeSBhbmRcclxuICBuZWVkIHRvIGJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCAncmVhbCcga2V5IHZhbHVlcyBvbmNlIHRoZXNlIGVudGl0aWVzIGFyZSBzYXZlZC5cclxuICBcclxuICBUaGUgW1tFbnRpdHlNYW5hZ2VyLmtleUdlbmVyYXRvckN0b3JdXSBwcm9wZXJ0eSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhpcyBtZXRob2QgdG8gYWN0dWFsbHkgZ2VuZXJhdGVcclxuICB0aGUga2V5cyAtIFNlZSB0aGUgIEtleUdlbmVyYXRvciBpbnRlcmZhY2UgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIHRvIHNlZVxyXG4gIGhvdyBhIGN1c3RvbSBrZXkgZ2VuZXJhdG9yIGNhbiBiZSBwbHVnZ2VkIGluLlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgICBsZXQgY3VzdG9tZXIgPSBjdXN0VHlwZS5jcmVhdGVFbnRpdHkoKTtcclxuICA+ICAgICAgbGV0IGN1c3RvbWVySWQgPSBlbS5nZW5lcmF0ZVRlbXBLZXlWYWx1ZShjdXN0b21lcik7XHJcbiAgPiAgICAgIC8vIFRoZSAnY3VzdG9tZXInIGVudGl0eSAnQ3VzdG9tZXJJRCcgcHJvcGVydHkgaXMgbm93IHNldCB0byBhIG5ld2x5IGdlbmVyYXRlZCB1bmlxdWUgaWQgdmFsdWVcclxuICA+ICAgICAgLy8gVGhpcyBwcm9wZXJ0eSB3aWxsIGNoYW5nZSBhZ2FpbiBhZnRlciBhIHN1Y2Nlc3NmdWwgc2F2ZSBvZiB0aGUgJ2N1c3RvbWVyJyBlbnRpdHkuXHJcbiAgPiAgXHJcbiAgPiAgICAgIGVtMS5zYXZlQ2hhbmdlcygpLnRoZW4oIGZ1bmN0aW9uKCBkYXRhKSB7XHJcbiAgPiAgICAgICAgICBsZXQgc2FtZUN1c3QxID0gZGF0YS5yZXN1bHRzWzBdO1xyXG4gID4gICAgICAgICAgLy8gY3VzdDEgPT09IHNhbWVDdXN0MTtcclxuICA+ICAgICAgICAgIC8vIGJ1dCBjdXN0MS5nZXRQcm9wZXJ0eShcIkN1c3RvbWVySWRcIikgIT0gY3VzdG9tZXJJZFxyXG4gID4gICAgICAgICAgLy8gYmVjYXVzZSB0aGUgc2VydmVyIHdpbGwgaGF2ZSBnZW5lcmF0ZWQgYSBuZXcgaWRcclxuICA+ICAgICAgICAgIC8vIGFuZCB0aGUgY2xpZW50IHdpbGwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCB0aGlzXHJcbiAgPiAgICAgICAgICAvLyBuZXcgaWQuXHJcbiAgPiAgICAgIH0pXHJcbiAgQHBhcmFtIGVudGl0eSAtIFRoZSBFbnRpdHkgdG8gZ2VuZXJhdGUgYSBrZXkgZm9yLlxyXG4gIEByZXR1cm4gVGhlIG5ldyBrZXkgdmFsdWVcclxuICAqKi9cclxuICBnZW5lcmF0ZVRlbXBLZXlWYWx1ZShlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgLy8gVE9ETyAtIGNoZWNrIGlmIHRoaXMgZW50aXR5IGlzIGF0dGFjaGVkIHRvIHRoaXMgRW50aXR5TWFuYWdlci5cclxuICAgIGFzc2VydFBhcmFtKGVudGl0eSwgXCJlbnRpdHlcIikuaXNFbnRpdHkoKS5jaGVjaygpO1xyXG4gICAgbGV0IGVudGl0eVR5cGUgPSBlbnRpdHkuZW50aXR5VHlwZTtcclxuICAgIGxldCBuZXh0S2V5VmFsdWUgPSB0aGlzLmtleUdlbmVyYXRvci5nZW5lcmF0ZVRlbXBLZXlWYWx1ZShlbnRpdHlUeXBlKTtcclxuICAgIGxldCBrZXlQcm9wID0gZW50aXR5VHlwZS5rZXlQcm9wZXJ0aWVzWzBdO1xyXG4gICAgZW50aXR5LnNldFByb3BlcnR5KGtleVByb3AubmFtZSwgbmV4dEtleVZhbHVlKTtcclxuICAgIGVudGl0eS5lbnRpdHlBc3BlY3QuaGFzVGVtcEtleSA9IHRydWU7XHJcbiAgICByZXR1cm4gbmV4dEtleVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaGFzQ2hhbmdlcygpOiBib29sZWFuO1xyXG4gIGhhc0NoYW5nZXMoZW50aXR5VHlwZU5hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW47XHJcbiAgaGFzQ2hhbmdlcyhlbnRpdHlUeXBlczogRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSk6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgUmV0dXJucyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY2hhbmdlZCBlbnRpdGllcyBvZiB0aGUgc3BlY2lmaWVkIFtbRW50aXR5VHlwZV1dcy4gQSAnY2hhbmdlZCcgRW50aXR5IGhhc1xyXG4gIGhhcyBhbiBbW0VudGl0eVN0YXRlXV0gb2YgZWl0aGVyIEFkZGVkLCBNb2RpZmllZCBvciBEZWxldGVkLlxyXG5cclxuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gRW50aXR5TWFuYWdlciBoYXMgYW55IGNoYW5nZXNcclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGlmICggZW0xLmhhc0NoYW5nZXMoKSB7XHJcbiAgPiAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgaW50ZXJlc3RpbmdcclxuICA+ICAgICAgfVxyXG5cclxuICBvciBpZiBpdCBoYXMgYW55IGNoYW5nZXMgb24gdG8gYSBzcGVjaWZpYyBbW0VudGl0eVR5cGVdXS5cclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGxldCBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICA+ICAgICAgaWYgKCBlbTEuaGFzQ2hhbmdlcyhjdXN0VHlwZSkge1xyXG4gID4gICAgICAgICAgLy8gZG8gc29tZXRoaW5nIGludGVyZXN0aW5nXHJcbiAgPiAgICAgIH1cclxuXHJcbiAgb3IgdG8gYSBjb2xsZWN0aW9uIG9mIFtbRW50aXR5VHlwZV1dc1xyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgICBsZXQgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gID4gICAgICBpZiAoIGVtMS5oYXNDaGFuZ2VzKCBbY3VzdFR5cGUsIG9yZGVyVHlwZV0pIHtcclxuICA+ICAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBpbnRlcmVzdGluZ1xyXG4gID4gICAgICB9XHJcbiAgQHBhcmFtIGVudGl0eVR5cGVzIC0gVGhlIFtbRW50aXR5VHlwZV1dIG9yIEVudGl0eVR5cGVzIGZvciB3aGljaCAnY2hhbmdlZCcgZW50aXRpZXMgd2lsbCBiZSBmb3VuZC5cclxuICBAcGFyYW0gZW50aXR5VHlwZU5hbWVzIC0gVGhlIFtbRW50aXR5VHlwZV1dIG5hbWUgb3IgbmFtZXMgZm9yIHdoaWNoICdjaGFuZ2VkJyBlbnRpdGllcyB3aWxsIGJlIGZvdW5kLlxyXG4gIEByZXR1cm4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNoYW5nZWQgZW50aXRpZXMgdGhhdCBtYXRjaCB0aGUgdHlwZXMgc3BlY2lmaWVkLi5cclxuICAqKi9cclxuICBoYXNDaGFuZ2VzKGVudGl0eVR5cGVzPzogRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSB8IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICBpZiAoIXRoaXMuX2hhc0NoYW5nZXMpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChlbnRpdHlUeXBlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5faGFzQ2hhbmdlcztcclxuICAgIHJldHVybiB0aGlzLl9oYXNDaGFuZ2VzQ29yZShlbnRpdHlUeXBlcyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgLy8gYmFja2Rvb3IgdG8gXCJyZWFsbHlcIiBjaGVjayBmb3IgY2hhbmdlcy5cclxuICBfaGFzQ2hhbmdlc0NvcmUoZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdIHwgc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIGxldCBldHMgPSBjaGVja0VudGl0eVR5cGVzKHRoaXMsIGVudGl0eVR5cGVzKTtcclxuICAgIGxldCBlbnRpdHlHcm91cHMgPSBnZXRFbnRpdHlHcm91cHModGhpcywgZXRzKTtcclxuICAgIHJldHVybiBlbnRpdHlHcm91cHMuc29tZShmdW5jdGlvbiAoZWcpIHtcclxuICAgICAgcmV0dXJuIGVnICYmIGVnLmhhc0NoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2hhbmdlcygpOiBFbnRpdHlbXTtcclxuICBnZXRDaGFuZ2VzKGVudGl0eVR5cGVOYW1lczogc3RyaW5nIHwgc3RyaW5nW10pOiBFbnRpdHlbXTtcclxuICBnZXRDaGFuZ2VzKGVudGl0eVR5cGVzOiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdKTogRW50aXR5W107XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGFycmF5IG9mIGFsbCBjaGFuZ2VkIGVudGl0aWVzIG9mIHRoZSBzcGVjaWZpZWQgW1tFbnRpdHlUeXBlXV1zLiBBICdjaGFuZ2VkJyBFbnRpdHkgaGFzXHJcbiAgaGFzIGFuIFtbRW50aXR5U3RhdGVdXSBvZiBlaXRoZXIgQWRkZWQsIE1vZGlmaWVkIG9yIERlbGV0ZWQuXHJcbiAgXHJcbiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IGFsbCBvZiB0aGUgY2hhbmdlZCBlbnRpdGllcyB3aXRoaW4gYW4gRW50aXR5TWFuYWdlclxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGNoYW5nZWRFbnRpdGllcyA9IGVtMS5nZXRDaGFuZ2VzKCk7XHJcblxyXG4gIG9yIHlvdSBjYW4gc3BlY2lmeSB0aGF0IHlvdSBvbmx5IHdhbnQgdGhlIGNoYW5nZXMgb24gYSBzcGVjaWZpYyBbW0VudGl0eVR5cGVdXVxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgICBsZXQgY2hhbmdlZEN1c3RvbWVycyA9IGVtMS5nZXRDaGFuZ2VzKGN1c3RUeXBlKTtcclxuXHJcbiAgb3IgdG8gYSBjb2xsZWN0aW9uIG9mIFtbRW50aXR5VHlwZV1dc1xyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gID4gICAgICBsZXQgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gID4gICAgICBsZXQgY2hhbmdlZEN1c3RvbWVyc0FuZE9yZGVycyA9IGVtMS5nZXRDaGFuZ2VzKFtjdXN0VHlwZSwgb3JkZXJUeXBlXSk7XHJcbiAgQHBhcmFtIGVudGl0eVR5cGVzIC0gVGhlIFtbRW50aXR5VHlwZV1dIG9yIEVudGl0eVR5cGVzIGZvciB3aGljaCAnY2hhbmdlZCcgZW50aXRpZXMgd2lsbCBiZSBmb3VuZC5cclxuICBAcGFyYW0gZW50aXR5VHlwZU5hbWVzIC0gVGhlIFtbRW50aXR5VHlwZV1dIG5hbWUgb3IgbmFtZXMgZm9yIHdoaWNoICdjaGFuZ2VkJyBlbnRpdGllcyB3aWxsIGJlIGZvdW5kLlxyXG4gIEByZXR1cm4gQW4gYXJyYXkgb2YgRW50aXRpZXNcclxuICAqKi9cclxuICBnZXRDaGFuZ2VzKGVudGl0eVR5cGVzPzogRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSB8IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgZXRzID0gY2hlY2tFbnRpdHlUeXBlcyh0aGlzLCBlbnRpdHlUeXBlcyk7XHJcbiAgICByZXR1cm4gZ2V0Q2hhbmdlc0NvcmUodGhpcywgZXRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJlamVjdHMgKHJldmVyc2VzIHRoZSBlZmZlY3RzKSBhbGwgb2YgdGhlIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucyBhbmQgZGVsZXRlcyBmcm9tIHRoaXMgRW50aXR5TWFuYWdlci5cclxuICBDYWxscyBbW0VudGl0eUFzcGVjdC5yZWplY3RDaGFuZ2VzXV0gb24gZXZlcnkgY2hhbmdlZCBlbnRpdHkgaW4gdGhpcyBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0xIGlzIGFuIEVudGl0eU1hbmFnZXIgY29udGFpbmluZyBhIG51bWJlciBvZiBwcmVleGlzdGluZyBlbnRpdGllcy5cclxuICA+ICAgICAgbGV0IGVudGl0aWVzID0gZW0xLnJlamVjdENoYW5nZXMoKTtcclxuICBAcmV0dXJuIFRoZSBlbnRpdGllcyB3aG9zZSBjaGFuZ2VzIHdlcmUgcmVqZWN0ZWQuIFRoZXNlIGVudGl0aWVzIHdpbGwgYWxsIGhhdmUgRW50aXR5U3RhdGVzIG9mXHJcbiAgZWl0aGVyICdVbmNoYW5nZWQnIG9yICdEZXRhY2hlZCdcclxuICAqKi9cclxuICByZWplY3RDaGFuZ2VzKCkge1xyXG4gICAgaWYgKCF0aGlzLl9oYXNDaGFuZ2VzKSByZXR1cm4gW107XHJcbiAgICBsZXQgY2hhbmdlcyA9IGdldENoYW5nZXNDb3JlKHRoaXMpO1xyXG4gICAgLy8gbmV4dCBsaW5lIHN0b3BzIGluZGl2aWR1YWwgcmVqZWN0IGNoYW5nZXMgZnJvbSBlYWNoIGNhbGxpbmcgX2hhc0NoYW5nZXNDb3JlXHJcbiAgICBsZXQgYXNwZWN0cyA9IGNoYW5nZXMubWFwKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHJldHVybiBlLmVudGl0eUFzcGVjdC5fY2hlY2tPcGVyYXRpb24oXCJyZWplY3RDaGFuZ2VzXCIpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9oYXNDaGFuZ2VzID0gZmFsc2U7XHJcbiAgICBhc3BlY3RzLmZvckVhY2goZnVuY3Rpb24gKGFzcGVjdCkge1xyXG4gICAgICBhc3BlY3QucmVqZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmhhc0NoYW5nZXNDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlNYW5hZ2VyOiB0aGlzLCBoYXNDaGFuZ2VzOiBmYWxzZSB9KTtcclxuICAgIHJldHVybiBjaGFuZ2VzO1xyXG4gIH1cclxuXHJcbiAgZ2V0RW50aXRpZXMoZW50aXR5VHlwZU5hbWVzPzogc3RyaW5nIHwgc3RyaW5nW10sIGVudGl0eVN0YXRlcz86IEVudGl0eVN0YXRlIHwgRW50aXR5U3RhdGVbXSk6IEVudGl0eVtdO1xyXG4gIGdldEVudGl0aWVzKGVudGl0eVR5cGVzPzogRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSwgZW50aXR5U3RhdGVzPzogRW50aXR5U3RhdGUgfCBFbnRpdHlTdGF0ZVtdKTogRW50aXR5W107XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGFycmF5IG9mIGFsbCBlbnRpdGllcyBvZiB0aGUgc3BlY2lmaWVkIFtbRW50aXR5VHlwZV1dcyB3aXRoIHRoZSBzcGVjaWZpZWQgW1tFbnRpdHlTdGF0ZV1dcy5cclxuXHJcbiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IGFsbCBvZiB0aGUgZW50aXRpZXMgd2l0aGluIGFuIEVudGl0eU1hbmFnZXJcclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGxldCBlbnRpdGllcyA9IGVtMS5nZXRFbnRpdGllcygpO1xyXG5cclxuICBvciB5b3UgY2FuIHNwZWNpZnkgdGhhdCB5b3Ugb25seSB3YW50IHRoZSBjaGFuZ2VzIG9uIGEgc3BlY2lmaWMgW1tFbnRpdHlUeXBlXV1cclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGxldCBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICA+ICAgICAgbGV0IGN1c3RvbWVycyA9IGVtMS5nZXRFbnRpdGllcyhjdXN0VHlwZSk7XHJcblxyXG4gIG9yIHRvIGEgY29sbGVjdGlvbiBvZiBbW0VudGl0eVR5cGVdXXNcclxuICA+ICAgICAgLy8gYXNzdW1lIGVtMSBpcyBhbiBFbnRpdHlNYW5hZ2VyIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgcHJlZXhpc3RpbmcgZW50aXRpZXMuXHJcbiAgPiAgICAgIGxldCBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICA+ICAgICAgbGV0IG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICA+ICAgICAgbGV0IGN1c3RvbWVyc0FuZE9yZGVycyA9IGVtMS5nZXRDaGFuZ2VzKFtjdXN0VHlwZSwgb3JkZXJUeXBlXSk7XHJcblxyXG4gIFlvdSBjYW4gYWxzbyBhc2sgZm9yIGVudGl0aWVzIHdpdGggYSBwYXJ0aWN1bGFyIFtbRW50aXR5U3RhdGVdXSBvciBFbnRpdHlTdGF0ZXMuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbTEgaXMgYW4gRW50aXR5TWFuYWdlciBjb250YWluaW5nIGEgbnVtYmVyIG9mIHByZWV4aXN0aW5nIGVudGl0aWVzLlxyXG4gID4gICAgICBsZXQgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgPiAgICAgIGxldCBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgPiAgICAgIGxldCBhZGRlZEN1c3RvbWVyc0FuZE9yZGVycyA9IGVtMS5nZXRFbnRpdGllcyhbY3VzdFR5cGUsIG9yZGVyVHlwZV0sIEVudGl0eVN0YXRlLkFkZGVkKTtcclxuIFxyXG4gIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSAtIFRoZSBbW0VudGl0eVR5cGVdXSBuYW1lIG9yIG5hbWVzIGZvciB3aGljaCBlbnRpdGllcyB3aWxsIGJlIGZvdW5kLlxyXG4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIGFsbCBFbnRpdHlUeXBlcyBhcmUgc2VhcmNoZWQuICBcclxuICBAcGFyYW0gZW50aXR5VHlwZXMgLSBUaGUgW1tFbnRpdHlUeXBlXV0gb3IgRW50aXR5VHlwZXMgZm9yIHdoaWNoIGVudGl0aWVzIHdpbGwgYmUgZm91bmQuXHJcbiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgYWxsIEVudGl0eVR5cGVzIGFyZSBzZWFyY2hlZC4gXHJcbiAgQHBhcmFtIGVudGl0eVN0YXRlcyAtIFRoZSBbW0VudGl0eVN0YXRlXV1zIGZvciB3aGljaCBlbnRpdGllcyB3aWxsIGJlIGZvdW5kLlxyXG4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIGVudGl0aWVzIG9mIGFsbCBFbnRpdHlTdGF0ZXMgYXJlIHJldHVybmVkLlxyXG4gIEByZXR1cm4gQW4gYXJyYXkgb2YgRW50aXRpZXNcclxuICAqKi9cclxuICBnZXRFbnRpdGllcyhlbnRpdHlUeXBlcz86IEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10gfCBzdHJpbmcgfCBzdHJpbmdbXSwgZW50aXR5U3RhdGVzPzogRW50aXR5U3RhdGUgfCBFbnRpdHlTdGF0ZVtdKSB7XHJcbiAgICBsZXQgZW50VHlwZXMgPSBjaGVja0VudGl0eVR5cGVzKHRoaXMsIGVudGl0eVR5cGVzKTtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eVN0YXRlcywgXCJlbnRpdHlTdGF0ZXNcIikuaXNPcHRpb25hbCgpLmlzRW51bU9mKEVudGl0eVN0YXRlKS5vcigpLmlzTm9uRW1wdHlBcnJheSgpLmlzRW51bU9mKEVudGl0eVN0YXRlKS5jaGVjaygpO1xyXG5cclxuICAgIGxldCBzdGF0ZXMgPSB2YWxpZGF0ZUVudGl0eVN0YXRlcyh0aGlzLCBlbnRpdHlTdGF0ZXMpO1xyXG4gICAgcmV0dXJuIGdldEVudGl0aWVzQ29yZSh0aGlzLCBlbnRUeXBlcywgc3RhdGVzKTtcclxuICB9XHJcblxyXG5cclxuICAvLyBwcm90ZWN0ZWQgbWV0aG9kc1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9ub3RpZnlTdGF0ZUNoYW5nZShlbnRpdHk6IEVudGl0eSwgbmVlZHNTYXZlOiBib29sZWFuKSB7XHJcbiAgICBsZXQgZWNBcmdzID0geyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5FbnRpdHlTdGF0ZUNoYW5nZSwgZW50aXR5OiBlbnRpdHkgfTtcclxuXHJcbiAgICBpZiAobmVlZHNTYXZlKSB7XHJcbiAgICAgIGlmICghdGhpcy5faGFzQ2hhbmdlcykgdGhpcy5fc2V0SGFzQ2hhbmdlcyh0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGNhbGxlZCB3aGVuIHJlamVjdGluZyBhIGNoYW5nZSBvciBtZXJnaW5nIGFuIHVuY2hhbmdlZCByZWNvcmQuXHJcbiAgICAgIC8vIE5PVEU6IHRoaXMgY2FuIGJlIHNsb3cgd2l0aCBsb3RzIG9mIGVudGl0aWVzIGluIHRoZSBjYWNoZS5cclxuICAgICAgLy8gc28gZGVmZXIgaXQgZHVyaW5nIGEgcXVlcnkvaW1wb3J0IG9yIHNhdmUgYW5kIGNhbGwgaXQgb25jZSB3aGVuIGNvbXBsZXRlICggaWYgbmVlZGVkKS5cclxuICAgICAgaWYgKHRoaXMuX2hhc0NoYW5nZXMpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHtcclxuICAgICAgICAgIHRoaXMuX2hhc0NoYW5nZXNBY3Rpb24gPSB0aGlzLl9oYXNDaGFuZ2VzQWN0aW9uIHx8IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0SGFzQ2hhbmdlcyhudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goZWNBcmdzKTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2V0SGFzQ2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goZWNBcmdzKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9zZXRIYXNDaGFuZ2VzKGhhc0NoYW5nZXM/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoaGFzQ2hhbmdlcyA9PSBudWxsKSBoYXNDaGFuZ2VzID0gdGhpcy5faGFzQ2hhbmdlc0NvcmUoKTtcclxuICAgIGxldCBoYWRDaGFuZ2VzID0gdGhpcy5faGFzQ2hhbmdlcztcclxuICAgIHRoaXMuX2hhc0NoYW5nZXMgPSBoYXNDaGFuZ2VzO1xyXG4gICAgaWYgKGhhc0NoYW5nZXMgIT09IGhhZENoYW5nZXMpIHtcclxuICAgICAgdGhpcy5oYXNDaGFuZ2VzQ2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5TWFuYWdlcjogdGhpcywgaGFzQ2hhbmdlczogaGFzQ2hhbmdlcyB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hhc0NoYW5nZXNBY3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfbGlua1JlbGF0ZWRFbnRpdGllcyhlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgbGV0IGVtID0gdGhpcztcclxuICAgIGxldCBlbnRpdHlBc3BlY3QgPSBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gICAgLy8gd2UgZG8gbm90IHdhbnQgZW50aXR5U3RhdGUgdG8gY2hhbmdlIGFzIGEgcmVzdWx0IG9mIGxpbmthZ2UuXHJcbiAgICBjb3JlLnVzaW5nKGVtLCBcImlzTG9hZGluZ1wiLCB0cnVlLCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICBsZXQgdW5hdHRhY2hlZE1hcCA9IGVtLl91bmF0dGFjaGVkQ2hpbGRyZW5NYXA7XHJcbiAgICAgIGxldCBlbnRpdHlLZXkgPSBlbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgICAgIGxldCBlbnRpdHlUeXBlID0gZW50aXR5S2V5LmVudGl0eVR5cGU7XHJcblxyXG4gICAgICB3aGlsZSAoZW50aXR5VHlwZSkge1xyXG4gICAgICAgIGxldCBrZXlzdHJpbmcgPSBlbnRpdHlLZXkudG9TdHJpbmcoZW50aXR5VHlwZSk7XHJcblxyXG4gICAgICAgIC8vIGF0dGFjaCBhbnkgdW5hdHRhY2hlZENoaWxkcmVuXHJcbiAgICAgICAgbGV0IHR1cGxlcyA9IHVuYXR0YWNoZWRNYXAuZ2V0VHVwbGVzQnlTdHJpbmcoa2V5c3RyaW5nKTtcclxuICAgICAgICBpZiAodHVwbGVzKSB7XHJcbiAgICAgICAgICB0dXBsZXMuc2xpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAodHBsKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgdW5hdHRhY2hlZENoaWxkcmVuID0gdHBsLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZSAhPT0gRW50aXR5U3RhdGUuRGV0YWNoZWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNoaWxkVG9QYXJlbnROcDogTmF2aWdhdGlvblByb3BlcnR5O1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50VG9DaGlsZE5wOiBOYXZpZ2F0aW9uUHJvcGVydHk7XHJcblxyXG4gICAgICAgICAgICAvLyBucCBpcyB1c3VhbGx5IGNoaWxkVG9QYXJlbnROcFxyXG4gICAgICAgICAgICAvLyBleGNlcHQgd2l0aCB1bmlkaXJlY3Rpb25hbCAxLW4gd2hlcmUgaXQgaXMgcGFyZW50VG9DaGlsZE5wO1xyXG4gICAgICAgICAgICBsZXQgbnAgPSB0cGwubmF2aWdhdGlvblByb3BlcnR5O1xyXG5cclxuICAgICAgICAgICAgbGV0IGludmVyc2VOcCA9IG5wLmludmVyc2U7XHJcbiAgICAgICAgICAgIGlmIChpbnZlcnNlTnApIHtcclxuICAgICAgICAgICAgICAvLyBiaWRpcmVjdGlvbmFsXHJcbiAgICAgICAgICAgICAgY2hpbGRUb1BhcmVudE5wID0gbnA7XHJcbiAgICAgICAgICAgICAgcGFyZW50VG9DaGlsZE5wID0gaW52ZXJzZU5wO1xyXG5cclxuICAgICAgICAgICAgICBpZiAocGFyZW50VG9DaGlsZE5wLmlzU2NhbGFyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb25seUNoaWxkID0gdW5hdHRhY2hlZENoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgZW50aXR5LnNldFByb3BlcnR5KHBhcmVudFRvQ2hpbGROcC5uYW1lLCBvbmx5Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgb25seUNoaWxkLnNldFByb3BlcnR5KGNoaWxkVG9QYXJlbnROcC5uYW1lLCBlbnRpdHkpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudENoaWxkcmVuID0gZW50aXR5LmdldFByb3BlcnR5KHBhcmVudFRvQ2hpbGROcC5uYW1lKTtcclxuICAgICAgICAgICAgICAgIHVuYXR0YWNoZWRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Q2hpbGRyZW4ucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgIGNoaWxkLnNldFByb3BlcnR5KGNoaWxkVG9QYXJlbnROcC5uYW1lLCBlbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHVuYXR0YWNoZWRNYXAucmVtb3ZlQ2hpbGRyZW4oa2V5c3RyaW5nLCBjaGlsZFRvUGFyZW50TnApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIHVuaWRpcmVjdGlvbmFsXHJcbiAgICAgICAgICAgICAgLy8gaWYgKG5wLmlzU2NhbGFyIHx8IG5wLnBhcmVudFR5cGUgIT09IGVudGl0eS5lbnRpdHlUeXBlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5wLmlzU2NhbGFyKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBuIC0+IDEgIGVnOiBjaGlsZDogT3JkZXJEZXRhaWwgcGFyZW50OiBQcm9kdWN0XHJcbiAgICAgICAgICAgICAgICAvLyAxIC0+IDEgZWcgY2hpbGQ6IEVtcGxveWVlIHBhcmVudDogRW1wbG95ZWUgKCBvbmx5IE1hbmFnZXIsIG5vIERpcmVjdFJlcG9ydHMgcHJvcGVydHkpXHJcbiAgICAgICAgICAgICAgICBjaGlsZFRvUGFyZW50TnAgPSBucDtcclxuICAgICAgICAgICAgICAgIHVuYXR0YWNoZWRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICBjaGlsZC5zZXRQcm9wZXJ0eShjaGlsZFRvUGFyZW50TnAubmFtZSwgZW50aXR5KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdW5hdHRhY2hlZE1hcC5yZW1vdmVDaGlsZHJlbihrZXlzdHJpbmcsIGNoaWxkVG9QYXJlbnROcCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIDEgLT4gbiAgZWc6IHBhcmVudDogUmVnaW9uIGNoaWxkOiBUZXJyXHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHJlbW92ZSB1bmF0dGFjaGVkIGNoaWxkcmVuIGZyb20gdGhlIG1hcCBhZnRlciB0aGlzOyBvbmx5IGEgcGVyZiBpc3N1ZS5cclxuICAgICAgICAgICAgICAgIHBhcmVudFRvQ2hpbGROcCA9IG5wO1xyXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRDaGlsZHJlbiA9IGVudGl0eS5nZXRQcm9wZXJ0eShwYXJlbnRUb0NoaWxkTnAubmFtZSk7XHJcbiAgICAgICAgICAgICAgICB1bmF0dGFjaGVkQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyBpZiBjYW4ndCBhbHJlYWR5IGJlIHRoZXJlLlxyXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Q2hpbGRyZW4uX3B1c2goY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZW50aXR5VHlwZSA9IGVudGl0eVR5cGUuYmFzZUVudGl0eVR5cGU7IC8vIGxvb2sgZm9yIHJlbGF0aW9uc2hpcHMgdXAgdGhlIGhpZXJhcmNoeVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gbm93IGFkZCB0byB1bmF0dGFjaGVkTWFwIGlmIG5lZWRlZC5cclxuICAgICAgZW50aXR5LmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAobnApIHtcclxuICAgICAgICBpZiAobnAuaXNTY2FsYXIpIHtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IGVudGl0eS5nZXRQcm9wZXJ0eShucC5uYW1lKTtcclxuICAgICAgICAgIC8vIHByb3BlcnR5IGlzIGFscmVhZHkgbGlua2VkIHVwXHJcbiAgICAgICAgICBpZiAodmFsdWUpIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZpcnN0IGRldGVybWluZSBpZiBucCBjb250YWlucyBhIHBhcmVudCBvciBjaGlsZFxyXG4gICAgICAgIC8vIGhhdmluZyBhIHBhcmVudEtleSBtZWFucyB0aGF0IHRoaXMgaXMgYSBjaGlsZFxyXG4gICAgICAgIC8vIGlmIGEgcGFyZW50IHRoZW4gbm8gbmVlZCBmb3IgbW9yZSB3b3JrIGJlY2F1c2UgY2hpbGRyZW4gd2lsbCBhdHRhY2ggdG8gaXQuXHJcbiAgICAgICAgbGV0IHBhcmVudEtleSA9IGVudGl0eUFzcGVjdC5nZXRQYXJlbnRLZXkobnApO1xyXG4gICAgICAgIGlmIChwYXJlbnRLZXkpIHtcclxuICAgICAgICAgIC8vIGNoZWNrIGZvciBlbXB0eSBrZXlzIC0gbWVhbmluZyB0aGF0IHBhcmVudCBpZCdzIGFyZSBub3QgeWV0IHNldC5cclxuICAgICAgICAgIGlmIChwYXJlbnRLZXkuX2lzRW1wdHkoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgLy8gaWYgYSBjaGlsZCAtIGxvb2sgZm9yIHBhcmVudCBpbiB0aGUgZW0gY2FjaGVcclxuICAgICAgICAgIGlmIChucC5pbnZGb3JlaWduS2V5TmFtZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIC8vIG5wIHJlbGF0ZXMgdG8gbm9uLVBLIHByb3BlcnR5IG9mIHBhcmVudCBlbnRpdHlcclxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkocGFyZW50S2V5LmVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSkud2hlcmUobnAuaW52Rm9yZWlnbktleU5hbWVzWzBdLCAnZXEnLCBwYXJlbnRLZXkudmFsdWVzWzBdKTtcclxuICAgICAgICAgICAgY29uc3QgcXJlc3VsdCA9IGVtLmV4ZWN1dGVRdWVyeUxvY2FsbHkocXVlcnkpO1xyXG4gICAgICAgICAgICBpZiAocXJlc3VsdC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gcXJlc3VsdFswXTtcclxuICAgICAgICAgICAgICBlbnRpdHkuc2V0UHJvcGVydHkobnAubmFtZSwgcGFyZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gbnAgcmVsYXRlcyB0byBQSyBvZiBwYXJlbnQgZW50aXR5XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBlbS5nZXRFbnRpdHlCeUtleShwYXJlbnRLZXkpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgZm91bmQgaG9vayBpdCB1cFxyXG4gICAgICAgICAgICAgIGVudGl0eS5zZXRQcm9wZXJ0eShucC5uYW1lLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIGVsc2UgYWRkIHBhcmVudCB0byB1bnJlc29sdmVkUGFyZW50TWFwO1xyXG4gICAgICAgICAgICAgIHVuYXR0YWNoZWRNYXAuYWRkQ2hpbGQocGFyZW50S2V5LCBucCwgZW50aXR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAobnAuaW52ZXJzZSAmJiBucC5pbnZlcnNlLmludkZvcmVpZ25LZXlOYW1lcy5sZW5ndGgpIHtcclxuICAgICAgICAgIC8vIG5wIHJlbGF0ZXMgdG8gbm9uLVBLIHByb3BlcnR5IG9mIHBhcmVudCBlbnRpdHk7IHF1ZXJ5IGVudGl0aWVzIGJ5IEZLXHJcbiAgICAgICAgICBjb25zdCBha1ZhbHVlID0gZW50aXR5LmdldFByb3BlcnR5KG5wLmludmVyc2UuaW52Rm9yZWlnbktleU5hbWVzWzBdKTtcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KG5wLmVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSkud2hlcmUobnAuaW52Rm9yZWlnbktleU5hbWVzWzBdLCAnZXEnLCBha1ZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHFyZXN1bHQgPSBlbS5leGVjdXRlUXVlcnlMb2NhbGx5KHF1ZXJ5KTtcclxuICAgICAgICAgIHFyZXN1bHQuZm9yRWFjaCgoY2hpbGQ6IEVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgICBjaGlsZC5zZXRQcm9wZXJ0eShucC5pbnZlcnNlLm5hbWUsIGVudGl0eSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gaGFuZGxlIHVuaWRpcmVjdGlvbmFsIDEteCB3aGVyZSB3ZSBzZXQgeC5ma1xyXG4gICAgICBlbnRpdHkuZW50aXR5VHlwZS5mb3JlaWduS2V5UHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChma1Byb3ApIHtcclxuICAgICAgICBsZXQgaW52TnAgPSBma1Byb3AuaW52ZXJzZU5hdmlnYXRpb25Qcm9wZXJ0eTtcclxuICAgICAgICBpZiAoIWludk5wKSByZXR1cm47XHJcbiAgICAgICAgLy8gdW5pZGlyZWN0aW9uYWwgZmsgcHJvcHMgb25seVxyXG4gICAgICAgIGxldCBma1ZhbHVlID0gZW50aXR5LmdldFByb3BlcnR5KGZrUHJvcC5uYW1lKTtcclxuICAgICAgICBsZXQgcGFyZW50S2V5ID0gbmV3IEVudGl0eUtleShpbnZOcC5wYXJlbnRUeXBlLCBbZmtWYWx1ZV0pO1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSBlbS5nZXRFbnRpdHlCeUtleShwYXJlbnRLZXkpO1xyXG5cclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICBpZiAoaW52TnAuaXNTY2FsYXIpIHtcclxuICAgICAgICAgICAgcGFyZW50LnNldFByb3BlcnR5KGludk5wLm5hbWUsIGVudGl0eSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZW0uaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgcGFyZW50LmdldFByb3BlcnR5KGludk5wLm5hbWUpLl9wdXNoKGVudGl0eSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcGFyZW50LmdldFByb3BlcnR5KGludk5wLm5hbWUpLnB1c2goZW50aXR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBlbHNlIGFkZCBwYXJlbnQgdG8gdW5yZXNvbHZlZFBhcmVudE1hcDtcclxuICAgICAgICAgIHVuYXR0YWNoZWRNYXAuYWRkQ2hpbGQocGFyZW50S2V5LCBpbnZOcCwgZW50aXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2F0dGFjaEVudGl0eUNvcmUoZW50aXR5OiBFbnRpdHksIGVudGl0eVN0YXRlOiBFbnRpdHlTdGF0ZSwgbWVyZ2VTdHJhdGVneTogTWVyZ2VTdHJhdGVneSkge1xyXG4gICAgbGV0IGdyb3VwID0gZmluZE9yQ3JlYXRlRW50aXR5R3JvdXAodGhpcywgZW50aXR5LmVudGl0eVR5cGUpO1xyXG4gICAgbGV0IGF0dGFjaGVkRW50aXR5ID0gZ3JvdXAuYXR0YWNoRW50aXR5KGVudGl0eSwgZW50aXR5U3RhdGUsIG1lcmdlU3RyYXRlZ3kpO1xyXG4gICAgdGhpcy5fbGlua1JlbGF0ZWRFbnRpdGllcyhhdHRhY2hlZEVudGl0eSk7XHJcbiAgICByZXR1cm4gYXR0YWNoZWRFbnRpdHk7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfdXBkYXRlRmtWYWwoZmtQcm9wOiBEYXRhUHJvcGVydHksIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcclxuICAgIGxldCBncm91cCA9IHRoaXMuX2VudGl0eUdyb3VwTWFwW2ZrUHJvcC5wYXJlbnRUeXBlLm5hbWVdO1xyXG4gICAgaWYgKCFncm91cCkgcmV0dXJuO1xyXG4gICAgZ3JvdXAuX3VwZGF0ZUZrVmFsKGZrUHJvcCwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcclxuICB9XHJcbn1cclxuXHJcbkVudGl0eU1hbmFnZXIucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkVudGl0eU1hbmFnZXJcIjtcclxuXHJcbkJyZWV6ZUV2ZW50LmJ1YmJsZUV2ZW50KEVudGl0eU1hbmFnZXIucHJvdG90eXBlKTtcclxuXHJcbmZ1bmN0aW9uIGNsZWFyU2VydmVyRXJyb3JzKGVudGl0aWVzOiBFbnRpdHlbXSkge1xyXG4gIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xyXG4gICAgbGV0IHNlcnZlcktleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsZXQgYXNwZWN0ID0gZW50aXR5LmVudGl0eUFzcGVjdDtcclxuICAgIGNvcmUub2JqZWN0Rm9yRWFjaChhc3BlY3QuX3ZhbGlkYXRpb25FcnJvcnMsIGZ1bmN0aW9uIChrZXksIHZlKSB7XHJcbiAgICAgIGlmICh2ZS5pc1NlcnZlckVycm9yKSBzZXJ2ZXJLZXlzLnB1c2goa2V5KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHNlcnZlcktleXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBhc3BlY3QuX3Byb2Nlc3NWYWxpZGF0aW9uT3BBbmRQdWJsaXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgc2VydmVyS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICBhc3BlY3QuX3JlbW92ZVZhbGlkYXRpb25FcnJvcihrZXkpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVFbnRpdHlFcnJvcnMoZW50aXRpZXM6IEVudGl0eVtdKSB7XHJcbiAgbGV0IGVudGl0eUVycm9yczogRW50aXR5RXJyb3JbXSA9IFtdO1xyXG4gIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xyXG4gICAgY29yZS5vYmplY3RGb3JFYWNoKGVudGl0eS5lbnRpdHlBc3BlY3QuX3ZhbGlkYXRpb25FcnJvcnMsIGZ1bmN0aW9uIChrZXksIHZlKSB7XHJcbiAgICAgIGxldCBjZmcgPSBjb3JlLmV4dGVuZCh7XHJcbiAgICAgICAgZW50aXR5OiBlbnRpdHksXHJcbiAgICAgICAgZXJyb3JOYW1lOiB2ZS52YWxpZGF0b3IubmFtZVxyXG4gICAgICB9LCB2ZSwgW1wiZXJyb3JNZXNzYWdlXCIsIFwicHJvcGVydHlOYW1lXCIsIFwiaXNTZXJ2ZXJFcnJvclwiLCBcImN1c3RvbVwiXSkgYXMgRW50aXR5RXJyb3I7XHJcbiAgICAgIGVudGl0eUVycm9ycy5wdXNoKGNmZyk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4gZW50aXR5RXJyb3JzO1xyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1NlcnZlckVycm9ycyhzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQsIHNhdmVFcnJvcjogU2F2ZUVycm9yRnJvbVNlcnZlcikge1xyXG4gIC8vIGNvbnZlcnRpbmcgSVNhdmVFcnJvckZyb21TZXJ2ZXIgLT4gSVNhdmVFcnJvclxyXG4gIGxldCBzZXJ2ZXJFcnJvcnMgPSBzYXZlRXJyb3IuZW50aXR5RXJyb3JzO1xyXG4gIGlmICghc2VydmVyRXJyb3JzKSByZXR1cm4gPFNhdmVFcnJvcj4gPGFueT4gc2F2ZUVycm9yO1xyXG4gIGxldCBlbnRpdHlNYW5hZ2VyID0gc2F2ZUNvbnRleHQuZW50aXR5TWFuYWdlcjtcclxuICBsZXQgbWV0YWRhdGFTdG9yZSA9IGVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZTtcclxuICBsZXQgZW50aXR5RXJyb3JzID0gc2VydmVyRXJyb3JzLm1hcCgoc2VycikgPT4ge1xyXG4gICAgbGV0IGVudGl0eTogRW50aXR5IHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgZW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZDtcclxuICAgIGlmIChzZXJyLmtleVZhbHVlcykge1xyXG4gICAgICBlbnRpdHlUeXBlID0gbWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUoc2Vyci5lbnRpdHlUeXBlTmFtZSkgYXMgRW50aXR5VHlwZTtcclxuICAgICAgbGV0IGVrZXkgPSBuZXcgRW50aXR5S2V5KGVudGl0eVR5cGUsIHNlcnIua2V5VmFsdWVzKTtcclxuICAgICAgZW50aXR5ID0gZW50aXR5TWFuYWdlci5nZXRFbnRpdHlCeUtleShla2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW50aXR5VHlwZSAmJiBlbnRpdHkpIHtcclxuICAgICAgbGV0IGNvbnRleHQgPSBzZXJyLnByb3BlcnR5TmFtZSA/XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBzZXJyLnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgIHByb3BlcnR5OiBlbnRpdHlUeXBlLmdldFByb3BlcnR5KHNlcnIucHJvcGVydHlOYW1lKVxyXG4gICAgICAgIH0gOiB7XHJcbiAgICAgICAgfTtcclxuICAgICAgbGV0IGtleSA9IFZhbGlkYXRpb25FcnJvci5nZXRLZXkoc2Vyci5lcnJvck5hbWUgfHwgc2Vyci5lcnJvck1lc3NhZ2UsIHNlcnIucHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgIGxldCB2ZSA9IG5ldyBWYWxpZGF0aW9uRXJyb3IobnVsbCwgY29udGV4dCwgc2Vyci5lcnJvck1lc3NhZ2UsIGtleSk7XHJcbiAgICAgIHZlLmlzU2VydmVyRXJyb3IgPSB0cnVlO1xyXG4gICAgICBlbnRpdHkuZW50aXR5QXNwZWN0LmFkZFZhbGlkYXRpb25FcnJvcih2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGVudGl0eUVycm9yID0gY29yZS5leHRlbmQoe1xyXG4gICAgICBlbnRpdHk6IGVudGl0eSxcclxuICAgICAgaXNTZXJ2ZXJFcnJvcjogdHJ1ZVxyXG4gICAgfSwgc2VyciwgW1wiZXJyb3JOYW1lXCIsIFwiZXJyb3JNZXNzYWdlXCIsIFwicHJvcGVydHlOYW1lXCIsIFwiY3VzdG9tXCJdKSBhcyBFbnRpdHlFcnJvcjtcclxuICAgIHJldHVybiBlbnRpdHlFcnJvcjtcclxuICB9KTtcclxuICAvLyBjb252ZXJ0aW5nIElTYXZlRXJyb3JGcm9tU2VydmVyIC0+IElTYXZlRXJyb3IgXHJcbiAgc2F2ZUVycm9yLmVudGl0eUVycm9ycyA9IGVudGl0eUVycm9ycyBhcyBhbnk7XHJcbiAgcmV0dXJuIDxTYXZlRXJyb3I+IDxhbnk+IHNhdmVFcnJvcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRW50aXR5QnlLZXlSZXN1bHQge1xyXG4gIGVudGl0eT86IEVudGl0eTtcclxuICBlbnRpdHlLZXk6IEVudGl0eUtleTtcclxuICBmcm9tQ2FjaGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZldGNoRW50aXR5QnlLZXlDb3JlKGVtOiBFbnRpdHlNYW5hZ2VyLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8SUVudGl0eUJ5S2V5UmVzdWx0PiB7XHJcbiAgbGV0IHRwbCA9IGNyZWF0ZUVudGl0eUtleShlbSwgYXJncyk7XHJcbiAgbGV0IGVudGl0eUtleSA9IHRwbC5lbnRpdHlLZXk7XHJcblxyXG4gIGxldCBjaGVja0xvY2FsQ2FjaGVGaXJzdCA9IHRwbC5yZW1haW5pbmdBcmdzLmxlbmd0aCA9PT0gMCA/IGZhbHNlIDogISF0cGwucmVtYWluaW5nQXJnc1swXTtcclxuICBsZXQgZW50aXR5OiBFbnRpdHkgfCBudWxsID0gbnVsbDtcclxuICBsZXQgZm91bmRJdCA9IGZhbHNlO1xyXG4gIGlmIChjaGVja0xvY2FsQ2FjaGVGaXJzdCkge1xyXG4gICAgZW50aXR5ID0gZW0uZ2V0RW50aXR5QnlLZXkoZW50aXR5S2V5KTtcclxuICAgIGZvdW5kSXQgPSBlbnRpdHkgIT0gbnVsbDtcclxuICAgIGlmIChlbnRpdHkgIT0gbnVsbCAmJlxyXG4gICAgICAvLyBudWxsIHRoZSBlbnRpdHkgaWYgaXQgaXMgZGVsZXRlZCBhbmQgd2Ugc2hvdWxkIGV4Y2x1ZGUgZGVsZXRlZCBlbnRpdGllc1xyXG4gICAgICAhZW0ucXVlcnlPcHRpb25zLmluY2x1ZGVEZWxldGVkICYmIGVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgZW50aXR5ID0gbnVsbDtcclxuICAgICAgLy8gYnV0IHJlc3VtZSBsb29raW5nIGlmIHdlJ2Qgb3ZlcndyaXRlIGRlbGV0ZWQgZW50aXR5IHdpdGggYSByZW1vdGUgZW50aXR5XHJcbiAgICAgIC8vIG5vdGU6IGVtLnF1ZXJ5T3B0aW9ucyBpcyBhbHdheXMgZnVsbHkgcmVzb2x2ZWQgYnkgbm93XHJcbiAgICAgIGZvdW5kSXQgPSBlbS5xdWVyeU9wdGlvbnMubWVyZ2VTdHJhdGVneSAhPT0gTWVyZ2VTdHJhdGVneS5PdmVyd3JpdGVDaGFuZ2VzO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoZm91bmRJdCkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGVudGl0eTogZW50aXR5IHx8IHVuZGVmaW5lZCwgZW50aXR5S2V5OiBlbnRpdHlLZXksIGZyb21DYWNoZTogdHJ1ZSB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIEVudGl0eVF1ZXJ5LmZyb21FbnRpdHlLZXkoZW50aXR5S2V5KS51c2luZyhlbSkuZXhlY3V0ZSgpLnRoZW4oZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICBlbnRpdHkgPSAoZGF0YS5yZXN1bHRzLmxlbmd0aCA9PT0gMCkgPyBudWxsIDogZGF0YS5yZXN1bHRzWzBdO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZW50aXR5OiBlbnRpdHkgfHwgdW5kZWZpbmVkLCBlbnRpdHlLZXk6IGVudGl0eUtleSwgZnJvbUNhY2hlOiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbi8vIHByaXZhdGUgZm5zXHJcblxyXG4vLyB0YWtlcyBpbiBlbnRpdHlUeXBlcyBhcyBlaXRoZXIgc3RyaW5ncyBvciBlbnRpdHlUeXBlcyBvciBhcnJheXMgb2YgZWl0aGVyXHJcbi8vIGFuZCByZXR1cm5zIGVpdGhlciBhbiBlbnRpdHlUeXBlIG9yIGFuIGFycmF5IG9mIGVudGl0eVR5cGVzIG9yIHRocm93cyBhbiBlcnJvclxyXG5mdW5jdGlvbiBjaGVja0VudGl0eVR5cGVzKGVtOiBFbnRpdHlNYW5hZ2VyLCBlbnRpdHlUeXBlcz86IEVudGl0eVR5cGUgfCBFbnRpdHlUeXBlW10gfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gIGFzc2VydFBhcmFtKGVudGl0eVR5cGVzLCBcImVudGl0eVR5cGVzXCIpLmlzU3RyaW5nKCkuaXNPcHRpb25hbCgpLm9yKCkuaXNOb25FbXB0eUFycmF5KCkuaXNTdHJpbmcoKVxyXG4gICAgLm9yKCkuaXNJbnN0YW5jZU9mKEVudGl0eVR5cGUpLm9yKCkuaXNOb25FbXB0eUFycmF5KCkuaXNJbnN0YW5jZU9mKEVudGl0eVR5cGUpLmNoZWNrKCk7XHJcbiAgbGV0IHJlc3VsdFR5cGVzOiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkO1xyXG4gIGlmICh0eXBlb2YgZW50aXR5VHlwZXMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgIHJlc3VsdFR5cGVzID0gZW0ubWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUoZW50aXR5VHlwZXMsIGZhbHNlKSBhcyAoRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSk7XHJcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudGl0eVR5cGVzKSAmJiB0eXBlb2YgZW50aXR5VHlwZXNbMF0gPT09IFwic3RyaW5nXCIpIHtcclxuICAgIHJlc3VsdFR5cGVzID0gKGVudGl0eVR5cGVzIGFzIHN0cmluZ1tdKS5tYXAoZnVuY3Rpb24gKGV0TmFtZSkge1xyXG4gICAgICByZXR1cm4gZW0ubWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUoZXROYW1lLCBmYWxzZSkgYXMgRW50aXR5VHlwZTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXN1bHRUeXBlcyA9IGVudGl0eVR5cGVzIGFzIChFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHRUeXBlcztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q2hhbmdlc0NvcmUoZW06IEVudGl0eU1hbmFnZXIsIGVudGl0eVR5cGVzPzogRW50aXR5VHlwZSB8IEVudGl0eVR5cGVbXSkge1xyXG4gIGxldCBlbnRpdHlHcm91cHMgPSBnZXRFbnRpdHlHcm91cHMoZW0sIGVudGl0eVR5cGVzKTtcclxuXHJcbiAgLy8gVE9ETzogdGhpbmsgYWJvdXQgd3JpdGluZyBhIGNvcmUubWFwTWFueSBtZXRob2QgaWYgd2Ugc2VlIG1vcmUgb2YgdGhlc2UuXHJcbiAgbGV0IHNlbGVjdGVkOiBFbnRpdHlbXSA9IFtdO1xyXG4gIGVudGl0eUdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uIChlZykge1xyXG4gICAgLy8gZWcgbWF5IGJlIHVuZGVmaW5lZCBvciBudWxsXHJcbiAgICBpZiAoIWVnKSByZXR1cm47XHJcbiAgICBsZXQgZW50aXRpZXMgPSBlZy5nZXRDaGFuZ2VzKCk7XHJcbiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoKSB7XHJcbiAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQuY29uY2F0KGVudGl0aWVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGVkID0gZW50aXRpZXM7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHNlbGVjdGVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRFbnRpdGllc0NvcmUoZW06IEVudGl0eU1hbmFnZXIsIGVudGl0eVR5cGVzOiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkLCBlbnRpdHlTdGF0ZXM6IEVudGl0eVN0YXRlW10pIHtcclxuICBsZXQgZW50aXR5R3JvdXBzID0gZ2V0RW50aXR5R3JvdXBzKGVtLCBlbnRpdHlUeXBlcyk7XHJcblxyXG4gIC8vIFRPRE86IHRoaW5rIGFib3V0IHdyaXRpbmcgYSBjb3JlLm1hcE1hbnkgbWV0aG9kIGlmIHdlIHNlZSBtb3JlIG9mIHRoZXNlLlxyXG4gIGxldCBzZWxlY3RlZDogRW50aXR5W10gPSBbXTtcclxuICBlbnRpdHlHcm91cHMuZm9yRWFjaChmdW5jdGlvbiAoZWcpIHtcclxuICAgIC8vIGVnIG1heSBiZSB1bmRlZmluZWQgb3IgbnVsbFxyXG4gICAgaWYgKCFlZykgcmV0dXJuO1xyXG4gICAgbGV0IGVudGl0aWVzID0gZWcuZ2V0RW50aXRpZXMoZW50aXR5U3RhdGVzKTtcclxuICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZC5jb25jYXQoZW50aXRpZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0ZWQgPSBlbnRpdGllcztcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gc2VsZWN0ZWQ7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBjcmVhdGVFbnRpdHlLZXkoZW06IEVudGl0eU1hbmFnZXIsIGFyZ3M6IGFueVtdKSB7XHJcbiAgdHJ5IHtcclxuICAgIGlmIChhcmdzWzBdIGluc3RhbmNlb2YgRW50aXR5S2V5KSB7XHJcbiAgICAgIHJldHVybiB7IGVudGl0eUtleTogYXJnc1swXSBhcyBFbnRpdHlLZXksIHJlbWFpbmluZ0FyZ3M6IGNvcmUuYXJyYXlTbGljZShhcmdzLCAxKSB9O1xyXG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgIGxldCBlbnRpdHlUeXBlID0gKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykgPyBlbS5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShhcmdzWzBdLCBmYWxzZSkgOiBhcmdzWzBdO1xyXG4gICAgICByZXR1cm4geyBlbnRpdHlLZXk6IG5ldyBFbnRpdHlLZXkoZW50aXR5VHlwZSwgYXJnc1sxXSksIHJlbWFpbmluZ0FyZ3M6IGNvcmUuYXJyYXlTbGljZShhcmdzLCAyKSB9O1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHsvKiB0aHJvdyBiZWxvdyAqL1xyXG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBzdXBwbHkgYW4gRW50aXR5S2V5IE9SIGFuIEVudGl0eVR5cGUgbmFtZSBvciBFbnRpdHlUeXBlIGZvbGxvd2VkIGJ5IGEga2V5IHZhbHVlIG9yIGFuIGFycmF5IG9mIGtleSB2YWx1ZXMuXCIpO1xyXG4gIH1cclxuICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IHN1cHBseSBhbiBFbnRpdHlLZXkgT1IgYW4gRW50aXR5VHlwZSBuYW1lIG9yIEVudGl0eVR5cGUgZm9sbG93ZWQgYnkgYSBrZXkgdmFsdWUgb3IgYW4gYXJyYXkgb2Yga2V5IHZhbHVlcy5cIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcmtJc0JlaW5nU2F2ZWQoZW50aXRpZXM6IEVudGl0eVtdLCBmbGFnOiBib29sZWFuKSB7XHJcbiAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XHJcbiAgICBlbnRpdHkuZW50aXR5QXNwZWN0LmlzQmVpbmdTYXZlZCA9IGZsYWc7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4cG9ydEVudGl0eUdyb3VwcyhlbTogRW50aXR5TWFuYWdlciwgZW50aXRpZXNPckVudGl0eVR5cGVzOiBFbnRpdHlbXSB8IEVudGl0eVR5cGVbXSB8IHN0cmluZ1tdKSB7XHJcbiAgbGV0IGVudGl0eUdyb3VwTWFwOiB7IFtpbmRleDogc3RyaW5nXTogRW50aXR5R3JvdXAgfTtcclxuICBsZXQgZmlyc3QgPSBlbnRpdGllc09yRW50aXR5VHlwZXMgJiYgZW50aXRpZXNPckVudGl0eVR5cGVzWzBdO1xyXG4gIC8vIGNoZWNrIGlmIGFycmF5XHJcbiAgaWYgKGZpcnN0KSB7XHJcbiAgICAvLyBncm91cCBlbnRpdGllcyBieSBlbnRpdHlUeXBlIGFuZFxyXG4gICAgLy8gY3JlYXRlICdncm91cHMnIHRoYXQgbG9vayBsaWtlIGVudGl0eUdyb3Vwcy5cclxuICAgIGVudGl0eUdyb3VwTWFwID0ge307XHJcbiAgICBpZiAoKGZpcnN0IGFzIGFueSkuZW50aXR5VHlwZSkge1xyXG4gICAgICBsZXQgZW50aXRpZXMgPSBlbnRpdGllc09yRW50aXR5VHlwZXMgYXMgRW50aXR5W107XHJcbiAgICAgIC8vIGFzc3VtZSBcImVudGl0aWVzXCIgaXMgYW4gYXJyYXkgb2YgZW50aXRpZXM7XHJcbiAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLkRldGFjaGVkKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZXhwb3J0IGFuIGVudGl0eSB3aXRoIGFuIEVudGl0eVN0YXRlIG9mICdEZXRhY2hlZCdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBncm91cCA9IGVudGl0eUdyb3VwTWFwW2UuZW50aXR5VHlwZS5uYW1lXTtcclxuICAgICAgICBpZiAoIWdyb3VwKSB7XHJcbiAgICAgICAgICBncm91cCA9IHt9IGFzIEVudGl0eUdyb3VwO1xyXG4gICAgICAgICAgZ3JvdXAuZW50aXR5VHlwZSA9IGUuZW50aXR5VHlwZTtcclxuICAgICAgICAgIGdyb3VwLl9lbnRpdGllcyA9IFtdO1xyXG4gICAgICAgICAgZW50aXR5R3JvdXBNYXBbZS5lbnRpdHlUeXBlLm5hbWVdID0gZ3JvdXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VwLl9lbnRpdGllcy5wdXNoKGUpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGFzc3VtZSBcImVudGl0aWVzXCIgaXMgYW4gYXJyYXkgb2YgRW50aXR5VHlwZXMgKG9yIG5hbWVzKVxyXG4gICAgICBsZXQgZW50aXR5VHlwZXMgPSBjaGVja0VudGl0eVR5cGVzKGVtLCBlbnRpdGllc09yRW50aXR5VHlwZXMgYXMgRW50aXR5VHlwZVtdIHwgc3RyaW5nW10pIGFzIEVudGl0eVR5cGVbXTtcclxuICAgICAgaWYgKGVudGl0eVR5cGVzICE9IG51bGwpIHtcclxuICAgICAgICBlbnRpdHlUeXBlcy5mb3JFYWNoKChldCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGdyb3VwID0gZW0uX2VudGl0eUdyb3VwTWFwW2V0Lm5hbWVdO1xyXG4gICAgICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLl9lbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZW50aXR5R3JvdXBNYXBbZXQubmFtZV0gPSBncm91cDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoZW50aXRpZXNPckVudGl0eVR5cGVzICYmIGVudGl0aWVzT3JFbnRpdHlUeXBlcy5sZW5ndGggPT09IDApIHtcclxuICAgIC8vIGVtcHR5IGFycmF5ID0gZXhwb3J0IG5vdGhpbmdcclxuICAgIGVudGl0eUdyb3VwTWFwID0ge307XHJcbiAgfSBlbHNlIHtcclxuICAgIGVudGl0eUdyb3VwTWFwID0gZW0uX2VudGl0eUdyb3VwTWFwO1xyXG4gIH1cclxuXHJcbiAgbGV0IHRlbXBLZXlzOiBJVGVtcEtleVtdID0gW107XHJcbiAgbGV0IG5ld0dyb3VwTWFwID0ge307XHJcbiAgY29yZS5vYmplY3RGb3JFYWNoKGVudGl0eUdyb3VwTWFwLCAoZW50aXR5VHlwZU5hbWUsIGVudGl0eUdyb3VwKSA9PiB7XHJcbiAgICBuZXdHcm91cE1hcFtlbnRpdHlUeXBlTmFtZV0gPSBleHBvcnRFbnRpdHlHcm91cChlbnRpdHlHcm91cCwgdGVtcEtleXMpO1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4geyBlbnRpdHlHcm91cE1hcDogbmV3R3JvdXBNYXAsIHRlbXBLZXlzOiB0ZW1wS2V5cyB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBleHBvcnRFbnRpdHlHcm91cChlbnRpdHlHcm91cDogRW50aXR5R3JvdXAsIHRlbXBLZXlzOiBJVGVtcEtleVtdKSB7XHJcbiAgbGV0IHJlc3VsdEdyb3VwID0ge30gYXMgeyBlbnRpdGllczogYW55W10gfTtcclxuICBsZXQgZW50aXR5VHlwZSA9IGVudGl0eUdyb3VwLmVudGl0eVR5cGU7XHJcbiAgbGV0IGRwcyA9IGVudGl0eVR5cGUuZGF0YVByb3BlcnRpZXM7XHJcbiAgbGV0IHNlcmlhbGl6ZXJGbiA9IGdldFNlcmlhbGl6ZXJGbihlbnRpdHlUeXBlKTtcclxuICBsZXQgcmF3RW50aXRpZXM6IGFueVtdID0gW107XHJcbiAgZW50aXR5R3JvdXAuX2VudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xyXG4gICAgaWYgKGVudGl0eSkge1xyXG4gICAgICBsZXQgcmF3RW50aXR5ID0gc3RydWN0dXJhbE9iamVjdFRvSnNvbihlbnRpdHksIGRwcywgc2VyaWFsaXplckZuLCB0ZW1wS2V5cyk7XHJcbiAgICAgIHJhd0VudGl0aWVzLnB1c2gocmF3RW50aXR5KTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXN1bHRHcm91cC5lbnRpdGllcyA9IHJhd0VudGl0aWVzO1xyXG4gIHJldHVybiByZXN1bHRHcm91cDtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RydWN0dXJhbE9iamVjdFRvSnNvbihzbzogU3RydWN0dXJhbE9iamVjdCwgZHBzOiBEYXRhUHJvcGVydHlbXSwgc2VyaWFsaXplckZuPzogKGRwOiBEYXRhUHJvcGVydHksIHZhbHVlOiBhbnkpID0+IGFueSwgdGVtcEtleXM/OiBJVGVtcEtleVtdKSB7XHJcblxyXG4gIGxldCByZXN1bHQgPSB7fTtcclxuICBkcHMuZm9yRWFjaChmdW5jdGlvbiAoZHApIHtcclxuICAgIGxldCBkcE5hbWUgPSBkcC5uYW1lO1xyXG4gICAgbGV0IHZhbHVlID0gc28uZ2V0UHJvcGVydHkoZHBOYW1lKTtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIGRwLmRlZmF1bHRWYWx1ZSA9PSBudWxsKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHZhbHVlICYmIGRwLmlzQ29tcGxleFByb3BlcnR5KSB7XHJcbiAgICAgIGxldCBjb0RwcyA9IChkcC5kYXRhVHlwZSBhcyBDb21wbGV4VHlwZSkuZGF0YVByb3BlcnRpZXM7XHJcbiAgICAgIHZhbHVlID0gY29yZS5tYXAodmFsdWUsIGZ1bmN0aW9uICh2OiBDb21wbGV4T2JqZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cnVjdHVyYWxPYmplY3RUb0pzb24odiwgY29EcHMsIHNlcmlhbGl6ZXJGbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUgPSBzZXJpYWxpemVyRm4gPyBzZXJpYWxpemVyRm4oZHAsIHZhbHVlKSA6IHZhbHVlO1xyXG4gICAgICBpZiAoZHAuaXNVbm1hcHBlZCkge1xyXG4gICAgICAgIHZhbHVlID0gY29yZS50b0pTT05TYWZlKHZhbHVlLCBjb3JlLnRvSlNPTlNhZmVSZXBsYWNlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICByZXN1bHRbZHBOYW1lXSA9IHZhbHVlO1xyXG4gIH0pO1xyXG5cclxuICAvLyBpZiAoc28uZW50aXR5QXNwZWN0KSB7XHJcbiAgaWYgKEVudGl0eUFzcGVjdC5pc0VudGl0eShzbykpIHtcclxuICAgIGxldCBhc3BlY3QgPSBzby5lbnRpdHlBc3BlY3Q7XHJcbiAgICBsZXQgZW50aXR5U3RhdGUgPSBhc3BlY3QuZW50aXR5U3RhdGU7XHJcbiAgICBsZXQgbmV3QXNwZWN0ID0ge1xyXG4gICAgICB0ZW1wTmF2UHJvcE5hbWVzOiBleHBvcnRUZW1wS2V5SW5mbyhhc3BlY3QsIHRlbXBLZXlzIHx8IFtdKSxcclxuICAgICAgZW50aXR5U3RhdGU6IGVudGl0eVN0YXRlLm5hbWVcclxuICAgIH0gYXMgYW55O1xyXG4gICAgaWYgKGFzcGVjdC5leHRyYU1ldGFkYXRhKSB7XHJcbiAgICAgIG5ld0FzcGVjdC5leHRyYU1ldGFkYXRhID0gYXNwZWN0LmV4dHJhTWV0YWRhdGE7XHJcbiAgICB9XHJcbiAgICBpZiAoZW50aXR5U3RhdGUuaXNNb2RpZmllZCgpIHx8IGVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSB7XHJcbiAgICAgIG5ld0FzcGVjdC5vcmlnaW5hbFZhbHVlc01hcCA9IGFzcGVjdC5vcmlnaW5hbFZhbHVlcztcclxuICAgIH1cclxuICAgIChyZXN1bHQgYXMgYW55KS5lbnRpdHlBc3BlY3QgPSBuZXdBc3BlY3Q7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBhc3BlY3QgPSBzby5jb21wbGV4QXNwZWN0O1xyXG4gICAgbGV0IG5ld0FzcGVjdCA9IHt9IGFzIGFueTtcclxuICAgIGlmIChhc3BlY3Qub3JpZ2luYWxWYWx1ZXMgJiYgIWNvcmUuaXNFbXB0eShhc3BlY3Qub3JpZ2luYWxWYWx1ZXMpKSB7XHJcbiAgICAgIG5ld0FzcGVjdC5vcmlnaW5hbFZhbHVlc01hcCA9IGFzcGVjdC5vcmlnaW5hbFZhbHVlcztcclxuICAgIH1cclxuXHJcbiAgICAocmVzdWx0IGFzIGFueSkuY29tcGxleEFzcGVjdCA9IG5ld0FzcGVjdDtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVGVtcEtleSB7XHJcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xyXG4gIHZhbHVlczogYW55W107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4cG9ydFRlbXBLZXlJbmZvKGVudGl0eUFzcGVjdDogRW50aXR5QXNwZWN0LCB0ZW1wS2V5czogSVRlbXBLZXlbXSkge1xyXG4gIGxldCBlbnRpdHkgPSBlbnRpdHlBc3BlY3QuZW50aXR5IGFzIEVudGl0eTtcclxuICBpZiAoZW50aXR5QXNwZWN0Lmhhc1RlbXBLZXkpIHtcclxuICAgIHRlbXBLZXlzLnB1c2goZW50aXR5QXNwZWN0LmdldEtleSgpLnRvSlNPTigpKTtcclxuICB9XHJcbiAgLy8gY3JlYXRlIG1hcCBmb3IgdGhpcyBlbnRpdHkgd2l0aCBmb3JlaWduS2V5cyB0aGF0IGFyZSAndGVtcG9yYXJ5J1xyXG4gIC8vIG1hcCAtPiBrZXk6IHRlbXBLZXksIHZhbHVlOiBma1Byb3BOYW1lXHJcbiAgbGV0IHRlbXBOYXZQcm9wTmFtZXM6IHN0cmluZ1tdID0gW107XHJcbiAgZW50aXR5LmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAobnApIHtcclxuICAgIGlmIChucC5yZWxhdGVkRGF0YVByb3BlcnRpZXMpIHtcclxuICAgICAgbGV0IHJlbGF0ZWRWYWx1ZSA9IGVudGl0eS5nZXRQcm9wZXJ0eShucC5uYW1lKTtcclxuICAgICAgaWYgKHJlbGF0ZWRWYWx1ZSAmJiByZWxhdGVkVmFsdWUuZW50aXR5QXNwZWN0Lmhhc1RlbXBLZXkpIHtcclxuICAgICAgICB0ZW1wTmF2UHJvcE5hbWVzLnB1c2gobnAubmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gdGVtcE5hdlByb3BOYW1lcztcclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0RW50aXR5R3JvdXAoZW50aXR5R3JvdXA6IEVudGl0eUdyb3VwLCBqc29uR3JvdXA6IHsgZW50aXRpZXM6IGFueVtdIH0sIGltcG9ydENvbmZpZzogSW1wb3J0Q29uZmlnRXh0KSB7XHJcblxyXG4gIGxldCB0ZW1wS2V5TWFwID0gaW1wb3J0Q29uZmlnLnRlbXBLZXlNYXA7XHJcbiAgbGV0IG1lcmdlQWRkcyA9ICEhaW1wb3J0Q29uZmlnLm1lcmdlQWRkcztcclxuXHJcbiAgbGV0IGVudGl0eVR5cGUgPSBlbnRpdHlHcm91cC5lbnRpdHlUeXBlO1xyXG4gIGxldCBtZXJnZVN0cmF0ZWd5ID0gaW1wb3J0Q29uZmlnLm1lcmdlU3RyYXRlZ3k7XHJcblxyXG4gIGxldCB0YXJnZXRFbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgbGV0IGVtID0gZW50aXR5R3JvdXAuZW50aXR5TWFuYWdlcjtcclxuICBsZXQgZW50aXR5Q2hhbmdlZCA9IGVtLmVudGl0eUNoYW5nZWQ7XHJcbiAgbGV0IGVudGl0aWVzVG9MaW5rOiBFbnRpdHlbXSA9IFtdO1xyXG4gIGxldCByYXdWYWx1ZUZuID0gRGF0YVByb3BlcnR5LmdldFJhd1ZhbHVlRnJvbUNsaWVudDtcclxuICBqc29uR3JvdXAuZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAocmF3RW50aXR5OiBhbnkpIHtcclxuICAgIGxldCBuZXdBc3BlY3QgPSByYXdFbnRpdHkuZW50aXR5QXNwZWN0O1xyXG5cclxuICAgIGxldCBlbnRpdHlLZXkgPSBlbnRpdHlUeXBlLmdldEVudGl0eUtleUZyb21SYXdFbnRpdHkocmF3RW50aXR5LCByYXdWYWx1ZUZuKTtcclxuICAgIGxldCBlbnRpdHlTdGF0ZSA9IEVudGl0eVN0YXRlLmZyb21OYW1lKG5ld0FzcGVjdC5lbnRpdHlTdGF0ZSkgYXMgRW50aXR5U3RhdGU7XHJcbiAgICBpZiAoIWVudGl0eVN0YXRlIHx8IGVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5EZXRhY2hlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IGVudGl0aWVzIHdpdGggYSBub24gZGV0YWNoZWQgZW50aXR5IHN0YXRlIG1heSBiZSBpbXBvcnRlZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWVyZ2UgaWYgcmF3IGVudGl0eSBpcyBpbiBjYWNoZSBVTkxFU1MgdGhpcyBpcyBhIG5ldyBlbnRpdHkgdy8gYSB0ZW1wIGtleVxyXG4gICAgLy8gQ2Fubm90IHNhZmVseSBtZXJnZSBzdWNoIGVudGl0aWVzIGV2ZW4gaWYgY291bGQgbWF0Y2ggdGVtcCBrZXkgdG8gYW4gZW50aXR5IGluIGNhY2hlLlxyXG4gICAgLy8gQ2FuIGVuYWJsZSBtZXJnZSBvZiBlbnRpdGllcyB3L3RlbXAga2V5IHVzaW5nIFwibWVyZ2VBZGRzXCIgLSB1c2UgYXQgeW91ciBvd24gcmlzayFcclxuICAgIGxldCBuZXdUZW1wS2V5ID0gIW1lcmdlQWRkcyAmJiBlbnRpdHlTdGF0ZS5pc0FkZGVkKCkgJiYgZ2V0TWFwcGVkS2V5KHRlbXBLZXlNYXAhLCBlbnRpdHlLZXkpO1xyXG4gICAgdGFyZ2V0RW50aXR5ID0gbmV3VGVtcEtleSA/IHVuZGVmaW5lZCA6IGVudGl0eUdyb3VwLmZpbmRFbnRpdHlCeUtleShlbnRpdHlLZXkpO1xyXG5cclxuICAgIGlmICh0YXJnZXRFbnRpdHkpIHtcclxuICAgICAgaWYgKG1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuU2tpcE1lcmdlKSB7XHJcbiAgICAgICAgLy8gZGVsaWJlcmF0ZSBmYWxsIHRocnVcclxuICAgICAgfSBlbHNlIGlmIChtZXJnZVN0cmF0ZWd5ID09PSBNZXJnZVN0cmF0ZWd5LkRpc2FsbG93ZWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIE1lcmdlU3RyYXRlZ3kgb2YgJ0Rpc2FsbG93ZWQnIHByZXZlbnRzIFwiICsgZW50aXR5S2V5LnRvU3RyaW5nKCkgKyBcIiBmcm9tIGJlaW5nIG1lcmdlZFwiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgdGFyZ2V0RW50aXR5U3RhdGUgPSB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gICAgICAgIGxldCB3YXNVbmNoYW5nZWQgPSB0YXJnZXRFbnRpdHlTdGF0ZS5pc1VuY2hhbmdlZCgpO1xyXG4gICAgICAgIGlmIChtZXJnZVN0cmF0ZWd5ID09PSBNZXJnZVN0cmF0ZWd5Lk92ZXJ3cml0ZUNoYW5nZXMgfHwgd2FzVW5jaGFuZ2VkKSB7XHJcbiAgICAgICAgICBlbnRpdHlUeXBlLl91cGRhdGVUYXJnZXRGcm9tUmF3KHRhcmdldEVudGl0eSwgcmF3RW50aXR5LCByYXdWYWx1ZUZuKTtcclxuICAgICAgICAgIHRhcmdldEVudGl0eS5lbnRpdHlBc3BlY3Quc2V0RW50aXR5U3RhdGUoZW50aXR5U3RhdGUpO1xyXG4gICAgICAgICAgZW50aXR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5QWN0aW9uOiBFbnRpdHlBY3Rpb24uTWVyZ2VPbkltcG9ydCwgZW50aXR5OiB0YXJnZXRFbnRpdHkgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YXJnZXRFbnRpdHkgPSBlbnRpdHlUeXBlLl9jcmVhdGVJbnN0YW5jZUNvcmUoKSBhcyBFbnRpdHk7XHJcbiAgICAgIGVudGl0eVR5cGUuX3VwZGF0ZVRhcmdldEZyb21SYXcodGFyZ2V0RW50aXR5LCByYXdFbnRpdHksIHJhd1ZhbHVlRm4pO1xyXG4gICAgICBpZiAobmV3VGVtcEtleSkge1xyXG4gICAgICAgIHRhcmdldEVudGl0eS5lbnRpdHlBc3BlY3QuaGFzVGVtcEtleSA9IHRydWU7XHJcbiAgICAgICAgLy8gZml4dXAgcGtcclxuICAgICAgICB0YXJnZXRFbnRpdHkuc2V0UHJvcGVydHkoZW50aXR5VHlwZS5rZXlQcm9wZXJ0aWVzWzBdLm5hbWUsIG5ld1RlbXBLZXkudmFsdWVzWzBdKTtcclxuXHJcbiAgICAgICAgLy8gZml4dXAgZm9yZWlnbiBrZXlzXHJcbiAgICAgICAgLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdGhlIGVudGl0eSBpcyBkZXRhY2hlZCBoZXJlIGFuZCB0aGVyZWZvcmUgb3JpZ2luYWxWYWx1ZXMgd2lsbCBub3QgYmUgdXBkYXRlZC5cclxuICAgICAgICBpZiAobmV3QXNwZWN0LnRlbXBOYXZQcm9wTmFtZXMpIHtcclxuICAgICAgICAgIG5ld0FzcGVjdC50ZW1wTmF2UHJvcE5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5wTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIGxldCBucCA9IGVudGl0eVR5cGUuZ2V0TmF2aWdhdGlvblByb3BlcnR5KG5wTmFtZSk7XHJcbiAgICAgICAgICAgIGxldCBma1Byb3BOYW1lID0gbnAhLnJlbGF0ZWREYXRhUHJvcGVydGllc1swXS5uYW1lO1xyXG4gICAgICAgICAgICBsZXQgb2xkRmtWYWx1ZSA9IHRhcmdldEVudGl0eSEuZ2V0UHJvcGVydHkoZmtQcm9wTmFtZSk7XHJcbiAgICAgICAgICAgIGxldCBmayA9IG5ldyBFbnRpdHlLZXkobnAhLmVudGl0eVR5cGUsIFtvbGRGa1ZhbHVlXSk7XHJcbiAgICAgICAgICAgIGxldCBuZXdGayA9IGdldE1hcHBlZEtleSh0ZW1wS2V5TWFwISwgZmspO1xyXG4gICAgICAgICAgICB0YXJnZXRFbnRpdHkhLnNldFByb3BlcnR5KGZrUHJvcE5hbWUsIG5ld0ZrIS52YWx1ZXNbMF0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIE5vdyBwZXJmb3JtZWQgaW4gYXR0YWNoRW50aXR5XHJcbiAgICAgIHRhcmdldEVudGl0eSA9IGVudGl0eUdyb3VwLmF0dGFjaEVudGl0eSh0YXJnZXRFbnRpdHksIGVudGl0eVN0YXRlKTtcclxuICAgICAgZW50aXR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5QWN0aW9uOiBFbnRpdHlBY3Rpb24uQXR0YWNoT25JbXBvcnQsIGVudGl0eTogdGFyZ2V0RW50aXR5IH0pO1xyXG4gICAgICBpZiAoIWVudGl0eVN0YXRlLmlzVW5jaGFuZ2VkKCkpIHtcclxuICAgICAgICBlbS5fbm90aWZ5U3RhdGVDaGFuZ2UodGFyZ2V0RW50aXR5LCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVudGl0aWVzVG9MaW5rLnB1c2godGFyZ2V0RW50aXR5KTtcclxuICB9KTtcclxuICByZXR1cm4gZW50aXRpZXNUb0xpbms7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE1hcHBlZEtleSh0ZW1wS2V5TWFwOiBJVGVtcEtleU1hcCwgZW50aXR5S2V5OiBFbnRpdHlLZXkpIHtcclxuICBsZXQgbmV3S2V5ID0gdGVtcEtleU1hcFtlbnRpdHlLZXkudG9TdHJpbmcoKV07XHJcbiAgaWYgKG5ld0tleSkgcmV0dXJuIG5ld0tleTtcclxuICBsZXQgc3VidHlwZXMgPSBlbnRpdHlLZXkuX3N1YnR5cGVzO1xyXG4gIGlmICghc3VidHlwZXMpIHJldHVybiBudWxsO1xyXG4gIGZvciAobGV0IGkgPSAwLCBqID0gc3VidHlwZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICBuZXdLZXkgPSB0ZW1wS2V5TWFwW2VudGl0eUtleS50b1N0cmluZyhzdWJ0eXBlc1tpXSldO1xyXG4gICAgaWYgKG5ld0tleSkgcmV0dXJuIG5ld0tleTtcclxuICB9XHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb21pc2VXaXRoQ2FsbGJhY2tzPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIGNhbGxiYWNrPzogQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBFcnJvckNhbGxiYWNrKSB7XHJcbiAgcHJvbWlzZSA9IHByb21pc2UudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XHJcbiAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjayhlcnJvcik7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gIH0pO1xyXG4gIHJldHVybiBwcm9taXNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRFbnRpdGllc1RvU2F2ZShlbTogRW50aXR5TWFuYWdlciwgZW50aXRpZXM/OiBFbnRpdHlbXSkge1xyXG4gIGxldCBlbnRpdGllc1RvU2F2ZTogRW50aXR5W107XHJcbiAgaWYgKGVudGl0aWVzKSB7XHJcbiAgICBlbnRpdGllc1RvU2F2ZSA9IGVudGl0aWVzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xyXG4gICAgICBpZiAoZS5lbnRpdHlBc3BlY3QuZW50aXR5TWFuYWdlciAhPT0gZW0pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IGVudGl0aWVzIGluIHRoaXMgZW50aXR5TWFuYWdlciBtYXkgYmUgc2F2ZWRcIik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICFlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc0RldGFjaGVkKCk7XHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgZW50aXRpZXNUb1NhdmUgPSBlbS5nZXRDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIHJldHVybiBlbnRpdGllc1RvU2F2ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gZml4dXBLZXlzKGVtOiBFbnRpdHlNYW5hZ2VyLCBrZXlNYXBwaW5nczogS2V5TWFwcGluZ1tdKSB7XHJcbiAgZW0uX2luS2V5Rml4dXAgPSB0cnVlO1xyXG4gIGtleU1hcHBpbmdzLmZvckVhY2goZnVuY3Rpb24gKGttKSB7XHJcbiAgICBsZXQgZ3JvdXAgPSBlbS5fZW50aXR5R3JvdXBNYXBba20uZW50aXR5VHlwZU5hbWVdO1xyXG4gICAgaWYgKCFncm91cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gbG9jYXRlIHRoZSBmb2xsb3dpbmcgZnVsbHkgcXVhbGlmaWVkIEVudGl0eVR5cGUgbmFtZTogXCIgKyBrbS5lbnRpdHlUeXBlTmFtZSk7XHJcbiAgICB9XHJcbiAgICBncm91cC5fZml4dXBLZXkoa20udGVtcFZhbHVlLCBrbS5yZWFsVmFsdWUpO1xyXG4gIH0pO1xyXG4gIGVtLl9pbktleUZpeHVwID0gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEVudGl0eUdyb3VwcyhlbTogRW50aXR5TWFuYWdlciwgZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlIHwgRW50aXR5VHlwZVtdKSB7XHJcbiAgbGV0IGdyb3VwTWFwID0gZW0uX2VudGl0eUdyb3VwTWFwO1xyXG4gIGlmIChlbnRpdHlUeXBlcykge1xyXG4gICAgcmV0dXJuIGNvcmUudG9BcnJheShlbnRpdHlUeXBlcykubWFwKGZ1bmN0aW9uIChldDogRW50aXR5VHlwZSkge1xyXG4gICAgICBpZiAoZXQgaW5zdGFuY2VvZiBFbnRpdHlUeXBlKSB7XHJcbiAgICAgICAgcmV0dXJuIGdyb3VwTWFwW2V0Lm5hbWVdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBFbnRpdHlNYW5hZ2VyLmdldENoYW5nZXMoKSAnZW50aXR5VHlwZXMnIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhbiBlbnRpdHlUeXBlIG9yIGFuIGFycmF5IG9mIGVudGl0eVR5cGVzIG9yIG51bGxcIik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gY29yZS5nZXRPd25Qcm9wZXJ0eVZhbHVlcyhncm91cE1hcCkgYXMgRW50aXR5R3JvdXBbXTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrRW50aXR5S2V5KGVtOiBFbnRpdHlNYW5hZ2VyLCBlbnRpdHk6IEVudGl0eSkge1xyXG4gIGxldCBlayA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgLy8gcmV0dXJuIHByb3BlcnRpZXMgdGhhdCBhcmUgPSB0byBkZWZhdWx0VmFsdWVzXHJcbiAgbGV0IGtleVByb3BzV2l0aERlZmF1bHRWYWx1ZXMgPSBjb3JlLmFycmF5WmlwKGVudGl0eS5lbnRpdHlUeXBlLmtleVByb3BlcnRpZXMsIGVrLnZhbHVlcywgZnVuY3Rpb24gKGtwLCBrdikge1xyXG4gICAgcmV0dXJuIChrcC5kZWZhdWx0VmFsdWUgPT09IGt2KSA/IGtwIDogbnVsbDtcclxuICB9KS5maWx0ZXIoZnVuY3Rpb24gKGtwKSB7XHJcbiAgICByZXR1cm4ga3AgIT09IG51bGw7XHJcbiAgfSk7XHJcbiAgaWYgKGtleVByb3BzV2l0aERlZmF1bHRWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICBpZiAoZW50aXR5LmVudGl0eVR5cGUuYXV0b0dlbmVyYXRlZEtleVR5cGUgIT09IEF1dG9HZW5lcmF0ZWRLZXlUeXBlLk5vbmUpIHtcclxuICAgICAgZW0uZ2VuZXJhdGVUZW1wS2V5VmFsdWUoZW50aXR5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHdlIHdpbGwgYWxsb3cgYXR0YWNoZXMgb2YgZW50aXRpZXMgd2hlcmUgb25seSBwYXJ0IG9mIHRoZSBrZXkgaXMgc2V0LlxyXG4gICAgICBpZiAoa2V5UHJvcHNXaXRoRGVmYXVsdFZhbHVlcy5sZW5ndGggPT09IGVrLnZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYXR0YWNoIGFuIG9iamVjdCBvZiB0eXBlICAoXCIgKyBlbnRpdHkuZW50aXR5VHlwZS5uYW1lICsgXCIpIHRvIGFuIEVudGl0eU1hbmFnZXIgd2l0aG91dCBmaXJzdCBzZXR0aW5nIGl0cyBrZXkgb3Igc2V0dGluZyBpdHMgZW50aXR5VHlwZSAnQXV0b0dlbmVyYXRlZEtleVR5cGUnIHByb3BlcnR5IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuICdOb25lJ1wiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdmFsaWRhdGVFbnRpdHlTdGF0ZXMoZW06IEVudGl0eU1hbmFnZXIsIGVudGl0eVN0YXRlcz86IEVudGl0eVN0YXRlIHwgRW50aXR5U3RhdGVbXSkge1xyXG4gIGlmICghZW50aXR5U3RhdGVzKSByZXR1cm4gW10gYXMgRW50aXR5U3RhdGVbXTtcclxuICBsZXQgZW50U3RhdGVzID0gY29yZS50b0FycmF5KGVudGl0eVN0YXRlcykgYXMgRW50aXR5U3RhdGVbXTtcclxuICBlbnRTdGF0ZXMuZm9yRWFjaCgoZXMpID0+IHtcclxuICAgIGlmICghKGVzIGluc3RhbmNlb2YgRW50aXR5U3RhdGUpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBFbnRpdHlNYW5hZ2VyLmdldENoYW5nZXMoKSAnZW50aXR5U3RhdGVzJyBwYXJhbWV0ZXIgbXVzdCBlaXRoZXIgYmUgbnVsbCwgYW4gZW50aXR5U3RhdGUgb3IgYW4gYXJyYXkgb2YgZW50aXR5U3RhdGVzXCIpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBlbnRTdGF0ZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGF0dGFjaFJlbGF0ZWRFbnRpdGllcyhlbTogRW50aXR5TWFuYWdlciwgZW50aXR5OiBFbnRpdHksIGVudGl0eVN0YXRlOiBFbnRpdHlTdGF0ZSwgbWVyZ2VTdHJhdGVneTogTWVyZ2VTdHJhdGVneSkge1xyXG4gIGxldCBuYXZQcm9wcyA9IGVudGl0eS5lbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xyXG4gIG5hdlByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5wKSB7XHJcbiAgICBsZXQgcmVsYXRlZCA9IGVudGl0eS5nZXRQcm9wZXJ0eShucC5uYW1lKTtcclxuICAgIGlmIChucC5pc1NjYWxhcikge1xyXG4gICAgICBpZiAoIXJlbGF0ZWQpIHJldHVybjtcclxuICAgICAgZW0uYXR0YWNoRW50aXR5KHJlbGF0ZWQsIGVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlbGF0ZWQuZm9yRWFjaChmdW5jdGlvbiAoZTogRW50aXR5KSB7XHJcbiAgICAgICAgZW0uYXR0YWNoRW50aXR5KGUsIGVudGl0eVN0YXRlLCBtZXJnZVN0cmF0ZWd5KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8vIHJldHVybnMgYSBwcm9taXNlXHJcbmZ1bmN0aW9uIGV4ZWN1dGVRdWVyeUNvcmUoZW06IEVudGl0eU1hbmFnZXIsIHF1ZXJ5OiBFbnRpdHlRdWVyeSB8IHN0cmluZywgcXVlcnlPcHRpb25zOiBRdWVyeU9wdGlvbnMsIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSk6IFByb21pc2U8UXVlcnlSZXN1bHQ+IHtcclxuICB0cnkge1xyXG4gICAgbGV0IHJlc3VsdHM6IGFueVtdO1xyXG4gICAgbGV0IG1ldGFkYXRhU3RvcmUgPSBlbS5tZXRhZGF0YVN0b3JlO1xyXG5cclxuICAgIGlmIChtZXRhZGF0YVN0b3JlLmlzRW1wdHkoKSAmJiBkYXRhU2VydmljZS5oYXNTZXJ2ZXJNZXRhZGF0YSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3QgZXhlY3V0ZSBfZXhlY3V0ZVF1ZXJ5Q29yZSB1bnRpbCBtZXRhZGF0YVN0b3JlIGlzIHBvcHVsYXRlZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHF1ZXJ5T3B0aW9ucy5mZXRjaFN0cmF0ZWd5ID09PSBGZXRjaFN0cmF0ZWd5LkZyb21Mb2NhbENhY2hlKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBleGVjdXRlICdzdHJpbmcnIEVudGl0eVF1ZXJ5IGxvY2FsbHkuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcXIgPSBleGVjdXRlUXVlcnlMb2NhbGx5Q29yZShlbSwgcXVlcnkpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyByZXN1bHRzOiBxci5yZXN1bHRzLCBlbnRpdHlNYW5hZ2VyOiBlbSwgaW5saW5lQ291bnQ6IHFyLmlubGluZUNvdW50LCBxdWVyeTogcXVlcnkgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWFwcGluZ0NvbnRleHQ6IE1hcHBpbmdDb250ZXh0IHwgdW5kZWZpbmVkID0gbmV3IE1hcHBpbmdDb250ZXh0KHtcclxuICAgICAgcXVlcnk6IHF1ZXJ5LFxyXG4gICAgICBlbnRpdHlNYW5hZ2VyOiBlbSxcclxuICAgICAgZGF0YVNlcnZpY2U6IGRhdGFTZXJ2aWNlLFxyXG4gICAgICBtZXJnZU9wdGlvbnM6IHtcclxuICAgICAgICBtZXJnZVN0cmF0ZWd5OiBxdWVyeU9wdGlvbnMubWVyZ2VTdHJhdGVneSxcclxuICAgICAgICBub1RyYWNraW5nOiAhIShxdWVyeSBhcyBhbnkpLm5vVHJhY2tpbmdFbmFibGVkLFxyXG4gICAgICAgIGluY2x1ZGVEZWxldGVkOiBxdWVyeU9wdGlvbnMuaW5jbHVkZURlbGV0ZWRcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHZhbGlkYXRlT25RdWVyeSA9IGVtLnZhbGlkYXRpb25PcHRpb25zLnZhbGlkYXRlT25RdWVyeTtcclxuXHJcbiAgICByZXR1cm4gZGF0YVNlcnZpY2UuYWRhcHRlckluc3RhbmNlIS5leGVjdXRlUXVlcnkobWFwcGluZ0NvbnRleHQpLnRoZW4oZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gY29yZS53cmFwRXhlY3V0aW9uKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc3RhdGUgPSB7IGlzTG9hZGluZzogZW0uaXNMb2FkaW5nIH07XHJcbiAgICAgICAgZW0uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBlbS5fcGVuZGluZ1B1YnMgPSBbXTtcclxuICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICAgIH0sIGZ1bmN0aW9uIChzdGF0ZSkge1xyXG4gICAgICAgIC8vIGNsZWFudXBcclxuICAgICAgICBlbS5pc0xvYWRpbmcgPSBzdGF0ZS5pc0xvYWRpbmc7XHJcbiAgICAgICAgZW0uX3BlbmRpbmdQdWJzIS5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xyXG4gICAgICAgICAgZm4oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBlbS5fcGVuZGluZ1B1YnMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgZW0uX2hhc0NoYW5nZXNBY3Rpb24gJiYgZW0uX2hhc0NoYW5nZXNBY3Rpb24oKTtcclxuICAgICAgICAvLyBUT0RPOiByZW1vdmVkIC0gbm90IHN1cmUgd2h5IG5lZWRlZCBpbiBmaXJzdCBwbGFjZS4uLlxyXG4gICAgICAgIC8vIC8vIEhBQ0sgZm9yIEdDXHJcbiAgICAgICAgLy8gcXVlcnkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgbWFwcGluZ0NvbnRleHQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gSEFDSzogc29tZSBlcnJvcnMgdGhyb3duIGluIG5leHQgZnVuY3Rpb24gZG8gbm90IHByb3BvZ2F0ZSBwcm9wZXJseSAtIHRoaXMgY2F0Y2hlcyB0aGVtLlxyXG5cclxuICAgICAgICBpZiAoc3RhdGUuZXJyb3IpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzdGF0ZS5lcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBub2RlcyA9IGRhdGFTZXJ2aWNlLmpzb25SZXN1bHRzQWRhcHRlci5leHRyYWN0UmVzdWx0cyhkYXRhKTtcclxuICAgICAgICBub2RlcyA9IGNvcmUudG9BcnJheShub2Rlcyk7XHJcblxyXG4gICAgICAgIHJlc3VsdHMgPSBtYXBwaW5nQ29udGV4dCEudmlzaXRBbmRNZXJnZShub2RlcywgeyBub2RlVHlwZTogXCJyb290XCIgfSk7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRlT25RdWVyeSkge1xyXG4gICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyOiBhbnkpIHtcclxuICAgICAgICAgICAgLy8gYW5vbiB0eXBlcyBhbmQgc2ltcGxlIHR5cGVzIHdpbGwgbm90IGhhdmUgYW4gZW50aXR5QXNwZWN0LlxyXG4gICAgICAgICAgICByLmVudGl0eUFzcGVjdCAmJiByLmVudGl0eUFzcGVjdC52YWxpZGF0ZUVudGl0eSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1hcHBpbmdDb250ZXh0IS5wcm9jZXNzRGVmZXJyZWQoKTtcclxuICAgICAgICAvLyBpZiBxdWVyeSBoYXMgZXhwYW5kIGNsYXVzZXMgd2FsayBlYWNoIG9mIHRoZSAncmVzdWx0cycgYW5kIG1hcmsgdGhlIGV4cGFuZGVkIHByb3BzIGFzIGxvYWRlZC5cclxuICAgICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBFbnRpdHlRdWVyeSkge1xyXG4gICAgICAgICAgbWFya0xvYWRlZE5hdlByb3BzKHJlc3VsdHMsIHF1ZXJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJldHJpZXZlZEVudGl0aWVzID0gY29yZS5vYmplY3RNYXAobWFwcGluZ0NvbnRleHQhLnJlZk1hcCk7XHJcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0czogcmVzdWx0cywgcXVlcnk6IHF1ZXJ5LCBlbnRpdHlNYW5hZ2VyOiBlbSwgaHR0cFJlc3BvbnNlOiBkYXRhLmh0dHBSZXNwb25zZSwgaW5saW5lQ291bnQ6IGRhdGEuaW5saW5lQ291bnQsIHJldHJpZXZlZEVudGl0aWVzOiByZXRyaWV2ZWRFbnRpdGllcyB9O1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgfSwgZnVuY3Rpb24gKGU6IGFueSkge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIGUucXVlcnkgPSBxdWVyeTtcclxuICAgICAgICBlLmVudGl0eU1hbmFnZXIgPSBlbTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgaWYgKGUpIHtcclxuICAgICAgZS5xdWVyeSA9IHF1ZXJ5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbWFya0xvYWRlZE5hdlByb3BzKGVudGl0aWVzOiBFbnRpdHlbXSwgcXVlcnk6IEVudGl0eVF1ZXJ5KSB7XHJcbiAgaWYgKHF1ZXJ5Lm5vVHJhY2tpbmdFbmFibGVkKSByZXR1cm47XHJcbiAgbGV0IGV4cGFuZENsYXVzZSA9IHF1ZXJ5LmV4cGFuZENsYXVzZTtcclxuICBpZiAoZXhwYW5kQ2xhdXNlID09IG51bGwpIHJldHVybjtcclxuICBleHBhbmRDbGF1c2UucHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcclxuICAgIGxldCBwcm9wTmFtZXMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoJy4nKTtcclxuICAgIG1hcmtMb2FkZWROYXZQYXRoKGVudGl0aWVzLCBwcm9wTmFtZXMpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtYXJrTG9hZGVkTmF2UGF0aChlbnRpdGllczogRW50aXR5W10sIHByb3BOYW1lczogc3RyaW5nW10pIHtcclxuICBsZXQgcHJvcE5hbWUgPSBwcm9wTmFtZXNbMF07XHJcbiAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XHJcbiAgICBsZXQgZWEgPSBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gICAgaWYgKCFlYSkgcmV0dXJuOyAvLyBlbnRpdHkgbWF5IG5vdCBiZSBhICdyZWFsJyBlbnRpdHkgaW4gdGhlIGNhc2Ugb2YgYSBwcm9qZWN0aW9uLlxyXG4gICAgZWEuX21hcmtBc0xvYWRlZChwcm9wTmFtZSk7XHJcbiAgICBpZiAocHJvcE5hbWVzLmxlbmd0aCA9PT0gMSkgcmV0dXJuO1xyXG4gICAgbGV0IG5leHQgPSBlbnRpdHkuZ2V0UHJvcGVydHkocHJvcE5hbWUpO1xyXG4gICAgaWYgKCFuZXh0KSByZXR1cm47IC8vIG5vIGNoaWxkcmVuIHRvIHByb2Nlc3MuXHJcbiAgICAvLyBzdHJhbmdlIGxvZ2ljIGJlY2F1c2Ugbm9uc2NhbGFyIG5hdiB2YWx1ZXMgYXJlIE5PVCByZWFsbHkgYXJyYXlzXHJcbiAgICAvLyBvdGhlcndpc2Ugd2UgY291bGQgdXNlIEFycmF5LmlzQXJyYXlcclxuICAgIGlmICghbmV4dC5hcnJheUNoYW5nZWQpIG5leHQgPSBbbmV4dF07XHJcbiAgICBtYXJrTG9hZGVkTmF2UGF0aChuZXh0LCBwcm9wTmFtZXMuc2xpY2UoMSkpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVDb25jdXJyZW5jeVByb3BlcnRpZXMoZW50aXRpZXM6IEVudGl0eVtdKSB7XHJcbiAgbGV0IGNhbmRpZGF0ZXMgPSBlbnRpdGllcy5maWx0ZXIoKGUpID0+IHtcclxuICAgIGUuZW50aXR5QXNwZWN0LmlzQmVpbmdTYXZlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNNb2RpZmllZCgpXHJcbiAgICAgICYmIGUuZW50aXR5VHlwZS5jb25jdXJyZW5jeVByb3BlcnRpZXMubGVuZ3RoID4gMDtcclxuXHJcbiAgfSk7XHJcbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XHJcbiAgICBjLmVudGl0eVR5cGUuY29uY3VycmVuY3lQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGNwKSB7XHJcbiAgICAgIHVwZGF0ZUNvbmN1cnJlbmN5UHJvcGVydHkoYywgY3ApO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUNvbmN1cnJlbmN5UHJvcGVydHkoZW50aXR5OiBFbnRpdHksIHByb3BlcnR5OiBEYXRhUHJvcGVydHkpIHtcclxuICAvLyBjaGVjayBpZiBwcm9wZXJ0eSBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWRcclxuICBpZiAoZW50aXR5LmVudGl0eUFzcGVjdC5vcmlnaW5hbFZhbHVlc1twcm9wZXJ0eS5uYW1lXSkgcmV0dXJuO1xyXG4gIGxldCB2YWx1ZSA9IGVudGl0eS5nZXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lKTtcclxuICBsZXQgZGF0YVR5cGUgPSBwcm9wZXJ0eS5kYXRhVHlwZSBhcyBEYXRhVHlwZTtcclxuICBpZiAoIXZhbHVlKSB2YWx1ZSA9IGRhdGFUeXBlLmRlZmF1bHRWYWx1ZTtcclxuICBpZiAoZGF0YVR5cGUuaXNOdW1lcmljKSB7XHJcbiAgICBlbnRpdHkuc2V0UHJvcGVydHkocHJvcGVydHkubmFtZSwgdmFsdWUgKyAxKTtcclxuICB9IGVsc2UgaWYgKGRhdGFUeXBlLmdldENvbmN1cnJlbmN5VmFsdWUpIHtcclxuICAgIC8vIERhdGFUeXBlIGhhcyBpdHMgb3duIGltcGxlbWVudGF0aW9uXHJcbiAgICBsZXQgbmV4dFZhbHVlID0gZGF0YVR5cGUuZ2V0Q29uY3VycmVuY3lWYWx1ZSh2YWx1ZSk7XHJcbiAgICBlbnRpdHkuc2V0UHJvcGVydHkocHJvcGVydHkubmFtZSwgbmV4dFZhbHVlKTtcclxuICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSBEYXRhVHlwZS5CaW5hcnkpIHtcclxuICAgIC8vIGJlc3QgZ3Vlc3MgLSB0aGF0IHRoaXMgaXMgYSB0aW1lc3RhbXAgY29sdW1uIGFuZCBpcyBjb21wdXRlZCBvbiB0aGUgc2VydmVyIGR1cmluZyBzYXZlXHJcbiAgICAvLyAtIHNvIG5vIG5lZWQgdG8gc2V0IGl0IGhlcmUuXHJcbiAgICByZXR1cm47XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIHRoaXMganVzdCBsZWF2ZXMgRGF0YVR5cGVzIG9mIEJvb2xlYW4sIFN0cmluZyBhbmQgQnl0ZSAtIG5vbmUgb2Ygd2hpY2ggc2hvdWxkIGJlIHRoZVxyXG4gICAgLy8gdHlwZSBmb3IgYSBjb25jdXJyZW5jeSBjb2x1bW4uXHJcbiAgICAvLyBOT1RFOiB0aG91Z2h0IGFib3V0IGp1c3QgcmV0dXJuaW5nIGhlcmUgYnV0IHdvdWxkIHJhdGhlciBiZSBzYWZlIGZvciBub3cuXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gdXBkYXRlIHRoZSB2YWx1ZSBvZiBjb25jdXJyZW5jeSBwcm9wZXJ0eSBiZWZvcmUgc2F2aW5nOiBcIiArIHByb3BlcnR5Lm5hbWUpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGZpbmRPckNyZWF0ZUVudGl0eUdyb3VwKGVtOiBFbnRpdHlNYW5hZ2VyLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgbGV0IGdyb3VwID0gZW0uX2VudGl0eUdyb3VwTWFwW2VudGl0eVR5cGUubmFtZV07XHJcbiAgaWYgKCFncm91cCkge1xyXG4gICAgZ3JvdXAgPSBuZXcgRW50aXR5R3JvdXAoZW0sIGVudGl0eVR5cGUpO1xyXG4gICAgZW0uX2VudGl0eUdyb3VwTWFwW2VudGl0eVR5cGUubmFtZV0gPSBncm91cDtcclxuICB9XHJcbiAgcmV0dXJuIGdyb3VwO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kT3JDcmVhdGVFbnRpdHlHcm91cHMoZW06IEVudGl0eU1hbmFnZXIsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICBsZXQgZW50aXR5VHlwZXMgPSBlbnRpdHlUeXBlLmdldFNlbGZBbmRTdWJ0eXBlcygpO1xyXG4gIHJldHVybiBlbnRpdHlUeXBlcy5tYXAoKGV0KSA9PiB7XHJcbiAgICByZXR1cm4gZmluZE9yQ3JlYXRlRW50aXR5R3JvdXAoZW0sIGV0KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdW53cmFwSW5zdGFuY2Uoc3RydWN0T2JqOiBTdHJ1Y3R1cmFsT2JqZWN0LCB0cmFuc2Zvcm1Gbj86IChkcDogRGF0YVByb3BlcnR5LCB2YWw6IGFueSkgPT4gYW55KSB7XHJcblxyXG4gIGxldCByYXdPYmplY3Q6IGFueSA9IHt9O1xyXG4gIGxldCBzdHlwZSA9IEVudGl0eUFzcGVjdC5pc0VudGl0eShzdHJ1Y3RPYmopID8gc3RydWN0T2JqLmVudGl0eVR5cGUgOiBzdHJ1Y3RPYmouY29tcGxleFR5cGU7XHJcbiAgbGV0IHNlcmlhbGl6ZXJGbiA9IGdldFNlcmlhbGl6ZXJGbihzdHlwZSk7XHJcbiAgbGV0IHVubWFwcGVkID0ge307XHJcbiAgc3R5cGUuZGF0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZHApIHtcclxuICAgIGlmIChkcC5pc0NvbXBsZXhQcm9wZXJ0eSkge1xyXG4gICAgICByYXdPYmplY3RbZHAubmFtZU9uU2VydmVyXSA9IGNvcmUubWFwKHN0cnVjdE9iai5nZXRQcm9wZXJ0eShkcC5uYW1lKSwgZnVuY3Rpb24gKGNvKSB7XHJcbiAgICAgICAgcmV0dXJuIHVud3JhcEluc3RhbmNlKGNvLCB0cmFuc2Zvcm1Gbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHZhbCA9IHN0cnVjdE9iai5nZXRQcm9wZXJ0eShkcC5uYW1lKTtcclxuICAgICAgdmFsID0gdHJhbnNmb3JtRm4gPyB0cmFuc2Zvcm1GbihkcCwgdmFsKSA6IHZhbDtcclxuICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgIHZhbCA9IHNlcmlhbGl6ZXJGbiA/IHNlcmlhbGl6ZXJGbihkcCwgdmFsKSA6IHZhbDtcclxuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKGRwLmlzVW5tYXBwZWQpIHtcclxuICAgICAgICAgIHVubWFwcGVkW2RwLm5hbWVPblNlcnZlcl0gPSBjb3JlLnRvSlNPTlNhZmUodmFsLCBjb3JlLnRvSlNPTlNhZmVSZXBsYWNlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJhd09iamVjdFtkcC5uYW1lT25TZXJ2ZXJdID0gdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBpZiAoIWNvcmUuaXNFbXB0eSh1bm1hcHBlZCkpIHtcclxuICAgIC8vIFRPRE86IHJldmlldyB0aGlzLlxyXG4gICAgKHJhd09iamVjdCBhcyBhbnkpLl9fdW5tYXBwZWQgPSB1bm1hcHBlZDtcclxuICB9XHJcbiAgcmV0dXJuIHJhd09iamVjdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdW53cmFwT3JpZ2luYWxWYWx1ZXModGFyZ2V0OiBTdHJ1Y3R1cmFsT2JqZWN0LCBtZXRhZGF0YVN0b3JlOiBNZXRhZGF0YVN0b3JlLCB0cmFuc2Zvcm1Gbj86IChkcDogRGF0YVByb3BlcnR5LCB2YWw6IGFueSkgPT4gYW55KSB7XHJcbiAgbGV0IHN0eXBlID0gRW50aXR5QXNwZWN0LmlzRW50aXR5KHRhcmdldCkgPyB0YXJnZXQuZW50aXR5VHlwZSA6IHRhcmdldC5jb21wbGV4VHlwZTtcclxuICBsZXQgYXNwZWN0ID0gRW50aXR5QXNwZWN0LmlzRW50aXR5KHRhcmdldCkgPyB0YXJnZXQuZW50aXR5QXNwZWN0IDogdGFyZ2V0LmNvbXBsZXhBc3BlY3Q7XHJcbiAgbGV0IGZuID0gbWV0YWRhdGFTdG9yZS5uYW1pbmdDb252ZW50aW9uLmNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyO1xyXG4gIGxldCByZXN1bHQgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gIGNvcmUub2JqZWN0Rm9yRWFjaChhc3BlY3Qub3JpZ2luYWxWYWx1ZXMsIGZ1bmN0aW9uIChwcm9wTmFtZSwgdmFsKSB7XHJcbiAgICBsZXQgcHJvcCA9IHN0eXBlLmdldFByb3BlcnR5KHByb3BOYW1lKSBhcyBEYXRhUHJvcGVydHk7XHJcbiAgICB2YWwgPSB0cmFuc2Zvcm1GbiA/IHRyYW5zZm9ybUZuKHByb3AsIHZhbCkgOiB2YWw7XHJcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzdWx0W2ZuKHByb3BOYW1lLCBwcm9wKV0gPSB2YWw7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgc3R5cGUuY29tcGxleFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY3ApIHtcclxuICAgIGxldCBuZXh0VGFyZ2V0ID0gdGFyZ2V0LmdldFByb3BlcnR5KGNwLm5hbWUpO1xyXG4gICAgaWYgKGNwLmlzU2NhbGFyKSB7XHJcbiAgICAgIGxldCB1bndyYXBwZWRDbyA9IHVud3JhcE9yaWdpbmFsVmFsdWVzKG5leHRUYXJnZXQsIG1ldGFkYXRhU3RvcmUsIHRyYW5zZm9ybUZuKTtcclxuICAgICAgaWYgKCFjb3JlLmlzRW1wdHkodW53cmFwcGVkQ28pKSB7XHJcbiAgICAgICAgcmVzdWx0W2ZuKGNwLm5hbWUsIGNwKV0gPSB1bndyYXBwZWRDbztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHVud3JhcHBlZENvcyA9IG5leHRUYXJnZXQubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gdW53cmFwT3JpZ2luYWxWYWx1ZXMoaXRlbSwgbWV0YWRhdGFTdG9yZSwgdHJhbnNmb3JtRm4pO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0W2ZuKGNwLm5hbWUsIGNwKV0gPSB1bndyYXBwZWRDb3M7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdW53cmFwQ2hhbmdlZFZhbHVlcyhlbnRpdHk6IEVudGl0eSwgbWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSwgdHJhbnNmb3JtRm46IChkcDogRGF0YVByb3BlcnR5LCB2YWw6IGFueSkgPT4gYW55KSB7XHJcbiAgbGV0IHN0eXBlID0gZW50aXR5LmVudGl0eVR5cGU7XHJcbiAgbGV0IHNlcmlhbGl6ZXJGbiA9IGdldFNlcmlhbGl6ZXJGbihzdHlwZSk7XHJcbiAgbGV0IGZuID0gbWV0YWRhdGFTdG9yZS5uYW1pbmdDb252ZW50aW9uLmNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyO1xyXG4gIGxldCByZXN1bHQgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gIGNvcmUub2JqZWN0Rm9yRWFjaChlbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzLCBmdW5jdGlvbiAocHJvcE5hbWUsIHZhbHVlKSB7XHJcbiAgICBsZXQgcHJvcCA9IHN0eXBlLmdldFByb3BlcnR5KHByb3BOYW1lKSBhcyBEYXRhUHJvcGVydHk7XHJcbiAgICBsZXQgdmFsID0gZW50aXR5LmdldFByb3BlcnR5KHByb3BOYW1lKTtcclxuICAgIHZhbCA9IHRyYW5zZm9ybUZuID8gdHJhbnNmb3JtRm4ocHJvcCwgdmFsKSA6IHZhbDtcclxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgdmFsID0gc2VyaWFsaXplckZuID8gc2VyaWFsaXplckZuKHByb3AsIHZhbCkgOiB2YWw7XHJcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzdWx0W2ZuKHByb3BOYW1lLCBwcm9wKV0gPSB2YWw7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgLy8gYW55IGNoYW5nZSB0byBhbnkgY29tcGxleCBvYmplY3Qgb3IgYXJyYXkgb2YgY29tcGxleCBvYmplY3RzIHJldHVybnMgdGhlIEVOVElSRVxyXG4gIC8vIGN1cnJlbnQgY29tcGxleCBvYmplY3Qgb3IgY29tcGxleCBvYmplY3QgYXJyYXkuICBUaGlzIGlzIGJ5IGRlc2lnbi4gQ29tcGxleCBPYmplY3RzXHJcbiAgLy8gYXJlIGF0b21pYy5cclxuICBzdHlwZS5jb21wbGV4UHJvcGVydGllcy5mb3JFYWNoKChjcCkgPT4ge1xyXG4gICAgaWYgKGNwSGFzT3JpZ2luYWxWYWx1ZXMoZW50aXR5LCBjcCkpIHtcclxuICAgICAgbGV0IGNvT3JDb3MgPSBlbnRpdHkuZ2V0UHJvcGVydHkoY3AubmFtZSk7XHJcbiAgICAgIHJlc3VsdFtmbihjcC5uYW1lLCBjcCldID0gY29yZS5tYXAoY29PckNvcywgZnVuY3Rpb24gKGNvKSB7XHJcbiAgICAgICAgcmV0dXJuIHVud3JhcEluc3RhbmNlKGNvLCB0cmFuc2Zvcm1Gbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNwSGFzT3JpZ2luYWxWYWx1ZXMoc3RydWN0dXJhbE9iamVjdDogU3RydWN0dXJhbE9iamVjdCwgY3A6IERhdGFQcm9wZXJ0eSk6IGJvb2xlYW4ge1xyXG4gIGxldCBjb09yQ29zID0gc3RydWN0dXJhbE9iamVjdC5nZXRQcm9wZXJ0eShjcC5uYW1lKTtcclxuICBpZiAoY3AuaXNTY2FsYXIpIHtcclxuICAgIHJldHVybiBjb0hhc09yaWdpbmFsVmFsdWVzKGNvT3JDb3MpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyB0aGlzIG9jY3VycyB3aGVuIGEgbm9uc2NhbGFyIGNvIGFycmF5IGhhcyBoYWQgY29zIGFkZGVkIG9yIHJlbW92ZWQuXHJcbiAgICBpZiAoY29PckNvcy5fb3JpZ1ZhbHVlcykgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gY29PckNvcy5zb21lKGZ1bmN0aW9uIChjbzogQ29tcGxleE9iamVjdCkge1xyXG4gICAgICByZXR1cm4gY29IYXNPcmlnaW5hbFZhbHVlcyhjbyk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVRdWVyeUxvY2FsbHlDb3JlKGVtOiBFbnRpdHlNYW5hZ2VyLCBxdWVyeTogRW50aXR5UXVlcnkpIHtcclxuICBhc3NlcnRQYXJhbShxdWVyeSwgXCJxdWVyeVwiKS5pc0luc3RhbmNlT2YoRW50aXR5UXVlcnkpLmNoZWNrKCk7XHJcblxyXG4gIGxldCBtZXRhZGF0YVN0b3JlID0gZW0ubWV0YWRhdGFTdG9yZTtcclxuICBsZXQgZW50aXR5VHlwZSA9IHF1ZXJ5Ll9nZXRGcm9tRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlLCB0cnVlKTtcclxuICAvLyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgZ3JvdXBzIGlzIHRoaXMgaXMgYSBiYXNlIGVudGl0eSB0eXBlLlxyXG4gIGxldCBncm91cHMgPSBmaW5kT3JDcmVhdGVFbnRpdHlHcm91cHMoZW0sIGVudGl0eVR5cGUhKTtcclxuICAvLyBmaWx0ZXIgdGhlbiBvcmRlciB0aGVuIHNraXAgdGhlbiB0YWtlXHJcbiAgbGV0IGZpbHRlckZ1bmMgPSBxdWVyeS53aGVyZVByZWRpY2F0ZSAmJiBxdWVyeS53aGVyZVByZWRpY2F0ZS50b0Z1bmN0aW9uKHsgZW50aXR5VHlwZTogZW50aXR5VHlwZSB9KTtcclxuXHJcbiAgbGV0IHF1ZXJ5T3B0aW9ucyA9IFF1ZXJ5T3B0aW9ucy5yZXNvbHZlKFtxdWVyeS5xdWVyeU9wdGlvbnMsIGVtLnF1ZXJ5T3B0aW9ucywgUXVlcnlPcHRpb25zLmRlZmF1bHRJbnN0YW5jZV0pO1xyXG4gIGxldCBpbmNsdWRlRGVsZXRlZCA9IHF1ZXJ5T3B0aW9ucy5pbmNsdWRlRGVsZXRlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgbGV0IG5ld0ZpbHRlckZ1bmMgPSBmdW5jdGlvbiAoZW50aXR5OiBFbnRpdHkpIHtcclxuICAgIHJldHVybiBlbnRpdHkgJiYgKGluY2x1ZGVEZWxldGVkIHx8ICFlbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSAmJiAoZmlsdGVyRnVuYyA/IGZpbHRlckZ1bmMoZW50aXR5KSA6IHRydWUpO1xyXG4gIH07XHJcblxyXG4gIGxldCByZXN1bHQ6IGFueVtdID0gW107XHJcbiAgLy8gVE9ETzogbWFwTWFueVxyXG4gIGdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xyXG4gICAgbGV0IGVudGl0aWVzID0gZ3JvdXAuX2VudGl0aWVzLmZpbHRlcihuZXdGaWx0ZXJGdW5jKSBhcyBFbnRpdHlbXTtcclxuICAgIGlmIChlbnRpdGllcy5sZW5ndGgpIHtcclxuICAgICAgcmVzdWx0ID0gcmVzdWx0Lmxlbmd0aCA/IHJlc3VsdC5jb25jYXQoZW50aXRpZXMpIDogZW50aXRpZXM7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGxldCBvcmRlckJ5Q29tcGFyZXIgPSBxdWVyeS5vcmRlckJ5Q2xhdXNlICYmIHF1ZXJ5Lm9yZGVyQnlDbGF1c2UuZ2V0Q29tcGFyZXIoZW50aXR5VHlwZSEpO1xyXG4gIGlmIChvcmRlckJ5Q29tcGFyZXIpIHtcclxuICAgIHJlc3VsdC5zb3J0KG9yZGVyQnlDb21wYXJlcik7XHJcbiAgfVxyXG5cclxuICBsZXQgaW5saW5lQ291bnQgPSBxdWVyeS5pbmxpbmVDb3VudEVuYWJsZWQgPyByZXN1bHQubGVuZ3RoIDogdW5kZWZpbmVkO1xyXG5cclxuICBsZXQgc2tpcENvdW50ID0gcXVlcnkuc2tpcENvdW50O1xyXG4gIGlmIChza2lwQ291bnQpIHtcclxuICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZShza2lwQ291bnQpO1xyXG4gIH1cclxuICBsZXQgdGFrZUNvdW50ID0gcXVlcnkudGFrZUNvdW50O1xyXG4gIGlmICh0YWtlQ291bnQpIHtcclxuICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCB0YWtlQ291bnQpO1xyXG4gIH1cclxuXHJcbiAgbGV0IHNlbGVjdENsYXVzZSA9IHF1ZXJ5LnNlbGVjdENsYXVzZTtcclxuICBpZiAoc2VsZWN0Q2xhdXNlKSB7XHJcbiAgICBsZXQgc2VsZWN0Rm4gPSBzZWxlY3RDbGF1c2UudG9GdW5jdGlvbigpO1xyXG4gICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChzZWxlY3RGbik7XHJcbiAgfVxyXG4gIHJldHVybiB7IHJlc3VsdHM6IHJlc3VsdCwgaW5saW5lQ291bnQ6IGlubGluZUNvdW50IH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvSGFzT3JpZ2luYWxWYWx1ZXMoY286IENvbXBsZXhPYmplY3QpIHtcclxuICAvLyBuZXh0IGxpbmUgY2hlY2tzIGFsbCBub24gY29tcGxleCBwcm9wZXJ0aWVzIG9mIHRoZSBjby5cclxuICBpZiAoIWNvcmUuaXNFbXB0eShjby5jb21wbGV4QXNwZWN0Lm9yaWdpbmFsVmFsdWVzKSkgcmV0dXJuIHRydWU7XHJcbiAgLy8gbm93IG5lZWQgdG8gcmVjdXJzaXZlbHkgY2hlY2sgZWFjaCBvZiB0aGUgY3BzXHJcbiAgcmV0dXJuIGNvLmNvbXBsZXhUeXBlLmNvbXBsZXhQcm9wZXJ0aWVzLnNvbWUoZnVuY3Rpb24gKGNwKSB7XHJcbiAgICByZXR1cm4gY3BIYXNPcmlnaW5hbFZhbHVlcyhjbywgY3ApO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTZXJpYWxpemVyRm4oc3R5cGU6IEVudGl0eVR5cGUgfCBDb21wbGV4VHlwZSkge1xyXG4gIHJldHVybiBzdHlwZS5zZXJpYWxpemVyRm4gfHwgKHN0eXBlLm1ldGFkYXRhU3RvcmUgJiYgc3R5cGUubWV0YWRhdGFTdG9yZS5zZXJpYWxpemVyRm4pO1xyXG59XHJcblxyXG4iXX0=