@gnwebsoft/ui 4.0.6 → 4.0.7

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.
@@ -1427,6 +1427,11 @@ function createApiClient(config) {
1427
1427
  }
1428
1428
  function getGlobalApiClient(config) {
1429
1429
  if (!globalApiClient) {
1430
+ if (!config) {
1431
+ throw new Error(
1432
+ "getGlobalApiClient: No global client exists. You must provide config on the first call to initialize the client."
1433
+ );
1434
+ }
1430
1435
  globalApiClient = createApiClient(config);
1431
1436
  }
1432
1437
  return globalApiClient;
@@ -2511,4 +2516,4 @@ export {
2511
2516
  getEmptyObject,
2512
2517
  useStableRowCount
2513
2518
  };
2514
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvYXBpL0NvcnJlbGF0aW9uSWRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL2NvcmUvYXBpL0Vycm9ycy9FcnJvck5vcm1hbGl6ZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL0ludGVyY2VwdG9ycy9JbnRlcmNlcHRvck1hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL1JlcXVlc3RNYW5hZ2VyLnRzIiwgIi4uL3NyYy9jb3JlL2FwaS9SZXRyeS9SZXRyeUhhbmRsZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL1NpZ25hbHMvU2lnbmFsTWFuYWdlci50cyIsICIuLi9zcmMvY29yZS9hcGkvVXRpbHMvUmVzcG9uc2VQYXJzZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL1V0aWxzL1VybEJ1aWxkZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL0FwaUNsaWVudC50cyIsICIuLi9zcmMvY29yZS9hcGkvY3JlYXRlQXBpQ2xpZW50LnRzIiwgIi4uL3NyYy9jb3JlL2FwaS90eXBlcy9DYW5jZWxUb2tlbi50cyIsICIuLi9zcmMvY29yZS9hcGkvdXNlVmFsaWRhdGlvbkVycm9ycy50cyIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0F1dGhvcml6ZWRWaWV3L0F1dGhvcml6ZWRWaWV3LnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0NhbmNlbEJ1dHRvbi9DYW5jZWxCdXR0b24udHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvQ2xlYXJCdXR0b24vQ2xlYXJCdXR0b24udHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvQ29udGFpbmVycy9TaW1wbGVDb250YWluZXIudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvRmlsdGVyQnV0dG9uL0ZpbHRlckJ1dHRvbi50c3giLCAiLi4vc3JjL2NvcmUvY29tcG9uZW50cy9GaWx0ZXJEaXNwbGF5L0ZpbHRlckNoaXAudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvRmlsdGVyRGlzcGxheS9GaWx0ZXJEaXNwbGF5LnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0ZpbHRlcldyYXBwZXIvRmlsdGVyV3JhcHBlci50c3giLCAiLi4vc3JjL2NvcmUvY29tcG9uZW50cy9Gb290ZXIvRm9vdGVyLnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0xhYmVsVGV4dC9MYWJlbFRleHQudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvUmVuZGVySWYvUmVuZGVySWYudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvU2VjdGlvbkJveC9TZWN0aW9uQm94LnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL1NpbXBsZVRhYnMvU2ltcGxlVGFicy50c3giLCAiLi4vc3JjL2NvcmUvY29tcG9uZW50cy9TdWJtaXRCdXR0b24vU3VibWl0QnV0dG9uLnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL1dpdGhSZWYvV2l0aFJlZi50c3giLCAiLi4vc3JjL2NvcmUvY29uZmlnLnRzIiwgIi4uL3NyYy9jb3JlL2hvb2tzL3VzZUFwaUNsaWVudC50cyIsICIuLi9zcmMvY29yZS9ob29rcy91c2VGb3JtRXJyb3JIYW5kbGVyLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL0NhY2hlVXRpbGl0eS9pbmRleC50cyIsICIuLi9zcmMvY29yZS91dGlscy93YXRjaC9jb3JlLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL3dhdGNoL3V0aWxpdGllcy50cyIsICIuLi9zcmMvY29yZS91dGlscy93YXRjaC9pbmRleC50cyIsICIuLi9zcmMvY29yZS91dGlscy9jYWxjdWxhdGVGaWx0ZXJDb3VudC50cyIsICIuLi9zcmMvY29yZS91dGlscy9mb3JtYXQtdGltZS50cyIsICIuLi9zcmMvY29yZS91dGlscy9nZXRFbXB0eU9iamVjdC50cyIsICIuLi9zcmMvY29yZS91dGlscy91c2VTdGFibGVSb3dDb3VudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFV0aWxpdGllcyBmb3IgZ2VuZXJhdGluZyBjb3JyZWxhdGlvbiBJRHMgZm9yIGRpc3RyaWJ1dGVkIHJlcXVlc3QgdHJhY2luZy5cbiAqXG4gKiBDb3JyZWxhdGlvbiBJRHMgYXJlIHVuaXF1ZSBpZGVudGlmaWVycyBhdHRhY2hlZCB0byBlYWNoIEFQSSByZXF1ZXN0IHRvIGVuYWJsZVxuICogdHJhY2tpbmcgYW5kIGRlYnVnZ2luZyBhY3Jvc3MgZGlzdHJpYnV0ZWQgc3lzdGVtcywgbWljcm9zZXJ2aWNlcywgYW5kIGxvZyBhZ2dyZWdhdGlvbi5cbiAqXG4gKiBAbW9kdWxlIENvcnJlbGF0aW9uSWRHZW5lcmF0b3JcbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbSBVVUlEIHY0IHN0cmluZy5cbiAqXG4gKiBQcmVmZXJzIG5hdGl2ZSBgY3J5cHRvLnJhbmRvbVVVSUQoKWAgd2hlbiBhdmFpbGFibGUgKG1vZGVybiBicm93c2VycyBhbmQgTm9kZS5qcyAxOSspLFxuICogZmFsbGluZyBiYWNrIHRvIGEgY29tcGxpYW50IFVVSUQgdjQgaW1wbGVtZW50YXRpb24gdXNpbmcgYE1hdGgucmFuZG9tKClgLlxuICpcbiAqIEBpbnRlcm5hbCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBwdWJsaWMgQVBJXG4gKiBAcmV0dXJucyBBIFVVSUQgdjQgc3RyaW5nIGluIHRoZSBmb3JtYXQgYHh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICogLy8gPT4gXCJhMWIyYzNkNC1lNWY2LTQ3ODktYTAxMi1iM2M0ZDVlNmY3YThcIlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIFVVSUQgdjQgZ2VuZXJhdG9yXG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGMgPT4ge1xuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG5cbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbiBJRCBmb3IgQVBJIHJlcXVlc3QgdHJhY2tpbmcgYW5kIGRpc3RyaWJ1dGVkIHRyYWNpbmcuXG4gKlxuICogQ29ycmVsYXRpb24gSURzIGhlbHAgdHJhY2sgcmVxdWVzdHMgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCBzeXN0ZW1zLiBUaGV5IGFyZVxuICogYXV0b21hdGljYWxseSBhdHRhY2hlZCB0byBvdXRnb2luZyByZXF1ZXN0cyB2aWEgSFRUUCBoZWFkZXJzIChgWC1Db3JyZWxhdGlvbi1JZGAgYW5kXG4gKiBgWC1SZXF1ZXN0LUlkYCkgYW5kIGNhbiBiZSB1c2VkIHRvOlxuICogLSBDb3JyZWxhdGUgbG9ncyBhY3Jvc3MgZGlzdHJpYnV0ZWQgc3lzdGVtc1xuICogLSBUcmFjayByZXF1ZXN0IGZsb3dzIGluIG1pY3Jvc2VydmljZXMgYXJjaGl0ZWN0dXJlc1xuICogLSBEZWJ1ZyBpc3N1ZXMgYnkgdHJhY2luZyBhIHNwZWNpZmljIHJlcXVlc3QncyBqb3VybmV5XG4gKiAtIE1vbml0b3IgcGVyZm9ybWFuY2UgYWNyb3NzIHNlcnZpY2UgYm91bmRhcmllc1xuICpcbiAqIFRoZSBnZW5lcmF0ZWQgSUQgZm9sbG93cyB0aGUgZm9ybWF0OiBge3ByZWZpeH0te3V1aWR9YCBvciBqdXN0IGB7dXVpZH1gIGlmIG5vIHByZWZpeCBpcyBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gT3B0aW9uYWwgcHJlZml4IHRvIG5hbWVzcGFjZSBjb3JyZWxhdGlvbiBJRHMgYnkgY29udGV4dCAoZS5nLiwgJ2FwaScsICd3ZWInLCAnbW9iaWxlJylcbiAqIEByZXR1cm5zIEEgY29ycmVsYXRpb24gSUQgc3RyaW5nLCBvcHRpb25hbGx5IHByZWZpeGVkXG4gKiBAcHVibGljXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaWQgPSBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQoKTtcbiAqIC8vID0+IFwiYTFiMmMzZDQtZTVmNi00Nzg5LWEwMTItYjNjNGQ1ZTZmN2E4XCJcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHByZWZpeCBmb3IgY29udGV4dCBpZGVudGlmaWNhdGlvbjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHdlYklkID0gZ2VuZXJhdGVDb3JyZWxhdGlvbklkKCd3ZWInKTtcbiAqIC8vID0+IFwid2ViLWExYjJjM2Q0LWU1ZjYtNDc4OS1hMDEyLWIzYzRkNWU2ZjdhOFwiXG4gKlxuICogY29uc3QgYXBpSWQgPSBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQoJ2FwaScpO1xuICogLy8gPT4gXCJhcGktZjFlMmQzYzQtYjVhNi00OTg3LWEwMTItYjNjNGQ1ZTZmN2E4XCJcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDb25maWd1cmluZyBpbiBBcGlDbGllbnQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KCdodHRwczovL2FwaS5leGFtcGxlLmNvbScpO1xuICogY2xpZW50LnNldENvcnJlbGF0aW9uSWRQcmVmaXgoJ21vYmlsZScpO1xuICogLy8gQWxsIHJlcXVlc3RzIHdpbGwgaGF2ZSBjb3JyZWxhdGlvbiBJRHMgbGlrZSBcIm1vYmlsZS17dXVpZH1cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQocHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuXG4gIHJldHVybiBwcmVmaXggPyBgJHtwcmVmaXh9LSR7dXVpZH1gIDogdXVpZDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVycm9yLCBBcGlFcnJvclR5cGUgfSBmcm9tICcuLi90eXBlcy9BcGlFcnJvcic7XHJcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbmZpZyB9IGZyb20gJy4uL3R5cGVzL1JlcXVlc3RDb25maWcnO1xyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZXMgdmFyaW91cyBlcnJvciB0eXBlcyBpbnRvIGEgY29uc2lzdGVudCwgc3RydWN0dXJlZCBBcGlFcnJvciBmb3JtYXQuXHJcbiAqXHJcbiAqIFRoaXMgaW50ZXJuYWwgY2xhc3MgaGFuZGxlcyB0aGUgY29tcGxleCB0YXNrIG9mIGNvbnZlcnRpbmcgYW55IHR5cGUgb2YgZXJyb3JcclxuICogKG5ldHdvcmsgZXJyb3JzLCBIVFRQIGVycm9ycywgYWJvcnQgZXJyb3JzLCB0aW1lb3V0cywgZXRjLikgaW50byBhIHN0YW5kYXJkaXplZFxyXG4gKiB7QGxpbmsgQXBpRXJyb3J9IHN0cnVjdHVyZSB3aXRoIHByb3BlciBjYXRlZ29yaXphdGlvbiBhbmQgbWV0YWRhdGEuXHJcbiAqXHJcbiAqIEtleSBGZWF0dXJlczpcclxuICogLSAqKkVycm9yIENhdGVnb3JpemF0aW9uKio6IENsYXNzaWZpZXMgZXJyb3JzIGJ5IHR5cGUgKHZhbGlkYXRpb24sIGNsaWVudCwgc2VydmVyLCBuZXR3b3JrLCBldGMuKVxyXG4gKiAtICoqSFRUUCBTdGF0dXMgTWFwcGluZyoqOiBDb252ZXJ0cyBzdGF0dXMgY29kZXMgdG8gaHVtYW4tcmVhZGFibGUgdGl0bGVzXHJcbiAqIC0gKipDb3JyZWxhdGlvbiBJRCBUcmFja2luZyoqOiBQcmVzZXJ2ZXMgb3IgaW5qZWN0cyBjb3JyZWxhdGlvbiBJRHMgZm9yIHRyYWNpbmdcclxuICogLSAqKkFib3J0IERldGVjdGlvbioqOiBJZGVudGlmaWVzIGFuZCBwcm9wZXJseSBoYW5kbGVzIHJlcXVlc3QgY2FuY2VsbGF0aW9uc1xyXG4gKiAtICoqQ29uc2lzdGVudCBTdHJ1Y3R1cmUqKjogRW5zdXJlcyBhbGwgZXJyb3JzIGNvbmZvcm0gdG8gdGhlIEFwaUVycm9yIGludGVyZmFjZVxyXG4gKlxyXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEVycm9yTm9ybWFsaXplciB7XHJcbiAgLyoqXHJcbiAgICogTWFwcyBhbiBIVFRQIHN0YXR1cyBjb2RlIHRvIGEgc3RhbmRhcmRpemVkIGVycm9yIHR5cGUgY2F0ZWdvcnkuXHJcbiAgICpcclxuICAgKiBUaGlzIGNhdGVnb3JpemF0aW9uIGhlbHBzIGNvbnN1bWVycyBoYW5kbGUgZGlmZmVyZW50IGVycm9yIGNsYXNzZXMgYXBwcm9wcmlhdGVseTpcclxuICAgKiAtIGB2YWxpZGF0aW9uX2Vycm9yYCAoNDAwKTogQ2xpZW50IHNlbnQgaW52YWxpZCBkYXRhXHJcbiAgICogLSBgY2xpZW50X2Vycm9yYCAoNDAxLTQ5OSk6IENsaWVudC1zaWRlIGlzc3VlcyAoYXV0aCwgcGVybWlzc2lvbnMsIG5vdCBmb3VuZCwgZXRjLilcclxuICAgKiAtIGBzZXJ2ZXJfZXJyb3JgICg1MDAtNTk5KTogU2VydmVyLXNpZGUgZmFpbHVyZXNcclxuICAgKiAtIGB1bmtub3duX2Vycm9yYDogVW5yZWNvZ25pemVkIHN0YXR1cyBjb2Rlc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXR1cyAtIEhUVFAgc3RhdHVzIGNvZGUgZnJvbSB0aGUgcmVzcG9uc2VcclxuICAgKiBAcmV0dXJucyBUaGUgZXJyb3IgdHlwZSBjYXRlZ29yeSBhcyBhIHN0cmluZ1xyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogbm9ybWFsaXplci5nZXRFcnJvclR5cGUoNDAwKTsgLy8gPT4gJ3ZhbGlkYXRpb25fZXJyb3InXHJcbiAgICogbm9ybWFsaXplci5nZXRFcnJvclR5cGUoNDA0KTsgLy8gPT4gJ2NsaWVudF9lcnJvcidcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVHlwZSg1MDApOyAvLyA9PiAnc2VydmVyX2Vycm9yJ1xyXG4gICAqIG5vcm1hbGl6ZXIuZ2V0RXJyb3JUeXBlKDApOyAgIC8vID0+ICd1bmtub3duX2Vycm9yJ1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGdldEVycm9yVHlwZShzdGF0dXM6IG51bWJlcik6IEFwaUVycm9yVHlwZSB7XHJcbiAgICBpZiAoc3RhdHVzID49IDQwMCAmJiBzdGF0dXMgPCA1MDApIHtcclxuICAgICAgcmV0dXJuIHN0YXR1cyA9PT0gNDAwID8gJ3ZhbGlkYXRpb25fZXJyb3InIDogJ2NsaWVudF9lcnJvcic7XHJcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA1MDApIHtcclxuICAgICAgcmV0dXJuICdzZXJ2ZXJfZXJyb3InO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAndW5rbm93bl9lcnJvcic7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXBzIGFuIEhUVFAgc3RhdHVzIGNvZGUgdG8gYSBodW1hbi1yZWFkYWJsZSBlcnJvciB0aXRsZS5cclxuICAgKlxyXG4gICAqIFByb3ZpZGVzIHVzZXItZnJpZW5kbHkgZXJyb3IgbWVzc2FnZXMgZm9yIGNvbW1vbiBIVFRQIHN0YXR1cyBjb2Rlcy5cclxuICAgKiBGYWxscyBiYWNrIHRvIGEgZ2VuZXJpYyBcIkhUVFAgRXJyb3Ige3N0YXR1c31cIiBmb3JtYXQgZm9yIHVubWFwcGVkIGNvZGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXR1cyAtIEhUVFAgc3RhdHVzIGNvZGUgZnJvbSB0aGUgcmVzcG9uc2VcclxuICAgKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIHRpdGxlXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVGl0bGUoNDA0KTsgLy8gPT4gJ05vdCBGb3VuZCdcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVGl0bGUoNTAwKTsgLy8gPT4gJ0ludGVybmFsIFNlcnZlciBFcnJvcidcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVGl0bGUoOTk5KTsgLy8gPT4gJ0hUVFAgRXJyb3IgOTk5J1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGdldEVycm9yVGl0bGUoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGl0bGVzOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xyXG4gICAgICA0MDA6ICdCYWQgUmVxdWVzdCcsXHJcbiAgICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXHJcbiAgICAgIDQwMzogJ0ZvcmJpZGRlbicsXHJcbiAgICAgIDQwNDogJ05vdCBGb3VuZCcsXHJcbiAgICAgIDQwNTogJ01ldGhvZCBOb3QgQWxsb3dlZCcsXHJcbiAgICAgIDQwODogJ1JlcXVlc3QgVGltZW91dCcsXHJcbiAgICAgIDQwOTogJ0NvbmZsaWN0JyxcclxuICAgICAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLFxyXG4gICAgICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsXHJcbiAgICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXHJcbiAgICAgIDUwMjogJ0JhZCBHYXRld2F5JyxcclxuICAgICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXHJcbiAgICAgIDUwNDogJ0dhdGV3YXkgVGltZW91dCcsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aXRsZXNbc3RhdHVzXSB8fCBgSFRUUCBFcnJvciAke3N0YXR1c31gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm9ybWFsaXplcyBhbnkgZXJyb3IgaW50byBhIGNvbnNpc3RlbnQsIHN0cnVjdHVyZWQgQXBpRXJyb3IgZm9ybWF0LlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyB2YXJpb3VzIGVycm9yIHNjZW5hcmlvcyBhbmQgZW5zdXJlcyB0aGV5IGFsbCBjb25mb3JtIHRvXHJcbiAgICogdGhlIHtAbGluayBBcGlFcnJvcn0gaW50ZXJmYWNlIHdpdGggYXBwcm9wcmlhdGUgY2F0ZWdvcml6YXRpb24gYW5kIG1ldGFkYXRhOlxyXG4gICAqXHJcbiAgICogLSAqKkV4aXN0aW5nIEFwaUVycm9ycyoqOiBFbmhhbmNlcyB3aXRoIG1pc3NpbmcgZmllbGRzICh0cmFjZUlkLCBjb25maWcpXHJcbiAgICogLSAqKkFib3J0RXJyb3JzKio6IE1hcmtzIGFzIGByZXF1ZXN0X2NhbmNlbGxlZGAgd2l0aCBpc0Fib3J0ZWQgZmxhZ1xyXG4gICAqIC0gKipUaW1lb3V0IEVycm9ycyoqOiBDYXRlZ29yaXplcyBhcyBgdGltZW91dF9lcnJvcmAgd2l0aCA0MDggc3RhdHVzXHJcbiAgICogLSAqKk5ldHdvcmsgRXJyb3JzKio6IENhdGVnb3JpemVzIGFzIGBuZXR3b3JrX2Vycm9yYCB3aXRoIDAgc3RhdHVzXHJcbiAgICogLSAqKlVua25vd24gRXJyb3JzKio6IEZhbGxiYWNrIGNhdGVnb3J5IGZvciB1bmV4cGVjdGVkIGVycm9yIHR5cGVzXHJcbiAgICpcclxuICAgKiBBbGwgbm9ybWFsaXplZCBlcnJvcnMgaW5jbHVkZTpcclxuICAgKiAtIGB0eXBlYDogRXJyb3IgY2F0ZWdvcnkgZm9yIHByb2dyYW1tYXRpYyBoYW5kbGluZ1xyXG4gICAqIC0gYHRpdGxlYDogSHVtYW4tcmVhZGFibGUgZXJyb3IgdGl0bGVcclxuICAgKiAtIGBzdGF0dXNgOiBIVFRQIHN0YXR1cyBjb2RlIChvciAwIGZvciBub24tSFRUUCBlcnJvcnMpXHJcbiAgICogLSBgdHJhY2VJZGA6IENvcnJlbGF0aW9uIElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nXHJcbiAgICogLSBgaXNBYm9ydGVkYDogQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgcmVxdWVzdCB3YXMgY2FuY2VsbGVkXHJcbiAgICogLSBgY29uZmlnYDogT3JpZ2luYWwgcmVxdWVzdCBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmdcclxuICAgKlxyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBub3JtYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIHJlcXVlc3QgY29uZmlndXJhdGlvbiB0aGF0IGxlZCB0byB0aGlzIGVycm9yXHJcbiAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQgLSBPcHRpb25hbCBjb3JyZWxhdGlvbiBJRCBmb3IgdHJhY2luZ1xyXG4gICAqIEByZXR1cm5zIEEgZnVsbHkgc3RydWN0dXJlZCBBcGlFcnJvciBpbnN0YW5jZVxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBOb3JtYWxpemluZyBhIGZldGNoIEFib3J0RXJyb3I6XHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIHRyeSB7XHJcbiAgICogICBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsIH0pO1xyXG4gICAqIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICogICBjb25zdCBhcGlFcnJvciA9IG5vcm1hbGl6ZXIubm9ybWFsaXplRXJyb3IoZXJyb3IsIGNvbmZpZywgJ3JlcS0xMjMnKTtcclxuICAgKiAgIC8vIGFwaUVycm9yLnR5cGUgPT09ICdyZXF1ZXN0X2NhbmNlbGxlZCdcclxuICAgKiAgIC8vIGFwaUVycm9yLmlzQWJvcnRlZCA9PT0gdHJ1ZVxyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogTm9ybWFsaXppbmcgYSB0aW1lb3V0OlxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCB0aW1lb3V0RXJyb3IgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgdGltZW91dCBhZnRlciAzMDAwMG1zJyk7XHJcbiAgICogY29uc3QgYXBpRXJyb3IgPSBub3JtYWxpemVyLm5vcm1hbGl6ZUVycm9yKHRpbWVvdXRFcnJvciwgY29uZmlnKTtcclxuICAgKiAvLyBhcGlFcnJvci50eXBlID09PSAndGltZW91dF9lcnJvcidcclxuICAgKiAvLyBhcGlFcnJvci5zdGF0dXMgPT09IDQwOFxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIG5vcm1hbGl6ZUVycm9yKFxyXG4gICAgZXJyb3I6IHVua25vd24sXHJcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcsXHJcbiAgICBjb3JyZWxhdGlvbklkPzogc3RyaW5nXHJcbiAgKTogQXBpRXJyb3Ige1xyXG4gICAgLy8gSGFuZGxlIHByaW1pdGl2ZSBlcnJvcnMgKHN0cmluZ3MsIG51bWJlcnMsIGV0Yy4pXHJcbiAgICBpZiAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnKSwge1xyXG4gICAgICAgIHR5cGU6ICd1bmtub3duX2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ1Vua25vd24gRXJyb3InLFxyXG4gICAgICAgIHN0YXR1czogMCxcclxuICAgICAgICB0cmFjZUlkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgIGlzQWJvcnRlZDogZmFsc2UsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3RyaW5nIGVycm9yc1xyXG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVycm9yKSwge1xyXG4gICAgICAgIHR5cGU6ICd1bmtub3duX2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ1Vua25vd24gRXJyb3InLFxyXG4gICAgICAgIHN0YXR1czogMCxcclxuICAgICAgICB0cmFjZUlkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgIGlzQWJvcnRlZDogZmFsc2UsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBQYXJ0aWFsPEFwaUVycm9yPiAmIHsgbWVzc2FnZT86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9O1xyXG5cclxuICAgIC8vIElmIGVycm9yIGFscmVhZHkgaGFzIEFwaUVycm9yIHN0cnVjdHVyZSwgZW5oYW5jZSBpdFxyXG4gICAgaWYgKGVyci50eXBlIHx8IGVyci50aXRsZSB8fCBlcnIuZXJyb3JzKSB7XHJcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnIubWVzc2FnZSA/PyAnVW5rbm93biBlcnJvcicpLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxyXG4gICAgICAgICAgdGl0bGU6IGVyci50aXRsZSxcclxuICAgICAgICAgIHN0YXR1czogZXJyLnN0YXR1cyxcclxuICAgICAgICAgIHRyYWNlSWQ6IGVyci50cmFjZUlkIHx8IGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICBlcnJvcnM6IGVyci5lcnJvcnMsXHJcbiAgICAgICAgICBpc0Fib3J0ZWQ6IGVyci5pc0Fib3J0ZWQgfHwgZmFsc2UsXHJcbiAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InIHx8IGVyci5pc0Fib3J0ZWQpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVyci5tZXNzYWdlID8/ICdSZXF1ZXN0IHdhcyBhYm9ydGVkJyksIHtcclxuICAgICAgICB0eXBlOiAncmVxdWVzdF9jYW5jZWxsZWQnLFxyXG4gICAgICAgIHRpdGxlOiAnUmVxdWVzdCB3YXMgY2FuY2VsbGVkJyxcclxuICAgICAgICBzdGF0dXM6IDAsXHJcbiAgICAgICAgdHJhY2VJZDogY29ycmVsYXRpb25JZCxcclxuICAgICAgICBpc0Fib3J0ZWQ6IHRydWUsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXJyLm1lc3NhZ2U/LmluY2x1ZGVzKCd0aW1lb3V0JykpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVyci5tZXNzYWdlKSwge1xyXG4gICAgICAgIHR5cGU6ICd0aW1lb3V0X2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ1JlcXVlc3QgVGltZW91dCcsXHJcbiAgICAgICAgc3RhdHVzOiA0MDgsXHJcbiAgICAgICAgdHJhY2VJZDogY29ycmVsYXRpb25JZCxcclxuICAgICAgICBpc0Fib3J0ZWQ6IHRydWUsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXJyLm1lc3NhZ2U/LmluY2x1ZGVzKCduZXR3b3JrJykpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVyci5tZXNzYWdlID8/ICdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJyksIHtcclxuICAgICAgICB0eXBlOiAnbmV0d29ya19lcnJvcicsXHJcbiAgICAgICAgdGl0bGU6ICdOZXR3b3JrIEVycm9yJyxcclxuICAgICAgICBzdGF0dXM6IDAsXHJcbiAgICAgICAgdHJhY2VJZDogY29ycmVsYXRpb25JZCxcclxuICAgICAgICBpc0Fib3J0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIGNvbmZpZyxcclxuICAgICAgfSBhcyBBcGlFcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgIG5ldyBFcnJvcihlcnIubWVzc2FnZSA/PyAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcpLFxyXG4gICAgICB7XHJcbiAgICAgICAgdHlwZTogJ3Vua25vd25fZXJyb3InLFxyXG4gICAgICAgIHRpdGxlOiAnVW5rbm93biBFcnJvcicsXHJcbiAgICAgICAgc3RhdHVzOiAwLFxyXG4gICAgICAgIHRyYWNlSWQ6IGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgaXNBYm9ydGVkOiBmYWxzZSxcclxuICAgICAgICBjb25maWcsXHJcbiAgICAgIH0gYXMgQXBpRXJyb3JcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvQXBpRXJyb3InO1xuaW1wb3J0IHR5cGUgeyBFcnJvckludGVyY2VwdG9yIH0gZnJvbSAnLi4vdHlwZXMvRXJyb3JJbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb25maWcgfSBmcm9tICcuLi90eXBlcy9SZXF1ZXN0Q29uZmlnJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEludGVyY2VwdG9yIH0gZnJvbSAnLi4vdHlwZXMvUmVxdWVzdEludGVyY2VwdG9yJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2VJbnRlcmNlcHRvciB9IGZyb20gJy4uL3R5cGVzL1Jlc3BvbnNlSW50ZXJjZXB0b3InO1xuXG5pbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnQC90eXBlcyc7XG5cbi8qKlxuICogTWFuYWdlcyB0aGUgcmVnaXN0cmF0aW9uIGFuZCBleGVjdXRpb24gb2YgcmVxdWVzdC9yZXNwb25zZS9lcnJvciBpbnRlcmNlcHRvcnMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBpbnRlcmNlcHRvciBwYXR0ZXJuLCBhbGxvd2luZyBtaWRkbGV3YXJlLXN0eWxlXG4gKiBmdW5jdGlvbnMgdG8gYmUgcmVnaXN0ZXJlZCBhbmQgZXhlY3V0ZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aGUgcmVxdWVzdCBsaWZlY3ljbGU6XG4gKiAtICoqUmVxdWVzdCBJbnRlcmNlcHRvcnMqKjogTW9kaWZ5IHJlcXVlc3RzIGJlZm9yZSB0aGV5IGFyZSBzZW50XG4gKiAtICoqUmVzcG9uc2UgSW50ZXJjZXB0b3JzKio6IFRyYW5zZm9ybSByZXNwb25zZXMgYmVmb3JlIHRoZXkgYXJlIHJldHVybmVkXG4gKiAtICoqRXJyb3IgSW50ZXJjZXB0b3JzKio6IEhhbmRsZSBvciB0cmFuc2Zvcm0gZXJyb3JzIGJlZm9yZSB0aGV5IGFyZSB0aHJvd25cbiAqXG4gKiBJbnRlcmNlcHRvcnMgYXJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseSBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQsXG4gKiBmb3JtaW5nIGEgcHJvY2Vzc2luZyBwaXBlbGluZS4gRWFjaCBpbnRlcmNlcHRvciBjYW46XG4gKiAtIEluc3BlY3QgdGhlIGRhdGEgcGFzc2luZyB0aHJvdWdoXG4gKiAtIFRyYW5zZm9ybSBvciBlbmhhbmNlIHRoZSBkYXRhXG4gKiAtIFNob3J0LWNpcmN1aXQgdGhlIHBpcGVsaW5lIChmb3IgZXJyb3JzKVxuICogLSBQZXJmb3JtIHNpZGUgZWZmZWN0cyAobG9nZ2luZywgbW9uaXRvcmluZywgZXRjLilcbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtICoqU2VxdWVudGlhbCBFeGVjdXRpb24qKjogSW50ZXJjZXB0b3JzIHJ1biBpbiByZWdpc3RyYXRpb24gb3JkZXJcbiAqIC0gKipVbnJlZ2lzdHJhdGlvbiBTdXBwb3J0Kio6IFJldHVybnMgY2xlYW51cCBmdW5jdGlvbiBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICogLSAqKlR5cGUgU2FmZXR5Kio6IEZ1bGx5IHR5cGVkIGludGVyY2VwdG9yIGZ1bmN0aW9ucyB3aXRoIGdlbmVyaWNzXG4gKiAtICoqRXJyb3IgSGFuZGxpbmcqKjogR3JhY2VmdWwgaGFuZGxpbmcgb2YgaW50ZXJjZXB0b3IgZmFpbHVyZXNcbiAqXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBDb21tb24gaW50ZXJjZXB0b3IgcGF0dGVybnM6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtYW5hZ2VyID0gbmV3IEludGVyY2VwdG9yTWFuYWdlcigpO1xuICpcbiAqIC8vIFJlcXVlc3QgbG9nZ2luZ1xuICogbWFuYWdlci5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoYXN5bmMgKGNvbmZpZykgPT4ge1xuICogICBjb25zb2xlLmxvZygnUmVxdWVzdDonLCBjb25maWcubWV0aG9kLCBjb25maWcudXJsKTtcbiAqICAgcmV0dXJuIGNvbmZpZztcbiAqIH0pO1xuICpcbiAqIC8vIFJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uXG4gKiBtYW5hZ2VyLmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gKiAgIGlmIChyZXNwb25zZS5hcGlEYXRhKSB7XG4gKiAgICAgcmVzcG9uc2UuYXBpRGF0YSA9IGNhbWVsQ2FzZUtleXMocmVzcG9uc2UuYXBpRGF0YSk7XG4gKiAgIH1cbiAqICAgcmV0dXJuIHJlc3BvbnNlO1xuICogfSk7XG4gKlxuICogLy8gRXJyb3IgbW9uaXRvcmluZ1xuICogbWFuYWdlci5hZGRFcnJvckludGVyY2VwdG9yKGFzeW5jIChlcnJvcikgPT4ge1xuICogICBpZiAoZXJyb3Iuc3RhdHVzID49IDUwMCkge1xuICogICAgIGF3YWl0IGxvZ1RvTW9uaXRvcmluZyhlcnJvcik7XG4gKiAgIH1cbiAqICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIG1haW50YWluIGVycm9yIGZsb3dcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICAvKipcbiAgICogQXJyYXkgb2YgcmVnaXN0ZXJlZCByZXF1ZXN0IGludGVyY2VwdG9yc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0SW50ZXJjZXB0b3JzOiBSZXF1ZXN0SW50ZXJjZXB0b3JbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiByZWdpc3RlcmVkIHJlc3BvbnNlIGludGVyY2VwdG9yc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNwb25zZUludGVyY2VwdG9yczogUmVzcG9uc2VJbnRlcmNlcHRvcltdID0gW107XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHJlZ2lzdGVyZWQgZXJyb3IgaW50ZXJjZXB0b3JzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9ySW50ZXJjZXB0b3JzOiBFcnJvckludGVyY2VwdG9yW10gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcmVxdWVzdCBpbnRlcmNlcHRvciB0byBtb2RpZnkgcmVxdWVzdHMgYmVmb3JlIHRoZXkgYXJlIHNlbnQuXG4gICAqXG4gICAqIFJlcXVlc3QgaW50ZXJjZXB0b3JzIGNhbjpcbiAgICogLSBBZGQgb3IgbW9kaWZ5IGhlYWRlcnNcbiAgICogLSBUcmFuc2Zvcm0gcmVxdWVzdCBib2RpZXNcbiAgICogLSBBZGQgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiAtIEltcGxlbWVudCByZXF1ZXN0IHNpZ25pbmdcbiAgICogLSBMb2cgb3V0Z29pbmcgcmVxdWVzdHNcbiAgICpcbiAgICogQHBhcmFtIGludGVyY2VwdG9yIC0gQXN5bmMgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhbmQgcmV0dXJucyBSZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWRkIGF1dGhlbnRpY2F0aW9uIGhlYWRlclxuICAgKiBjb25zdCB1bnJlZ2lzdGVyID0gbWFuYWdlci5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgKiAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0QXV0aFRva2VuKCk7XG4gICAqICAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCBuZXcgSGVhZGVycygpO1xuICAgKiAgIGNvbmZpZy5oZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt0b2tlbn1gKTtcbiAgICogICByZXR1cm4gY29uZmlnO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTGF0ZXIsIHJlbW92ZSB0aGUgaW50ZXJjZXB0b3JcbiAgICogdW5yZWdpc3RlcigpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcjogUmVxdWVzdEludGVyY2VwdG9yKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLmluZGV4T2YoaW50ZXJjZXB0b3IpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSByZXNwb25zZSBpbnRlcmNlcHRvciB0byB0cmFuc2Zvcm0gcmVzcG9uc2VzIGJlZm9yZSB0aGV5IGFyZSByZXR1cm5lZC5cbiAgICpcbiAgICogUmVzcG9uc2UgaW50ZXJjZXB0b3JzIGNhbjpcbiAgICogLSBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YSBmb3JtYXRcbiAgICogLSBFeHRyYWN0IG5lc3RlZCBkYXRhIHN0cnVjdHVyZXNcbiAgICogLSBBZGQgY29tcHV0ZWQgcHJvcGVydGllc1xuICAgKiAtIENhY2hlIHJlc3BvbnNlc1xuICAgKiAtIExvZyBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJjZXB0b3IgLSBBc3luYyBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGFuZCByZXR1cm5zIEFwaVJlc3BvbnNlXG4gICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRXh0cmFjdCBkYXRhIGZyb20gZW52ZWxvcGVcbiAgICogbWFuYWdlci5hZGRSZXNwb25zZUludGVyY2VwdG9yKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgKiAgIGlmIChyZXNwb25zZS5hcGlEYXRhPy5yZXN1bHQpIHtcbiAgICogICAgIHJlc3BvbnNlLmFwaURhdGEgPSByZXNwb25zZS5hcGlEYXRhLnJlc3VsdDtcbiAgICogICB9XG4gICAqICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gQWRkIHRpbWVzdGFtcHNcbiAgICogbWFuYWdlci5hZGRSZXNwb25zZUludGVyY2VwdG9yKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgKiAgIHJldHVybiB7XG4gICAqICAgICAuLi5yZXNwb25zZSxcbiAgICogICAgIHJlY2VpdmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgKiAgIH07XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3I6IFJlc3BvbnNlSW50ZXJjZXB0b3IpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycy5pbmRleE9mKGludGVyY2VwdG9yKTtcblxuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciBpbnRlcmNlcHRvciB0byBoYW5kbGUgb3IgdHJhbnNmb3JtIGVycm9ycyBiZWZvcmUgdGhleSBhcmUgdGhyb3duLlxuICAgKlxuICAgKiBFcnJvciBpbnRlcmNlcHRvcnMgY2FuOlxuICAgKiAtIExvZyBlcnJvcnMgdG8gbW9uaXRvcmluZyBzZXJ2aWNlc1xuICAgKiAtIFRyYW5zZm9ybSBlcnJvciBmb3JtYXRzXG4gICAqIC0gSW1wbGVtZW50IHJldHJ5IGxvZ2ljXG4gICAqIC0gU2hvdyB1c2VyIG5vdGlmaWNhdGlvbnNcbiAgICogLSBFeHRyYWN0IHZhbGlkYXRpb24gZXJyb3JzXG4gICAqXG4gICAqICoqTm90ZToqKiBFcnJvciBpbnRlcmNlcHRvcnMgc2hvdWxkIHJlLXRocm93IHRoZSBlcnJvciAob3IgYSB0cmFuc2Zvcm1lZCB2ZXJzaW9uKVxuICAgKiB0byBtYWludGFpbiB0aGUgZXJyb3IgZmxvdy4gVGhlIGZpbmFsIGVycm9yIGlzIGFsd2F5cyB0aHJvd24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlcmNlcHRvciAtIEFzeW5jIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYW5kIHJldHVybnMgKG9yIHRocm93cykgQXBpRXJyb3JcbiAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoaXMgaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBMb2cgdG8gbW9uaXRvcmluZyBzZXJ2aWNlXG4gICAqIG1hbmFnZXIuYWRkRXJyb3JJbnRlcmNlcHRvcihhc3luYyAoZXJyb3IpID0+IHtcbiAgICogICBpZiAoZXJyb3Iuc3RhdHVzID49IDUwMCkge1xuICAgKiAgICAgYXdhaXQgU2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oZXJyb3IsIHtcbiAgICogICAgICAgZXh0cmE6IHsgdHJhY2VJZDogZXJyb3IudHJhY2VJZCB9XG4gICAqICAgICB9KTtcbiAgICogICB9XG4gICAqICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIGNvbnRpbnVlIGVycm9yIGZsb3dcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFRyYW5zZm9ybSBlcnJvciBtZXNzYWdlc1xuICAgKiBtYW5hZ2VyLmFkZEVycm9ySW50ZXJjZXB0b3IoYXN5bmMgKGVycm9yKSA9PiB7XG4gICAqICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAqICAgICBlcnJvci50aXRsZSA9ICdSZXNvdXJjZSBub3QgZm91bmQnO1xuICAgKiAgIH1cbiAgICogICB0aHJvdyBlcnJvcjtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcjogRXJyb3JJbnRlcmNlcHRvcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuZXJyb3JJbnRlcmNlcHRvcnMucHVzaChpbnRlcmNlcHRvcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLmluZGV4T2YoaW50ZXJjZXB0b3IpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5lcnJvckludGVyY2VwdG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgcmVnaXN0ZXJlZCByZXF1ZXN0IGludGVyY2VwdG9ycyBpbiBzZXF1ZW50aWFsIG9yZGVyLlxuICAgKlxuICAgKiBFYWNoIGludGVyY2VwdG9yIHJlY2VpdmVzIHRoZSBjb25maWcgbW9kaWZpZWQgYnkgdGhlIHByZXZpb3VzIGludGVyY2VwdG9yLFxuICAgKiBmb3JtaW5nIGEgcHJvY2Vzc2luZyBwaXBlbGluZS4gSWYgYW55IGludGVyY2VwdG9yIHRocm93cyBhbiBlcnJvcixcbiAgICogdGhlIHBpcGVsaW5lIHN0b3BzIGFuZCB0aGUgZXJyb3IgcHJvcGFnYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBpbml0aWFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgcmVxdWVzdCBjb25maWd1cmF0aW9uIGFmdGVyIGFsbCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb25maWcgPSB7IG1ldGhvZDogJ0dFVCcsIHVybDogJy91c2VycycgfTtcbiAgICogY29uc3QgZmluYWxDb25maWcgPSBhd2FpdCBtYW5hZ2VyLmFwcGx5UmVxdWVzdEludGVyY2VwdG9ycyhjb25maWcpO1xuICAgKiAvLyBmaW5hbENvbmZpZyBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgYWxsIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYXBwbHlSZXF1ZXN0SW50ZXJjZXB0b3JzKFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZ1xuICApOiBQcm9taXNlPFJlcXVlc3RDb25maWc+IHtcbiAgICBsZXQgbW9kaWZpZWRDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuXG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIG1vZGlmaWVkQ29uZmlnID0gYXdhaXQgaW50ZXJjZXB0b3IobW9kaWZpZWRDb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RpZmllZENvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFsbCByZWdpc3RlcmVkIHJlc3BvbnNlIGludGVyY2VwdG9ycyBpbiBzZXF1ZW50aWFsIG9yZGVyLlxuICAgKlxuICAgKiBFYWNoIGludGVyY2VwdG9yIHJlY2VpdmVzIHRoZSByZXNwb25zZSBtb2RpZmllZCBieSB0aGUgcHJldmlvdXMgaW50ZXJjZXB0b3IsXG4gICAqIGZvcm1pbmcgYSBwcm9jZXNzaW5nIHBpcGVsaW5lLiBJZiBhbnkgaW50ZXJjZXB0b3IgdGhyb3dzIGFuIGVycm9yLFxuICAgKiB0aGUgcGlwZWxpbmUgc3RvcHMgYW5kIHRoZSBlcnJvciBwcm9wYWdhdGVzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSByZXNwb25zZSBkYXRhXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIFRoZSBpbml0aWFsIEFQSSByZXNwb25zZVxuICAgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgcmVzcG9uc2UgYWZ0ZXIgYWxsIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0geyBkYXRhOiB7IGlkOiAxLCBuYW1lOiAnSm9obicgfSB9O1xuICAgKiBjb25zdCBmaW5hbFJlc3BvbnNlID0gYXdhaXQgbWFuYWdlci5hcHBseVJlc3BvbnNlSW50ZXJjZXB0b3JzKHJlc3BvbnNlKTtcbiAgICogLy8gZmluYWxSZXNwb25zZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgYWxsIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYXBwbHlSZXNwb25zZUludGVyY2VwdG9yczxUPihcbiAgICByZXNwb25zZTogQXBpUmVzcG9uc2U8VD5cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGxldCBtb2RpZmllZFJlc3BvbnNlID0gcmVzcG9uc2U7XG5cbiAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMpIHtcbiAgICAgIG1vZGlmaWVkUmVzcG9uc2UgPSBhd2FpdCBpbnRlcmNlcHRvcihtb2RpZmllZFJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kaWZpZWRSZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFsbCByZWdpc3RlcmVkIGVycm9yIGludGVyY2VwdG9ycyBpbiBzZXF1ZW50aWFsIG9yZGVyIGFuZCByZS10aHJvd3MuXG4gICAqXG4gICAqIEVhY2ggaW50ZXJjZXB0b3IgcmVjZWl2ZXMgdGhlIGVycm9yIChwb3RlbnRpYWxseSBtb2RpZmllZCBieSBwcmV2aW91cyBpbnRlcmNlcHRvcnMpLlxuICAgKiBJbnRlcmNlcHRvcnMgY2FuIHRyYW5zZm9ybSB0aGUgZXJyb3IgYmVmb3JlIHJlLXRocm93aW5nIGl0LiBUaGUgZmluYWwgZXJyb3JcbiAgICogaXMgYWx3YXlzIHRocm93biB0byBtYWludGFpbiBlcnJvciBmbG93LlxuICAgKlxuICAgKiBJZiBhbiBpbnRlcmNlcHRvciBpdHNlbGYgdGhyb3dzIGFuIGVycm9yLCB0aGF0IGJlY29tZXMgdGhlIG5ldyBlcnJvciB0byBwcm9jZXNzXG4gICAqIGJ5IHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgaW5pdGlhbCBBUEkgZXJyb3JcbiAgICogQHJldHVybnMgTmV2ZXIgcmV0dXJucyAoYWx3YXlzIHRocm93cylcbiAgICogQHRocm93cyBUaGUgZmluYWwgZXJyb3IgYWZ0ZXIgYWxsIGludGVyY2VwdG9ycyBoYXZlIHByb2Nlc3NlZCBpdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRyeSB7XG4gICAqICAgYXdhaXQgbWFuYWdlci5hcHBseUVycm9ySW50ZXJjZXB0b3JzKGVycm9yKTtcbiAgICogfSBjYXRjaCAoZmluYWxFcnJvcikge1xuICAgKiAgIC8vIGZpbmFsRXJyb3IgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IGFsbCByZWdpc3RlcmVkIGVycm9yIGludGVyY2VwdG9yc1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYXBwbHlFcnJvckludGVyY2VwdG9ycyhlcnJvcjogQXBpRXJyb3IpOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgbGV0IG1vZGlmaWVkRXJyb3IgPSBlcnJvcjtcblxuICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgdGhpcy5lcnJvckludGVyY2VwdG9ycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbW9kaWZpZWRFcnJvciA9IGF3YWl0IGludGVyY2VwdG9yKG1vZGlmaWVkRXJyb3IpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBtb2RpZmllZEVycm9yID0gZSBhcyBBcGlFcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBtb2RpZmllZEVycm9yO1xuICB9XG59XG4iLCAiLyoqXG4gKiBNYW5hZ2VzIGFjdGl2ZSBIVFRQIHJlcXVlc3RzIHdpdGggc3VwcG9ydCBmb3IgY2FuY2VsbGF0aW9uIGFuZCBjb3JyZWxhdGlvbiB0cmFja2luZy5cbiAqXG4gKiBUaGlzIGludGVybmFsIGNsYXNzIG1haW50YWlucyBhIHJlZ2lzdHJ5IG9mIGluLWZsaWdodCByZXF1ZXN0cywgYWxsb3dpbmcgdGhlbSB0byBiZVxuICogY2FuY2VsbGVkIGluZGl2aWR1YWxseSBvciBpbiBidWxrLiBFYWNoIHJlcXVlc3QgaXMgdHJhY2tlZCBieSBhIHVuaXF1ZSBrZXkgYW5kXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBjb3JyZWxhdGlvbiBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZy5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtICoqUmVxdWVzdCBEZWR1cGxpY2F0aW9uKio6IEF1dG9tYXRpY2FsbHkgY2FuY2VscyBkdXBsaWNhdGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBrZXlcbiAqIC0gKipDb3JyZWxhdGlvbiBUcmFja2luZyoqOiBNYXBzIHJlcXVlc3Qga2V5cyB0byBjb3JyZWxhdGlvbiBJRHMgZm9yIHRyYWNpbmdcbiAqIC0gKipCdWxrIENhbmNlbGxhdGlvbioqOiBDYW5jZWwgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXQgb25jZSAodXNlZnVsIGZvciBjbGVhbnVwKVxuICogLSAqKk1lbW9yeSBNYW5hZ2VtZW50Kio6IEF1dG9tYXRpY2FsbHkgY2xlYW5zIHVwIHRyYWNraW5nIGRhdGEgd2hlbiByZXF1ZXN0cyBjb21wbGV0ZVxuICpcbiAqIEBpbnRlcm5hbCBUaGlzIGNsYXNzIGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBwdWJsaWMgQVBJXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1hbmFnZXIgPSBuZXcgUmVxdWVzdE1hbmFnZXIoKTtcbiAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKlxuICogLy8gVHJhY2sgYSByZXF1ZXN0XG4gKiBtYW5hZ2VyLmFkZCgnR0VUXy91c2Vycy8xMjMnLCBjb250cm9sbGVyLCAnYXBpLWFiYzEyMycpO1xuICpcbiAqIC8vIENhbmNlbCBzcGVjaWZpYyByZXF1ZXN0XG4gKiBtYW5hZ2VyLmNhbmNlbCgnR0VUXy91c2Vycy8xMjMnKTtcbiAqXG4gKiAvLyBPciBjYW5jZWwgYWxsIHJlcXVlc3RzXG4gKiBtYW5hZ2VyLmNhbmNlbEFsbCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TWFuYWdlciB7XG4gIC8qKlxuICAgKiBNYXAgb2YgYWN0aXZlIHJlcXVlc3Qga2V5cyB0byB0aGVpciBhYm9ydCBjb250cm9sbGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVSZXF1ZXN0czogTWFwPHN0cmluZywgQWJvcnRDb250cm9sbGVyPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogTWFwIG9mIHJlcXVlc3Qga2V5cyB0byB0aGVpciBjb3JyZWxhdGlvbiBJRHMgZm9yIHRyYWNpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29ycmVsYXRpb25NYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyByZXF1ZXN0IGZvciB0cmFja2luZyBhbmQgY2FuY2VsbGF0aW9uIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIElmIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gICAqIGNhbmNlbGxlZCBiZWZvcmUgdGhlIG5ldyBvbmUgaXMgcmVnaXN0ZXJlZCAocmVxdWVzdCBkZWR1cGxpY2F0aW9uKS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCAodHlwaWNhbGx5IG1ldGhvZCArIFVSTCArIHRpbWVzdGFtcClcbiAgICogQHBhcmFtIGNvbnRyb2xsZXIgLSBBYm9ydENvbnRyb2xsZXIgZm9yIGNhbmNlbGxpbmcgdGhlIHJlcXVlc3RcbiAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQgLSBDb3JyZWxhdGlvbiBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAqIG1hbmFnZXIuYWRkKCdHRVRfL2FwaS91c2Vyc18xNjk5OTk5OTk5JywgY29udHJvbGxlciwgJ2FwaS1hYmMxMjMnKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGQoa2V5OiBzdHJpbmcsIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciwgY29ycmVsYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ2FuY2VsIGV4aXN0aW5nIHJlcXVlc3Qgd2l0aCBzYW1lIGtleSBpZiBleGlzdHNcbiAgICB0aGlzLmNhbmNlbChrZXkpO1xuICAgIHRoaXMuYWN0aXZlUmVxdWVzdHMuc2V0KGtleSwgY29udHJvbGxlcik7XG4gICAgdGhpcy5jb3JyZWxhdGlvbk1hcC5zZXQoa2V5LCBjb3JyZWxhdGlvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVxdWVzdCBmcm9tIHRyYWNraW5nIHdpdGhvdXQgY2FuY2VsbGluZyBpdC5cbiAgICpcbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gYSByZXF1ZXN0IGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgb3IgZmFpbHMuXG4gICAqIFVzZSB7QGxpbmsgY2FuY2VsfSBpbnN0ZWFkIGlmIHlvdSBuZWVkIHRvIGFib3J0IHRoZSByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0IHRvIHJlbW92ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIENhbGxlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHJlcXVlc3QgY29tcGxldGVzXG4gICAqIG1hbmFnZXIucmVtb3ZlKCdHRVRfL2FwaS91c2Vyc18xNjk5OTk5OTk5Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXF1ZXN0cy5kZWxldGUoa2V5KTtcbiAgICB0aGlzLmNvcnJlbGF0aW9uTWFwLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYSBzcGVjaWZpYyByZXF1ZXN0IGFuZCByZW1vdmVzIGl0IGZyb20gdHJhY2tpbmcuXG4gICAqXG4gICAqIElmIHRoZSByZXF1ZXN0IGRvZXNuJ3QgZXhpc3Qgb3Igd2FzIGFscmVhZHkgY2FuY2VsbGVkLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLlxuICAgKiBUaGUgYXNzb2NpYXRlZCBBYm9ydENvbnRyb2xsZXIncyBzaWduYWwgd2lsbCBiZSB0cmlnZ2VyZWQsIGNhdXNpbmcgYW55IGFjdGl2ZVxuICAgKiBmZXRjaCBvcGVyYXRpb25zIHRvIGFib3J0LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0IHRvIGNhbmNlbFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFVzZXIgbmF2aWdhdGVzIGF3YXksIGNhbmNlbCB0aGUgcGVuZGluZyByZXF1ZXN0XG4gICAqIG1hbmFnZXIuY2FuY2VsKCdHRVRfL2FwaS91c2Vyc18xNjk5OTk5OTk5Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgY2FuY2VsKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuYWN0aXZlUmVxdWVzdHMuZ2V0KGtleSk7XG5cbiAgICBpZiAoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgdGhpcy5hY3RpdmVSZXF1ZXN0cy5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuY29ycmVsYXRpb25NYXAuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYWxsIGFjdGl2ZSByZXF1ZXN0cyBhbmQgY2xlYXJzIGFsbCB0cmFja2luZyBkYXRhLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2xlYW51cCBzY2VuYXJpb3Mgc3VjaCBhczpcbiAgICogLSBVc2VyIGxvZ291dFxuICAgKiAtIENvbXBvbmVudCB1bm1vdW50XG4gICAqIC0gTmF2aWdhdGlvbiB0byBhIGRpZmZlcmVudCBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKiAtIEVycm9yIHJlY292ZXJ5IHRoYXQgcmVxdWlyZXMgYSBjbGVhbiBzbGF0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIENhbmNlbCBhbGwgcGVuZGluZyByZXF1ZXN0cyBvbiBsb2dvdXRcbiAgICogZnVuY3Rpb24gaGFuZGxlTG9nb3V0KCkge1xuICAgKiAgIGFwaUNsaWVudC5jYW5jZWxBbGxSZXF1ZXN0cygpO1xuICAgKiAgIC8vIC4uLiByZXN0IG9mIGxvZ291dCBsb2dpY1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgY2FuY2VsQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUmVxdWVzdHMuZm9yRWFjaChjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgdGhpcy5hY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgIHRoaXMuY29ycmVsYXRpb25NYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIGtleSBpcyBjdXJyZW50bHkgYmVpbmcgdHJhY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlcXVlc3QgaXMgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChtYW5hZ2VyLmhhcygnR0VUXy9hcGkvdXNlcnNfMTY5OTk5OTk5OScpKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1JlcXVlc3QgaXMgc3RpbGwgcGVuZGluZycpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlUmVxdWVzdHMuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjb3JyZWxhdGlvbiBJRCBmb3IgYSBnaXZlbiByZXF1ZXN0IGtleS5cbiAgICpcbiAgICogQ29ycmVsYXRpb24gSURzIGFyZSB1c2VkIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nIGFuZCByZXF1ZXN0IHRyYWNraW5nXG4gICAqIGFjcm9zcyBzZXJ2aWNlcyBhbmQgbG9ncy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBUaGUgY29ycmVsYXRpb24gSUQgaWYgZm91bmQsIGB1bmRlZmluZWRgIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBtYW5hZ2VyLmdldENvcnJlbGF0aW9uSWQoJ0dFVF8vYXBpL3VzZXJzXzE2OTk5OTk5OTknKTtcbiAgICogaWYgKGNvcnJlbGF0aW9uSWQpIHtcbiAgICogICBjb25zb2xlLmxvZygnVHJhY2UgcmVxdWVzdCB3aXRoIElEOicsIGNvcnJlbGF0aW9uSWQpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q29ycmVsYXRpb25JZChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29ycmVsYXRpb25NYXAuZ2V0KGtleSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvQXBpRXJyb3InO1xuXG4vKipcbiAqIEltcGxlbWVudHMgYXV0b21hdGljIHJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBmb3IgZmFpbGVkIEhUVFAgcmVxdWVzdHMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBoYW5kbGVzIHRyYW5zaWVudCBmYWlsdXJlcyBieSBhdXRvbWF0aWNhbGx5IHJldHJ5aW5nIHJlcXVlc3RzXG4gKiB3aXRoIHByb2dyZXNzaXZlbHkgaW5jcmVhc2luZyBkZWxheXMgYmV0d2VlbiBhdHRlbXB0cy4gVGhlIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAqIHN0cmF0ZWd5IGhlbHBzIHByZXZlbnQgb3ZlcndoZWxtaW5nIGEgc3RydWdnbGluZyBzZXJ2ZXIgd2hpbGUgZ2l2aW5nIHRlbXBvcmFyeVxuICogaXNzdWVzIHRpbWUgdG8gcmVzb2x2ZS5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtICoqRXhwb25lbnRpYWwgQmFja29mZioqOiBEb3VibGVzIGRlbGF5IGJldHdlZW4gcmV0cmllcyAoZS5nLiwgMXMsIDJzLCA0cywgOHMpXG4gKiAtICoqU21hcnQgRXJyb3IgRGV0ZWN0aW9uKio6IFNraXBzIHJldHJ5IGZvciBub24tcmV0cnlhYmxlIGVycm9ycyAodmFsaWRhdGlvbiwgYWJvcnRzKVxuICogLSAqKkFib3J0IFN1cHBvcnQqKjogUmVzcGVjdHMgY2FuY2VsbGF0aW9uIHNpZ25hbHMgZHVyaW5nIHJldHJ5IGRlbGF5c1xuICogLSAqKlR5cGUgU2FmZXR5Kio6IEZ1bGx5IGdlbmVyaWMgaW1wbGVtZW50YXRpb24gcHJlc2VydmluZyByZXR1cm4gdHlwZXNcbiAqXG4gKiBSZXRyeSBTdHJhdGVneTpcbiAqIC0gKipSZXRyeWFibGUqKjogTmV0d29yayBlcnJvcnMsIDV4eCBzZXJ2ZXIgZXJyb3JzLCB0aW1lb3V0c1xuICogLSAqKk5vbi1SZXRyeWFibGUqKjogVmFsaWRhdGlvbiBlcnJvcnMgKDQwMCksIEFib3J0RXJyb3JzLCBjYW5jZWxsZWQgcmVxdWVzdHNcbiAqXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBSZXRyeSBjb25maWd1cmF0aW9uIGluIEFwaUNsaWVudDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBBcGlDbGllbnQoJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyk7XG4gKlxuICogLy8gUmV0cnkgdXAgdG8gMyB0aW1lcyB3aXRoIDFzIGluaXRpYWwgZGVsYXlcbiAqIGNvbnN0IHsgYXBpRGF0YSB9ID0gYXdhaXQgY2xpZW50LmdldCgnL3VzZXJzJywge1xuICogICByZXRyaWVzOiAzLFxuICogICByZXRyeURlbGF5OiAxMDAwICAvLyAxcywgMnMsIDRzXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmV0cnlIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFJldHJpZXMgYSBmYWlsZWQgcmVxdWVzdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYgc3RyYXRlZ3kuXG4gICAqXG4gICAqIFRoZSByZXRyeSBsb2dpYyB3b3JrcyBhcyBmb2xsb3dzOlxuICAgKiAxLiBBdHRlbXB0cyB0aGUgcmVxdWVzdCBpbW1lZGlhdGVseVxuICAgKiAyLiBPbiBmYWlsdXJlLCBjaGVja3MgaWYgdGhlIGVycm9yIGlzIHJldHJ5YWJsZVxuICAgKiAzLiBJZiByZXRyeWFibGUgYW5kIHJldHJpZXMgcmVtYWluLCB3YWl0cyBmb3IgdGhlIGN1cnJlbnQgZGVsYXlcbiAgICogNC4gRG91YmxlcyB0aGUgZGVsYXkgZm9yIHRoZSBuZXh0IGF0dGVtcHRcbiAgICogNS4gUmVwZWF0cyB1bnRpbCBzdWNjZXNzIG9yIHJldHJpZXMgZXhoYXVzdGVkXG4gICAqXG4gICAqICoqTm9uLVJldHJ5YWJsZSBFcnJvcnM6KipcbiAgICogLSBWYWxpZGF0aW9uIGVycm9ycyAoNDAwKSAtIENsaWVudCBzZW50IGJhZCBkYXRhXG4gICAqIC0gQWJvcnRFcnJvcnMgLSBSZXF1ZXN0IHdhcyBleHBsaWNpdGx5IGNhbmNlbGxlZFxuICAgKiAtIFJlcXVlc3RzIHdpdGggYWJvcnRlZCBzaWduYWxzXG4gICAqXG4gICAqICoqQWJvcnQgSGFuZGxpbmc6KipcbiAgICogSWYgdGhlIHNpZ25hbCBpcyBhYm9ydGVkIGR1cmluZyBhIHJldHJ5IGRlbGF5LCB0aGUgcmV0cnkgaXMgaW1tZWRpYXRlbHlcbiAgICogY2FuY2VsbGVkIGFuZCBhbiBBYm9ydEVycm9yIGlzIHRocm93bi5cbiAgICpcbiAgICogQHRlbXBsYXRlIFQgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIHJldHJpZWRcbiAgICogQHBhcmFtIGZuIC0gQXN5bmMgZnVuY3Rpb24gdG8gcmV0cnkgb24gZmFpbHVyZVxuICAgKiBAcGFyYW0gcmV0cmllcyAtIE51bWJlciBvZiByZXRyeSBhdHRlbXB0cyByZW1haW5pbmcgKGRlY3JlbWVudHMgZWFjaCByZXRyeSlcbiAgICogQHBhcmFtIGRlbGF5IC0gQ3VycmVudCBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIG5leHQgcmV0cnlcbiAgICogQHBhcmFtIHNpZ25hbCAtIE9wdGlvbmFsIEFib3J0U2lnbmFsIHRvIGNhbmNlbCByZXRyaWVzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBmdW5jdGlvbidzIHJlc3VsdCBvbiBzdWNjZXNzXG4gICAqIEB0aHJvd3MgVGhlIGxhc3QgZXJyb3IgZW5jb3VudGVyZWQgaWYgYWxsIHJldHJpZXMgYXJlIGV4aGF1c3RlZFxuICAgKiBAdGhyb3dzIEFib3J0RXJyb3IgaWYgdGhlIHNpZ25hbCBpcyBhYm9ydGVkIGR1cmluZyBleGVjdXRpb24gb3IgZGVsYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogQmFzaWMgcmV0cnkgdXNhZ2U6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgaGFuZGxlciA9IG5ldyBSZXRyeUhhbmRsZXIoKTtcbiAgICogY29uc3QgZmV0Y2hVc2VyID0gKCkgPT4gZmV0Y2goJy9hcGkvdXNlcnMvMTIzJykudGhlbihyID0+IHIuanNvbigpKTtcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICBjb25zdCB1c2VyID0gYXdhaXQgaGFuZGxlci5yZXRyeVJlcXVlc3QoXG4gICAqICAgICBmZXRjaFVzZXIsXG4gICAqICAgICAzLCAgICAgIC8vIDMgcmV0cmllc1xuICAgKiAgICAgMTAwMCAgICAvLyBTdGFydCB3aXRoIDFzIGRlbGF5XG4gICAqICAgKTtcbiAgICogICBjb25zb2xlLmxvZygnVXNlcjonLCB1c2VyKTtcbiAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICogICBjb25zb2xlLmVycm9yKCdGYWlsZWQgYWZ0ZXIgYWxsIHJldHJpZXM6JywgZXJyb3IpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBXaXRoIGNhbmNlbGxhdGlvbiBzdXBwb3J0OlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAqIGNvbnN0IHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgKlxuICAgKiAvLyBDYW5jZWwgYWZ0ZXIgNSBzZWNvbmRzXG4gICAqIHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCA1MDAwKTtcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICBhd2FpdCBoYW5kbGVyLnJldHJ5UmVxdWVzdChmZXRjaFVzZXIsIDUsIDEwMDAsIHNpZ25hbCk7XG4gICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAqICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgKiAgICAgY29uc29sZS5sb2coJ1JldHJ5IGNhbmNlbGxlZCcpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJldHJ5UmVxdWVzdDxUPihcbiAgICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgICByZXRyaWVzOiBudW1iZXIsXG4gICAgZGVsYXk6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBhYm9ydGVkXG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihzaWduYWwucmVhc29uIHx8ICdSZXF1ZXN0IGFib3J0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEFwaUVycm9yO1xuXG4gICAgICAvLyBEb24ndCByZXRyeSBpZiBhYm9ydGVkXG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBzaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IHJldHJ5IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICBpZiAoZXJyLnR5cGUgPT09ICd2YWxpZGF0aW9uX2Vycm9yJyB8fCBlcnIuc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXRyaWVzID09PSAwKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gV2FpdCB3aXRoIGFib3J0IHN1cHBvcnRcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSk7XG5cbiAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3Ioc2lnbmFsLnJlYXNvbiB8fCAnUmVxdWVzdCBhYm9ydGVkJykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnJldHJ5UmVxdWVzdChmbiwgcmV0cmllcyAtIDEsIGRlbGF5ICogMiwgc2lnbmFsKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIE1hbmFnZXMgQWJvcnRTaWduYWwgY3JlYXRpb24gYW5kIGNvbXBvc2l0aW9uIGZvciByZXF1ZXN0IGNhbmNlbGxhdGlvbiBhbmQgdGltZW91dHMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgQWJvcnRTaWduYWwgQVBJLFxuICogZW5hYmxpbmcgc29waGlzdGljYXRlZCBjYW5jZWxsYXRpb24gcGF0dGVybnMgYnkgY29tYmluaW5nIG11bHRpcGxlIGNhbmNlbGxhdGlvblxuICogc291cmNlcyBhbmQgY3JlYXRpbmcgdGltZW91dC1iYXNlZCBzaWduYWxzLlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gKipTaWduYWwgQ29tcG9zaXRpb24qKjogQ29tYmluZSBtdWx0aXBsZSBBYm9ydFNpZ25hbHMgaW50byBvbmVcbiAqIC0gKipUaW1lb3V0IFNpZ25hbHMqKjogQ3JlYXRlIHNpZ25hbHMgdGhhdCBhdXRvLWFib3J0IGFmdGVyIGEgZGVsYXlcbiAqIC0gKipFYXJseSBBYm9ydCBEZXRlY3Rpb24qKjogSW1tZWRpYXRlbHkgYWJvcnQgaWYgYW55IHNvdXJjZSBpcyBhbHJlYWR5IGFib3J0ZWRcbiAqIC0gKipSZXNvdXJjZSBDbGVhbnVwKio6IEF1dG9tYXRpYyB0aW1lb3V0IGNsZWFudXAgb24gYWJvcnRcbiAqXG4gKiBVc2UgQ2FzZXM6XG4gKiAtIENvbWJpbmUgdXNlciBjYW5jZWxsYXRpb24gKyB0aW1lb3V0ICsgY29tcG9uZW50IHVubW91bnQgc2lnbmFsc1xuICogLSBDcmVhdGUgcmVxdWVzdCBkZWFkbGluZXNcbiAqIC0gSW1wbGVtZW50IGNhc2NhZGluZyBjYW5jZWxsYXRpb25cbiAqXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBDb21iaW5pbmcgbXVsdGlwbGUgY2FuY2VsbGF0aW9uIHNvdXJjZXM6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtYW5hZ2VyID0gbmV3IFNpZ25hbE1hbmFnZXIoKTtcbiAqIGNvbnN0IHVzZXJDYW5jZWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBjb25zdCB1bm1vdW50U2lnbmFsID0gY29tcG9uZW50VW5tb3VudFNpZ25hbDtcbiAqXG4gKiAvLyBSZXF1ZXN0IHdpbGwgYmUgY2FuY2VsbGVkIGlmIGVpdGhlciB1c2VyIGNsaWNrcyBjYW5jZWwgT1IgY29tcG9uZW50IHVubW91bnRzXG4gKiBjb25zdCBjb21iaW5lZCA9IG1hbmFnZXIuY3JlYXRlQ29tYmluZWRTaWduYWwoW1xuICogICB1c2VyQ2FuY2VsLnNpZ25hbCxcbiAqICAgdW5tb3VudFNpZ25hbFxuICogXSk7XG4gKlxuICogZmV0Y2goJy9hcGkvZGF0YScsIHsgc2lnbmFsOiBjb21iaW5lZC5zaWduYWwgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25hbE1hbmFnZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvbWJpbmVkIEFib3J0Q29udHJvbGxlciB0aGF0IGFib3J0cyB3aGVuIGFueSBzb3VyY2Ugc2lnbmFsIGFib3J0cy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgXCJhbnlcIiBwYXR0ZXJuIGZvciBjYW5jZWxsYXRpb246IHRoZSBjb21iaW5lZCBzaWduYWxcbiAgICogd2lsbCBhYm9ydCBhcyBzb29uIGFzIEFOWSBvZiB0aGUgc291cmNlIHNpZ25hbHMgYWJvcnQuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBjb29yZGluYXRpbmcgbXVsdGlwbGUgY2FuY2VsbGF0aW9uIGNvbmRpdGlvbnM6XG4gICAqIC0gVXNlciBjbGlja3MgY2FuY2VsIGJ1dHRvblxuICAgKiAtIFJlcXVlc3QgdGltZW91dCBleHBpcmVzXG4gICAqIC0gQ29tcG9uZW50IHVubW91bnRzXG4gICAqIC0gUGFyZW50IHJlcXVlc3QgaXMgY2FuY2VsbGVkXG4gICAqXG4gICAqICoqRWFybHkgQWJvcnQgT3B0aW1pemF0aW9uOioqXG4gICAqIElmIGFueSBzb3VyY2Ugc2lnbmFsIGlzIGFscmVhZHkgYWJvcnRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCxcbiAgICogdGhlIHJldHVybmVkIGNvbnRyb2xsZXIgaXMgaW1tZWRpYXRlbHkgYWJvcnRlZCB3aXRob3V0IHNldHRpbmcgdXAgbGlzdGVuZXJzLlxuICAgKlxuICAgKiAqKk1lbW9yeSBNYW5hZ2VtZW50OioqXG4gICAqIEV2ZW50IGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGB7IG9uY2U6IHRydWUgfWAgdG8gcHJldmVudCBtZW1vcnkgbGVha3MsXG4gICAqIGFzIHRoZXkgYXV0b21hdGljYWxseSBjbGVhbiB1cCBhZnRlciBmaXJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBzaWduYWxzIC0gQXJyYXkgb2YgQWJvcnRTaWduYWxzIHRvIGNvbWJpbmUgKHVuZGVmaW5lZCB2YWx1ZXMgYXJlIGlnbm9yZWQpXG4gICAqIEByZXR1cm5zIEEgbmV3IEFib3J0Q29udHJvbGxlciB0aGF0IGFib3J0cyB3aGVuIGFueSBzb3VyY2Ugc2lnbmFsIGFib3J0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBVc2VyIGNhbmNlbGxhdGlvbiArIHRpbWVvdXQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlckNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAqIGNvbnN0IHRpbWVvdXQgPSBtYW5hZ2VyLmNyZWF0ZVRpbWVvdXRTaWduYWwoMzAwMDApO1xuICAgKlxuICAgKiBjb25zdCBjb21iaW5lZCA9IG1hbmFnZXIuY3JlYXRlQ29tYmluZWRTaWduYWwoW1xuICAgKiAgIHVzZXJDb250cm9sbGVyLnNpZ25hbCxcbiAgICogICB0aW1lb3V0LnNpZ25hbFxuICAgKiBdKTtcbiAgICpcbiAgICogLy8gUmVxdWVzdCB3aWxsIGJlIGNhbmNlbGxlZCBhZnRlciAzMHMgT1Igd2hlbiB1c2VyIGNsaWNrcyBjYW5jZWxcbiAgICogZmV0Y2goJy9hcGkvZGF0YScsIHsgc2lnbmFsOiBjb21iaW5lZC5zaWduYWwgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBSZWFjdCBjb21wb25lbnQgd2l0aCBjbGVhbnVwOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAqICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICpcbiAgICogICBjb25zdCBjb21iaW5lZCA9IG1hbmFnZXIuY3JlYXRlQ29tYmluZWRTaWduYWwoW1xuICAgKiAgICAgY29udHJvbGxlci5zaWduYWwsXG4gICAqICAgICB1bm1vdW50U2lnbmFsICAvLyBGcm9tIGNvbXBvbmVudCBsaWZlY3ljbGVcbiAgICogICBdKTtcbiAgICpcbiAgICogICBmZXRjaERhdGEoY29tYmluZWQuc2lnbmFsKTtcbiAgICpcbiAgICogICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpOyAvLyBDbGVhbnVwXG4gICAqIH0sIFtdKTtcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVDb21iaW5lZFNpZ25hbChcbiAgICBzaWduYWxzOiBBcnJheTxBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZD5cbiAgKTogQWJvcnRDb250cm9sbGVyIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykge1xuICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmFib3J0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFib3J0Q29udHJvbGxlciB0aGF0IGF1dG9tYXRpY2FsbHkgYWJvcnRzIGFmdGVyIGEgc3BlY2lmaWVkIHRpbWVvdXQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSB0aW1lLWJhc2VkIGNhbmNlbGxhdGlvbiBtZWNoYW5pc20gdXNlZnVsIGZvciBpbXBsZW1lbnRpbmdcbiAgICogcmVxdWVzdCB0aW1lb3V0cyBhbmQgZGVhZGxpbmVzLiBUaGUgc2lnbmFsIHdpbGwgYXV0b21hdGljYWxseSBhYm9ydCBhZnRlciB0aGVcbiAgICogc3BlY2lmaWVkIGR1cmF0aW9uLCBwcm92aWRpbmcgYSBjb25zaXN0ZW50IHRpbWVvdXQgZXhwZXJpZW5jZS5cbiAgICpcbiAgICogKipBdXRvbWF0aWMgQ2xlYW51cDoqKlxuICAgKiBJZiB0aGUgc2lnbmFsIGlzIGFib3J0ZWQgYnkgb3RoZXIgbWVhbnMgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXMsIHRoZSBpbnRlcm5hbFxuICAgKiBzZXRUaW1lb3V0IGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogKipBYm9ydCBSZWFzb246KipcbiAgICogVGhlIGFib3J0IHJlYXNvbiBpbmNsdWRlcyB0aGUgdGltZW91dCBkdXJhdGlvbiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzOlxuICAgKiBgXCJSZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIge3RpbWVvdXR9bXNcImBcbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgLSBUaW1lb3V0IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgKiBAcmV0dXJucyBBbiBBYm9ydENvbnRyb2xsZXIgdGhhdCB3aWxsIGFib3J0IGFmdGVyIHRoZSB0aW1lb3V0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFNpbXBsZSByZXF1ZXN0IHRpbWVvdXQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbWFuYWdlciA9IG5ldyBTaWduYWxNYW5hZ2VyKCk7XG4gICAqIGNvbnN0IHRpbWVvdXQgPSBtYW5hZ2VyLmNyZWF0ZVRpbWVvdXRTaWduYWwoNTAwMCk7IC8vIDUgc2Vjb25kc1xuICAgKlxuICAgKiB0cnkge1xuICAgKiAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvc2xvdy1lbmRwb2ludCcsIHtcbiAgICogICAgIHNpZ25hbDogdGltZW91dC5zaWduYWxcbiAgICogICB9KTtcbiAgICogICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgKiAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICogICAgIGNvbnNvbGUuZXJyb3IoJ1JlcXVlc3QgdGltZWQgb3V0IGFmdGVyIDUgc2Vjb25kcycpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogRGlmZmVyZW50IHRpbWVvdXRzIGZvciBkaWZmZXJlbnQgb3BlcmF0aW9uczpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaG9ydCB0aW1lb3V0IGZvciBxdWljayBvcGVyYXRpb25zXG4gICAqIGNvbnN0IHF1aWNrVGltZW91dCA9IG1hbmFnZXIuY3JlYXRlVGltZW91dFNpZ25hbCgyMDAwKTtcbiAgICogYXdhaXQgZmV0Y2goJy9hcGkvaGVhbHRoJywgeyBzaWduYWw6IHF1aWNrVGltZW91dC5zaWduYWwgfSk7XG4gICAqXG4gICAqIC8vIExvbmcgdGltZW91dCBmb3IgaGVhdnkgb3BlcmF0aW9uc1xuICAgKiBjb25zdCBsb25nVGltZW91dCA9IG1hbmFnZXIuY3JlYXRlVGltZW91dFNpZ25hbCg2MDAwMCk7XG4gICAqIGF3YWl0IGZldGNoKCcvYXBpL2V4cG9ydCcsIHsgc2lnbmFsOiBsb25nVGltZW91dC5zaWduYWwgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBNYW51YWwgY2FuY2VsbGF0aW9uIGJlZm9yZSB0aW1lb3V0OlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRpbWVvdXQgPSBtYW5hZ2VyLmNyZWF0ZVRpbWVvdXRTaWduYWwoMzAwMDApO1xuICAgKlxuICAgKiAvLyBJZiB1c2VyIGNhbmNlbHMsIHRpbWVvdXQgaXMgYXV0b21hdGljYWxseSBjbGVhbmVkIHVwXG4gICAqIHRpbWVvdXQuYWJvcnQoJ1VzZXIgY2FuY2VsbGVkJyk7XG4gICAqIC8vIEludGVybmFsIHNldFRpbWVvdXQgaXMgY2xlYXJlZCwgbm8gbWVtb3J5IGxlYWtcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVUaW1lb3V0U2lnbmFsKHRpbWVvdXQ6IG51bWJlcik6IEFib3J0Q29udHJvbGxlciB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29udHJvbGxlci5hYm9ydChgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tc2ApO1xuICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgLy8gQ2xlYW4gdXAgdGltZW91dCB3aGVuIHNpZ25hbCBpcyBhYm9ydGVkXG4gICAgY29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdhYm9ydCcsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfSxcbiAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgKTtcblxuICAgIHJldHVybiBjb250cm9sbGVyO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSZXNwb25zZURhdGEgfSBmcm9tICcuLi9Nb2RlbHMnO1xuXG4vKipcbiAqIFBhcnNlcyBIVFRQIHJlc3BvbnNlIGJvZGllcyBpbnRvIGFwcHJvcHJpYXRlIEphdmFTY3JpcHQgdHlwZXMgYmFzZWQgb24gQ29udGVudC1UeXBlIGhlYWRlcnMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBoYW5kbGVzIHRoZSBjb21wbGV4aXR5IG9mIGNvbnZlcnRpbmcgdmFyaW91cyBIVFRQIHJlc3BvbnNlIGZvcm1hdHNcbiAqIGludG8gdXNhYmxlIEphdmFTY3JpcHQgZGF0YSBzdHJ1Y3R1cmVzLiBJdCBpbnRlbGxpZ2VudGx5IGRldGVjdHMgdGhlIHJlc3BvbnNlIHR5cGVcbiAqIGFuZCBhcHBsaWVzIHRoZSBhcHByb3ByaWF0ZSBwYXJzaW5nIHN0cmF0ZWd5LlxuICpcbiAqIFN1cHBvcnRlZCBDb250ZW50IFR5cGVzOlxuICogLSAqKmFwcGxpY2F0aW9uL2pzb24qKjogUGFyc2VkIGFzIEpTT04gb2JqZWN0cy9hcnJheXNcbiAqIC0gKip0ZXh0LyoqKiAodGV4dC9wbGFpbiwgdGV4dC9odG1sLCBldGMuKTogUmV0dXJuZWQgYXMgc3RyaW5nXG4gKiAtICoqYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtKio6IFJldHVybmVkIGFzIEJsb2IgZm9yIGJpbmFyeSBkYXRhXG4gKiAtICoqVW5rbm93bi9NaXNzaW5nKio6IEF0dGVtcHRzIEpTT04gcGFyc2UsIGZhbGxzIGJhY2sgdG8gdGV4dFxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gKipBdXRvbWF0aWMgRGV0ZWN0aW9uKio6IFVzZXMgQ29udGVudC1UeXBlIGhlYWRlciB0byBkZXRlcm1pbmUgcGFyc2luZyBzdHJhdGVneVxuICogLSAqKkdyYWNlZnVsIEZhbGxiYWNrKio6IEF0dGVtcHRzIEpTT04gcGFyc2luZyBmb3IgdW5rbm93biB0eXBlcywgZmFsbHMgYmFjayB0byB0ZXh0XG4gKiAtICoqQmluYXJ5IFN1cHBvcnQqKjogSGFuZGxlcyBiaW5hcnkgZGF0YSB2aWEgQmxvYlxuICogLSAqKlR5cGUgU2FmZXR5Kio6IFJldHVybnMgdHlwZWQgUmVzcG9uc2VEYXRhIHVuaW9uXG4gKlxuICogQGludGVybmFsIFRoaXMgY2xhc3MgaXMgbm90IGV4cG9ydGVkIGZyb20gdGhlIHB1YmxpYyBBUElcbiAqXG4gKiBAZXhhbXBsZVxuICogUGFyc2luZyBkaWZmZXJlbnQgcmVzcG9uc2UgdHlwZXM6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUmVzcG9uc2VQYXJzZXIoKTtcbiAqXG4gKiAvLyBKU09OIHJlc3BvbnNlXG4gKiBjb25zdCBqc29uUmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoJ3tcImlkXCI6IDF9Jywge1xuICogICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICogfSk7XG4gKiBjb25zdCBkYXRhID0gYXdhaXQgcGFyc2VyLnBhcnNlUmVzcG9uc2UoanNvblJlc3BvbnNlKTtcbiAqIC8vID0+IHsgaWQ6IDEgfVxuICpcbiAqIC8vIFRleHQgcmVzcG9uc2VcbiAqIGNvbnN0IHRleHRSZXNwb25zZSA9IG5ldyBSZXNwb25zZSgnSGVsbG8gV29ybGQnLCB7XG4gKiAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyB9XG4gKiB9KTtcbiAqIGNvbnN0IHRleHQgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZSh0ZXh0UmVzcG9uc2UpO1xuICogLy8gPT4gXCJIZWxsbyBXb3JsZFwiXG4gKlxuICogLy8gQmluYXJ5IHJlc3BvbnNlXG4gKiBjb25zdCBibG9iUmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYmluYXJ5RGF0YSwge1xuICogICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9XG4gKiB9KTtcbiAqIGNvbnN0IGJsb2IgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShibG9iUmVzcG9uc2UpO1xuICogLy8gPT4gQmxvYiB7IC4uLiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3BvbnNlUGFyc2VyIHtcbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgSFRUUCByZXNwb25zZSBib2R5IGludG8gYW4gYXBwcm9wcmlhdGUgSmF2YVNjcmlwdCB0eXBlLlxuICAgKlxuICAgKiBUaGUgcGFyc2luZyBzdHJhdGVneSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBDb250ZW50LVR5cGUgaGVhZGVyOlxuICAgKiAxLiAqKkpTT04qKiAoYXBwbGljYXRpb24vanNvbik6IENhbGxzIGByZXNwb25zZS5qc29uKClgXG4gICAqIDIuICoqVGV4dCoqICh0ZXh0LyopOiBDYWxscyBgcmVzcG9uc2UudGV4dCgpYFxuICAgKiAzLiAqKkJpbmFyeSoqIChhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0pOiBDYWxscyBgcmVzcG9uc2UuYmxvYigpYFxuICAgKiA0LiAqKlVua25vd24qKjogUmVhZHMgYXMgdGV4dCwgYXR0ZW1wdHMgSlNPTiBwYXJzZSwgZmFsbHMgYmFjayB0byByYXcgdGV4dFxuICAgKlxuICAgKiAqKkZhbGxiYWNrIEJlaGF2aW9yOioqXG4gICAqIEZvciByZXNwb25zZXMgd2l0aG91dCBhIENvbnRlbnQtVHlwZSBoZWFkZXIgb3Igd2l0aCB1bmtub3duIHR5cGVzLCB0aGUgcGFyc2VyXG4gICAqIGF0dGVtcHRzIHRvIHBhcnNlIGFzIEpTT04gZmlyc3QgKGNvbW1vbiBmb3IgQVBJcyB0aGF0IGRvbid0IHNldCBwcm9wZXIgaGVhZGVycykuXG4gICAqIElmIEpTT04gcGFyc2luZyBmYWlscywgaXQgcmV0dXJucyB0aGUgcmF3IHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIFRoZSBGZXRjaCBBUEkgUmVzcG9uc2Ugb2JqZWN0IHRvIHBhcnNlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBwYXJzZWQgcmVzcG9uc2UgZGF0YVxuICAgKiBAcmV0dXJucyBDYW4gYmU6IEpTT04gb2JqZWN0L2FycmF5LCBzdHJpbmcsIG9yIEJsb2IgZGVwZW5kaW5nIG9uIENvbnRlbnQtVHlwZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBBUEkgcmVzcG9uc2UgcGFyc2luZzpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3VzZXJzJyk7XG4gICAqIGNvbnN0IGRhdGEgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAqXG4gICAqIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICogICBjb25zb2xlLmxvZygnVGV4dCByZXNwb25zZTonLCBkYXRhKTtcbiAgICogfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdCaW5hcnkgcmVzcG9uc2U6JywgZGF0YS5zaXplLCAnYnl0ZXMnKTtcbiAgICogfSBlbHNlIHtcbiAgICogICBjb25zb2xlLmxvZygnSlNPTiByZXNwb25zZTonLCBkYXRhKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogSGFuZGxpbmcgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXM6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ1NWIGZpbGUgZG93bmxvYWRcbiAgICogY29uc3QgY3N2UmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9leHBvcnQuY3N2Jyk7XG4gICAqIGNvbnN0IGJsb2IgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShjc3ZSZXNwb25zZSk7XG4gICAqIC8vIFJldHVybnMgQmxvYiBmb3IgZG93bmxvYWRcbiAgICpcbiAgICogLy8gSlNPTiBBUElcbiAgICogY29uc3QganNvblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdXNlcnMnKTtcbiAgICogY29uc3QgdXNlcnMgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShqc29uUmVzcG9uc2UpO1xuICAgKiAvLyBSZXR1cm5zIHBhcnNlZCBKU09OIGFycmF5XG4gICAqXG4gICAqIC8vIFBsYWluIHRleHQgbG9nc1xuICAgKiBjb25zdCBsb2dSZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2xvZ3MnKTtcbiAgICogY29uc3QgbG9ncyA9IGF3YWl0IHBhcnNlci5wYXJzZVJlc3BvbnNlKGxvZ1Jlc3BvbnNlKTtcbiAgICogLy8gUmV0dXJucyBzdHJpbmdcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8UmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG5cbiAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VHlwZT8uaW5jbHVkZXMoJ3RleHQvJykpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VHlwZT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcnkgSlNPTiBmaXJzdCwgZmFsbGJhY2sgdG8gdGV4dFxuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBRdWVyeVBhcmFtcyB9IGZyb20gJy4uL01vZGVscyc7XG5cbi8qKlxuICogQ29uc3RydWN0cyBmdWxseS1xdWFsaWZpZWQgVVJMcyB3aXRoIHByb3BlciBxdWVyeSBwYXJhbWV0ZXIgZW5jb2RpbmcuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBoYW5kbGVzIHRoZSBjb21wbGV4aXR5IG9mIFVSTCBjb25zdHJ1Y3Rpb24sIGNvbWJpbmluZ1xuICogYmFzZSBVUkxzLCBlbmRwb2ludHMsIGFuZCBxdWVyeSBwYXJhbWV0ZXJzIHdpdGggcHJvcGVyIGVuY29kaW5nIGFuZCBhcnJheVxuICogaGFuZGxpbmcuIEl0IHVzZXMgdGhlIG5hdGl2ZSBVUkwgQVBJIGZvciByZWxpYWJsZSBVUkwgY29tcG9zaXRpb24uXG4gKlxuICogS2V5IEZlYXR1cmVzOlxuICogLSAqKlVSTCBDb21wb3NpdGlvbioqOiBTYWZlbHkgY29tYmluZXMgYmFzZSBVUkwgYW5kIGVuZHBvaW50IHBhdGhzXG4gKiAtICoqUXVlcnkgUGFyYW1ldGVyIEVuY29kaW5nKio6IEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzcGVjaWFsIGNoYXJhY3RlcnNcbiAqIC0gKipBcnJheSBTdXBwb3J0Kio6IEhhbmRsZXMgYXJyYXkgcGFyYW1ldGVycyB3aXRoIG11bHRpcGxlIHZhbHVlc1xuICogLSAqKk51bGwvVW5kZWZpbmVkIEZpbHRlcmluZyoqOiBBdXRvbWF0aWNhbGx5IHNraXBzIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICogLSAqKlR5cGUgU2FmZXR5Kio6IFN0cm9uZ2x5IHR5cGVkIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXNcbiAqXG4gKiBBcnJheSBIYW5kbGluZzpcbiAqIEFycmF5IHBhcmFtZXRlcnMgYXJlIHNlcmlhbGl6ZWQgYnkgYXBwZW5kaW5nIHRoZSBzYW1lIGtleSBtdWx0aXBsZSB0aW1lczpcbiAqIGA/dGFncz1qYXZhc2NyaXB0JnRhZ3M9dHlwZXNjcmlwdCZ0YWdzPXJlYWN0YFxuICpcbiAqIEBpbnRlcm5hbCBUaGlzIGNsYXNzIGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBwdWJsaWMgQVBJXG4gKlxuICogQGV4YW1wbGVcbiAqIEJ1aWxkaW5nIFVSTHMgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzOlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYnVpbGRlciA9IG5ldyBVcmxCdWlsZGVyKCk7XG4gKlxuICogY29uc3QgdXJsID0gYnVpbGRlci5idWlsZFVSTChcbiAqICAgJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyxcbiAqICAgJy91c2VycycsXG4gKiAgIHsgYWN0aXZlOiB0cnVlLCByb2xlOiAnYWRtaW4nLCBwYWdlOiAxIH1cbiAqICk7XG4gKiAvLyA9PiBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzP2FjdGl2ZT10cnVlJnJvbGU9YWRtaW4mcGFnZT0xXCJcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVXJsQnVpbGRlciB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBjb21wbGV0ZSBVUkwgYnkgY29tYmluaW5nIGJhc2UgVVJMLCBlbmRwb2ludCwgYW5kIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIFRoZSBVUkwgY29uc3RydWN0aW9uIHByb2Nlc3M6XG4gICAqIDEuIENvbWJpbmVzIGBiYXNlVVJMYCBhbmQgYGVuZHBvaW50YCB1c2luZyBVUkwgQVBJXG4gICAqIDIuIEl0ZXJhdGVzIHRocm91Z2ggcXVlcnkgcGFyYW1ldGVyc1xuICAgKiAzLiBTa2lwcyBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICogNC4gSGFuZGxlcyBhcnJheXMgYnkgYXBwZW5kaW5nIG11bHRpcGxlIHZhbHVlcyB3aXRoIHNhbWUga2V5XG4gICAqIDUuIENvbnZlcnRzIGFsbCB2YWx1ZXMgdG8gc3RyaW5nc1xuICAgKiA2LiBSZXR1cm5zIGZ1bGx5LXF1YWxpZmllZCBVUkwgc3RyaW5nXG4gICAqXG4gICAqICoqUGF0aCBIYW5kbGluZzoqKlxuICAgKiBUaGUgZW5kcG9pbnQgY2FuIGJlIGVpdGhlciByZWxhdGl2ZSBvciBhYnNvbHV0ZTpcbiAgICogLSBSZWxhdGl2ZTogYC91c2Vyc2AgXHUyMTkyIENvbWJpbmVkIHdpdGggYmFzZVVSTFxuICAgKiAtIEFic29sdXRlOiBgaHR0cHM6Ly9vdGhlci1hcGkuY29tL3VzZXJzYCBcdTIxOTIgVXNlcyBhYnNvbHV0ZSBVUkxcbiAgICpcbiAgICogKipFbmNvZGluZzoqKlxuICAgKiBBbGwgcGFyYW1ldGVyIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSBVUkwtZW5jb2RlZCBieSB0aGUgVVJMIEFQSSxcbiAgICogc28gc3BlY2lhbCBjaGFyYWN0ZXJzIChzcGFjZXMsICYsID0sIGV0Yy4pIGFyZSBzYWZlbHkgaGFuZGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGJhc2VVUkwgLSBCYXNlIFVSTCBmb3IgdGhlIEFQSSAoZS5nLiwgJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJylcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQVBJIGVuZHBvaW50IHBhdGggcmVsYXRpdmUgdG8gYmFzZVVSTCAoZS5nLiwgJy91c2Vycy8xMjMnKVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyBhcyBrZXktdmFsdWUgcGFpcnNcbiAgICogQHJldHVybnMgVGhlIGZ1bGx5LXF1YWxpZmllZCBVUkwgc3RyaW5nIHdpdGggZW5jb2RlZCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIEJhc2ljIFVSTCBjb25zdHJ1Y3Rpb246XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXJsID0gYnVpbGRlci5idWlsZFVSTChcbiAgICogICAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICAgKiAgICcvc2VhcmNoJyxcbiAgICogICB7IHE6ICdoZWxsbyB3b3JsZCcsIGxpbWl0OiAxMCB9XG4gICAqICk7XG4gICAqIC8vID0+IFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vc2VhcmNoP3E9aGVsbG8rd29ybGQmbGltaXQ9MTBcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogQXJyYXkgcGFyYW1ldGVyczpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1cmwgPSBidWlsZGVyLmJ1aWxkVVJMKFxuICAgKiAgICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gICAqICAgJy9wb3N0cycsXG4gICAqICAgeyB0YWdzOiBbJ2phdmFzY3JpcHQnLCAndHlwZXNjcmlwdCcsICdyZWFjdCddIH1cbiAgICogKTtcbiAgICogLy8gPT4gXCJodHRwczovL2FwaS5leGFtcGxlLmNvbS9wb3N0cz90YWdzPWphdmFzY3JpcHQmdGFncz10eXBlc2NyaXB0JnRhZ3M9cmVhY3RcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogTnVsbC91bmRlZmluZWQgaGFuZGxpbmc6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXJsID0gYnVpbGRlci5idWlsZFVSTChcbiAgICogICAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICAgKiAgICcvdXNlcnMnLFxuICAgKiAgIHtcbiAgICogICAgIG5hbWU6ICdKb2huJyxcbiAgICogICAgIGFnZTogbnVsbCwgICAgICAgIC8vIFNraXBwZWRcbiAgICogICAgIGVtYWlsOiB1bmRlZmluZWQgIC8vIFNraXBwZWRcbiAgICogICB9XG4gICAqICk7XG4gICAqIC8vID0+IFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnM/bmFtZT1Kb2huXCJcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFNwZWNpYWwgY2hhcmFjdGVycyBlbmNvZGluZzpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1cmwgPSBidWlsZGVyLmJ1aWxkVVJMKFxuICAgKiAgICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gICAqICAgJy9zZWFyY2gnLFxuICAgKiAgIHsgcTogJ2ZvbyAmIGJhcicsIGNhdGVnb3J5OiAnY29kZS9leGFtcGxlcycgfVxuICAgKiApO1xuICAgKiAvLyA9PiBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3NlYXJjaD9xPWZvbyslMjYrYmFyJmNhdGVnb3J5PWNvZGUlMkZleGFtcGxlc1wiXG4gICAqIGBgYFxuICAgKi9cbiAgYnVpbGRVUkwoYmFzZVVSTDogc3RyaW5nLCBlbmRwb2ludDogc3RyaW5nLCBwYXJhbXM/OiBRdWVyeVBhcmFtcyk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChlbmRwb2ludCwgYmFzZVVSTCk7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbXNba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCh2ID0+IHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHYpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQgfSBmcm9tICcuL0NvcnJlbGF0aW9uSWRHZW5lcmF0b3InO1xuaW1wb3J0IHsgRXJyb3JOb3JtYWxpemVyIH0gZnJvbSAnLi9FcnJvcnMvRXJyb3JOb3JtYWxpemVyJztcbmltcG9ydCB7IEludGVyY2VwdG9yTWFuYWdlciB9IGZyb20gJy4vSW50ZXJjZXB0b3JzL0ludGVyY2VwdG9yTWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7XG4gIExpc3RSZXNwb25zZSxcbiAgUG9zdE1vZGVsLFxuICBRdWVyeVBhcmFtcyxcbiAgUmVzcG9uc2VEYXRhLFxufSBmcm9tICcuL01vZGVscyc7XG5pbXBvcnQgeyBSZXF1ZXN0TWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdE1hbmFnZXInO1xuaW1wb3J0IHsgUmV0cnlIYW5kbGVyIH0gZnJvbSAnLi9SZXRyeS9SZXRyeUhhbmRsZXInO1xuaW1wb3J0IHsgU2lnbmFsTWFuYWdlciB9IGZyb20gJy4vU2lnbmFscy9TaWduYWxNYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgQXBpRXJyb3IgfSBmcm9tICcuL3R5cGVzL0FwaUVycm9yJztcbmltcG9ydCB0eXBlIHsgRXJyb3JJbnRlcmNlcHRvciB9IGZyb20gJy4vdHlwZXMvRXJyb3JJbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IEVycm9yUmVzcG9uc2VEYXRhIH0gZnJvbSAnLi90eXBlcy9FcnJvclJlc3BvbnNlRGF0YSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb25maWcgfSBmcm9tICcuL3R5cGVzL1JlcXVlc3RDb25maWcnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW50ZXJjZXB0b3IgfSBmcm9tICcuL3R5cGVzL1JlcXVlc3RJbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tICcuL3R5cGVzL1Jlc3BvbnNlSW50ZXJjZXB0b3InO1xuaW1wb3J0IHsgUmVzcG9uc2VQYXJzZXIgfSBmcm9tICcuL1V0aWxzL1Jlc3BvbnNlUGFyc2VyJztcbmltcG9ydCB7IFVybEJ1aWxkZXIgfSBmcm9tICcuL1V0aWxzL1VybEJ1aWxkZXInO1xuXG5pbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnQC90eXBlcyc7XG5cbi8qKlxuICogRW50ZXJwcmlzZS1ncmFkZSBBUEkgY2xpZW50IHdpdGggYWR2YW5jZWQgZmVhdHVyZXMgZm9yIHByb2R1Y3Rpb24gYXBwbGljYXRpb25zLlxuICpcbiAqIFRoaXMgY2xpZW50IHByb3ZpZGVzIGEgcm9idXN0LCB0eXBlLXNhZmUgYWJzdHJhY3Rpb24gb3ZlciB0aGUgRmV0Y2ggQVBJIHdpdGg6XG4gKiAtIENvbXByZWhlbnNpdmUgcmVxdWVzdC9yZXNwb25zZS9lcnJvciBpbnRlcmNlcHRvciBzeXN0ZW1cbiAqIC0gQXV0b21hdGljIHJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICogLSBSZXF1ZXN0IGNvcnJlbGF0aW9uIElEIHRyYWNraW5nIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nXG4gKiAtIFRva2VuLWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGggYXV0b21hdGljIGhlYWRlciBpbmplY3Rpb25cbiAqIC0gUmVxdWVzdCBjYW5jZWxsYXRpb24gYW5kIHRpbWVvdXQgbWFuYWdlbWVudFxuICogLSBUeXBlLXNhZmUgZXJyb3IgaGFuZGxpbmcgd2l0aCBzdHJ1Y3R1cmVkIGVycm9yIHJlc3BvbnNlc1xuICogLSBSZWFjdCBRdWVyeSBpbnRlZ3JhdGlvbiBzdXBwb3J0XG4gKlxuICogQXJjaGl0ZWN0dXJlIFByaW5jaXBsZXM6XG4gKiAtICoqVHlwZSBTYWZldHkqKjogRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSB3aXRoIG5vIGBhbnlgIHR5cGVzXG4gKiAtICoqRXh0ZW5zaWJpbGl0eSoqOiBJbnRlcmNlcHRvciBwYXR0ZXJuIGFsbG93cyBmb3IgZmxleGlibGUgbWlkZGxld2FyZVxuICogLSAqKk9ic2VydmFiaWxpdHkqKjogQnVpbHQtaW4gY29ycmVsYXRpb24gSURzIGZvciByZXF1ZXN0IHRyYWNpbmdcbiAqIC0gKipSZXNpbGllbmNlKio6IEF1dG9tYXRpYyByZXRyaWVzLCB0aW1lb3V0cywgYW5kIGdyYWNlZnVsIGVycm9yIGhhbmRsaW5nXG4gKiAtICoqUGVyZm9ybWFuY2UqKjogUmVxdWVzdCBkZWR1cGxpY2F0aW9uIGFuZCBjYW5jZWxsYXRpb24gc3VwcG9ydFxuICogLSAqKk1vZHVsYXJpdHkqKjogT3JnYW5pemVkIGludG8gZm9jdXNlZCwgc2luZ2xlLXJlc3BvbnNpYmlsaXR5IG1vZHVsZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KCdodHRwczovL2FwaS5leGFtcGxlLmNvbScsIDMwMDAwKTtcbiAqIGNsaWVudC5zZXRBdXRoVG9rZW4oJ3lvdXItand0LXRva2VuJyk7XG4gKlxuICogLy8gVHlwZS1zYWZlIEdFVCByZXF1ZXN0XG4gKiBjb25zdCB7IGFwaURhdGEsIGVycm9yIH0gPSBhd2FpdCBjbGllbnQuZ2V0PFVzZXI+KCcvdXNlcnMvMTIzJyk7XG4gKiBpZiAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIHVzZXI6JywgZXJyb3IpO1xuICogfSBlbHNlIHtcbiAqICAgY29uc29sZS5sb2coJ1VzZXIgZGF0YTonLCBkYXRhKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIFJlYWN0IFF1ZXJ5OlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnQoKTtcbiAqIGNvbnN0IGFwaUNsaWVudCA9IG5ldyBBcGlDbGllbnQocHJvY2Vzcy5lbnYuQVBJX0JBU0VfVVJMKTtcbiAqXG4gKiAvLyBBZGQgbG9nZ2luZyBpbnRlcmNlcHRvclxuICogYXBpQ2xpZW50LmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdSZXNwb25zZSByZWNlaXZlZDonLCByZXNwb25zZSk7XG4gKiAgIHJldHVybiByZXNwb25zZTtcbiAqIH0pO1xuICpcbiAqIC8vIFVzZSBpbiBxdWVyaWVzXG4gKiBjb25zdCB7IGFwaURhdGEgfSA9IHVzZVF1ZXJ5KHtcbiAqICAgcXVlcnlLZXk6IFsndXNlcnMnLCB1c2VySWRdLFxuICogICBxdWVyeUZuOiAoKSA9PiBhcGlDbGllbnQuZ2V0PFVzZXI+KGAvdXNlcnMvJHt1c2VySWR9YClcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gT3B0aW9uIDE6IEVycm9ycyB0aHJvd24gKGRlZmF1bHQpXG4gKiB0cnkge1xuICogICBjb25zdCB7IGFwaURhdGEgfSA9IGF3YWl0IGNsaWVudC5nZXQ8VXNlcj4oJy91c2Vycy8xMjMnKTtcbiAqICAgY29uc29sZS5sb2coZGF0YSk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAqICAgICBjb25zb2xlLmxvZygnVXNlciBub3QgZm91bmQnKTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIE9wdGlvbiAyOiBFcnJvcnMgcmV0dXJuZWQgaW4gcmVzcG9uc2VcbiAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5nZXQ8VXNlcj4oJy91c2Vycy8xMjMnLCB7XG4gKiAgIHRocm93RXJyb3JzOiBmYWxzZVxuICogfSk7XG4gKiBpZiAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignUmVxdWVzdCBmYWlsZWQ6JywgZXJyb3IpO1xuICogfVxuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVVJMOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFRpbWVvdXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmNlcHRvck1hbmFnZXI6IEludGVyY2VwdG9yTWFuYWdlciA9XG4gICAgbmV3IEludGVyY2VwdG9yTWFuYWdlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbE1hbmFnZXI6IFNpZ25hbE1hbmFnZXIgPSBuZXcgU2lnbmFsTWFuYWdlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yTm9ybWFsaXplcjogRXJyb3JOb3JtYWxpemVyID0gbmV3IEVycm9yTm9ybWFsaXplcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlUGFyc2VyOiBSZXNwb25zZVBhcnNlciA9IG5ldyBSZXNwb25zZVBhcnNlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVybEJ1aWxkZXI6IFVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJldHJ5SGFuZGxlcjogUmV0cnlIYW5kbGVyID0gbmV3IFJldHJ5SGFuZGxlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlciA9IG5ldyBSZXF1ZXN0TWFuYWdlcigpO1xuICBwcml2YXRlIGF1dGhUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ycmVsYXRpb25JZFByZWZpeDogc3RyaW5nID0gJ2FwaSc7XG4gIHByaXZhdGUgaW5jbHVkZUNvcnJlbGF0aW9uSWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEFQSSBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIGJhc2VVUkwgLSBCYXNlIFVSTCBmb3IgYWxsIEFQSSByZXF1ZXN0cyAoZGVmYXVsdDogZW1wdHkgc3RyaW5nIGZvciByZWxhdGl2ZSBVUkxzKVxuICAgKiBAcGFyYW0gZGVmYXVsdFRpbWVvdXQgLSBEZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDMwMDAwKVxuICAgKi9cbiAgY29uc3RydWN0b3IoYmFzZVVSTDogc3RyaW5nID0gJycsIGRlZmF1bHRUaW1lb3V0OiBudW1iZXIgPSAzMDAwMCkge1xuICAgIHRoaXMuYmFzZVVSTCA9IGJhc2VVUkw7XG4gICAgdGhpcy5kZWZhdWx0VGltZW91dCA9IGRlZmF1bHRUaW1lb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByZWZpeCBmb3IgYXV0by1nZW5lcmF0ZWQgY29ycmVsYXRpb24gSURzXG4gICAqIEBwYXJhbSBwcmVmaXggLSBUaGUgcHJlZml4IHRvIHVzZSBmb3IgY29ycmVsYXRpb24gSURzIChlLmcuLCAnYXBpJywgJ3dlYicsICdtb2JpbGUnKVxuICAgKi9cbiAgc2V0Q29ycmVsYXRpb25JZFByZWZpeChwcmVmaXg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29ycmVsYXRpb25JZFByZWZpeCA9IHByZWZpeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG9tYXRpYyBjb3JyZWxhdGlvbiBJRCBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gV2hldGhlciB0byBpbmNsdWRlIGNvcnJlbGF0aW9uIElEcyBpbiByZXF1ZXN0c1xuICAgKi9cbiAgc2V0SW5jbHVkZUNvcnJlbGF0aW9uSWQoaW5jbHVkZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW5jbHVkZUNvcnJlbGF0aW9uSWQgPSBpbmNsdWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHJlcXVlc3QgaW50ZXJjZXB0b3IgdG8gbW9kaWZ5IHJlcXVlc3RzIGJlZm9yZSB0aGV5J3JlIHNlbnRcbiAgICogQHBhcmFtIGludGVyY2VwdG9yIC0gRnVuY3Rpb24gdG8gaW50ZXJjZXB0IGFuZCBwb3RlbnRpYWxseSBtb2RpZnkgcmVxdWVzdCBjb25maWdcbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdW5yZWdpc3RlciA9IGNsaWVudC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgKiAgIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwgbmV3IEhlYWRlcnMoKTtcbiAgICogICBjb25maWcuaGVhZGVycy5zZXQoJ1gtQ2xpZW50LVZlcnNpb24nLCAnMS4wLjAnKTtcbiAgICogICByZXR1cm4gY29uZmlnO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTGF0ZXIsIHRvIHJlbW92ZSB0aGUgaW50ZXJjZXB0b3I6XG4gICAqIHVucmVnaXN0ZXIoKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3I6IFJlcXVlc3RJbnRlcmNlcHRvcik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHJlc3BvbnNlIGludGVyY2VwdG9yIHRvIG1vZGlmeSByZXNwb25zZXMgYmVmb3JlIHRoZXkncmUgcmV0dXJuZWRcbiAgICogQHBhcmFtIGludGVyY2VwdG9yIC0gRnVuY3Rpb24gdG8gaW50ZXJjZXB0IGFuZCBwb3RlbnRpYWxseSBtb2RpZnkgcmVzcG9uc2VzXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgdGhpcyBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgKiAgIC8vIFRyYW5zZm9ybSBkYXRhIGZvcm1hdFxuICAgKiAgIGlmIChyZXNwb25zZS5hcGlEYXRhKSB7XG4gICAqICAgICByZXNwb25zZS5hcGlEYXRhID0gY2FtZWxDYXNlS2V5cyhyZXNwb25zZS5hcGlEYXRhKTtcbiAgICogICB9XG4gICAqICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yOiBSZXNwb25zZUludGVyY2VwdG9yKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciBpbnRlcmNlcHRvciB0byBoYW5kbGUgb3IgdHJhbnNmb3JtIGVycm9yc1xuICAgKiBAcGFyYW0gaW50ZXJjZXB0b3IgLSBGdW5jdGlvbiB0byBpbnRlcmNlcHQgYW5kIHBvdGVudGlhbGx5IG1vZGlmeSBlcnJvcnNcbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xpZW50LmFkZEVycm9ySW50ZXJjZXB0b3IoYXN5bmMgKGVycm9yKSA9PiB7XG4gICAqICAgLy8gTG9nIGVycm9ycyB0byBtb25pdG9yaW5nIHNlcnZpY2VcbiAgICogICBpZiAoZXJyb3Iuc3RhdHVzID49IDUwMCkge1xuICAgKiAgICAgYXdhaXQgbW9uaXRvcmluZ1NlcnZpY2UubG9nRXJyb3IoZXJyb3IpO1xuICAgKiAgIH1cbiAgICogICByZXR1cm4gZXJyb3I7IC8vIFJlLXRocm93IHRoZSBlcnJvclxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yOiBFcnJvckludGVyY2VwdG9yKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZEVycm9ySW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvciBzdWJzZXF1ZW50IHJlcXVlc3RzXG4gICAqIEBwYXJhbSB0b2tlbiAtIEpXVCB0b2tlbiBvciBudWxsIHRvIGNsZWFyIGF1dGhlbnRpY2F0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2V0IHRva2VuIGFmdGVyIGxvZ2luXG4gICAqIGNsaWVudC5zZXRBdXRoVG9rZW4obG9naW5SZXNwb25zZS5hY2Nlc3NUb2tlbik7XG4gICAqXG4gICAqIC8vIENsZWFyIHRva2VuIG9uIGxvZ291dFxuICAgKiBjbGllbnQuc2V0QXV0aFRva2VuKG51bGwpO1xuICAgKiBgYGBcbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aFRva2VuID0gdG9rZW47XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGF1dGggdG9rZW4gb3IgbnVsbCBpZiBub3Qgc2V0XG4gICAqL1xuICBnZXRBdXRoVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYSBzcGVjaWZpYyByZXF1ZXN0IGJ5IGl0cyBrZXlcbiAgICogQHBhcmFtIGtleSAtIFRoZSB1bmlxdWUga2V5IGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0IHRvIGNhbmNlbFxuICAgKi9cbiAgY2FuY2VsUmVxdWVzdChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdE1hbmFnZXIuY2FuY2VsKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhbGwgcGVuZGluZyByZXF1ZXN0c1xuICAgKiBVc2VmdWwgZm9yIGNsZWFudXAgb24gbmF2aWdhdGlvbiBvciBjb21wb25lbnQgdW5tb3VudFxuICAgKi9cbiAgY2FuY2VsQWxsUmVxdWVzdHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0TWFuYWdlci5jYW5jZWxBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIHJlcXVlc3QgbWV0aG9kIHRoYXQgaGFuZGxlcyBhbGwgSFRUUCBvcGVyYXRpb25zXG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnQgcmVsYXRpdmUgdG8gYmFzZVVSTFxuICAgKiBAcGFyYW0gY29uZmlnIC0gUmVxdWVzdCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gQXBpUmVzcG9uc2Ugd2l0aCBkYXRhIG9yIGVycm9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucmVxdWVzdDxVc2VyPignL3VzZXJzLzEyMycsIHtcbiAgICogICBtZXRob2Q6ICdHRVQnLFxuICAgKiAgIHRpbWVvdXQ6IDUwMDAsXG4gICAqICAgdGhyb3dFcnJvcnM6IGZhbHNlXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlcXVlc3Q8VCA9IFJlc3BvbnNlRGF0YT4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fVxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPj4ge1xuICAgIC8vIEdlbmVyYXRlIGNvcnJlbGF0aW9uIElEXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9XG4gICAgICBjb25maWcuY29ycmVsYXRpb25JZCB8fFxuICAgICAgKCFjb25maWcuc2tpcENvcnJlbGF0aW9uSWQgJiYgdGhpcy5pbmNsdWRlQ29ycmVsYXRpb25JZFxuICAgICAgICA/IGdlbmVyYXRlQ29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWRQcmVmaXgpXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICAvLyBHZW5lcmF0ZSByZXF1ZXN0IGtleSBmb3IgdHJhY2tpbmdcbiAgICBjb25zdCByZXF1ZXN0S2V5ID0gYCR7Y29uZmlnLm1ldGhvZCB8fCAnR0VUJ31fJHtlbmRwb2ludH1fJHtEYXRlLm5vdygpfWA7XG5cbiAgICAvLyBDcmVhdGUgbWFzdGVyIGNvbnRyb2xsZXIgZm9yIHRoaXMgcmVxdWVzdFxuICAgIGNvbnN0IG1hc3RlckNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ29tYmluZSBhbGwgYWJvcnQgc2lnbmFsc1xuICAgICAgY29uc3Qgc2lnbmFsczogQXJyYXk8QWJvcnRTaWduYWwgfCB1bmRlZmluZWQ+ID0gW1xuICAgICAgICBjb25maWcuc2lnbmFsLFxuICAgICAgICBjb25maWcuY2FuY2VsVG9rZW4/LnNpZ25hbCxcbiAgICAgICAgbWFzdGVyQ29udHJvbGxlci5zaWduYWwsXG4gICAgICBdO1xuXG4gICAgICAvLyBBZGQgdGltZW91dCBzaWduYWwgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdGltZW91dCA9IGNvbmZpZy50aW1lb3V0IHx8IHRoaXMuZGVmYXVsdFRpbWVvdXQ7XG4gICAgICBjb25zdCB0aW1lb3V0Q29udHJvbGxlciA9IHRoaXMuc2lnbmFsTWFuYWdlci5jcmVhdGVUaW1lb3V0U2lnbmFsKHRpbWVvdXQpO1xuXG4gICAgICBzaWduYWxzLnB1c2godGltZW91dENvbnRyb2xsZXIuc2lnbmFsKTtcblxuICAgICAgLy8gQ3JlYXRlIGNvbWJpbmVkIHNpZ25hbFxuICAgICAgY29uc3QgY29tYmluZWRDb250cm9sbGVyID1cbiAgICAgICAgdGhpcy5zaWduYWxNYW5hZ2VyLmNyZWF0ZUNvbWJpbmVkU2lnbmFsKHNpZ25hbHMpO1xuXG4gICAgICAvLyBUcmFjayB0aGlzIHJlcXVlc3RcbiAgICAgIGlmIChjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdE1hbmFnZXIuYWRkKHJlcXVlc3RLZXksIG1hc3RlckNvbnRyb2xsZXIsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSByZXF1ZXN0IGludGVyY2VwdG9yc1xuICAgICAgY29uc3QgZmluYWxDb25maWcgPVxuICAgICAgICBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hcHBseVJlcXVlc3RJbnRlcmNlcHRvcnMoe1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBzaWduYWw6IGNvbWJpbmVkQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEJ1aWxkIGZ1bGwgVVJMXG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnVybEJ1aWxkZXIuYnVpbGRVUkwoXG4gICAgICAgIHRoaXMuYmFzZVVSTCxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLnBhcmFtcyBhcyBRdWVyeVBhcmFtc1xuICAgICAgKTtcblxuICAgICAgLy8gQWRkIGRlZmF1bHQgaGVhZGVyc1xuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGZpbmFsQ29uZmlnLmhlYWRlcnMpO1xuXG4gICAgICAvLyBBZGQgY29ycmVsYXRpb24gSUQgaGVhZGVyXG4gICAgICBpZiAoY29ycmVsYXRpb25JZCkge1xuICAgICAgICBoZWFkZXJzLnNldCgnWC1Db3JyZWxhdGlvbi1JZCcsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBoZWFkZXJzLnNldCgnWC1SZXF1ZXN0LUlkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBhdXRoIGhlYWRlciBpZiB0b2tlbiBleGlzdHNcbiAgICAgIGlmICh0aGlzLmF1dGhUb2tlbiAmJiAhZmluYWxDb25maWcuc2tpcEF1dGhSZWZyZXNoKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke3RoaXMuYXV0aFRva2VufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgY29udGVudC10eXBlIGZvciBKU09OIHBheWxvYWRzXG5cbiAgICAgIGxldCBmZXRjaEJvZHk6IEJvZHlJbml0IHwgbnVsbCB8IHVuZGVmaW5lZCA9IGZpbmFsQ29uZmlnLmJvZHkgYXNcbiAgICAgICAgfCBCb2R5SW5pdFxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZmluYWxDb25maWcuYm9keSAmJlxuICAgICAgICB0eXBlb2YgZmluYWxDb25maWcuYm9keSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIShmaW5hbENvbmZpZy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpICYmXG4gICAgICAgICEoZmluYWxDb25maWcuYm9keSBpbnN0YW5jZW9mIEJsb2IpICYmXG4gICAgICAgICEoZmluYWxDb25maWcuYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSAmJlxuICAgICAgICAhKGZpbmFsQ29uZmlnLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpICYmXG4gICAgICAgICEoZmluYWxDb25maWcuYm9keSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKVxuICAgICAgKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICBmZXRjaEJvZHkgPSBKU09OLnN0cmluZ2lmeShmaW5hbENvbmZpZy5ib2R5KTtcbiAgICAgIH1cblxuICAgICAgZmluYWxDb25maWcuaGVhZGVycyA9IGhlYWRlcnM7XG5cbiAgICAgIC8vIENyZWF0ZSBmZXRjaCBwcm9taXNlXG4gICAgICBjb25zdCBmZXRjaFByb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxULCBBcGlFcnJvcj4+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgLi4uZmluYWxDb25maWcsXG4gICAgICAgICAgICBib2R5OiBmZXRjaEJvZHksXG4gICAgICAgICAgICBzaWduYWw6IGNvbWJpbmVkQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgfSBhcyBSZXF1ZXN0SW5pdCk7XG5cbiAgICAgICAgICAvLyBQYXJzZSByZXNwb25zZSBkYXRhXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzcG9uc2VQYXJzZXIucGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgLy8gQ2FzdCB0byBFcnJvclJlc3BvbnNlRGF0YSBmb3Igc3RydWN0dXJlZCBlcnJvciByZXNwb25zZXMgZnJvbSBiYWNrZW5kXG4gICAgICAgICAgICBjb25zdCBlcnJvckRhdGEgPSByZXNwb25zZURhdGEgYXMgRXJyb3JSZXNwb25zZURhdGE7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yOiBBcGlFcnJvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBlcnJvckRhdGEudGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgIGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWBcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6XG4gICAgICAgICAgICAgICAgICBlcnJvckRhdGEudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck5vcm1hbGl6ZXIuZ2V0RXJyb3JUeXBlKHJlc3BvbnNlLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgdGl0bGU6XG4gICAgICAgICAgICAgICAgICBlcnJvckRhdGEudGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JOb3JtYWxpemVyLmdldEVycm9yVGl0bGUocmVzcG9uc2Uuc3RhdHVzKSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFjZUlkOiBlcnJvckRhdGEudHJhY2VJZCB8fCBjb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGVycm9yczogZXJyb3JEYXRhLmVycm9ycyxcbiAgICAgICAgICAgICAgICBpc0Fib3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogZmluYWxDb25maWcsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB0aHJvdyBvciByZXR1cm4gZXJyb3IgaW4gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZy50aHJvd0Vycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IgaW4gQXBpUmVzcG9uc2UuZXJyb3IgZmllbGRcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFwcGx5UmVzcG9uc2VJbnRlcmNlcHRvcnMoe1xuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICB9IGFzIEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9ybWF0IHN1Y2Nlc3NmdWwgcmVzcG9uc2VcbiAgICAgICAgICBjb25zdCBhcGlSZXNwb25zZTogQXBpUmVzcG9uc2U8VD4gPSB7XG4gICAgICAgICAgICBkYXRhOiByZXNwb25zZURhdGEgYXMgVCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQXBwbHkgcmVzcG9uc2UgaW50ZXJjZXB0b3JzXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFwcGx5UmVzcG9uc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgICAgICBhcGlSZXNwb25zZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGFib3J0IGVycm9yc1xuICAgICAgICAgIGlmICgoZXJyb3IgYXMgRXJyb3IpLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIG5ldyBFcnJvcigoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgfHwgJ1JlcXVlc3QgYWJvcnRlZCcpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JlcXVlc3RfY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1JlcXVlc3Qgd2FzIGNhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgICAgICAgIHRyYWNlSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgaXNBYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogZmluYWxDb25maWcsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB0aHJvdyBvciByZXR1cm4gZXJyb3IgaW4gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZy50aHJvd0Vycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgYWJvcnRFcnJvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFJldHVybiBlcnJvciBpbiBBcGlSZXNwb25zZS5lcnJvciBmaWVsZFxuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIuYXBwbHlSZXNwb25zZUludGVyY2VwdG9ycyh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGFib3J0RXJyb3IsXG4gICAgICAgICAgICAgIH0gYXMgQXBpUmVzcG9uc2U8VCwgQXBpRXJyb3I+KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gSGFuZGxlIHJldHJpZXMgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKGZpbmFsQ29uZmlnLnJldHJpZXMgJiYgZmluYWxDb25maWcucmV0cmllcyA+IDApIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmV0cnlIYW5kbGVyLnJldHJ5UmVxdWVzdChcbiAgICAgICAgICBmZXRjaFByb21pc2UsXG4gICAgICAgICAgZmluYWxDb25maWcucmV0cmllcyxcbiAgICAgICAgICBmaW5hbENvbmZpZy5yZXRyeURlbGF5IHx8IDEwMDAsXG4gICAgICAgICAgY29tYmluZWRDb250cm9sbGVyLnNpZ25hbFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgZmV0Y2hQcm9taXNlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgIGNvbnN0IGFwaUVycm9yOiBBcGlFcnJvciA9IHRoaXMuZXJyb3JOb3JtYWxpemVyLm5vcm1hbGl6ZUVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBjb3JyZWxhdGlvbklkXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgdGhyb3cgb3IgcmV0dXJuIGVycm9yIGluIHJlc3BvbnNlXG4gICAgICBpZiAoY29uZmlnLnRocm93RXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hcHBseUVycm9ySW50ZXJjZXB0b3JzKGFwaUVycm9yKTtcbiAgICAgICAgLy8gVGhpcyBsaW5lIHdpbGwgbmV2ZXIgYmUgcmVhY2hlZCBhcyBhcHBseUVycm9ySW50ZXJjZXB0b3JzIGFsd2F5cyB0aHJvd3MsXG4gICAgICAgIC8vIGJ1dCBUeXBlU2NyaXB0IHJlcXVpcmVzIGEgcmV0dXJuIHN0YXRlbWVudFxuICAgICAgICB0aHJvdyBhcGlFcnJvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldHVybiBlcnJvciBpbiBBcGlSZXNwb25zZS5lcnJvciBmaWVsZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiBhcGlFcnJvcixcbiAgICAgICAgfSBhcyBBcGlSZXNwb25zZTxULCBBcGlFcnJvcj47XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3QgdHJhY2tpbmdcbiAgICAgIHRoaXMucmVxdWVzdE1hbmFnZXIucmVtb3ZlKHJlcXVlc3RLZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIEdFVCByZXF1ZXN0XG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5nZXQ8VXNlcltdPignL3VzZXJzJywge1xuICAgKiAgIHBhcmFtczogeyBhY3RpdmU6IHRydWUgfSxcbiAgICogICB0aW1lb3V0OiA1MDAwXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdldDxUID0gUmVzcG9uc2VEYXRhPihcbiAgICBlbmRwb2ludDogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlcXVlc3RDb25maWdcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxULCBBcGlFcnJvcj4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KGVuZHBvaW50LCB7IC4uLmNvbmZpZywgbWV0aG9kOiAnR0VUJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIFBPU1QgcmVxdWVzdFxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSBleHBlY3RlZCByZXNwb25zZSBkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIFREYXRhIC0gVGhlIHJlcXVlc3QgYm9keSBkYXRhIHR5cGVcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQVBJIGVuZHBvaW50XG4gICAqIEBwYXJhbSBkYXRhIC0gUmVxdWVzdCBib2R5IGRhdGFcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5wb3N0PFVzZXIsIENyZWF0ZVVzZXJEdG8+KCcvdXNlcnMnLCB7XG4gICAqICAgbmFtZTogJ0pvaG4gRG9lJyxcbiAgICogICBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHBvc3Q8XG4gICAgVCA9IFJlc3BvbnNlRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIEJvZHlJbml0IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgdW5rbm93blxuICAgID4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBkYXRhPzogVERhdGEsXG4gICAgY29uZmlnPzogUmVxdWVzdENvbmZpZ1xuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHsgLi4uY29uZmlnLCBtZXRob2Q6ICdQT1NUJywgYm9keTogZGF0YSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIFBVVCByZXF1ZXN0XG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAdGVtcGxhdGUgVERhdGEgLSBUaGUgcmVxdWVzdCBib2R5IGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGRhdGEgLSBSZXF1ZXN0IGJvZHkgZGF0YVxuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgcmVxdWVzdCBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIEFwaVJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcGlEYXRhLCBlcnJvciB9ID0gYXdhaXQgY2xpZW50LnB1dDxVc2VyLCBVcGRhdGVVc2VyRHRvPihcbiAgICogICAnL3VzZXJzLzEyMycsXG4gICAqICAgeyBuYW1lOiAnSmFuZSBEb2UnIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwdXQ8XG4gICAgVCA9IFJlc3BvbnNlRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIEJvZHlJbml0IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgdW5rbm93blxuICAgID4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBkYXRhPzogVERhdGEsXG4gICAgY29uZmlnPzogUmVxdWVzdENvbmZpZ1xuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHsgLi4uY29uZmlnLCBtZXRob2Q6ICdQVVQnLCBib2R5OiBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgUEFUQ0ggcmVxdWVzdFxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSBleHBlY3RlZCByZXNwb25zZSBkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIFREYXRhIC0gVGhlIHJlcXVlc3QgYm9keSBkYXRhIHR5cGVcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQVBJIGVuZHBvaW50XG4gICAqIEBwYXJhbSBkYXRhIC0gUmVxdWVzdCBib2R5IGRhdGFcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5wYXRjaDxVc2VyPihcbiAgICogICAnL3VzZXJzLzEyMycsXG4gICAqICAgeyBzdGF0dXM6ICdhY3RpdmUnIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwYXRjaDxcbiAgICBUID0gUmVzcG9uc2VEYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgQm9keUluaXQgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgPSBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB1bmtub3duXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSxcbiAgICBjb25maWc/OiBSZXF1ZXN0Q29uZmlnXG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VCwgQXBpRXJyb3I+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihlbmRwb2ludCwge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgYm9keTogZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIERFTEVURSByZXF1ZXN0XG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5kZWxldGUoJy91c2Vycy8xMjMnKTtcbiAgICogaWYgKCFlcnJvcikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdVc2VyIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBkZWxldGU8VCA9IFJlc3BvbnNlRGF0YT4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBjb25maWc/OiBSZXF1ZXN0Q29uZmlnXG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VCwgQXBpRXJyb3I+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihlbmRwb2ludCwgeyAuLi5jb25maWcsIG1ldGhvZDogJ0RFTEVURScgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSBmaWx0ZXJlZCBsaXN0IHJlcXVlc3Qgd2l0aCBwYWdpbmF0aW9uIGFuZCBzb3J0aW5nXG4gICAqIEB0ZW1wbGF0ZSBUTGlzdE1vZGVsIC0gVGhlIHR5cGUgb2YgaW5kaXZpZHVhbCBsaXN0IGl0ZW1zXG4gICAqIEB0ZW1wbGF0ZSBURmlsdGVyIC0gVGhlIGZpbHRlciBjcml0ZXJpYSB0eXBlXG4gICAqIEBwYXJhbSB1cmwgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGRhdGEgLSBQYWdpbmF0aW9uIGFuZCBmaWx0ZXIgZGF0YVxuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgcmVxdWVzdCBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHBhZ2luYXRlZCBsaXN0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcGlEYXRhLCBlcnJvciB9ID0gYXdhaXQgY2xpZW50LmZpbHRlcjxVc2VyLCBVc2VyRmlsdGVyPihcbiAgICogICAnL3VzZXJzL2ZpbHRlcicsXG4gICAqICAge1xuICAgKiAgICAgcGFnZU9mZnNldDogMCxcbiAgICogICAgIHBhZ2VTaXplOiAyMCxcbiAgICogICAgIHNvcnRGaWVsZDogJ2NyZWF0ZWRBdCcsXG4gICAqICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICogICAgIGZpbHRlck1vZGVsOiB7IHN0YXR1czogJ2FjdGl2ZScgfVxuICAgKiAgIH1cbiAgICogKTtcbiAgICpcbiAgICogaWYgKGFwaURhdGEpIHtcbiAgICogICBjb25zb2xlLmxvZyhgRm91bmQgJHthcGlEYXRhLlRvdGFsfSB1c2Vyc2ApO1xuICAgKiAgIGNvbnNvbGUubG9nKCdVc2VyczonLCBhcGlEYXRhLkRhdGEpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZmlsdGVyPFRMaXN0TW9kZWwsIFRGaWx0ZXIgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YTogUG9zdE1vZGVsPFRGaWx0ZXI+LFxuICAgIGNvbmZpZz86IFJlcXVlc3RDb25maWdcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMaXN0UmVzcG9uc2U8VExpc3RNb2RlbD4sIEFwaUVycm9yPj4ge1xuICAgIC8vIE1lcmdlIGJvZHk6IHsgLi4ucG9zdE1vZGVsLCAuLi5wb3N0TW9kZWwuZmlsdGVyTW9kZWwgfVxuICAgIGNvbnN0IG1lcmdlZERhdGEgPSB7IC4uLmRhdGEsIC4uLmRhdGEuZmlsdGVyTW9kZWwgfTtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8TGlzdFJlc3BvbnNlPFRMaXN0TW9kZWw+Pih1cmwsIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogbWVyZ2VkRGF0YSxcbiAgICB9KTtcbiAgfVxufVxuIiwgIi8qKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IEZhY3RvcnkgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgQXBpQ2xpZW50IGluc3RhbmNlcy5cclxuICpcclxuICogUHJvdmlkZXMgY29udmVuaWVudCBmYWN0b3J5IG1ldGhvZHMgZm9yIGNyZWF0aW5nIHByZS1jb25maWd1cmVkIEFwaUNsaWVudCBpbnN0YW5jZXNcclxuICogd2l0aCBzZW5zaWJsZSBkZWZhdWx0cyBhbmQgYXV0b21hdGljIHRva2VuIG1hbmFnZW1lbnQgZnJvbSBsb2NhbFN0b3JhZ2UuXHJcbiAqXHJcbiAqIEBtb2R1bGUgY3JlYXRlQXBpQ2xpZW50XHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi9BcGlDbGllbnQnO1xyXG5pbXBvcnQgdHlwZSB7IEVycm9ySW50ZXJjZXB0b3IgfSBmcm9tICcuL3R5cGVzL0Vycm9ySW50ZXJjZXB0b3InO1xyXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RJbnRlcmNlcHRvciB9IGZyb20gJy4vdHlwZXMvUmVxdWVzdEludGVyY2VwdG9yJztcclxuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyY2VwdG9yIH0gZnJvbSAnLi90eXBlcy9SZXNwb25zZUludGVyY2VwdG9yJztcclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIEFwaUNsaWVudCBpbnN0YW5jZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcGlDbGllbnRDb25maWcge1xyXG4gIC8qKlxyXG4gICAqIEJhc2UgVVJMIGZvciBhbGwgQVBJIHJlcXVlc3RzLlxyXG4gICAqIEBleGFtcGxlICdodHRwczovL2FwaS5leGFtcGxlLmNvbSdcclxuICAgKi9cclxuICBiYXNlVVJMOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmF1bHQgdGltZW91dCBmb3IgcmVxdWVzdHMgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAqIEBkZWZhdWx0IDMwMDAwXHJcbiAgICovXHJcbiAgdGltZW91dD86IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJlZml4IGZvciBhdXRvLWdlbmVyYXRlZCBjb3JyZWxhdGlvbiBJRHMgKGUuZy4sICdhcGknLCAnd2ViJywgJ21vYmlsZScpLlxyXG4gICAqIEBkZWZhdWx0ICdhcGknXHJcbiAgICovXHJcbiAgY29ycmVsYXRpb25JZFByZWZpeDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW5kIGluY2x1ZGUgY29ycmVsYXRpb24gSURzIGluIHJlcXVlc3RzLlxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKi9cclxuICBpbmNsdWRlQ29ycmVsYXRpb25JZD86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIGxvY2FsU3RvcmFnZSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgYXV0aCB0b2tlbi5cclxuICAgKiBAZXhhbXBsZSAnc2VydmljZVRva2VuJ1xyXG4gICAqL1xyXG4gIHRva2VuU3RvcmFnZUtleTogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHNldCBvbiB0aGUgY2xpZW50LlxyXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG4gICAqL1xyXG4gIGF1dGhUb2tlbj86IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIHJlcXVlc3QgaW50ZXJjZXB0b3JzIHRvIHJlZ2lzdGVyIGR1cmluZyBjbGllbnQgY3JlYXRpb24uXHJcbiAgICogQGRlZmF1bHQgW11cclxuICAgKi9cclxuICByZXF1ZXN0SW50ZXJjZXB0b3JzPzogUmVxdWVzdEludGVyY2VwdG9yW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIHJlc3BvbnNlIGludGVyY2VwdG9ycyB0byByZWdpc3RlciBkdXJpbmcgY2xpZW50IGNyZWF0aW9uLlxyXG4gICAqIEBkZWZhdWx0IFtdXHJcbiAgICovXHJcbiAgcmVzcG9uc2VJbnRlcmNlcHRvcnM/OiBSZXNwb25zZUludGVyY2VwdG9yW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIGVycm9yIGludGVyY2VwdG9ycyB0byByZWdpc3RlciBkdXJpbmcgY2xpZW50IGNyZWF0aW9uLlxyXG4gICAqIEBkZWZhdWx0IFtdXHJcbiAgICovXHJcbiAgZXJyb3JJbnRlcmNlcHRvcnM/OiBFcnJvckludGVyY2VwdG9yW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHbG9iYWwgc2luZ2xldG9uIEFwaUNsaWVudCBpbnN0YW5jZS5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5sZXQgZ2xvYmFsQXBpQ2xpZW50OiBBcGlDbGllbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IEFwaUNsaWVudCBpbnN0YW5jZSB3aXRoIGF1dG9tYXRpYyB0b2tlbiBtYW5hZ2VtZW50LlxyXG4gKlxyXG4gKiBUaGlzIGZhY3RvcnkgZnVuY3Rpb246XHJcbiAqIC0gUmVxdWlyZXMgYmFzZSBVUkwsIGNvcnJlbGF0aW9uIElEIHByZWZpeCwgYW5kIHRva2VuIHN0b3JhZ2Uga2V5IHRvIGJlIGV4cGxpY2l0bHkgcHJvdmlkZWRcclxuICogLSBTZXRzIHVwIGF1dG9tYXRpYyBhdXRoZW50aWNhdGlvbiB0b2tlbiBpbmplY3Rpb24gZnJvbSBsb2NhbFN0b3JhZ2VcclxuICogLSBDb25maWd1cmVzIGNvcnJlbGF0aW9uIElEIGdlbmVyYXRpb25cclxuICogLSBSZWdpc3RlcnMgcHJvdmlkZWQgaW50ZXJjZXB0b3JzXHJcbiAqXHJcbiAqICoqTm90ZToqKiBFYWNoIGNhbGwgY3JlYXRlcyBhIE5FVyBpbnN0YW5jZS4gVXNlIHtAbGluayBnZXRHbG9iYWxBcGlDbGllbnR9IGZvciBzaW5nbGV0b24gYmVoYXZpb3IuXHJcbiAqXHJcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBUEkgY2xpZW50IChiYXNlVVJMLCBjb3JyZWxhdGlvbklkUHJlZml4LCB0b2tlblN0b3JhZ2VLZXkgYXJlIHJlcXVpcmVkKVxyXG4gKiBAcmV0dXJucyBBIGZ1bGx5IGNvbmZpZ3VyZWQgQXBpQ2xpZW50IGluc3RhbmNlXHJcbiAqIEBwdWJsaWNcclxuICpcclxuICogQGV4YW1wbGVcclxuICogQmFzaWMgdXNhZ2U6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgY2xpZW50ID0gY3JlYXRlQXBpQ2xpZW50KHtcclxuICogICBiYXNlVVJMOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxyXG4gKiAgIGNvcnJlbGF0aW9uSWRQcmVmaXg6ICd3ZWInLFxyXG4gKiAgIHRva2VuU3RvcmFnZUtleTogJ3NlcnZpY2VUb2tlbidcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBDdXN0b20gY29uZmlndXJhdGlvbiB3aXRoIGludGVyY2VwdG9yczpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBjbGllbnQgPSBjcmVhdGVBcGlDbGllbnQoe1xyXG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXHJcbiAqICAgY29ycmVsYXRpb25JZFByZWZpeDogJ3dlYicsXHJcbiAqICAgdG9rZW5TdG9yYWdlS2V5OiAnYXV0aFRva2VuJyxcclxuICogICB0aW1lb3V0OiA2MDAwMCxcclxuICogICByZXF1ZXN0SW50ZXJjZXB0b3JzOiBbXHJcbiAqICAgICBhc3luYyAoY29uZmlnKSA9PiB7XHJcbiAqICAgICAgIGNvbnNvbGUubG9nKCdNYWtpbmcgcmVxdWVzdDonLCBjb25maWcudXJsKTtcclxuICogICAgICAgcmV0dXJuIGNvbmZpZztcclxuICogICAgIH1cclxuICogICBdXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogV2l0aCBSZWFjdCBRdWVyeTpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBhcGlDbGllbnQgPSBjcmVhdGVBcGlDbGllbnQoe1xyXG4gKiAgIGJhc2VVUkw6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfVVJMLFxyXG4gKiAgIGNvcnJlbGF0aW9uSWRQcmVmaXg6ICd3ZWInLFxyXG4gKiAgIHRva2VuU3RvcmFnZUtleTogJ3NlcnZpY2VUb2tlbidcclxuICogfSk7XHJcbiAqXHJcbiAqIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50KCk7XHJcbiAqXHJcbiAqIGZ1bmN0aW9uIFVzZXJQcm9maWxlKHsgdXNlcklkIH0pIHtcclxuICogICBjb25zdCB7IGRhdGE6IHJlc3BvbnNlIH0gPSB1c2VRdWVyeSh7XHJcbiAqICAgICBxdWVyeUtleTogWyd1c2VyJywgdXNlcklkXSxcclxuICogICAgIHF1ZXJ5Rm46ICgpID0+IGFwaUNsaWVudC5nZXQoYC91c2Vycy8ke3VzZXJJZH1gKVxyXG4gKiAgIH0pO1xyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXNwb25zZT8uYXBpRGF0YTsgLy8gQWNjZXNzIHRoZSBhY3R1YWwgZGF0YVxyXG4gKiAgIC8vIC4uLlxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUNsaWVudChjb25maWc6IEFwaUNsaWVudENvbmZpZyk6IEFwaUNsaWVudCB7XHJcbiAgY29uc3Qge1xyXG4gICAgYmFzZVVSTCxcclxuICAgIHRpbWVvdXQgPSAzMDAwMCxcclxuICAgIGNvcnJlbGF0aW9uSWRQcmVmaXgsXHJcbiAgICBpbmNsdWRlQ29ycmVsYXRpb25JZCA9IHRydWUsXHJcbiAgICB0b2tlblN0b3JhZ2VLZXksXHJcbiAgICByZXF1ZXN0SW50ZXJjZXB0b3JzID0gW10sXHJcbiAgICByZXNwb25zZUludGVyY2VwdG9ycyA9IFtdLFxyXG4gICAgZXJyb3JJbnRlcmNlcHRvcnMgPSBbXSxcclxuICB9ID0gY29uZmlnO1xyXG5cclxuICBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KGJhc2VVUkwsIHRpbWVvdXQpO1xyXG5cclxuICBjbGllbnQuYWRkUmVxdWVzdEludGVyY2VwdG9yKGNvbmZpZyA9PiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRva2VuU3RvcmFnZUtleSk7XHJcblxyXG4gICAgaWYgKHRva2VuICYmICFjb25maWcuc2tpcEF1dGhSZWZyZXNoKSB7XHJcbiAgICAgIGNvbmZpZy5oZWFkZXJzID0ge1xyXG4gICAgICAgIC4uLmNvbmZpZy5oZWFkZXJzLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb25maWc7XHJcbiAgfSk7XHJcblxyXG4gIC8vIENvbmZpZ3VyZSBjb3JyZWxhdGlvbiBJRFxyXG4gIGNsaWVudC5zZXRDb3JyZWxhdGlvbklkUHJlZml4KGNvcnJlbGF0aW9uSWRQcmVmaXgpO1xyXG4gIGNsaWVudC5zZXRJbmNsdWRlQ29ycmVsYXRpb25JZChpbmNsdWRlQ29ycmVsYXRpb25JZCk7XHJcblxyXG4gIC8vIC8vIFNldCBhdXRoIHRva2VuIGlmIHByb3ZpZGVkXHJcbiAgLy8gaWYgKGF1dGhUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICBjbGllbnQuc2V0QXV0aFRva2VuKGF1dGhUb2tlbik7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBBZGQgaW50ZXJjZXB0b3JzXHJcbiAgcmVxdWVzdEludGVyY2VwdG9ycy5mb3JFYWNoKGludGVyY2VwdG9yID0+IHtcclxuICAgIGNsaWVudC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xyXG4gIH0pO1xyXG5cclxuICByZXNwb25zZUludGVyY2VwdG9ycy5mb3JFYWNoKGludGVyY2VwdG9yID0+IHtcclxuICAgIGNsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTtcclxuICB9KTtcclxuXHJcbiAgZXJyb3JJbnRlcmNlcHRvcnMuZm9yRWFjaChpbnRlcmNlcHRvciA9PiB7XHJcbiAgICBjbGllbnQuYWRkRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBjbGllbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIG9yIGNyZWF0ZXMgYSBnbG9iYWwgc2luZ2xldG9uIEFwaUNsaWVudCBpbnN0YW5jZS5cclxuICpcclxuICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBzaW5nbGV0b24gcGF0dGVybiBmb3IgQXBpQ2xpZW50LiBJdCBjcmVhdGVzIHRoZSBjbGllbnRcclxuICogb24gZmlyc3QgY2FsbCBhbmQgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZSBvbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGlzIGlzIHVzZWZ1bCBmb3I6XHJcbiAqIC0gU2hhcmluZyB0aGUgc2FtZSBjbGllbnQgYWNyb3NzIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uXHJcbiAqIC0gQXZvaWRpbmcgbXVsdGlwbGUgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zXHJcbiAqIC0gQ29uc2lzdGVudCBpbnRlcmNlcHRvciBiZWhhdmlvciBhcHAtd2lkZVxyXG4gKlxyXG4gKiAqKkltcG9ydGFudDoqKiBUaGUgY29uZmlnIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgb24gdGhlIEZJUlNUIGNhbGwuIFN1YnNlcXVlbnQgY2FsbHNcclxuICogaWdub3JlIHRoZSBjb25maWcgYW5kIHJldHVybiB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuIFVzZSB7QGxpbmsgcmVzZXRHbG9iYWxBcGlDbGllbnR9XHJcbiAqIGZpcnN0IGlmIHlvdSBuZWVkIHRvIHJlY3JlYXRlIHdpdGggZGlmZmVyZW50IGNvbmZpZy5cclxuICpcclxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyAocmVxdWlyZWQ6IGJhc2VVUkwsIGNvcnJlbGF0aW9uSWRQcmVmaXgsIHRva2VuU3RvcmFnZUtleTsgb25seSB1c2VkIG9uIGZpcnN0IGNhbGwpXHJcbiAqIEByZXR1cm5zIFRoZSBnbG9iYWwgQXBpQ2xpZW50IHNpbmdsZXRvbiBpbnN0YW5jZVxyXG4gKiBAcHVibGljXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIEluIHlvdXIgYXBwIGluaXRpYWxpemF0aW9uOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIC8vIHNyYy9saWIvYXBpLnRzXHJcbiAqIGV4cG9ydCBjb25zdCBhcGlDbGllbnQgPSBnZXRHbG9iYWxBcGlDbGllbnQoe1xyXG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXHJcbiAqICAgY29ycmVsYXRpb25JZFByZWZpeDogJ3dlYicsXHJcbiAqICAgdG9rZW5TdG9yYWdlS2V5OiAnc2VydmljZVRva2VuJyxcclxuICogICB0aW1lb3V0OiAzMDAwMFxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIEltcG9ydCBhbmQgdXNlIHRocm91Z2hvdXQgeW91ciBhcHA6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gc3JjL2ZlYXR1cmVzL3VzZXJzL2FwaS50c1xyXG4gKiBpbXBvcnQgeyBnZXRHbG9iYWxBcGlDbGllbnQgfSBmcm9tICdAZ253ZWJzb2Z0L3VpJztcclxuICpcclxuICogLy8gQ29uZmlnIGlnbm9yZWQgb24gc3Vic2VxdWVudCBjYWxscyAtIHJldHVybnMgZXhpc3RpbmcgaW5zdGFuY2VcclxuICogY29uc3QgY2xpZW50ID0gZ2V0R2xvYmFsQXBpQ2xpZW50KHtcclxuICogICBiYXNlVVJMOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxyXG4gKiAgIGNvcnJlbGF0aW9uSWRQcmVmaXg6ICd3ZWInLFxyXG4gKiAgIHRva2VuU3RvcmFnZUtleTogJ3NlcnZpY2VUb2tlbidcclxuICogfSk7XHJcbiAqXHJcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFVzZXJzKCkge1xyXG4gKiAgIGNvbnN0IHsgYXBpRGF0YSB9ID0gYXdhaXQgY2xpZW50LmdldCgnL3VzZXJzJyk7XHJcbiAqICAgcmV0dXJuIGFwaURhdGE7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIFJlc2V0dGluZyBmb3IgdGVzdHM6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogYWZ0ZXJFYWNoKCgpID0+IHtcclxuICogICByZXNldEdsb2JhbEFwaUNsaWVudCgpO1xyXG4gKiB9KTtcclxuICpcclxuICogdGVzdCgnY3JlYXRlcyBmcmVzaCBjbGllbnQnLCAoKSA9PiB7XHJcbiAqICAgY29uc3QgY2xpZW50ID0gZ2V0R2xvYmFsQXBpQ2xpZW50KHtcclxuICogICAgIGJhc2VVUkw6ICdodHRwOi8vdGVzdC5sb2NhbCcsXHJcbiAqICAgICBjb3JyZWxhdGlvbklkUHJlZml4OiAndGVzdCcsXHJcbiAqICAgICB0b2tlblN0b3JhZ2VLZXk6ICd0ZXN0VG9rZW4nXHJcbiAqICAgfSk7XHJcbiAqICAgLy8gTmV3IGluc3RhbmNlIHdpdGggdGVzdCBjb25maWdcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbEFwaUNsaWVudChjb25maWc6IEFwaUNsaWVudENvbmZpZyk6IEFwaUNsaWVudCB7XHJcbiAgaWYgKCFnbG9iYWxBcGlDbGllbnQpIHtcclxuICAgIGdsb2JhbEFwaUNsaWVudCA9IGNyZWF0ZUFwaUNsaWVudChjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdsb2JhbEFwaUNsaWVudDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcGxhY2VzIHRoZSBnbG9iYWwgc2luZ2xldG9uIEFwaUNsaWVudCB3aXRoIGEgY3VzdG9tIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIGdsb2JhbCBjbGllbnQgaW5zdGFuY2UsXHJcbiAqIHN1Y2ggYXMgaW4gdGVzdGluZyBzY2VuYXJpb3Mgb3Igd2hlbiB5b3UndmUgbWFudWFsbHkgY3JlYXRlZCBhIGNsaWVudCB3aXRoXHJcbiAqIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSBjbGllbnQgLSBUaGUgQXBpQ2xpZW50IGluc3RhbmNlIHRvIHVzZSBhcyB0aGUgZ2xvYmFsIHNpbmdsZXRvblxyXG4gKiBAcHVibGljXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIFRlc3Rpbmcgd2l0aCBhIG1vY2sgY2xpZW50OlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IG1vY2tDbGllbnQgPSBuZXcgQXBpQ2xpZW50KCdodHRwOi8vdGVzdC5sb2NhbCcpO1xyXG4gKiBtb2NrQ2xpZW50LmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoYXN5bmMgKHJlc3BvbnNlKSA9PiB7XHJcbiAqICAgLy8gTW9jayByZXNwb25zZSBkYXRhXHJcbiAqICAgcmV0dXJuIHsgZGF0YTogbW9ja0RhdGEgfTtcclxuICogfSk7XHJcbiAqXHJcbiAqIHNldEdsb2JhbEFwaUNsaWVudChtb2NrQ2xpZW50KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIEFkdmFuY2VkIGNvbmZpZ3VyYXRpb246XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgY2xpZW50ID0gbmV3IEFwaUNsaWVudCgnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLCA2MDAwMCk7XHJcbiAqIGNsaWVudC5zZXRDb3JyZWxhdGlvbklkUHJlZml4KCdjdXN0b20nKTtcclxuICogY2xpZW50LmFkZFJlcXVlc3RJbnRlcmNlcHRvcihjdXN0b21JbnRlcmNlcHRvcik7XHJcbiAqXHJcbiAqIHNldEdsb2JhbEFwaUNsaWVudChjbGllbnQpO1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRHbG9iYWxBcGlDbGllbnQoY2xpZW50OiBBcGlDbGllbnQpOiB2b2lkIHtcclxuICBnbG9iYWxBcGlDbGllbnQgPSBjbGllbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXNldHMgdGhlIGdsb2JhbCBBcGlDbGllbnQgc2luZ2xldG9uIHRvIG51bGwuXHJcbiAqXHJcbiAqIEFmdGVyIGNhbGxpbmcgdGhpcywgdGhlIG5leHQgY2FsbCB0byB7QGxpbmsgZ2V0R2xvYmFsQXBpQ2xpZW50fSB3aWxsIGNyZWF0ZVxyXG4gKiBhIGZyZXNoIGluc3RhbmNlLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW46XHJcbiAqIC0gVGVzdCBjbGVhbnVwIHRvIGVuc3VyZSB0ZXN0IGlzb2xhdGlvblxyXG4gKiAtIEFwcGxpY2F0aW9uIGxvZ291dCB0byBjbGVhciBhbnkgY2FjaGVkIHN0YXRlXHJcbiAqIC0gSG90IG1vZHVsZSByZWxvYWRpbmcgZHVyaW5nIGRldmVsb3BtZW50XHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICpcclxuICogQGV4YW1wbGVcclxuICogVGVzdCBjbGVhbnVwOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGFmdGVyRWFjaCgoKSA9PiB7XHJcbiAqICAgcmVzZXRHbG9iYWxBcGlDbGllbnQoKTtcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBMb2dvdXQgZmxvdzpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBoYW5kbGVMb2dvdXQoKSB7XHJcbiAqICAgLy8gQ2xlYXIgYXV0aGVudGljYXRpb25cclxuICogICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc2VydmljZVRva2VuJyk7XHJcbiAqXHJcbiAqICAgLy8gQ2FuY2VsIGFsbCBwZW5kaW5nIHJlcXVlc3RzIGFuZCByZXNldCBjbGllbnRcclxuICogICBjb25zdCBjbGllbnQgPSBnZXRHbG9iYWxBcGlDbGllbnQoKTtcclxuICogICBjbGllbnQuY2FuY2VsQWxsUmVxdWVzdHMoKTtcclxuICogICByZXNldEdsb2JhbEFwaUNsaWVudCgpO1xyXG4gKlxyXG4gKiAgIC8vIFJlZGlyZWN0IHRvIGxvZ2luXHJcbiAqICAgbmF2aWdhdGUoJy9sb2dpbicpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0R2xvYmFsQXBpQ2xpZW50KCk6IHZvaWQge1xyXG4gIGdsb2JhbEFwaUNsaWVudCA9IG51bGw7XHJcbn1cclxuIiwgIi8vIENhbmNlbFRva2VuIGltcGxlbWVudGF0aW9uXHJcbmV4cG9ydCBjbGFzcyBDYW5jZWxUb2tlbiB7XHJcbiAgcHJpdmF0ZSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcclxuICBwcml2YXRlIGNhbmNlbFByb21pc2U6IFByb21pc2U8dm9pZD47XHJcbiAgcHJpdmF0ZSBjYW5jZWxSZXNvbHZlPzogKCkgPT4gdm9pZDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIHRoaXMuY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICB0aGlzLmNhbmNlbFJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2lnbmFsKCk6IEFib3J0U2lnbmFsIHtcclxuICAgIHJldHVybiB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XHJcbiAgfVxyXG5cclxuICBjYW5jZWwocmVhc29uPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydChyZWFzb24pO1xyXG4gICAgdGhpcy5jYW5jZWxSZXNvbHZlPy4oKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0NhbmNlbGxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZDtcclxuICB9XHJcblxyXG4gIHRocm93SWZDYW5jZWxsZWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3QgY2FuY2VsbGVkJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc291cmNlKCk6IHsgdG9rZW46IENhbmNlbFRva2VuOyBjYW5jZWw6IChyZWFzb24/OiBzdHJpbmcpID0+IHZvaWQgfSB7XHJcbiAgICBjb25zdCB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbigpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRva2VuLFxyXG4gICAgICBjYW5jZWw6IChyZWFzb24/OiBzdHJpbmcpID0+IHRva2VuLmNhbmNlbChyZWFzb24pLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwgIi8vIFJlYWN0IEhvb2tzIHdpdGggQXBpUmVzcG9uc2UgZm9ybWF0XHJcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBBcGlFcnJvciB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuLy8gRXhwb3J0IGZhY3RvcnkgbWV0aG9kcyBhbmQgdHlwZXNcclxuZXhwb3J0IHtcclxuICBjcmVhdGVBcGlDbGllbnQsXHJcbiAgZ2V0R2xvYmFsQXBpQ2xpZW50LFxyXG4gIHNldEdsb2JhbEFwaUNsaWVudCxcclxuICByZXNldEdsb2JhbEFwaUNsaWVudCxcclxufSBmcm9tICcuL2NyZWF0ZUFwaUNsaWVudCc7XHJcblxyXG5leHBvcnQgdHlwZSB7IEFwaUNsaWVudENvbmZpZyB9IGZyb20gJy4vY3JlYXRlQXBpQ2xpZW50JztcclxuXHJcbmV4cG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vQXBpQ2xpZW50JztcclxuXHJcbi8vIEhlbHBlciBob29rIGZvciBmb3JtIHZhbGlkYXRpb24gZXJyb3JzXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWYWxpZGF0aW9uRXJyb3JzKGVycm9yOiBBcGlFcnJvciB8IG51bGwpIHtcclxuICBjb25zdCBnZXRGaWVsZEVycm9yID0gdXNlQ2FsbGJhY2soXHJcbiAgICAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xyXG4gICAgICBpZiAoIWVycm9yPy5lcnJvcnMgfHwgIWVycm9yLmVycm9yc1tmaWVsZF0pIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgZmllbGRFcnJvciA9IGVycm9yLmVycm9yc1tmaWVsZF07XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09ICdzdHJpbmcnKSByZXR1cm4gZmllbGRFcnJvcjtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRFcnJvcikpIHJldHVybiBmaWVsZEVycm9yWzBdO1xyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBmaWVsZEVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkRXJyb3IubWVzc2FnZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG4gICAgW2Vycm9yXVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhc0ZpZWxkRXJyb3IgPSB1c2VDYWxsYmFjayhcclxuICAgIChmaWVsZDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgIHJldHVybiAhIWdldEZpZWxkRXJyb3IoZmllbGQpO1xyXG4gICAgfSxcclxuICAgIFtnZXRGaWVsZEVycm9yXVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGdldEFsbEVycm9ycyA9IHVzZUNhbGxiYWNrKCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcclxuICAgIGlmICghZXJyb3I/LmVycm9ycykgcmV0dXJuIHt9O1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG5cclxuICAgIE9iamVjdC5lbnRyaWVzKGVycm9yLmVycm9ycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWUuam9pbignLCAnKTtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmICdtZXNzYWdlJyBpbiB2YWx1ZSkge1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWUubWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9LCBbZXJyb3JdKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdldEZpZWxkRXJyb3IsXHJcbiAgICBoYXNGaWVsZEVycm9yLFxyXG4gICAgZ2V0QWxsRXJyb3JzLFxyXG4gICAgaGFzRXJyb3JzOiBlcnJvcj8uZXJyb3JzLFxyXG4gIH07XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5cbnR5cGUgQXV0aG9yaXplZFZpZXdQcm9wcyA9IFByb3BzV2l0aENoaWxkcmVuICYge1xuICBzaG93OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IEF1dGhvcml6ZWRWaWV3ID0gKHsgY2hpbGRyZW4sIHNob3cgfTogQXV0aG9yaXplZFZpZXdQcm9wcykgPT4ge1xuICBpZiAoIXNob3cpIHJldHVybiA8PjwvPjtcblxuICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEJ1dHRvblByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBjb25zdCBDYW5jZWxCdXR0b246IFJlYWN0LkZDPEJ1dHRvblByb3BzPiA9ICh7XG4gIGNoaWxkcmVuID0gJ0NhbmNlbCcsXG4gIHZhcmlhbnQgPSAnb3V0bGluZWQnLFxuICBzeCxcbiAgLi4ucmVzdFxufSkgPT4gKFxuICA8QnV0dG9uIHZhcmlhbnQ9e3ZhcmlhbnR9IHN4PXt7IHdpZHRoOiAnNnJlbScsIC4uLnN4IH19IHsuLi5yZXN0fT5cbiAgICB7Y2hpbGRyZW59XG4gIDwvQnV0dG9uPlxuKTtcbiIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgQ2xlYXJCdXR0b24gY29tcG9uZW50LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuaW50ZXJmYWNlIENsZWFyQnV0dG9uUHJvcHMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgZm9ybSBvciBvcGVyYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHN1Ym1pdHRlZC5cbiAgICogV2hlbiB0cnVlLCB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIHRvIHByZXZlbnQgbXVsdGlwbGUgY2xlYXIgYWN0aW9ucy5cbiAgICovXG4gIGlzU3VibWl0dGluZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW4gdGhlIGNsZWFyIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBTaG91bGQgaGFuZGxlIHRoZSBjbGVhcmluZyBsb2dpYyAoZS5nLiwgZm9ybSByZXNldCwgZGF0YSBjbGVhcmluZykuXG4gICAqL1xuICBoYW5kbGVDbGVhcjogKCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBtdDogMiwgY29sb3I6ICd3YXJuaW5nLm1haW4nIH1cbiAgICovXG4gIHN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGxvY2FsU3RvcmFnZSBrZXkgdG8gcmVtb3ZlIHdoZW4gY2xlYXJpbmcuXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgY29ycmVzcG9uZGluZyBsb2NhbFN0b3JhZ2UgaXRlbSB3aWxsIGJlIHJlbW92ZWQgb24gY2xpY2suXG4gICAqIEBleGFtcGxlIFwidXNlci1wcmVmZXJlbmNlc1wiIG9yIFwiZm9ybS1kYXRhXCJcbiAgICovXG4gIHN0b3JlS2V5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkaXplZCBjbGVhciBidXR0b24gY29tcG9uZW50IHdpdGggbG9jYWxTdG9yYWdlIGludGVncmF0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgY29uc2lzdGVudCBjbGVhciBidXR0b24gaW1wbGVtZW50YXRpb24gdGhhdCBoYW5kbGVzXG4gKiBib3RoIGNhbGxiYWNrIGV4ZWN1dGlvbiBhbmQgb3B0aW9uYWwgbG9jYWxTdG9yYWdlIGNsZWFudXAuIEl0IGF1dG9tYXRpY2FsbHlcbiAqIGRpc2FibGVzIGR1cmluZyBmb3JtIHN1Ym1pc3Npb25zIGFuZCBjYW4gY2xlYXIgc3RvcmVkIGRhdGEgd2hlbiBuZWVkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8Q2xlYXJCdXR0b25cbiAqICAgaXNTdWJtaXR0aW5nPXtpc0xvYWRpbmd9XG4gKiAgIGhhbmRsZUNsZWFyPXsoKSA9PiBmb3JtLnJlc2V0KCl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9jYWxTdG9yYWdlIGNsZWFudXA6XG4gKiBgYGB0c3hcbiAqIDxDbGVhckJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2Zvcm0uZm9ybVN0YXRlLmlzU3VibWl0dGluZ31cbiAqICAgaGFuZGxlQ2xlYXI9eygpID0+IHNldEZpbHRlcnMoe30pfVxuICogICBzdG9yZUtleT1cInVzZXItZmlsdGVyc1wiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGZvciBjbGVhciBidXR0b24gY29uZmlndXJhdGlvblxuICogQHJldHVybnMgTVVJIEJ1dHRvbiBjb21wb25lbnQgY29uZmlndXJlZCBhcyBhIGNsZWFyIGJ1dHRvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IENsZWFyQnV0dG9uID0gKHtcbiAgaXNTdWJtaXR0aW5nLFxuICBoYW5kbGVDbGVhcixcbiAgc3gsXG4gIHN0b3JlS2V5LFxufTogQ2xlYXJCdXR0b25Qcm9wcykgPT4ge1xuICBjb25zdCBvbkNsaWNrID0gKCkgPT4ge1xuICAgIGhhbmRsZUNsZWFyKCk7XG4gICAgaWYgKHN0b3JlS2V5ICE9IG51bGwpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JlS2V5KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8QnV0dG9uXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgIGRpc2FibGVkPXtpc1N1Ym1pdHRpbmd9XG4gICAgICBzeD17c3h9XG4gICAgPlxuICAgICAgQ2xlYXJcbiAgICA8L0J1dHRvbj5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHsgQ29udGFpbmVyLCB0eXBlIFN4UHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XHJcblxyXG5pbnRlcmZhY2UgU2ltcGxlQ29udGFpbmVyUHJvcHMge1xyXG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XHJcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xyXG4gIHN4PzogU3hQcm9wcztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFNpbXBsZUNvbnRhaW5lciA9ICh7XHJcbiAgY2hpbGRyZW4sXHJcbiAgY2xhc3NOYW1lLFxyXG4gIHN4LFxyXG59OiBTaW1wbGVDb250YWluZXJQcm9wcykgPT4gKFxyXG4gIDxDb250YWluZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9IHN4PXt7IC4uLnN4IH19PlxyXG4gICAge2NoaWxkcmVufVxyXG4gIDwvQ29udGFpbmVyPlxyXG4pO1xyXG4iLCAiaW1wb3J0IEZpbHRlckFsdEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9GaWx0ZXJBbHQnO1xuaW1wb3J0IHsgTG9hZGluZ0J1dHRvbiB9IGZyb20gJ0BtdWkvbGFiJztcbmltcG9ydCB0eXBlIHsgU3hQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgQmFkZ2UgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEZpbHRlckJ1dHRvbiBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgRmlsdGVyQnV0dG9uUHJvcHMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgZmlsdGVyIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuICAgKiBXaGVuIHRydWUsIHNob3dzIGxvYWRpbmcgc3Bpbm5lciBhbmQgZGlzYWJsZXMgdGhlIGJ1dHRvbi5cbiAgICovXG4gIGlzU3VibWl0dGluZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENvbnRyb2xzIGJ1dHRvbiB2aXNpYmlsaXR5IGFuZCBlbmFibGVkIHN0YXRlLlxuICAgKiBXaGVuIGZhbHNlLCB0aGUgYnV0dG9uIGlzIGRpc2FibGVkLlxuICAgKiBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHNob3c/OiBib29sZWFuO1xuICAvKipcbiAgICogQ3VzdG9tIHRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLlxuICAgKiBAZGVmYXVsdFZhbHVlIFwiRmlsdGVyXCJcbiAgICogQGV4YW1wbGUgXCJBcHBseSBGaWx0ZXJzXCIgb3IgXCJTZWFyY2hcIlxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZmlsdGVyIGljb24uXG4gICAqIEBleGFtcGxlIDxTZWFyY2hJY29uIC8+XG4gICAqL1xuICBpY29uPzogUmVhY3QuUmVhY3ROb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBidXR0b24gc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBtdDogMiwgbWluV2lkdGg6IDEyMCB9XG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIGljb24gc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBjb2xvcjogJ3ByaW1hcnkubWFpbicsIGZvbnRTaXplOiAxOCB9XG4gICAqL1xuICBpY29uU3g/OiBTeFByb3BzO1xufVxuXG4vKipcbiAqIEZpbHRlciBidXR0b24gY29tcG9uZW50IHdpdGggbG9hZGluZyBzdGF0ZXMgYW5kIGN1c3RvbWl6YWJsZSBhcHBlYXJhbmNlLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgc3RhbmRhcmRpemVkIGZpbHRlci9zdWJtaXQgYnV0dG9uIHdpdGggaW50ZWdyYXRlZCBsb2FkaW5nXG4gKiBzdGF0ZXMsIGljb24gc3VwcG9ydCwgYW5kIGJhZGdlIHN0eWxpbmcuIEl0J3MgZGVzaWduZWQgZm9yIHVzZSBpbiBmaWx0ZXIgZm9ybXNcbiAqIGFuZCBzZWFyY2ggaW50ZXJmYWNlcyB3aGVyZSB1c2VycyBuZWVkIHRvIGFwcGx5IGZpbHRlcmluZyBjcml0ZXJpYS5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJCdXR0b25cbiAqICAgaXNTdWJtaXR0aW5nPXtpc0xvYWRpbmd9XG4gKiAgIHNob3c9e2hhc0ZpbHRlcnN9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0aXRsZSBhbmQgaWNvbjpcbiAqIGBgYHRzeFxuICogPEZpbHRlckJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2Zvcm0uZm9ybVN0YXRlLmlzU3VibWl0dGluZ31cbiAqICAgdGl0bGU9XCJBcHBseSBTZWFyY2hcIlxuICogICBpY29uPXs8U2VhcmNoSWNvbiAvPn1cbiAqICAgc2hvdz17dHJ1ZX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gc3R5bGluZzpcbiAqIGBgYHRzeFxuICogPEZpbHRlckJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2lzUHJvY2Vzc2luZ31cbiAqICAgdGl0bGU9XCJGaWx0ZXIgUmVzdWx0c1wiXG4gKiAgIHN4PXt7IG1pbldpZHRoOiAxNTAsIG10OiAyIH19XG4gKiAgIGljb25TeD17eyBmb250U2l6ZTogMjAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgZm9yIGZpbHRlciBidXR0b24gY29uZmlndXJhdGlvblxuICogQHJldHVybnMgTVVJIExvYWRpbmdCdXR0b24gY29tcG9uZW50IGNvbmZpZ3VyZWQgYXMgYSBmaWx0ZXIgYnV0dG9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgRmlsdGVyQnV0dG9uID0gKHtcbiAgaXNTdWJtaXR0aW5nLFxuICBzaG93LFxuICB0aXRsZSxcbiAgaWNvbixcbiAgc3gsXG4gIGljb25TeCxcbn06IEZpbHRlckJ1dHRvblByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPExvYWRpbmdCdXR0b25cbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gICAgICBsb2FkaW5nPXtpc1N1Ym1pdHRpbmd9XG4gICAgICBkaXNhYmxlZD17IXNob3d9XG4gICAgICBkaXNhYmxlUmlwcGxlXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgc3g9e3tcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgLi4uc3gsXG4gICAgICB9fVxuICAgICAgc3RhcnRJY29uPXtcbiAgICAgICAgPEJhZGdlIGNvbG9yPVwiZXJyb3JcIiB2YXJpYW50PVwic3RhbmRhcmRcIj5cbiAgICAgICAgICB7aWNvbiA/IGljb24gOiA8RmlsdGVyQWx0SWNvbiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBzeD17aWNvblN4fSAvPn1cbiAgICAgICAgPC9CYWRnZT5cbiAgICAgIH1cbiAgICA+XG4gICAgICB7dGl0bGU/LnRyaW0oKSA9PT0gJycgfHwgIXRpdGxlID8gJ0ZpbHRlcicgOiB0aXRsZX1cbiAgICA8L0xvYWRpbmdCdXR0b24+XG4gICk7XG59O1xuIiwgImltcG9ydCBDaGlwIGZyb20gJ0BtdWkvbWF0ZXJpYWwvQ2hpcCc7XHJcbmltcG9ydCB7IG1lbW8gfSBmcm9tICdyZWFjdCc7XHJcblxyXG4vLyBJbmRpdmlkdWFsIGNoaXAgY29tcG9uZW50IHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVyZW5kZXJzIG9mIHNpYmxpbmcgY2hpcHNcclxuZXhwb3J0IGNvbnN0IEZpbHRlckNoaXAgPSBtZW1vKFxyXG4gICh7XHJcbiAgICBmaWVsZEtleSxcclxuICAgIGZpbHRlcixcclxuICAgIG9uRGVsZXRlLFxyXG4gIH06IHtcclxuICAgIGZpZWxkS2V5OiBzdHJpbmc7XHJcbiAgICBmaWx0ZXI6IHsgTGFiZWw6IHN0cmluZzsgVmFsdWU6IHVua25vd24gfTtcclxuICAgIG9uRGVsZXRlPzogKCkgPT4gdm9pZDtcclxuICB9KSA9PiB7XHJcbiAgICBjb25zdCBoYXNWYWx1ZSA9XHJcbiAgICAgIGZpbHRlci5WYWx1ZSAhPT0gbnVsbCAmJlxyXG4gICAgICBmaWx0ZXIuVmFsdWUgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICBmaWx0ZXIuVmFsdWUgIT09ICcnO1xyXG4gICAgY29uc3QgbGFiZWwgPSBgJHtmaWVsZEtleS5yZXBsYWNlKCdQSycsICcnKX06ICR7ZmlsdGVyLkxhYmVsfWA7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgPENoaXBcclxuICAgICAgICBrZXk9e2ZpZWxkS2V5fVxyXG4gICAgICAgIGxhYmVsPXtsYWJlbH1cclxuICAgICAgICB2YXJpYW50PXtoYXNWYWx1ZSA/ICdmaWxsZWQnIDogJ291dGxpbmVkJ31cclxuICAgICAgICBzaXplPVwic21hbGxcIlxyXG4gICAgICAgIG9uRGVsZXRlPXtoYXNWYWx1ZSA/IG9uRGVsZXRlIDogdW5kZWZpbmVkfVxyXG4gICAgICAvPlxyXG4gICAgKTtcclxuICB9XHJcbik7XHJcblxyXG5GaWx0ZXJDaGlwLmRpc3BsYXlOYW1lID0gJ0ZpbHRlckNoaXAnO1xyXG4iLCAiaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIFR5cG9ncmFwaHksIEJveCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBtZW1vLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW1wb3J0IHsgRmlsdGVyQ2hpcCB9IGZyb20gJy4vRmlsdGVyQ2hpcCc7XHJcblxyXG5pbnRlcmZhY2UgRmlsdGVyRGlzcGxheVByb3BzPFRGaWx0ZXJNb2RlbD4ge1xyXG4gIGZyaWVuZGx5RmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCB7IExhYmVsOiBzdHJpbmc7IFZhbHVlOiB1bmtub3duIH0+O1xyXG4gIG9uRnJpZW5kbHlGaWx0ZXJDaGFuZ2U/OiAoZmllbGRLZXk6IGtleW9mIFRGaWx0ZXJNb2RlbCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFByb2dyYW1zRmlsdGVyRGlzcGxheSA9IG1lbW8oXHJcbiAgPFRGaWx0ZXJNb2RlbCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcclxuICAgIHByb3BzOiBGaWx0ZXJEaXNwbGF5UHJvcHM8VEZpbHRlck1vZGVsPlxyXG4gICkgPT4ge1xyXG4gICAgY29uc3QgeyBmcmllbmRseUZpbHRlciwgb25GcmllbmRseUZpbHRlckNoYW5nZSB9ID0gcHJvcHM7XHJcblxyXG4gICAgLy8gTWVtb2l6ZSBkZWxldGUgaGFuZGxlcnMgdG8gcHJldmVudCByZWNyZWF0aW9uXHJcbiAgICBjb25zdCBkZWxldGVIYW5kbGVycyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICBpZiAoIW9uRnJpZW5kbHlGaWx0ZXJDaGFuZ2UpIHJldHVybiB7fTtcclxuXHJcbiAgICAgIGNvbnN0IGhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkPiA9IHt9O1xyXG5cclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZnJpZW5kbHlGaWx0ZXIpKSB7XHJcbiAgICAgICAgaGFuZGxlcnNba2V5XSA9ICgpID0+IG9uRnJpZW5kbHlGaWx0ZXJDaGFuZ2Uoa2V5IGFzIGtleW9mIFRGaWx0ZXJNb2RlbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBoYW5kbGVycztcclxuICAgIH0sIFtvbkZyaWVuZGx5RmlsdGVyQ2hhbmdlLCBmcmllbmRseUZpbHRlcl0pO1xyXG5cclxuICAgIC8vIE1lbW9pemUgY2hpcCBsaXN0IHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVjYWxjdWxhdGlvbnNcclxuICAgIGNvbnN0IGNoaXBMaXN0ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhmcmllbmRseUZpbHRlcikubWFwKChba2V5LCBmaWx0ZXJdKSA9PiAoXHJcbiAgICAgICAgPEZpbHRlckNoaXBcclxuICAgICAgICAgIGtleT17a2V5fVxyXG4gICAgICAgICAgZmllbGRLZXk9e2tleX1cclxuICAgICAgICAgIGZpbHRlcj17ZmlsdGVyIGFzIHsgTGFiZWw6IHN0cmluZzsgVmFsdWU6IHVua25vd24gfX1cclxuICAgICAgICAgIG9uRGVsZXRlPXtkZWxldGVIYW5kbGVyc1trZXldfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICkpO1xyXG4gICAgfSwgW2ZyaWVuZGx5RmlsdGVyLCBkZWxldGVIYW5kbGVyc10pO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxDYXJkIHN4PXt7IG1iOiAyIH19PlxyXG4gICAgICAgIDxDYXJkQ29udGVudD5cclxuICAgICAgICAgIDxUeXBvZ3JhcGh5IHZhcmlhbnQ9XCJoNlwiIGd1dHRlckJvdHRvbT5cclxuICAgICAgICAgICAgQWN0aXZlIEZpbHRlcnNcclxuICAgICAgICAgIDwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBnYXA9ezF9IGZsZXhXcmFwPVwid3JhcFwiPlxyXG4gICAgICAgICAgICB7Y2hpcExpc3R9XHJcbiAgICAgICAgICA8L0JveD5cclxuICAgICAgICA8L0NhcmRDb250ZW50PlxyXG4gICAgICA8L0NhcmQ+XHJcbiAgICApO1xyXG4gIH1cclxuKTtcclxuXHJcblByb2dyYW1zRmlsdGVyRGlzcGxheS5kaXNwbGF5TmFtZSA9ICdGaWx0ZXJEaXNwbGF5JztcclxuXHJcbmV4cG9ydCB0eXBlIHsgRmlsdGVyRGlzcGxheVByb3BzIH07XHJcbiIsICJpbXBvcnQgTWFuYWdlU2VhcmNoSWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL01hbmFnZVNlYXJjaCc7XG5pbXBvcnQgdHlwZSB7IFN4UHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIEJveCxcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIERpdmlkZXIsXG4gIEdyaWQsXG4gIFR5cG9ncmFwaHksXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUHJvcHNXaXRoQ2hpbGRyZW4sIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEZpbHRlcldyYXBwZXIgY29tcG9uZW50LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xudHlwZSBGaWx0ZXJXcmFwcGVyUHJvcHMgPSBQcm9wc1dpdGhDaGlsZHJlbjx7XG4gIC8qKlxuICAgKiBUaXRsZSB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgY2FyZCBoZWFkZXIuXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJGaWx0ZXJcIlxuICAgKiBAZXhhbXBsZSBcIlNlYXJjaCBDcml0ZXJpYVwiIG9yIFwiQWR2YW5jZWQgRmlsdGVyc1wiXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE51bWJlciBvZiBhY3RpdmUgZmlsdGVycyB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuXG4gICAqIE9ubHkgc2hvd24gd2hlbiBzaG93Q291bnQgaXMgdHJ1ZS5cbiAgICogQGV4YW1wbGUgMyBmb3IgXCJGaWx0ZXIgKDMpXCJcbiAgICovXG4gIGZpbHRlckNvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBjYXJkIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgbXQ6IDIsIGJveFNoYWRvdzogMiB9XG4gICAqL1xuICBjYXJkU3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSB0aXRsZSB0ZXh0IHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgZm9udFNpemU6IDE4LCBmb250V2VpZ2h0OiAnYm9sZCcgfVxuICAgKi9cbiAgdGV4dFN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIEN1c3RvbSBpY29uIHRvIGRpc3BsYXkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBzZWFyY2ggaWNvbi5cbiAgICogQGV4YW1wbGUgPEZpbHRlckxpc3RJY29uIC8+XG4gICAqL1xuICBpY29uPzogUmVhY3ROb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBpY29uIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgY29sb3I6ICdzZWNvbmRhcnkubWFpbicsIGZvbnRTaXplOiAyNCB9XG4gICAqL1xuICBpY29uU3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNwbGF5IHRoZSBmaWx0ZXIgY291bnQgaW4gdGhlIGhlYWRlci5cbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgc2hvd0NvdW50PzogYm9vbGVhbjtcbn0+O1xuXG4vKipcbiAqIENhcmQtYmFzZWQgd3JhcHBlciBjb21wb25lbnQgZm9yIG9yZ2FuaXppbmcgZmlsdGVyIGNvbnRyb2xzIGFuZCBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgY29uc2lzdGVudCBsYXlvdXQgZm9yIGZpbHRlciBpbnRlcmZhY2VzIHdpdGggYSBoZWFkZXIsXG4gKiBvcHRpb25hbCBmaWx0ZXIgY291bnQgZGlzcGxheSwgYW5kIGEgZ3JpZC1iYXNlZCBjb250ZW50IGFyZWEuIEl0J3MgZGVzaWduZWQgdG9cbiAqIGNvbnRhaW4gZm9ybSBjb250cm9scyBhbmQgZmlsdGVyIGVsZW1lbnRzIGluIGEgdmlzdWFsbHkgb3JnYW5pemVkIG1hbm5lci5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJXcmFwcGVyPlxuICogICA8R3JpZCBpdGVtIHhzPXsxMn0gbWQ9ezZ9PlxuICogICAgIDxUZXh0RmllbGQgbGFiZWw9XCJTZWFyY2hcIiAvPlxuICogICA8L0dyaWQ+XG4gKiAgIDxHcmlkIGl0ZW0geHM9ezEyfSBtZD17Nn0+XG4gKiAgICAgPFNlbGVjdCBsYWJlbD1cIkNhdGVnb3J5XCIgLz5cbiAqICAgPC9HcmlkPlxuICogPC9GaWx0ZXJXcmFwcGVyPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHRpdGxlIGFuZCBjb3VudDpcbiAqIGBgYHRzeFxuICogPEZpbHRlcldyYXBwZXJcbiAqICAgdGl0bGU9XCJBZHZhbmNlZCBTZWFyY2hcIlxuICogICBmaWx0ZXJDb3VudD17YWN0aXZlRmlsdGVycy5sZW5ndGh9XG4gKiAgIHNob3dDb3VudD17dHJ1ZX1cbiAqID5cbiAqICAge2ZpbHRlckNvbnRyb2xzfVxuICogPC9GaWx0ZXJXcmFwcGVyPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHN0eWxpbmc6XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJXcmFwcGVyXG4gKiAgIHRpdGxlPVwiUHJvZHVjdCBGaWx0ZXJzXCJcbiAqICAgaWNvbj17PEZpbHRlckxpc3RJY29uIC8+fVxuICogICBjYXJkU3g9e3sgbXQ6IDMsIGJvcmRlclJhZGl1czogMiB9fVxuICogICB0ZXh0U3g9e3sgY29sb3I6ICdzZWNvbmRhcnkubWFpbicgfX1cbiAqID5cbiAqICAge2NoaWxkcmVufVxuICogPC9GaWx0ZXJXcmFwcGVyPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGluY2x1ZGluZyBjaGlsZHJlbiBhbmQgc3R5bGluZyBvcHRpb25zXG4gKiBAcmV0dXJucyBNVUkgQ2FyZCBjb21wb25lbnQgd2l0aCBzdHJ1Y3R1cmVkIGZpbHRlciBsYXlvdXRcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBGaWx0ZXJXcmFwcGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBmaWx0ZXJDb3VudCxcbiAgY2FyZFN4LFxuICB0ZXh0U3gsXG4gIGljb24sXG4gIGljb25TeCxcbiAgc2hvd0NvdW50LFxufTogRmlsdGVyV3JhcHBlclByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBzeD17e1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnMHB4JyxcbiAgICAgICAgbWI6IDIsXG4gICAgICAgIC4uLmNhcmRTeCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPENhcmRIZWFkZXJcbiAgICAgICAgc3g9e3tcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleFdyYXA6ICd3cmFwJyxcbiAgICAgICAgICBwOiAnMXJlbScsXG4gICAgICAgICAgJy5NdWlDYXJkSGVhZGVyLWFjdGlvbic6IHtcbiAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgIGFsaWduU2VsZjogJ2NlbnRlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgfX1cbiAgICAgICAgdGl0bGU9e1xuICAgICAgICAgIDxCb3ggc3g9e3sgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAwLjUgfX0+XG4gICAgICAgICAgICB7aWNvbiA/IChcbiAgICAgICAgICAgICAgaWNvblxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPE1hbmFnZVNlYXJjaEljb25cbiAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMi41cmVtJyxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICAgICAgICAgICAgIC4uLmljb25TeCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxUeXBvZ3JhcGh5XG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJoNVwiXG4gICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICAgICAgICAgICAuLi50ZXh0U3gsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0aXRsZSA/IHRpdGxlIDogJ0ZpbHRlcid9eycgJ31cbiAgICAgICAgICAgICAge3Nob3dDb3VudCA/IGAoJHtmaWx0ZXJDb3VudCA/IGZpbHRlckNvdW50IDogMH0pYCA6IDw+PC8+fVxuICAgICAgICAgICAgPC9UeXBvZ3JhcGh5PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICB9XG4gICAgICA+PC9DYXJkSGVhZGVyPlxuICAgICAgPERpdmlkZXIgLz5cbiAgICAgIDxDYXJkQ29udGVudCBzeD17eyBweTogMiB9fT5cbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9ezJ9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9HcmlkPlxuICAgICAgPC9DYXJkQ29udGVudD5cbiAgICA8L0NhcmQ+XG4gICk7XG59O1xuIiwgIi8vIGNvcmUvY29tcG9uZW50cy9Gb290ZXIvaW5kZXgudHN4XHJcbmltcG9ydCB7IEJveCwgVHlwb2dyYXBoeSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZvb3RlcjogUmVhY3QuRkMgPSAoKSA9PiB7XHJcbiAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8Qm94XHJcbiAgICAgIGNvbXBvbmVudD1cImZvb3RlclwiXHJcbiAgICAgIHN4PXt7XHJcbiAgICAgICAgcHk6IDIsXHJcbiAgICAgICAgcHg6IDQsXHJcbiAgICAgICAgbXQ6ICdhdXRvJyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lID0+XHJcbiAgICAgICAgICB0aGVtZS5wYWxldHRlLm1vZGUgPT09ICdsaWdodCdcclxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmdyZXlbMjAwXVxyXG4gICAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUuZ3JleVs4MDBdLFxyXG4gICAgICB9fVxyXG4gICAgPlxyXG4gICAgICA8VHlwb2dyYXBoeSB2YXJpYW50PVwiYm9keTJcIiBjb2xvcj1cInRleHQuc2Vjb25kYXJ5XCIgYWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICB7YFx1MDBBOSBDb3B5cmlnaHQgJHtjdXJyZW50WWVhcn0gR04uIEFsbCByaWdodHMgcmVzZXJ2ZWQgYnkgUGFydWwgVW5pdmVyc2l0eS5gfVxyXG4gICAgICA8L1R5cG9ncmFwaHk+XHJcbiAgICA8L0JveD5cclxuICApO1xyXG59O1xyXG4iLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUb29sdGlwLCBUeXBvZ3JhcGh5IH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBMYWJlbFRleHQgY29tcG9uZW50LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuaW50ZXJmYWNlIExhYmVsVGV4dFByb3BzIHtcbiAgLyoqXG4gICAqIExhYmVsIHRleHQgdG8gZGlzcGxheSBvbiB0aGUgbGVmdCBzaWRlLlxuICAgKiBAZXhhbXBsZSBcIk5hbWVcIiBvciBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFZhbHVlIGNvbnRlbnQgdG8gZGlzcGxheSBvbiB0aGUgcmlnaHQgc2lkZS5cbiAgICogQ2FuIGJlIHRleHQsIG51bWJlcnMsIG9yIFJlYWN0IGVsZW1lbnRzLlxuICAgKiBAZXhhbXBsZSBcIkpvaG4gRG9lXCIgb3IgPExpbms+VmlldyBEZXRhaWxzPC9MaW5rPlxuICAgKi9cbiAgdmFsdWU6IFJlYWN0LlJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBncmlkIHNpemluZyBmb3IgbGFiZWwgYW5kIHZhbHVlIHNlY3Rpb25zLlxuICAgKiBAZGVmYXVsdFZhbHVlIHsgbGFiZWxTaXplOiB7IHhzOiA2LCBzbTogNiwgbWQ6IDYgfSwgdmFsdWVTaXplOiB7IHhzOiAxMiwgc206IDYsIG1kOiA2IH0gfVxuICAgKi9cbiAgZ3JpZFNpemU/OiB7XG4gICAgLyoqIEdyaWQgc2l6ZSBjb25maWd1cmF0aW9uIGZvciB0aGUgbGFiZWwgc2VjdGlvbiAqL1xuICAgIGxhYmVsU2l6ZTogeyB4czogbnVtYmVyOyBzbTogbnVtYmVyOyBtZDogbnVtYmVyIH07XG4gICAgLyoqIEdyaWQgc2l6ZSBjb25maWd1cmF0aW9uIGZvciB0aGUgdmFsdWUgc2VjdGlvbiAqL1xuICAgIHZhbHVlU2l6ZTogeyB4czogbnVtYmVyOyBzbTogbnVtYmVyOyBtZDogbnVtYmVyIH07XG4gIH07XG4gIC8qKlxuICAgKiBHcmlkIHNpemUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGVudGlyZSBjb250YWluZXIuXG4gICAqIEBkZWZhdWx0VmFsdWUgeyB4czogMTIsIHNtOiA2LCBtZDogNiB9XG4gICAqL1xuICBjb250YWluZXJTaXplPzogeyB4czogbnVtYmVyOyBzbTogbnVtYmVyOyBtZDogbnVtYmVyIH07XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIGxhYmVsIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgZm9udFdlaWdodDogJ2JvbGQnLCBjb2xvcjogJ3ByaW1hcnkubWFpbicgfVxuICAgKi9cbiAgbGFiZWxTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHZhbHVlIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgY29sb3I6ICd0ZXh0LnNlY29uZGFyeScsIGZvbnRTdHlsZTogJ2l0YWxpYycgfVxuICAgKi9cbiAgdmFsdWVTeD86IFN4UHJvcHM7XG59XG5cbi8qKlxuICogUmVzcG9uc2l2ZSBsYWJlbC12YWx1ZSBkaXNwbGF5IGNvbXBvbmVudCB3aXRoIGhvdmVyIGVmZmVjdHMgYW5kIHRleHQgdHJ1bmNhdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBjcmVhdGVzIGEgY29uc2lzdGVudCBsYWJlbC12YWx1ZSBwYWlyIGxheW91dCB0aGF0IGFkYXB0cyB0byBkaWZmZXJlbnRcbiAqIHNjcmVlbiBzaXplcy4gSXQgaW5jbHVkZXMgaG92ZXIgZWZmZWN0cywgdGV4dCB0cnVuY2F0aW9uIHdpdGggdG9vbHRpcHMsIGFuZFxuICogY3VzdG9taXphYmxlIGdyaWQgc2l6aW5nIGZvciBmbGV4aWJsZSBsYXlvdXRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPExhYmVsVGV4dFxuICogICBsYWJlbD1cIkZ1bGwgTmFtZVwiXG4gKiAgIHZhbHVlPVwiSm9obiBEb2VcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIFJlYWN0IGVsZW1lbnQgdmFsdWU6XG4gKiBgYGB0c3hcbiAqIDxMYWJlbFRleHRcbiAqICAgbGFiZWw9XCJQcm9maWxlXCJcbiAqICAgdmFsdWU9ezxMaW5rIGhyZWY9XCIvcHJvZmlsZVwiPlZpZXcgUHJvZmlsZTwvTGluaz59XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIHNpemluZzpcbiAqIGBgYHRzeFxuICogPExhYmVsVGV4dFxuICogICBsYWJlbD1cIkRlc2NyaXB0aW9uXCJcbiAqICAgdmFsdWU9e2xvbmdEZXNjcmlwdGlvbn1cbiAqICAgZ3JpZFNpemU9e3tcbiAqICAgICBsYWJlbFNpemU6IHsgeHM6IDEyLCBzbTogMywgbWQ6IDIgfSxcbiAqICAgICB2YWx1ZVNpemU6IHsgeHM6IDEyLCBzbTogOSwgbWQ6IDEwIH1cbiAqICAgfX1cbiAqICAgY29udGFpbmVyU2l6ZT17eyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGZvciBsYWJlbC12YWx1ZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBHcmlkLWJhc2VkIGxheW91dCB3aXRoIGxhYmVsIGFuZCB2YWx1ZSBzZWN0aW9uc1xuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IExhYmVsVGV4dCA9ICh7XG4gIGxhYmVsLFxuICB2YWx1ZSxcbiAgZ3JpZFNpemUsXG4gIGNvbnRhaW5lclNpemUsXG4gIGxhYmVsU3gsXG4gIHZhbHVlU3gsXG59OiBMYWJlbFRleHRQcm9wcykgPT4ge1xuICBjb25zdCBkZWZhdWx0R3JpZFNpemUgPSB7XG4gICAgbGFiZWxTaXplOiB7IHhzOiA2LCBzbTogNiwgbWQ6IDYgfSxcbiAgICB2YWx1ZVNpemU6IHsgeHM6IDEyLCBzbTogNiwgbWQ6IDYgfSxcbiAgfTtcbiAgY29uc3QgZGVmYXVsdENvbnRhaW5lclNpemUgPSB7IHhzOiAxMiwgc206IDYsIG1kOiA2IH07XG4gIGNvbnN0IHNpemUgPSBncmlkU2l6ZSB8fCBkZWZhdWx0R3JpZFNpemU7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclNpemUgfHwgZGVmYXVsdENvbnRhaW5lclNpemU7XG5cbiAgcmV0dXJuIChcbiAgICA8R3JpZFxuICAgICAgc2l6ZT17Y29udGFpbmVyfVxuICAgICAgc3g9e3tcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiB7IHhzOiAnY29sdW1uJywgc206ICdyb3cnLCBtZDogJ3JvdycgfSxcbiAgICAgICAgJyY6aG92ZXInOiB7IGJnY29sb3I6ICcjZWZlZmVmJywgb3ZlcmZsb3c6ICdoaWRkZW4nIH0sXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxHcmlkXG4gICAgICAgIHNpemU9e3NpemUubGFiZWxTaXplfVxuICAgICAgICBzeD17e1xuICAgICAgICAgIHBhZGRpbmc6ICc1cHgnLFxuICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXG4gICAgICAgICAgdGV4dEFsaWduOiB7IHhzOiAnbGVmdCcsIHNtOiAncmlnaHQnLCBtZDogJ3JpZ2h0JyB9LFxuICAgICAgICAgIC4uLmxhYmVsU3gsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHtsYWJlbH0gOlxuICAgICAgPC9HcmlkPlxuICAgICAgPEdyaWRcbiAgICAgICAgc2l6ZT17c2l6ZS52YWx1ZVNpemV9XG4gICAgICAgIHN4PXt7IHBhZGRpbmc6ICc1cHgnLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhXcmFwOiAnd3JhcCcgfX1cbiAgICAgID5cbiAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3ZhbHVlfSBhcnJvdz5cbiAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgZm9udFNpemU6ICcxNHB4JyxcbiAgICAgICAgICAgICAgd29yZEJyZWFrOiAnYnJlYWstd29yZCcsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgZGlzcGxheTogJy13ZWJraXQtYm94JyxcbiAgICAgICAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnLFxuICAgICAgICAgICAgICBXZWJraXRMaW5lQ2xhbXA6IDIsXG4gICAgICAgICAgICAgIFdlYmtpdEJveE9yaWVudDogJ3ZlcnRpY2FsJyxcbiAgICAgICAgICAgICAgLi4udmFsdWVTeCxcbiAgICAgICAgICAgICAgY29sb3I6ICcjMDc4ZGVlJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3ZhbHVlID8gdmFsdWUgOiAnLSd9XG4gICAgICAgICAgPC9UeXBvZ3JhcGh5PlxuICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICA8L0dyaWQ+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IFByb3BzV2l0aENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW50ZXJmYWNlIFJlbmRlcklmUHJvcHMge1xyXG4gIHNob3c6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSZW5kZXJJZiA9ICh7XHJcbiAgc2hvdyxcclxuICBjaGlsZHJlbixcclxufTogUHJvcHNXaXRoQ2hpbGRyZW48UmVuZGVySWZQcm9wcz4pID0+IHtcclxuICByZXR1cm4gc2hvdyA/IDw+e2NoaWxkcmVufTwvPiA6IG51bGw7XHJcbn07XHJcbiIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMsIFRoZW1lIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IEJveCwgRGl2aWRlciwgR3JpZCwgU3RhY2ssIFR5cG9ncmFwaHkgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IHR5cGUgeyBQcm9wc1dpdGhDaGlsZHJlbiwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBtZW1vLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuLy8gU2VjdGlvbiBib3ggY29uZmlndXJhdGlvblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlY3Rpb25Cb3hQcm9wcyBleHRlbmRzIFByb3BzV2l0aENoaWxkcmVuIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHNwYWNpbmc/OiBudW1iZXI7XHJcbiAgY29udGFpbmVyU3g/OiBTeFByb3BzPFRoZW1lPjtcclxuICB0aXRsZVN4PzogU3hQcm9wczxUaGVtZT47XHJcbiAgdmFyaWFudD86ICdkZWZhdWx0JyB8ICdmb3JtJyB8ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcic7XHJcbiAgaWNvbj86IFJlYWN0Tm9kZTtcclxuICBhY3Rpb25zPzogUmVhY3ROb2RlO1xyXG4gIGNvbGxhcHNpYmxlPzogYm9vbGVhbjtcclxuICBkZWZhdWx0RXhwYW5kZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vLyBUaGVtZSBjb25maWd1cmF0aW9uIGZvciBzZWN0aW9uIHZhcmlhbnRzXHJcbmNvbnN0IGdldFNlY3Rpb25UaGVtZSA9ICh2YXJpYW50OiBTZWN0aW9uQm94UHJvcHNbJ3ZhcmlhbnQnXSA9ICdkZWZhdWx0JykgPT4ge1xyXG4gIGNvbnN0IHRoZW1lcyA9IHtcclxuICAgIGRlZmF1bHQ6IHtcclxuICAgICAgYmdjb2xvcjogJyNmYWViZDcnLFxyXG4gICAgICBjb2xvcjogJyM5MjVkMjEnLFxyXG4gICAgfSxcclxuICAgIGZvcm06IHtcclxuICAgICAgYmdjb2xvcjogJyNjZGNlZDEnLFxyXG4gICAgICBjb2xvcjogJ2JsYWNrJyxcclxuICAgIH0sXHJcbiAgICBpbmZvOiB7XHJcbiAgICAgIGJnY29sb3I6ICcjZTNmMmZkJyxcclxuICAgICAgY29sb3I6ICcjMTk3NmQyJyxcclxuICAgIH0sXHJcbiAgICB3YXJuaW5nOiB7XHJcbiAgICAgIGJnY29sb3I6ICcjZmZmM2UwJyxcclxuICAgICAgY29sb3I6ICcjZjU3YzAwJyxcclxuICAgIH0sXHJcbiAgICBlcnJvcjoge1xyXG4gICAgICBiZ2NvbG9yOiAnI2ZmZWJlZScsXHJcbiAgICAgIGNvbG9yOiAnI2QzMmYyZicsXHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIHJldHVybiB0aGVtZXNbdmFyaWFudF07XHJcbn07XHJcblxyXG4vLyBNZW1vaXplZCBTZWN0aW9uQm94IGNvbXBvbmVudCBmb3IgcGVyZm9ybWFuY2VcclxuZXhwb3J0IGNvbnN0IFNlY3Rpb25Cb3ggPSBtZW1vPFNlY3Rpb25Cb3hQcm9wcz4oXHJcbiAgKHtcclxuICAgIHRpdGxlLFxyXG4gICAgY2hpbGRyZW4sXHJcbiAgICBzcGFjaW5nID0gMCxcclxuICAgIGNvbnRhaW5lclN4LFxyXG4gICAgdGl0bGVTeCxcclxuICAgIHZhcmlhbnQgPSAnZGVmYXVsdCcsXHJcbiAgICBpY29uLFxyXG4gICAgYWN0aW9ucyxcclxuICB9KSA9PiB7XHJcbiAgICBjb25zdCB0aGVtZUNvbG9ycyA9IHVzZU1lbW8oKCkgPT4gZ2V0U2VjdGlvblRoZW1lKHZhcmlhbnQpLCBbdmFyaWFudF0pO1xyXG5cclxuICAgIGNvbnN0IGhlYWRlclN4ID0gdXNlTWVtbyhcclxuICAgICAgKCkgPT4gKHtcclxuICAgICAgICBweDogMS41LFxyXG4gICAgICAgIHB5OiAwLjEsXHJcbiAgICAgICAgd2lkdGg6ICdmaXQtY29udGVudCcsXHJcbiAgICAgICAgLi4udGhlbWVDb2xvcnMsXHJcbiAgICAgICAgLi4udGl0bGVTeCxcclxuICAgICAgfSksXHJcbiAgICAgIFt0aGVtZUNvbG9ycywgdGl0bGVTeF1cclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgY29udGVudFN4ID0gdXNlTWVtbyhcclxuICAgICAgKCkgPT4gKHtcclxuICAgICAgICBwYWRkaW5nOiAnMTZweCcsXHJcbiAgICAgICAgLi4uY29udGFpbmVyU3gsXHJcbiAgICAgIH0pLFxyXG4gICAgICBbY29udGFpbmVyU3hdXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDw+XHJcbiAgICAgICAgPEJveCBzeD17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCB3aWR0aDogJzEwMCUnIH19PlxyXG4gICAgICAgICAgPFN0YWNrXHJcbiAgICAgICAgICAgIGRpcmVjdGlvbj1cInJvd1wiXHJcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50PVwic3BhY2UtYmV0d2VlblwiXHJcbiAgICAgICAgICAgIGFsaWduSXRlbXM9XCJjZW50ZXJcIlxyXG4gICAgICAgICAgICBzeD17aGVhZGVyU3h9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxTdGFjayBkaXJlY3Rpb249XCJyb3dcIiBhbGlnbkl0ZW1zPVwiY2VudGVyXCIgc3BhY2luZz17MX0+XHJcbiAgICAgICAgICAgICAge2ljb259XHJcbiAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgc3g9e3sgZm9udFNpemU6ICcxNXB4JywgZm9udFdlaWdodDogNDAwIH19PlxyXG4gICAgICAgICAgICAgICAge3RpdGxlfVxyXG4gICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cclxuICAgICAgICAgICAgPC9TdGFjaz5cclxuICAgICAgICAgICAge2FjdGlvbnN9XHJcbiAgICAgICAgICA8L1N0YWNrPlxyXG4gICAgICAgICAgPERpdmlkZXIgLz5cclxuICAgICAgICA8L0JveD5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgc3BhY2luZz17c3BhY2luZ30gc3g9e2NvbnRlbnRTeH0+XHJcbiAgICAgICAgICB7Y2hpbGRyZW59XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICA8Lz5cclxuICAgICk7XHJcbiAgfVxyXG4pO1xyXG4iLCAiaW1wb3J0IHsgVGFiQ29udGV4dCB9IGZyb20gJ0BtdWkvbGFiJztcclxuaW1wb3J0IHR5cGUgeyBTeFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IEJveCwgVGFiLCBUYWJzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB0eXBlIHsgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFiSXRlbSB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogbnVtYmVyO1xyXG4gIHBlcm1pc3Npb24/OiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ3VzdG9tVGFic1Byb3BzIHtcclxuICB0YWJzOiBUYWJJdGVtW107XHJcbiAgZGVmYXVsdFZhbHVlPzogbnVtYmVyO1xyXG4gIG9uVGFiQ2hhbmdlPzogKG5ld1ZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgdGFiU3g/OiBTeFByb3BzO1xyXG4gIHRhYnNTeD86IFN4UHJvcHM7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBTaW1wbGVUYWJzID0gKHtcclxuICB0YWJzLFxyXG4gIGRlZmF1bHRWYWx1ZSA9IDEsXHJcbiAgb25UYWJDaGFuZ2UsXHJcbiAgY2hpbGRyZW4sXHJcbiAgdGFiU3gsXHJcbiAgdGFic1N4LFxyXG59OiBDdXN0b21UYWJzUHJvcHMgJiBQcm9wc1dpdGhDaGlsZHJlbikgPT4ge1xyXG4gIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGU8bnVtYmVyPihkZWZhdWx0VmFsdWUpO1xyXG5cclxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdWYWx1ZTogbnVtYmVyKSA9PiB7XHJcbiAgICBzZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICBpZiAob25UYWJDaGFuZ2UpIG9uVGFiQ2hhbmdlKG5ld1ZhbHVlKTtcclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPFRhYkNvbnRleHQgdmFsdWU9e3ZhbHVlfT5cclxuICAgICAgPEJveCBzeD17eyBib3JkZXJCb3R0b206IDEsIGJvcmRlckNvbG9yOiAnZGl2aWRlcicsIHdpZHRoOiAnMTAwJScgfX0+XHJcbiAgICAgICAgPFRhYnNcclxuICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cclxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XHJcbiAgICAgICAgICBzeD17eyBweDogMiwgcHk6IDAsIC4uLnRhYnNTeCB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt0YWJzLm1hcCh0YWIgPT4gKFxyXG4gICAgICAgICAgICA8VGFiXHJcbiAgICAgICAgICAgICAga2V5PXt0YWIudmFsdWV9XHJcbiAgICAgICAgICAgICAgbGFiZWw9e3RhYi5sYWJlbH1cclxuICAgICAgICAgICAgICB2YWx1ZT17dGFiLnZhbHVlfVxyXG4gICAgICAgICAgICAgIGRpc2FibGVkPXt0YWIucGVybWlzc2lvbiA9PT0gZmFsc2V9XHJcbiAgICAgICAgICAgICAgc3g9e3sgZm9udFNpemU6ICcxcmVtJywgLi4udGFiU3ggfX1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICkpfVxyXG4gICAgICAgIDwvVGFicz5cclxuICAgICAgPC9Cb3g+XHJcblxyXG4gICAgICB7Y2hpbGRyZW59XHJcbiAgICA8L1RhYkNvbnRleHQ+XHJcbiAgKTtcclxufTtcclxuIiwgImltcG9ydCB0eXBlIHsgTG9hZGluZ0J1dHRvblByb3BzIH0gZnJvbSAnQG11aS9sYWInO1xyXG5pbXBvcnQgeyBMb2FkaW5nQnV0dG9uIH0gZnJvbSAnQG11aS9sYWInO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5cclxudHlwZSBTdWJtaXRCdXR0b25Qcm9wcyA9IE9taXQ8XHJcbiAgTG9hZGluZ0J1dHRvblByb3BzLFxyXG4gICdjaGlsZHJlbicgfCAndmFyaWFudCcgfCAnY29sb3InIHwgJ3R5cGUnXHJcbj47XHJcblxyXG5leHBvcnQgY29uc3QgU3VibWl0QnV0dG9uOiBSZWFjdC5GQzxTdWJtaXRCdXR0b25Qcm9wcz4gPSAoe1xyXG4gIGxvYWRpbmcgPSBmYWxzZSxcclxuICAuLi5yZXN0XHJcbn0pID0+IChcclxuICA8TG9hZGluZ0J1dHRvblxyXG4gICAgbG9hZGluZz17bG9hZGluZ31cclxuICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgey4uLnJlc3R9XHJcbiAgICBzeD17eyBmb250V2VpZ2h0OiA0MDAgfX1cclxuICA+XHJcbiAgICBTdWJtaXRcclxuICA8L0xvYWRpbmdCdXR0b24+XHJcbik7XHJcbiIsICJpbXBvcnQgdHlwZSBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFNoYXJlZCB0eXBlc1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YU1vZGFsQnV0dG9ucyB7XHJcbiAgb25TdWJtaXQ/OiAoKSA9PiB2b2lkO1xyXG4gIG9uQ2FuY2VsPzogKCkgPT4gdm9pZDtcclxuICBpc1BlbmRpbmc/OiBib29sZWFuO1xyXG4gIGlzU3VjY2Vzcz86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YU1vZGFsQ29tcG9uZW50UHJvcHM8VERhdGE+IHtcclxuICBkYXRhPzogVERhdGE7XHJcbiAgaXNFZGl0aW5nPzogYm9vbGVhbjtcclxuICByZWY/OiBSZWFjdC5SZWY8RGF0YU1vZGFsQnV0dG9ucz47IC8vIFx1RDgzRFx1REM0OCBwdXQgcmVmIGludG8gcHJvcHNcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBQcm9qZWN0LXNwZWNpZmljIEhPQ1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGF0YU1vZGFsPFREYXRhPihcclxuICBjb21wb25lbnQ6IChcclxuICAgIHByb3BzOiBEYXRhTW9kYWxDb21wb25lbnRQcm9wczxURGF0YT5cclxuICApID0+IFJlYWN0LlJlYWN0RWxlbWVudCB8IG51bGxcclxuKSB7XHJcbiAgcmV0dXJuIGZvcndhcmRSZWY8RGF0YU1vZGFsQnV0dG9ucywgRGF0YU1vZGFsQ29tcG9uZW50UHJvcHM8VERhdGE+PihcclxuICAgIChwcm9wcywgcmVmKSA9PiBjb21wb25lbnQoeyAuLi5wcm9wcywgcmVmIH0pXHJcbiAgKTtcclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBDb25maWdWYWx1ZSB7XHJcbiAgYXBpQmFzZVVybDogc3RyaW5nO1xyXG4gIGRlZmF1bHRQYWdlU2l6ZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQ29uZmlnOiBDb25maWdWYWx1ZSA9IHtcclxuICBkZWZhdWx0UGFnZVNpemU6IDIwLFxyXG4gIGFwaUJhc2VVcmw6ICdodHRwOi8vbG9jYWxob3N0OjUxNDMnLFxyXG4gIC8vIGFwaUJhc2VVcmw6ICdodHRwOi8vMTkyLjE2OC4xLjI0Njo1MTQzJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkYXRlVGltZVBhdHRlcm5zID0ge1xyXG4gIGRhdGVUaW1lOiAnREQgTU1NIFlZWVkgaDptbSBBJywgLy8gMTcgQXByIDIwMjIgMTI6MDAgYW1cclxuICBkYXRlOiAnREQgTU1NIFlZWVknLCAvLyAxNyBBcHIgMjAyMlxyXG4gIG1vbnRoX3llYXJfc2hvcnRfZm9ybWF0OiAnTU1NIFlZWVknLFxyXG4gIG1vbnRoX3llYXJfZnVsbF9mb3JtYXQ6ICdNTU1NIFlZWVknLFxyXG4gIHllYXI6ICdZWVlZJyxcclxuICB0aW1lOiAnaDptbSBhJywgLy8gMTI6MDAgYW1cclxuICBzcGxpdDoge1xyXG4gICAgZGF0ZVRpbWU6ICdERC9NTS9ZWVlZIGg6bW0gQScsIC8vIDE3LzA0LzIwMjIgMTI6MDAgYW1cclxuICAgIGRhdGU6ICdERC9NTS9ZWVlZJywgLy8gMTcvMDQvMjAyMlxyXG4gIH0sXHJcbiAgcGFyYW1DYXNlOiB7XHJcbiAgICBkYXRlVGltZTogJ0RELU1NLVlZWVkgaDptbSBBJywgLy8gMTctMDQtMjAyMiAxMjowMCBhbVxyXG4gICAgZGF0ZTogJ0RELU1NLVlZWVknLCAvLyAxNy0wNC0yMDIyXHJcbiAgICBkYXRlUmV2ZXJzZTogJ1lZWVktTU0tREQnLCAvLyAyMDIyLTA0LTE3IGZvciBjb21wYXJlIGRhdGVcclxuICAgIE1vbnRoWWVhcjogJ01NTS1ZWVlZJyxcclxuICB9LFxyXG59O1xyXG4iLCAiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IGNyZWF0ZUFwaUNsaWVudCB9IGZyb20gJy4uL2FwaS9jcmVhdGVBcGlDbGllbnQnO1xyXG5pbXBvcnQgdHlwZSB7IEFwaUNsaWVudENvbmZpZyB9IGZyb20gJy4uL2FwaS9jcmVhdGVBcGlDbGllbnQnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZUFwaUNsaWVudChjb25maWc6IEFwaUNsaWVudENvbmZpZykge1xyXG4gIHJldHVybiB1c2VNZW1vKFxyXG4gICAgKCkgPT4gY3JlYXRlQXBpQ2xpZW50KGNvbmZpZyksXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgICBbXHJcbiAgICAgIGNvbmZpZy5iYXNlVVJMLFxyXG4gICAgICBjb25maWcudGltZW91dCxcclxuICAgICAgY29uZmlnLmNvcnJlbGF0aW9uSWRQcmVmaXgsXHJcbiAgICAgIGNvbmZpZy5pbmNsdWRlQ29ycmVsYXRpb25JZCxcclxuICAgICAgY29uZmlnLnRva2VuU3RvcmFnZUtleSxcclxuICAgICAgY29uZmlnLmF1dGhUb2tlbixcclxuICAgICAgY29uZmlnLnJlcXVlc3RJbnRlcmNlcHRvcnMsXHJcbiAgICAgIGNvbmZpZy5yZXNwb25zZUludGVyY2VwdG9ycyxcclxuICAgICAgY29uZmlnLmVycm9ySW50ZXJjZXB0b3JzLFxyXG4gICAgXVxyXG4gICk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0BnbndlYnNvZnQvdWknO1xyXG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHR5cGUgeyBVc2VGb3JtU2V0RXJyb3IsIEZpZWxkVmFsdWVzLCBQYXRoIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuaW1wb3J0IHsgdG9hc3QgfSBmcm9tICdzb25uZXInO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBBcGlFcnJvciB9IGZyb20gJy4uL2FwaS90eXBlcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFN1Y2Nlc3NNZXNzYWdlIHtcclxuICBjcmVhdGU6IHN0cmluZztcclxuICB1cGRhdGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1lc3NhZ2Uge1xyXG4gIG5vQ2hhbmdlczogc3RyaW5nO1xyXG4gIGdlbmVyYWw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VGb3JtRXJyb3JIYW5kbGVyT3B0aW9uczxURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcz4ge1xyXG4gIHNldEVycm9yPzogVXNlRm9ybVNldEVycm9yPFRGaWVsZFZhbHVlcz47XHJcbiAgc3VjY2Vzc01lc3NhZ2U/OiBTdWNjZXNzTWVzc2FnZTtcclxuICBlcnJvck1lc3NhZ2U/OiBFcnJvck1lc3NhZ2U7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN1Y2Nlc3NIYW5kbGVyID0gKFxyXG4gIGlzRWRpdGluZzogYm9vbGVhbixcclxuICByb3dzQWZmZWN0ZWQ/OiBudW1iZXJcclxuKSA9PiBib29sZWFuO1xyXG5cclxuZXhwb3J0IHR5cGUgRXJyb3JIYW5kbGVyID0gKHByb2Nlc3NlZEVycm9yOiBBcGlFcnJvcikgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlRm9ybUVycm9ySGFuZGxlclJldHVybiB7XHJcbiAgaGFuZGxlU3VjY2VzczogU3VjY2Vzc0hhbmRsZXI7XHJcbiAgaGFuZGxlRXJyb3I6IEVycm9ySGFuZGxlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VEZWxldGVIYW5kbGVyT3B0aW9ucyB7XHJcbiAgc3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogSG9vayB0byBoYW5kbGUgQVBJIGVycm9ycyBpbiBmb3JtcyB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBoYW5kbGluZyBhbmQgdG9hc3QgbWVzc2FnZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VGb3JtRXJyb3JIYW5kbGVyID0gPFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzPih7XHJcbiAgc2V0RXJyb3IsXHJcbiAgc3VjY2Vzc01lc3NhZ2UgPSB7XHJcbiAgICBjcmVhdGU6ICdDcmVhdGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgICB1cGRhdGU6ICdVcGRhdGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgfSxcclxuICBlcnJvck1lc3NhZ2UgPSB7XHJcbiAgICBub0NoYW5nZXM6ICdObyBjaGFuZ2VzIHdlcmUgbWFkZScsXHJcbiAgICBnZW5lcmFsOiAnRmFpbGVkIHRvIHNhdmUuIFBsZWFzZSB0cnkgYWdhaW4uJyxcclxuICB9LFxyXG59OiBVc2VGb3JtRXJyb3JIYW5kbGVyT3B0aW9uczxURmllbGRWYWx1ZXM+KTogVXNlRm9ybUVycm9ySGFuZGxlclJldHVybiA9PiB7XHJcbiAgY29uc3QgZ2V0RmllbGRFcnJvciA9IHVzZUNhbGxiYWNrKFxyXG4gICAgKFxyXG4gICAgICBmaWVsZHM6IFZhbGlkYXRpb25FcnJvcnMgfCB1bmRlZmluZWQsXHJcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nXHJcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xyXG4gICAgICBpZiAoIWZpZWxkcyB8fCAhZmllbGRzW2ZpZWxkTmFtZV0pIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBjb25zdCBmaWVsZEVycm9yID0gZmllbGRzW2ZpZWxkTmFtZV07XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkRXJyb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkRXJyb3IpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkRXJyb3Iuam9pbignLCAnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gZmllbGRFcnJvcikge1xyXG4gICAgICAgIHJldHVybiBmaWVsZEVycm9yLm1lc3NhZ2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9LFxyXG4gICAgW11cclxuICApO1xyXG5cclxuICBjb25zdCBoYW5kbGVTdWNjZXNzID0gdXNlQ2FsbGJhY2soXHJcbiAgICAoaXNFZGl0aW5nOiBib29sZWFuLCByb3dzQWZmZWN0ZWQ/OiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKHJvd3NBZmZlY3RlZCAhPT0gdW5kZWZpbmVkICYmIHJvd3NBZmZlY3RlZCA+IDApIHtcclxuICAgICAgICB0b2FzdC5zdWNjZXNzKFxyXG4gICAgICAgICAgaXNFZGl0aW5nID8gc3VjY2Vzc01lc3NhZ2UudXBkYXRlIDogc3VjY2Vzc01lc3NhZ2UuY3JlYXRlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAocm93c0FmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgICAgdG9hc3QuZXJyb3IoZXJyb3JNZXNzYWdlLm5vQ2hhbmdlcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSWYgcm93c0FmZmVjdGVkIGlzIHVuZGVmaW5lZCwgYXNzdW1lIHN1Y2Nlc3NcclxuICAgICAgdG9hc3Quc3VjY2Vzcyhpc0VkaXRpbmcgPyBzdWNjZXNzTWVzc2FnZS51cGRhdGUgOiBzdWNjZXNzTWVzc2FnZS5jcmVhdGUpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG4gICAgW3N1Y2Nlc3NNZXNzYWdlLCBlcnJvck1lc3NhZ2VdXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlRXJyb3IgPSB1c2VDYWxsYmFjayhcclxuICAgIChwcm9jZXNzZWRFcnJvcjogQXBpRXJyb3IpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHByb2Nlc3NlZEVycm9yLnR5cGUgPT09ICd2YWxpZGF0aW9uX2Vycm9yJyAmJlxyXG4gICAgICAgIHByb2Nlc3NlZEVycm9yLmVycm9ycyAmJlxyXG4gICAgICAgIHNldEVycm9yXHJcbiAgICAgICkge1xyXG4gICAgICAgIC8vIFNldCBmaWVsZC1zcGVjaWZpYyBlcnJvcnMgdXNpbmcgcmVhY3QtaG9vay1mb3JtJ3Mgc2V0RXJyb3IgKG9ubHkgaWYgc2V0RXJyb3IgaXMgcHJvdmlkZWQpXHJcbiAgICAgICAgT2JqZWN0LmtleXMocHJvY2Vzc2VkRXJyb3IuZXJyb3JzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZEVycm9yID0gZ2V0RmllbGRFcnJvcihwcm9jZXNzZWRFcnJvci5lcnJvcnMsIGZpZWxkTmFtZSk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkRXJyb3IpIHtcclxuICAgICAgICAgICAgc2V0RXJyb3IoZmllbGROYW1lIGFzIFBhdGg8VEZpZWxkVmFsdWVzPiwge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdzZXJ2ZXInLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGZpZWxkRXJyb3IsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBTaG93IGdlbmVyYWwgdmFsaWRhdGlvbiBlcnJvciB0b2FzdFxyXG4gICAgICAgIHRvYXN0LmVycm9yKFxyXG4gICAgICAgICAgcHJvY2Vzc2VkRXJyb3IudGl0bGUgfHwgJ1BsZWFzZSBjaGVjayB0aGUgZm9ybSBmb3IgdmFsaWRhdGlvbiBlcnJvcnMnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBTaG93IGdlbmVyYWwgZXJyb3IgdG9hc3QgZm9yIG5vbi12YWxpZGF0aW9uIGVycm9ycyBvciB3aGVuIHNldEVycm9yIGlzIG5vdCBhdmFpbGFibGVcclxuICAgICAgICB0b2FzdC5lcnJvcihwcm9jZXNzZWRFcnJvci50aXRsZSB8fCBlcnJvck1lc3NhZ2UuZ2VuZXJhbCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBbZXJyb3JNZXNzYWdlLmdlbmVyYWwsIGdldEZpZWxkRXJyb3IsIHNldEVycm9yXVxyXG4gICk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBoYW5kbGVTdWNjZXNzLFxyXG4gICAgaGFuZGxlRXJyb3IsXHJcbiAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW5jZSBob29rIGZvciBkZWxldGUgb3BlcmF0aW9ucyB0aGF0IGRvbid0IG5lZWQgZm9ybSBmaWVsZCB2YWxpZGF0aW9uXHJcbiAqIFVzZXMgdXNlRm9ybUVycm9ySGFuZGxlciBpbnRlcm5hbGx5IGJ1dCB3aXRoIHNpbXBsaWZpZWQgb3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZURlbGV0ZUhhbmRsZXIgPSAoe1xyXG4gIHN1Y2Nlc3NNZXNzYWdlID0gJ0RlbGV0ZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBlcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIGRlbGV0ZS4gUGxlYXNlIHRyeSBhZ2Fpbi4nLFxyXG59OiBVc2VEZWxldGVIYW5kbGVyT3B0aW9ucyA9IHt9KTogVXNlRm9ybUVycm9ySGFuZGxlclJldHVybiA9PiB7XHJcbiAgcmV0dXJuIHVzZUZvcm1FcnJvckhhbmRsZXIoe1xyXG4gICAgc3VjY2Vzc01lc3NhZ2U6IHtcclxuICAgICAgY3JlYXRlOiBzdWNjZXNzTWVzc2FnZSwgLy8gTm90IHVzZWQgZm9yIGRlbGV0ZSwgYnV0IHJlcXVpcmVkIGZvciB0eXBlXHJcbiAgICAgIHVwZGF0ZTogc3VjY2Vzc01lc3NhZ2UsXHJcbiAgICB9LFxyXG4gICAgZXJyb3JNZXNzYWdlOiB7XHJcbiAgICAgIG5vQ2hhbmdlczogJ05vIGNoYW5nZXMgd2VyZSBtYWRlJywgLy8gTm90IHR5cGljYWxseSB1c2VkIGZvciBkZWxldGVcclxuICAgICAgZ2VuZXJhbDogZXJyb3JNZXNzYWdlLFxyXG4gICAgfSxcclxuICAgIC8vIHNldEVycm9yIGlzIG9taXR0ZWQgKHVuZGVmaW5lZCkgZm9yIGRlbGV0ZSBvcGVyYXRpb25zXHJcbiAgfSk7XHJcbn07XHJcbiIsICJpbXBvcnQgdHlwZSB7IFF1ZXJ5Q2xpZW50LCBRdWVyeUtleSB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XHJcbmltcG9ydCB7IHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcclxuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcclxuXHJcbi8vIE1pbmltYWwgdHlwZS1zYWZlIGNhY2hlIHV0aWxpdHkgZm9yIHF1ZXJ5IGtleSBmYWN0b3JpZXNcclxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbGl0eSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBxdWVyeUNsaWVudDogUXVlcnlDbGllbnQpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjYWNoZWQgZGF0YSB1c2luZyBvbmx5IHRoZSBxdWVyeUtleSBmcm9tIHF1ZXJ5IGZhY3RvcnlcclxuICAgKi9cclxuICBnZXRDYWNoZWREYXRhPFQ+KHF1ZXJ5S2V5OiBRdWVyeUtleSk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlcnlDbGllbnQuZ2V0UXVlcnlEYXRhPFQ+KHF1ZXJ5S2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjYWNoZWQgZGF0YSB3aXRoIHRyYW5zZm9ybWF0aW9uIHVzaW5nIHNlbGVjdCBmdW5jdGlvblxyXG4gICAqL1xyXG4gIGdldENhY2hlZERhdGFXaXRoU2VsZWN0PFQsIFI+KFxyXG4gICAgcXVlcnlLZXk6IFF1ZXJ5S2V5LFxyXG4gICAgc2VsZWN0OiAoZGF0YTogVCkgPT4gUlxyXG4gICk6IFIgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMucXVlcnlDbGllbnQuZ2V0UXVlcnlEYXRhPFQ+KHF1ZXJ5S2V5KTtcclxuXHJcbiAgICBpZiAoY2FjaGVkRGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbGVjdChjYWNoZWREYXRhKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWNoZVV0aWxpdHkoKTogQ2FjaGVVdGlsaXR5IHtcclxuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XHJcblxyXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IG5ldyBDYWNoZVV0aWxpdHkocXVlcnlDbGllbnQpLCBbcXVlcnlDbGllbnRdKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUge1xyXG4gIENvbnRyb2wsXHJcbiAgRGVlcFBhcnRpYWxTa2lwQXJyYXlLZXksXHJcbiAgRmllbGRWYWx1ZXMsXHJcbiAgUGF0aCxcclxuICBQYXRoVmFsdWUsXHJcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuaW1wb3J0IHsgdXNlV2F0Y2ggfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5cclxuLyoqXHJcbiAqIENvcmUgd2F0Y2ggZnVuY3Rpb25zIGZvciBSZWFjdCBIb29rIEZvcm1cclxuICogVGhlc2UgYXJlIHRoZSBwcmltYXJ5IGJ1aWxkaW5nIGJsb2NrcyBmb3IgZm9ybSB3YXRjaGluZ1xyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBVdGlsaXR5IHR5cGUgdG8gZW5zdXJlIGFycmF5IGVsZW1lbnRzIGFyZSBhbGwgUGF0aDxUPlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgUGF0aEFycmF5PFQgZXh0ZW5kcyBGaWVsZFZhbHVlcz4gPSBSZWFkb25seUFycmF5PFBhdGg8VD4+O1xyXG5cclxuLyoqXHJcbiAqIEhvb2sgdG8gd2F0Y2ggZW50aXJlIGZvcm0gLSByZXR1cm5zIGFsbCBmb3JtIHZhbHVlc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZVdhdGNoRm9ybSA9IDxURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcz4oXHJcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+XHJcbik6IERlZXBQYXJ0aWFsU2tpcEFycmF5S2V5PFRGaWVsZFZhbHVlcz4gPT4gdXNlV2F0Y2goeyBjb250cm9sIH0pO1xyXG5cclxuLyoqXHJcbiAqIEhvb2sgdG8gd2F0Y2ggc2luZ2xlIGZpZWxkIGJ5IHBhdGggLSBzdXBwb3J0cyBhbnkgbmVzdGVkIHBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaEZpZWxkID0gPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KFxyXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcclxuICBuYW1lOiBUTmFtZVxyXG4pOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xyXG5cclxuLyoqXHJcbiAqIEhvb2sgdG8gd2F0Y2ggbXVsdGlwbGUgZmllbGRzIGJ5IHBhdGhzIC0gcmV0dXJucyBhcnJheSBvZiB2YWx1ZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaEZpZWxkcyA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZXMgZXh0ZW5kcyBSZWFkb25seUFycmF5PFBhdGg8VEZpZWxkVmFsdWVzPj4sXHJcbj4oXHJcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxyXG4gIG5hbWVzOiBUTmFtZXNcclxuKTogQXJyYXk8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWVzW251bWJlcl0+PiA9PlxyXG4gIHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZTogbmFtZXMgfSkgYXMgQXJyYXk8XHJcbiAgICBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZXNbbnVtYmVyXT5cclxuICA+O1xyXG4iLCAiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFZhbHVlcywgUGF0aCwgUGF0aFZhbHVlIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuaW1wb3J0IHsgdXNlV2F0Y2ggfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5cclxuLyoqXHJcbiAqIFV0aWxpdHkgd2F0Y2ggZnVuY3Rpb25zIGZvciBSZWFjdCBIb29rIEZvcm1cclxuICogRW5oYW5jZWQgZnVuY3Rpb25hbGl0eSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFdhdGNoIGZpZWxkIHdpdGggdHJhbnNmb3JtYXRpb24vc2VsZWN0b3JcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaFRyYW5zZm9ybSA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPixcclxuICBUT3V0cHV0LFxyXG4+KFxyXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcclxuICBuYW1lOiBUTmFtZSxcclxuICB0cmFuc2Zvcm06ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3V0cHV0XHJcbik6IFRPdXRwdXQgPT4ge1xyXG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xyXG5cclxuICByZXR1cm4gdXNlTWVtbygoKSA9PiB0cmFuc2Zvcm0odmFsdWUpLCBbdmFsdWUsIHRyYW5zZm9ybV0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFdhdGNoIGZpZWxkIHdpdGggZGVmYXVsdCBmYWxsYmFjayB2YWx1ZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZVdhdGNoRGVmYXVsdCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgbmFtZTogVE5hbWUsXHJcbiAgZGVmYXVsdFZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cclxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHtcclxuICBjb25zdCB2YWx1ZSA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcclxuXHJcbiAgcmV0dXJuIHZhbHVlID8/IGRlZmF1bHRWYWx1ZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBXYXRjaCBmaWVsZCBhcyBib29sZWFuIHdpdGggZ3VhcmFudGVlZCBib29sZWFuIHJldHVyblxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZVdhdGNoQm9vbGVhbiA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgbmFtZTogVE5hbWUsXHJcbiAgZGVmYXVsdFZhbHVlID0gZmFsc2VcclxuKTogYm9vbGVhbiA9PiB7XHJcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XHJcblxyXG4gIHJldHVybiBCb29sZWFuKHZhbHVlID8/IGRlZmF1bHRWYWx1ZSk7XHJcbn07XHJcblxyXG4vKipcclxuICogV2F0Y2ggbXVsdGlwbGUgZmllbGRzIGFuZCByZXR1cm4gYW4gb2JqZWN0IHdpdGggZmllbGQgcGF0aHMgYXMga2V5c1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZVdhdGNoQmF0Y2ggPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXHJcbiAgVEZpZWxkcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8UGF0aDxURmllbGRWYWx1ZXM+PixcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgZmllbGRzOiBURmllbGRzXHJcbik6IHsgW0sgaW4gVEZpZWxkc1tudW1iZXJdXTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgSz4gfSA9PiB7XHJcbiAgY29uc3QgdmFsdWVzID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lOiBmaWVsZHMgfSk7XHJcblxyXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHsgW0sgaW4gVEZpZWxkc1tudW1iZXJdXTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgSz4gfTtcclxuXHJcbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XHJcbiAgICAgIHJlc3VsdFtmaWVsZCBhcyBURmllbGRzW251bWJlcl1dID0gdmFsdWVzW2luZGV4XTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfSwgW3ZhbHVlcywgZmllbGRzXSk7XHJcbn07XHJcblxyXG4vKipcclxuICogV2F0Y2ggZmllbGQgY29uZGl0aW9uYWxseSBiYXNlZCBvbiBib29sZWFuIGZsYWdcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaENvbmRpdGlvbmFsID0gPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KFxyXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcclxuICBuYW1lOiBUTmFtZSxcclxuICBzaG91bGRXYXRjaDogYm9vbGVhbixcclxuICBmYWxsYmFjaz86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxyXG4pOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gfCB1bmRlZmluZWQgPT4ge1xyXG4gIGNvbnN0IGFjdGl2ZVZhbHVlID0gdXNlV2F0Y2goe1xyXG4gICAgY29udHJvbCxcclxuICAgIG5hbWUsXHJcbiAgICBkaXNhYmxlZDogIXNob3VsZFdhdGNoLFxyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gc2hvdWxkV2F0Y2ggPyBhY3RpdmVWYWx1ZSA6IGZhbGxiYWNrO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFdhdGNoIGZpZWxkIHdpdGggZGVib3VuY2VkIHVwZGF0ZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlYm91bmNlZCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgbmFtZTogVE5hbWUsXHJcbiAgZGVsYXkgPSAzMDBcclxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHtcclxuICBjb25zdCB2YWx1ZSA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcclxuICBjb25zdCBbZGVib3VuY2VkVmFsdWUsIHNldERlYm91bmNlZFZhbHVlXSA9XHJcbiAgICB1c2VTdGF0ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+KHZhbHVlKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHNldERlYm91bmNlZFZhbHVlKHZhbHVlKTtcclxuICAgIH0sIGRlbGF5KTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICB9LCBbdmFsdWUsIGRlbGF5XSk7XHJcblxyXG4gIHJldHVybiBkZWJvdW5jZWRWYWx1ZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBXYXRjaCBmaWVsZCB3aXRoIG1lbW9pemVkIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hTZWxlY3RvciA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPixcclxuICBUT3V0cHV0LFxyXG4+KFxyXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcclxuICBuYW1lOiBUTmFtZSxcclxuICBzZWxlY3RvcjogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRPdXRwdXQsXHJcbiAgZGVwczogUmVhY3QuRGVwZW5kZW5jeUxpc3QgPSBbXVxyXG4pOiBUT3V0cHV0ID0+IHtcclxuICBjb25zdCB2YWx1ZSA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcclxuXHJcbiAgcmV0dXJuIHVzZU1lbW8oXHJcbiAgICAoKSA9PiBzZWxlY3Rvcih2YWx1ZSksXHJcbiAgICBbdmFsdWUsIHNlbGVjdG9yLCAuLi5kZXBzXSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gICk7XHJcbn07XHJcbiIsICIvKipcclxuICogRW5oYW5jZWQgVHlwZVNjcmlwdCB1dGlsaXRpZXMgZm9yIFJlYWN0IEhvb2sgRm9ybSdzIHVzZVdhdGNoXHJcbiAqXHJcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YgdHlwZS1zYWZlIHdhdGNoIGZ1bmN0aW9uc1xyXG4gKiB3aXRoIGJldHRlciBlcmdvbm9taWNzIGFuZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW1wb3J0IHsgdXNlV2F0Y2hGaWVsZCwgdXNlV2F0Y2hCb29sZWFuLCB0eXBlZFdhdGNoIH0gZnJvbSAnc3JjL3V0aWxzL3dhdGNoJztcclxuICpcclxuICogLy8gRGlyZWN0IHVzYWdlIChpbnNpZGUgUmVhY3QgY29tcG9uZW50cylcclxuICogY29uc3QgZW1haWwgPSB1c2VXYXRjaEZpZWxkKGNvbnRyb2wsICd1c2VyLmVtYWlsJyk7XHJcbiAqIGNvbnN0IGlzQWRtaW4gPSB1c2VXYXRjaEJvb2xlYW4oY29udHJvbCwgJ3VzZXIuaXNBZG1pbicpO1xyXG4gKlxyXG4gKiAvLyBPYmplY3QtYmFzZWQgdXNhZ2UgKGluc2lkZSBSZWFjdCBjb21wb25lbnRzKVxyXG4gKiBjb25zdCBlbWFpbCA9IHR5cGVkV2F0Y2guZmllbGQoY29udHJvbCwgJ3VzZXIuZW1haWwnKTtcclxuICogY29uc3QgaXNBZG1pbiA9IHR5cGVkV2F0Y2guYm9vbGVhbihjb250cm9sLCAndXNlci5pc0FkbWluJyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuXHJcbi8vIENvcmUgZnVuY3Rpb25zXHJcbmV4cG9ydCB7IHVzZVdhdGNoRmllbGQsIHVzZVdhdGNoRmllbGRzLCB1c2VXYXRjaEZvcm0gfSBmcm9tICcuL2NvcmUnO1xyXG5cclxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcclxuZXhwb3J0IHtcclxuICB1c2VXYXRjaEJhdGNoLFxyXG4gIHVzZVdhdGNoQm9vbGVhbixcclxuICB1c2VXYXRjaENvbmRpdGlvbmFsLFxyXG4gIHVzZVdhdGNoRGVib3VuY2VkLFxyXG4gIHVzZVdhdGNoRGVmYXVsdCxcclxuICB1c2VXYXRjaFNlbGVjdG9yLFxyXG4gIHVzZVdhdGNoVHJhbnNmb3JtLFxyXG59IGZyb20gJy4vdXRpbGl0aWVzJztcclxuXHJcbmV4cG9ydCB0eXBlIHsgUGF0aEFycmF5IH0gZnJvbSAnLi9jb3JlJztcclxuXHJcbi8vIEltcG9ydCBhbGwgZnVuY3Rpb25zIGZvciBkZWZhdWx0IGV4cG9ydFxyXG5pbXBvcnQgeyB1c2VXYXRjaEZpZWxkLCB1c2VXYXRjaEZpZWxkcywgdXNlV2F0Y2hGb3JtIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHtcclxuICB1c2VXYXRjaEJhdGNoLFxyXG4gIHVzZVdhdGNoQm9vbGVhbixcclxuICB1c2VXYXRjaENvbmRpdGlvbmFsLFxyXG4gIHVzZVdhdGNoRGVib3VuY2VkLFxyXG4gIHVzZVdhdGNoRGVmYXVsdCxcclxuICB1c2VXYXRjaFNlbGVjdG9yLFxyXG4gIHVzZVdhdGNoVHJhbnNmb3JtLFxyXG59IGZyb20gJy4vdXRpbGl0aWVzJztcclxuXHJcbi8qKlxyXG4gKiBPcmdhbml6ZWQgdXRpbGl0aWVzIGJ5IHVzZSBjYXNlXHJcbiAqIFByb3ZpZGVzIGEgY29udmVuaWVudCBvYmplY3QtYmFzZWQgQVBJIGZvciBhbGwgd2F0Y2ggZnVuY3Rpb25zXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHlwZWRXYXRjaCA9IHtcclxuICAvLyA9PT0gQ09SRSBGVU5DVElPTlMgPT09XHJcbiAgLyoqIFdhdGNoIGVudGlyZSBmb3JtICovXHJcbiAgZm9ybTogdXNlV2F0Y2hGb3JtLFxyXG4gIC8qKiBXYXRjaCBzaW5nbGUgZmllbGQgKi9cclxuICBmaWVsZDogdXNlV2F0Y2hGaWVsZCxcclxuICAvKiogV2F0Y2ggbXVsdGlwbGUgZmllbGRzICovXHJcbiAgZmllbGRzOiB1c2VXYXRjaEZpZWxkcyxcclxuXHJcbiAgLy8gPT09IFVUSUxJVFkgRlVOQ1RJT05TID09PVxyXG4gIC8qKiBXYXRjaCB3aXRoIHRyYW5zZm9ybWF0aW9uICovXHJcbiAgdHJhbnNmb3JtOiB1c2VXYXRjaFRyYW5zZm9ybSxcclxuICAvKiogV2F0Y2ggd2l0aCBkZWZhdWx0IHZhbHVlICovXHJcbiAgd2l0aERlZmF1bHQ6IHVzZVdhdGNoRGVmYXVsdCxcclxuICAvKiogV2F0Y2ggYXMgYm9vbGVhbiAqL1xyXG4gIGJvb2xlYW46IHVzZVdhdGNoQm9vbGVhbixcclxuICAvKiogV2F0Y2ggbXVsdGlwbGUgd2l0aCBjdXN0b20ga2V5cyAqL1xyXG4gIGJhdGNoOiB1c2VXYXRjaEJhdGNoLFxyXG4gIC8qKiBXYXRjaCBjb25kaXRpb25hbGx5ICovXHJcbiAgY29uZGl0aW9uYWw6IHVzZVdhdGNoQ29uZGl0aW9uYWwsXHJcbiAgLyoqIFdhdGNoIHdpdGggZGVib3VuY2luZyAqL1xyXG4gIGRlYm91bmNlZDogdXNlV2F0Y2hEZWJvdW5jZWQsXHJcbiAgLyoqIFdhdGNoIHdpdGggc2VsZWN0b3IgKi9cclxuICBzZWxlY3RvcjogdXNlV2F0Y2hTZWxlY3RvcixcclxufSBhcyBjb25zdDtcclxuIiwgImV4cG9ydCBjb25zdCBjYWxjdWxhdGVGaWx0ZXJDb3VudCA9IChtb2RlbDogb2JqZWN0KTogbnVtYmVyID0+XHJcbiAgT2JqZWN0LnZhbHVlcyhtb2RlbCkuZmlsdGVyKFxyXG4gICAgdiA9PiB2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZCAmJiBTdHJpbmcodikudHJpbSgpICE9PSAnJ1xyXG4gICkubGVuZ3RoO1xyXG4iLCAiaW1wb3J0IHR5cGUgeyBEYXlqcywgT3BVbml0VHlwZSB9IGZyb20gJ2RheWpzJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IGR1cmF0aW9uIGZyb20gJ2RheWpzL3BsdWdpbi9kdXJhdGlvbic7XHJcbmltcG9ydCByZWxhdGl2ZVRpbWUgZnJvbSAnZGF5anMvcGx1Z2luL3JlbGF0aXZlVGltZSc7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKipcclxuICogQERvY3NcclxuICogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9mb3JtYXRcclxuICovXHJcblxyXG4vKipcclxuICogRGVmYXVsdCB0aW1lem9uZXNcclxuICogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vdGltZXpvbmUvc2V0LWRlZmF1bHQtdGltZXpvbmUjZG9jc05hdlxyXG4gKlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBVVENcclxuICogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGx1Z2luL3V0Y1xyXG4gKiBAaW5zdGFsbFxyXG4gKiBpbXBvcnQgdXRjIGZyb20gJ2RheWpzL3BsdWdpbi91dGMnO1xyXG4gKiBkYXlqcy5leHRlbmQodXRjKTtcclxuICogQHVzYWdlXHJcbiAqIGRheWpzKCkudXRjKCkuZm9ybWF0KClcclxuICpcclxuICovXHJcblxyXG5kYXlqcy5leHRlbmQoZHVyYXRpb24pO1xyXG5kYXlqcy5leHRlbmQocmVsYXRpdmVUaW1lKTtcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCB0eXBlIERhdGVQaWNrZXJGb3JtYXQgPVxyXG4gIHwgRGF5anNcclxuICB8IERhdGVcclxuICB8IHN0cmluZ1xyXG4gIHwgbnVtYmVyXHJcbiAgfCBudWxsXHJcbiAgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgY29uc3QgZm9ybWF0UGF0dGVybnMgPSB7XHJcbiAgZGF0ZVRpbWU6ICdERCBNTU0gWVlZWSBoOm1tIEEnLCAvLyAxNyBBcHIgMjAyMiAxMjowMCBhbVxyXG4gIGRhdGU6ICdERCBNTU0gWVlZWScsIC8vIDE3IEFwciAyMDIyXHJcbiAgbW9udGhfeWVhcl9zaG9ydF9mb3JtYXQ6ICdNTU0gWVlZWScsXHJcbiAgbW9udGhfeWVhcl9mdWxsX2Zvcm1hdDogJ01NTU0gWVlZWScsXHJcbiAgeWVhcjogJ1lZWVknLFxyXG4gIHRpbWU6ICdoOm1tIGEnLCAvLyAxMjowMCBhbVxyXG4gIHNwbGl0OiB7XHJcbiAgICBkYXRlVGltZTogJ0REL01NL1lZWVkgaDptbSBBJywgLy8gMTcvMDQvMjAyMiAxMjowMCBhbVxyXG4gICAgZGF0ZTogJ0REL01NL1lZWVknLCAvLyAxNy8wNC8yMDIyXHJcbiAgfSxcclxuICBwYXJhbUNhc2U6IHtcclxuICAgIGRhdGVUaW1lOiAnREQtTU0tWVlZWSBoOm1tIEEnLCAvLyAxNy0wNC0yMDIyIDEyOjAwIGFtXHJcbiAgICBkYXRlOiAnREQtTU0tWVlZWScsIC8vIDE3LTA0LTIwMjJcclxuICAgIGRhdGVSZXZlcnNlOiAnWVlZWS1NTS1ERCcsIC8vIDIwMjItMDQtMTcgZm9yIGNvbXBhcmUgZGF0ZVxyXG4gICAgTW9udGhZZWFyOiAnTU1NLVlZWVknLFxyXG4gIH0sXHJcbn07XHJcblxyXG5jb25zdCBpc1ZhbGlkRGF0ZSA9IChkYXRlOiBEYXRlUGlja2VyRm9ybWF0KSA9PlxyXG4gIGRhdGUgIT09IG51bGwgJiYgZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGRheWpzKGRhdGUpLmlzVmFsaWQoKTtcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b2RheSh0ZW1wbGF0ZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGRheWpzKG5ldyBEYXRlKCkpLnN0YXJ0T2YoJ2RheScpLmZvcm1hdCh0ZW1wbGF0ZSk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IDE3IEFwciAyMDIyIDEyOjAwIGFtXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZkRhdGVUaW1lKGRhdGU6IERhdGVQaWNrZXJGb3JtYXQsIHRlbXBsYXRlPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAoIWlzVmFsaWREYXRlKGRhdGUpKSB7XHJcbiAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF5anMoZGF0ZSkuZm9ybWF0KHRlbXBsYXRlID8/IGZvcm1hdFBhdHRlcm5zLmRhdGVUaW1lKTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBvdXRwdXQgMTcgQXByIDIwMjJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmRGF0ZShkYXRlOiBEYXRlUGlja2VyRm9ybWF0LCB0ZW1wbGF0ZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKCFpc1ZhbGlkRGF0ZShkYXRlKSkge1xyXG4gICAgcmV0dXJuICdJbnZhbGlkIGRhdGUnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRheWpzKGRhdGUpLmZvcm1hdCh0ZW1wbGF0ZSA/PyBmb3JtYXRQYXR0ZXJucy5kYXRlKTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBvdXRwdXQgMTI6MDAgYW1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmVGltZShkYXRlOiBEYXRlUGlja2VyRm9ybWF0LCB0ZW1wbGF0ZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKCFpc1ZhbGlkRGF0ZShkYXRlKSkge1xyXG4gICAgcmV0dXJuICdJbnZhbGlkIGRhdGUnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRheWpzKGRhdGUpLmZvcm1hdCh0ZW1wbGF0ZSA/PyBmb3JtYXRQYXR0ZXJucy50aW1lKTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBvdXRwdXQgMTcxMzI1MDEwMFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZUaW1lc3RhbXAoZGF0ZTogRGF0ZVBpY2tlckZvcm1hdCk6IG51bWJlciB8ICdJbnZhbGlkIGRhdGUnIHtcclxuICBpZiAoIWlzVmFsaWREYXRlKGRhdGUpKSB7XHJcbiAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF5anMoZGF0ZSkudmFsdWVPZigpO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKipcclxuICogQG91dHB1dCBhIGZldyBzZWNvbmRzLCAyIHllYXJzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZlRvTm93KGRhdGU6IERhdGVQaWNrZXJGb3JtYXQpOiBzdHJpbmcge1xyXG4gIGlmICghaXNWYWxpZERhdGUoZGF0ZSkpIHtcclxuICAgIHJldHVybiAnSW52YWxpZCBkYXRlJztcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXlqcyhkYXRlKS50b05vdyh0cnVlKTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBvdXRwdXQgYm9vbGVhblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZJc0JldHdlZW4oXHJcbiAgaW5wdXREYXRlOiBEYXRlUGlja2VyRm9ybWF0LFxyXG4gIHN0YXJ0RGF0ZTogRGF0ZVBpY2tlckZvcm1hdCxcclxuICBlbmREYXRlOiBEYXRlUGlja2VyRm9ybWF0XHJcbik6IGJvb2xlYW4ge1xyXG4gIGlmIChcclxuICAgICFpc1ZhbGlkRGF0ZShpbnB1dERhdGUpIHx8XHJcbiAgICAhaXNWYWxpZERhdGUoc3RhcnREYXRlKSB8fFxyXG4gICAgIWlzVmFsaWREYXRlKGVuZERhdGUpXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjb25zdCBmb3JtYXR0ZWRJbnB1dERhdGUgPSBmVGltZXN0YW1wKGlucHV0RGF0ZSk7XHJcbiAgY29uc3QgZm9ybWF0dGVkU3RhcnREYXRlID0gZlRpbWVzdGFtcChzdGFydERhdGUpO1xyXG4gIGNvbnN0IGZvcm1hdHRlZEVuZERhdGUgPSBmVGltZXN0YW1wKGVuZERhdGUpO1xyXG5cclxuICBpZiAoXHJcbiAgICBmb3JtYXR0ZWRJbnB1dERhdGUgPT09ICdJbnZhbGlkIGRhdGUnIHx8XHJcbiAgICBmb3JtYXR0ZWRTdGFydERhdGUgPT09ICdJbnZhbGlkIGRhdGUnIHx8XHJcbiAgICBmb3JtYXR0ZWRFbmREYXRlID09PSAnSW52YWxpZCBkYXRlJ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIChcclxuICAgIGZvcm1hdHRlZElucHV0RGF0ZSA+PSBmb3JtYXR0ZWRTdGFydERhdGUgJiZcclxuICAgIGZvcm1hdHRlZElucHV0RGF0ZSA8PSBmb3JtYXR0ZWRFbmREYXRlXHJcbiAgKTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBvdXRwdXQgYm9vbGVhblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZJc0FmdGVyKFxyXG4gIHN0YXJ0RGF0ZTogRGF0ZVBpY2tlckZvcm1hdCxcclxuICBlbmREYXRlOiBEYXRlUGlja2VyRm9ybWF0XHJcbik6IGJvb2xlYW4ge1xyXG4gIGlmICghaXNWYWxpZERhdGUoc3RhcnREYXRlKSB8fCAhaXNWYWxpZERhdGUoZW5kRGF0ZSkpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXlqcyhzdGFydERhdGUpLmlzQWZ0ZXIoZW5kRGF0ZSk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IGJvb2xlYW5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmSXNTYW1lKFxyXG4gIHN0YXJ0RGF0ZTogRGF0ZVBpY2tlckZvcm1hdCxcclxuICBlbmREYXRlOiBEYXRlUGlja2VyRm9ybWF0LFxyXG4gIHVuaXRUb0NvbXBhcmU/OiBPcFVuaXRUeXBlXHJcbik6IGJvb2xlYW4ge1xyXG4gIGlmICghaXNWYWxpZERhdGUoc3RhcnREYXRlKSB8fCAhaXNWYWxpZERhdGUoZW5kRGF0ZSkpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXlqcyhzdGFydERhdGUpLmlzU2FtZShlbmREYXRlLCB1bml0VG9Db21wYXJlID8/ICd5ZWFyJyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0XHJcbiAqIFNhbWUgZGF5OiAyNiBBcHIgMjAyNFxyXG4gKiBTYW1lIG1vbnRoOiAyNSAtIDI2IEFwciAyMDI0XHJcbiAqIFNhbWUgbW9udGg6IDI1IC0gMjYgQXByIDIwMjRcclxuICogU2FtZSB5ZWFyOiAyNSBBcHIgLSAyNiBNYXkgMjAyNFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZEYXRlUmFuZ2VTaG9ydExhYmVsKFxyXG4gIHN0YXJ0RGF0ZTogRGF0ZVBpY2tlckZvcm1hdCxcclxuICBlbmREYXRlOiBEYXRlUGlja2VyRm9ybWF0LFxyXG4gIGluaXRpYWw/OiBib29sZWFuXHJcbik6IHN0cmluZyB7XHJcbiAgaWYgKFxyXG4gICAgIWlzVmFsaWREYXRlKHN0YXJ0RGF0ZSkgfHxcclxuICAgICFpc1ZhbGlkRGF0ZShlbmREYXRlKSB8fFxyXG4gICAgZklzQWZ0ZXIoc3RhcnREYXRlLCBlbmREYXRlKVxyXG4gICkge1xyXG4gICAgcmV0dXJuICdJbnZhbGlkIGRhdGUnO1xyXG4gIH1cclxuXHJcbiAgbGV0IGxhYmVsID0gYCR7ZkRhdGUoc3RhcnREYXRlKX0gLSAke2ZEYXRlKGVuZERhdGUpfWA7XHJcblxyXG4gIGlmIChpbml0aWFsKSB7XHJcbiAgICByZXR1cm4gbGFiZWw7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpc1NhbWVZZWFyID0gZklzU2FtZShzdGFydERhdGUsIGVuZERhdGUsICd5ZWFyJyk7XHJcbiAgY29uc3QgaXNTYW1lTW9udGggPSBmSXNTYW1lKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgJ21vbnRoJyk7XHJcbiAgY29uc3QgaXNTYW1lRGF5ID0gZklzU2FtZShzdGFydERhdGUsIGVuZERhdGUsICdkYXknKTtcclxuXHJcbiAgaWYgKGlzU2FtZVllYXIgJiYgIWlzU2FtZU1vbnRoKSB7XHJcbiAgICBsYWJlbCA9IGAke2ZEYXRlKHN0YXJ0RGF0ZSwgJ0REIE1NTScpfSAtICR7ZkRhdGUoZW5kRGF0ZSl9YDtcclxuICB9IGVsc2UgaWYgKGlzU2FtZVllYXIgJiYgaXNTYW1lTW9udGggJiYgIWlzU2FtZURheSkge1xyXG4gICAgbGFiZWwgPSBgJHtmRGF0ZShzdGFydERhdGUsICdERCcpfSAtICR7ZkRhdGUoZW5kRGF0ZSl9YDtcclxuICB9IGVsc2UgaWYgKGlzU2FtZVllYXIgJiYgaXNTYW1lTW9udGggJiYgaXNTYW1lRGF5KSB7XHJcbiAgICBsYWJlbCA9IGAke2ZEYXRlKGVuZERhdGUpfWA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbGFiZWw7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IDIwMjQtMDUtMjhUMDU6NTU6MzErMDA6MDBcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRHVyYXRpb25Qcm9wcyB7XHJcbiAgeWVhcnM/OiBudW1iZXI7XHJcbiAgbW9udGhzPzogbnVtYmVyO1xyXG4gIGRheXM/OiBudW1iZXI7XHJcbiAgaG91cnM/OiBudW1iZXI7XHJcbiAgbWludXRlcz86IG51bWJlcjtcclxuICBzZWNvbmRzPzogbnVtYmVyO1xyXG4gIG1pbGxpc2Vjb25kcz86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZBZGQoe1xyXG4gIHllYXJzID0gMCxcclxuICBtb250aHMgPSAwLFxyXG4gIGRheXMgPSAwLFxyXG4gIGhvdXJzID0gMCxcclxuICBtaW51dGVzID0gMCxcclxuICBzZWNvbmRzID0gMCxcclxuICBtaWxsaXNlY29uZHMgPSAwLFxyXG59OiBEdXJhdGlvblByb3BzKSB7XHJcbiAgY29uc3QgcmVzdWx0ID0gZGF5anMoKVxyXG4gICAgLmFkZChcclxuICAgICAgZGF5anMuZHVyYXRpb24oe1xyXG4gICAgICAgIHllYXJzLFxyXG4gICAgICAgIG1vbnRocyxcclxuICAgICAgICBkYXlzLFxyXG4gICAgICAgIGhvdXJzLFxyXG4gICAgICAgIG1pbnV0ZXMsXHJcbiAgICAgICAgc2Vjb25kcyxcclxuICAgICAgICBtaWxsaXNlY29uZHMsXHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgICAuZm9ybWF0KCk7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IDIwMjQtMDUtMjhUMDU6NTU6MzErMDA6MDBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmU3ViKHtcclxuICB5ZWFycyA9IDAsXHJcbiAgbW9udGhzID0gMCxcclxuICBkYXlzID0gMCxcclxuICBob3VycyA9IDAsXHJcbiAgbWludXRlcyA9IDAsXHJcbiAgc2Vjb25kcyA9IDAsXHJcbiAgbWlsbGlzZWNvbmRzID0gMCxcclxufTogRHVyYXRpb25Qcm9wcykge1xyXG4gIGNvbnN0IHJlc3VsdCA9IGRheWpzKClcclxuICAgIC5zdWJ0cmFjdChcclxuICAgICAgZGF5anMuZHVyYXRpb24oe1xyXG4gICAgICAgIHllYXJzLFxyXG4gICAgICAgIG1vbnRocyxcclxuICAgICAgICBkYXlzLFxyXG4gICAgICAgIGhvdXJzLFxyXG4gICAgICAgIG1pbnV0ZXMsXHJcbiAgICAgICAgc2Vjb25kcyxcclxuICAgICAgICBtaWxsaXNlY29uZHMsXHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgICAuZm9ybWF0KCk7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgInR5cGUgRW1wdHlWYWx1ZTxUPiA9IFQgZXh0ZW5kcyBudW1iZXJcclxuICA/IDBcclxuICA6IFQgZXh0ZW5kcyBzdHJpbmdcclxuICAgID8gbnVsbFxyXG4gICAgOiBUIGV4dGVuZHMgYm9vbGVhblxyXG4gICAgICA/IG51bGxcclxuICAgICAgOiBUIGV4dGVuZHMgRGF0ZVxyXG4gICAgICAgID8gbnVsbFxyXG4gICAgICAgIDogVCBleHRlbmRzIG9iamVjdFxyXG4gICAgICAgICAgPyBudWxsXHJcbiAgICAgICAgICA6IG51bGw7XHJcblxyXG50eXBlIEVtcHR5T2JqZWN0PFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xyXG4gIFtLIGluIGtleW9mIFRdOiBFbXB0eVZhbHVlPFRbS10+O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVtcHR5T2JqZWN0PFQgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gIGRhdGE6IFQsXHJcbiAgZGVmYXVsdFZhbHVlczogUGFydGlhbDxUPiA9IHt9XHJcbik6IEVtcHR5T2JqZWN0PFQ+ICYgUGFydGlhbDxUPiB7XHJcbiAgY29uc3Qgb2JqID0ge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGRhdGEpIGFzIEFycmF5PGtleW9mIFQ+KSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcclxuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XHJcblxyXG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIG9ialtrZXkgYXMgc3RyaW5nXSA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICBvYmpba2V5IGFzIHN0cmluZ10gPSBudWxsO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgb2JqW2tleSBhcyBzdHJpbmddID0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9ialtrZXkgYXMgc3RyaW5nXSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyAuLi5vYmosIC4uLmRlZmF1bHRWYWx1ZXMgfSBhcyBFbXB0eU9iamVjdDxUPiAmIFBhcnRpYWw8VD47XHJcbn1cclxuIiwgImltcG9ydCB7IHVzZVJlZiwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcclxuXHJcbi8qKlxyXG4gKiBIb29rIHRvIG1haW50YWluIHN0YWJsZSByb3cgY291bnQgZm9yIGRhdGEgZ3JpZHMgZHVyaW5nIGxvYWRpbmcgc3RhdGVzLlxyXG4gKiBQcmV2ZW50cyBwYWdpbmF0aW9uIGp1bXBpbmcgYnkgcHJlc2VydmluZyB0aGUgbGFzdCBrbm93biB0b3RhbCBjb3VudC5cclxuICpcclxuICogQHBhcmFtIGN1cnJlbnRUb3RhbCAtIEN1cnJlbnQgdG90YWwgZnJvbSBBUEkgcmVzcG9uc2VcclxuICogQHJldHVybnMgU3RhYmxlIHJvdyBjb3VudCB0aGF0IHBlcnNpc3RzIGR1cmluZyBsb2FkaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlU3RhYmxlUm93Q291bnQoY3VycmVudFRvdGFsOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG4gIGNvbnN0IHJvd0NvdW50UmVmID0gdXNlUmVmKGN1cnJlbnRUb3RhbCB8fCAwKTtcclxuXHJcbiAgY29uc3Qgc3RhYmxlUm93Q291bnQgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgIGlmIChjdXJyZW50VG90YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByb3dDb3VudFJlZi5jdXJyZW50ID0gY3VycmVudFRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByb3dDb3VudFJlZi5jdXJyZW50O1xyXG4gIH0sIFtjdXJyZW50VG90YWxdKTtcclxuXHJcbiAgcmV0dXJuIHN0YWJsZVJvd0NvdW50O1xyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUF3QkEsU0FBUyxlQUF1QjtBQUM5QixNQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sWUFBWTtBQUN0RCxXQUFPLE9BQU8sV0FBVztBQUFBLEVBQzNCO0FBR0EsU0FBTyx1Q0FBdUMsUUFBUSxTQUFTLE9BQUs7QUFDbEUsVUFBTSxJQUFLLEtBQUssT0FBTyxJQUFJLEtBQU07QUFDakMsVUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFLLElBQUksSUFBTztBQUV0QyxXQUFPLEVBQUUsU0FBUyxFQUFFO0FBQUEsRUFDdEIsQ0FBQztBQUNIO0FBNENPLFNBQVMsc0JBQXNCLFFBQXlCO0FBQzdELFFBQU0sT0FBTyxhQUFhO0FBRTFCLFNBQU8sU0FBUyxHQUFHLE1BQU0sSUFBSSxJQUFJLEtBQUs7QUFDeEM7OztBQ2pFTyxJQUFNLGtCQUFOLE1BQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBcUIzQixhQUFhLFFBQThCO0FBQ3pDLFFBQUksVUFBVSxPQUFPLFNBQVMsS0FBSztBQUNqQyxhQUFPLFdBQVcsTUFBTSxxQkFBcUI7QUFBQSxJQUMvQyxXQUFXLFVBQVUsS0FBSztBQUN4QixhQUFPO0FBQUEsSUFDVDtBQUVBLFdB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LE1BQ2I7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNILEVBQ0MsT0FBTztBQUVWLFNBQU87QUFDVDs7O0FDelNPLFNBQVMsZUFDZCxNQUNBLGdCQUE0QixDQUFDLEdBQ0E7QUFDN0IsUUFBTSxNQUFNLENBQUM7QUFFYixhQUFXLE9BQU8sT0FBTyxLQUFLLElBQUksR0FBcUI7QUFDckQsVUFBTSxRQUFRLEtBQUssR0FBRztBQUN0QixVQUFNLE9BQU8sT0FBTztBQUVwQixRQUFJLFNBQVMsVUFBVTtBQUNyQixVQUFJLEdBQWEsSUFBSTtBQUFBLElBQ3ZCLFdBQVcsU0FBUyxZQUFZLFNBQVMsV0FBVztBQUNsRCxVQUFJLEdBQWEsSUFBSTtBQUFBLElBQ3ZCLFdBQVcsaUJBQWlCLE1BQU07QUFDaEMsVUFBSSxHQUFhLElBQUk7QUFBQSxJQUN2QixPQUFPO0FBQ0wsVUFBSSxHQUFhLElBQUk7QUFBQSxJQUN2QjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLEVBQUUsR0FBRyxLQUFLLEdBQUcsY0FBYztBQUNwQzs7O0FDdENBLFNBQVMsUUFBUSxXQUFBRyxnQkFBZTtBQVN6QixTQUFTLGtCQUFrQixjQUEwQztBQUMxRSxRQUFNLGNBQWMsT0FBTyxnQkFBZ0IsQ0FBQztBQUU1QyxRQUFNLGlCQUFpQkEsU0FBUSxNQUFNO0FBQ25DLFFBQUksaUJBQWlCLFFBQVc7QUFDOUIsa0JBQVksVUFBVTtBQUFBLElBQ3hCO0FBRUEsV0FBTyxZQUFZO0FBQUEsRUFDckIsR0FBRyxDQUFDLFlBQVksQ0FBQztBQUVqQixTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImNvbmZpZyIsICJqc3giLCAiQnV0dG9uIiwgImpzeCIsICJqc3giLCAianN4IiwgImpzeCIsICJtZW1vIiwgImpzeCIsICJtZW1vIiwgIkJveCIsICJDYXJkIiwgIkNhcmRDb250ZW50IiwgIlR5cG9ncmFwaHkiLCAiRnJhZ21lbnQiLCAianN4IiwgImpzeHMiLCAiQm94IiwgIlR5cG9ncmFwaHkiLCAianN4IiwgIkdyaWQiLCAiVHlwb2dyYXBoeSIsICJqc3giLCAianN4cyIsICJGcmFnbWVudCIsICJqc3giLCAiQm94IiwgIkRpdmlkZXIiLCAiR3JpZCIsICJUeXBvZ3JhcGh5IiwgIm1lbW8iLCAidXNlTWVtbyIsICJGcmFnbWVudCIsICJqc3giLCAianN4cyIsICJCb3giLCAianN4IiwgImpzeHMiLCAiTG9hZGluZ0J1dHRvbiIsICJqc3giLCAidXNlTWVtbyIsICJ1c2VNZW1vIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VTdGF0ZSIsICJ1c2VXYXRjaCIsICJ1c2VNZW1vIl0KfQo=
2519
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvYXBpL0NvcnJlbGF0aW9uSWRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL2NvcmUvYXBpL0Vycm9ycy9FcnJvck5vcm1hbGl6ZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL0ludGVyY2VwdG9ycy9JbnRlcmNlcHRvck1hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL1JlcXVlc3RNYW5hZ2VyLnRzIiwgIi4uL3NyYy9jb3JlL2FwaS9SZXRyeS9SZXRyeUhhbmRsZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL1NpZ25hbHMvU2lnbmFsTWFuYWdlci50cyIsICIuLi9zcmMvY29yZS9hcGkvVXRpbHMvUmVzcG9uc2VQYXJzZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL1V0aWxzL1VybEJ1aWxkZXIudHMiLCAiLi4vc3JjL2NvcmUvYXBpL0FwaUNsaWVudC50cyIsICIuLi9zcmMvY29yZS9hcGkvY3JlYXRlQXBpQ2xpZW50LnRzIiwgIi4uL3NyYy9jb3JlL2FwaS90eXBlcy9DYW5jZWxUb2tlbi50cyIsICIuLi9zcmMvY29yZS9hcGkvdXNlVmFsaWRhdGlvbkVycm9ycy50cyIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0F1dGhvcml6ZWRWaWV3L0F1dGhvcml6ZWRWaWV3LnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0NhbmNlbEJ1dHRvbi9DYW5jZWxCdXR0b24udHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvQ2xlYXJCdXR0b24vQ2xlYXJCdXR0b24udHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvQ29udGFpbmVycy9TaW1wbGVDb250YWluZXIudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvRmlsdGVyQnV0dG9uL0ZpbHRlckJ1dHRvbi50c3giLCAiLi4vc3JjL2NvcmUvY29tcG9uZW50cy9GaWx0ZXJEaXNwbGF5L0ZpbHRlckNoaXAudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvRmlsdGVyRGlzcGxheS9GaWx0ZXJEaXNwbGF5LnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0ZpbHRlcldyYXBwZXIvRmlsdGVyV3JhcHBlci50c3giLCAiLi4vc3JjL2NvcmUvY29tcG9uZW50cy9Gb290ZXIvRm9vdGVyLnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0xhYmVsVGV4dC9MYWJlbFRleHQudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvUmVuZGVySWYvUmVuZGVySWYudHN4IiwgIi4uL3NyYy9jb3JlL2NvbXBvbmVudHMvU2VjdGlvbkJveC9TZWN0aW9uQm94LnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL1NpbXBsZVRhYnMvU2ltcGxlVGFicy50c3giLCAiLi4vc3JjL2NvcmUvY29tcG9uZW50cy9TdWJtaXRCdXR0b24vU3VibWl0QnV0dG9uLnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL1dpdGhSZWYvV2l0aFJlZi50c3giLCAiLi4vc3JjL2NvcmUvY29uZmlnLnRzIiwgIi4uL3NyYy9jb3JlL2hvb2tzL3VzZUFwaUNsaWVudC50cyIsICIuLi9zcmMvY29yZS9ob29rcy91c2VGb3JtRXJyb3JIYW5kbGVyLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL0NhY2hlVXRpbGl0eS9pbmRleC50cyIsICIuLi9zcmMvY29yZS91dGlscy93YXRjaC9jb3JlLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL3dhdGNoL3V0aWxpdGllcy50cyIsICIuLi9zcmMvY29yZS91dGlscy93YXRjaC9pbmRleC50cyIsICIuLi9zcmMvY29yZS91dGlscy9jYWxjdWxhdGVGaWx0ZXJDb3VudC50cyIsICIuLi9zcmMvY29yZS91dGlscy9mb3JtYXQtdGltZS50cyIsICIuLi9zcmMvY29yZS91dGlscy9nZXRFbXB0eU9iamVjdC50cyIsICIuLi9zcmMvY29yZS91dGlscy91c2VTdGFibGVSb3dDb3VudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFV0aWxpdGllcyBmb3IgZ2VuZXJhdGluZyBjb3JyZWxhdGlvbiBJRHMgZm9yIGRpc3RyaWJ1dGVkIHJlcXVlc3QgdHJhY2luZy5cbiAqXG4gKiBDb3JyZWxhdGlvbiBJRHMgYXJlIHVuaXF1ZSBpZGVudGlmaWVycyBhdHRhY2hlZCB0byBlYWNoIEFQSSByZXF1ZXN0IHRvIGVuYWJsZVxuICogdHJhY2tpbmcgYW5kIGRlYnVnZ2luZyBhY3Jvc3MgZGlzdHJpYnV0ZWQgc3lzdGVtcywgbWljcm9zZXJ2aWNlcywgYW5kIGxvZyBhZ2dyZWdhdGlvbi5cbiAqXG4gKiBAbW9kdWxlIENvcnJlbGF0aW9uSWRHZW5lcmF0b3JcbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbSBVVUlEIHY0IHN0cmluZy5cbiAqXG4gKiBQcmVmZXJzIG5hdGl2ZSBgY3J5cHRvLnJhbmRvbVVVSUQoKWAgd2hlbiBhdmFpbGFibGUgKG1vZGVybiBicm93c2VycyBhbmQgTm9kZS5qcyAxOSspLFxuICogZmFsbGluZyBiYWNrIHRvIGEgY29tcGxpYW50IFVVSUQgdjQgaW1wbGVtZW50YXRpb24gdXNpbmcgYE1hdGgucmFuZG9tKClgLlxuICpcbiAqIEBpbnRlcm5hbCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBwdWJsaWMgQVBJXG4gKiBAcmV0dXJucyBBIFVVSUQgdjQgc3RyaW5nIGluIHRoZSBmb3JtYXQgYHh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuICogLy8gPT4gXCJhMWIyYzNkNC1lNWY2LTQ3ODktYTAxMi1iM2M0ZDVlNmY3YThcIlxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIFVVSUQgdjQgZ2VuZXJhdG9yXG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGMgPT4ge1xuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG5cbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbiBJRCBmb3IgQVBJIHJlcXVlc3QgdHJhY2tpbmcgYW5kIGRpc3RyaWJ1dGVkIHRyYWNpbmcuXG4gKlxuICogQ29ycmVsYXRpb24gSURzIGhlbHAgdHJhY2sgcmVxdWVzdHMgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2VzIGFuZCBzeXN0ZW1zLiBUaGV5IGFyZVxuICogYXV0b21hdGljYWxseSBhdHRhY2hlZCB0byBvdXRnb2luZyByZXF1ZXN0cyB2aWEgSFRUUCBoZWFkZXJzIChgWC1Db3JyZWxhdGlvbi1JZGAgYW5kXG4gKiBgWC1SZXF1ZXN0LUlkYCkgYW5kIGNhbiBiZSB1c2VkIHRvOlxuICogLSBDb3JyZWxhdGUgbG9ncyBhY3Jvc3MgZGlzdHJpYnV0ZWQgc3lzdGVtc1xuICogLSBUcmFjayByZXF1ZXN0IGZsb3dzIGluIG1pY3Jvc2VydmljZXMgYXJjaGl0ZWN0dXJlc1xuICogLSBEZWJ1ZyBpc3N1ZXMgYnkgdHJhY2luZyBhIHNwZWNpZmljIHJlcXVlc3QncyBqb3VybmV5XG4gKiAtIE1vbml0b3IgcGVyZm9ybWFuY2UgYWNyb3NzIHNlcnZpY2UgYm91bmRhcmllc1xuICpcbiAqIFRoZSBnZW5lcmF0ZWQgSUQgZm9sbG93cyB0aGUgZm9ybWF0OiBge3ByZWZpeH0te3V1aWR9YCBvciBqdXN0IGB7dXVpZH1gIGlmIG5vIHByZWZpeCBpcyBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gT3B0aW9uYWwgcHJlZml4IHRvIG5hbWVzcGFjZSBjb3JyZWxhdGlvbiBJRHMgYnkgY29udGV4dCAoZS5nLiwgJ2FwaScsICd3ZWInLCAnbW9iaWxlJylcbiAqIEByZXR1cm5zIEEgY29ycmVsYXRpb24gSUQgc3RyaW5nLCBvcHRpb25hbGx5IHByZWZpeGVkXG4gKiBAcHVibGljXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaWQgPSBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQoKTtcbiAqIC8vID0+IFwiYTFiMmMzZDQtZTVmNi00Nzg5LWEwMTItYjNjNGQ1ZTZmN2E4XCJcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHByZWZpeCBmb3IgY29udGV4dCBpZGVudGlmaWNhdGlvbjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHdlYklkID0gZ2VuZXJhdGVDb3JyZWxhdGlvbklkKCd3ZWInKTtcbiAqIC8vID0+IFwid2ViLWExYjJjM2Q0LWU1ZjYtNDc4OS1hMDEyLWIzYzRkNWU2ZjdhOFwiXG4gKlxuICogY29uc3QgYXBpSWQgPSBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQoJ2FwaScpO1xuICogLy8gPT4gXCJhcGktZjFlMmQzYzQtYjVhNi00OTg3LWEwMTItYjNjNGQ1ZTZmN2E4XCJcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDb25maWd1cmluZyBpbiBBcGlDbGllbnQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KCdodHRwczovL2FwaS5leGFtcGxlLmNvbScpO1xuICogY2xpZW50LnNldENvcnJlbGF0aW9uSWRQcmVmaXgoJ21vYmlsZScpO1xuICogLy8gQWxsIHJlcXVlc3RzIHdpbGwgaGF2ZSBjb3JyZWxhdGlvbiBJRHMgbGlrZSBcIm1vYmlsZS17dXVpZH1cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQocHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xuXG4gIHJldHVybiBwcmVmaXggPyBgJHtwcmVmaXh9LSR7dXVpZH1gIDogdXVpZDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVycm9yLCBBcGlFcnJvclR5cGUgfSBmcm9tICcuLi90eXBlcy9BcGlFcnJvcic7XHJcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbmZpZyB9IGZyb20gJy4uL3R5cGVzL1JlcXVlc3RDb25maWcnO1xyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZXMgdmFyaW91cyBlcnJvciB0eXBlcyBpbnRvIGEgY29uc2lzdGVudCwgc3RydWN0dXJlZCBBcGlFcnJvciBmb3JtYXQuXHJcbiAqXHJcbiAqIFRoaXMgaW50ZXJuYWwgY2xhc3MgaGFuZGxlcyB0aGUgY29tcGxleCB0YXNrIG9mIGNvbnZlcnRpbmcgYW55IHR5cGUgb2YgZXJyb3JcclxuICogKG5ldHdvcmsgZXJyb3JzLCBIVFRQIGVycm9ycywgYWJvcnQgZXJyb3JzLCB0aW1lb3V0cywgZXRjLikgaW50byBhIHN0YW5kYXJkaXplZFxyXG4gKiB7QGxpbmsgQXBpRXJyb3J9IHN0cnVjdHVyZSB3aXRoIHByb3BlciBjYXRlZ29yaXphdGlvbiBhbmQgbWV0YWRhdGEuXHJcbiAqXHJcbiAqIEtleSBGZWF0dXJlczpcclxuICogLSAqKkVycm9yIENhdGVnb3JpemF0aW9uKio6IENsYXNzaWZpZXMgZXJyb3JzIGJ5IHR5cGUgKHZhbGlkYXRpb24sIGNsaWVudCwgc2VydmVyLCBuZXR3b3JrLCBldGMuKVxyXG4gKiAtICoqSFRUUCBTdGF0dXMgTWFwcGluZyoqOiBDb252ZXJ0cyBzdGF0dXMgY29kZXMgdG8gaHVtYW4tcmVhZGFibGUgdGl0bGVzXHJcbiAqIC0gKipDb3JyZWxhdGlvbiBJRCBUcmFja2luZyoqOiBQcmVzZXJ2ZXMgb3IgaW5qZWN0cyBjb3JyZWxhdGlvbiBJRHMgZm9yIHRyYWNpbmdcclxuICogLSAqKkFib3J0IERldGVjdGlvbioqOiBJZGVudGlmaWVzIGFuZCBwcm9wZXJseSBoYW5kbGVzIHJlcXVlc3QgY2FuY2VsbGF0aW9uc1xyXG4gKiAtICoqQ29uc2lzdGVudCBTdHJ1Y3R1cmUqKjogRW5zdXJlcyBhbGwgZXJyb3JzIGNvbmZvcm0gdG8gdGhlIEFwaUVycm9yIGludGVyZmFjZVxyXG4gKlxyXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEVycm9yTm9ybWFsaXplciB7XHJcbiAgLyoqXHJcbiAgICogTWFwcyBhbiBIVFRQIHN0YXR1cyBjb2RlIHRvIGEgc3RhbmRhcmRpemVkIGVycm9yIHR5cGUgY2F0ZWdvcnkuXHJcbiAgICpcclxuICAgKiBUaGlzIGNhdGVnb3JpemF0aW9uIGhlbHBzIGNvbnN1bWVycyBoYW5kbGUgZGlmZmVyZW50IGVycm9yIGNsYXNzZXMgYXBwcm9wcmlhdGVseTpcclxuICAgKiAtIGB2YWxpZGF0aW9uX2Vycm9yYCAoNDAwKTogQ2xpZW50IHNlbnQgaW52YWxpZCBkYXRhXHJcbiAgICogLSBgY2xpZW50X2Vycm9yYCAoNDAxLTQ5OSk6IENsaWVudC1zaWRlIGlzc3VlcyAoYXV0aCwgcGVybWlzc2lvbnMsIG5vdCBmb3VuZCwgZXRjLilcclxuICAgKiAtIGBzZXJ2ZXJfZXJyb3JgICg1MDAtNTk5KTogU2VydmVyLXNpZGUgZmFpbHVyZXNcclxuICAgKiAtIGB1bmtub3duX2Vycm9yYDogVW5yZWNvZ25pemVkIHN0YXR1cyBjb2Rlc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXR1cyAtIEhUVFAgc3RhdHVzIGNvZGUgZnJvbSB0aGUgcmVzcG9uc2VcclxuICAgKiBAcmV0dXJucyBUaGUgZXJyb3IgdHlwZSBjYXRlZ29yeSBhcyBhIHN0cmluZ1xyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogbm9ybWFsaXplci5nZXRFcnJvclR5cGUoNDAwKTsgLy8gPT4gJ3ZhbGlkYXRpb25fZXJyb3InXHJcbiAgICogbm9ybWFsaXplci5nZXRFcnJvclR5cGUoNDA0KTsgLy8gPT4gJ2NsaWVudF9lcnJvcidcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVHlwZSg1MDApOyAvLyA9PiAnc2VydmVyX2Vycm9yJ1xyXG4gICAqIG5vcm1hbGl6ZXIuZ2V0RXJyb3JUeXBlKDApOyAgIC8vID0+ICd1bmtub3duX2Vycm9yJ1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGdldEVycm9yVHlwZShzdGF0dXM6IG51bWJlcik6IEFwaUVycm9yVHlwZSB7XHJcbiAgICBpZiAoc3RhdHVzID49IDQwMCAmJiBzdGF0dXMgPCA1MDApIHtcclxuICAgICAgcmV0dXJuIHN0YXR1cyA9PT0gNDAwID8gJ3ZhbGlkYXRpb25fZXJyb3InIDogJ2NsaWVudF9lcnJvcic7XHJcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA1MDApIHtcclxuICAgICAgcmV0dXJuICdzZXJ2ZXJfZXJyb3InO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAndW5rbm93bl9lcnJvcic7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXBzIGFuIEhUVFAgc3RhdHVzIGNvZGUgdG8gYSBodW1hbi1yZWFkYWJsZSBlcnJvciB0aXRsZS5cclxuICAgKlxyXG4gICAqIFByb3ZpZGVzIHVzZXItZnJpZW5kbHkgZXJyb3IgbWVzc2FnZXMgZm9yIGNvbW1vbiBIVFRQIHN0YXR1cyBjb2Rlcy5cclxuICAgKiBGYWxscyBiYWNrIHRvIGEgZ2VuZXJpYyBcIkhUVFAgRXJyb3Ige3N0YXR1c31cIiBmb3JtYXQgZm9yIHVubWFwcGVkIGNvZGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHN0YXR1cyAtIEhUVFAgc3RhdHVzIGNvZGUgZnJvbSB0aGUgcmVzcG9uc2VcclxuICAgKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIHRpdGxlXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVGl0bGUoNDA0KTsgLy8gPT4gJ05vdCBGb3VuZCdcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVGl0bGUoNTAwKTsgLy8gPT4gJ0ludGVybmFsIFNlcnZlciBFcnJvcidcclxuICAgKiBub3JtYWxpemVyLmdldEVycm9yVGl0bGUoOTk5KTsgLy8gPT4gJ0hUVFAgRXJyb3IgOTk5J1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGdldEVycm9yVGl0bGUoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGl0bGVzOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xyXG4gICAgICA0MDA6ICdCYWQgUmVxdWVzdCcsXHJcbiAgICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXHJcbiAgICAgIDQwMzogJ0ZvcmJpZGRlbicsXHJcbiAgICAgIDQwNDogJ05vdCBGb3VuZCcsXHJcbiAgICAgIDQwNTogJ01ldGhvZCBOb3QgQWxsb3dlZCcsXHJcbiAgICAgIDQwODogJ1JlcXVlc3QgVGltZW91dCcsXHJcbiAgICAgIDQwOTogJ0NvbmZsaWN0JyxcclxuICAgICAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLFxyXG4gICAgICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsXHJcbiAgICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXHJcbiAgICAgIDUwMjogJ0JhZCBHYXRld2F5JyxcclxuICAgICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXHJcbiAgICAgIDUwNDogJ0dhdGV3YXkgVGltZW91dCcsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aXRsZXNbc3RhdHVzXSB8fCBgSFRUUCBFcnJvciAke3N0YXR1c31gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm9ybWFsaXplcyBhbnkgZXJyb3IgaW50byBhIGNvbnNpc3RlbnQsIHN0cnVjdHVyZWQgQXBpRXJyb3IgZm9ybWF0LlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyB2YXJpb3VzIGVycm9yIHNjZW5hcmlvcyBhbmQgZW5zdXJlcyB0aGV5IGFsbCBjb25mb3JtIHRvXHJcbiAgICogdGhlIHtAbGluayBBcGlFcnJvcn0gaW50ZXJmYWNlIHdpdGggYXBwcm9wcmlhdGUgY2F0ZWdvcml6YXRpb24gYW5kIG1ldGFkYXRhOlxyXG4gICAqXHJcbiAgICogLSAqKkV4aXN0aW5nIEFwaUVycm9ycyoqOiBFbmhhbmNlcyB3aXRoIG1pc3NpbmcgZmllbGRzICh0cmFjZUlkLCBjb25maWcpXHJcbiAgICogLSAqKkFib3J0RXJyb3JzKio6IE1hcmtzIGFzIGByZXF1ZXN0X2NhbmNlbGxlZGAgd2l0aCBpc0Fib3J0ZWQgZmxhZ1xyXG4gICAqIC0gKipUaW1lb3V0IEVycm9ycyoqOiBDYXRlZ29yaXplcyBhcyBgdGltZW91dF9lcnJvcmAgd2l0aCA0MDggc3RhdHVzXHJcbiAgICogLSAqKk5ldHdvcmsgRXJyb3JzKio6IENhdGVnb3JpemVzIGFzIGBuZXR3b3JrX2Vycm9yYCB3aXRoIDAgc3RhdHVzXHJcbiAgICogLSAqKlVua25vd24gRXJyb3JzKio6IEZhbGxiYWNrIGNhdGVnb3J5IGZvciB1bmV4cGVjdGVkIGVycm9yIHR5cGVzXHJcbiAgICpcclxuICAgKiBBbGwgbm9ybWFsaXplZCBlcnJvcnMgaW5jbHVkZTpcclxuICAgKiAtIGB0eXBlYDogRXJyb3IgY2F0ZWdvcnkgZm9yIHByb2dyYW1tYXRpYyBoYW5kbGluZ1xyXG4gICAqIC0gYHRpdGxlYDogSHVtYW4tcmVhZGFibGUgZXJyb3IgdGl0bGVcclxuICAgKiAtIGBzdGF0dXNgOiBIVFRQIHN0YXR1cyBjb2RlIChvciAwIGZvciBub24tSFRUUCBlcnJvcnMpXHJcbiAgICogLSBgdHJhY2VJZGA6IENvcnJlbGF0aW9uIElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nXHJcbiAgICogLSBgaXNBYm9ydGVkYDogQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgcmVxdWVzdCB3YXMgY2FuY2VsbGVkXHJcbiAgICogLSBgY29uZmlnYDogT3JpZ2luYWwgcmVxdWVzdCBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmdcclxuICAgKlxyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBub3JtYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIHJlcXVlc3QgY29uZmlndXJhdGlvbiB0aGF0IGxlZCB0byB0aGlzIGVycm9yXHJcbiAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQgLSBPcHRpb25hbCBjb3JyZWxhdGlvbiBJRCBmb3IgdHJhY2luZ1xyXG4gICAqIEByZXR1cm5zIEEgZnVsbHkgc3RydWN0dXJlZCBBcGlFcnJvciBpbnN0YW5jZVxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBOb3JtYWxpemluZyBhIGZldGNoIEFib3J0RXJyb3I6XHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIHRyeSB7XHJcbiAgICogICBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsIH0pO1xyXG4gICAqIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICogICBjb25zdCBhcGlFcnJvciA9IG5vcm1hbGl6ZXIubm9ybWFsaXplRXJyb3IoZXJyb3IsIGNvbmZpZywgJ3JlcS0xMjMnKTtcclxuICAgKiAgIC8vIGFwaUVycm9yLnR5cGUgPT09ICdyZXF1ZXN0X2NhbmNlbGxlZCdcclxuICAgKiAgIC8vIGFwaUVycm9yLmlzQWJvcnRlZCA9PT0gdHJ1ZVxyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogTm9ybWFsaXppbmcgYSB0aW1lb3V0OlxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCB0aW1lb3V0RXJyb3IgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgdGltZW91dCBhZnRlciAzMDAwMG1zJyk7XHJcbiAgICogY29uc3QgYXBpRXJyb3IgPSBub3JtYWxpemVyLm5vcm1hbGl6ZUVycm9yKHRpbWVvdXRFcnJvciwgY29uZmlnKTtcclxuICAgKiAvLyBhcGlFcnJvci50eXBlID09PSAndGltZW91dF9lcnJvcidcclxuICAgKiAvLyBhcGlFcnJvci5zdGF0dXMgPT09IDQwOFxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIG5vcm1hbGl6ZUVycm9yKFxyXG4gICAgZXJyb3I6IHVua25vd24sXHJcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcsXHJcbiAgICBjb3JyZWxhdGlvbklkPzogc3RyaW5nXHJcbiAgKTogQXBpRXJyb3Ige1xyXG4gICAgLy8gSGFuZGxlIHByaW1pdGl2ZSBlcnJvcnMgKHN0cmluZ3MsIG51bWJlcnMsIGV0Yy4pXHJcbiAgICBpZiAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnKSwge1xyXG4gICAgICAgIHR5cGU6ICd1bmtub3duX2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ1Vua25vd24gRXJyb3InLFxyXG4gICAgICAgIHN0YXR1czogMCxcclxuICAgICAgICB0cmFjZUlkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgIGlzQWJvcnRlZDogZmFsc2UsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgc3RyaW5nIGVycm9yc1xyXG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVycm9yKSwge1xyXG4gICAgICAgIHR5cGU6ICd1bmtub3duX2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ1Vua25vd24gRXJyb3InLFxyXG4gICAgICAgIHN0YXR1czogMCxcclxuICAgICAgICB0cmFjZUlkOiBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgIGlzQWJvcnRlZDogZmFsc2UsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBQYXJ0aWFsPEFwaUVycm9yPiAmIHsgbWVzc2FnZT86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9O1xyXG5cclxuICAgIC8vIElmIGVycm9yIGFscmVhZHkgaGFzIEFwaUVycm9yIHN0cnVjdHVyZSwgZW5oYW5jZSBpdFxyXG4gICAgaWYgKGVyci50eXBlIHx8IGVyci50aXRsZSB8fCBlcnIuZXJyb3JzKSB7XHJcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnIubWVzc2FnZSA/PyAnVW5rbm93biBlcnJvcicpLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxyXG4gICAgICAgICAgdGl0bGU6IGVyci50aXRsZSxcclxuICAgICAgICAgIHN0YXR1czogZXJyLnN0YXR1cyxcclxuICAgICAgICAgIHRyYWNlSWQ6IGVyci50cmFjZUlkIHx8IGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICBlcnJvcnM6IGVyci5lcnJvcnMsXHJcbiAgICAgICAgICBpc0Fib3J0ZWQ6IGVyci5pc0Fib3J0ZWQgfHwgZmFsc2UsXHJcbiAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InIHx8IGVyci5pc0Fib3J0ZWQpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVyci5tZXNzYWdlID8/ICdSZXF1ZXN0IHdhcyBhYm9ydGVkJyksIHtcclxuICAgICAgICB0eXBlOiAncmVxdWVzdF9jYW5jZWxsZWQnLFxyXG4gICAgICAgIHRpdGxlOiAnUmVxdWVzdCB3YXMgY2FuY2VsbGVkJyxcclxuICAgICAgICBzdGF0dXM6IDAsXHJcbiAgICAgICAgdHJhY2VJZDogY29ycmVsYXRpb25JZCxcclxuICAgICAgICBpc0Fib3J0ZWQ6IHRydWUsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXJyLm1lc3NhZ2U/LmluY2x1ZGVzKCd0aW1lb3V0JykpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVyci5tZXNzYWdlKSwge1xyXG4gICAgICAgIHR5cGU6ICd0aW1lb3V0X2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ1JlcXVlc3QgVGltZW91dCcsXHJcbiAgICAgICAgc3RhdHVzOiA0MDgsXHJcbiAgICAgICAgdHJhY2VJZDogY29ycmVsYXRpb25JZCxcclxuICAgICAgICBpc0Fib3J0ZWQ6IHRydWUsXHJcbiAgICAgICAgY29uZmlnLFxyXG4gICAgICB9IGFzIEFwaUVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXJyLm1lc3NhZ2U/LmluY2x1ZGVzKCduZXR3b3JrJykpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVyci5tZXNzYWdlID8/ICdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJyksIHtcclxuICAgICAgICB0eXBlOiAnbmV0d29ya19lcnJvcicsXHJcbiAgICAgICAgdGl0bGU6ICdOZXR3b3JrIEVycm9yJyxcclxuICAgICAgICBzdGF0dXM6IDAsXHJcbiAgICAgICAgdHJhY2VJZDogY29ycmVsYXRpb25JZCxcclxuICAgICAgICBpc0Fib3J0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIGNvbmZpZyxcclxuICAgICAgfSBhcyBBcGlFcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgIG5ldyBFcnJvcihlcnIubWVzc2FnZSA/PyAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcpLFxyXG4gICAgICB7XHJcbiAgICAgICAgdHlwZTogJ3Vua25vd25fZXJyb3InLFxyXG4gICAgICAgIHRpdGxlOiAnVW5rbm93biBFcnJvcicsXHJcbiAgICAgICAgc3RhdHVzOiAwLFxyXG4gICAgICAgIHRyYWNlSWQ6IGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgaXNBYm9ydGVkOiBmYWxzZSxcclxuICAgICAgICBjb25maWcsXHJcbiAgICAgIH0gYXMgQXBpRXJyb3JcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvQXBpRXJyb3InO1xuaW1wb3J0IHR5cGUgeyBFcnJvckludGVyY2VwdG9yIH0gZnJvbSAnLi4vdHlwZXMvRXJyb3JJbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb25maWcgfSBmcm9tICcuLi90eXBlcy9SZXF1ZXN0Q29uZmlnJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEludGVyY2VwdG9yIH0gZnJvbSAnLi4vdHlwZXMvUmVxdWVzdEludGVyY2VwdG9yJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2VJbnRlcmNlcHRvciB9IGZyb20gJy4uL3R5cGVzL1Jlc3BvbnNlSW50ZXJjZXB0b3InO1xuXG5pbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnQC90eXBlcyc7XG5cbi8qKlxuICogTWFuYWdlcyB0aGUgcmVnaXN0cmF0aW9uIGFuZCBleGVjdXRpb24gb2YgcmVxdWVzdC9yZXNwb25zZS9lcnJvciBpbnRlcmNlcHRvcnMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBpbnRlcmNlcHRvciBwYXR0ZXJuLCBhbGxvd2luZyBtaWRkbGV3YXJlLXN0eWxlXG4gKiBmdW5jdGlvbnMgdG8gYmUgcmVnaXN0ZXJlZCBhbmQgZXhlY3V0ZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aGUgcmVxdWVzdCBsaWZlY3ljbGU6XG4gKiAtICoqUmVxdWVzdCBJbnRlcmNlcHRvcnMqKjogTW9kaWZ5IHJlcXVlc3RzIGJlZm9yZSB0aGV5IGFyZSBzZW50XG4gKiAtICoqUmVzcG9uc2UgSW50ZXJjZXB0b3JzKio6IFRyYW5zZm9ybSByZXNwb25zZXMgYmVmb3JlIHRoZXkgYXJlIHJldHVybmVkXG4gKiAtICoqRXJyb3IgSW50ZXJjZXB0b3JzKio6IEhhbmRsZSBvciB0cmFuc2Zvcm0gZXJyb3JzIGJlZm9yZSB0aGV5IGFyZSB0aHJvd25cbiAqXG4gKiBJbnRlcmNlcHRvcnMgYXJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseSBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQsXG4gKiBmb3JtaW5nIGEgcHJvY2Vzc2luZyBwaXBlbGluZS4gRWFjaCBpbnRlcmNlcHRvciBjYW46XG4gKiAtIEluc3BlY3QgdGhlIGRhdGEgcGFzc2luZyB0aHJvdWdoXG4gKiAtIFRyYW5zZm9ybSBvciBlbmhhbmNlIHRoZSBkYXRhXG4gKiAtIFNob3J0LWNpcmN1aXQgdGhlIHBpcGVsaW5lIChmb3IgZXJyb3JzKVxuICogLSBQZXJmb3JtIHNpZGUgZWZmZWN0cyAobG9nZ2luZywgbW9uaXRvcmluZywgZXRjLilcbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtICoqU2VxdWVudGlhbCBFeGVjdXRpb24qKjogSW50ZXJjZXB0b3JzIHJ1biBpbiByZWdpc3RyYXRpb24gb3JkZXJcbiAqIC0gKipVbnJlZ2lzdHJhdGlvbiBTdXBwb3J0Kio6IFJldHVybnMgY2xlYW51cCBmdW5jdGlvbiBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICogLSAqKlR5cGUgU2FmZXR5Kio6IEZ1bGx5IHR5cGVkIGludGVyY2VwdG9yIGZ1bmN0aW9ucyB3aXRoIGdlbmVyaWNzXG4gKiAtICoqRXJyb3IgSGFuZGxpbmcqKjogR3JhY2VmdWwgaGFuZGxpbmcgb2YgaW50ZXJjZXB0b3IgZmFpbHVyZXNcbiAqXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBDb21tb24gaW50ZXJjZXB0b3IgcGF0dGVybnM6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtYW5hZ2VyID0gbmV3IEludGVyY2VwdG9yTWFuYWdlcigpO1xuICpcbiAqIC8vIFJlcXVlc3QgbG9nZ2luZ1xuICogbWFuYWdlci5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoYXN5bmMgKGNvbmZpZykgPT4ge1xuICogICBjb25zb2xlLmxvZygnUmVxdWVzdDonLCBjb25maWcubWV0aG9kLCBjb25maWcudXJsKTtcbiAqICAgcmV0dXJuIGNvbmZpZztcbiAqIH0pO1xuICpcbiAqIC8vIFJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uXG4gKiBtYW5hZ2VyLmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gKiAgIGlmIChyZXNwb25zZS5hcGlEYXRhKSB7XG4gKiAgICAgcmVzcG9uc2UuYXBpRGF0YSA9IGNhbWVsQ2FzZUtleXMocmVzcG9uc2UuYXBpRGF0YSk7XG4gKiAgIH1cbiAqICAgcmV0dXJuIHJlc3BvbnNlO1xuICogfSk7XG4gKlxuICogLy8gRXJyb3IgbW9uaXRvcmluZ1xuICogbWFuYWdlci5hZGRFcnJvckludGVyY2VwdG9yKGFzeW5jIChlcnJvcikgPT4ge1xuICogICBpZiAoZXJyb3Iuc3RhdHVzID49IDUwMCkge1xuICogICAgIGF3YWl0IGxvZ1RvTW9uaXRvcmluZyhlcnJvcik7XG4gKiAgIH1cbiAqICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIG1haW50YWluIGVycm9yIGZsb3dcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICAvKipcbiAgICogQXJyYXkgb2YgcmVnaXN0ZXJlZCByZXF1ZXN0IGludGVyY2VwdG9yc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0SW50ZXJjZXB0b3JzOiBSZXF1ZXN0SW50ZXJjZXB0b3JbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiByZWdpc3RlcmVkIHJlc3BvbnNlIGludGVyY2VwdG9yc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNwb25zZUludGVyY2VwdG9yczogUmVzcG9uc2VJbnRlcmNlcHRvcltdID0gW107XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHJlZ2lzdGVyZWQgZXJyb3IgaW50ZXJjZXB0b3JzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9ySW50ZXJjZXB0b3JzOiBFcnJvckludGVyY2VwdG9yW10gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcmVxdWVzdCBpbnRlcmNlcHRvciB0byBtb2RpZnkgcmVxdWVzdHMgYmVmb3JlIHRoZXkgYXJlIHNlbnQuXG4gICAqXG4gICAqIFJlcXVlc3QgaW50ZXJjZXB0b3JzIGNhbjpcbiAgICogLSBBZGQgb3IgbW9kaWZ5IGhlYWRlcnNcbiAgICogLSBUcmFuc2Zvcm0gcmVxdWVzdCBib2RpZXNcbiAgICogLSBBZGQgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiAtIEltcGxlbWVudCByZXF1ZXN0IHNpZ25pbmdcbiAgICogLSBMb2cgb3V0Z29pbmcgcmVxdWVzdHNcbiAgICpcbiAgICogQHBhcmFtIGludGVyY2VwdG9yIC0gQXN5bmMgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhbmQgcmV0dXJucyBSZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWRkIGF1dGhlbnRpY2F0aW9uIGhlYWRlclxuICAgKiBjb25zdCB1bnJlZ2lzdGVyID0gbWFuYWdlci5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgKiAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0QXV0aFRva2VuKCk7XG4gICAqICAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCBuZXcgSGVhZGVycygpO1xuICAgKiAgIGNvbmZpZy5oZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt0b2tlbn1gKTtcbiAgICogICByZXR1cm4gY29uZmlnO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTGF0ZXIsIHJlbW92ZSB0aGUgaW50ZXJjZXB0b3JcbiAgICogdW5yZWdpc3RlcigpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcjogUmVxdWVzdEludGVyY2VwdG9yKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLmluZGV4T2YoaW50ZXJjZXB0b3IpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3JzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSByZXNwb25zZSBpbnRlcmNlcHRvciB0byB0cmFuc2Zvcm0gcmVzcG9uc2VzIGJlZm9yZSB0aGV5IGFyZSByZXR1cm5lZC5cbiAgICpcbiAgICogUmVzcG9uc2UgaW50ZXJjZXB0b3JzIGNhbjpcbiAgICogLSBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YSBmb3JtYXRcbiAgICogLSBFeHRyYWN0IG5lc3RlZCBkYXRhIHN0cnVjdHVyZXNcbiAgICogLSBBZGQgY29tcHV0ZWQgcHJvcGVydGllc1xuICAgKiAtIENhY2hlIHJlc3BvbnNlc1xuICAgKiAtIExvZyBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJjZXB0b3IgLSBBc3luYyBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGFuZCByZXR1cm5zIEFwaVJlc3BvbnNlXG4gICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRXh0cmFjdCBkYXRhIGZyb20gZW52ZWxvcGVcbiAgICogbWFuYWdlci5hZGRSZXNwb25zZUludGVyY2VwdG9yKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgKiAgIGlmIChyZXNwb25zZS5hcGlEYXRhPy5yZXN1bHQpIHtcbiAgICogICAgIHJlc3BvbnNlLmFwaURhdGEgPSByZXNwb25zZS5hcGlEYXRhLnJlc3VsdDtcbiAgICogICB9XG4gICAqICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gQWRkIHRpbWVzdGFtcHNcbiAgICogbWFuYWdlci5hZGRSZXNwb25zZUludGVyY2VwdG9yKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgKiAgIHJldHVybiB7XG4gICAqICAgICAuLi5yZXNwb25zZSxcbiAgICogICAgIHJlY2VpdmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgKiAgIH07XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3I6IFJlc3BvbnNlSW50ZXJjZXB0b3IpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNwb25zZUludGVyY2VwdG9ycy5pbmRleE9mKGludGVyY2VwdG9yKTtcblxuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciBpbnRlcmNlcHRvciB0byBoYW5kbGUgb3IgdHJhbnNmb3JtIGVycm9ycyBiZWZvcmUgdGhleSBhcmUgdGhyb3duLlxuICAgKlxuICAgKiBFcnJvciBpbnRlcmNlcHRvcnMgY2FuOlxuICAgKiAtIExvZyBlcnJvcnMgdG8gbW9uaXRvcmluZyBzZXJ2aWNlc1xuICAgKiAtIFRyYW5zZm9ybSBlcnJvciBmb3JtYXRzXG4gICAqIC0gSW1wbGVtZW50IHJldHJ5IGxvZ2ljXG4gICAqIC0gU2hvdyB1c2VyIG5vdGlmaWNhdGlvbnNcbiAgICogLSBFeHRyYWN0IHZhbGlkYXRpb24gZXJyb3JzXG4gICAqXG4gICAqICoqTm90ZToqKiBFcnJvciBpbnRlcmNlcHRvcnMgc2hvdWxkIHJlLXRocm93IHRoZSBlcnJvciAob3IgYSB0cmFuc2Zvcm1lZCB2ZXJzaW9uKVxuICAgKiB0byBtYWludGFpbiB0aGUgZXJyb3IgZmxvdy4gVGhlIGZpbmFsIGVycm9yIGlzIGFsd2F5cyB0aHJvd24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlcmNlcHRvciAtIEFzeW5jIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYW5kIHJldHVybnMgKG9yIHRocm93cykgQXBpRXJyb3JcbiAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoaXMgaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBMb2cgdG8gbW9uaXRvcmluZyBzZXJ2aWNlXG4gICAqIG1hbmFnZXIuYWRkRXJyb3JJbnRlcmNlcHRvcihhc3luYyAoZXJyb3IpID0+IHtcbiAgICogICBpZiAoZXJyb3Iuc3RhdHVzID49IDUwMCkge1xuICAgKiAgICAgYXdhaXQgU2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oZXJyb3IsIHtcbiAgICogICAgICAgZXh0cmE6IHsgdHJhY2VJZDogZXJyb3IudHJhY2VJZCB9XG4gICAqICAgICB9KTtcbiAgICogICB9XG4gICAqICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIGNvbnRpbnVlIGVycm9yIGZsb3dcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFRyYW5zZm9ybSBlcnJvciBtZXNzYWdlc1xuICAgKiBtYW5hZ2VyLmFkZEVycm9ySW50ZXJjZXB0b3IoYXN5bmMgKGVycm9yKSA9PiB7XG4gICAqICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAqICAgICBlcnJvci50aXRsZSA9ICdSZXNvdXJjZSBub3QgZm91bmQnO1xuICAgKiAgIH1cbiAgICogICB0aHJvdyBlcnJvcjtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcjogRXJyb3JJbnRlcmNlcHRvcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuZXJyb3JJbnRlcmNlcHRvcnMucHVzaChpbnRlcmNlcHRvcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLmluZGV4T2YoaW50ZXJjZXB0b3IpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5lcnJvckludGVyY2VwdG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgcmVnaXN0ZXJlZCByZXF1ZXN0IGludGVyY2VwdG9ycyBpbiBzZXF1ZW50aWFsIG9yZGVyLlxuICAgKlxuICAgKiBFYWNoIGludGVyY2VwdG9yIHJlY2VpdmVzIHRoZSBjb25maWcgbW9kaWZpZWQgYnkgdGhlIHByZXZpb3VzIGludGVyY2VwdG9yLFxuICAgKiBmb3JtaW5nIGEgcHJvY2Vzc2luZyBwaXBlbGluZS4gSWYgYW55IGludGVyY2VwdG9yIHRocm93cyBhbiBlcnJvcixcbiAgICogdGhlIHBpcGVsaW5lIHN0b3BzIGFuZCB0aGUgZXJyb3IgcHJvcGFnYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBpbml0aWFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgcmVxdWVzdCBjb25maWd1cmF0aW9uIGFmdGVyIGFsbCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb25maWcgPSB7IG1ldGhvZDogJ0dFVCcsIHVybDogJy91c2VycycgfTtcbiAgICogY29uc3QgZmluYWxDb25maWcgPSBhd2FpdCBtYW5hZ2VyLmFwcGx5UmVxdWVzdEludGVyY2VwdG9ycyhjb25maWcpO1xuICAgKiAvLyBmaW5hbENvbmZpZyBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgYWxsIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYXBwbHlSZXF1ZXN0SW50ZXJjZXB0b3JzKFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZ1xuICApOiBQcm9taXNlPFJlcXVlc3RDb25maWc+IHtcbiAgICBsZXQgbW9kaWZpZWRDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuXG4gICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIG1vZGlmaWVkQ29uZmlnID0gYXdhaXQgaW50ZXJjZXB0b3IobW9kaWZpZWRDb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RpZmllZENvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFsbCByZWdpc3RlcmVkIHJlc3BvbnNlIGludGVyY2VwdG9ycyBpbiBzZXF1ZW50aWFsIG9yZGVyLlxuICAgKlxuICAgKiBFYWNoIGludGVyY2VwdG9yIHJlY2VpdmVzIHRoZSByZXNwb25zZSBtb2RpZmllZCBieSB0aGUgcHJldmlvdXMgaW50ZXJjZXB0b3IsXG4gICAqIGZvcm1pbmcgYSBwcm9jZXNzaW5nIHBpcGVsaW5lLiBJZiBhbnkgaW50ZXJjZXB0b3IgdGhyb3dzIGFuIGVycm9yLFxuICAgKiB0aGUgcGlwZWxpbmUgc3RvcHMgYW5kIHRoZSBlcnJvciBwcm9wYWdhdGVzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSByZXNwb25zZSBkYXRhXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIFRoZSBpbml0aWFsIEFQSSByZXNwb25zZVxuICAgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgcmVzcG9uc2UgYWZ0ZXIgYWxsIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0geyBkYXRhOiB7IGlkOiAxLCBuYW1lOiAnSm9obicgfSB9O1xuICAgKiBjb25zdCBmaW5hbFJlc3BvbnNlID0gYXdhaXQgbWFuYWdlci5hcHBseVJlc3BvbnNlSW50ZXJjZXB0b3JzKHJlc3BvbnNlKTtcbiAgICogLy8gZmluYWxSZXNwb25zZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgYWxsIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYXBwbHlSZXNwb25zZUludGVyY2VwdG9yczxUPihcbiAgICByZXNwb25zZTogQXBpUmVzcG9uc2U8VD5cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGxldCBtb2RpZmllZFJlc3BvbnNlID0gcmVzcG9uc2U7XG5cbiAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMpIHtcbiAgICAgIG1vZGlmaWVkUmVzcG9uc2UgPSBhd2FpdCBpbnRlcmNlcHRvcihtb2RpZmllZFJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kaWZpZWRSZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFsbCByZWdpc3RlcmVkIGVycm9yIGludGVyY2VwdG9ycyBpbiBzZXF1ZW50aWFsIG9yZGVyIGFuZCByZS10aHJvd3MuXG4gICAqXG4gICAqIEVhY2ggaW50ZXJjZXB0b3IgcmVjZWl2ZXMgdGhlIGVycm9yIChwb3RlbnRpYWxseSBtb2RpZmllZCBieSBwcmV2aW91cyBpbnRlcmNlcHRvcnMpLlxuICAgKiBJbnRlcmNlcHRvcnMgY2FuIHRyYW5zZm9ybSB0aGUgZXJyb3IgYmVmb3JlIHJlLXRocm93aW5nIGl0LiBUaGUgZmluYWwgZXJyb3JcbiAgICogaXMgYWx3YXlzIHRocm93biB0byBtYWludGFpbiBlcnJvciBmbG93LlxuICAgKlxuICAgKiBJZiBhbiBpbnRlcmNlcHRvciBpdHNlbGYgdGhyb3dzIGFuIGVycm9yLCB0aGF0IGJlY29tZXMgdGhlIG5ldyBlcnJvciB0byBwcm9jZXNzXG4gICAqIGJ5IHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgaW5pdGlhbCBBUEkgZXJyb3JcbiAgICogQHJldHVybnMgTmV2ZXIgcmV0dXJucyAoYWx3YXlzIHRocm93cylcbiAgICogQHRocm93cyBUaGUgZmluYWwgZXJyb3IgYWZ0ZXIgYWxsIGludGVyY2VwdG9ycyBoYXZlIHByb2Nlc3NlZCBpdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRyeSB7XG4gICAqICAgYXdhaXQgbWFuYWdlci5hcHBseUVycm9ySW50ZXJjZXB0b3JzKGVycm9yKTtcbiAgICogfSBjYXRjaCAoZmluYWxFcnJvcikge1xuICAgKiAgIC8vIGZpbmFsRXJyb3IgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IGFsbCByZWdpc3RlcmVkIGVycm9yIGludGVyY2VwdG9yc1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYXBwbHlFcnJvckludGVyY2VwdG9ycyhlcnJvcjogQXBpRXJyb3IpOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgbGV0IG1vZGlmaWVkRXJyb3IgPSBlcnJvcjtcblxuICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgdGhpcy5lcnJvckludGVyY2VwdG9ycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbW9kaWZpZWRFcnJvciA9IGF3YWl0IGludGVyY2VwdG9yKG1vZGlmaWVkRXJyb3IpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBtb2RpZmllZEVycm9yID0gZSBhcyBBcGlFcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBtb2RpZmllZEVycm9yO1xuICB9XG59XG4iLCAiLyoqXG4gKiBNYW5hZ2VzIGFjdGl2ZSBIVFRQIHJlcXVlc3RzIHdpdGggc3VwcG9ydCBmb3IgY2FuY2VsbGF0aW9uIGFuZCBjb3JyZWxhdGlvbiB0cmFja2luZy5cbiAqXG4gKiBUaGlzIGludGVybmFsIGNsYXNzIG1haW50YWlucyBhIHJlZ2lzdHJ5IG9mIGluLWZsaWdodCByZXF1ZXN0cywgYWxsb3dpbmcgdGhlbSB0byBiZVxuICogY2FuY2VsbGVkIGluZGl2aWR1YWxseSBvciBpbiBidWxrLiBFYWNoIHJlcXVlc3QgaXMgdHJhY2tlZCBieSBhIHVuaXF1ZSBrZXkgYW5kXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBjb3JyZWxhdGlvbiBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZy5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtICoqUmVxdWVzdCBEZWR1cGxpY2F0aW9uKio6IEF1dG9tYXRpY2FsbHkgY2FuY2VscyBkdXBsaWNhdGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBrZXlcbiAqIC0gKipDb3JyZWxhdGlvbiBUcmFja2luZyoqOiBNYXBzIHJlcXVlc3Qga2V5cyB0byBjb3JyZWxhdGlvbiBJRHMgZm9yIHRyYWNpbmdcbiAqIC0gKipCdWxrIENhbmNlbGxhdGlvbioqOiBDYW5jZWwgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXQgb25jZSAodXNlZnVsIGZvciBjbGVhbnVwKVxuICogLSAqKk1lbW9yeSBNYW5hZ2VtZW50Kio6IEF1dG9tYXRpY2FsbHkgY2xlYW5zIHVwIHRyYWNraW5nIGRhdGEgd2hlbiByZXF1ZXN0cyBjb21wbGV0ZVxuICpcbiAqIEBpbnRlcm5hbCBUaGlzIGNsYXNzIGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBwdWJsaWMgQVBJXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1hbmFnZXIgPSBuZXcgUmVxdWVzdE1hbmFnZXIoKTtcbiAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKlxuICogLy8gVHJhY2sgYSByZXF1ZXN0XG4gKiBtYW5hZ2VyLmFkZCgnR0VUXy91c2Vycy8xMjMnLCBjb250cm9sbGVyLCAnYXBpLWFiYzEyMycpO1xuICpcbiAqIC8vIENhbmNlbCBzcGVjaWZpYyByZXF1ZXN0XG4gKiBtYW5hZ2VyLmNhbmNlbCgnR0VUXy91c2Vycy8xMjMnKTtcbiAqXG4gKiAvLyBPciBjYW5jZWwgYWxsIHJlcXVlc3RzXG4gKiBtYW5hZ2VyLmNhbmNlbEFsbCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TWFuYWdlciB7XG4gIC8qKlxuICAgKiBNYXAgb2YgYWN0aXZlIHJlcXVlc3Qga2V5cyB0byB0aGVpciBhYm9ydCBjb250cm9sbGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVSZXF1ZXN0czogTWFwPHN0cmluZywgQWJvcnRDb250cm9sbGVyPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogTWFwIG9mIHJlcXVlc3Qga2V5cyB0byB0aGVpciBjb3JyZWxhdGlvbiBJRHMgZm9yIHRyYWNpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29ycmVsYXRpb25NYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyByZXF1ZXN0IGZvciB0cmFja2luZyBhbmQgY2FuY2VsbGF0aW9uIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIElmIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gICAqIGNhbmNlbGxlZCBiZWZvcmUgdGhlIG5ldyBvbmUgaXMgcmVnaXN0ZXJlZCAocmVxdWVzdCBkZWR1cGxpY2F0aW9uKS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCAodHlwaWNhbGx5IG1ldGhvZCArIFVSTCArIHRpbWVzdGFtcClcbiAgICogQHBhcmFtIGNvbnRyb2xsZXIgLSBBYm9ydENvbnRyb2xsZXIgZm9yIGNhbmNlbGxpbmcgdGhlIHJlcXVlc3RcbiAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQgLSBDb3JyZWxhdGlvbiBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAqIG1hbmFnZXIuYWRkKCdHRVRfL2FwaS91c2Vyc18xNjk5OTk5OTk5JywgY29udHJvbGxlciwgJ2FwaS1hYmMxMjMnKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGQoa2V5OiBzdHJpbmcsIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciwgY29ycmVsYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ2FuY2VsIGV4aXN0aW5nIHJlcXVlc3Qgd2l0aCBzYW1lIGtleSBpZiBleGlzdHNcbiAgICB0aGlzLmNhbmNlbChrZXkpO1xuICAgIHRoaXMuYWN0aXZlUmVxdWVzdHMuc2V0KGtleSwgY29udHJvbGxlcik7XG4gICAgdGhpcy5jb3JyZWxhdGlvbk1hcC5zZXQoa2V5LCBjb3JyZWxhdGlvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVxdWVzdCBmcm9tIHRyYWNraW5nIHdpdGhvdXQgY2FuY2VsbGluZyBpdC5cbiAgICpcbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gYSByZXF1ZXN0IGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgb3IgZmFpbHMuXG4gICAqIFVzZSB7QGxpbmsgY2FuY2VsfSBpbnN0ZWFkIGlmIHlvdSBuZWVkIHRvIGFib3J0IHRoZSByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0IHRvIHJlbW92ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIENhbGxlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHJlcXVlc3QgY29tcGxldGVzXG4gICAqIG1hbmFnZXIucmVtb3ZlKCdHRVRfL2FwaS91c2Vyc18xNjk5OTk5OTk5Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXF1ZXN0cy5kZWxldGUoa2V5KTtcbiAgICB0aGlzLmNvcnJlbGF0aW9uTWFwLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYSBzcGVjaWZpYyByZXF1ZXN0IGFuZCByZW1vdmVzIGl0IGZyb20gdHJhY2tpbmcuXG4gICAqXG4gICAqIElmIHRoZSByZXF1ZXN0IGRvZXNuJ3QgZXhpc3Qgb3Igd2FzIGFscmVhZHkgY2FuY2VsbGVkLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLlxuICAgKiBUaGUgYXNzb2NpYXRlZCBBYm9ydENvbnRyb2xsZXIncyBzaWduYWwgd2lsbCBiZSB0cmlnZ2VyZWQsIGNhdXNpbmcgYW55IGFjdGl2ZVxuICAgKiBmZXRjaCBvcGVyYXRpb25zIHRvIGFib3J0LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0IHRvIGNhbmNlbFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFVzZXIgbmF2aWdhdGVzIGF3YXksIGNhbmNlbCB0aGUgcGVuZGluZyByZXF1ZXN0XG4gICAqIG1hbmFnZXIuY2FuY2VsKCdHRVRfL2FwaS91c2Vyc18xNjk5OTk5OTk5Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgY2FuY2VsKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuYWN0aXZlUmVxdWVzdHMuZ2V0KGtleSk7XG5cbiAgICBpZiAoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgdGhpcy5hY3RpdmVSZXF1ZXN0cy5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuY29ycmVsYXRpb25NYXAuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYWxsIGFjdGl2ZSByZXF1ZXN0cyBhbmQgY2xlYXJzIGFsbCB0cmFja2luZyBkYXRhLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2xlYW51cCBzY2VuYXJpb3Mgc3VjaCBhczpcbiAgICogLSBVc2VyIGxvZ291dFxuICAgKiAtIENvbXBvbmVudCB1bm1vdW50XG4gICAqIC0gTmF2aWdhdGlvbiB0byBhIGRpZmZlcmVudCBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKiAtIEVycm9yIHJlY292ZXJ5IHRoYXQgcmVxdWlyZXMgYSBjbGVhbiBzbGF0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIENhbmNlbCBhbGwgcGVuZGluZyByZXF1ZXN0cyBvbiBsb2dvdXRcbiAgICogZnVuY3Rpb24gaGFuZGxlTG9nb3V0KCkge1xuICAgKiAgIGFwaUNsaWVudC5jYW5jZWxBbGxSZXF1ZXN0cygpO1xuICAgKiAgIC8vIC4uLiByZXN0IG9mIGxvZ291dCBsb2dpY1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgY2FuY2VsQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUmVxdWVzdHMuZm9yRWFjaChjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgdGhpcy5hY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgIHRoaXMuY29ycmVsYXRpb25NYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIGtleSBpcyBjdXJyZW50bHkgYmVpbmcgdHJhY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlcXVlc3QgaXMgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChtYW5hZ2VyLmhhcygnR0VUXy9hcGkvdXNlcnNfMTY5OTk5OTk5OScpKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1JlcXVlc3QgaXMgc3RpbGwgcGVuZGluZycpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlUmVxdWVzdHMuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjb3JyZWxhdGlvbiBJRCBmb3IgYSBnaXZlbiByZXF1ZXN0IGtleS5cbiAgICpcbiAgICogQ29ycmVsYXRpb24gSURzIGFyZSB1c2VkIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nIGFuZCByZXF1ZXN0IHRyYWNraW5nXG4gICAqIGFjcm9zcyBzZXJ2aWNlcyBhbmQgbG9ncy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBUaGUgY29ycmVsYXRpb24gSUQgaWYgZm91bmQsIGB1bmRlZmluZWRgIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBtYW5hZ2VyLmdldENvcnJlbGF0aW9uSWQoJ0dFVF8vYXBpL3VzZXJzXzE2OTk5OTk5OTknKTtcbiAgICogaWYgKGNvcnJlbGF0aW9uSWQpIHtcbiAgICogICBjb25zb2xlLmxvZygnVHJhY2UgcmVxdWVzdCB3aXRoIElEOicsIGNvcnJlbGF0aW9uSWQpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q29ycmVsYXRpb25JZChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29ycmVsYXRpb25NYXAuZ2V0KGtleSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVycm9yIH0gZnJvbSAnLi4vdHlwZXMvQXBpRXJyb3InO1xuXG4vKipcbiAqIEltcGxlbWVudHMgYXV0b21hdGljIHJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBmb3IgZmFpbGVkIEhUVFAgcmVxdWVzdHMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBoYW5kbGVzIHRyYW5zaWVudCBmYWlsdXJlcyBieSBhdXRvbWF0aWNhbGx5IHJldHJ5aW5nIHJlcXVlc3RzXG4gKiB3aXRoIHByb2dyZXNzaXZlbHkgaW5jcmVhc2luZyBkZWxheXMgYmV0d2VlbiBhdHRlbXB0cy4gVGhlIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAqIHN0cmF0ZWd5IGhlbHBzIHByZXZlbnQgb3ZlcndoZWxtaW5nIGEgc3RydWdnbGluZyBzZXJ2ZXIgd2hpbGUgZ2l2aW5nIHRlbXBvcmFyeVxuICogaXNzdWVzIHRpbWUgdG8gcmVzb2x2ZS5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtICoqRXhwb25lbnRpYWwgQmFja29mZioqOiBEb3VibGVzIGRlbGF5IGJldHdlZW4gcmV0cmllcyAoZS5nLiwgMXMsIDJzLCA0cywgOHMpXG4gKiAtICoqU21hcnQgRXJyb3IgRGV0ZWN0aW9uKio6IFNraXBzIHJldHJ5IGZvciBub24tcmV0cnlhYmxlIGVycm9ycyAodmFsaWRhdGlvbiwgYWJvcnRzKVxuICogLSAqKkFib3J0IFN1cHBvcnQqKjogUmVzcGVjdHMgY2FuY2VsbGF0aW9uIHNpZ25hbHMgZHVyaW5nIHJldHJ5IGRlbGF5c1xuICogLSAqKlR5cGUgU2FmZXR5Kio6IEZ1bGx5IGdlbmVyaWMgaW1wbGVtZW50YXRpb24gcHJlc2VydmluZyByZXR1cm4gdHlwZXNcbiAqXG4gKiBSZXRyeSBTdHJhdGVneTpcbiAqIC0gKipSZXRyeWFibGUqKjogTmV0d29yayBlcnJvcnMsIDV4eCBzZXJ2ZXIgZXJyb3JzLCB0aW1lb3V0c1xuICogLSAqKk5vbi1SZXRyeWFibGUqKjogVmFsaWRhdGlvbiBlcnJvcnMgKDQwMCksIEFib3J0RXJyb3JzLCBjYW5jZWxsZWQgcmVxdWVzdHNcbiAqXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBSZXRyeSBjb25maWd1cmF0aW9uIGluIEFwaUNsaWVudDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBBcGlDbGllbnQoJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyk7XG4gKlxuICogLy8gUmV0cnkgdXAgdG8gMyB0aW1lcyB3aXRoIDFzIGluaXRpYWwgZGVsYXlcbiAqIGNvbnN0IHsgYXBpRGF0YSB9ID0gYXdhaXQgY2xpZW50LmdldCgnL3VzZXJzJywge1xuICogICByZXRyaWVzOiAzLFxuICogICByZXRyeURlbGF5OiAxMDAwICAvLyAxcywgMnMsIDRzXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmV0cnlIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFJldHJpZXMgYSBmYWlsZWQgcmVxdWVzdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYgc3RyYXRlZ3kuXG4gICAqXG4gICAqIFRoZSByZXRyeSBsb2dpYyB3b3JrcyBhcyBmb2xsb3dzOlxuICAgKiAxLiBBdHRlbXB0cyB0aGUgcmVxdWVzdCBpbW1lZGlhdGVseVxuICAgKiAyLiBPbiBmYWlsdXJlLCBjaGVja3MgaWYgdGhlIGVycm9yIGlzIHJldHJ5YWJsZVxuICAgKiAzLiBJZiByZXRyeWFibGUgYW5kIHJldHJpZXMgcmVtYWluLCB3YWl0cyBmb3IgdGhlIGN1cnJlbnQgZGVsYXlcbiAgICogNC4gRG91YmxlcyB0aGUgZGVsYXkgZm9yIHRoZSBuZXh0IGF0dGVtcHRcbiAgICogNS4gUmVwZWF0cyB1bnRpbCBzdWNjZXNzIG9yIHJldHJpZXMgZXhoYXVzdGVkXG4gICAqXG4gICAqICoqTm9uLVJldHJ5YWJsZSBFcnJvcnM6KipcbiAgICogLSBWYWxpZGF0aW9uIGVycm9ycyAoNDAwKSAtIENsaWVudCBzZW50IGJhZCBkYXRhXG4gICAqIC0gQWJvcnRFcnJvcnMgLSBSZXF1ZXN0IHdhcyBleHBsaWNpdGx5IGNhbmNlbGxlZFxuICAgKiAtIFJlcXVlc3RzIHdpdGggYWJvcnRlZCBzaWduYWxzXG4gICAqXG4gICAqICoqQWJvcnQgSGFuZGxpbmc6KipcbiAgICogSWYgdGhlIHNpZ25hbCBpcyBhYm9ydGVkIGR1cmluZyBhIHJldHJ5IGRlbGF5LCB0aGUgcmV0cnkgaXMgaW1tZWRpYXRlbHlcbiAgICogY2FuY2VsbGVkIGFuZCBhbiBBYm9ydEVycm9yIGlzIHRocm93bi5cbiAgICpcbiAgICogQHRlbXBsYXRlIFQgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIHJldHJpZWRcbiAgICogQHBhcmFtIGZuIC0gQXN5bmMgZnVuY3Rpb24gdG8gcmV0cnkgb24gZmFpbHVyZVxuICAgKiBAcGFyYW0gcmV0cmllcyAtIE51bWJlciBvZiByZXRyeSBhdHRlbXB0cyByZW1haW5pbmcgKGRlY3JlbWVudHMgZWFjaCByZXRyeSlcbiAgICogQHBhcmFtIGRlbGF5IC0gQ3VycmVudCBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIG5leHQgcmV0cnlcbiAgICogQHBhcmFtIHNpZ25hbCAtIE9wdGlvbmFsIEFib3J0U2lnbmFsIHRvIGNhbmNlbCByZXRyaWVzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBmdW5jdGlvbidzIHJlc3VsdCBvbiBzdWNjZXNzXG4gICAqIEB0aHJvd3MgVGhlIGxhc3QgZXJyb3IgZW5jb3VudGVyZWQgaWYgYWxsIHJldHJpZXMgYXJlIGV4aGF1c3RlZFxuICAgKiBAdGhyb3dzIEFib3J0RXJyb3IgaWYgdGhlIHNpZ25hbCBpcyBhYm9ydGVkIGR1cmluZyBleGVjdXRpb24gb3IgZGVsYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogQmFzaWMgcmV0cnkgdXNhZ2U6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgaGFuZGxlciA9IG5ldyBSZXRyeUhhbmRsZXIoKTtcbiAgICogY29uc3QgZmV0Y2hVc2VyID0gKCkgPT4gZmV0Y2goJy9hcGkvdXNlcnMvMTIzJykudGhlbihyID0+IHIuanNvbigpKTtcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICBjb25zdCB1c2VyID0gYXdhaXQgaGFuZGxlci5yZXRyeVJlcXVlc3QoXG4gICAqICAgICBmZXRjaFVzZXIsXG4gICAqICAgICAzLCAgICAgIC8vIDMgcmV0cmllc1xuICAgKiAgICAgMTAwMCAgICAvLyBTdGFydCB3aXRoIDFzIGRlbGF5XG4gICAqICAgKTtcbiAgICogICBjb25zb2xlLmxvZygnVXNlcjonLCB1c2VyKTtcbiAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICogICBjb25zb2xlLmVycm9yKCdGYWlsZWQgYWZ0ZXIgYWxsIHJldHJpZXM6JywgZXJyb3IpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBXaXRoIGNhbmNlbGxhdGlvbiBzdXBwb3J0OlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAqIGNvbnN0IHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgKlxuICAgKiAvLyBDYW5jZWwgYWZ0ZXIgNSBzZWNvbmRzXG4gICAqIHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCA1MDAwKTtcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICBhd2FpdCBoYW5kbGVyLnJldHJ5UmVxdWVzdChmZXRjaFVzZXIsIDUsIDEwMDAsIHNpZ25hbCk7XG4gICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAqICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgKiAgICAgY29uc29sZS5sb2coJ1JldHJ5IGNhbmNlbGxlZCcpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJldHJ5UmVxdWVzdDxUPihcbiAgICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgICByZXRyaWVzOiBudW1iZXIsXG4gICAgZGVsYXk6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBhYm9ydGVkXG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihzaWduYWwucmVhc29uIHx8ICdSZXF1ZXN0IGFib3J0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEFwaUVycm9yO1xuXG4gICAgICAvLyBEb24ndCByZXRyeSBpZiBhYm9ydGVkXG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBzaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IHJldHJ5IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICBpZiAoZXJyLnR5cGUgPT09ICd2YWxpZGF0aW9uX2Vycm9yJyB8fCBlcnIuc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXRyaWVzID09PSAwKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gV2FpdCB3aXRoIGFib3J0IHN1cHBvcnRcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSk7XG5cbiAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3Ioc2lnbmFsLnJlYXNvbiB8fCAnUmVxdWVzdCBhYm9ydGVkJykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnJldHJ5UmVxdWVzdChmbiwgcmV0cmllcyAtIDEsIGRlbGF5ICogMiwgc2lnbmFsKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIE1hbmFnZXMgQWJvcnRTaWduYWwgY3JlYXRpb24gYW5kIGNvbXBvc2l0aW9uIGZvciByZXF1ZXN0IGNhbmNlbGxhdGlvbiBhbmQgdGltZW91dHMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgQWJvcnRTaWduYWwgQVBJLFxuICogZW5hYmxpbmcgc29waGlzdGljYXRlZCBjYW5jZWxsYXRpb24gcGF0dGVybnMgYnkgY29tYmluaW5nIG11bHRpcGxlIGNhbmNlbGxhdGlvblxuICogc291cmNlcyBhbmQgY3JlYXRpbmcgdGltZW91dC1iYXNlZCBzaWduYWxzLlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gKipTaWduYWwgQ29tcG9zaXRpb24qKjogQ29tYmluZSBtdWx0aXBsZSBBYm9ydFNpZ25hbHMgaW50byBvbmVcbiAqIC0gKipUaW1lb3V0IFNpZ25hbHMqKjogQ3JlYXRlIHNpZ25hbHMgdGhhdCBhdXRvLWFib3J0IGFmdGVyIGEgZGVsYXlcbiAqIC0gKipFYXJseSBBYm9ydCBEZXRlY3Rpb24qKjogSW1tZWRpYXRlbHkgYWJvcnQgaWYgYW55IHNvdXJjZSBpcyBhbHJlYWR5IGFib3J0ZWRcbiAqIC0gKipSZXNvdXJjZSBDbGVhbnVwKio6IEF1dG9tYXRpYyB0aW1lb3V0IGNsZWFudXAgb24gYWJvcnRcbiAqXG4gKiBVc2UgQ2FzZXM6XG4gKiAtIENvbWJpbmUgdXNlciBjYW5jZWxsYXRpb24gKyB0aW1lb3V0ICsgY29tcG9uZW50IHVubW91bnQgc2lnbmFsc1xuICogLSBDcmVhdGUgcmVxdWVzdCBkZWFkbGluZXNcbiAqIC0gSW1wbGVtZW50IGNhc2NhZGluZyBjYW5jZWxsYXRpb25cbiAqXG4gKiBAaW50ZXJuYWwgVGhpcyBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBDb21iaW5pbmcgbXVsdGlwbGUgY2FuY2VsbGF0aW9uIHNvdXJjZXM6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtYW5hZ2VyID0gbmV3IFNpZ25hbE1hbmFnZXIoKTtcbiAqIGNvbnN0IHVzZXJDYW5jZWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gKiBjb25zdCB1bm1vdW50U2lnbmFsID0gY29tcG9uZW50VW5tb3VudFNpZ25hbDtcbiAqXG4gKiAvLyBSZXF1ZXN0IHdpbGwgYmUgY2FuY2VsbGVkIGlmIGVpdGhlciB1c2VyIGNsaWNrcyBjYW5jZWwgT1IgY29tcG9uZW50IHVubW91bnRzXG4gKiBjb25zdCBjb21iaW5lZCA9IG1hbmFnZXIuY3JlYXRlQ29tYmluZWRTaWduYWwoW1xuICogICB1c2VyQ2FuY2VsLnNpZ25hbCxcbiAqICAgdW5tb3VudFNpZ25hbFxuICogXSk7XG4gKlxuICogZmV0Y2goJy9hcGkvZGF0YScsIHsgc2lnbmFsOiBjb21iaW5lZC5zaWduYWwgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25hbE1hbmFnZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvbWJpbmVkIEFib3J0Q29udHJvbGxlciB0aGF0IGFib3J0cyB3aGVuIGFueSBzb3VyY2Ugc2lnbmFsIGFib3J0cy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgXCJhbnlcIiBwYXR0ZXJuIGZvciBjYW5jZWxsYXRpb246IHRoZSBjb21iaW5lZCBzaWduYWxcbiAgICogd2lsbCBhYm9ydCBhcyBzb29uIGFzIEFOWSBvZiB0aGUgc291cmNlIHNpZ25hbHMgYWJvcnQuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBjb29yZGluYXRpbmcgbXVsdGlwbGUgY2FuY2VsbGF0aW9uIGNvbmRpdGlvbnM6XG4gICAqIC0gVXNlciBjbGlja3MgY2FuY2VsIGJ1dHRvblxuICAgKiAtIFJlcXVlc3QgdGltZW91dCBleHBpcmVzXG4gICAqIC0gQ29tcG9uZW50IHVubW91bnRzXG4gICAqIC0gUGFyZW50IHJlcXVlc3QgaXMgY2FuY2VsbGVkXG4gICAqXG4gICAqICoqRWFybHkgQWJvcnQgT3B0aW1pemF0aW9uOioqXG4gICAqIElmIGFueSBzb3VyY2Ugc2lnbmFsIGlzIGFscmVhZHkgYWJvcnRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCxcbiAgICogdGhlIHJldHVybmVkIGNvbnRyb2xsZXIgaXMgaW1tZWRpYXRlbHkgYWJvcnRlZCB3aXRob3V0IHNldHRpbmcgdXAgbGlzdGVuZXJzLlxuICAgKlxuICAgKiAqKk1lbW9yeSBNYW5hZ2VtZW50OioqXG4gICAqIEV2ZW50IGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGB7IG9uY2U6IHRydWUgfWAgdG8gcHJldmVudCBtZW1vcnkgbGVha3MsXG4gICAqIGFzIHRoZXkgYXV0b21hdGljYWxseSBjbGVhbiB1cCBhZnRlciBmaXJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBzaWduYWxzIC0gQXJyYXkgb2YgQWJvcnRTaWduYWxzIHRvIGNvbWJpbmUgKHVuZGVmaW5lZCB2YWx1ZXMgYXJlIGlnbm9yZWQpXG4gICAqIEByZXR1cm5zIEEgbmV3IEFib3J0Q29udHJvbGxlciB0aGF0IGFib3J0cyB3aGVuIGFueSBzb3VyY2Ugc2lnbmFsIGFib3J0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBVc2VyIGNhbmNlbGxhdGlvbiArIHRpbWVvdXQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlckNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAqIGNvbnN0IHRpbWVvdXQgPSBtYW5hZ2VyLmNyZWF0ZVRpbWVvdXRTaWduYWwoMzAwMDApO1xuICAgKlxuICAgKiBjb25zdCBjb21iaW5lZCA9IG1hbmFnZXIuY3JlYXRlQ29tYmluZWRTaWduYWwoW1xuICAgKiAgIHVzZXJDb250cm9sbGVyLnNpZ25hbCxcbiAgICogICB0aW1lb3V0LnNpZ25hbFxuICAgKiBdKTtcbiAgICpcbiAgICogLy8gUmVxdWVzdCB3aWxsIGJlIGNhbmNlbGxlZCBhZnRlciAzMHMgT1Igd2hlbiB1c2VyIGNsaWNrcyBjYW5jZWxcbiAgICogZmV0Y2goJy9hcGkvZGF0YScsIHsgc2lnbmFsOiBjb21iaW5lZC5zaWduYWwgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBSZWFjdCBjb21wb25lbnQgd2l0aCBjbGVhbnVwOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAqICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICpcbiAgICogICBjb25zdCBjb21iaW5lZCA9IG1hbmFnZXIuY3JlYXRlQ29tYmluZWRTaWduYWwoW1xuICAgKiAgICAgY29udHJvbGxlci5zaWduYWwsXG4gICAqICAgICB1bm1vdW50U2lnbmFsICAvLyBGcm9tIGNvbXBvbmVudCBsaWZlY3ljbGVcbiAgICogICBdKTtcbiAgICpcbiAgICogICBmZXRjaERhdGEoY29tYmluZWQuc2lnbmFsKTtcbiAgICpcbiAgICogICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpOyAvLyBDbGVhbnVwXG4gICAqIH0sIFtdKTtcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVDb21iaW5lZFNpZ25hbChcbiAgICBzaWduYWxzOiBBcnJheTxBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZD5cbiAgKTogQWJvcnRDb250cm9sbGVyIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykge1xuICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmFib3J0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFib3J0Q29udHJvbGxlciB0aGF0IGF1dG9tYXRpY2FsbHkgYWJvcnRzIGFmdGVyIGEgc3BlY2lmaWVkIHRpbWVvdXQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSB0aW1lLWJhc2VkIGNhbmNlbGxhdGlvbiBtZWNoYW5pc20gdXNlZnVsIGZvciBpbXBsZW1lbnRpbmdcbiAgICogcmVxdWVzdCB0aW1lb3V0cyBhbmQgZGVhZGxpbmVzLiBUaGUgc2lnbmFsIHdpbGwgYXV0b21hdGljYWxseSBhYm9ydCBhZnRlciB0aGVcbiAgICogc3BlY2lmaWVkIGR1cmF0aW9uLCBwcm92aWRpbmcgYSBjb25zaXN0ZW50IHRpbWVvdXQgZXhwZXJpZW5jZS5cbiAgICpcbiAgICogKipBdXRvbWF0aWMgQ2xlYW51cDoqKlxuICAgKiBJZiB0aGUgc2lnbmFsIGlzIGFib3J0ZWQgYnkgb3RoZXIgbWVhbnMgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXMsIHRoZSBpbnRlcm5hbFxuICAgKiBzZXRUaW1lb3V0IGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogKipBYm9ydCBSZWFzb246KipcbiAgICogVGhlIGFib3J0IHJlYXNvbiBpbmNsdWRlcyB0aGUgdGltZW91dCBkdXJhdGlvbiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzOlxuICAgKiBgXCJSZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIge3RpbWVvdXR9bXNcImBcbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgLSBUaW1lb3V0IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgKiBAcmV0dXJucyBBbiBBYm9ydENvbnRyb2xsZXIgdGhhdCB3aWxsIGFib3J0IGFmdGVyIHRoZSB0aW1lb3V0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFNpbXBsZSByZXF1ZXN0IHRpbWVvdXQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbWFuYWdlciA9IG5ldyBTaWduYWxNYW5hZ2VyKCk7XG4gICAqIGNvbnN0IHRpbWVvdXQgPSBtYW5hZ2VyLmNyZWF0ZVRpbWVvdXRTaWduYWwoNTAwMCk7IC8vIDUgc2Vjb25kc1xuICAgKlxuICAgKiB0cnkge1xuICAgKiAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvc2xvdy1lbmRwb2ludCcsIHtcbiAgICogICAgIHNpZ25hbDogdGltZW91dC5zaWduYWxcbiAgICogICB9KTtcbiAgICogICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgKiAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICogICAgIGNvbnNvbGUuZXJyb3IoJ1JlcXVlc3QgdGltZWQgb3V0IGFmdGVyIDUgc2Vjb25kcycpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogRGlmZmVyZW50IHRpbWVvdXRzIGZvciBkaWZmZXJlbnQgb3BlcmF0aW9uczpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaG9ydCB0aW1lb3V0IGZvciBxdWljayBvcGVyYXRpb25zXG4gICAqIGNvbnN0IHF1aWNrVGltZW91dCA9IG1hbmFnZXIuY3JlYXRlVGltZW91dFNpZ25hbCgyMDAwKTtcbiAgICogYXdhaXQgZmV0Y2goJy9hcGkvaGVhbHRoJywgeyBzaWduYWw6IHF1aWNrVGltZW91dC5zaWduYWwgfSk7XG4gICAqXG4gICAqIC8vIExvbmcgdGltZW91dCBmb3IgaGVhdnkgb3BlcmF0aW9uc1xuICAgKiBjb25zdCBsb25nVGltZW91dCA9IG1hbmFnZXIuY3JlYXRlVGltZW91dFNpZ25hbCg2MDAwMCk7XG4gICAqIGF3YWl0IGZldGNoKCcvYXBpL2V4cG9ydCcsIHsgc2lnbmFsOiBsb25nVGltZW91dC5zaWduYWwgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBNYW51YWwgY2FuY2VsbGF0aW9uIGJlZm9yZSB0aW1lb3V0OlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRpbWVvdXQgPSBtYW5hZ2VyLmNyZWF0ZVRpbWVvdXRTaWduYWwoMzAwMDApO1xuICAgKlxuICAgKiAvLyBJZiB1c2VyIGNhbmNlbHMsIHRpbWVvdXQgaXMgYXV0b21hdGljYWxseSBjbGVhbmVkIHVwXG4gICAqIHRpbWVvdXQuYWJvcnQoJ1VzZXIgY2FuY2VsbGVkJyk7XG4gICAqIC8vIEludGVybmFsIHNldFRpbWVvdXQgaXMgY2xlYXJlZCwgbm8gbWVtb3J5IGxlYWtcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVUaW1lb3V0U2lnbmFsKHRpbWVvdXQ6IG51bWJlcik6IEFib3J0Q29udHJvbGxlciB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29udHJvbGxlci5hYm9ydChgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tc2ApO1xuICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgLy8gQ2xlYW4gdXAgdGltZW91dCB3aGVuIHNpZ25hbCBpcyBhYm9ydGVkXG4gICAgY29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdhYm9ydCcsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfSxcbiAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgKTtcblxuICAgIHJldHVybiBjb250cm9sbGVyO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSZXNwb25zZURhdGEgfSBmcm9tICcuLi9Nb2RlbHMnO1xuXG4vKipcbiAqIFBhcnNlcyBIVFRQIHJlc3BvbnNlIGJvZGllcyBpbnRvIGFwcHJvcHJpYXRlIEphdmFTY3JpcHQgdHlwZXMgYmFzZWQgb24gQ29udGVudC1UeXBlIGhlYWRlcnMuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBoYW5kbGVzIHRoZSBjb21wbGV4aXR5IG9mIGNvbnZlcnRpbmcgdmFyaW91cyBIVFRQIHJlc3BvbnNlIGZvcm1hdHNcbiAqIGludG8gdXNhYmxlIEphdmFTY3JpcHQgZGF0YSBzdHJ1Y3R1cmVzLiBJdCBpbnRlbGxpZ2VudGx5IGRldGVjdHMgdGhlIHJlc3BvbnNlIHR5cGVcbiAqIGFuZCBhcHBsaWVzIHRoZSBhcHByb3ByaWF0ZSBwYXJzaW5nIHN0cmF0ZWd5LlxuICpcbiAqIFN1cHBvcnRlZCBDb250ZW50IFR5cGVzOlxuICogLSAqKmFwcGxpY2F0aW9uL2pzb24qKjogUGFyc2VkIGFzIEpTT04gb2JqZWN0cy9hcnJheXNcbiAqIC0gKip0ZXh0LyoqKiAodGV4dC9wbGFpbiwgdGV4dC9odG1sLCBldGMuKTogUmV0dXJuZWQgYXMgc3RyaW5nXG4gKiAtICoqYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtKio6IFJldHVybmVkIGFzIEJsb2IgZm9yIGJpbmFyeSBkYXRhXG4gKiAtICoqVW5rbm93bi9NaXNzaW5nKio6IEF0dGVtcHRzIEpTT04gcGFyc2UsIGZhbGxzIGJhY2sgdG8gdGV4dFxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gKipBdXRvbWF0aWMgRGV0ZWN0aW9uKio6IFVzZXMgQ29udGVudC1UeXBlIGhlYWRlciB0byBkZXRlcm1pbmUgcGFyc2luZyBzdHJhdGVneVxuICogLSAqKkdyYWNlZnVsIEZhbGxiYWNrKio6IEF0dGVtcHRzIEpTT04gcGFyc2luZyBmb3IgdW5rbm93biB0eXBlcywgZmFsbHMgYmFjayB0byB0ZXh0XG4gKiAtICoqQmluYXJ5IFN1cHBvcnQqKjogSGFuZGxlcyBiaW5hcnkgZGF0YSB2aWEgQmxvYlxuICogLSAqKlR5cGUgU2FmZXR5Kio6IFJldHVybnMgdHlwZWQgUmVzcG9uc2VEYXRhIHVuaW9uXG4gKlxuICogQGludGVybmFsIFRoaXMgY2xhc3MgaXMgbm90IGV4cG9ydGVkIGZyb20gdGhlIHB1YmxpYyBBUElcbiAqXG4gKiBAZXhhbXBsZVxuICogUGFyc2luZyBkaWZmZXJlbnQgcmVzcG9uc2UgdHlwZXM6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwYXJzZXIgPSBuZXcgUmVzcG9uc2VQYXJzZXIoKTtcbiAqXG4gKiAvLyBKU09OIHJlc3BvbnNlXG4gKiBjb25zdCBqc29uUmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoJ3tcImlkXCI6IDF9Jywge1xuICogICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICogfSk7XG4gKiBjb25zdCBkYXRhID0gYXdhaXQgcGFyc2VyLnBhcnNlUmVzcG9uc2UoanNvblJlc3BvbnNlKTtcbiAqIC8vID0+IHsgaWQ6IDEgfVxuICpcbiAqIC8vIFRleHQgcmVzcG9uc2VcbiAqIGNvbnN0IHRleHRSZXNwb25zZSA9IG5ldyBSZXNwb25zZSgnSGVsbG8gV29ybGQnLCB7XG4gKiAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyB9XG4gKiB9KTtcbiAqIGNvbnN0IHRleHQgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZSh0ZXh0UmVzcG9uc2UpO1xuICogLy8gPT4gXCJIZWxsbyBXb3JsZFwiXG4gKlxuICogLy8gQmluYXJ5IHJlc3BvbnNlXG4gKiBjb25zdCBibG9iUmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYmluYXJ5RGF0YSwge1xuICogICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9XG4gKiB9KTtcbiAqIGNvbnN0IGJsb2IgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShibG9iUmVzcG9uc2UpO1xuICogLy8gPT4gQmxvYiB7IC4uLiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3BvbnNlUGFyc2VyIHtcbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgSFRUUCByZXNwb25zZSBib2R5IGludG8gYW4gYXBwcm9wcmlhdGUgSmF2YVNjcmlwdCB0eXBlLlxuICAgKlxuICAgKiBUaGUgcGFyc2luZyBzdHJhdGVneSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBDb250ZW50LVR5cGUgaGVhZGVyOlxuICAgKiAxLiAqKkpTT04qKiAoYXBwbGljYXRpb24vanNvbik6IENhbGxzIGByZXNwb25zZS5qc29uKClgXG4gICAqIDIuICoqVGV4dCoqICh0ZXh0LyopOiBDYWxscyBgcmVzcG9uc2UudGV4dCgpYFxuICAgKiAzLiAqKkJpbmFyeSoqIChhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0pOiBDYWxscyBgcmVzcG9uc2UuYmxvYigpYFxuICAgKiA0LiAqKlVua25vd24qKjogUmVhZHMgYXMgdGV4dCwgYXR0ZW1wdHMgSlNPTiBwYXJzZSwgZmFsbHMgYmFjayB0byByYXcgdGV4dFxuICAgKlxuICAgKiAqKkZhbGxiYWNrIEJlaGF2aW9yOioqXG4gICAqIEZvciByZXNwb25zZXMgd2l0aG91dCBhIENvbnRlbnQtVHlwZSBoZWFkZXIgb3Igd2l0aCB1bmtub3duIHR5cGVzLCB0aGUgcGFyc2VyXG4gICAqIGF0dGVtcHRzIHRvIHBhcnNlIGFzIEpTT04gZmlyc3QgKGNvbW1vbiBmb3IgQVBJcyB0aGF0IGRvbid0IHNldCBwcm9wZXIgaGVhZGVycykuXG4gICAqIElmIEpTT04gcGFyc2luZyBmYWlscywgaXQgcmV0dXJucyB0aGUgcmF3IHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIFRoZSBGZXRjaCBBUEkgUmVzcG9uc2Ugb2JqZWN0IHRvIHBhcnNlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBwYXJzZWQgcmVzcG9uc2UgZGF0YVxuICAgKiBAcmV0dXJucyBDYW4gYmU6IEpTT04gb2JqZWN0L2FycmF5LCBzdHJpbmcsIG9yIEJsb2IgZGVwZW5kaW5nIG9uIENvbnRlbnQtVHlwZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBBUEkgcmVzcG9uc2UgcGFyc2luZzpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3VzZXJzJyk7XG4gICAqIGNvbnN0IGRhdGEgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAqXG4gICAqIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICogICBjb25zb2xlLmxvZygnVGV4dCByZXNwb25zZTonLCBkYXRhKTtcbiAgICogfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdCaW5hcnkgcmVzcG9uc2U6JywgZGF0YS5zaXplLCAnYnl0ZXMnKTtcbiAgICogfSBlbHNlIHtcbiAgICogICBjb25zb2xlLmxvZygnSlNPTiByZXNwb25zZTonLCBkYXRhKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogSGFuZGxpbmcgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXM6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ1NWIGZpbGUgZG93bmxvYWRcbiAgICogY29uc3QgY3N2UmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS9leHBvcnQuY3N2Jyk7XG4gICAqIGNvbnN0IGJsb2IgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShjc3ZSZXNwb25zZSk7XG4gICAqIC8vIFJldHVybnMgQmxvYiBmb3IgZG93bmxvYWRcbiAgICpcbiAgICogLy8gSlNPTiBBUElcbiAgICogY29uc3QganNvblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdXNlcnMnKTtcbiAgICogY29uc3QgdXNlcnMgPSBhd2FpdCBwYXJzZXIucGFyc2VSZXNwb25zZShqc29uUmVzcG9uc2UpO1xuICAgKiAvLyBSZXR1cm5zIHBhcnNlZCBKU09OIGFycmF5XG4gICAqXG4gICAqIC8vIFBsYWluIHRleHQgbG9nc1xuICAgKiBjb25zdCBsb2dSZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2xvZ3MnKTtcbiAgICogY29uc3QgbG9ncyA9IGF3YWl0IHBhcnNlci5wYXJzZVJlc3BvbnNlKGxvZ1Jlc3BvbnNlKTtcbiAgICogLy8gUmV0dXJucyBzdHJpbmdcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8UmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG5cbiAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VHlwZT8uaW5jbHVkZXMoJ3RleHQvJykpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VHlwZT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcnkgSlNPTiBmaXJzdCwgZmFsbGJhY2sgdG8gdGV4dFxuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBRdWVyeVBhcmFtcyB9IGZyb20gJy4uL01vZGVscyc7XG5cbi8qKlxuICogQ29uc3RydWN0cyBmdWxseS1xdWFsaWZpZWQgVVJMcyB3aXRoIHByb3BlciBxdWVyeSBwYXJhbWV0ZXIgZW5jb2RpbmcuXG4gKlxuICogVGhpcyBpbnRlcm5hbCBjbGFzcyBoYW5kbGVzIHRoZSBjb21wbGV4aXR5IG9mIFVSTCBjb25zdHJ1Y3Rpb24sIGNvbWJpbmluZ1xuICogYmFzZSBVUkxzLCBlbmRwb2ludHMsIGFuZCBxdWVyeSBwYXJhbWV0ZXJzIHdpdGggcHJvcGVyIGVuY29kaW5nIGFuZCBhcnJheVxuICogaGFuZGxpbmcuIEl0IHVzZXMgdGhlIG5hdGl2ZSBVUkwgQVBJIGZvciByZWxpYWJsZSBVUkwgY29tcG9zaXRpb24uXG4gKlxuICogS2V5IEZlYXR1cmVzOlxuICogLSAqKlVSTCBDb21wb3NpdGlvbioqOiBTYWZlbHkgY29tYmluZXMgYmFzZSBVUkwgYW5kIGVuZHBvaW50IHBhdGhzXG4gKiAtICoqUXVlcnkgUGFyYW1ldGVyIEVuY29kaW5nKio6IEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzcGVjaWFsIGNoYXJhY3RlcnNcbiAqIC0gKipBcnJheSBTdXBwb3J0Kio6IEhhbmRsZXMgYXJyYXkgcGFyYW1ldGVycyB3aXRoIG11bHRpcGxlIHZhbHVlc1xuICogLSAqKk51bGwvVW5kZWZpbmVkIEZpbHRlcmluZyoqOiBBdXRvbWF0aWNhbGx5IHNraXBzIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICogLSAqKlR5cGUgU2FmZXR5Kio6IFN0cm9uZ2x5IHR5cGVkIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXNcbiAqXG4gKiBBcnJheSBIYW5kbGluZzpcbiAqIEFycmF5IHBhcmFtZXRlcnMgYXJlIHNlcmlhbGl6ZWQgYnkgYXBwZW5kaW5nIHRoZSBzYW1lIGtleSBtdWx0aXBsZSB0aW1lczpcbiAqIGA/dGFncz1qYXZhc2NyaXB0JnRhZ3M9dHlwZXNjcmlwdCZ0YWdzPXJlYWN0YFxuICpcbiAqIEBpbnRlcm5hbCBUaGlzIGNsYXNzIGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBwdWJsaWMgQVBJXG4gKlxuICogQGV4YW1wbGVcbiAqIEJ1aWxkaW5nIFVSTHMgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzOlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYnVpbGRlciA9IG5ldyBVcmxCdWlsZGVyKCk7XG4gKlxuICogY29uc3QgdXJsID0gYnVpbGRlci5idWlsZFVSTChcbiAqICAgJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyxcbiAqICAgJy91c2VycycsXG4gKiAgIHsgYWN0aXZlOiB0cnVlLCByb2xlOiAnYWRtaW4nLCBwYWdlOiAxIH1cbiAqICk7XG4gKiAvLyA9PiBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzP2FjdGl2ZT10cnVlJnJvbGU9YWRtaW4mcGFnZT0xXCJcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVXJsQnVpbGRlciB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBjb21wbGV0ZSBVUkwgYnkgY29tYmluaW5nIGJhc2UgVVJMLCBlbmRwb2ludCwgYW5kIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIFRoZSBVUkwgY29uc3RydWN0aW9uIHByb2Nlc3M6XG4gICAqIDEuIENvbWJpbmVzIGBiYXNlVVJMYCBhbmQgYGVuZHBvaW50YCB1c2luZyBVUkwgQVBJXG4gICAqIDIuIEl0ZXJhdGVzIHRocm91Z2ggcXVlcnkgcGFyYW1ldGVyc1xuICAgKiAzLiBTa2lwcyBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICogNC4gSGFuZGxlcyBhcnJheXMgYnkgYXBwZW5kaW5nIG11bHRpcGxlIHZhbHVlcyB3aXRoIHNhbWUga2V5XG4gICAqIDUuIENvbnZlcnRzIGFsbCB2YWx1ZXMgdG8gc3RyaW5nc1xuICAgKiA2LiBSZXR1cm5zIGZ1bGx5LXF1YWxpZmllZCBVUkwgc3RyaW5nXG4gICAqXG4gICAqICoqUGF0aCBIYW5kbGluZzoqKlxuICAgKiBUaGUgZW5kcG9pbnQgY2FuIGJlIGVpdGhlciByZWxhdGl2ZSBvciBhYnNvbHV0ZTpcbiAgICogLSBSZWxhdGl2ZTogYC91c2Vyc2AgXHUyMTkyIENvbWJpbmVkIHdpdGggYmFzZVVSTFxuICAgKiAtIEFic29sdXRlOiBgaHR0cHM6Ly9vdGhlci1hcGkuY29tL3VzZXJzYCBcdTIxOTIgVXNlcyBhYnNvbHV0ZSBVUkxcbiAgICpcbiAgICogKipFbmNvZGluZzoqKlxuICAgKiBBbGwgcGFyYW1ldGVyIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSBVUkwtZW5jb2RlZCBieSB0aGUgVVJMIEFQSSxcbiAgICogc28gc3BlY2lhbCBjaGFyYWN0ZXJzIChzcGFjZXMsICYsID0sIGV0Yy4pIGFyZSBzYWZlbHkgaGFuZGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGJhc2VVUkwgLSBCYXNlIFVSTCBmb3IgdGhlIEFQSSAoZS5nLiwgJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJylcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQVBJIGVuZHBvaW50IHBhdGggcmVsYXRpdmUgdG8gYmFzZVVSTCAoZS5nLiwgJy91c2Vycy8xMjMnKVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyBhcyBrZXktdmFsdWUgcGFpcnNcbiAgICogQHJldHVybnMgVGhlIGZ1bGx5LXF1YWxpZmllZCBVUkwgc3RyaW5nIHdpdGggZW5jb2RlZCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIEJhc2ljIFVSTCBjb25zdHJ1Y3Rpb246XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXJsID0gYnVpbGRlci5idWlsZFVSTChcbiAgICogICAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICAgKiAgICcvc2VhcmNoJyxcbiAgICogICB7IHE6ICdoZWxsbyB3b3JsZCcsIGxpbWl0OiAxMCB9XG4gICAqICk7XG4gICAqIC8vID0+IFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vc2VhcmNoP3E9aGVsbG8rd29ybGQmbGltaXQ9MTBcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogQXJyYXkgcGFyYW1ldGVyczpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1cmwgPSBidWlsZGVyLmJ1aWxkVVJMKFxuICAgKiAgICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gICAqICAgJy9wb3N0cycsXG4gICAqICAgeyB0YWdzOiBbJ2phdmFzY3JpcHQnLCAndHlwZXNjcmlwdCcsICdyZWFjdCddIH1cbiAgICogKTtcbiAgICogLy8gPT4gXCJodHRwczovL2FwaS5leGFtcGxlLmNvbS9wb3N0cz90YWdzPWphdmFzY3JpcHQmdGFncz10eXBlc2NyaXB0JnRhZ3M9cmVhY3RcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogTnVsbC91bmRlZmluZWQgaGFuZGxpbmc6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXJsID0gYnVpbGRlci5idWlsZFVSTChcbiAgICogICAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICAgKiAgICcvdXNlcnMnLFxuICAgKiAgIHtcbiAgICogICAgIG5hbWU6ICdKb2huJyxcbiAgICogICAgIGFnZTogbnVsbCwgICAgICAgIC8vIFNraXBwZWRcbiAgICogICAgIGVtYWlsOiB1bmRlZmluZWQgIC8vIFNraXBwZWRcbiAgICogICB9XG4gICAqICk7XG4gICAqIC8vID0+IFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnM/bmFtZT1Kb2huXCJcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFNwZWNpYWwgY2hhcmFjdGVycyBlbmNvZGluZzpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1cmwgPSBidWlsZGVyLmJ1aWxkVVJMKFxuICAgKiAgICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXG4gICAqICAgJy9zZWFyY2gnLFxuICAgKiAgIHsgcTogJ2ZvbyAmIGJhcicsIGNhdGVnb3J5OiAnY29kZS9leGFtcGxlcycgfVxuICAgKiApO1xuICAgKiAvLyA9PiBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3NlYXJjaD9xPWZvbyslMjYrYmFyJmNhdGVnb3J5PWNvZGUlMkZleGFtcGxlc1wiXG4gICAqIGBgYFxuICAgKi9cbiAgYnVpbGRVUkwoYmFzZVVSTDogc3RyaW5nLCBlbmRwb2ludDogc3RyaW5nLCBwYXJhbXM/OiBRdWVyeVBhcmFtcyk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChlbmRwb2ludCwgYmFzZVVSTCk7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbXNba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCh2ID0+IHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHYpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQgfSBmcm9tICcuL0NvcnJlbGF0aW9uSWRHZW5lcmF0b3InO1xuaW1wb3J0IHsgRXJyb3JOb3JtYWxpemVyIH0gZnJvbSAnLi9FcnJvcnMvRXJyb3JOb3JtYWxpemVyJztcbmltcG9ydCB7IEludGVyY2VwdG9yTWFuYWdlciB9IGZyb20gJy4vSW50ZXJjZXB0b3JzL0ludGVyY2VwdG9yTWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7XG4gIExpc3RSZXNwb25zZSxcbiAgUG9zdE1vZGVsLFxuICBRdWVyeVBhcmFtcyxcbiAgUmVzcG9uc2VEYXRhLFxufSBmcm9tICcuL01vZGVscyc7XG5pbXBvcnQgeyBSZXF1ZXN0TWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdE1hbmFnZXInO1xuaW1wb3J0IHsgUmV0cnlIYW5kbGVyIH0gZnJvbSAnLi9SZXRyeS9SZXRyeUhhbmRsZXInO1xuaW1wb3J0IHsgU2lnbmFsTWFuYWdlciB9IGZyb20gJy4vU2lnbmFscy9TaWduYWxNYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgQXBpRXJyb3IgfSBmcm9tICcuL3R5cGVzL0FwaUVycm9yJztcbmltcG9ydCB0eXBlIHsgRXJyb3JJbnRlcmNlcHRvciB9IGZyb20gJy4vdHlwZXMvRXJyb3JJbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IEVycm9yUmVzcG9uc2VEYXRhIH0gZnJvbSAnLi90eXBlcy9FcnJvclJlc3BvbnNlRGF0YSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb25maWcgfSBmcm9tICcuL3R5cGVzL1JlcXVlc3RDb25maWcnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW50ZXJjZXB0b3IgfSBmcm9tICcuL3R5cGVzL1JlcXVlc3RJbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tICcuL3R5cGVzL1Jlc3BvbnNlSW50ZXJjZXB0b3InO1xuaW1wb3J0IHsgUmVzcG9uc2VQYXJzZXIgfSBmcm9tICcuL1V0aWxzL1Jlc3BvbnNlUGFyc2VyJztcbmltcG9ydCB7IFVybEJ1aWxkZXIgfSBmcm9tICcuL1V0aWxzL1VybEJ1aWxkZXInO1xuXG5pbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnQC90eXBlcyc7XG5cbi8qKlxuICogRW50ZXJwcmlzZS1ncmFkZSBBUEkgY2xpZW50IHdpdGggYWR2YW5jZWQgZmVhdHVyZXMgZm9yIHByb2R1Y3Rpb24gYXBwbGljYXRpb25zLlxuICpcbiAqIFRoaXMgY2xpZW50IHByb3ZpZGVzIGEgcm9idXN0LCB0eXBlLXNhZmUgYWJzdHJhY3Rpb24gb3ZlciB0aGUgRmV0Y2ggQVBJIHdpdGg6XG4gKiAtIENvbXByZWhlbnNpdmUgcmVxdWVzdC9yZXNwb25zZS9lcnJvciBpbnRlcmNlcHRvciBzeXN0ZW1cbiAqIC0gQXV0b21hdGljIHJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICogLSBSZXF1ZXN0IGNvcnJlbGF0aW9uIElEIHRyYWNraW5nIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nXG4gKiAtIFRva2VuLWJhc2VkIGF1dGhlbnRpY2F0aW9uIHdpdGggYXV0b21hdGljIGhlYWRlciBpbmplY3Rpb25cbiAqIC0gUmVxdWVzdCBjYW5jZWxsYXRpb24gYW5kIHRpbWVvdXQgbWFuYWdlbWVudFxuICogLSBUeXBlLXNhZmUgZXJyb3IgaGFuZGxpbmcgd2l0aCBzdHJ1Y3R1cmVkIGVycm9yIHJlc3BvbnNlc1xuICogLSBSZWFjdCBRdWVyeSBpbnRlZ3JhdGlvbiBzdXBwb3J0XG4gKlxuICogQXJjaGl0ZWN0dXJlIFByaW5jaXBsZXM6XG4gKiAtICoqVHlwZSBTYWZldHkqKjogRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSB3aXRoIG5vIGBhbnlgIHR5cGVzXG4gKiAtICoqRXh0ZW5zaWJpbGl0eSoqOiBJbnRlcmNlcHRvciBwYXR0ZXJuIGFsbG93cyBmb3IgZmxleGlibGUgbWlkZGxld2FyZVxuICogLSAqKk9ic2VydmFiaWxpdHkqKjogQnVpbHQtaW4gY29ycmVsYXRpb24gSURzIGZvciByZXF1ZXN0IHRyYWNpbmdcbiAqIC0gKipSZXNpbGllbmNlKio6IEF1dG9tYXRpYyByZXRyaWVzLCB0aW1lb3V0cywgYW5kIGdyYWNlZnVsIGVycm9yIGhhbmRsaW5nXG4gKiAtICoqUGVyZm9ybWFuY2UqKjogUmVxdWVzdCBkZWR1cGxpY2F0aW9uIGFuZCBjYW5jZWxsYXRpb24gc3VwcG9ydFxuICogLSAqKk1vZHVsYXJpdHkqKjogT3JnYW5pemVkIGludG8gZm9jdXNlZCwgc2luZ2xlLXJlc3BvbnNpYmlsaXR5IG1vZHVsZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KCdodHRwczovL2FwaS5leGFtcGxlLmNvbScsIDMwMDAwKTtcbiAqIGNsaWVudC5zZXRBdXRoVG9rZW4oJ3lvdXItand0LXRva2VuJyk7XG4gKlxuICogLy8gVHlwZS1zYWZlIEdFVCByZXF1ZXN0XG4gKiBjb25zdCB7IGFwaURhdGEsIGVycm9yIH0gPSBhd2FpdCBjbGllbnQuZ2V0PFVzZXI+KCcvdXNlcnMvMTIzJyk7XG4gKiBpZiAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIHVzZXI6JywgZXJyb3IpO1xuICogfSBlbHNlIHtcbiAqICAgY29uc29sZS5sb2coJ1VzZXIgZGF0YTonLCBkYXRhKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIFJlYWN0IFF1ZXJ5OlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnQoKTtcbiAqIGNvbnN0IGFwaUNsaWVudCA9IG5ldyBBcGlDbGllbnQocHJvY2Vzcy5lbnYuQVBJX0JBU0VfVVJMKTtcbiAqXG4gKiAvLyBBZGQgbG9nZ2luZyBpbnRlcmNlcHRvclxuICogYXBpQ2xpZW50LmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdSZXNwb25zZSByZWNlaXZlZDonLCByZXNwb25zZSk7XG4gKiAgIHJldHVybiByZXNwb25zZTtcbiAqIH0pO1xuICpcbiAqIC8vIFVzZSBpbiBxdWVyaWVzXG4gKiBjb25zdCB7IGFwaURhdGEgfSA9IHVzZVF1ZXJ5KHtcbiAqICAgcXVlcnlLZXk6IFsndXNlcnMnLCB1c2VySWRdLFxuICogICBxdWVyeUZuOiAoKSA9PiBhcGlDbGllbnQuZ2V0PFVzZXI+KGAvdXNlcnMvJHt1c2VySWR9YClcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gT3B0aW9uIDE6IEVycm9ycyB0aHJvd24gKGRlZmF1bHQpXG4gKiB0cnkge1xuICogICBjb25zdCB7IGFwaURhdGEgfSA9IGF3YWl0IGNsaWVudC5nZXQ8VXNlcj4oJy91c2Vycy8xMjMnKTtcbiAqICAgY29uc29sZS5sb2coZGF0YSk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAqICAgICBjb25zb2xlLmxvZygnVXNlciBub3QgZm91bmQnKTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIE9wdGlvbiAyOiBFcnJvcnMgcmV0dXJuZWQgaW4gcmVzcG9uc2VcbiAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5nZXQ8VXNlcj4oJy91c2Vycy8xMjMnLCB7XG4gKiAgIHRocm93RXJyb3JzOiBmYWxzZVxuICogfSk7XG4gKiBpZiAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignUmVxdWVzdCBmYWlsZWQ6JywgZXJyb3IpO1xuICogfVxuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVVJMOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFRpbWVvdXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmNlcHRvck1hbmFnZXI6IEludGVyY2VwdG9yTWFuYWdlciA9XG4gICAgbmV3IEludGVyY2VwdG9yTWFuYWdlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbE1hbmFnZXI6IFNpZ25hbE1hbmFnZXIgPSBuZXcgU2lnbmFsTWFuYWdlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yTm9ybWFsaXplcjogRXJyb3JOb3JtYWxpemVyID0gbmV3IEVycm9yTm9ybWFsaXplcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlUGFyc2VyOiBSZXNwb25zZVBhcnNlciA9IG5ldyBSZXNwb25zZVBhcnNlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVybEJ1aWxkZXI6IFVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJldHJ5SGFuZGxlcjogUmV0cnlIYW5kbGVyID0gbmV3IFJldHJ5SGFuZGxlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlciA9IG5ldyBSZXF1ZXN0TWFuYWdlcigpO1xuICBwcml2YXRlIGF1dGhUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ycmVsYXRpb25JZFByZWZpeDogc3RyaW5nID0gJ2FwaSc7XG4gIHByaXZhdGUgaW5jbHVkZUNvcnJlbGF0aW9uSWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEFQSSBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIGJhc2VVUkwgLSBCYXNlIFVSTCBmb3IgYWxsIEFQSSByZXF1ZXN0cyAoZGVmYXVsdDogZW1wdHkgc3RyaW5nIGZvciByZWxhdGl2ZSBVUkxzKVxuICAgKiBAcGFyYW0gZGVmYXVsdFRpbWVvdXQgLSBEZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDMwMDAwKVxuICAgKi9cbiAgY29uc3RydWN0b3IoYmFzZVVSTDogc3RyaW5nID0gJycsIGRlZmF1bHRUaW1lb3V0OiBudW1iZXIgPSAzMDAwMCkge1xuICAgIHRoaXMuYmFzZVVSTCA9IGJhc2VVUkw7XG4gICAgdGhpcy5kZWZhdWx0VGltZW91dCA9IGRlZmF1bHRUaW1lb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByZWZpeCBmb3IgYXV0by1nZW5lcmF0ZWQgY29ycmVsYXRpb24gSURzXG4gICAqIEBwYXJhbSBwcmVmaXggLSBUaGUgcHJlZml4IHRvIHVzZSBmb3IgY29ycmVsYXRpb24gSURzIChlLmcuLCAnYXBpJywgJ3dlYicsICdtb2JpbGUnKVxuICAgKi9cbiAgc2V0Q29ycmVsYXRpb25JZFByZWZpeChwcmVmaXg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29ycmVsYXRpb25JZFByZWZpeCA9IHByZWZpeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG9tYXRpYyBjb3JyZWxhdGlvbiBJRCBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gV2hldGhlciB0byBpbmNsdWRlIGNvcnJlbGF0aW9uIElEcyBpbiByZXF1ZXN0c1xuICAgKi9cbiAgc2V0SW5jbHVkZUNvcnJlbGF0aW9uSWQoaW5jbHVkZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW5jbHVkZUNvcnJlbGF0aW9uSWQgPSBpbmNsdWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHJlcXVlc3QgaW50ZXJjZXB0b3IgdG8gbW9kaWZ5IHJlcXVlc3RzIGJlZm9yZSB0aGV5J3JlIHNlbnRcbiAgICogQHBhcmFtIGludGVyY2VwdG9yIC0gRnVuY3Rpb24gdG8gaW50ZXJjZXB0IGFuZCBwb3RlbnRpYWxseSBtb2RpZnkgcmVxdWVzdCBjb25maWdcbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdW5yZWdpc3RlciA9IGNsaWVudC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgKiAgIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwgbmV3IEhlYWRlcnMoKTtcbiAgICogICBjb25maWcuaGVhZGVycy5zZXQoJ1gtQ2xpZW50LVZlcnNpb24nLCAnMS4wLjAnKTtcbiAgICogICByZXR1cm4gY29uZmlnO1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTGF0ZXIsIHRvIHJlbW92ZSB0aGUgaW50ZXJjZXB0b3I6XG4gICAqIHVucmVnaXN0ZXIoKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3I6IFJlcXVlc3RJbnRlcmNlcHRvcik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHJlc3BvbnNlIGludGVyY2VwdG9yIHRvIG1vZGlmeSByZXNwb25zZXMgYmVmb3JlIHRoZXkncmUgcmV0dXJuZWRcbiAgICogQHBhcmFtIGludGVyY2VwdG9yIC0gRnVuY3Rpb24gdG8gaW50ZXJjZXB0IGFuZCBwb3RlbnRpYWxseSBtb2RpZnkgcmVzcG9uc2VzXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgdGhpcyBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgKiAgIC8vIFRyYW5zZm9ybSBkYXRhIGZvcm1hdFxuICAgKiAgIGlmIChyZXNwb25zZS5hcGlEYXRhKSB7XG4gICAqICAgICByZXNwb25zZS5hcGlEYXRhID0gY2FtZWxDYXNlS2V5cyhyZXNwb25zZS5hcGlEYXRhKTtcbiAgICogICB9XG4gICAqICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yOiBSZXNwb25zZUludGVyY2VwdG9yKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciBpbnRlcmNlcHRvciB0byBoYW5kbGUgb3IgdHJhbnNmb3JtIGVycm9yc1xuICAgKiBAcGFyYW0gaW50ZXJjZXB0b3IgLSBGdW5jdGlvbiB0byBpbnRlcmNlcHQgYW5kIHBvdGVudGlhbGx5IG1vZGlmeSBlcnJvcnNcbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGlzIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xpZW50LmFkZEVycm9ySW50ZXJjZXB0b3IoYXN5bmMgKGVycm9yKSA9PiB7XG4gICAqICAgLy8gTG9nIGVycm9ycyB0byBtb25pdG9yaW5nIHNlcnZpY2VcbiAgICogICBpZiAoZXJyb3Iuc3RhdHVzID49IDUwMCkge1xuICAgKiAgICAgYXdhaXQgbW9uaXRvcmluZ1NlcnZpY2UubG9nRXJyb3IoZXJyb3IpO1xuICAgKiAgIH1cbiAgICogICByZXR1cm4gZXJyb3I7IC8vIFJlLXRocm93IHRoZSBlcnJvclxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yOiBFcnJvckludGVyY2VwdG9yKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFkZEVycm9ySW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvciBzdWJzZXF1ZW50IHJlcXVlc3RzXG4gICAqIEBwYXJhbSB0b2tlbiAtIEpXVCB0b2tlbiBvciBudWxsIHRvIGNsZWFyIGF1dGhlbnRpY2F0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2V0IHRva2VuIGFmdGVyIGxvZ2luXG4gICAqIGNsaWVudC5zZXRBdXRoVG9rZW4obG9naW5SZXNwb25zZS5hY2Nlc3NUb2tlbik7XG4gICAqXG4gICAqIC8vIENsZWFyIHRva2VuIG9uIGxvZ291dFxuICAgKiBjbGllbnQuc2V0QXV0aFRva2VuKG51bGwpO1xuICAgKiBgYGBcbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aFRva2VuID0gdG9rZW47XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGF1dGggdG9rZW4gb3IgbnVsbCBpZiBub3Qgc2V0XG4gICAqL1xuICBnZXRBdXRoVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYSBzcGVjaWZpYyByZXF1ZXN0IGJ5IGl0cyBrZXlcbiAgICogQHBhcmFtIGtleSAtIFRoZSB1bmlxdWUga2V5IGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0IHRvIGNhbmNlbFxuICAgKi9cbiAgY2FuY2VsUmVxdWVzdChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdE1hbmFnZXIuY2FuY2VsKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhbGwgcGVuZGluZyByZXF1ZXN0c1xuICAgKiBVc2VmdWwgZm9yIGNsZWFudXAgb24gbmF2aWdhdGlvbiBvciBjb21wb25lbnQgdW5tb3VudFxuICAgKi9cbiAgY2FuY2VsQWxsUmVxdWVzdHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0TWFuYWdlci5jYW5jZWxBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIHJlcXVlc3QgbWV0aG9kIHRoYXQgaGFuZGxlcyBhbGwgSFRUUCBvcGVyYXRpb25zXG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnQgcmVsYXRpdmUgdG8gYmFzZVVSTFxuICAgKiBAcGFyYW0gY29uZmlnIC0gUmVxdWVzdCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gQXBpUmVzcG9uc2Ugd2l0aCBkYXRhIG9yIGVycm9yXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucmVxdWVzdDxVc2VyPignL3VzZXJzLzEyMycsIHtcbiAgICogICBtZXRob2Q6ICdHRVQnLFxuICAgKiAgIHRpbWVvdXQ6IDUwMDAsXG4gICAqICAgdGhyb3dFcnJvcnM6IGZhbHNlXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlcXVlc3Q8VCA9IFJlc3BvbnNlRGF0YT4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fVxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPj4ge1xuICAgIC8vIEdlbmVyYXRlIGNvcnJlbGF0aW9uIElEXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9XG4gICAgICBjb25maWcuY29ycmVsYXRpb25JZCB8fFxuICAgICAgKCFjb25maWcuc2tpcENvcnJlbGF0aW9uSWQgJiYgdGhpcy5pbmNsdWRlQ29ycmVsYXRpb25JZFxuICAgICAgICA/IGdlbmVyYXRlQ29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWRQcmVmaXgpXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICAvLyBHZW5lcmF0ZSByZXF1ZXN0IGtleSBmb3IgdHJhY2tpbmdcbiAgICBjb25zdCByZXF1ZXN0S2V5ID0gYCR7Y29uZmlnLm1ldGhvZCB8fCAnR0VUJ31fJHtlbmRwb2ludH1fJHtEYXRlLm5vdygpfWA7XG5cbiAgICAvLyBDcmVhdGUgbWFzdGVyIGNvbnRyb2xsZXIgZm9yIHRoaXMgcmVxdWVzdFxuICAgIGNvbnN0IG1hc3RlckNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ29tYmluZSBhbGwgYWJvcnQgc2lnbmFsc1xuICAgICAgY29uc3Qgc2lnbmFsczogQXJyYXk8QWJvcnRTaWduYWwgfCB1bmRlZmluZWQ+ID0gW1xuICAgICAgICBjb25maWcuc2lnbmFsLFxuICAgICAgICBjb25maWcuY2FuY2VsVG9rZW4/LnNpZ25hbCxcbiAgICAgICAgbWFzdGVyQ29udHJvbGxlci5zaWduYWwsXG4gICAgICBdO1xuXG4gICAgICAvLyBBZGQgdGltZW91dCBzaWduYWwgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdGltZW91dCA9IGNvbmZpZy50aW1lb3V0IHx8IHRoaXMuZGVmYXVsdFRpbWVvdXQ7XG4gICAgICBjb25zdCB0aW1lb3V0Q29udHJvbGxlciA9IHRoaXMuc2lnbmFsTWFuYWdlci5jcmVhdGVUaW1lb3V0U2lnbmFsKHRpbWVvdXQpO1xuXG4gICAgICBzaWduYWxzLnB1c2godGltZW91dENvbnRyb2xsZXIuc2lnbmFsKTtcblxuICAgICAgLy8gQ3JlYXRlIGNvbWJpbmVkIHNpZ25hbFxuICAgICAgY29uc3QgY29tYmluZWRDb250cm9sbGVyID1cbiAgICAgICAgdGhpcy5zaWduYWxNYW5hZ2VyLmNyZWF0ZUNvbWJpbmVkU2lnbmFsKHNpZ25hbHMpO1xuXG4gICAgICAvLyBUcmFjayB0aGlzIHJlcXVlc3RcbiAgICAgIGlmIChjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdE1hbmFnZXIuYWRkKHJlcXVlc3RLZXksIG1hc3RlckNvbnRyb2xsZXIsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSByZXF1ZXN0IGludGVyY2VwdG9yc1xuICAgICAgY29uc3QgZmluYWxDb25maWcgPVxuICAgICAgICBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hcHBseVJlcXVlc3RJbnRlcmNlcHRvcnMoe1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBzaWduYWw6IGNvbWJpbmVkQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEJ1aWxkIGZ1bGwgVVJMXG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnVybEJ1aWxkZXIuYnVpbGRVUkwoXG4gICAgICAgIHRoaXMuYmFzZVVSTCxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLnBhcmFtcyBhcyBRdWVyeVBhcmFtc1xuICAgICAgKTtcblxuICAgICAgLy8gQWRkIGRlZmF1bHQgaGVhZGVyc1xuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGZpbmFsQ29uZmlnLmhlYWRlcnMpO1xuXG4gICAgICAvLyBBZGQgY29ycmVsYXRpb24gSUQgaGVhZGVyXG4gICAgICBpZiAoY29ycmVsYXRpb25JZCkge1xuICAgICAgICBoZWFkZXJzLnNldCgnWC1Db3JyZWxhdGlvbi1JZCcsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBoZWFkZXJzLnNldCgnWC1SZXF1ZXN0LUlkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBhdXRoIGhlYWRlciBpZiB0b2tlbiBleGlzdHNcbiAgICAgIGlmICh0aGlzLmF1dGhUb2tlbiAmJiAhZmluYWxDb25maWcuc2tpcEF1dGhSZWZyZXNoKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke3RoaXMuYXV0aFRva2VufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgY29udGVudC10eXBlIGZvciBKU09OIHBheWxvYWRzXG5cbiAgICAgIGxldCBmZXRjaEJvZHk6IEJvZHlJbml0IHwgbnVsbCB8IHVuZGVmaW5lZCA9IGZpbmFsQ29uZmlnLmJvZHkgYXNcbiAgICAgICAgfCBCb2R5SW5pdFxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZmluYWxDb25maWcuYm9keSAmJlxuICAgICAgICB0eXBlb2YgZmluYWxDb25maWcuYm9keSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIShmaW5hbENvbmZpZy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpICYmXG4gICAgICAgICEoZmluYWxDb25maWcuYm9keSBpbnN0YW5jZW9mIEJsb2IpICYmXG4gICAgICAgICEoZmluYWxDb25maWcuYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSAmJlxuICAgICAgICAhKGZpbmFsQ29uZmlnLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpICYmXG4gICAgICAgICEoZmluYWxDb25maWcuYm9keSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKVxuICAgICAgKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICBmZXRjaEJvZHkgPSBKU09OLnN0cmluZ2lmeShmaW5hbENvbmZpZy5ib2R5KTtcbiAgICAgIH1cblxuICAgICAgZmluYWxDb25maWcuaGVhZGVycyA9IGhlYWRlcnM7XG5cbiAgICAgIC8vIENyZWF0ZSBmZXRjaCBwcm9taXNlXG4gICAgICBjb25zdCBmZXRjaFByb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxULCBBcGlFcnJvcj4+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgLi4uZmluYWxDb25maWcsXG4gICAgICAgICAgICBib2R5OiBmZXRjaEJvZHksXG4gICAgICAgICAgICBzaWduYWw6IGNvbWJpbmVkQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgfSBhcyBSZXF1ZXN0SW5pdCk7XG5cbiAgICAgICAgICAvLyBQYXJzZSByZXNwb25zZSBkYXRhXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzcG9uc2VQYXJzZXIucGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgLy8gQ2FzdCB0byBFcnJvclJlc3BvbnNlRGF0YSBmb3Igc3RydWN0dXJlZCBlcnJvciByZXNwb25zZXMgZnJvbSBiYWNrZW5kXG4gICAgICAgICAgICBjb25zdCBlcnJvckRhdGEgPSByZXNwb25zZURhdGEgYXMgRXJyb3JSZXNwb25zZURhdGE7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yOiBBcGlFcnJvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBlcnJvckRhdGEudGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgIGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWBcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6XG4gICAgICAgICAgICAgICAgICBlcnJvckRhdGEudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck5vcm1hbGl6ZXIuZ2V0RXJyb3JUeXBlKHJlc3BvbnNlLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgdGl0bGU6XG4gICAgICAgICAgICAgICAgICBlcnJvckRhdGEudGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JOb3JtYWxpemVyLmdldEVycm9yVGl0bGUocmVzcG9uc2Uuc3RhdHVzKSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFjZUlkOiBlcnJvckRhdGEudHJhY2VJZCB8fCBjb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGVycm9yczogZXJyb3JEYXRhLmVycm9ycyxcbiAgICAgICAgICAgICAgICBpc0Fib3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogZmluYWxDb25maWcsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB0aHJvdyBvciByZXR1cm4gZXJyb3IgaW4gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZy50aHJvd0Vycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IgaW4gQXBpUmVzcG9uc2UuZXJyb3IgZmllbGRcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFwcGx5UmVzcG9uc2VJbnRlcmNlcHRvcnMoe1xuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICB9IGFzIEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9ybWF0IHN1Y2Nlc3NmdWwgcmVzcG9uc2VcbiAgICAgICAgICBjb25zdCBhcGlSZXNwb25zZTogQXBpUmVzcG9uc2U8VD4gPSB7XG4gICAgICAgICAgICBkYXRhOiByZXNwb25zZURhdGEgYXMgVCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQXBwbHkgcmVzcG9uc2UgaW50ZXJjZXB0b3JzXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLmFwcGx5UmVzcG9uc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgICAgICBhcGlSZXNwb25zZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGFib3J0IGVycm9yc1xuICAgICAgICAgIGlmICgoZXJyb3IgYXMgRXJyb3IpLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIG5ldyBFcnJvcigoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgfHwgJ1JlcXVlc3QgYWJvcnRlZCcpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JlcXVlc3RfY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1JlcXVlc3Qgd2FzIGNhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgICAgICAgIHRyYWNlSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgaXNBYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogZmluYWxDb25maWcsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB0aHJvdyBvciByZXR1cm4gZXJyb3IgaW4gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZy50aHJvd0Vycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgYWJvcnRFcnJvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFJldHVybiBlcnJvciBpbiBBcGlSZXNwb25zZS5lcnJvciBmaWVsZFxuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIuYXBwbHlSZXNwb25zZUludGVyY2VwdG9ycyh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGFib3J0RXJyb3IsXG4gICAgICAgICAgICAgIH0gYXMgQXBpUmVzcG9uc2U8VCwgQXBpRXJyb3I+KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gSGFuZGxlIHJldHJpZXMgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKGZpbmFsQ29uZmlnLnJldHJpZXMgJiYgZmluYWxDb25maWcucmV0cmllcyA+IDApIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmV0cnlIYW5kbGVyLnJldHJ5UmVxdWVzdChcbiAgICAgICAgICBmZXRjaFByb21pc2UsXG4gICAgICAgICAgZmluYWxDb25maWcucmV0cmllcyxcbiAgICAgICAgICBmaW5hbENvbmZpZy5yZXRyeURlbGF5IHx8IDEwMDAsXG4gICAgICAgICAgY29tYmluZWRDb250cm9sbGVyLnNpZ25hbFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgZmV0Y2hQcm9taXNlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgIGNvbnN0IGFwaUVycm9yOiBBcGlFcnJvciA9IHRoaXMuZXJyb3JOb3JtYWxpemVyLm5vcm1hbGl6ZUVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBjb3JyZWxhdGlvbklkXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgdGhyb3cgb3IgcmV0dXJuIGVycm9yIGluIHJlc3BvbnNlXG4gICAgICBpZiAoY29uZmlnLnRocm93RXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hcHBseUVycm9ySW50ZXJjZXB0b3JzKGFwaUVycm9yKTtcbiAgICAgICAgLy8gVGhpcyBsaW5lIHdpbGwgbmV2ZXIgYmUgcmVhY2hlZCBhcyBhcHBseUVycm9ySW50ZXJjZXB0b3JzIGFsd2F5cyB0aHJvd3MsXG4gICAgICAgIC8vIGJ1dCBUeXBlU2NyaXB0IHJlcXVpcmVzIGEgcmV0dXJuIHN0YXRlbWVudFxuICAgICAgICB0aHJvdyBhcGlFcnJvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldHVybiBlcnJvciBpbiBBcGlSZXNwb25zZS5lcnJvciBmaWVsZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiBhcGlFcnJvcixcbiAgICAgICAgfSBhcyBBcGlSZXNwb25zZTxULCBBcGlFcnJvcj47XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3QgdHJhY2tpbmdcbiAgICAgIHRoaXMucmVxdWVzdE1hbmFnZXIucmVtb3ZlKHJlcXVlc3RLZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIEdFVCByZXF1ZXN0XG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5nZXQ8VXNlcltdPignL3VzZXJzJywge1xuICAgKiAgIHBhcmFtczogeyBhY3RpdmU6IHRydWUgfSxcbiAgICogICB0aW1lb3V0OiA1MDAwXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdldDxUID0gUmVzcG9uc2VEYXRhPihcbiAgICBlbmRwb2ludDogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlcXVlc3RDb25maWdcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxULCBBcGlFcnJvcj4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KGVuZHBvaW50LCB7IC4uLmNvbmZpZywgbWV0aG9kOiAnR0VUJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIFBPU1QgcmVxdWVzdFxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSBleHBlY3RlZCByZXNwb25zZSBkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIFREYXRhIC0gVGhlIHJlcXVlc3QgYm9keSBkYXRhIHR5cGVcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQVBJIGVuZHBvaW50XG4gICAqIEBwYXJhbSBkYXRhIC0gUmVxdWVzdCBib2R5IGRhdGFcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5wb3N0PFVzZXIsIENyZWF0ZVVzZXJEdG8+KCcvdXNlcnMnLCB7XG4gICAqICAgbmFtZTogJ0pvaG4gRG9lJyxcbiAgICogICBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHBvc3Q8XG4gICAgVCA9IFJlc3BvbnNlRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIEJvZHlJbml0IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgdW5rbm93blxuICAgID4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBkYXRhPzogVERhdGEsXG4gICAgY29uZmlnPzogUmVxdWVzdENvbmZpZ1xuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHsgLi4uY29uZmlnLCBtZXRob2Q6ICdQT1NUJywgYm9keTogZGF0YSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIFBVVCByZXF1ZXN0XG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAdGVtcGxhdGUgVERhdGEgLSBUaGUgcmVxdWVzdCBib2R5IGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGRhdGEgLSBSZXF1ZXN0IGJvZHkgZGF0YVxuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgcmVxdWVzdCBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIEFwaVJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcGlEYXRhLCBlcnJvciB9ID0gYXdhaXQgY2xpZW50LnB1dDxVc2VyLCBVcGRhdGVVc2VyRHRvPihcbiAgICogICAnL3VzZXJzLzEyMycsXG4gICAqICAgeyBuYW1lOiAnSmFuZSBEb2UnIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwdXQ8XG4gICAgVCA9IFJlc3BvbnNlRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIEJvZHlJbml0IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgdW5rbm93blxuICAgID4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBkYXRhPzogVERhdGEsXG4gICAgY29uZmlnPzogUmVxdWVzdENvbmZpZ1xuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQsIEFwaUVycm9yPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHsgLi4uY29uZmlnLCBtZXRob2Q6ICdQVVQnLCBib2R5OiBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgUEFUQ0ggcmVxdWVzdFxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSBleHBlY3RlZCByZXNwb25zZSBkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIFREYXRhIC0gVGhlIHJlcXVlc3QgYm9keSBkYXRhIHR5cGVcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQVBJIGVuZHBvaW50XG4gICAqIEBwYXJhbSBkYXRhIC0gUmVxdWVzdCBib2R5IGRhdGFcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBpRGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5wYXRjaDxVc2VyPihcbiAgICogICAnL3VzZXJzLzEyMycsXG4gICAqICAgeyBzdGF0dXM6ICdhY3RpdmUnIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwYXRjaDxcbiAgICBUID0gUmVzcG9uc2VEYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgQm9keUluaXQgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgPSBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB1bmtub3duXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSxcbiAgICBjb25maWc/OiBSZXF1ZXN0Q29uZmlnXG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VCwgQXBpRXJyb3I+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihlbmRwb2ludCwge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgYm9keTogZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIERFTEVURSByZXF1ZXN0XG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEgdHlwZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBBcGlSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IGNsaWVudC5kZWxldGUoJy91c2Vycy8xMjMnKTtcbiAgICogaWYgKCFlcnJvcikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdVc2VyIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBkZWxldGU8VCA9IFJlc3BvbnNlRGF0YT4oXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBjb25maWc/OiBSZXF1ZXN0Q29uZmlnXG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VCwgQXBpRXJyb3I+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihlbmRwb2ludCwgeyAuLi5jb25maWcsIG1ldGhvZDogJ0RFTEVURScgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSBmaWx0ZXJlZCBsaXN0IHJlcXVlc3Qgd2l0aCBwYWdpbmF0aW9uIGFuZCBzb3J0aW5nXG4gICAqIEB0ZW1wbGF0ZSBUTGlzdE1vZGVsIC0gVGhlIHR5cGUgb2YgaW5kaXZpZHVhbCBsaXN0IGl0ZW1zXG4gICAqIEB0ZW1wbGF0ZSBURmlsdGVyIC0gVGhlIGZpbHRlciBjcml0ZXJpYSB0eXBlXG4gICAqIEBwYXJhbSB1cmwgLSBBUEkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGRhdGEgLSBQYWdpbmF0aW9uIGFuZCBmaWx0ZXIgZGF0YVxuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgcmVxdWVzdCBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHBhZ2luYXRlZCBsaXN0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcGlEYXRhLCBlcnJvciB9ID0gYXdhaXQgY2xpZW50LmZpbHRlcjxVc2VyLCBVc2VyRmlsdGVyPihcbiAgICogICAnL3VzZXJzL2ZpbHRlcicsXG4gICAqICAge1xuICAgKiAgICAgcGFnZU9mZnNldDogMCxcbiAgICogICAgIHBhZ2VTaXplOiAyMCxcbiAgICogICAgIHNvcnRGaWVsZDogJ2NyZWF0ZWRBdCcsXG4gICAqICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICogICAgIGZpbHRlck1vZGVsOiB7IHN0YXR1czogJ2FjdGl2ZScgfVxuICAgKiAgIH1cbiAgICogKTtcbiAgICpcbiAgICogaWYgKGFwaURhdGEpIHtcbiAgICogICBjb25zb2xlLmxvZyhgRm91bmQgJHthcGlEYXRhLlRvdGFsfSB1c2Vyc2ApO1xuICAgKiAgIGNvbnNvbGUubG9nKCdVc2VyczonLCBhcGlEYXRhLkRhdGEpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZmlsdGVyPFRMaXN0TW9kZWwsIFRGaWx0ZXIgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YTogUG9zdE1vZGVsPFRGaWx0ZXI+LFxuICAgIGNvbmZpZz86IFJlcXVlc3RDb25maWdcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMaXN0UmVzcG9uc2U8VExpc3RNb2RlbD4sIEFwaUVycm9yPj4ge1xuICAgIC8vIE1lcmdlIGJvZHk6IHsgLi4ucG9zdE1vZGVsLCAuLi5wb3N0TW9kZWwuZmlsdGVyTW9kZWwgfVxuICAgIGNvbnN0IG1lcmdlZERhdGEgPSB7IC4uLmRhdGEsIC4uLmRhdGEuZmlsdGVyTW9kZWwgfTtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8TGlzdFJlc3BvbnNlPFRMaXN0TW9kZWw+Pih1cmwsIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogbWVyZ2VkRGF0YSxcbiAgICB9KTtcbiAgfVxufVxuIiwgIi8qKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IEZhY3RvcnkgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgQXBpQ2xpZW50IGluc3RhbmNlcy5cclxuICpcclxuICogUHJvdmlkZXMgY29udmVuaWVudCBmYWN0b3J5IG1ldGhvZHMgZm9yIGNyZWF0aW5nIHByZS1jb25maWd1cmVkIEFwaUNsaWVudCBpbnN0YW5jZXNcclxuICogd2l0aCBzZW5zaWJsZSBkZWZhdWx0cyBhbmQgYXV0b21hdGljIHRva2VuIG1hbmFnZW1lbnQgZnJvbSBsb2NhbFN0b3JhZ2UuXHJcbiAqXHJcbiAqIEBtb2R1bGUgY3JlYXRlQXBpQ2xpZW50XHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi9BcGlDbGllbnQnO1xyXG5pbXBvcnQgdHlwZSB7IEVycm9ySW50ZXJjZXB0b3IgfSBmcm9tICcuL3R5cGVzL0Vycm9ySW50ZXJjZXB0b3InO1xyXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RJbnRlcmNlcHRvciB9IGZyb20gJy4vdHlwZXMvUmVxdWVzdEludGVyY2VwdG9yJztcclxuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyY2VwdG9yIH0gZnJvbSAnLi90eXBlcy9SZXNwb25zZUludGVyY2VwdG9yJztcclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIEFwaUNsaWVudCBpbnN0YW5jZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcGlDbGllbnRDb25maWcge1xyXG4gIC8qKlxyXG4gICAqIEJhc2UgVVJMIGZvciBhbGwgQVBJIHJlcXVlc3RzLlxyXG4gICAqIEBleGFtcGxlICdodHRwczovL2FwaS5leGFtcGxlLmNvbSdcclxuICAgKi9cclxuICBiYXNlVVJMOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmF1bHQgdGltZW91dCBmb3IgcmVxdWVzdHMgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAqIEBkZWZhdWx0IDMwMDAwXHJcbiAgICovXHJcbiAgdGltZW91dD86IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJlZml4IGZvciBhdXRvLWdlbmVyYXRlZCBjb3JyZWxhdGlvbiBJRHMgKGUuZy4sICdhcGknLCAnd2ViJywgJ21vYmlsZScpLlxyXG4gICAqIEBkZWZhdWx0ICdhcGknXHJcbiAgICovXHJcbiAgY29ycmVsYXRpb25JZFByZWZpeDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW5kIGluY2x1ZGUgY29ycmVsYXRpb24gSURzIGluIHJlcXVlc3RzLlxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKi9cclxuICBpbmNsdWRlQ29ycmVsYXRpb25JZD86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIGxvY2FsU3RvcmFnZSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgYXV0aCB0b2tlbi5cclxuICAgKiBAZXhhbXBsZSAnc2VydmljZVRva2VuJ1xyXG4gICAqL1xyXG4gIHRva2VuU3RvcmFnZUtleTogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHNldCBvbiB0aGUgY2xpZW50LlxyXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG4gICAqL1xyXG4gIGF1dGhUb2tlbj86IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIHJlcXVlc3QgaW50ZXJjZXB0b3JzIHRvIHJlZ2lzdGVyIGR1cmluZyBjbGllbnQgY3JlYXRpb24uXHJcbiAgICogQGRlZmF1bHQgW11cclxuICAgKi9cclxuICByZXF1ZXN0SW50ZXJjZXB0b3JzPzogUmVxdWVzdEludGVyY2VwdG9yW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIHJlc3BvbnNlIGludGVyY2VwdG9ycyB0byByZWdpc3RlciBkdXJpbmcgY2xpZW50IGNyZWF0aW9uLlxyXG4gICAqIEBkZWZhdWx0IFtdXHJcbiAgICovXHJcbiAgcmVzcG9uc2VJbnRlcmNlcHRvcnM/OiBSZXNwb25zZUludGVyY2VwdG9yW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIGVycm9yIGludGVyY2VwdG9ycyB0byByZWdpc3RlciBkdXJpbmcgY2xpZW50IGNyZWF0aW9uLlxyXG4gICAqIEBkZWZhdWx0IFtdXHJcbiAgICovXHJcbiAgZXJyb3JJbnRlcmNlcHRvcnM/OiBFcnJvckludGVyY2VwdG9yW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHbG9iYWwgc2luZ2xldG9uIEFwaUNsaWVudCBpbnN0YW5jZS5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5sZXQgZ2xvYmFsQXBpQ2xpZW50OiBBcGlDbGllbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IEFwaUNsaWVudCBpbnN0YW5jZSB3aXRoIGF1dG9tYXRpYyB0b2tlbiBtYW5hZ2VtZW50LlxyXG4gKlxyXG4gKiBUaGlzIGZhY3RvcnkgZnVuY3Rpb246XHJcbiAqIC0gUmVxdWlyZXMgYmFzZSBVUkwsIGNvcnJlbGF0aW9uIElEIHByZWZpeCwgYW5kIHRva2VuIHN0b3JhZ2Uga2V5IHRvIGJlIGV4cGxpY2l0bHkgcHJvdmlkZWRcclxuICogLSBTZXRzIHVwIGF1dG9tYXRpYyBhdXRoZW50aWNhdGlvbiB0b2tlbiBpbmplY3Rpb24gZnJvbSBsb2NhbFN0b3JhZ2VcclxuICogLSBDb25maWd1cmVzIGNvcnJlbGF0aW9uIElEIGdlbmVyYXRpb25cclxuICogLSBSZWdpc3RlcnMgcHJvdmlkZWQgaW50ZXJjZXB0b3JzXHJcbiAqXHJcbiAqICoqTm90ZToqKiBFYWNoIGNhbGwgY3JlYXRlcyBhIE5FVyBpbnN0YW5jZS4gVXNlIHtAbGluayBnZXRHbG9iYWxBcGlDbGllbnR9IGZvciBzaW5nbGV0b24gYmVoYXZpb3IuXHJcbiAqXHJcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBUEkgY2xpZW50IChiYXNlVVJMLCBjb3JyZWxhdGlvbklkUHJlZml4LCB0b2tlblN0b3JhZ2VLZXkgYXJlIHJlcXVpcmVkKVxyXG4gKiBAcmV0dXJucyBBIGZ1bGx5IGNvbmZpZ3VyZWQgQXBpQ2xpZW50IGluc3RhbmNlXHJcbiAqIEBwdWJsaWNcclxuICpcclxuICogQGV4YW1wbGVcclxuICogQmFzaWMgdXNhZ2U6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgY2xpZW50ID0gY3JlYXRlQXBpQ2xpZW50KHtcclxuICogICBiYXNlVVJMOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxyXG4gKiAgIGNvcnJlbGF0aW9uSWRQcmVmaXg6ICd3ZWInLFxyXG4gKiAgIHRva2VuU3RvcmFnZUtleTogJ3NlcnZpY2VUb2tlbidcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBDdXN0b20gY29uZmlndXJhdGlvbiB3aXRoIGludGVyY2VwdG9yczpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBjbGllbnQgPSBjcmVhdGVBcGlDbGllbnQoe1xyXG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXHJcbiAqICAgY29ycmVsYXRpb25JZFByZWZpeDogJ3dlYicsXHJcbiAqICAgdG9rZW5TdG9yYWdlS2V5OiAnYXV0aFRva2VuJyxcclxuICogICB0aW1lb3V0OiA2MDAwMCxcclxuICogICByZXF1ZXN0SW50ZXJjZXB0b3JzOiBbXHJcbiAqICAgICBhc3luYyAoY29uZmlnKSA9PiB7XHJcbiAqICAgICAgIGNvbnNvbGUubG9nKCdNYWtpbmcgcmVxdWVzdDonLCBjb25maWcudXJsKTtcclxuICogICAgICAgcmV0dXJuIGNvbmZpZztcclxuICogICAgIH1cclxuICogICBdXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogV2l0aCBSZWFjdCBRdWVyeTpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBhcGlDbGllbnQgPSBjcmVhdGVBcGlDbGllbnQoe1xyXG4gKiAgIGJhc2VVUkw6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfVVJMLFxyXG4gKiAgIGNvcnJlbGF0aW9uSWRQcmVmaXg6ICd3ZWInLFxyXG4gKiAgIHRva2VuU3RvcmFnZUtleTogJ3NlcnZpY2VUb2tlbidcclxuICogfSk7XHJcbiAqXHJcbiAqIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50KCk7XHJcbiAqXHJcbiAqIGZ1bmN0aW9uIFVzZXJQcm9maWxlKHsgdXNlcklkIH0pIHtcclxuICogICBjb25zdCB7IGRhdGE6IHJlc3BvbnNlIH0gPSB1c2VRdWVyeSh7XHJcbiAqICAgICBxdWVyeUtleTogWyd1c2VyJywgdXNlcklkXSxcclxuICogICAgIHF1ZXJ5Rm46ICgpID0+IGFwaUNsaWVudC5nZXQoYC91c2Vycy8ke3VzZXJJZH1gKVxyXG4gKiAgIH0pO1xyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXNwb25zZT8uYXBpRGF0YTsgLy8gQWNjZXNzIHRoZSBhY3R1YWwgZGF0YVxyXG4gKiAgIC8vIC4uLlxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUNsaWVudChjb25maWc6IEFwaUNsaWVudENvbmZpZyk6IEFwaUNsaWVudCB7XHJcbiAgY29uc3Qge1xyXG4gICAgYmFzZVVSTCxcclxuICAgIHRpbWVvdXQgPSAzMDAwMCxcclxuICAgIGNvcnJlbGF0aW9uSWRQcmVmaXgsXHJcbiAgICBpbmNsdWRlQ29ycmVsYXRpb25JZCA9IHRydWUsXHJcbiAgICB0b2tlblN0b3JhZ2VLZXksXHJcbiAgICByZXF1ZXN0SW50ZXJjZXB0b3JzID0gW10sXHJcbiAgICByZXNwb25zZUludGVyY2VwdG9ycyA9IFtdLFxyXG4gICAgZXJyb3JJbnRlcmNlcHRvcnMgPSBbXSxcclxuICB9ID0gY29uZmlnO1xyXG5cclxuICBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KGJhc2VVUkwsIHRpbWVvdXQpO1xyXG5cclxuICBjbGllbnQuYWRkUmVxdWVzdEludGVyY2VwdG9yKGNvbmZpZyA9PiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRva2VuU3RvcmFnZUtleSk7XHJcblxyXG4gICAgaWYgKHRva2VuICYmICFjb25maWcuc2tpcEF1dGhSZWZyZXNoKSB7XHJcbiAgICAgIGNvbmZpZy5oZWFkZXJzID0ge1xyXG4gICAgICAgIC4uLmNvbmZpZy5oZWFkZXJzLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb25maWc7XHJcbiAgfSk7XHJcblxyXG4gIC8vIENvbmZpZ3VyZSBjb3JyZWxhdGlvbiBJRFxyXG4gIGNsaWVudC5zZXRDb3JyZWxhdGlvbklkUHJlZml4KGNvcnJlbGF0aW9uSWRQcmVmaXgpO1xyXG4gIGNsaWVudC5zZXRJbmNsdWRlQ29ycmVsYXRpb25JZChpbmNsdWRlQ29ycmVsYXRpb25JZCk7XHJcblxyXG4gIC8vIC8vIFNldCBhdXRoIHRva2VuIGlmIHByb3ZpZGVkXHJcbiAgLy8gaWYgKGF1dGhUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICBjbGllbnQuc2V0QXV0aFRva2VuKGF1dGhUb2tlbik7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBBZGQgaW50ZXJjZXB0b3JzXHJcbiAgcmVxdWVzdEludGVyY2VwdG9ycy5mb3JFYWNoKGludGVyY2VwdG9yID0+IHtcclxuICAgIGNsaWVudC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpO1xyXG4gIH0pO1xyXG5cclxuICByZXNwb25zZUludGVyY2VwdG9ycy5mb3JFYWNoKGludGVyY2VwdG9yID0+IHtcclxuICAgIGNsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTtcclxuICB9KTtcclxuXHJcbiAgZXJyb3JJbnRlcmNlcHRvcnMuZm9yRWFjaChpbnRlcmNlcHRvciA9PiB7XHJcbiAgICBjbGllbnQuYWRkRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBjbGllbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIG9yIGNyZWF0ZXMgYSBnbG9iYWwgc2luZ2xldG9uIEFwaUNsaWVudCBpbnN0YW5jZS5cclxuICpcclxuICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBzaW5nbGV0b24gcGF0dGVybiBmb3IgQXBpQ2xpZW50LiBJdCBjcmVhdGVzIHRoZSBjbGllbnRcclxuICogb24gZmlyc3QgY2FsbCBhbmQgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZSBvbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGlzIGlzIHVzZWZ1bCBmb3I6XHJcbiAqIC0gU2hhcmluZyB0aGUgc2FtZSBjbGllbnQgYWNyb3NzIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uXHJcbiAqIC0gQXZvaWRpbmcgbXVsdGlwbGUgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zXHJcbiAqIC0gQ29uc2lzdGVudCBpbnRlcmNlcHRvciBiZWhhdmlvciBhcHAtd2lkZVxyXG4gKlxyXG4gKiAqKkltcG9ydGFudDoqKiBUaGUgY29uZmlnIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgb24gdGhlIEZJUlNUIGNhbGwuIFN1YnNlcXVlbnQgY2FsbHNcclxuICogaWdub3JlIHRoZSBjb25maWcgYW5kIHJldHVybiB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuIFVzZSB7QGxpbmsgcmVzZXRHbG9iYWxBcGlDbGllbnR9XHJcbiAqIGZpcnN0IGlmIHlvdSBuZWVkIHRvIHJlY3JlYXRlIHdpdGggZGlmZmVyZW50IGNvbmZpZy5cclxuICpcclxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyAocmVxdWlyZWQgb24gZmlyc3QgY2FsbCBvbmx5OyBpZ25vcmVkIG9uIHN1YnNlcXVlbnQgY2FsbHMpXHJcbiAqIEByZXR1cm5zIFRoZSBnbG9iYWwgQXBpQ2xpZW50IHNpbmdsZXRvbiBpbnN0YW5jZVxyXG4gKiBAcHVibGljXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIEluIHlvdXIgYXBwIGluaXRpYWxpemF0aW9uOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIC8vIHNyYy9saWIvYXBpLnRzXHJcbiAqIGV4cG9ydCBjb25zdCBhcGlDbGllbnQgPSBnZXRHbG9iYWxBcGlDbGllbnQoe1xyXG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScsXHJcbiAqICAgY29ycmVsYXRpb25JZFByZWZpeDogJ3dlYicsXHJcbiAqICAgdG9rZW5TdG9yYWdlS2V5OiAnc2VydmljZVRva2VuJyxcclxuICogICB0aW1lb3V0OiAzMDAwMFxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIEltcG9ydCBhbmQgdXNlIHRocm91Z2hvdXQgeW91ciBhcHA6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gc3JjL2ZlYXR1cmVzL3VzZXJzL2FwaS50c1xyXG4gKiBpbXBvcnQgeyBnZXRHbG9iYWxBcGlDbGllbnQgfSBmcm9tICdAZ253ZWJzb2Z0L3VpJztcclxuICpcclxuICogLy8gTm8gY29uZmlnIG5lZWRlZCAtIHJldHVybnMgZXhpc3RpbmcgaW5zdGFuY2VcclxuICogY29uc3QgY2xpZW50ID0gZ2V0R2xvYmFsQXBpQ2xpZW50KCk7XHJcbiAqXHJcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFVzZXJzKCkge1xyXG4gKiAgIGNvbnN0IHsgYXBpRGF0YSB9ID0gYXdhaXQgY2xpZW50LmdldCgnL3VzZXJzJyk7XHJcbiAqICAgcmV0dXJuIGFwaURhdGE7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIFJlc2V0dGluZyBmb3IgdGVzdHM6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogYWZ0ZXJFYWNoKCgpID0+IHtcclxuICogICByZXNldEdsb2JhbEFwaUNsaWVudCgpO1xyXG4gKiB9KTtcclxuICpcclxuICogdGVzdCgnY3JlYXRlcyBmcmVzaCBjbGllbnQnLCAoKSA9PiB7XHJcbiAqICAgY29uc3QgY2xpZW50ID0gZ2V0R2xvYmFsQXBpQ2xpZW50KHtcclxuICogICAgIGJhc2VVUkw6ICdodHRwOi8vdGVzdC5sb2NhbCcsXHJcbiAqICAgICBjb3JyZWxhdGlvbklkUHJlZml4OiAndGVzdCcsXHJcbiAqICAgICB0b2tlblN0b3JhZ2VLZXk6ICd0ZXN0VG9rZW4nXHJcbiAqICAgfSk7XHJcbiAqICAgLy8gTmV3IGluc3RhbmNlIHdpdGggdGVzdCBjb25maWdcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbEFwaUNsaWVudChjb25maWc/OiBBcGlDbGllbnRDb25maWcpOiBBcGlDbGllbnQge1xyXG4gIGlmICghZ2xvYmFsQXBpQ2xpZW50KSB7XHJcbiAgICBpZiAoIWNvbmZpZykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ2dldEdsb2JhbEFwaUNsaWVudDogTm8gZ2xvYmFsIGNsaWVudCBleGlzdHMuIFlvdSBtdXN0IHByb3ZpZGUgY29uZmlnIG9uIHRoZSBmaXJzdCBjYWxsIHRvIGluaXRpYWxpemUgdGhlIGNsaWVudC4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBnbG9iYWxBcGlDbGllbnQgPSBjcmVhdGVBcGlDbGllbnQoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBnbG9iYWxBcGlDbGllbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXBsYWNlcyB0aGUgZ2xvYmFsIHNpbmdsZXRvbiBBcGlDbGllbnQgd2l0aCBhIGN1c3RvbSBpbnN0YW5jZS5cclxuICpcclxuICogVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBnbG9iYWwgY2xpZW50IGluc3RhbmNlLFxyXG4gKiBzdWNoIGFzIGluIHRlc3Rpbmcgc2NlbmFyaW9zIG9yIHdoZW4geW91J3ZlIG1hbnVhbGx5IGNyZWF0ZWQgYSBjbGllbnQgd2l0aFxyXG4gKiBzcGVjaWZpYyBjb25maWd1cmF0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0gY2xpZW50IC0gVGhlIEFwaUNsaWVudCBpbnN0YW5jZSB0byB1c2UgYXMgdGhlIGdsb2JhbCBzaW5nbGV0b25cclxuICogQHB1YmxpY1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBUZXN0aW5nIHdpdGggYSBtb2NrIGNsaWVudDpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBtb2NrQ2xpZW50ID0gbmV3IEFwaUNsaWVudCgnaHR0cDovL3Rlc3QubG9jYWwnKTtcclxuICogbW9ja0NsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gKiAgIC8vIE1vY2sgcmVzcG9uc2UgZGF0YVxyXG4gKiAgIHJldHVybiB7IGRhdGE6IG1vY2tEYXRhIH07XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBzZXRHbG9iYWxBcGlDbGllbnQobW9ja0NsaWVudCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBBZHZhbmNlZCBjb25maWd1cmF0aW9uOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBBcGlDbGllbnQoJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJywgNjAwMDApO1xyXG4gKiBjbGllbnQuc2V0Q29ycmVsYXRpb25JZFByZWZpeCgnY3VzdG9tJyk7XHJcbiAqIGNsaWVudC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoY3VzdG9tSW50ZXJjZXB0b3IpO1xyXG4gKlxyXG4gKiBzZXRHbG9iYWxBcGlDbGllbnQoY2xpZW50KTtcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0R2xvYmFsQXBpQ2xpZW50KGNsaWVudDogQXBpQ2xpZW50KTogdm9pZCB7XHJcbiAgZ2xvYmFsQXBpQ2xpZW50ID0gY2xpZW50O1xyXG59XHJcblxyXG4vKipcclxuICogUmVzZXRzIHRoZSBnbG9iYWwgQXBpQ2xpZW50IHNpbmdsZXRvbiB0byBudWxsLlxyXG4gKlxyXG4gKiBBZnRlciBjYWxsaW5nIHRoaXMsIHRoZSBuZXh0IGNhbGwgdG8ge0BsaW5rIGdldEdsb2JhbEFwaUNsaWVudH0gd2lsbCBjcmVhdGVcclxuICogYSBmcmVzaCBpbnN0YW5jZS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluOlxyXG4gKiAtIFRlc3QgY2xlYW51cCB0byBlbnN1cmUgdGVzdCBpc29sYXRpb25cclxuICogLSBBcHBsaWNhdGlvbiBsb2dvdXQgdG8gY2xlYXIgYW55IGNhY2hlZCBzdGF0ZVxyXG4gKiAtIEhvdCBtb2R1bGUgcmVsb2FkaW5nIGR1cmluZyBkZXZlbG9wbWVudFxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIFRlc3QgY2xlYW51cDpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBhZnRlckVhY2goKCkgPT4ge1xyXG4gKiAgIHJlc2V0R2xvYmFsQXBpQ2xpZW50KCk7XHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogTG9nb3V0IGZsb3c6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogZnVuY3Rpb24gaGFuZGxlTG9nb3V0KCkge1xyXG4gKiAgIC8vIENsZWFyIGF1dGhlbnRpY2F0aW9uXHJcbiAqICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3NlcnZpY2VUb2tlbicpO1xyXG4gKlxyXG4gKiAgIC8vIENhbmNlbCBhbGwgcGVuZGluZyByZXF1ZXN0cyBhbmQgcmVzZXQgY2xpZW50XHJcbiAqICAgY29uc3QgY2xpZW50ID0gZ2V0R2xvYmFsQXBpQ2xpZW50KCk7XHJcbiAqICAgY2xpZW50LmNhbmNlbEFsbFJlcXVlc3RzKCk7XHJcbiAqICAgcmVzZXRHbG9iYWxBcGlDbGllbnQoKTtcclxuICpcclxuICogICAvLyBSZWRpcmVjdCB0byBsb2dpblxyXG4gKiAgIG5hdmlnYXRlKCcvbG9naW4nKTtcclxuICogfVxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldEdsb2JhbEFwaUNsaWVudCgpOiB2b2lkIHtcclxuICBnbG9iYWxBcGlDbGllbnQgPSBudWxsO1xyXG59XHJcbiIsICIvLyBDYW5jZWxUb2tlbiBpbXBsZW1lbnRhdGlvblxyXG5leHBvcnQgY2xhc3MgQ2FuY2VsVG9rZW4ge1xyXG4gIHByaXZhdGUgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XHJcbiAgcHJpdmF0ZSBjYW5jZWxQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xyXG4gIHByaXZhdGUgY2FuY2VsUmVzb2x2ZT86ICgpID0+IHZvaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICB0aGlzLmNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgdGhpcy5jYW5jZWxSZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNpZ25hbCgpOiBBYm9ydFNpZ25hbCB7XHJcbiAgICByZXR1cm4gdGhpcy5hYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsKHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcclxuICAgIHRoaXMuY2FuY2VsUmVzb2x2ZT8uKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDYW5jZWxsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQ7XHJcbiAgfVxyXG5cclxuICB0aHJvd0lmQ2FuY2VsbGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0IGNhbmNlbGxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIHNvdXJjZSgpOiB7IHRva2VuOiBDYW5jZWxUb2tlbjsgY2FuY2VsOiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkIH0ge1xyXG4gICAgY29uc3QgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b2tlbixcclxuICAgICAgY2FuY2VsOiAocmVhc29uPzogc3RyaW5nKSA9PiB0b2tlbi5jYW5jZWwocmVhc29uKSxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICIvLyBSZWFjdCBIb29rcyB3aXRoIEFwaVJlc3BvbnNlIGZvcm1hdFxyXG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB0eXBlIHsgQXBpRXJyb3IgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbi8vIEV4cG9ydCBmYWN0b3J5IG1ldGhvZHMgYW5kIHR5cGVzXHJcbmV4cG9ydCB7XHJcbiAgY3JlYXRlQXBpQ2xpZW50LFxyXG4gIGdldEdsb2JhbEFwaUNsaWVudCxcclxuICBzZXRHbG9iYWxBcGlDbGllbnQsXHJcbiAgcmVzZXRHbG9iYWxBcGlDbGllbnQsXHJcbn0gZnJvbSAnLi9jcmVhdGVBcGlDbGllbnQnO1xyXG5cclxuZXhwb3J0IHR5cGUgeyBBcGlDbGllbnRDb25maWcgfSBmcm9tICcuL2NyZWF0ZUFwaUNsaWVudCc7XHJcblxyXG5leHBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuL0FwaUNsaWVudCc7XHJcblxyXG4vLyBIZWxwZXIgaG9vayBmb3IgZm9ybSB2YWxpZGF0aW9uIGVycm9yc1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlVmFsaWRhdGlvbkVycm9ycyhlcnJvcjogQXBpRXJyb3IgfCBudWxsKSB7XHJcbiAgY29uc3QgZ2V0RmllbGRFcnJvciA9IHVzZUNhbGxiYWNrKFxyXG4gICAgKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcclxuICAgICAgaWYgKCFlcnJvcj8uZXJyb3JzIHx8ICFlcnJvci5lcnJvcnNbZmllbGRdKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IGZpZWxkRXJyb3IgPSBlcnJvci5lcnJvcnNbZmllbGRdO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSAnc3RyaW5nJykgcmV0dXJuIGZpZWxkRXJyb3I7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkRXJyb3IpKSByZXR1cm4gZmllbGRFcnJvclswXTtcclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gZmllbGRFcnJvcikge1xyXG4gICAgICAgIHJldHVybiBmaWVsZEVycm9yLm1lc3NhZ2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuICAgIFtlcnJvcl1cclxuICApO1xyXG5cclxuICBjb25zdCBoYXNGaWVsZEVycm9yID0gdXNlQ2FsbGJhY2soXHJcbiAgICAoZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICByZXR1cm4gISFnZXRGaWVsZEVycm9yKGZpZWxkKTtcclxuICAgIH0sXHJcbiAgICBbZ2V0RmllbGRFcnJvcl1cclxuICApO1xyXG5cclxuICBjb25zdCBnZXRBbGxFcnJvcnMgPSB1c2VDYWxsYmFjaygoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XHJcbiAgICBpZiAoIWVycm9yPy5lcnJvcnMpIHJldHVybiB7fTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuXHJcbiAgICBPYmplY3QuZW50cmllcyhlcnJvci5lcnJvcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlLmpvaW4oJywgJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiAnbWVzc2FnZScgaW4gdmFsdWUpIHtcclxuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlLm1lc3NhZ2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfSwgW2Vycm9yXSk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZXRGaWVsZEVycm9yLFxyXG4gICAgaGFzRmllbGRFcnJvcixcclxuICAgIGdldEFsbEVycm9ycyxcclxuICAgIGhhc0Vycm9yczogZXJyb3I/LmVycm9ycyxcclxuICB9O1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IFByb3BzV2l0aENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xuXG50eXBlIEF1dGhvcml6ZWRWaWV3UHJvcHMgPSBQcm9wc1dpdGhDaGlsZHJlbiAmIHtcbiAgc2hvdzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBBdXRob3JpemVkVmlldyA9ICh7IGNoaWxkcmVuLCBzaG93IH06IEF1dGhvcml6ZWRWaWV3UHJvcHMpID0+IHtcbiAgaWYgKCFzaG93KSByZXR1cm4gPD48Lz47XG5cbiAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBCdXR0b25Qcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgY29uc3QgQ2FuY2VsQnV0dG9uOiBSZWFjdC5GQzxCdXR0b25Qcm9wcz4gPSAoe1xuICBjaGlsZHJlbiA9ICdDYW5jZWwnLFxuICB2YXJpYW50ID0gJ291dGxpbmVkJyxcbiAgc3gsXG4gIC4uLnJlc3Rcbn0pID0+IChcbiAgPEJ1dHRvbiB2YXJpYW50PXt2YXJpYW50fSBzeD17eyB3aWR0aDogJzZyZW0nLCAuLi5zeCB9fSB7Li4ucmVzdH0+XG4gICAge2NoaWxkcmVufVxuICA8L0J1dHRvbj5cbik7XG4iLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAbXVpL21hdGVyaWFsJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIENsZWFyQnV0dG9uIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBDbGVhckJ1dHRvblByb3BzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGZvcm0gb3Igb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBzdWJtaXR0ZWQuXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCB0byBwcmV2ZW50IG11bHRpcGxlIGNsZWFyIGFjdGlvbnMuXG4gICAqL1xuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWxsYmFjayBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIHRoZSBjbGVhciBidXR0b24gaXMgY2xpY2tlZC5cbiAgICogU2hvdWxkIGhhbmRsZSB0aGUgY2xlYXJpbmcgbG9naWMgKGUuZy4sIGZvcm0gcmVzZXQsIGRhdGEgY2xlYXJpbmcpLlxuICAgKi9cbiAgaGFuZGxlQ2xlYXI6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgbXQ6IDIsIGNvbG9yOiAnd2FybmluZy5tYWluJyB9XG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBsb2NhbFN0b3JhZ2Uga2V5IHRvIHJlbW92ZSB3aGVuIGNsZWFyaW5nLlxuICAgKiBJZiBwcm92aWRlZCwgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWxTdG9yYWdlIGl0ZW0gd2lsbCBiZSByZW1vdmVkIG9uIGNsaWNrLlxuICAgKiBAZXhhbXBsZSBcInVzZXItcHJlZmVyZW5jZXNcIiBvciBcImZvcm0tZGF0YVwiXG4gICAqL1xuICBzdG9yZUtleT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdGFuZGFyZGl6ZWQgY2xlYXIgYnV0dG9uIGNvbXBvbmVudCB3aXRoIGxvY2FsU3RvcmFnZSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgY2xlYXIgYnV0dG9uIGltcGxlbWVudGF0aW9uIHRoYXQgaGFuZGxlc1xuICogYm90aCBjYWxsYmFjayBleGVjdXRpb24gYW5kIG9wdGlvbmFsIGxvY2FsU3RvcmFnZSBjbGVhbnVwLiBJdCBhdXRvbWF0aWNhbGx5XG4gKiBkaXNhYmxlcyBkdXJpbmcgZm9ybSBzdWJtaXNzaW9ucyBhbmQgY2FuIGNsZWFyIHN0b3JlZCBkYXRhIHdoZW4gbmVlZGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENsZWFyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17aXNMb2FkaW5nfVxuICogICBoYW5kbGVDbGVhcj17KCkgPT4gZm9ybS5yZXNldCgpfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGxvY2FsU3RvcmFnZSBjbGVhbnVwOlxuICogYGBgdHN4XG4gKiA8Q2xlYXJCdXR0b25cbiAqICAgaXNTdWJtaXR0aW5nPXtmb3JtLmZvcm1TdGF0ZS5pc1N1Ym1pdHRpbmd9XG4gKiAgIGhhbmRsZUNsZWFyPXsoKSA9PiBzZXRGaWx0ZXJzKHt9KX1cbiAqICAgc3RvcmVLZXk9XCJ1c2VyLWZpbHRlcnNcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBmb3IgY2xlYXIgYnV0dG9uIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIE1VSSBCdXR0b24gY29tcG9uZW50IGNvbmZpZ3VyZWQgYXMgYSBjbGVhciBidXR0b25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBDbGVhckJ1dHRvbiA9ICh7XG4gIGlzU3VibWl0dGluZyxcbiAgaGFuZGxlQ2xlYXIsXG4gIHN4LFxuICBzdG9yZUtleSxcbn06IENsZWFyQnV0dG9uUHJvcHMpID0+IHtcbiAgY29uc3Qgb25DbGljayA9ICgpID0+IHtcbiAgICBoYW5kbGVDbGVhcigpO1xuICAgIGlmIChzdG9yZUtleSAhPSBudWxsKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEJ1dHRvblxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICBkaXNhYmxlZD17aXNTdWJtaXR0aW5nfVxuICAgICAgc3g9e3N4fVxuICAgID5cbiAgICAgIENsZWFyXG4gICAgPC9CdXR0b24+XG4gICk7XG59O1xuIiwgImltcG9ydCB7IENvbnRhaW5lciwgdHlwZSBTeFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW50ZXJmYWNlIFNpbXBsZUNvbnRhaW5lclByb3BzIHtcclxuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xyXG4gIGNsYXNzTmFtZT86IHN0cmluZztcclxuICBzeD86IFN4UHJvcHM7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBTaW1wbGVDb250YWluZXIgPSAoe1xyXG4gIGNoaWxkcmVuLFxyXG4gIGNsYXNzTmFtZSxcclxuICBzeCxcclxufTogU2ltcGxlQ29udGFpbmVyUHJvcHMpID0+IChcclxuICA8Q29udGFpbmVyIGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBzeD17eyAuLi5zeCB9fT5cclxuICAgIHtjaGlsZHJlbn1cclxuICA8L0NvbnRhaW5lcj5cclxuKTtcclxuIiwgImltcG9ydCBGaWx0ZXJBbHRJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvRmlsdGVyQWx0JztcbmltcG9ydCB7IExvYWRpbmdCdXR0b24gfSBmcm9tICdAbXVpL2xhYic7XG5pbXBvcnQgdHlwZSB7IFN4UHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEJhZGdlIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBGaWx0ZXJCdXR0b24gY29tcG9uZW50LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuaW50ZXJmYWNlIEZpbHRlckJ1dHRvblByb3BzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGZpbHRlciBvcGVyYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cbiAgICogV2hlbiB0cnVlLCBzaG93cyBsb2FkaW5nIHNwaW5uZXIgYW5kIGRpc2FibGVzIHRoZSBidXR0b24uXG4gICAqL1xuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb250cm9scyBidXR0b24gdmlzaWJpbGl0eSBhbmQgZW5hYmxlZCBzdGF0ZS5cbiAgICogV2hlbiBmYWxzZSwgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC5cbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBzaG93PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEN1c3RvbSB0ZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi5cbiAgICogQGRlZmF1bHRWYWx1ZSBcIkZpbHRlclwiXG4gICAqIEBleGFtcGxlIFwiQXBwbHkgRmlsdGVyc1wiIG9yIFwiU2VhcmNoXCJcbiAgICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tIGljb24gdG8gZGlzcGxheSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZpbHRlciBpY29uLlxuICAgKiBAZXhhbXBsZSA8U2VhcmNoSWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0LlJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gYnV0dG9uIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgbXQ6IDIsIG1pbldpZHRoOiAxMjAgfVxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBpY29uIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgY29sb3I6ICdwcmltYXJ5Lm1haW4nLCBmb250U2l6ZTogMTggfVxuICAgKi9cbiAgaWNvblN4PzogU3hQcm9wcztcbn1cblxuLyoqXG4gKiBGaWx0ZXIgYnV0dG9uIGNvbXBvbmVudCB3aXRoIGxvYWRpbmcgc3RhdGVzIGFuZCBjdXN0b21pemFibGUgYXBwZWFyYW5jZS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCBmaWx0ZXIvc3VibWl0IGJ1dHRvbiB3aXRoIGludGVncmF0ZWQgbG9hZGluZ1xuICogc3RhdGVzLCBpY29uIHN1cHBvcnQsIGFuZCBiYWRnZSBzdHlsaW5nLiBJdCdzIGRlc2lnbmVkIGZvciB1c2UgaW4gZmlsdGVyIGZvcm1zXG4gKiBhbmQgc2VhcmNoIGludGVyZmFjZXMgd2hlcmUgdXNlcnMgbmVlZCB0byBhcHBseSBmaWx0ZXJpbmcgY3JpdGVyaWEuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17aXNMb2FkaW5nfVxuICogICBzaG93PXtoYXNGaWx0ZXJzfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gdGl0bGUgYW5kIGljb246XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJCdXR0b25cbiAqICAgaXNTdWJtaXR0aW5nPXtmb3JtLmZvcm1TdGF0ZS5pc1N1Ym1pdHRpbmd9XG4gKiAgIHRpdGxlPVwiQXBwbHkgU2VhcmNoXCJcbiAqICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gKiAgIHNob3c9e3RydWV9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHN0eWxpbmc6XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJCdXR0b25cbiAqICAgaXNTdWJtaXR0aW5nPXtpc1Byb2Nlc3Npbmd9XG4gKiAgIHRpdGxlPVwiRmlsdGVyIFJlc3VsdHNcIlxuICogICBzeD17eyBtaW5XaWR0aDogMTUwLCBtdDogMiB9fVxuICogICBpY29uU3g9e3sgZm9udFNpemU6IDIwIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGZvciBmaWx0ZXIgYnV0dG9uIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIE1VSSBMb2FkaW5nQnV0dG9uIGNvbXBvbmVudCBjb25maWd1cmVkIGFzIGEgZmlsdGVyIGJ1dHRvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEZpbHRlckJ1dHRvbiA9ICh7XG4gIGlzU3VibWl0dGluZyxcbiAgc2hvdyxcbiAgdGl0bGUsXG4gIGljb24sXG4gIHN4LFxuICBpY29uU3gsXG59OiBGaWx0ZXJCdXR0b25Qcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxMb2FkaW5nQnV0dG9uXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxuICAgICAgbG9hZGluZz17aXNTdWJtaXR0aW5nfVxuICAgICAgZGlzYWJsZWQ9eyFzaG93fVxuICAgICAgZGlzYWJsZVJpcHBsZVxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIHN4PXt7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAgIHN0YXJ0SWNvbj17XG4gICAgICAgIDxCYWRnZSBjb2xvcj1cImVycm9yXCIgdmFyaWFudD1cInN0YW5kYXJkXCI+XG4gICAgICAgICAge2ljb24gPyBpY29uIDogPEZpbHRlckFsdEljb24gd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgc3g9e2ljb25TeH0gLz59XG4gICAgICAgIDwvQmFkZ2U+XG4gICAgICB9XG4gICAgPlxuICAgICAge3RpdGxlPy50cmltKCkgPT09ICcnIHx8ICF0aXRsZSA/ICdGaWx0ZXInIDogdGl0bGV9XG4gICAgPC9Mb2FkaW5nQnV0dG9uPlxuICApO1xufTtcbiIsICJpbXBvcnQgQ2hpcCBmcm9tICdAbXVpL21hdGVyaWFsL0NoaXAnO1xyXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuLy8gSW5kaXZpZHVhbCBjaGlwIGNvbXBvbmVudCB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlcmVuZGVycyBvZiBzaWJsaW5nIGNoaXBzXHJcbmV4cG9ydCBjb25zdCBGaWx0ZXJDaGlwID0gbWVtbyhcclxuICAoe1xyXG4gICAgZmllbGRLZXksXHJcbiAgICBmaWx0ZXIsXHJcbiAgICBvbkRlbGV0ZSxcclxuICB9OiB7XHJcbiAgICBmaWVsZEtleTogc3RyaW5nO1xyXG4gICAgZmlsdGVyOiB7IExhYmVsOiBzdHJpbmc7IFZhbHVlOiB1bmtub3duIH07XHJcbiAgICBvbkRlbGV0ZT86ICgpID0+IHZvaWQ7XHJcbiAgfSkgPT4ge1xyXG4gICAgY29uc3QgaGFzVmFsdWUgPVxyXG4gICAgICBmaWx0ZXIuVmFsdWUgIT09IG51bGwgJiZcclxuICAgICAgZmlsdGVyLlZhbHVlICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgZmlsdGVyLlZhbHVlICE9PSAnJztcclxuICAgIGNvbnN0IGxhYmVsID0gYCR7ZmllbGRLZXkucmVwbGFjZSgnUEsnLCAnJyl9OiAke2ZpbHRlci5MYWJlbH1gO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxDaGlwXHJcbiAgICAgICAga2V5PXtmaWVsZEtleX1cclxuICAgICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgICAgdmFyaWFudD17aGFzVmFsdWUgPyAnZmlsbGVkJyA6ICdvdXRsaW5lZCd9XHJcbiAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICBvbkRlbGV0ZT17aGFzVmFsdWUgPyBvbkRlbGV0ZSA6IHVuZGVmaW5lZH1cclxuICAgICAgLz5cclxuICAgICk7XHJcbiAgfVxyXG4pO1xyXG5cclxuRmlsdGVyQ2hpcC5kaXNwbGF5TmFtZSA9ICdGaWx0ZXJDaGlwJztcclxuIiwgImltcG9ydCB7IENhcmQsIENhcmRDb250ZW50LCBUeXBvZ3JhcGh5LCBCb3ggfSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IHsgbWVtbywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmltcG9ydCB7IEZpbHRlckNoaXAgfSBmcm9tICcuL0ZpbHRlckNoaXAnO1xyXG5cclxuaW50ZXJmYWNlIEZpbHRlckRpc3BsYXlQcm9wczxURmlsdGVyTW9kZWw+IHtcclxuICBmcmllbmRseUZpbHRlcjogUmVjb3JkPHN0cmluZywgeyBMYWJlbDogc3RyaW5nOyBWYWx1ZTogdW5rbm93biB9PjtcclxuICBvbkZyaWVuZGx5RmlsdGVyQ2hhbmdlPzogKGZpZWxkS2V5OiBrZXlvZiBURmlsdGVyTW9kZWwpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBQcm9ncmFtc0ZpbHRlckRpc3BsYXkgPSBtZW1vKFxyXG4gIDxURmlsdGVyTW9kZWwgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXHJcbiAgICBwcm9wczogRmlsdGVyRGlzcGxheVByb3BzPFRGaWx0ZXJNb2RlbD5cclxuICApID0+IHtcclxuICAgIGNvbnN0IHsgZnJpZW5kbHlGaWx0ZXIsIG9uRnJpZW5kbHlGaWx0ZXJDaGFuZ2UgfSA9IHByb3BzO1xyXG5cclxuICAgIC8vIE1lbW9pemUgZGVsZXRlIGhhbmRsZXJzIHRvIHByZXZlbnQgcmVjcmVhdGlvblxyXG4gICAgY29uc3QgZGVsZXRlSGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgaWYgKCFvbkZyaWVuZGx5RmlsdGVyQ2hhbmdlKSByZXR1cm4ge307XHJcblxyXG4gICAgICBjb25zdCBoYW5kbGVyczogUmVjb3JkPHN0cmluZywgKCkgPT4gdm9pZD4gPSB7fTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZyaWVuZGx5RmlsdGVyKSkge1xyXG4gICAgICAgIGhhbmRsZXJzW2tleV0gPSAoKSA9PiBvbkZyaWVuZGx5RmlsdGVyQ2hhbmdlKGtleSBhcyBrZXlvZiBURmlsdGVyTW9kZWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gaGFuZGxlcnM7XHJcbiAgICB9LCBbb25GcmllbmRseUZpbHRlckNoYW5nZSwgZnJpZW5kbHlGaWx0ZXJdKTtcclxuXHJcbiAgICAvLyBNZW1vaXplIGNoaXAgbGlzdCB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlY2FsY3VsYXRpb25zXHJcbiAgICBjb25zdCBjaGlwTGlzdCA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZnJpZW5kbHlGaWx0ZXIpLm1hcCgoW2tleSwgZmlsdGVyXSkgPT4gKFxyXG4gICAgICAgIDxGaWx0ZXJDaGlwXHJcbiAgICAgICAgICBrZXk9e2tleX1cclxuICAgICAgICAgIGZpZWxkS2V5PXtrZXl9XHJcbiAgICAgICAgICBmaWx0ZXI9e2ZpbHRlciBhcyB7IExhYmVsOiBzdHJpbmc7IFZhbHVlOiB1bmtub3duIH19XHJcbiAgICAgICAgICBvbkRlbGV0ZT17ZGVsZXRlSGFuZGxlcnNba2V5XX1cclxuICAgICAgICAvPlxyXG4gICAgICApKTtcclxuICAgIH0sIFtmcmllbmRseUZpbHRlciwgZGVsZXRlSGFuZGxlcnNdKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8Q2FyZCBzeD17eyBtYjogMiB9fT5cclxuICAgICAgICA8Q2FyZENvbnRlbnQ+XHJcbiAgICAgICAgICA8VHlwb2dyYXBoeSB2YXJpYW50PVwiaDZcIiBndXR0ZXJCb3R0b20+XHJcbiAgICAgICAgICAgIEFjdGl2ZSBGaWx0ZXJzXHJcbiAgICAgICAgICA8L1R5cG9ncmFwaHk+XHJcbiAgICAgICAgICA8Qm94IGRpc3BsYXk9XCJmbGV4XCIgZ2FwPXsxfSBmbGV4V3JhcD1cIndyYXBcIj5cclxuICAgICAgICAgICAge2NoaXBMaXN0fVxyXG4gICAgICAgICAgPC9Cb3g+XHJcbiAgICAgICAgPC9DYXJkQ29udGVudD5cclxuICAgICAgPC9DYXJkPlxyXG4gICAgKTtcclxuICB9XHJcbik7XHJcblxyXG5Qcm9ncmFtc0ZpbHRlckRpc3BsYXkuZGlzcGxheU5hbWUgPSAnRmlsdGVyRGlzcGxheSc7XHJcblxyXG5leHBvcnQgdHlwZSB7IEZpbHRlckRpc3BsYXlQcm9wcyB9O1xyXG4iLCAiaW1wb3J0IE1hbmFnZVNlYXJjaEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9NYW5hZ2VTZWFyY2gnO1xuaW1wb3J0IHR5cGUgeyBTeFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBCb3gsXG4gIENhcmQsXG4gIENhcmRDb250ZW50LFxuICBDYXJkSGVhZGVyLFxuICBEaXZpZGVyLFxuICBHcmlkLFxuICBUeXBvZ3JhcGh5LFxuICB1c2VUaGVtZSxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFByb3BzV2l0aENoaWxkcmVuLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBGaWx0ZXJXcmFwcGVyIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnR5cGUgRmlsdGVyV3JhcHBlclByb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48e1xuICAvKipcbiAgICogVGl0bGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGNhcmQgaGVhZGVyLlxuICAgKiBAZGVmYXVsdFZhbHVlIFwiRmlsdGVyXCJcbiAgICogQGV4YW1wbGUgXCJTZWFyY2ggQ3JpdGVyaWFcIiBvciBcIkFkdmFuY2VkIEZpbHRlcnNcIlxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgYWN0aXZlIGZpbHRlcnMgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLlxuICAgKiBPbmx5IHNob3duIHdoZW4gc2hvd0NvdW50IGlzIHRydWUuXG4gICAqIEBleGFtcGxlIDMgZm9yIFwiRmlsdGVyICgzKVwiXG4gICAqL1xuICBmaWx0ZXJDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gY2FyZCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBib3hTaGFkb3c6IDIgfVxuICAgKi9cbiAgY2FyZFN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gdGl0bGUgdGV4dCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGZvbnRTaXplOiAxOCwgZm9udFdlaWdodDogJ2JvbGQnIH1cbiAgICovXG4gIHRleHRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgc2VhcmNoIGljb24uXG4gICAqIEBleGFtcGxlIDxGaWx0ZXJMaXN0SWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gaWNvbiBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nLCBmb250U2l6ZTogMjQgfVxuICAgKi9cbiAgaWNvblN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZmlsdGVyIGNvdW50IGluIHRoZSBoZWFkZXIuXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIHNob3dDb3VudD86IGJvb2xlYW47XG59PjtcblxuLyoqXG4gKiBDYXJkLWJhc2VkIHdyYXBwZXIgY29tcG9uZW50IGZvciBvcmdhbml6aW5nIGZpbHRlciBjb250cm9scyBhbmQgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgbGF5b3V0IGZvciBmaWx0ZXIgaW50ZXJmYWNlcyB3aXRoIGEgaGVhZGVyLFxuICogb3B0aW9uYWwgZmlsdGVyIGNvdW50IGRpc3BsYXksIGFuZCBhIGdyaWQtYmFzZWQgY29udGVudCBhcmVhLiBJdCdzIGRlc2lnbmVkIHRvXG4gKiBjb250YWluIGZvcm0gY29udHJvbHMgYW5kIGZpbHRlciBlbGVtZW50cyBpbiBhIHZpc3VhbGx5IG9yZ2FuaXplZCBtYW5uZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyV3JhcHBlcj5cbiAqICAgPEdyaWQgaXRlbSB4cz17MTJ9IG1kPXs2fT5cbiAqICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiU2VhcmNoXCIgLz5cbiAqICAgPC9HcmlkPlxuICogICA8R3JpZCBpdGVtIHhzPXsxMn0gbWQ9ezZ9PlxuICogICAgIDxTZWxlY3QgbGFiZWw9XCJDYXRlZ29yeVwiIC8+XG4gKiAgIDwvR3JpZD5cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0aXRsZSBhbmQgY291bnQ6XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJXcmFwcGVyXG4gKiAgIHRpdGxlPVwiQWR2YW5jZWQgU2VhcmNoXCJcbiAqICAgZmlsdGVyQ291bnQ9e2FjdGl2ZUZpbHRlcnMubGVuZ3RofVxuICogICBzaG93Q291bnQ9e3RydWV9XG4gKiA+XG4gKiAgIHtmaWx0ZXJDb250cm9sc31cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyV3JhcHBlclxuICogICB0aXRsZT1cIlByb2R1Y3QgRmlsdGVyc1wiXG4gKiAgIGljb249ezxGaWx0ZXJMaXN0SWNvbiAvPn1cbiAqICAgY2FyZFN4PXt7IG10OiAzLCBib3JkZXJSYWRpdXM6IDIgfX1cbiAqICAgdGV4dFN4PXt7IGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nIH19XG4gKiA+XG4gKiAgIHtjaGlsZHJlbn1cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBpbmNsdWRpbmcgY2hpbGRyZW4gYW5kIHN0eWxpbmcgb3B0aW9uc1xuICogQHJldHVybnMgTVVJIENhcmQgY29tcG9uZW50IHdpdGggc3RydWN0dXJlZCBmaWx0ZXIgbGF5b3V0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgRmlsdGVyV3JhcHBlciA9ICh7XG4gIGNoaWxkcmVuLFxuICB0aXRsZSxcbiAgZmlsdGVyQ291bnQsXG4gIGNhcmRTeCxcbiAgdGV4dFN4LFxuICBpY29uLFxuICBpY29uU3gsXG4gIHNob3dDb3VudCxcbn06IEZpbHRlcldyYXBwZXJQcm9wcykgPT4ge1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q2FyZFxuICAgICAgc3g9e3tcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzBweCcsXG4gICAgICAgIG1iOiAyLFxuICAgICAgICAuLi5jYXJkU3gsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxDYXJkSGVhZGVyXG4gICAgICAgIHN4PXt7XG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGZsZXhXcmFwOiAnd3JhcCcsXG4gICAgICAgICAgcDogJzFyZW0nLFxuICAgICAgICAgICcuTXVpQ2FyZEhlYWRlci1hY3Rpb24nOiB7XG4gICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICBhbGlnblNlbGY6ICdjZW50ZXInLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIH19XG4gICAgICAgIHRpdGxlPXtcbiAgICAgICAgICA8Qm94IHN4PXt7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogMC41IH19PlxuICAgICAgICAgICAge2ljb24gPyAoXG4gICAgICAgICAgICAgIGljb25cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxNYW5hZ2VTZWFyY2hJY29uXG4gICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogJzIuNXJlbScsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICAgICAgICAgICAuLi5pY29uU3gsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgICB2YXJpYW50PVwiaDVcIlxuICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICAgICAgICAgLi4udGV4dFN4LFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dGl0bGUgPyB0aXRsZSA6ICdGaWx0ZXInfXsnICd9XG4gICAgICAgICAgICAgIHtzaG93Q291bnQgPyBgKCR7ZmlsdGVyQ291bnQgPyBmaWx0ZXJDb3VudCA6IDB9KWAgOiA8PjwvPn1cbiAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgfVxuICAgICAgPjwvQ2FyZEhlYWRlcj5cbiAgICAgIDxEaXZpZGVyIC8+XG4gICAgICA8Q2FyZENvbnRlbnQgc3g9e3sgcHk6IDIgfX0+XG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXsyfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgPC9DYXJkPlxuICApO1xufTtcbiIsICIvLyBjb3JlL2NvbXBvbmVudHMvRm9vdGVyL2luZGV4LnRzeFxyXG5pbXBvcnQgeyBCb3gsIFR5cG9ncmFwaHkgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbmV4cG9ydCBjb25zdCBGb290ZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xyXG4gIGNvbnN0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPEJveFxyXG4gICAgICBjb21wb25lbnQ9XCJmb290ZXJcIlxyXG4gICAgICBzeD17e1xyXG4gICAgICAgIHB5OiAyLFxyXG4gICAgICAgIHB4OiA0LFxyXG4gICAgICAgIG10OiAnYXV0bycsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZSA9PlxyXG4gICAgICAgICAgdGhlbWUucGFsZXR0ZS5tb2RlID09PSAnbGlnaHQnXHJcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5ncmV5WzIwMF1cclxuICAgICAgICAgICAgOiB0aGVtZS5wYWxldHRlLmdyZXlbODAwXSxcclxuICAgICAgfX1cclxuICAgID5cclxuICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImJvZHkyXCIgY29sb3I9XCJ0ZXh0LnNlY29uZGFyeVwiIGFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAge2BcdTAwQTkgQ29weXJpZ2h0ICR7Y3VycmVudFllYXJ9IEdOLiBBbGwgcmlnaHRzIHJlc2VydmVkIGJ5IFBhcnVsIFVuaXZlcnNpdHkuYH1cclxuICAgICAgPC9UeXBvZ3JhcGh5PlxyXG4gICAgPC9Cb3g+XHJcbiAgKTtcclxufTtcclxuIiwgImltcG9ydCB0eXBlIHsgU3hQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVG9vbHRpcCwgVHlwb2dyYXBoeSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgTGFiZWxUZXh0IGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBMYWJlbFRleHRQcm9wcyB7XG4gIC8qKlxuICAgKiBMYWJlbCB0ZXh0IHRvIGRpc3BsYXkgb24gdGhlIGxlZnQgc2lkZS5cbiAgICogQGV4YW1wbGUgXCJOYW1lXCIgb3IgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBWYWx1ZSBjb250ZW50IHRvIGRpc3BsYXkgb24gdGhlIHJpZ2h0IHNpZGUuXG4gICAqIENhbiBiZSB0ZXh0LCBudW1iZXJzLCBvciBSZWFjdCBlbGVtZW50cy5cbiAgICogQGV4YW1wbGUgXCJKb2huIERvZVwiIG9yIDxMaW5rPlZpZXcgRGV0YWlsczwvTGluaz5cbiAgICovXG4gIHZhbHVlOiBSZWFjdC5SZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBDdXN0b20gZ3JpZCBzaXppbmcgZm9yIGxhYmVsIGFuZCB2YWx1ZSBzZWN0aW9ucy5cbiAgICogQGRlZmF1bHRWYWx1ZSB7IGxhYmVsU2l6ZTogeyB4czogNiwgc206IDYsIG1kOiA2IH0sIHZhbHVlU2l6ZTogeyB4czogMTIsIHNtOiA2LCBtZDogNiB9IH1cbiAgICovXG4gIGdyaWRTaXplPzoge1xuICAgIC8qKiBHcmlkIHNpemUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxhYmVsIHNlY3Rpb24gKi9cbiAgICBsYWJlbFNpemU6IHsgeHM6IG51bWJlcjsgc206IG51bWJlcjsgbWQ6IG51bWJlciB9O1xuICAgIC8qKiBHcmlkIHNpemUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZhbHVlIHNlY3Rpb24gKi9cbiAgICB2YWx1ZVNpemU6IHsgeHM6IG51bWJlcjsgc206IG51bWJlcjsgbWQ6IG51bWJlciB9O1xuICB9O1xuICAvKipcbiAgICogR3JpZCBzaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBlbnRpcmUgY29udGFpbmVyLlxuICAgKiBAZGVmYXVsdFZhbHVlIHsgeHM6IDEyLCBzbTogNiwgbWQ6IDYgfVxuICAgKi9cbiAgY29udGFpbmVyU2l6ZT86IHsgeHM6IG51bWJlcjsgc206IG51bWJlcjsgbWQ6IG51bWJlciB9O1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBsYWJlbCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGZvbnRXZWlnaHQ6ICdib2xkJywgY29sb3I6ICdwcmltYXJ5Lm1haW4nIH1cbiAgICovXG4gIGxhYmVsU3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSB2YWx1ZSBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGNvbG9yOiAndGV4dC5zZWNvbmRhcnknLCBmb250U3R5bGU6ICdpdGFsaWMnIH1cbiAgICovXG4gIHZhbHVlU3g/OiBTeFByb3BzO1xufVxuXG4vKipcbiAqIFJlc3BvbnNpdmUgbGFiZWwtdmFsdWUgZGlzcGxheSBjb21wb25lbnQgd2l0aCBob3ZlciBlZmZlY3RzIGFuZCB0ZXh0IHRydW5jYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY3JlYXRlcyBhIGNvbnNpc3RlbnQgbGFiZWwtdmFsdWUgcGFpciBsYXlvdXQgdGhhdCBhZGFwdHMgdG8gZGlmZmVyZW50XG4gKiBzY3JlZW4gc2l6ZXMuIEl0IGluY2x1ZGVzIGhvdmVyIGVmZmVjdHMsIHRleHQgdHJ1bmNhdGlvbiB3aXRoIHRvb2x0aXBzLCBhbmRcbiAqIGN1c3RvbWl6YWJsZSBncmlkIHNpemluZyBmb3IgZmxleGlibGUgbGF5b3V0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxMYWJlbFRleHRcbiAqICAgbGFiZWw9XCJGdWxsIE5hbWVcIlxuICogICB2YWx1ZT1cIkpvaG4gRG9lXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBSZWFjdCBlbGVtZW50IHZhbHVlOlxuICogYGBgdHN4XG4gKiA8TGFiZWxUZXh0XG4gKiAgIGxhYmVsPVwiUHJvZmlsZVwiXG4gKiAgIHZhbHVlPXs8TGluayBocmVmPVwiL3Byb2ZpbGVcIj5WaWV3IFByb2ZpbGU8L0xpbms+fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBzaXppbmc6XG4gKiBgYGB0c3hcbiAqIDxMYWJlbFRleHRcbiAqICAgbGFiZWw9XCJEZXNjcmlwdGlvblwiXG4gKiAgIHZhbHVlPXtsb25nRGVzY3JpcHRpb259XG4gKiAgIGdyaWRTaXplPXt7XG4gKiAgICAgbGFiZWxTaXplOiB7IHhzOiAxMiwgc206IDMsIG1kOiAyIH0sXG4gKiAgICAgdmFsdWVTaXplOiB7IHhzOiAxMiwgc206IDksIG1kOiAxMCB9XG4gKiAgIH19XG4gKiAgIGNvbnRhaW5lclNpemU9e3sgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBmb3IgbGFiZWwtdmFsdWUgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgR3JpZC1iYXNlZCBsYXlvdXQgd2l0aCBsYWJlbCBhbmQgdmFsdWUgc2VjdGlvbnNcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBMYWJlbFRleHQgPSAoe1xuICBsYWJlbCxcbiAgdmFsdWUsXG4gIGdyaWRTaXplLFxuICBjb250YWluZXJTaXplLFxuICBsYWJlbFN4LFxuICB2YWx1ZVN4LFxufTogTGFiZWxUZXh0UHJvcHMpID0+IHtcbiAgY29uc3QgZGVmYXVsdEdyaWRTaXplID0ge1xuICAgIGxhYmVsU2l6ZTogeyB4czogNiwgc206IDYsIG1kOiA2IH0sXG4gICAgdmFsdWVTaXplOiB7IHhzOiAxMiwgc206IDYsIG1kOiA2IH0sXG4gIH07XG4gIGNvbnN0IGRlZmF1bHRDb250YWluZXJTaXplID0geyB4czogMTIsIHNtOiA2LCBtZDogNiB9O1xuICBjb25zdCBzaXplID0gZ3JpZFNpemUgfHwgZGVmYXVsdEdyaWRTaXplO1xuICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJTaXplIHx8IGRlZmF1bHRDb250YWluZXJTaXplO1xuXG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHNpemU9e2NvbnRhaW5lcn1cbiAgICAgIHN4PXt7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogeyB4czogJ2NvbHVtbicsIHNtOiAncm93JywgbWQ6ICdyb3cnIH0sXG4gICAgICAgICcmOmhvdmVyJzogeyBiZ2NvbG9yOiAnI2VmZWZlZicsIG92ZXJmbG93OiAnaGlkZGVuJyB9LFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8R3JpZFxuICAgICAgICBzaXplPXtzaXplLmxhYmVsU2l6ZX1cbiAgICAgICAgc3g9e3tcbiAgICAgICAgICBwYWRkaW5nOiAnNXB4JyxcbiAgICAgICAgICBmb250U2l6ZTogJzE0cHgnLFxuICAgICAgICAgIHRleHRBbGlnbjogeyB4czogJ2xlZnQnLCBzbTogJ3JpZ2h0JywgbWQ6ICdyaWdodCcgfSxcbiAgICAgICAgICAuLi5sYWJlbFN4LFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7bGFiZWx9IDpcbiAgICAgIDwvR3JpZD5cbiAgICAgIDxHcmlkXG4gICAgICAgIHNpemU9e3NpemUudmFsdWVTaXplfVxuICAgICAgICBzeD17eyBwYWRkaW5nOiAnNXB4JywgZGlzcGxheTogJ2ZsZXgnLCBmbGV4V3JhcDogJ3dyYXAnIH19XG4gICAgICA+XG4gICAgICAgIDxUb29sdGlwIHRpdGxlPXt2YWx1ZX0gYXJyb3c+XG4gICAgICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXG4gICAgICAgICAgICAgIHdvcmRCcmVhazogJ2JyZWFrLXdvcmQnLFxuICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICctd2Via2l0LWJveCcsXG4gICAgICAgICAgICAgIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJyxcbiAgICAgICAgICAgICAgV2Via2l0TGluZUNsYW1wOiAyLFxuICAgICAgICAgICAgICBXZWJraXRCb3hPcmllbnQ6ICd2ZXJ0aWNhbCcsXG4gICAgICAgICAgICAgIC4uLnZhbHVlU3gsXG4gICAgICAgICAgICAgIGNvbG9yOiAnIzA3OGRlZScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt2YWx1ZSA/IHZhbHVlIDogJy0nfVxuICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgPC9HcmlkPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBQcm9wc1dpdGhDaGlsZHJlbiB9IGZyb20gJ3JlYWN0JztcclxuXHJcbmludGVyZmFjZSBSZW5kZXJJZlByb3BzIHtcclxuICBzaG93OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUmVuZGVySWYgPSAoe1xyXG4gIHNob3csXHJcbiAgY2hpbGRyZW4sXHJcbn06IFByb3BzV2l0aENoaWxkcmVuPFJlbmRlcklmUHJvcHM+KSA9PiB7XHJcbiAgcmV0dXJuIHNob3cgPyA8PntjaGlsZHJlbn08Lz4gOiBudWxsO1xyXG59O1xyXG4iLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzLCBUaGVtZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBCb3gsIERpdmlkZXIsIEdyaWQsIFN0YWNrLCBUeXBvZ3JhcGh5IH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB0eXBlIHsgUHJvcHNXaXRoQ2hpbGRyZW4sIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgbWVtbywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcclxuXHJcbi8vIFNlY3Rpb24gYm94IGNvbmZpZ3VyYXRpb25cclxuZXhwb3J0IGludGVyZmFjZSBTZWN0aW9uQm94UHJvcHMgZXh0ZW5kcyBQcm9wc1dpdGhDaGlsZHJlbiB7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBzcGFjaW5nPzogbnVtYmVyO1xyXG4gIGNvbnRhaW5lclN4PzogU3hQcm9wczxUaGVtZT47XHJcbiAgdGl0bGVTeD86IFN4UHJvcHM8VGhlbWU+O1xyXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZm9ybScgfCAnaW5mbycgfCAnd2FybmluZycgfCAnZXJyb3InO1xyXG4gIGljb24/OiBSZWFjdE5vZGU7XHJcbiAgYWN0aW9ucz86IFJlYWN0Tm9kZTtcclxuICBjb2xsYXBzaWJsZT86IGJvb2xlYW47XHJcbiAgZGVmYXVsdEV4cGFuZGVkPzogYm9vbGVhbjtcclxufVxyXG5cclxuLy8gVGhlbWUgY29uZmlndXJhdGlvbiBmb3Igc2VjdGlvbiB2YXJpYW50c1xyXG5jb25zdCBnZXRTZWN0aW9uVGhlbWUgPSAodmFyaWFudDogU2VjdGlvbkJveFByb3BzWyd2YXJpYW50J10gPSAnZGVmYXVsdCcpID0+IHtcclxuICBjb25zdCB0aGVtZXMgPSB7XHJcbiAgICBkZWZhdWx0OiB7XHJcbiAgICAgIGJnY29sb3I6ICcjZmFlYmQ3JyxcclxuICAgICAgY29sb3I6ICcjOTI1ZDIxJyxcclxuICAgIH0sXHJcbiAgICBmb3JtOiB7XHJcbiAgICAgIGJnY29sb3I6ICcjY2RjZWQxJyxcclxuICAgICAgY29sb3I6ICdibGFjaycsXHJcbiAgICB9LFxyXG4gICAgaW5mbzoge1xyXG4gICAgICBiZ2NvbG9yOiAnI2UzZjJmZCcsXHJcbiAgICAgIGNvbG9yOiAnIzE5NzZkMicsXHJcbiAgICB9LFxyXG4gICAgd2FybmluZzoge1xyXG4gICAgICBiZ2NvbG9yOiAnI2ZmZjNlMCcsXHJcbiAgICAgIGNvbG9yOiAnI2Y1N2MwMCcsXHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IHtcclxuICAgICAgYmdjb2xvcjogJyNmZmViZWUnLFxyXG4gICAgICBjb2xvcjogJyNkMzJmMmYnLFxyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICByZXR1cm4gdGhlbWVzW3ZhcmlhbnRdO1xyXG59O1xyXG5cclxuLy8gTWVtb2l6ZWQgU2VjdGlvbkJveCBjb21wb25lbnQgZm9yIHBlcmZvcm1hbmNlXHJcbmV4cG9ydCBjb25zdCBTZWN0aW9uQm94ID0gbWVtbzxTZWN0aW9uQm94UHJvcHM+KFxyXG4gICh7XHJcbiAgICB0aXRsZSxcclxuICAgIGNoaWxkcmVuLFxyXG4gICAgc3BhY2luZyA9IDAsXHJcbiAgICBjb250YWluZXJTeCxcclxuICAgIHRpdGxlU3gsXHJcbiAgICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxyXG4gICAgaWNvbixcclxuICAgIGFjdGlvbnMsXHJcbiAgfSkgPT4ge1xyXG4gICAgY29uc3QgdGhlbWVDb2xvcnMgPSB1c2VNZW1vKCgpID0+IGdldFNlY3Rpb25UaGVtZSh2YXJpYW50KSwgW3ZhcmlhbnRdKTtcclxuXHJcbiAgICBjb25zdCBoZWFkZXJTeCA9IHVzZU1lbW8oXHJcbiAgICAgICgpID0+ICh7XHJcbiAgICAgICAgcHg6IDEuNSxcclxuICAgICAgICBweTogMC4xLFxyXG4gICAgICAgIHdpZHRoOiAnZml0LWNvbnRlbnQnLFxyXG4gICAgICAgIC4uLnRoZW1lQ29sb3JzLFxyXG4gICAgICAgIC4uLnRpdGxlU3gsXHJcbiAgICAgIH0pLFxyXG4gICAgICBbdGhlbWVDb2xvcnMsIHRpdGxlU3hdXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRTeCA9IHVzZU1lbW8oXHJcbiAgICAgICgpID0+ICh7XHJcbiAgICAgICAgcGFkZGluZzogJzE2cHgnLFxyXG4gICAgICAgIC4uLmNvbnRhaW5lclN4LFxyXG4gICAgICB9KSxcclxuICAgICAgW2NvbnRhaW5lclN4XVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8PlxyXG4gICAgICAgIDxCb3ggc3g9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgd2lkdGg6ICcxMDAlJyB9fT5cclxuICAgICAgICAgIDxTdGFja1xyXG4gICAgICAgICAgICBkaXJlY3Rpb249XCJyb3dcIlxyXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudD1cInNwYWNlLWJldHdlZW5cIlxyXG4gICAgICAgICAgICBhbGlnbkl0ZW1zPVwiY2VudGVyXCJcclxuICAgICAgICAgICAgc3g9e2hlYWRlclN4fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8U3RhY2sgZGlyZWN0aW9uPVwicm93XCIgYWxpZ25JdGVtcz1cImNlbnRlclwiIHNwYWNpbmc9ezF9PlxyXG4gICAgICAgICAgICAgIHtpY29ufVxyXG4gICAgICAgICAgICAgIDxUeXBvZ3JhcGh5IHN4PXt7IGZvbnRTaXplOiAnMTVweCcsIGZvbnRXZWlnaHQ6IDQwMCB9fT5cclxuICAgICAgICAgICAgICAgIHt0aXRsZX1cclxuICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XHJcbiAgICAgICAgICAgIDwvU3RhY2s+XHJcbiAgICAgICAgICAgIHthY3Rpb25zfVxyXG4gICAgICAgICAgPC9TdGFjaz5cclxuICAgICAgICAgIDxEaXZpZGVyIC8+XHJcbiAgICAgICAgPC9Cb3g+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9e3NwYWNpbmd9IHN4PXtjb250ZW50U3h9PlxyXG4gICAgICAgICAge2NoaWxkcmVufVxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgICAgPC8+XHJcbiAgICApO1xyXG4gIH1cclxuKTtcclxuIiwgImltcG9ydCB7IFRhYkNvbnRleHQgfSBmcm9tICdAbXVpL2xhYic7XHJcbmltcG9ydCB0eXBlIHsgU3hQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBCb3gsIFRhYiwgVGFicyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgdHlwZSB7IFByb3BzV2l0aENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRhYkl0ZW0ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU6IG51bWJlcjtcclxuICBwZXJtaXNzaW9uPzogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIEN1c3RvbVRhYnNQcm9wcyB7XHJcbiAgdGFiczogVGFiSXRlbVtdO1xyXG4gIGRlZmF1bHRWYWx1ZT86IG51bWJlcjtcclxuICBvblRhYkNoYW5nZT86IChuZXdWYWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xyXG4gIHRhYlN4PzogU3hQcm9wcztcclxuICB0YWJzU3g/OiBTeFByb3BzO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgU2ltcGxlVGFicyA9ICh7XHJcbiAgdGFicyxcclxuICBkZWZhdWx0VmFsdWUgPSAxLFxyXG4gIG9uVGFiQ2hhbmdlLFxyXG4gIGNoaWxkcmVuLFxyXG4gIHRhYlN4LFxyXG4gIHRhYnNTeCxcclxufTogQ3VzdG9tVGFic1Byb3BzICYgUHJvcHNXaXRoQ2hpbGRyZW4pID0+IHtcclxuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlPG51bWJlcj4oZGVmYXVsdFZhbHVlKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGV2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3VmFsdWU6IG51bWJlcikgPT4ge1xyXG4gICAgc2V0VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgaWYgKG9uVGFiQ2hhbmdlKSBvblRhYkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxUYWJDb250ZXh0IHZhbHVlPXt2YWx1ZX0+XHJcbiAgICAgIDxCb3ggc3g9e3sgYm9yZGVyQm90dG9tOiAxLCBib3JkZXJDb2xvcjogJ2RpdmlkZXInLCB3aWR0aDogJzEwMCUnIH19PlxyXG4gICAgICAgIDxUYWJzXHJcbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XHJcbiAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxyXG4gICAgICAgICAgc3g9e3sgcHg6IDIsIHB5OiAwLCAuLi50YWJzU3ggfX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICB7dGFicy5tYXAodGFiID0+IChcclxuICAgICAgICAgICAgPFRhYlxyXG4gICAgICAgICAgICAgIGtleT17dGFiLnZhbHVlfVxyXG4gICAgICAgICAgICAgIGxhYmVsPXt0YWIubGFiZWx9XHJcbiAgICAgICAgICAgICAgdmFsdWU9e3RhYi52YWx1ZX1cclxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGFiLnBlcm1pc3Npb24gPT09IGZhbHNlfVxyXG4gICAgICAgICAgICAgIHN4PXt7IGZvbnRTaXplOiAnMXJlbScsIC4uLnRhYlN4IH19XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICApKX1cclxuICAgICAgICA8L1RhYnM+XHJcbiAgICAgIDwvQm94PlxyXG5cclxuICAgICAge2NoaWxkcmVufVxyXG4gICAgPC9UYWJDb250ZXh0PlxyXG4gICk7XHJcbn07XHJcbiIsICJpbXBvcnQgdHlwZSB7IExvYWRpbmdCdXR0b25Qcm9wcyB9IGZyb20gJ0BtdWkvbGFiJztcclxuaW1wb3J0IHsgTG9hZGluZ0J1dHRvbiB9IGZyb20gJ0BtdWkvbGFiJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbnR5cGUgU3VibWl0QnV0dG9uUHJvcHMgPSBPbWl0PFxyXG4gIExvYWRpbmdCdXR0b25Qcm9wcyxcclxuICAnY2hpbGRyZW4nIHwgJ3ZhcmlhbnQnIHwgJ2NvbG9yJyB8ICd0eXBlJ1xyXG4+O1xyXG5cclxuZXhwb3J0IGNvbnN0IFN1Ym1pdEJ1dHRvbjogUmVhY3QuRkM8U3VibWl0QnV0dG9uUHJvcHM+ID0gKHtcclxuICBsb2FkaW5nID0gZmFsc2UsXHJcbiAgLi4ucmVzdFxyXG59KSA9PiAoXHJcbiAgPExvYWRpbmdCdXR0b25cclxuICAgIGxvYWRpbmc9e2xvYWRpbmd9XHJcbiAgICB2YXJpYW50PVwiY29udGFpbmVkXCJcclxuICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICB0eXBlPVwic3VibWl0XCJcclxuICAgIHsuLi5yZXN0fVxyXG4gICAgc3g9e3sgZm9udFdlaWdodDogNDAwIH19XHJcbiAgPlxyXG4gICAgU3VibWl0XHJcbiAgPC9Mb2FkaW5nQnV0dG9uPlxyXG4pO1xyXG4iLCAiaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBTaGFyZWQgdHlwZXNcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGFNb2RhbEJ1dHRvbnMge1xyXG4gIG9uU3VibWl0PzogKCkgPT4gdm9pZDtcclxuICBvbkNhbmNlbD86ICgpID0+IHZvaWQ7XHJcbiAgaXNQZW5kaW5nPzogYm9vbGVhbjtcclxuICBpc1N1Y2Nlc3M/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGFNb2RhbENvbXBvbmVudFByb3BzPFREYXRhPiB7XHJcbiAgZGF0YT86IFREYXRhO1xyXG4gIGlzRWRpdGluZz86IGJvb2xlYW47XHJcbiAgcmVmPzogUmVhY3QuUmVmPERhdGFNb2RhbEJ1dHRvbnM+OyAvLyBcdUQ4M0RcdURDNDggcHV0IHJlZiBpbnRvIHByb3BzXHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gUHJvamVjdC1zcGVjaWZpYyBIT0NcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgZnVuY3Rpb24gd2l0aERhdGFNb2RhbDxURGF0YT4oXHJcbiAgY29tcG9uZW50OiAoXHJcbiAgICBwcm9wczogRGF0YU1vZGFsQ29tcG9uZW50UHJvcHM8VERhdGE+XHJcbiAgKSA9PiBSZWFjdC5SZWFjdEVsZW1lbnQgfCBudWxsXHJcbikge1xyXG4gIHJldHVybiBmb3J3YXJkUmVmPERhdGFNb2RhbEJ1dHRvbnMsIERhdGFNb2RhbENvbXBvbmVudFByb3BzPFREYXRhPj4oXHJcbiAgICAocHJvcHMsIHJlZikgPT4gY29tcG9uZW50KHsgLi4ucHJvcHMsIHJlZiB9KVxyXG4gICk7XHJcbn1cclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnVmFsdWUge1xyXG4gIGFwaUJhc2VVcmw6IHN0cmluZztcclxuICBkZWZhdWx0UGFnZVNpemU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IENvbmZpZzogQ29uZmlnVmFsdWUgPSB7XHJcbiAgZGVmYXVsdFBhZ2VTaXplOiAyMCxcclxuICBhcGlCYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo1MTQzJyxcclxuICAvLyBhcGlCYXNlVXJsOiAnaHR0cDovLzE5Mi4xNjguMS4yNDY6NTE0MycsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGF0ZVRpbWVQYXR0ZXJucyA9IHtcclxuICBkYXRlVGltZTogJ0REIE1NTSBZWVlZIGg6bW0gQScsIC8vIDE3IEFwciAyMDIyIDEyOjAwIGFtXHJcbiAgZGF0ZTogJ0REIE1NTSBZWVlZJywgLy8gMTcgQXByIDIwMjJcclxuICBtb250aF95ZWFyX3Nob3J0X2Zvcm1hdDogJ01NTSBZWVlZJyxcclxuICBtb250aF95ZWFyX2Z1bGxfZm9ybWF0OiAnTU1NTSBZWVlZJyxcclxuICB5ZWFyOiAnWVlZWScsXHJcbiAgdGltZTogJ2g6bW0gYScsIC8vIDEyOjAwIGFtXHJcbiAgc3BsaXQ6IHtcclxuICAgIGRhdGVUaW1lOiAnREQvTU0vWVlZWSBoOm1tIEEnLCAvLyAxNy8wNC8yMDIyIDEyOjAwIGFtXHJcbiAgICBkYXRlOiAnREQvTU0vWVlZWScsIC8vIDE3LzA0LzIwMjJcclxuICB9LFxyXG4gIHBhcmFtQ2FzZToge1xyXG4gICAgZGF0ZVRpbWU6ICdERC1NTS1ZWVlZIGg6bW0gQScsIC8vIDE3LTA0LTIwMjIgMTI6MDAgYW1cclxuICAgIGRhdGU6ICdERC1NTS1ZWVlZJywgLy8gMTctMDQtMjAyMlxyXG4gICAgZGF0ZVJldmVyc2U6ICdZWVlZLU1NLUREJywgLy8gMjAyMi0wNC0xNyBmb3IgY29tcGFyZSBkYXRlXHJcbiAgICBNb250aFllYXI6ICdNTU0tWVlZWScsXHJcbiAgfSxcclxufTtcclxuIiwgImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XHJcblxyXG5pbXBvcnQgeyBjcmVhdGVBcGlDbGllbnQgfSBmcm9tICcuLi9hcGkvY3JlYXRlQXBpQ2xpZW50JztcclxuaW1wb3J0IHR5cGUgeyBBcGlDbGllbnRDb25maWcgfSBmcm9tICcuLi9hcGkvY3JlYXRlQXBpQ2xpZW50JztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VBcGlDbGllbnQoY29uZmlnOiBBcGlDbGllbnRDb25maWcpIHtcclxuICByZXR1cm4gdXNlTWVtbyhcclxuICAgICgpID0+IGNyZWF0ZUFwaUNsaWVudChjb25maWcpLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gICAgW1xyXG4gICAgICBjb25maWcuYmFzZVVSTCxcclxuICAgICAgY29uZmlnLnRpbWVvdXQsXHJcbiAgICAgIGNvbmZpZy5jb3JyZWxhdGlvbklkUHJlZml4LFxyXG4gICAgICBjb25maWcuaW5jbHVkZUNvcnJlbGF0aW9uSWQsXHJcbiAgICAgIGNvbmZpZy50b2tlblN0b3JhZ2VLZXksXHJcbiAgICAgIGNvbmZpZy5hdXRoVG9rZW4sXHJcbiAgICAgIGNvbmZpZy5yZXF1ZXN0SW50ZXJjZXB0b3JzLFxyXG4gICAgICBjb25maWcucmVzcG9uc2VJbnRlcmNlcHRvcnMsXHJcbiAgICAgIGNvbmZpZy5lcnJvckludGVyY2VwdG9ycyxcclxuICAgIF1cclxuICApO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAZ253ZWJzb2Z0L3VpJztcclxuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB0eXBlIHsgVXNlRm9ybVNldEVycm9yLCBGaWVsZFZhbHVlcywgUGF0aCB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcbmltcG9ydCB7IHRvYXN0IH0gZnJvbSAnc29ubmVyJztcclxuXHJcbmltcG9ydCB0eXBlIHsgQXBpRXJyb3IgfSBmcm9tICcuLi9hcGkvdHlwZXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdWNjZXNzTWVzc2FnZSB7XHJcbiAgY3JlYXRlOiBzdHJpbmc7XHJcbiAgdXBkYXRlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JNZXNzYWdlIHtcclxuICBub0NoYW5nZXM6IHN0cmluZztcclxuICBnZW5lcmFsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlRm9ybUVycm9ySGFuZGxlck9wdGlvbnM8VEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXM+IHtcclxuICBzZXRFcnJvcj86IFVzZUZvcm1TZXRFcnJvcjxURmllbGRWYWx1ZXM+O1xyXG4gIHN1Y2Nlc3NNZXNzYWdlPzogU3VjY2Vzc01lc3NhZ2U7XHJcbiAgZXJyb3JNZXNzYWdlPzogRXJyb3JNZXNzYWdlO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTdWNjZXNzSGFuZGxlciA9IChcclxuICBpc0VkaXRpbmc6IGJvb2xlYW4sXHJcbiAgcm93c0FmZmVjdGVkPzogbnVtYmVyXHJcbikgPT4gYm9vbGVhbjtcclxuXHJcbmV4cG9ydCB0eXBlIEVycm9ySGFuZGxlciA9IChwcm9jZXNzZWRFcnJvcjogQXBpRXJyb3IpID0+IHZvaWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZUZvcm1FcnJvckhhbmRsZXJSZXR1cm4ge1xyXG4gIGhhbmRsZVN1Y2Nlc3M6IFN1Y2Nlc3NIYW5kbGVyO1xyXG4gIGhhbmRsZUVycm9yOiBFcnJvckhhbmRsZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGVsZXRlSGFuZGxlck9wdGlvbnMge1xyXG4gIHN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xyXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEhvb2sgdG8gaGFuZGxlIEFQSSBlcnJvcnMgaW4gZm9ybXMgd2l0aCBzdGFuZGFyZGl6ZWQgZXJyb3IgaGFuZGxpbmcgYW5kIHRvYXN0IG1lc3NhZ2VzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlRm9ybUVycm9ySGFuZGxlciA9IDxURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcz4oe1xyXG4gIHNldEVycm9yLFxyXG4gIHN1Y2Nlc3NNZXNzYWdlID0ge1xyXG4gICAgY3JlYXRlOiAnQ3JlYXRlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgdXBkYXRlOiAnVXBkYXRlZCBzdWNjZXNzZnVsbHknLFxyXG4gIH0sXHJcbiAgZXJyb3JNZXNzYWdlID0ge1xyXG4gICAgbm9DaGFuZ2VzOiAnTm8gY2hhbmdlcyB3ZXJlIG1hZGUnLFxyXG4gICAgZ2VuZXJhbDogJ0ZhaWxlZCB0byBzYXZlLiBQbGVhc2UgdHJ5IGFnYWluLicsXHJcbiAgfSxcclxufTogVXNlRm9ybUVycm9ySGFuZGxlck9wdGlvbnM8VEZpZWxkVmFsdWVzPik6IFVzZUZvcm1FcnJvckhhbmRsZXJSZXR1cm4gPT4ge1xyXG4gIGNvbnN0IGdldEZpZWxkRXJyb3IgPSB1c2VDYWxsYmFjayhcclxuICAgIChcclxuICAgICAgZmllbGRzOiBWYWxpZGF0aW9uRXJyb3JzIHwgdW5kZWZpbmVkLFxyXG4gICAgICBmaWVsZE5hbWU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcclxuICAgICAgaWYgKCFmaWVsZHMgfHwgIWZpZWxkc1tmaWVsZE5hbWVdKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgY29uc3QgZmllbGRFcnJvciA9IGZpZWxkc1tmaWVsZE5hbWVdO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBmaWVsZEVycm9yO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZEVycm9yKSkge1xyXG4gICAgICAgIHJldHVybiBmaWVsZEVycm9yLmpvaW4oJywgJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgZmllbGRFcnJvciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGZpZWxkRXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gZmllbGRFcnJvci5tZXNzYWdlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuICAgIFtdXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU3VjY2VzcyA9IHVzZUNhbGxiYWNrKFxyXG4gICAgKGlzRWRpdGluZzogYm9vbGVhbiwgcm93c0FmZmVjdGVkPzogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGlmIChyb3dzQWZmZWN0ZWQgIT09IHVuZGVmaW5lZCAmJiByb3dzQWZmZWN0ZWQgPiAwKSB7XHJcbiAgICAgICAgdG9hc3Quc3VjY2VzcyhcclxuICAgICAgICAgIGlzRWRpdGluZyA/IHN1Y2Nlc3NNZXNzYWdlLnVwZGF0ZSA6IHN1Y2Nlc3NNZXNzYWdlLmNyZWF0ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2UgaWYgKHJvd3NBZmZlY3RlZCA9PT0gMCkge1xyXG4gICAgICAgIHRvYXN0LmVycm9yKGVycm9yTWVzc2FnZS5ub0NoYW5nZXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIHJvd3NBZmZlY3RlZCBpcyB1bmRlZmluZWQsIGFzc3VtZSBzdWNjZXNzXHJcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoaXNFZGl0aW5nID8gc3VjY2Vzc01lc3NhZ2UudXBkYXRlIDogc3VjY2Vzc01lc3NhZ2UuY3JlYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuICAgIFtzdWNjZXNzTWVzc2FnZSwgZXJyb3JNZXNzYWdlXVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUVycm9yID0gdXNlQ2FsbGJhY2soXHJcbiAgICAocHJvY2Vzc2VkRXJyb3I6IEFwaUVycm9yKSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwcm9jZXNzZWRFcnJvci50eXBlID09PSAndmFsaWRhdGlvbl9lcnJvcicgJiZcclxuICAgICAgICBwcm9jZXNzZWRFcnJvci5lcnJvcnMgJiZcclxuICAgICAgICBzZXRFcnJvclxyXG4gICAgICApIHtcclxuICAgICAgICAvLyBTZXQgZmllbGQtc3BlY2lmaWMgZXJyb3JzIHVzaW5nIHJlYWN0LWhvb2stZm9ybSdzIHNldEVycm9yIChvbmx5IGlmIHNldEVycm9yIGlzIHByb3ZpZGVkKVxyXG4gICAgICAgIE9iamVjdC5rZXlzKHByb2Nlc3NlZEVycm9yLmVycm9ycykuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZmllbGRFcnJvciA9IGdldEZpZWxkRXJyb3IocHJvY2Vzc2VkRXJyb3IuZXJyb3JzLCBmaWVsZE5hbWUpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZEVycm9yKSB7XHJcbiAgICAgICAgICAgIHNldEVycm9yKGZpZWxkTmFtZSBhcyBQYXRoPFRGaWVsZFZhbHVlcz4sIHtcclxuICAgICAgICAgICAgICB0eXBlOiAnc2VydmVyJyxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiBmaWVsZEVycm9yLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gU2hvdyBnZW5lcmFsIHZhbGlkYXRpb24gZXJyb3IgdG9hc3RcclxuICAgICAgICB0b2FzdC5lcnJvcihcclxuICAgICAgICAgIHByb2Nlc3NlZEVycm9yLnRpdGxlIHx8ICdQbGVhc2UgY2hlY2sgdGhlIGZvcm0gZm9yIHZhbGlkYXRpb24gZXJyb3JzJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gU2hvdyBnZW5lcmFsIGVycm9yIHRvYXN0IGZvciBub24tdmFsaWRhdGlvbiBlcnJvcnMgb3Igd2hlbiBzZXRFcnJvciBpcyBub3QgYXZhaWxhYmxlXHJcbiAgICAgICAgdG9hc3QuZXJyb3IocHJvY2Vzc2VkRXJyb3IudGl0bGUgfHwgZXJyb3JNZXNzYWdlLmdlbmVyYWwpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgW2Vycm9yTWVzc2FnZS5nZW5lcmFsLCBnZXRGaWVsZEVycm9yLCBzZXRFcnJvcl1cclxuICApO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaGFuZGxlU3VjY2VzcyxcclxuICAgIGhhbmRsZUVycm9yLFxyXG4gIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQ29udmVuaWVuY2UgaG9vayBmb3IgZGVsZXRlIG9wZXJhdGlvbnMgdGhhdCBkb24ndCBuZWVkIGZvcm0gZmllbGQgdmFsaWRhdGlvblxyXG4gKiBVc2VzIHVzZUZvcm1FcnJvckhhbmRsZXIgaW50ZXJuYWxseSBidXQgd2l0aCBzaW1wbGlmaWVkIG9wdGlvbnNcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VEZWxldGVIYW5kbGVyID0gKHtcclxuICBzdWNjZXNzTWVzc2FnZSA9ICdEZWxldGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBkZWxldGUuIFBsZWFzZSB0cnkgYWdhaW4uJyxcclxufTogVXNlRGVsZXRlSGFuZGxlck9wdGlvbnMgPSB7fSk6IFVzZUZvcm1FcnJvckhhbmRsZXJSZXR1cm4gPT4ge1xyXG4gIHJldHVybiB1c2VGb3JtRXJyb3JIYW5kbGVyKHtcclxuICAgIHN1Y2Nlc3NNZXNzYWdlOiB7XHJcbiAgICAgIGNyZWF0ZTogc3VjY2Vzc01lc3NhZ2UsIC8vIE5vdCB1c2VkIGZvciBkZWxldGUsIGJ1dCByZXF1aXJlZCBmb3IgdHlwZVxyXG4gICAgICB1cGRhdGU6IHN1Y2Nlc3NNZXNzYWdlLFxyXG4gICAgfSxcclxuICAgIGVycm9yTWVzc2FnZToge1xyXG4gICAgICBub0NoYW5nZXM6ICdObyBjaGFuZ2VzIHdlcmUgbWFkZScsIC8vIE5vdCB0eXBpY2FsbHkgdXNlZCBmb3IgZGVsZXRlXHJcbiAgICAgIGdlbmVyYWw6IGVycm9yTWVzc2FnZSxcclxuICAgIH0sXHJcbiAgICAvLyBzZXRFcnJvciBpcyBvbWl0dGVkICh1bmRlZmluZWQpIGZvciBkZWxldGUgb3BlcmF0aW9uc1xyXG4gIH0pO1xyXG59O1xyXG4iLCAiaW1wb3J0IHR5cGUgeyBRdWVyeUNsaWVudCwgUXVlcnlLZXkgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xyXG5pbXBvcnQgeyB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XHJcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XHJcblxyXG4vLyBNaW5pbWFsIHR5cGUtc2FmZSBjYWNoZSB1dGlsaXR5IGZvciBxdWVyeSBrZXkgZmFjdG9yaWVzXHJcbmV4cG9ydCBjbGFzcyBDYWNoZVV0aWxpdHkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcXVlcnlDbGllbnQ6IFF1ZXJ5Q2xpZW50KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY2FjaGVkIGRhdGEgdXNpbmcgb25seSB0aGUgcXVlcnlLZXkgZnJvbSBxdWVyeSBmYWN0b3J5XHJcbiAgICovXHJcbiAgZ2V0Q2FjaGVkRGF0YTxUPihxdWVyeUtleTogUXVlcnlLZXkpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5Q2xpZW50LmdldFF1ZXJ5RGF0YTxUPihxdWVyeUtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY2FjaGVkIGRhdGEgd2l0aCB0cmFuc2Zvcm1hdGlvbiB1c2luZyBzZWxlY3QgZnVuY3Rpb25cclxuICAgKi9cclxuICBnZXRDYWNoZWREYXRhV2l0aFNlbGVjdDxULCBSPihcclxuICAgIHF1ZXJ5S2V5OiBRdWVyeUtleSxcclxuICAgIHNlbGVjdDogKGRhdGE6IFQpID0+IFJcclxuICApOiBSIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLnF1ZXJ5Q2xpZW50LmdldFF1ZXJ5RGF0YTxUPihxdWVyeUtleSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZERhdGEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWxlY3QoY2FjaGVkRGF0YSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlQ2FjaGVVdGlsaXR5KCk6IENhY2hlVXRpbGl0eSB7XHJcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xyXG5cclxuICByZXR1cm4gdXNlTWVtbygoKSA9PiBuZXcgQ2FjaGVVdGlsaXR5KHF1ZXJ5Q2xpZW50KSwgW3F1ZXJ5Q2xpZW50XSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHtcclxuICBDb250cm9sLFxyXG4gIERlZXBQYXJ0aWFsU2tpcEFycmF5S2V5LFxyXG4gIEZpZWxkVmFsdWVzLFxyXG4gIFBhdGgsXHJcbiAgUGF0aFZhbHVlLFxyXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcbmltcG9ydCB7IHVzZVdhdGNoIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuXHJcbi8qKlxyXG4gKiBDb3JlIHdhdGNoIGZ1bmN0aW9ucyBmb3IgUmVhY3QgSG9vayBGb3JtXHJcbiAqIFRoZXNlIGFyZSB0aGUgcHJpbWFyeSBidWlsZGluZyBibG9ja3MgZm9yIGZvcm0gd2F0Y2hpbmdcclxuICovXHJcblxyXG4vKipcclxuICogVXRpbGl0eSB0eXBlIHRvIGVuc3VyZSBhcnJheSBlbGVtZW50cyBhcmUgYWxsIFBhdGg8VD5cclxuICovXHJcbmV4cG9ydCB0eXBlIFBhdGhBcnJheTxUIGV4dGVuZHMgRmllbGRWYWx1ZXM+ID0gUmVhZG9ubHlBcnJheTxQYXRoPFQ+PjtcclxuXHJcbi8qKlxyXG4gKiBIb29rIHRvIHdhdGNoIGVudGlyZSBmb3JtIC0gcmV0dXJucyBhbGwgZm9ybSB2YWx1ZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaEZvcm0gPSA8VEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXM+KFxyXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPlxyXG4pOiBEZWVwUGFydGlhbFNraXBBcnJheUtleTxURmllbGRWYWx1ZXM+ID0+IHVzZVdhdGNoKHsgY29udHJvbCB9KTtcclxuXHJcbi8qKlxyXG4gKiBIb29rIHRvIHdhdGNoIHNpbmdsZSBmaWVsZCBieSBwYXRoIC0gc3VwcG9ydHMgYW55IG5lc3RlZCBwYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hGaWVsZCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgbmFtZTogVE5hbWVcclxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcclxuXHJcbi8qKlxyXG4gKiBIb29rIHRvIHdhdGNoIG11bHRpcGxlIGZpZWxkcyBieSBwYXRocyAtIHJldHVybnMgYXJyYXkgb2YgdmFsdWVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hGaWVsZHMgPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWVzIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxQYXRoPFRGaWVsZFZhbHVlcz4+LFxyXG4+KFxyXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcclxuICBuYW1lczogVE5hbWVzXHJcbik6IEFycmF5PFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lc1tudW1iZXJdPj4gPT5cclxuICB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWU6IG5hbWVzIH0pIGFzIEFycmF5PFxyXG4gICAgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWVzW251bWJlcl0+XHJcbiAgPjtcclxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRWYWx1ZXMsIFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcbmltcG9ydCB7IHVzZVdhdGNoIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuXHJcbi8qKlxyXG4gKiBVdGlsaXR5IHdhdGNoIGZ1bmN0aW9ucyBmb3IgUmVhY3QgSG9vayBGb3JtXHJcbiAqIEVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkgZm9yIHNwZWNpZmljIHVzZSBjYXNlc1xyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBXYXRjaCBmaWVsZCB3aXRoIHRyYW5zZm9ybWF0aW9uL3NlbGVjdG9yXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hUcmFuc2Zvcm0gPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbiAgVE91dHB1dCxcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgbmFtZTogVE5hbWUsXHJcbiAgdHJhbnNmb3JtOiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE91dHB1dFxyXG4pOiBUT3V0cHV0ID0+IHtcclxuICBjb25zdCB2YWx1ZSA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcclxuXHJcbiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gdHJhbnNmb3JtKHZhbHVlKSwgW3ZhbHVlLCB0cmFuc2Zvcm1dKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBXYXRjaCBmaWVsZCB3aXRoIGRlZmF1bHQgZmFsbGJhY2sgdmFsdWVcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlZmF1bHQgPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4oXHJcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxyXG4gIG5hbWU6IFROYW1lLFxyXG4gIGRlZmF1bHRWYWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XHJcbik6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XHJcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XHJcblxyXG4gIHJldHVybiB2YWx1ZSA/PyBkZWZhdWx0VmFsdWU7XHJcbn07XHJcblxyXG4vKipcclxuICogV2F0Y2ggZmllbGQgYXMgYm9vbGVhbiB3aXRoIGd1YXJhbnRlZWQgYm9vbGVhbiByZXR1cm5cclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJvb2xlYW4gPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4oXHJcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxyXG4gIG5hbWU6IFROYW1lLFxyXG4gIGRlZmF1bHRWYWx1ZSA9IGZhbHNlXHJcbik6IGJvb2xlYW4gPT4ge1xyXG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xyXG5cclxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSA/PyBkZWZhdWx0VmFsdWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFdhdGNoIG11bHRpcGxlIGZpZWxkcyBhbmQgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGZpZWxkIHBhdGhzIGFzIGtleXNcclxuICovXHJcbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJhdGNoID0gPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxyXG4gIFRGaWVsZHMgZXh0ZW5kcyBSZWFkb25seUFycmF5PFBhdGg8VEZpZWxkVmFsdWVzPj4sXHJcbj4oXHJcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxyXG4gIGZpZWxkczogVEZpZWxkc1xyXG4pOiB7IFtLIGluIFRGaWVsZHNbbnVtYmVyXV06IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIEs+IH0gPT4ge1xyXG4gIGNvbnN0IHZhbHVlcyA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZTogZmllbGRzIH0pO1xyXG5cclxuICByZXR1cm4gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB7IFtLIGluIFRGaWVsZHNbbnVtYmVyXV06IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIEs+IH07XHJcblxyXG4gICAgZmllbGRzLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xyXG4gICAgICByZXN1bHRbZmllbGQgYXMgVEZpZWxkc1tudW1iZXJdXSA9IHZhbHVlc1tpbmRleF07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH0sIFt2YWx1ZXMsIGZpZWxkc10pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFdhdGNoIGZpZWxkIGNvbmRpdGlvbmFsbHkgYmFzZWQgb24gYm9vbGVhbiBmbGFnXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hDb25kaXRpb25hbCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgbmFtZTogVE5hbWUsXHJcbiAgc2hvdWxkV2F0Y2g6IGJvb2xlYW4sXHJcbiAgZmFsbGJhY2s/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cclxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+IHwgdW5kZWZpbmVkID0+IHtcclxuICBjb25zdCBhY3RpdmVWYWx1ZSA9IHVzZVdhdGNoKHtcclxuICAgIGNvbnRyb2wsXHJcbiAgICBuYW1lLFxyXG4gICAgZGlzYWJsZWQ6ICFzaG91bGRXYXRjaCxcclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIHNob3VsZFdhdGNoID8gYWN0aXZlVmFsdWUgOiBmYWxsYmFjaztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBXYXRjaCBmaWVsZCB3aXRoIGRlYm91bmNlZCB1cGRhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hEZWJvdW5jZWQgPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4oXHJcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxyXG4gIG5hbWU6IFROYW1lLFxyXG4gIGRlbGF5ID0gMzAwXHJcbik6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XHJcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XHJcbiAgY29uc3QgW2RlYm91bmNlZFZhbHVlLCBzZXREZWJvdW5jZWRWYWx1ZV0gPVxyXG4gICAgdXNlU3RhdGU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+Pih2YWx1ZSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBzZXREZWJvdW5jZWRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9LCBkZWxheSk7XHJcblxyXG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgfSwgW3ZhbHVlLCBkZWxheV0pO1xyXG5cclxuICByZXR1cm4gZGVib3VuY2VkVmFsdWU7XHJcbn07XHJcblxyXG4vKipcclxuICogV2F0Y2ggZmllbGQgd2l0aCBtZW1vaXplZCBzZWxlY3RvciBmdW5jdGlvblxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZVdhdGNoU2VsZWN0b3IgPSA8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbiAgVE91dHB1dCxcclxuPihcclxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXHJcbiAgbmFtZTogVE5hbWUsXHJcbiAgc2VsZWN0b3I6ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3V0cHV0LFxyXG4gIGRlcHM6IFJlYWN0LkRlcGVuZGVuY3lMaXN0ID0gW11cclxuKTogVE91dHB1dCA9PiB7XHJcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XHJcblxyXG4gIHJldHVybiB1c2VNZW1vKFxyXG4gICAgKCkgPT4gc2VsZWN0b3IodmFsdWUpLFxyXG4gICAgW3ZhbHVlLCBzZWxlY3RvciwgLi4uZGVwc10gLy8gZXNsaW50LWRpc2FibGUtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICApO1xyXG59O1xyXG4iLCAiLyoqXHJcbiAqIEVuaGFuY2VkIFR5cGVTY3JpcHQgdXRpbGl0aWVzIGZvciBSZWFjdCBIb29rIEZvcm0ncyB1c2VXYXRjaFxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgc2V0IG9mIHR5cGUtc2FmZSB3YXRjaCBmdW5jdGlvbnNcclxuICogd2l0aCBiZXR0ZXIgZXJnb25vbWljcyBhbmQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGltcG9ydCB7IHVzZVdhdGNoRmllbGQsIHVzZVdhdGNoQm9vbGVhbiwgdHlwZWRXYXRjaCB9IGZyb20gJ3NyYy91dGlscy93YXRjaCc7XHJcbiAqXHJcbiAqIC8vIERpcmVjdCB1c2FnZSAoaW5zaWRlIFJlYWN0IGNvbXBvbmVudHMpXHJcbiAqIGNvbnN0IGVtYWlsID0gdXNlV2F0Y2hGaWVsZChjb250cm9sLCAndXNlci5lbWFpbCcpO1xyXG4gKiBjb25zdCBpc0FkbWluID0gdXNlV2F0Y2hCb29sZWFuKGNvbnRyb2wsICd1c2VyLmlzQWRtaW4nKTtcclxuICpcclxuICogLy8gT2JqZWN0LWJhc2VkIHVzYWdlIChpbnNpZGUgUmVhY3QgY29tcG9uZW50cylcclxuICogY29uc3QgZW1haWwgPSB0eXBlZFdhdGNoLmZpZWxkKGNvbnRyb2wsICd1c2VyLmVtYWlsJyk7XHJcbiAqIGNvbnN0IGlzQWRtaW4gPSB0eXBlZFdhdGNoLmJvb2xlYW4oY29udHJvbCwgJ3VzZXIuaXNBZG1pbicpO1xyXG4gKiBgYGBcclxuICovXHJcblxyXG4vLyBDb3JlIGZ1bmN0aW9uc1xyXG5leHBvcnQgeyB1c2VXYXRjaEZpZWxkLCB1c2VXYXRjaEZpZWxkcywgdXNlV2F0Y2hGb3JtIH0gZnJvbSAnLi9jb3JlJztcclxuXHJcbi8vIFV0aWxpdHkgZnVuY3Rpb25zXHJcbmV4cG9ydCB7XHJcbiAgdXNlV2F0Y2hCYXRjaCxcclxuICB1c2VXYXRjaEJvb2xlYW4sXHJcbiAgdXNlV2F0Y2hDb25kaXRpb25hbCxcclxuICB1c2VXYXRjaERlYm91bmNlZCxcclxuICB1c2VXYXRjaERlZmF1bHQsXHJcbiAgdXNlV2F0Y2hTZWxlY3RvcixcclxuICB1c2VXYXRjaFRyYW5zZm9ybSxcclxufSBmcm9tICcuL3V0aWxpdGllcyc7XHJcblxyXG5leHBvcnQgdHlwZSB7IFBhdGhBcnJheSB9IGZyb20gJy4vY29yZSc7XHJcblxyXG4vLyBJbXBvcnQgYWxsIGZ1bmN0aW9ucyBmb3IgZGVmYXVsdCBleHBvcnRcclxuaW1wb3J0IHsgdXNlV2F0Y2hGaWVsZCwgdXNlV2F0Y2hGaWVsZHMsIHVzZVdhdGNoRm9ybSB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgdXNlV2F0Y2hCYXRjaCxcclxuICB1c2VXYXRjaEJvb2xlYW4sXHJcbiAgdXNlV2F0Y2hDb25kaXRpb25hbCxcclxuICB1c2VXYXRjaERlYm91bmNlZCxcclxuICB1c2VXYXRjaERlZmF1bHQsXHJcbiAgdXNlV2F0Y2hTZWxlY3RvcixcclxuICB1c2VXYXRjaFRyYW5zZm9ybSxcclxufSBmcm9tICcuL3V0aWxpdGllcyc7XHJcblxyXG4vKipcclxuICogT3JnYW5pemVkIHV0aWxpdGllcyBieSB1c2UgY2FzZVxyXG4gKiBQcm92aWRlcyBhIGNvbnZlbmllbnQgb2JqZWN0LWJhc2VkIEFQSSBmb3IgYWxsIHdhdGNoIGZ1bmN0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHR5cGVkV2F0Y2ggPSB7XHJcbiAgLy8gPT09IENPUkUgRlVOQ1RJT05TID09PVxyXG4gIC8qKiBXYXRjaCBlbnRpcmUgZm9ybSAqL1xyXG4gIGZvcm06IHVzZVdhdGNoRm9ybSxcclxuICAvKiogV2F0Y2ggc2luZ2xlIGZpZWxkICovXHJcbiAgZmllbGQ6IHVzZVdhdGNoRmllbGQsXHJcbiAgLyoqIFdhdGNoIG11bHRpcGxlIGZpZWxkcyAqL1xyXG4gIGZpZWxkczogdXNlV2F0Y2hGaWVsZHMsXHJcblxyXG4gIC8vID09PSBVVElMSVRZIEZVTkNUSU9OUyA9PT1cclxuICAvKiogV2F0Y2ggd2l0aCB0cmFuc2Zvcm1hdGlvbiAqL1xyXG4gIHRyYW5zZm9ybTogdXNlV2F0Y2hUcmFuc2Zvcm0sXHJcbiAgLyoqIFdhdGNoIHdpdGggZGVmYXVsdCB2YWx1ZSAqL1xyXG4gIHdpdGhEZWZhdWx0OiB1c2VXYXRjaERlZmF1bHQsXHJcbiAgLyoqIFdhdGNoIGFzIGJvb2xlYW4gKi9cclxuICBib29sZWFuOiB1c2VXYXRjaEJvb2xlYW4sXHJcbiAgLyoqIFdhdGNoIG11bHRpcGxlIHdpdGggY3VzdG9tIGtleXMgKi9cclxuICBiYXRjaDogdXNlV2F0Y2hCYXRjaCxcclxuICAvKiogV2F0Y2ggY29uZGl0aW9uYWxseSAqL1xyXG4gIGNvbmRpdGlvbmFsOiB1c2VXYXRjaENvbmRpdGlvbmFsLFxyXG4gIC8qKiBXYXRjaCB3aXRoIGRlYm91bmNpbmcgKi9cclxuICBkZWJvdW5jZWQ6IHVzZVdhdGNoRGVib3VuY2VkLFxyXG4gIC8qKiBXYXRjaCB3aXRoIHNlbGVjdG9yICovXHJcbiAgc2VsZWN0b3I6IHVzZVdhdGNoU2VsZWN0b3IsXHJcbn0gYXMgY29uc3Q7XHJcbiIsICJleHBvcnQgY29uc3QgY2FsY3VsYXRlRmlsdGVyQ291bnQgPSAobW9kZWw6IG9iamVjdCk6IG51bWJlciA9PlxyXG4gIE9iamVjdC52YWx1ZXMobW9kZWwpLmZpbHRlcihcclxuICAgIHYgPT4gdiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKHYpLnRyaW0oKSAhPT0gJydcclxuICApLmxlbmd0aDtcclxuIiwgImltcG9ydCB0eXBlIHsgRGF5anMsIE9wVW5pdFR5cGUgfSBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCBkdXJhdGlvbiBmcm9tICdkYXlqcy9wbHVnaW4vZHVyYXRpb24nO1xyXG5pbXBvcnQgcmVsYXRpdmVUaW1lIGZyb20gJ2RheWpzL3BsdWdpbi9yZWxhdGl2ZVRpbWUnO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBEb2NzXHJcbiAqIGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvZm9ybWF0XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgdGltZXpvbmVzXHJcbiAqIGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL3RpbWV6b25lL3NldC1kZWZhdWx0LXRpbWV6b25lI2RvY3NOYXZcclxuICpcclxuICovXHJcblxyXG4vKipcclxuICogVVRDXHJcbiAqIGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL3BsdWdpbi91dGNcclxuICogQGluc3RhbGxcclxuICogaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcclxuICogZGF5anMuZXh0ZW5kKHV0Yyk7XHJcbiAqIEB1c2FnZVxyXG4gKiBkYXlqcygpLnV0YygpLmZvcm1hdCgpXHJcbiAqXHJcbiAqL1xyXG5cclxuZGF5anMuZXh0ZW5kKGR1cmF0aW9uKTtcclxuZGF5anMuZXh0ZW5kKHJlbGF0aXZlVGltZSk7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgdHlwZSBEYXRlUGlja2VyRm9ybWF0ID1cclxuICB8IERheWpzXHJcbiAgfCBEYXRlXHJcbiAgfCBzdHJpbmdcclxuICB8IG51bWJlclxyXG4gIHwgbnVsbFxyXG4gIHwgdW5kZWZpbmVkO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZvcm1hdFBhdHRlcm5zID0ge1xyXG4gIGRhdGVUaW1lOiAnREQgTU1NIFlZWVkgaDptbSBBJywgLy8gMTcgQXByIDIwMjIgMTI6MDAgYW1cclxuICBkYXRlOiAnREQgTU1NIFlZWVknLCAvLyAxNyBBcHIgMjAyMlxyXG4gIG1vbnRoX3llYXJfc2hvcnRfZm9ybWF0OiAnTU1NIFlZWVknLFxyXG4gIG1vbnRoX3llYXJfZnVsbF9mb3JtYXQ6ICdNTU1NIFlZWVknLFxyXG4gIHllYXI6ICdZWVlZJyxcclxuICB0aW1lOiAnaDptbSBhJywgLy8gMTI6MDAgYW1cclxuICBzcGxpdDoge1xyXG4gICAgZGF0ZVRpbWU6ICdERC9NTS9ZWVlZIGg6bW0gQScsIC8vIDE3LzA0LzIwMjIgMTI6MDAgYW1cclxuICAgIGRhdGU6ICdERC9NTS9ZWVlZJywgLy8gMTcvMDQvMjAyMlxyXG4gIH0sXHJcbiAgcGFyYW1DYXNlOiB7XHJcbiAgICBkYXRlVGltZTogJ0RELU1NLVlZWVkgaDptbSBBJywgLy8gMTctMDQtMjAyMiAxMjowMCBhbVxyXG4gICAgZGF0ZTogJ0RELU1NLVlZWVknLCAvLyAxNy0wNC0yMDIyXHJcbiAgICBkYXRlUmV2ZXJzZTogJ1lZWVktTU0tREQnLCAvLyAyMDIyLTA0LTE3IGZvciBjb21wYXJlIGRhdGVcclxuICAgIE1vbnRoWWVhcjogJ01NTS1ZWVlZJyxcclxuICB9LFxyXG59O1xyXG5cclxuY29uc3QgaXNWYWxpZERhdGUgPSAoZGF0ZTogRGF0ZVBpY2tlckZvcm1hdCkgPT5cclxuICBkYXRlICE9PSBudWxsICYmIGRhdGUgIT09IHVuZGVmaW5lZCAmJiBkYXlqcyhkYXRlKS5pc1ZhbGlkKCk7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9kYXkodGVtcGxhdGU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBkYXlqcyhuZXcgRGF0ZSgpKS5zdGFydE9mKCdkYXknKS5mb3JtYXQodGVtcGxhdGUpO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKipcclxuICogQG91dHB1dCAxNyBBcHIgMjAyMiAxMjowMCBhbVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZEYXRlVGltZShkYXRlOiBEYXRlUGlja2VyRm9ybWF0LCB0ZW1wbGF0ZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKCFpc1ZhbGlkRGF0ZShkYXRlKSkge1xyXG4gICAgcmV0dXJuICdJbnZhbGlkIGRhdGUnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRheWpzKGRhdGUpLmZvcm1hdCh0ZW1wbGF0ZSA/PyBmb3JtYXRQYXR0ZXJucy5kYXRlVGltZSk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IDE3IEFwciAyMDIyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZkRhdGUoZGF0ZTogRGF0ZVBpY2tlckZvcm1hdCwgdGVtcGxhdGU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICghaXNWYWxpZERhdGUoZGF0ZSkpIHtcclxuICAgIHJldHVybiAnSW52YWxpZCBkYXRlJztcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXlqcyhkYXRlKS5mb3JtYXQodGVtcGxhdGUgPz8gZm9ybWF0UGF0dGVybnMuZGF0ZSk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IDEyOjAwIGFtXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZlRpbWUoZGF0ZTogRGF0ZVBpY2tlckZvcm1hdCwgdGVtcGxhdGU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICghaXNWYWxpZERhdGUoZGF0ZSkpIHtcclxuICAgIHJldHVybiAnSW52YWxpZCBkYXRlJztcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXlqcyhkYXRlKS5mb3JtYXQodGVtcGxhdGUgPz8gZm9ybWF0UGF0dGVybnMudGltZSk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IDE3MTMyNTAxMDBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmVGltZXN0YW1wKGRhdGU6IERhdGVQaWNrZXJGb3JtYXQpOiBudW1iZXIgfCAnSW52YWxpZCBkYXRlJyB7XHJcbiAgaWYgKCFpc1ZhbGlkRGF0ZShkYXRlKSkge1xyXG4gICAgcmV0dXJuICdJbnZhbGlkIGRhdGUnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRheWpzKGRhdGUpLnZhbHVlT2YoKTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBvdXRwdXQgYSBmZXcgc2Vjb25kcywgMiB5ZWFyc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZUb05vdyhkYXRlOiBEYXRlUGlja2VyRm9ybWF0KTogc3RyaW5nIHtcclxuICBpZiAoIWlzVmFsaWREYXRlKGRhdGUpKSB7XHJcbiAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF5anMoZGF0ZSkudG9Ob3codHJ1ZSk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IGJvb2xlYW5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmSXNCZXR3ZWVuKFxyXG4gIGlucHV0RGF0ZTogRGF0ZVBpY2tlckZvcm1hdCxcclxuICBzdGFydERhdGU6IERhdGVQaWNrZXJGb3JtYXQsXHJcbiAgZW5kRGF0ZTogRGF0ZVBpY2tlckZvcm1hdFxyXG4pOiBib29sZWFuIHtcclxuICBpZiAoXHJcbiAgICAhaXNWYWxpZERhdGUoaW5wdXREYXRlKSB8fFxyXG4gICAgIWlzVmFsaWREYXRlKHN0YXJ0RGF0ZSkgfHxcclxuICAgICFpc1ZhbGlkRGF0ZShlbmREYXRlKVxyXG4gICkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZm9ybWF0dGVkSW5wdXREYXRlID0gZlRpbWVzdGFtcChpbnB1dERhdGUpO1xyXG4gIGNvbnN0IGZvcm1hdHRlZFN0YXJ0RGF0ZSA9IGZUaW1lc3RhbXAoc3RhcnREYXRlKTtcclxuICBjb25zdCBmb3JtYXR0ZWRFbmREYXRlID0gZlRpbWVzdGFtcChlbmREYXRlKTtcclxuXHJcbiAgaWYgKFxyXG4gICAgZm9ybWF0dGVkSW5wdXREYXRlID09PSAnSW52YWxpZCBkYXRlJyB8fFxyXG4gICAgZm9ybWF0dGVkU3RhcnREYXRlID09PSAnSW52YWxpZCBkYXRlJyB8fFxyXG4gICAgZm9ybWF0dGVkRW5kRGF0ZSA9PT0gJ0ludmFsaWQgZGF0ZSdcclxuICApIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICBmb3JtYXR0ZWRJbnB1dERhdGUgPj0gZm9ybWF0dGVkU3RhcnREYXRlICYmXHJcbiAgICBmb3JtYXR0ZWRJbnB1dERhdGUgPD0gZm9ybWF0dGVkRW5kRGF0ZVxyXG4gICk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAb3V0cHV0IGJvb2xlYW5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmSXNBZnRlcihcclxuICBzdGFydERhdGU6IERhdGVQaWNrZXJGb3JtYXQsXHJcbiAgZW5kRGF0ZTogRGF0ZVBpY2tlckZvcm1hdFxyXG4pOiBib29sZWFuIHtcclxuICBpZiAoIWlzVmFsaWREYXRlKHN0YXJ0RGF0ZSkgfHwgIWlzVmFsaWREYXRlKGVuZERhdGUpKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF5anMoc3RhcnREYXRlKS5pc0FmdGVyKGVuZERhdGUpO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKipcclxuICogQG91dHB1dCBib29sZWFuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZklzU2FtZShcclxuICBzdGFydERhdGU6IERhdGVQaWNrZXJGb3JtYXQsXHJcbiAgZW5kRGF0ZTogRGF0ZVBpY2tlckZvcm1hdCxcclxuICB1bml0VG9Db21wYXJlPzogT3BVbml0VHlwZVxyXG4pOiBib29sZWFuIHtcclxuICBpZiAoIWlzVmFsaWREYXRlKHN0YXJ0RGF0ZSkgfHwgIWlzVmFsaWREYXRlKGVuZERhdGUpKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF5anMoc3RhcnREYXRlKS5pc1NhbWUoZW5kRGF0ZSwgdW5pdFRvQ29tcGFyZSA/PyAneWVhcicpO1xyXG59XHJcblxyXG4vKipcclxuICogQG91dHB1dFxyXG4gKiBTYW1lIGRheTogMjYgQXByIDIwMjRcclxuICogU2FtZSBtb250aDogMjUgLSAyNiBBcHIgMjAyNFxyXG4gKiBTYW1lIG1vbnRoOiAyNSAtIDI2IEFwciAyMDI0XHJcbiAqIFNhbWUgeWVhcjogMjUgQXByIC0gMjYgTWF5IDIwMjRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmRGF0ZVJhbmdlU2hvcnRMYWJlbChcclxuICBzdGFydERhdGU6IERhdGVQaWNrZXJGb3JtYXQsXHJcbiAgZW5kRGF0ZTogRGF0ZVBpY2tlckZvcm1hdCxcclxuICBpbml0aWFsPzogYm9vbGVhblxyXG4pOiBzdHJpbmcge1xyXG4gIGlmIChcclxuICAgICFpc1ZhbGlkRGF0ZShzdGFydERhdGUpIHx8XHJcbiAgICAhaXNWYWxpZERhdGUoZW5kRGF0ZSkgfHxcclxuICAgIGZJc0FmdGVyKHN0YXJ0RGF0ZSwgZW5kRGF0ZSlcclxuICApIHtcclxuICAgIHJldHVybiAnSW52YWxpZCBkYXRlJztcclxuICB9XHJcblxyXG4gIGxldCBsYWJlbCA9IGAke2ZEYXRlKHN0YXJ0RGF0ZSl9IC0gJHtmRGF0ZShlbmREYXRlKX1gO1xyXG5cclxuICBpZiAoaW5pdGlhbCkge1xyXG4gICAgcmV0dXJuIGxhYmVsO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaXNTYW1lWWVhciA9IGZJc1NhbWUoc3RhcnREYXRlLCBlbmREYXRlLCAneWVhcicpO1xyXG4gIGNvbnN0IGlzU2FtZU1vbnRoID0gZklzU2FtZShzdGFydERhdGUsIGVuZERhdGUsICdtb250aCcpO1xyXG4gIGNvbnN0IGlzU2FtZURheSA9IGZJc1NhbWUoc3RhcnREYXRlLCBlbmREYXRlLCAnZGF5Jyk7XHJcblxyXG4gIGlmIChpc1NhbWVZZWFyICYmICFpc1NhbWVNb250aCkge1xyXG4gICAgbGFiZWwgPSBgJHtmRGF0ZShzdGFydERhdGUsICdERCBNTU0nKX0gLSAke2ZEYXRlKGVuZERhdGUpfWA7XHJcbiAgfSBlbHNlIGlmIChpc1NhbWVZZWFyICYmIGlzU2FtZU1vbnRoICYmICFpc1NhbWVEYXkpIHtcclxuICAgIGxhYmVsID0gYCR7ZkRhdGUoc3RhcnREYXRlLCAnREQnKX0gLSAke2ZEYXRlKGVuZERhdGUpfWA7XHJcbiAgfSBlbHNlIGlmIChpc1NhbWVZZWFyICYmIGlzU2FtZU1vbnRoICYmIGlzU2FtZURheSkge1xyXG4gICAgbGFiZWwgPSBgJHtmRGF0ZShlbmREYXRlKX1gO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGxhYmVsO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKipcclxuICogQG91dHB1dCAyMDI0LTA1LTI4VDA1OjU1OjMxKzAwOjAwXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIER1cmF0aW9uUHJvcHMge1xyXG4gIHllYXJzPzogbnVtYmVyO1xyXG4gIG1vbnRocz86IG51bWJlcjtcclxuICBkYXlzPzogbnVtYmVyO1xyXG4gIGhvdXJzPzogbnVtYmVyO1xyXG4gIG1pbnV0ZXM/OiBudW1iZXI7XHJcbiAgc2Vjb25kcz86IG51bWJlcjtcclxuICBtaWxsaXNlY29uZHM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmQWRkKHtcclxuICB5ZWFycyA9IDAsXHJcbiAgbW9udGhzID0gMCxcclxuICBkYXlzID0gMCxcclxuICBob3VycyA9IDAsXHJcbiAgbWludXRlcyA9IDAsXHJcbiAgc2Vjb25kcyA9IDAsXHJcbiAgbWlsbGlzZWNvbmRzID0gMCxcclxufTogRHVyYXRpb25Qcm9wcykge1xyXG4gIGNvbnN0IHJlc3VsdCA9IGRheWpzKClcclxuICAgIC5hZGQoXHJcbiAgICAgIGRheWpzLmR1cmF0aW9uKHtcclxuICAgICAgICB5ZWFycyxcclxuICAgICAgICBtb250aHMsXHJcbiAgICAgICAgZGF5cyxcclxuICAgICAgICBob3VycyxcclxuICAgICAgICBtaW51dGVzLFxyXG4gICAgICAgIHNlY29uZHMsXHJcbiAgICAgICAgbWlsbGlzZWNvbmRzLFxyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICAgLmZvcm1hdCgpO1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKipcclxuICogQG91dHB1dCAyMDI0LTA1LTI4VDA1OjU1OjMxKzAwOjAwXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZlN1Yih7XHJcbiAgeWVhcnMgPSAwLFxyXG4gIG1vbnRocyA9IDAsXHJcbiAgZGF5cyA9IDAsXHJcbiAgaG91cnMgPSAwLFxyXG4gIG1pbnV0ZXMgPSAwLFxyXG4gIHNlY29uZHMgPSAwLFxyXG4gIG1pbGxpc2Vjb25kcyA9IDAsXHJcbn06IER1cmF0aW9uUHJvcHMpIHtcclxuICBjb25zdCByZXN1bHQgPSBkYXlqcygpXHJcbiAgICAuc3VidHJhY3QoXHJcbiAgICAgIGRheWpzLmR1cmF0aW9uKHtcclxuICAgICAgICB5ZWFycyxcclxuICAgICAgICBtb250aHMsXHJcbiAgICAgICAgZGF5cyxcclxuICAgICAgICBob3VycyxcclxuICAgICAgICBtaW51dGVzLFxyXG4gICAgICAgIHNlY29uZHMsXHJcbiAgICAgICAgbWlsbGlzZWNvbmRzLFxyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICAgLmZvcm1hdCgpO1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbiIsICJ0eXBlIEVtcHR5VmFsdWU8VD4gPSBUIGV4dGVuZHMgbnVtYmVyXHJcbiAgPyAwXHJcbiAgOiBUIGV4dGVuZHMgc3RyaW5nXHJcbiAgICA/IG51bGxcclxuICAgIDogVCBleHRlbmRzIGJvb2xlYW5cclxuICAgICAgPyBudWxsXHJcbiAgICAgIDogVCBleHRlbmRzIERhdGVcclxuICAgICAgICA/IG51bGxcclxuICAgICAgICA6IFQgZXh0ZW5kcyBvYmplY3RcclxuICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgOiBudWxsO1xyXG5cclxudHlwZSBFbXB0eU9iamVjdDxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcclxuICBbSyBpbiBrZXlvZiBUXTogRW1wdHlWYWx1ZTxUW0tdPjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbXB0eU9iamVjdDxUIGV4dGVuZHMgb2JqZWN0PihcclxuICBkYXRhOiBULFxyXG4gIGRlZmF1bHRWYWx1ZXM6IFBhcnRpYWw8VD4gPSB7fVxyXG4pOiBFbXB0eU9iamVjdDxUPiAmIFBhcnRpYWw8VD4ge1xyXG4gIGNvbnN0IG9iaiA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhkYXRhKSBhcyBBcnJheTxrZXlvZiBUPikge1xyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW2tleV07XHJcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG5cclxuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICBvYmpba2V5IGFzIHN0cmluZ10gPSAwO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgb2JqW2tleSBhcyBzdHJpbmddID0gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIG9ialtrZXkgYXMgc3RyaW5nXSA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmpba2V5IGFzIHN0cmluZ10gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgLi4ub2JqLCAuLi5kZWZhdWx0VmFsdWVzIH0gYXMgRW1wdHlPYmplY3Q8VD4gJiBQYXJ0aWFsPFQ+O1xyXG59XHJcbiIsICJpbXBvcnQgeyB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XHJcblxyXG4vKipcclxuICogSG9vayB0byBtYWludGFpbiBzdGFibGUgcm93IGNvdW50IGZvciBkYXRhIGdyaWRzIGR1cmluZyBsb2FkaW5nIHN0YXRlcy5cclxuICogUHJldmVudHMgcGFnaW5hdGlvbiBqdW1waW5nIGJ5IHByZXNlcnZpbmcgdGhlIGxhc3Qga25vd24gdG90YWwgY291bnQuXHJcbiAqXHJcbiAqIEBwYXJhbSBjdXJyZW50VG90YWwgLSBDdXJyZW50IHRvdGFsIGZyb20gQVBJIHJlc3BvbnNlXHJcbiAqIEByZXR1cm5zIFN0YWJsZSByb3cgY291bnQgdGhhdCBwZXJzaXN0cyBkdXJpbmcgbG9hZGluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0YWJsZVJvd0NvdW50KGN1cnJlbnRUb3RhbDogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcclxuICBjb25zdCByb3dDb3VudFJlZiA9IHVzZVJlZihjdXJyZW50VG90YWwgfHwgMCk7XHJcblxyXG4gIGNvbnN0IHN0YWJsZVJvd0NvdW50ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBpZiAoY3VycmVudFRvdGFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcm93Q291bnRSZWYuY3VycmVudCA9IGN1cnJlbnRUb3RhbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcm93Q291bnRSZWYuY3VycmVudDtcclxuICB9LCBbY3VycmVudFRvdGFsXSk7XHJcblxyXG4gIHJldHVybiBzdGFibGVSb3dDb3VudDtcclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBd0JBLFNBQVMsZUFBdUI7QUFDOUIsTUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLFlBQVk7QUFDdEQsV0FBTyxPQUFPLFdBQVc7QUFBQSxFQUMzQjtBQUdBLFNBQU8sdUNBQXVDLFFBQVEsU0FBUyxPQUFLO0FBQ2xFLFVBQU0sSUFBSyxLQUFLLE9BQU8sSUFBSSxLQUFNO0FBQ2pDLFVBQU0sSUFBSSxNQUFNLE1BQU0sSUFBSyxJQUFJLElBQU87QUFFdEMsV0FBTyxFQUFFLFNBQVMsRUFBRTtBQUFBLEVBQ3RCLENBQUM7QUFDSDtBQTRDTyxTQUFTLHNCQUFzQixRQUF5QjtBQUM3RCxRQUFNLE9BQU8sYUFBYTtBQUUxQixTQUFPLFNBQVMsR0FBRyxNQUFNLElBQUksSUFBSSxLQUFLO0FBQ3hDOzs7QUNqRU8sSUFBTSxrQkFBTixNQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXFCM0IsYUFBYSxRQUE4QjtBQUN6QyxRQUFJLFVBQVUsT0FBTyxTQUFTLEtBQUs7QUFDakMsYUFBTyxXQUFXLE1BQU0scUJBQXFCO0FBQUEsSUFDL0MsV0FBVyxVQUFVLEtBQUs7QUFD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QSxFQUNWLFVBQVU7QUFBQSxFQUNWLGVBQWU7QUFDakIsR0FBa0I7QUFDaEIsUUFBTSxTQUFTLE1BQU0sRUFDbEI7QUFBQSxJQUNDLE1BQU0sU0FBUztBQUFBLE1BQ2I7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNILEVBQ0MsT0FBTztBQUVWLFNBQU87QUFDVDs7O0FDelNPLFNBQVMsZUFDZCxNQUNBLGdCQUE0QixDQUFDLEdBQ0E7QUFDN0IsUUFBTSxNQUFNLENBQUM7QUFFYixhQUFXLE9BQU8sT0FBTyxLQUFLLElBQUksR0FBcUI7QUFDckQsVUFBTSxRQUFRLEtBQUssR0FBRztBQUN0QixVQUFNLE9BQU8sT0FBTztBQUVwQixRQUFJLFNBQVMsVUFBVTtBQUNyQixVQUFJLEdBQWEsSUFBSTtBQUFBLElBQ3ZCLFdBQVcsU0FBUyxZQUFZLFNBQVMsV0FBVztBQUNsRCxVQUFJLEdBQWEsSUFBSTtBQUFBLElBQ3ZCLFdBQVcsaUJBQWlCLE1BQU07QUFDaEMsVUFBSSxHQUFhLElBQUk7QUFBQSxJQUN2QixPQUFPO0FBQ0wsVUFBSSxHQUFhLElBQUk7QUFBQSxJQUN2QjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLEVBQUUsR0FBRyxLQUFLLEdBQUcsY0FBYztBQUNwQzs7O0FDdENBLFNBQVMsUUFBUSxXQUFBRyxnQkFBZTtBQVN6QixTQUFTLGtCQUFrQixjQUEwQztBQUMxRSxRQUFNLGNBQWMsT0FBTyxnQkFBZ0IsQ0FBQztBQUU1QyxRQUFNLGlCQUFpQkEsU0FBUSxNQUFNO0FBQ25DLFFBQUksaUJBQWlCLFFBQVc7QUFDOUIsa0JBQVksVUFBVTtBQUFBLElBQ3hCO0FBRUEsV0FBTyxZQUFZO0FBQUEsRUFDckIsR0FBRyxDQUFDLFlBQVksQ0FBQztBQUVqQixTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImNvbmZpZyIsICJqc3giLCAiQnV0dG9uIiwgImpzeCIsICJqc3giLCAianN4IiwgImpzeCIsICJtZW1vIiwgImpzeCIsICJtZW1vIiwgIkJveCIsICJDYXJkIiwgIkNhcmRDb250ZW50IiwgIlR5cG9ncmFwaHkiLCAiRnJhZ21lbnQiLCAianN4IiwgImpzeHMiLCAiQm94IiwgIlR5cG9ncmFwaHkiLCAianN4IiwgIkdyaWQiLCAiVHlwb2dyYXBoeSIsICJqc3giLCAianN4cyIsICJGcmFnbWVudCIsICJqc3giLCAiQm94IiwgIkRpdmlkZXIiLCAiR3JpZCIsICJUeXBvZ3JhcGh5IiwgIm1lbW8iLCAidXNlTWVtbyIsICJGcmFnbWVudCIsICJqc3giLCAianN4cyIsICJCb3giLCAianN4IiwgImpzeHMiLCAiTG9hZGluZ0J1dHRvbiIsICJqc3giLCAidXNlTWVtbyIsICJ1c2VNZW1vIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VTdGF0ZSIsICJ1c2VXYXRjaCIsICJ1c2VNZW1vIl0KfQo=