@nauth-toolkit/client-angular 0.1.92 → 0.1.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/recaptcha-provider.mjs +52 -0
- package/esm2022/lib/recaptcha.service.mjs +14 -2
- package/esm2022/ngmodule/auth.service.mjs +1 -1
- package/esm2022/ngmodule/nauth.module.mjs +60 -27
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/nauth-toolkit-client-angular.mjs +122 -28
- package/fesm2022/nauth-toolkit-client-angular.mjs.map +1 -1
- package/lib/recaptcha-provider.d.ts +27 -0
- package/ngmodule/nauth.module.d.ts +17 -3
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { inject, makeEnvironmentProviders, APP_INITIALIZER } from '@angular/core';
|
|
2
|
+
import { RecaptchaService, RECAPTCHA_CONFIG } from './recaptcha.service';
|
|
3
|
+
/**
|
|
4
|
+
* Provides reCAPTCHA configuration and automatic script preloading.
|
|
5
|
+
*
|
|
6
|
+
* Sets up `RECAPTCHA_CONFIG` and forces `RecaptchaService` instantiation at app
|
|
7
|
+
* startup so the reCAPTCHA script preloads before the user clicks login/signup.
|
|
8
|
+
*
|
|
9
|
+
* @param config - reCAPTCHA configuration (enabled, version, siteKey, action)
|
|
10
|
+
* @returns Environment providers for reCAPTCHA
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* export const appConfig: ApplicationConfig = {
|
|
15
|
+
* providers: [
|
|
16
|
+
* provideRecaptcha({
|
|
17
|
+
* enabled: true,
|
|
18
|
+
* version: 'enterprise',
|
|
19
|
+
* siteKey: environment.recaptchaSiteKey,
|
|
20
|
+
* action: 'login',
|
|
21
|
+
* }),
|
|
22
|
+
* // ... other providers
|
|
23
|
+
* ],
|
|
24
|
+
* };
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function provideRecaptcha(config) {
|
|
28
|
+
return makeEnvironmentProviders([
|
|
29
|
+
{
|
|
30
|
+
provide: RECAPTCHA_CONFIG,
|
|
31
|
+
useValue: config,
|
|
32
|
+
},
|
|
33
|
+
RecaptchaService,
|
|
34
|
+
{
|
|
35
|
+
provide: APP_INITIALIZER,
|
|
36
|
+
useFactory: () => {
|
|
37
|
+
const recaptcha = inject(RecaptchaService);
|
|
38
|
+
// Return initialization function that ensures script starts loading
|
|
39
|
+
return () => {
|
|
40
|
+
// Trigger script load (fire-and-forget, don't block app startup)
|
|
41
|
+
if (config.enabled && (config.version === 'v3' || config.version === 'enterprise')) {
|
|
42
|
+
recaptcha.loadScript().catch(() => {
|
|
43
|
+
// Silent fail - execute() will retry when called
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
multi: true,
|
|
49
|
+
},
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNhcHRjaGEtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBd0Isd0JBQXdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBOEI7SUFDN0QsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QjtZQUNFLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsUUFBUSxFQUFFLE1BQU07U0FDakI7UUFDRCxnQkFBZ0I7UUFDaEI7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzQyxvRUFBb0U7Z0JBQ3BFLE9BQU8sR0FBRyxFQUFFO29CQUNWLGlFQUFpRTtvQkFDakUsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDO3dCQUNuRixTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTs0QkFDaEMsaURBQWlEO3dCQUNuRCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycywgQVBQX0lOSVRJQUxJWkVSIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWNhcHRjaGFTZXJ2aWNlLCBSRUNBUFRDSEFfQ09ORklHLCBSZWNhcHRjaGFTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi9yZWNhcHRjaGEuc2VydmljZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gYW5kIGF1dG9tYXRpYyBzY3JpcHQgcHJlbG9hZGluZy5cbiAqXG4gKiBTZXRzIHVwIGBSRUNBUFRDSEFfQ09ORklHYCBhbmQgZm9yY2VzIGBSZWNhcHRjaGFTZXJ2aWNlYCBpbnN0YW50aWF0aW9uIGF0IGFwcFxuICogc3RhcnR1cCBzbyB0aGUgcmVDQVBUQ0hBIHNjcmlwdCBwcmVsb2FkcyBiZWZvcmUgdGhlIHVzZXIgY2xpY2tzIGxvZ2luL3NpZ251cC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gKGVuYWJsZWQsIHZlcnNpb24sIHNpdGVLZXksIGFjdGlvbilcbiAqIEByZXR1cm5zIEVudmlyb25tZW50IHByb3ZpZGVycyBmb3IgcmVDQVBUQ0hBXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjb25zdCBhcHBDb25maWc6IEFwcGxpY2F0aW9uQ29uZmlnID0ge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlUmVjYXB0Y2hhKHtcbiAqICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gKiAgICAgICB2ZXJzaW9uOiAnZW50ZXJwcmlzZScsXG4gKiAgICAgICBzaXRlS2V5OiBlbnZpcm9ubWVudC5yZWNhcHRjaGFTaXRlS2V5LFxuICogICAgICAgYWN0aW9uOiAnbG9naW4nLFxuICogICAgIH0pLFxuICogICAgIC8vIC4uLiBvdGhlciBwcm92aWRlcnNcbiAqICAgXSxcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVSZWNhcHRjaGEoY29uZmlnOiBSZWNhcHRjaGFTZXJ2aWNlQ29uZmlnKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBSRUNBUFRDSEFfQ09ORklHLFxuICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICB9LFxuICAgIFJlY2FwdGNoYVNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4ge1xuICAgICAgICBjb25zdCByZWNhcHRjaGEgPSBpbmplY3QoUmVjYXB0Y2hhU2VydmljZSk7XG4gICAgICAgIC8vIFJldHVybiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0aGF0IGVuc3VyZXMgc2NyaXB0IHN0YXJ0cyBsb2FkaW5nXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgLy8gVHJpZ2dlciBzY3JpcHQgbG9hZCAoZmlyZS1hbmQtZm9yZ2V0LCBkb24ndCBibG9jayBhcHAgc3RhcnR1cClcbiAgICAgICAgICBpZiAoY29uZmlnLmVuYWJsZWQgJiYgKGNvbmZpZy52ZXJzaW9uID09PSAndjMnIHx8IGNvbmZpZy52ZXJzaW9uID09PSAnZW50ZXJwcmlzZScpKSB7XG4gICAgICAgICAgICByZWNhcHRjaGEubG9hZFNjcmlwdCgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gU2lsZW50IGZhaWwgLSBleGVjdXRlKCkgd2lsbCByZXRyeSB3aGVuIGNhbGxlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
|
|
@@ -4,7 +4,10 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
/**
|
|
5
5
|
* Injection token for reCAPTCHA configuration
|
|
6
6
|
*/
|
|
7
|
-
export const RECAPTCHA_CONFIG = new InjectionToken('RECAPTCHA_CONFIG'
|
|
7
|
+
export const RECAPTCHA_CONFIG = new InjectionToken('RECAPTCHA_CONFIG', {
|
|
8
|
+
providedIn: 'root',
|
|
9
|
+
factory: () => undefined,
|
|
10
|
+
});
|
|
8
11
|
/**
|
|
9
12
|
* Google reCAPTCHA service for Angular applications.
|
|
10
13
|
*
|
|
@@ -49,6 +52,15 @@ export class RecaptchaService {
|
|
|
49
52
|
this.platformId = platformId;
|
|
50
53
|
this.config = config;
|
|
51
54
|
this.platform = this.detectPlatform();
|
|
55
|
+
// Auto-preload script for v3/Enterprise so it's ready before first login/signup
|
|
56
|
+
// No-op when disabled, shouldSkip, or v2 (v2 renders on-demand)
|
|
57
|
+
if (this.config?.enabled && (this.config.version === 'v3' || this.config.version === 'enterprise')) {
|
|
58
|
+
if (!this.shouldSkip()) {
|
|
59
|
+
this.loadScript().catch(() => {
|
|
60
|
+
// Silently fail - execute() will handle errors when called
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
52
64
|
}
|
|
53
65
|
// ============================================================================
|
|
54
66
|
// Platform Detection
|
|
@@ -356,4 +368,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
356
368
|
type: Inject,
|
|
357
369
|
args: [RECAPTCHA_CONFIG]
|
|
358
370
|
}] }] });
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY2FwdGNoYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQTJCcEQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBeUIsa0JBQWtCLENBQUMsQ0FBQztBQUUvRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBT0k7SUFDaUI7SUFQeEMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixhQUFhLEdBQXlCLElBQUksQ0FBQztJQUMzQyxRQUFRLENBQVc7SUFDbkIsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFFdkMsWUFDK0IsVUFBa0IsRUFDRCxNQUErQjtRQURoRCxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0QsV0FBTSxHQUFOLE1BQU0sQ0FBeUI7UUFFN0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxxQkFBcUI7SUFDckIsK0VBQStFO0lBRS9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSyxjQUFjO1FBQ3BCLGdCQUFnQjtRQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELE1BQU0sU0FBUyxHQUFHLE1BQThELENBQUM7UUFFakYsSUFBSSxTQUFTLENBQUMsU0FB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QztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQzFFLE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsUUFBaUI7UUFDckIsTUFBTSxVQUFVLEdBQUksTUFBbUUsQ0FBQyxVQUFVLENBQUM7UUFFbkcsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7UUFDMUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDO3dHQS9VVSxnQkFBZ0Isa0JBT2pCLFdBQVcsYUFDQyxnQkFBZ0I7NEdBUjNCLGdCQUFnQixjQUZmLE1BQU07OzRGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFJLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBQTEFURk9STV9JRCwgT3B0aW9uYWwsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgY3VycmVudCBwbGF0Zm9ybSBlbnZpcm9ubWVudFxuICovXG50eXBlIFBsYXRmb3JtID0gJ3dlYicgfCAnY2FwYWNpdG9yLXdlYnZpZXcnIHwgJ2NhcGFjaXRvci1uYXRpdmUnIHwgJ3Nzcic7XG5cbi8qKlxuICogcmVDQVBUQ0hBIHZlcnNpb24gdHlwZVxuICovXG50eXBlIFJlY2FwdGNoYVZlcnNpb24gPSAndjInIHwgJ3YzJyB8ICdlbnRlcnByaXNlJztcblxuLyoqXG4gKiByZUNBUFRDSEEgY29uZmlndXJhdGlvbiBmb3IgUmVjYXB0Y2hhU2VydmljZVxuICogXG4gKiBJbnRlcm5hbCBjb25maWd1cmF0aW9uIGludGVyZmFjZSB1c2VkIGJ5IFJlY2FwdGNoYVNlcnZpY2UuXG4gKiBVc2UgUmVjYXB0Y2hhQW5ndWxhckNvbmZpZyBmcm9tIHRva2Vucy50cyBmb3IgYXBwIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYXB0Y2hhU2VydmljZUNvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIHZlcnNpb246IFJlY2FwdGNoYVZlcnNpb247XG4gIHNpdGVLZXk6IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBhdXRvTG9hZFNjcmlwdD86IGJvb2xlYW47XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFJFQ0FQVENIQV9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48UmVjYXB0Y2hhU2VydmljZUNvbmZpZz4oJ1JFQ0FQVENIQV9DT05GSUcnKTtcblxuLyoqXG4gKiBHb29nbGUgcmVDQVBUQ0hBIHNlcnZpY2UgZm9yIEFuZ3VsYXIgYXBwbGljYXRpb25zLlxuICpcbiAqIFByb3ZpZGVzIGxhenkgbG9hZGluZyBvZiByZUNBUFRDSEEgc2NyaXB0IGFuZCBwbGF0Zm9ybS1hd2FyZSB0b2tlbiBnZW5lcmF0aW9uLlxuICogQXV0b21hdGljYWxseSBkZXRlY3RzIHBsYXRmb3JtICh3ZWIsIENhcGFjaXRvciBXZWJWaWV3LCBDYXBhY2l0b3IgbmF0aXZlLCBTU1IpXG4gKiBhbmQgc2tpcHMgcmVDQVBUQ0hBIGluIGVudmlyb25tZW50cyB3aGVyZSBpdCdzIG5vdCBzdXBwb3J0ZWQgb3IgbmVlZGVkLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBMYXp5IHNjcmlwdCBsb2FkaW5nIChvbmx5IGxvYWRzIHdoZW4gbmVlZGVkKVxuICogLSB2MiAoY2hlY2tib3gpIGFuZCB2MyAoaW52aXNpYmxlKSBzdXBwb3J0XG4gKiAtIFBsYXRmb3JtIGRldGVjdGlvbiAod2ViLCBDYXBhY2l0b3IsIFNTUilcbiAqIC0gQXV0b21hdGljIHNraXAgZm9yIENhcGFjaXRvciBuYXRpdmUgbW9kZVxuICogLSBBdXRvbWF0aWMgc2tpcCBmb3IgU1NSXG4gKlxuICogQGV4YW1wbGUgdjMgQXV0b21hdGljIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVjYXB0Y2hhOiBSZWNhcHRjaGFTZXJ2aWNlKSB7fVxuICpcbiAqIGFzeW5jIGxvZ2luKCkge1xuICogICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMucmVjYXB0Y2hhLmV4ZWN1dGUoJ2xvZ2luJyk7XG4gKiAgIGF3YWl0IHRoaXMuYXV0aC5sb2dpbihlbWFpbCwgcGFzc3dvcmQsIHRva2VuKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIHYyIE1hbnVhbCBNb2RlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBuZ09uSW5pdCgpIHtcbiAqICAgdGhpcy5yZWNhcHRjaGEucmVuZGVyKCdyZWNhcHRjaGEtY29udGFpbmVyJywgKHRva2VuKSA9PiB7XG4gKiAgICAgdGhpcy5yZWNhcHRjaGFUb2tlbiA9IHRva2VuO1xuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUmVjYXB0Y2hhU2VydmljZSB7XG4gIHByaXZhdGUgc2NyaXB0TG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgc2NyaXB0TG9hZGluZzogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybTtcbiAgcHJpdmF0ZSB3aWRnZXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSRUNBUFRDSEFfQ09ORklHKSBwcml2YXRlIGNvbmZpZz86IFJlY2FwdGNoYVNlcnZpY2VDb25maWcsXG4gICkge1xuICAgIHRoaXMucGxhdGZvcm0gPSB0aGlzLmRldGVjdFBsYXRmb3JtKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBsYXRmb3JtIERldGVjdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIERldGVjdCB0aGUgY3VycmVudCBwbGF0Zm9ybSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogRGV0ZWN0aW9uIHByaW9yaXR5OlxuICAgKiAxLiBTU1IgKG5vdCBpbiBicm93c2VyKSDihpIgJ3NzcidcbiAgICogMi4gQ2FwYWNpdG9yIG5hdGl2ZSAobm8gd2ViIHZpZXcpIOKGkiAnY2FwYWNpdG9yLW5hdGl2ZSdcbiAgICogMy4gQ2FwYWNpdG9yIFdlYlZpZXcg4oaSICdjYXBhY2l0b3Itd2VidmlldydcbiAgICogNC4gV2ViIGJyb3dzZXIg4oaSICd3ZWInXG4gICAqXG4gICAqIEByZXR1cm5zIERldGVjdGVkIHBsYXRmb3JtIHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwbGF0Zm9ybSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm0oKTtcbiAgICogaWYgKHBsYXRmb3JtID09PSAnY2FwYWNpdG9yLW5hdGl2ZScpIHtcbiAgICogICAvLyBTa2lwIHJlQ0FQVENIQSwgdXNlIGRldmljZSBhdHRlc3RhdGlvblxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RQbGF0Zm9ybSgpOiBQbGF0Zm9ybSB7XG4gICAgLy8gU1NSIGRldGVjdGlvblxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuICdzc3InO1xuICAgIH1cblxuICAgIC8vIENhcGFjaXRvciBkZXRlY3Rpb24gKHdpbmRvdy5DYXBhY2l0b3IgZXhpc3RzKVxuICAgIGNvbnN0IHdpbmRvd1JlZiA9IHdpbmRvdyBhcyB7IENhcGFjaXRvcj86IHsgaXNOYXRpdmVQbGF0Zm9ybT86ICgpID0+IGJvb2xlYW4gfSB9O1xuXG4gICAgaWYgKHdpbmRvd1JlZi5DYXBhY2l0b3IpIHtcbiAgICAgIC8vIENhcGFjaXRvciBuYXRpdmUgKGlPUy9BbmRyb2lkIGFwcClcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93UmVmLkNhcGFjaXRvci5pc05hdGl2ZVBsYXRmb3JtID09PSAnZnVuY3Rpb24nICYmIHdpbmRvd1JlZi5DYXBhY2l0b3IuaXNOYXRpdmVQbGF0Zm9ybSgpKSB7XG4gICAgICAgIHJldHVybiAnY2FwYWNpdG9yLW5hdGl2ZSc7XG4gICAgICB9XG4gICAgICAvLyBDYXBhY2l0b3IgV2ViVmlld1xuICAgICAgcmV0dXJuICdjYXBhY2l0b3Itd2Vidmlldyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICd3ZWInO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAgICpcbiAgICogQHJldHVybnMgQ3VycmVudCBwbGF0Zm9ybSB0eXBlXG4gICAqL1xuICBnZXRQbGF0Zm9ybSgpOiBQbGF0Zm9ybSB7XG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcmVDQVBUQ0hBIHNob3VsZCBiZSBza2lwcGVkIGZvciBjdXJyZW50IHBsYXRmb3JtLlxuICAgKlxuICAgKiBTa2lwcyBmb3I6XG4gICAqIC0gU1NSIChubyB3aW5kb3cgb2JqZWN0KVxuICAgKiAtIENhcGFjaXRvciBuYXRpdmUgKHVzZSBkZXZpY2UgYXR0ZXN0YXRpb24gaW5zdGVhZClcbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzaG91bGQgc2tpcCByZUNBUFRDSEFcbiAgICovXG4gIHNob3VsZFNraXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm0gPT09ICdzc3InIHx8IHRoaXMucGxhdGZvcm0gPT09ICdjYXBhY2l0b3ItbmF0aXZlJztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2NyaXB0IExvYWRpbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2FkIEdvb2dsZSByZUNBUFRDSEEgc2NyaXB0IGlmIG5vdCBhbHJlYWR5IGxvYWRlZC5cbiAgICpcbiAgICogU2NyaXB0IFVSTCBmb3JtYXQ6XG4gICAqIC0gdjI6IGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qc1xuICAgKiAtIHYzOiBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanM/cmVuZGVyPXtzaXRlS2V5fVxuICAgKiAtIEVudGVycHJpc2U6IGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2VudGVycHJpc2UuanM/cmVuZGVyPXtzaXRlS2V5fVxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzY3JpcHQgaXMgbG9hZGVkXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY29uZmlnIGlzIG1pc3Npbmcgb3Igc2NyaXB0IGZhaWxzIHRvIGxvYWRcbiAgICovXG4gIGFzeW5jIGxvYWRTY3JpcHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU2tpcCBpbiBTU1Igb3IgQ2FwYWNpdG9yIG5hdGl2ZVxuICAgIGlmICh0aGlzLnNob3VsZFNraXAoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNraXAgaWYgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBsb2FkZWRcbiAgICBpZiAodGhpcy5zY3JpcHRMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IGxvYWRpbmcgKHJldHVybiBleGlzdGluZyBwcm9taXNlKVxuICAgIGlmICh0aGlzLnNjcmlwdExvYWRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcmlwdExvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29uZmlnXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zaXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBTaXRlIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGxvYWRpbmdcbiAgICB0aGlzLnNjcmlwdExvYWRpbmcgPSB0aGlzLmluamVjdFNjcmlwdCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2NyaXB0TG9hZGluZztcbiAgICAgIHRoaXMuc2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zY3JpcHRMb2FkaW5nID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IHRoZSByZUNBUFRDSEEgc2NyaXB0IGludG8gdGhlIERPTS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NyaXB0IGxvYWRzXG4gICAqL1xuICBwcml2YXRlIGluamVjdFNjcmlwdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgICAgc2NyaXB0LmRlZmVyID0gdHJ1ZTtcblxuICAgICAgLy8gU2V0IHNjcmlwdCBVUkwgYmFzZWQgb24gdmVyc2lvblxuICAgICAgaWYgKHRoaXMuY29uZmlnIS52ZXJzaW9uID09PSAnZW50ZXJwcmlzZScpIHtcbiAgICAgICAgc2NyaXB0LnNyYyA9IGBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9lbnRlcnByaXNlLmpzP3JlbmRlcj0ke3RoaXMuY29uZmlnIS5zaXRlS2V5fWA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnIS52ZXJzaW9uID09PSAndjMnKSB7XG4gICAgICAgIHNjcmlwdC5zcmMgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzP3JlbmRlcj0ke3RoaXMuY29uZmlnIS5zaXRlS2V5fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB2MiAtIGxvYWQgd2l0aG91dCByZW5kZXIgcGFyYW1ldGVyXG4gICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzJztcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnIS5sYW5ndWFnZSkge1xuICAgICAgICAgIHVybCArPSBgP2hsPSR7dGhpcy5jb25maWchLmxhbmd1YWdlfWA7XG4gICAgICAgIH1cbiAgICAgICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICAgIH1cblxuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIEZhaWxlZCB0byBsb2FkIHJlQ0FQVENIQSBzY3JpcHQnKSk7XG5cbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gdjMvRW50ZXJwcmlzZSBNZXRob2RzIChJbnZpc2libGUgQ2hhbGxlbmdlKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgcmVDQVBUQ0hBIHYzL0VudGVycHJpc2UgY2hhbGxlbmdlIChpbnZpc2libGUpLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGxvYWRzIHNjcmlwdCBpZiBuZWVkZWQgYW5kIGdlbmVyYXRlcyBhIHRva2VuLlxuICAgKiBTa2lwcyBhdXRvbWF0aWNhbGx5IGZvciBTU1IgYW5kIENhcGFjaXRvciBuYXRpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb24gLSBBY3Rpb24gbmFtZSBmb3IgdjMgYW5hbHl0aWNzIChlLmcuLCAnbG9naW4nLCAnc2lnbnVwJylcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gcmVDQVBUQ0hBIHRva2VuLCBvciB1bmRlZmluZWQgaWYgc2tpcHBlZFxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcnNpb24gaXMgdjIsIGNvbmZpZyBtaXNzaW5nLCBvciBleGVjdXRpb24gZmFpbHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMucmVjYXB0Y2hhLmV4ZWN1dGUoJ2xvZ2luJyk7XG4gICAqIGlmICh0b2tlbikge1xuICAgKiAgIGF3YWl0IHRoaXMuYXV0aC5sb2dpbihlbWFpbCwgcGFzc3dvcmQsIHRva2VuKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoYWN0aW9uPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBTa2lwIGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IHJlQ0FQVENIQVxuICAgIGlmICh0aGlzLnNob3VsZFNraXAoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGlmIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyB2MiByZXF1aXJlcyBtYW51YWwgcmVuZGVyXG4gICAgaWYgKHRoaXMuY29uZmlnLnZlcnNpb24gPT09ICd2MicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIGV4ZWN1dGUoKSBpcyBvbmx5IGZvciB2My9FbnRlcnByaXNlLiBVc2UgcmVuZGVyKCkgZm9yIHYyLicpO1xuICAgIH1cblxuICAgIC8vIExvYWQgc2NyaXB0IGlmIG5lZWRlZFxuICAgIGF3YWl0IHRoaXMubG9hZFNjcmlwdCgpO1xuXG4gICAgLy8gR2V0IGdyZWNhcHRjaGEgb2JqZWN0XG4gICAgY29uc3QgZ3JlY2FwdGNoYSA9ICh3aW5kb3cgYXMgeyBncmVjYXB0Y2hhPzogeyBleGVjdXRlPzogKHNpdGVLZXk6IHN0cmluZywgb3B0aW9uczogeyBhY3Rpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPHN0cmluZz47IGVudGVycHJpc2U/OiB7IGV4ZWN1dGU/OiAoc2l0ZUtleTogc3RyaW5nLCBvcHRpb25zOiB7IGFjdGlvbjogc3RyaW5nIH0pID0+IFByb21pc2U8c3RyaW5nPiB9IH0gfSkuZ3JlY2FwdGNoYTtcblxuICAgIGlmICghZ3JlY2FwdGNoYSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gZ3JlY2FwdGNoYSBpcyBub3QgbG9hZGVkJyk7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSByZUNBUFRDSEFcbiAgICBjb25zdCBhY3Rpb25OYW1lID0gYWN0aW9uIHx8IHRoaXMuY29uZmlnLmFjdGlvbiB8fCAnc3VibWl0JztcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5jb25maWcudmVyc2lvbiA9PT0gJ2VudGVycHJpc2UnICYmIGdyZWNhcHRjaGEuZW50ZXJwcmlzZT8uZXhlY3V0ZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ3JlY2FwdGNoYS5lbnRlcnByaXNlLmV4ZWN1dGUodGhpcy5jb25maWcuc2l0ZUtleSwgeyBhY3Rpb246IGFjdGlvbk5hbWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGdyZWNhcHRjaGEuZXhlY3V0ZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ3JlY2FwdGNoYS5leGVjdXRlKHRoaXMuY29uZmlnLnNpdGVLZXksIHsgYWN0aW9uOiBhY3Rpb25OYW1lIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gZ3JlY2FwdGNoYS5leGVjdXRlIGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUmVjYXB0Y2hhU2VydmljZV0gRmFpbGVkIHRvIGV4ZWN1dGUgcmVDQVBUQ0hBOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gdjIgTWV0aG9kcyAoVmlzaWJsZSBDaGVja2JveClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgcmVDQVBUQ0hBIHYyIGNoZWNrYm94IHdpZGdldC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lcklkIC0gRE9NIGVsZW1lbnQgSUQgb3IgZWxlbWVudCB0byByZW5kZXIgaW5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGJhY2sgd2hlbiB1c2VyIGNvbXBsZXRlcyBjaGFsbGVuZ2VcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gd2lkZ2V0IElEXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmVyc2lvbiBpcyBub3QgdjIsIGNvbmZpZyBtaXNzaW5nLCBvciByZW5kZXIgZmFpbHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAqICAgdGhpcy5yZWNhcHRjaGEucmVuZGVyKCdyZWNhcHRjaGEtY29udGFpbmVyJywgKHRva2VuKSA9PiB7XG4gICAqICAgICB0aGlzLnJlY2FwdGNoYVRva2VuID0gdG9rZW47XG4gICAqICAgICB0aGlzLmxvZ2luRm9ybS5wYXRjaFZhbHVlKHsgcmVjYXB0Y2hhVG9rZW46IHRva2VuIH0pO1xuICAgKiAgIH0pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVuZGVyKGNvbnRhaW5lcklkOiBzdHJpbmcsIGNhbGxiYWNrOiAodG9rZW46IHN0cmluZykgPT4gdm9pZCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgLy8gU2tpcCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCByZUNBUFRDSEFcbiAgICBpZiAodGhpcy5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIHJlQ0FQVENIQSB2MiBpcyBub3Qgc3VwcG9ydGVkIGluIFNTUiBvciBDYXBhY2l0b3IgbmF0aXZlJyk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIHJlQ0FQVENIQSBpcyBub3QgZW5hYmxlZCcpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgZm9yIHYyXG4gICAgaWYgKHRoaXMuY29uZmlnLnZlcnNpb24gIT09ICd2MicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIHJlbmRlcigpIGlzIG9ubHkgZm9yIHYyLiBVc2UgZXhlY3V0ZSgpIGZvciB2My9FbnRlcnByaXNlLicpO1xuICAgIH1cblxuICAgIC8vIExvYWQgc2NyaXB0IGlmIG5lZWRlZFxuICAgIGF3YWl0IHRoaXMubG9hZFNjcmlwdCgpO1xuXG4gICAgLy8gR2V0IGdyZWNhcHRjaGEgb2JqZWN0XG4gICAgY29uc3QgZ3JlY2FwdGNoYSA9ICh3aW5kb3cgYXMgeyBncmVjYXB0Y2hhPzogeyByZW5kZXI/OiAoY29udGFpbmVyOiBzdHJpbmcsIG9wdGlvbnM6IHsgc2l0ZWtleTogc3RyaW5nOyBjYWxsYmFjazogKHRva2VuOiBzdHJpbmcpID0+IHZvaWQgfSkgPT4gbnVtYmVyIH0gfSkuZ3JlY2FwdGNoYTtcblxuICAgIGlmICghZ3JlY2FwdGNoYT8ucmVuZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBncmVjYXB0Y2hhLnJlbmRlciBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIHdpZGdldFxuICAgIHRyeSB7XG4gICAgICB0aGlzLndpZGdldElkID0gZ3JlY2FwdGNoYS5yZW5kZXIoY29udGFpbmVySWQsIHtcbiAgICAgICAgc2l0ZWtleTogdGhpcy5jb25maWcuc2l0ZUtleSxcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJZDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUmVjYXB0Y2hhU2VydmljZV0gRmFpbGVkIHRvIHJlbmRlciByZUNBUFRDSEE6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXNwb25zZSB0b2tlbiBmcm9tIHYyIHdpZGdldC5cbiAgICpcbiAgICogQHBhcmFtIHdpZGdldElkIC0gV2lkZ2V0IElEIChvcHRpb25hbCwgdXNlcyBsYXN0IHJlbmRlcmVkIHdpZGdldCBpZiBub3QgcHJvdmlkZWQpXG4gICAqIEByZXR1cm5zIHJlQ0FQVENIQSB0b2tlbiBvciBudWxsIGlmIG5vdCBjb21wbGV0ZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0b2tlbiA9IHRoaXMucmVjYXB0Y2hhLmdldFJlc3BvbnNlKCk7XG4gICAqIGlmICh0b2tlbikge1xuICAgKiAgIGF3YWl0IHRoaXMuYXV0aC5sb2dpbihlbWFpbCwgcGFzc3dvcmQsIHRva2VuKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldFJlc3BvbnNlKHdpZGdldElkPzogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgZ3JlY2FwdGNoYSA9ICh3aW5kb3cgYXMgeyBncmVjYXB0Y2hhPzogeyBnZXRSZXNwb25zZT86ICh3aWRnZXRJZD86IG51bWJlcikgPT4gc3RyaW5nIH0gfSkuZ3JlY2FwdGNoYTtcblxuICAgIGlmICghZ3JlY2FwdGNoYT8uZ2V0UmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gd2lkZ2V0SWQgIT09IHVuZGVmaW5lZCA/IHdpZGdldElkIDogdGhpcy53aWRnZXRJZCA/PyB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGdyZWNhcHRjaGEuZ2V0UmVzcG9uc2UoaWQpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdjIgd2lkZ2V0IChjbGVhciByZXNwb25zZSkuXG4gICAqXG4gICAqIEBwYXJhbSB3aWRnZXRJZCAtIFdpZGdldCBJRCAob3B0aW9uYWwsIHVzZXMgbGFzdCByZW5kZXJlZCB3aWRnZXQgaWYgbm90IHByb3ZpZGVkKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEFmdGVyIGZhaWxlZCBsb2dpblxuICAgKiB0aGlzLnJlY2FwdGNoYS5yZXNldCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlc2V0KHdpZGdldElkPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZ3JlY2FwdGNoYSA9ICh3aW5kb3cgYXMgeyBncmVjYXB0Y2hhPzogeyByZXNldD86ICh3aWRnZXRJZD86IG51bWJlcikgPT4gdm9pZCB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGE/LnJlc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSB3aWRnZXRJZCAhPT0gdW5kZWZpbmVkID8gd2lkZ2V0SWQgOiB0aGlzLndpZGdldElkID8/IHVuZGVmaW5lZDtcbiAgICBncmVjYXB0Y2hhLnJlc2V0KGlkKTtcbiAgfVxufVxuIl19
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY2FwdGNoYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQTJCcEQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUMsa0JBQWtCLEVBQUU7SUFDekcsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7Q0FDekIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBSUgsTUFBTSxPQUFPLGdCQUFnQjtJQU9JO0lBQ2lCO0lBUHhDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsYUFBYSxHQUF5QixJQUFJLENBQUM7SUFDM0MsUUFBUSxDQUFXO0lBQ25CLFFBQVEsR0FBa0IsSUFBSSxDQUFDO0lBRXZDLFlBQytCLFVBQWtCLEVBQ0QsTUFBK0I7UUFEaEQsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNELFdBQU0sR0FBTixNQUFNLENBQXlCO1FBRTdFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRDLGdGQUFnRjtRQUNoRixnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ25HLElBQUksQ0FBQyxJQUFJLENBQUMsVUFB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QUFXLGFBQ0MsZ0JBQWdCOzRHQVIzQixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIERldGVjdHMgdGhlIGN1cnJlbnQgcGxhdGZvcm0gZW52aXJvbm1lbnRcbiAqL1xudHlwZSBQbGF0Zm9ybSA9ICd3ZWInIHwgJ2NhcGFjaXRvci13ZWJ2aWV3JyB8ICdjYXBhY2l0b3ItbmF0aXZlJyB8ICdzc3InO1xuXG4vKipcbiAqIHJlQ0FQVENIQSB2ZXJzaW9uIHR5cGVcbiAqL1xudHlwZSBSZWNhcHRjaGFWZXJzaW9uID0gJ3YyJyB8ICd2MycgfCAnZW50ZXJwcmlzZSc7XG5cbi8qKlxuICogcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gZm9yIFJlY2FwdGNoYVNlcnZpY2VcbiAqIFxuICogSW50ZXJuYWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgdXNlZCBieSBSZWNhcHRjaGFTZXJ2aWNlLlxuICogVXNlIFJlY2FwdGNoYUFuZ3VsYXJDb25maWcgZnJvbSB0b2tlbnMudHMgZm9yIGFwcCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVNlcnZpY2VDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuO1xuICB2ZXJzaW9uOiBSZWNhcHRjaGFWZXJzaW9uO1xuICBzaXRlS2V5OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgYXV0b0xvYWRTY3JpcHQ/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHJlQ0FQVENIQSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBSRUNBUFRDSEFfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFJlY2FwdGNoYVNlcnZpY2VDb25maWcgfCB1bmRlZmluZWQ+KCdSRUNBUFRDSEFfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHVuZGVmaW5lZCxcbn0pO1xuXG4vKipcbiAqIEdvb2dsZSByZUNBUFRDSEEgc2VydmljZSBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgbGF6eSBsb2FkaW5nIG9mIHJlQ0FQVENIQSBzY3JpcHQgYW5kIHBsYXRmb3JtLWF3YXJlIHRva2VuIGdlbmVyYXRpb24uXG4gKiBBdXRvbWF0aWNhbGx5IGRldGVjdHMgcGxhdGZvcm0gKHdlYiwgQ2FwYWNpdG9yIFdlYlZpZXcsIENhcGFjaXRvciBuYXRpdmUsIFNTUilcbiAqIGFuZCBza2lwcyByZUNBUFRDSEEgaW4gZW52aXJvbm1lbnRzIHdoZXJlIGl0J3Mgbm90IHN1cHBvcnRlZCBvciBuZWVkZWQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIExhenkgc2NyaXB0IGxvYWRpbmcgKG9ubHkgbG9hZHMgd2hlbiBuZWVkZWQpXG4gKiAtIHYyIChjaGVja2JveCkgYW5kIHYzIChpbnZpc2libGUpIHN1cHBvcnRcbiAqIC0gUGxhdGZvcm0gZGV0ZWN0aW9uICh3ZWIsIENhcGFjaXRvciwgU1NSKVxuICogLSBBdXRvbWF0aWMgc2tpcCBmb3IgQ2FwYWNpdG9yIG5hdGl2ZSBtb2RlXG4gKiAtIEF1dG9tYXRpYyBza2lwIGZvciBTU1JcbiAqXG4gKiBAZXhhbXBsZSB2MyBBdXRvbWF0aWMgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSByZWNhcHRjaGE6IFJlY2FwdGNoYVNlcnZpY2UpIHt9XG4gKlxuICogYXN5bmMgbG9naW4oKSB7XG4gKiAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5yZWNhcHRjaGEuZXhlY3V0ZSgnbG9naW4nKTtcbiAqICAgYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCwgdG9rZW4pO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgdjIgTWFudWFsIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5nT25Jbml0KCkge1xuICogICB0aGlzLnJlY2FwdGNoYS5yZW5kZXIoJ3JlY2FwdGNoYS1jb250YWluZXInLCAodG9rZW4pID0+IHtcbiAqICAgICB0aGlzLnJlY2FwdGNoYVRva2VuID0gdG9rZW47XG4gKiAgIH0pO1xuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY3JpcHRMb2FkaW5nOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtO1xuICBwcml2YXRlIHdpZGdldElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJFQ0FQVENIQV9DT05GSUcpIHByaXZhdGUgY29uZmlnPzogUmVjYXB0Y2hhU2VydmljZUNvbmZpZyxcbiAgKSB7XG4gICAgdGhpcy5wbGF0Zm9ybSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm0oKTtcbiAgICBcbiAgICAvLyBBdXRvLXByZWxvYWQgc2NyaXB0IGZvciB2My9FbnRlcnByaXNlIHNvIGl0J3MgcmVhZHkgYmVmb3JlIGZpcnN0IGxvZ2luL3NpZ251cFxuICAgIC8vIE5vLW9wIHdoZW4gZGlzYWJsZWQsIHNob3VsZFNraXAsIG9yIHYyICh2MiByZW5kZXJzIG9uLWRlbWFuZClcbiAgICBpZiAodGhpcy5jb25maWc/LmVuYWJsZWQgJiYgKHRoaXMuY29uZmlnLnZlcnNpb24gPT09ICd2MycgfHwgdGhpcy5jb25maWcudmVyc2lvbiA9PT0gJ2VudGVycHJpc2UnKSkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZFNraXAoKSkge1xuICAgICAgICB0aGlzLmxvYWRTY3JpcHQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gU2lsZW50bHkgZmFpbCAtIGV4ZWN1dGUoKSB3aWxsIGhhbmRsZSBlcnJvcnMgd2hlbiBjYWxsZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQbGF0Zm9ybSBEZXRlY3Rpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgdGhlIGN1cnJlbnQgcGxhdGZvcm0gZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIERldGVjdGlvbiBwcmlvcml0eTpcbiAgICogMS4gU1NSIChub3QgaW4gYnJvd3Nlcikg4oaSICdzc3InXG4gICAqIDIuIENhcGFjaXRvciBuYXRpdmUgKG5vIHdlYiB2aWV3KSDihpIgJ2NhcGFjaXRvci1uYXRpdmUnXG4gICAqIDMuIENhcGFjaXRvciBXZWJWaWV3IOKGkiAnY2FwYWNpdG9yLXdlYnZpZXcnXG4gICAqIDQuIFdlYiBicm93c2VyIOKGkiAnd2ViJ1xuICAgKlxuICAgKiBAcmV0dXJucyBEZXRlY3RlZCBwbGF0Zm9ybSB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGxhdGZvcm0gPSB0aGlzLmRldGVjdFBsYXRmb3JtKCk7XG4gICAqIGlmIChwbGF0Zm9ybSA9PT0gJ2NhcGFjaXRvci1uYXRpdmUnKSB7XG4gICAqICAgLy8gU2tpcCByZUNBUFRDSEEsIHVzZSBkZXZpY2UgYXR0ZXN0YXRpb25cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0UGxhdGZvcm0oKTogUGxhdGZvcm0ge1xuICAgIC8vIFNTUiBkZXRlY3Rpb25cbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVybiAnc3NyJztcbiAgICB9XG5cbiAgICAvLyBDYXBhY2l0b3IgZGV0ZWN0aW9uICh3aW5kb3cuQ2FwYWNpdG9yIGV4aXN0cylcbiAgICBjb25zdCB3aW5kb3dSZWYgPSB3aW5kb3cgYXMgeyBDYXBhY2l0b3I/OiB7IGlzTmF0aXZlUGxhdGZvcm0/OiAoKSA9PiBib29sZWFuIH0gfTtcblxuICAgIGlmICh3aW5kb3dSZWYuQ2FwYWNpdG9yKSB7XG4gICAgICAvLyBDYXBhY2l0b3IgbmF0aXZlIChpT1MvQW5kcm9pZCBhcHApXG4gICAgICBpZiAodHlwZW9mIHdpbmRvd1JlZi5DYXBhY2l0b3IuaXNOYXRpdmVQbGF0Zm9ybSA9PT0gJ2Z1bmN0aW9uJyAmJiB3aW5kb3dSZWYuQ2FwYWNpdG9yLmlzTmF0aXZlUGxhdGZvcm0oKSkge1xuICAgICAgICByZXR1cm4gJ2NhcGFjaXRvci1uYXRpdmUnO1xuICAgICAgfVxuICAgICAgLy8gQ2FwYWNpdG9yIFdlYlZpZXdcbiAgICAgIHJldHVybiAnY2FwYWNpdG9yLXdlYnZpZXcnO1xuICAgIH1cblxuICAgIHJldHVybiAnd2ViJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgcGxhdGZvcm0gdHlwZVxuICAgKi9cbiAgZ2V0UGxhdGZvcm0oKTogUGxhdGZvcm0ge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJlQ0FQVENIQSBzaG91bGQgYmUgc2tpcHBlZCBmb3IgY3VycmVudCBwbGF0Zm9ybS5cbiAgICpcbiAgICogU2tpcHMgZm9yOlxuICAgKiAtIFNTUiAobm8gd2luZG93IG9iamVjdClcbiAgICogLSBDYXBhY2l0b3IgbmF0aXZlICh1c2UgZGV2aWNlIGF0dGVzdGF0aW9uIGluc3RlYWQpXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgc2hvdWxkIHNraXAgcmVDQVBUQ0hBXG4gICAqL1xuICBzaG91bGRTa2lwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtID09PSAnc3NyJyB8fCB0aGlzLnBsYXRmb3JtID09PSAnY2FwYWNpdG9yLW5hdGl2ZSc7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNjcmlwdCBMb2FkaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTG9hZCBHb29nbGUgcmVDQVBUQ0hBIHNjcmlwdCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuXG4gICAqXG4gICAqIFNjcmlwdCBVUkwgZm9ybWF0OlxuICAgKiAtIHYyOiBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanNcbiAgICogLSB2MzogaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzP3JlbmRlcj17c2l0ZUtleX1cbiAgICogLSBFbnRlcnByaXNlOiBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9lbnRlcnByaXNlLmpzP3JlbmRlcj17c2l0ZUtleX1cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NyaXB0IGlzIGxvYWRlZFxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGNvbmZpZyBpcyBtaXNzaW5nIG9yIHNjcmlwdCBmYWlscyB0byBsb2FkXG4gICAqL1xuICBhc3luYyBsb2FkU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNraXAgaW4gU1NSIG9yIENhcGFjaXRvciBuYXRpdmVcbiAgICBpZiAodGhpcy5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGlmIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgbG9hZGVkXG4gICAgaWYgKHRoaXMuc2NyaXB0TG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBsb2FkaW5nIChyZXR1cm4gZXhpc3RpbmcgcHJvbWlzZSlcbiAgICBpZiAodGhpcy5zY3JpcHRMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JpcHRMb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ1xuICAgIGlmICghdGhpcy5jb25maWcuc2l0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gU2l0ZSBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBsb2FkaW5nXG4gICAgdGhpcy5zY3JpcHRMb2FkaW5nID0gdGhpcy5pbmplY3RTY3JpcHQoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNjcmlwdExvYWRpbmc7XG4gICAgICB0aGlzLnNjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2NyaXB0TG9hZGluZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdCB0aGUgcmVDQVBUQ0hBIHNjcmlwdCBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjcmlwdCBsb2Fkc1xuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3RTY3JpcHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG5cbiAgICAgIC8vIFNldCBzY3JpcHQgVVJMIGJhc2VkIG9uIHZlcnNpb25cbiAgICAgIGlmICh0aGlzLmNvbmZpZyEudmVyc2lvbiA9PT0gJ2VudGVycHJpc2UnKSB7XG4gICAgICAgIHNjcmlwdC5zcmMgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvZW50ZXJwcmlzZS5qcz9yZW5kZXI9JHt0aGlzLmNvbmZpZyEuc2l0ZUtleX1gO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZyEudmVyc2lvbiA9PT0gJ3YzJykge1xuICAgICAgICBzY3JpcHQuc3JjID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcz9yZW5kZXI9JHt0aGlzLmNvbmZpZyEuc2l0ZUtleX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdjIgLSBsb2FkIHdpdGhvdXQgcmVuZGVyIHBhcmFtZXRlclxuICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcyc7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyEubGFuZ3VhZ2UpIHtcbiAgICAgICAgICB1cmwgKz0gYD9obD0ke3RoaXMuY29uZmlnIS5sYW5ndWFnZX1gO1xuICAgICAgICB9XG4gICAgICAgIHNjcmlwdC5zcmMgPSB1cmw7XG4gICAgICB9XG5cbiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBGYWlsZWQgdG8gbG9hZCByZUNBUFRDSEEgc2NyaXB0JykpO1xuXG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHYzL0VudGVycHJpc2UgTWV0aG9kcyAoSW52aXNpYmxlIENoYWxsZW5nZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHJlQ0FQVENIQSB2My9FbnRlcnByaXNlIGNoYWxsZW5nZSAoaW52aXNpYmxlKS5cbiAgICpcbiAgICogQXV0b21hdGljYWxseSBsb2FkcyBzY3JpcHQgaWYgbmVlZGVkIGFuZCBnZW5lcmF0ZXMgYSB0b2tlbi5cbiAgICogU2tpcHMgYXV0b21hdGljYWxseSBmb3IgU1NSIGFuZCBDYXBhY2l0b3IgbmF0aXZlLlxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIC0gQWN0aW9uIG5hbWUgZm9yIHYzIGFuYWx5dGljcyAoZS5nLiwgJ2xvZ2luJywgJ3NpZ251cCcpXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHJlQ0FQVENIQSB0b2tlbiwgb3IgdW5kZWZpbmVkIGlmIHNraXBwZWRcbiAgICpcbiAgICogQHRocm93cyBFcnJvciBpZiB2ZXJzaW9uIGlzIHYyLCBjb25maWcgbWlzc2luZywgb3IgZXhlY3V0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLnJlY2FwdGNoYS5leGVjdXRlKCdsb2dpbicpO1xuICAgKiBpZiAodG9rZW4pIHtcbiAgICogICBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkLCB0b2tlbik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGVjdXRlKGFjdGlvbj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gU2tpcCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCByZUNBUFRDSEFcbiAgICBpZiAodGhpcy5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gdjIgcmVxdWlyZXMgbWFudWFsIHJlbmRlclxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uID09PSAndjInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBleGVjdXRlKCkgaXMgb25seSBmb3IgdjMvRW50ZXJwcmlzZS4gVXNlIHJlbmRlcigpIGZvciB2Mi4nKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjcmlwdCBpZiBuZWVkZWRcbiAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoKTtcblxuICAgIC8vIEdldCBncmVjYXB0Y2hhIG9iamVjdFxuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgZXhlY3V0ZT86IChzaXRlS2V5OiBzdHJpbmcsIG9wdGlvbnM6IHsgYWN0aW9uOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxzdHJpbmc+OyBlbnRlcnByaXNlPzogeyBleGVjdXRlPzogKHNpdGVLZXk6IHN0cmluZywgb3B0aW9uczogeyBhY3Rpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPHN0cmluZz4gfSB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIGdyZWNhcHRjaGEgaXMgbm90IGxvYWRlZCcpO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgcmVDQVBUQ0hBXG4gICAgY29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvbiB8fCB0aGlzLmNvbmZpZy5hY3Rpb24gfHwgJ3N1Ym1pdCc7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnZlcnNpb24gPT09ICdlbnRlcnByaXNlJyAmJiBncmVjYXB0Y2hhLmVudGVycHJpc2U/LmV4ZWN1dGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdyZWNhcHRjaGEuZW50ZXJwcmlzZS5leGVjdXRlKHRoaXMuY29uZmlnLnNpdGVLZXksIHsgYWN0aW9uOiBhY3Rpb25OYW1lIH0pO1xuICAgICAgfSBlbHNlIGlmIChncmVjYXB0Y2hhLmV4ZWN1dGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdyZWNhcHRjaGEuZXhlY3V0ZSh0aGlzLmNvbmZpZy5zaXRlS2V5LCB7IGFjdGlvbjogYWN0aW9uTmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIGdyZWNhcHRjaGEuZXhlY3V0ZSBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JlY2FwdGNoYVNlcnZpY2VdIEZhaWxlZCB0byBleGVjdXRlIHJlQ0FQVENIQTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHYyIE1ldGhvZHMgKFZpc2libGUgQ2hlY2tib3gpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVuZGVyIHJlQ0FQVENIQSB2MiBjaGVja2JveCB3aWRnZXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJJZCAtIERPTSBlbGVtZW50IElEIG9yIGVsZW1lbnQgdG8gcmVuZGVyIGluXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIENhbGxiYWNrIHdoZW4gdXNlciBjb21wbGV0ZXMgY2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHdpZGdldCBJRFxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcnNpb24gaXMgbm90IHYyLCBjb25maWcgbWlzc2luZywgb3IgcmVuZGVyIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmdBZnRlclZpZXdJbml0KCkge1xuICAgKiAgIHRoaXMucmVjYXB0Y2hhLnJlbmRlcigncmVjYXB0Y2hhLWNvbnRhaW5lcicsICh0b2tlbikgPT4ge1xuICAgKiAgICAgdGhpcy5yZWNhcHRjaGFUb2tlbiA9IHRva2VuO1xuICAgKiAgICAgdGhpcy5sb2dpbkZvcm0ucGF0Y2hWYWx1ZSh7IHJlY2FwdGNoYVRva2VuOiB0b2tlbiB9KTtcbiAgICogICB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbmRlcihjb250YWluZXJJZDogc3RyaW5nLCBjYWxsYmFjazogKHRva2VuOiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIC8vIFNraXAgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgcmVDQVBUQ0hBXG4gICAgaWYgKHRoaXMuc2hvdWxkU2tpcCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZUNBUFRDSEEgdjIgaXMgbm90IHN1cHBvcnRlZCBpbiBTU1Igb3IgQ2FwYWNpdG9yIG5hdGl2ZScpO1xuICAgIH1cblxuICAgIC8vIFNraXAgaWYgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZUNBUFRDSEEgaXMgbm90IGVuYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGZvciB2MlxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uICE9PSAndjInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZW5kZXIoKSBpcyBvbmx5IGZvciB2Mi4gVXNlIGV4ZWN1dGUoKSBmb3IgdjMvRW50ZXJwcmlzZS4nKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjcmlwdCBpZiBuZWVkZWRcbiAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoKTtcblxuICAgIC8vIEdldCBncmVjYXB0Y2hhIG9iamVjdFxuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgcmVuZGVyPzogKGNvbnRhaW5lcjogc3RyaW5nLCBvcHRpb25zOiB7IHNpdGVrZXk6IHN0cmluZzsgY2FsbGJhY2s6ICh0b2tlbjogc3RyaW5nKSA9PiB2b2lkIH0pID0+IG51bWJlciB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGE/LnJlbmRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gZ3JlY2FwdGNoYS5yZW5kZXIgaXMgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciB3aWRnZXRcbiAgICB0cnkge1xuICAgICAgdGhpcy53aWRnZXRJZCA9IGdyZWNhcHRjaGEucmVuZGVyKGNvbnRhaW5lcklkLCB7XG4gICAgICAgIHNpdGVrZXk6IHRoaXMuY29uZmlnLnNpdGVLZXksXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SWQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JlY2FwdGNoYVNlcnZpY2VdIEZhaWxlZCB0byByZW5kZXIgcmVDQVBUQ0hBOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVzcG9uc2UgdG9rZW4gZnJvbSB2MiB3aWRnZXQuXG4gICAqXG4gICAqIEBwYXJhbSB3aWRnZXRJZCAtIFdpZGdldCBJRCAob3B0aW9uYWwsIHVzZXMgbGFzdCByZW5kZXJlZCB3aWRnZXQgaWYgbm90IHByb3ZpZGVkKVxuICAgKiBAcmV0dXJucyByZUNBUFRDSEEgdG9rZW4gb3IgbnVsbCBpZiBub3QgY29tcGxldGVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSB0aGlzLnJlY2FwdGNoYS5nZXRSZXNwb25zZSgpO1xuICAgKiBpZiAodG9rZW4pIHtcbiAgICogICBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkLCB0b2tlbik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRSZXNwb25zZSh3aWRnZXRJZD86IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgZ2V0UmVzcG9uc2U/OiAod2lkZ2V0SWQ/OiBudW1iZXIpID0+IHN0cmluZyB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGE/LmdldFJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHdpZGdldElkICE9PSB1bmRlZmluZWQgPyB3aWRnZXRJZCA6IHRoaXMud2lkZ2V0SWQgPz8gdW5kZWZpbmVkO1xuICAgIHJldHVybiBncmVjYXB0Y2hhLmdldFJlc3BvbnNlKGlkKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHYyIHdpZGdldCAoY2xlYXIgcmVzcG9uc2UpLlxuICAgKlxuICAgKiBAcGFyYW0gd2lkZ2V0SWQgLSBXaWRnZXQgSUQgKG9wdGlvbmFsLCB1c2VzIGxhc3QgcmVuZGVyZWQgd2lkZ2V0IGlmIG5vdCBwcm92aWRlZClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBBZnRlciBmYWlsZWQgbG9naW5cbiAgICogdGhpcy5yZWNhcHRjaGEucmVzZXQoKTtcbiAgICogYGBgXG4gICAqL1xuICByZXNldCh3aWRnZXRJZD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgcmVzZXQ/OiAod2lkZ2V0SWQ/OiBudW1iZXIpID0+IHZvaWQgfSB9KS5ncmVjYXB0Y2hhO1xuXG4gICAgaWYgKCFncmVjYXB0Y2hhPy5yZXNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gd2lkZ2V0SWQgIT09IHVuZGVmaW5lZCA/IHdpZGdldElkIDogdGhpcy53aWRnZXRJZCA/PyB1bmRlZmluZWQ7XG4gICAgZ3JlY2FwdGNoYS5yZXNldChpZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -992,4 +992,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
992
992
|
}] }, { type: i3.RecaptchaService, decorators: [{
|
|
993
993
|
type: Optional
|
|
994
994
|
}] }] });
|
|
995
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQyxPQUFPLEVBQ0wsV0FBVyxHQXNCWixNQUFNLHVCQUF1QixDQUFDOzs7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBa0JBO0lBQ0E7SUFsQkwsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7Ozs7O09BS0c7SUFDSCxZQUMrQixNQUF5QixFQUN0RCxXQUErQixFQUNYLE1BQWUsRUFDZixnQkFBbUM7UUFEbkMsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFFdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElB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QU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QiwyQ0FBMkM7WUFDM0Msa0NBQWtDO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7d0dBaGhDVSxXQUFXLGtCQWdCWixtQkFBbUI7NEdBaEJsQixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFpQk4sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUUxQixRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7IFJlY2FwdGNoYVNlcnZpY2UgfSBmcm9tICcuLi9saWIvcmVjYXB0Y2hhLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTkF1dGhDbGllbnQsXG4gIE5BdXRoQ2xpZW50Q29uZmlnLFxuICBBdXRoUmVzcG9uc2VDb250ZXh0LFxuICBDaGFsbGVuZ2VSZXNwb25zZSxcbiAgQXV0aFJlc3BvbnNlLFxuICBUb2tlblJlc3BvbnNlLFxuICBBdXRoVXNlcixcbiAgQ29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlLFxuICBVcGRhdGVQcm9maWxlUmVxdWVzdCxcbiAgR2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlLFxuICBHZXRTZXR1cERhdGFSZXNwb25zZSxcbiAgTUZBU3RhdHVzLFxuICBNRkFEZXZpY2UsXG4gIEF1dGhFdmVudCxcbiAgU29jaWFsUHJvdmlkZXIsXG4gIFNvY2lhbExvZ2luT3B0aW9ucyxcbiAgTGlua2VkQWNjb3VudHNSZXNwb25zZSxcbiAgU29jaWFsVmVyaWZ5UmVxdWVzdCxcbiAgQXVkaXRIaXN0b3J5UmVzcG9uc2UsXG4gIEFkbWluT3BlcmF0aW9ucyxcbn0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgYXJvdW5kIE5BdXRoQ2xpZW50IHRoYXQgcHJvdmlkZXMgcHJvbWlzZS1iYXNlZCBhdXRoIG1ldGhvZHMgYW5kIHJlYWN0aXZlIHN0YXRlLlxuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlczpcbiAqIC0gUmVhY3RpdmUgc3RhdGUgKGN1cnJlbnRVc2VyJCwgaXNBdXRoZW50aWNhdGVkJCwgY2hhbGxlbmdlJClcbiAqIC0gQWxsIGNvcmUgYXV0aCBtZXRob2RzIGFzIFByb21pc2VzIChsb2dpbiwgc2lnbnVwLCBsb2dvdXQsIHJlZnJlc2gpXG4gKiAtIFByb2ZpbGUgbWFuYWdlbWVudCAoZ2V0UHJvZmlsZSwgdXBkYXRlUHJvZmlsZSwgY2hhbmdlUGFzc3dvcmQpXG4gKiAtIENoYWxsZW5nZSBmbG93IG1ldGhvZHMgKHJlc3BvbmRUb0NoYWxsZW5nZSwgcmVzZW5kQ29kZSlcbiAqIC0gTUZBIG1hbmFnZW1lbnQgKGdldE1mYVN0YXR1cywgc2V0dXBNZmFEZXZpY2UsIGV0Yy4pXG4gKiAtIFNvY2lhbCBhdXRoZW50aWNhdGlvbiBhbmQgYWNjb3VudCBsaW5raW5nXG4gKiAtIERldmljZSB0cnVzdCBtYW5hZ2VtZW50XG4gKiAtIEF1ZGl0IGhpc3RvcnlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSkge31cbiAqXG4gKiAvLyBSZWFjdGl2ZSBzdGF0ZVxuICogdGhpcy5hdXRoLmN1cnJlbnRVc2VyJC5zdWJzY3JpYmUodXNlciA9PiAuLi4pO1xuICogdGhpcy5hdXRoLmlzQXV0aGVudGljYXRlZCQuc3Vic2NyaWJlKGlzQXV0aCA9PiAuLi4pO1xuICpcbiAqIC8vIEF1dGggb3BlcmF0aW9ucyB3aXRoIGFzeW5jL2F3YWl0XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5sb2dpbihlbWFpbCwgcGFzc3dvcmQpO1xuICpcbiAqIC8vIFByb2ZpbGUgbWFuYWdlbWVudFxuICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJyB9KTtcbiAqXG4gKiAvLyBNRkEgb3BlcmF0aW9uc1xuICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBOQXV0aENsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFVzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbGxlbmdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aEV2ZW50c1N1YmplY3QgPSBuZXcgU3ViamVjdDxBdXRoRXZlbnQ+KCk7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQHBhcmFtIGNvbmZpZyAtIEluamVjdGVkIGNsaWVudCBjb25maWd1cmF0aW9uIChyZXF1aXJlZClcbiAgICogQHBhcmFtIGh0dHBBZGFwdGVyIC0gQW5ndWxhciBIVFRQIGFkYXB0ZXIgZm9yIG1ha2luZyByZXF1ZXN0cyAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSByb3V0ZXIgLSBBbmd1bGFyIFJvdXRlciAob3B0aW9uYWwsIGF1dG9tYXRpY2FsbHkgdXNlZCBmb3IgbmF2aWdhdGlvbiBpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSByZWNhcHRjaGFTZXJ2aWNlIC0gUmVjYXB0Y2hhU2VydmljZSAob3B0aW9uYWwsIGZvciBhdXRvbWF0aWMgdG9rZW4gZ2VuZXJhdGlvbilcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGVyPzogUm91dGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVjYXB0Y2hhU2VydmljZT86IFJlY2FwdGNoYVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGh0dHBBZGFwdGVyIChmcm9tIGNvbmZpZyBvciBpbmplY3RlZClcbiAgICBjb25zdCBhZGFwdGVyID0gY29uZmlnLmh0dHBBZGFwdGVyID8/IGh0dHBBZGFwdGVyO1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSHR0cEFkYXB0ZXIgbm90IGZvdW5kLiBFaXRoZXIgcHJvdmlkZSBodHRwQWRhcHRlciBpbiBOQVVUSF9DTElFTlRfQ09ORklHIG9yIGVuc3VyZSBIdHRwQ2xpZW50IGlzIGF2YWlsYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQXV0b21hdGljIEFuZ3VsYXIgUm91dGVyIGludGVncmF0aW9uXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIElmIFJvdXRlciBpcyBhdmFpbGFibGUgYW5kIG5vIGN1c3RvbSBuYXZpZ2F0aW9uSGFuZGxlciBpcyBwcm92aWRlZCxcbiAgICAvLyBhdXRvbWF0aWNhbGx5IHVzZSBBbmd1bGFyIFJvdXRlcidzIG5hdmlnYXRlQnlVcmwoKSB0byBwcmV2ZW50IHBhZ2UgcmVmcmVzaGVzXG4gICAgY29uc3QgbmF2aWdhdGlvbkhhbmRsZXIgPVxuICAgICAgY29uZmlnLm5hdmlnYXRpb25IYW5kbGVyID8/XG4gICAgICAodGhpcy5yb3V0ZXJcbiAgICAgICAgPyBhc3luYyAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm91dGVyIS5uYXZpZ2F0ZUJ5VXJsKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gSU1QT1JUQU5UOiBDaGFsbGVuZ2Utc3RhdGUgaHlkcmF0aW9uIEJFRk9SRSBuYXZpZ2F0aW9uIChBbmd1bGFyIGd1YXJkIHNhZmV0eSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBgTkF1dGhDbGllbnQubG9naW4oKWAgYXV0by1uYXZpZ2F0ZXMgdmlhIENoYWxsZW5nZVJvdXRlciAqYmVmb3JlKiByZXR1cm5pbmcuXG4gICAgLy8gVGhlIEFuZ3VsYXIgc2FtcGxlIGFwcCB1c2VzIGEgc3luY2hyb25vdXMgZ3VhcmQgKGBjaGFsbGVuZ2VSb3V0ZUd1YXJkYCkgdGhhdFxuICAgIC8vIHJlYWRzIHRoZSBjdXJyZW50IGNoYWxsZW5nZSB2aWEgYEF1dGhTZXJ2aWNlLmdldEN1cnJlbnRDaGFsbGVuZ2UoKWAgKGJhY2tlZCBieVxuICAgIC8vIGBjaGFsbGVuZ2VTdWJqZWN0LnZhbHVlYCkuIElmIG5hdmlnYXRpb24gaGFwcGVucyBiZWZvcmUgYGNoYWxsZW5nZVN1YmplY3RgIGlzXG4gICAgLy8gdXBkYXRlZCwgdGhlIGd1YXJkIGluY29ycmVjdGx5IHJlZGlyZWN0cyBiYWNrIHRvIGAvbG9naW5gLlxuICAgIC8vXG4gICAgLy8gRml4OiBpbnRlcmNlcHQgdGhlIFNESydzIGF1dG8tbmF2aWdhdGlvbiBob29rIChgb25BdXRoUmVzcG9uc2VgKSwgcHVibGlzaCB0aGVcbiAgICAvLyBjaGFsbGVuZ2Ugc3RhdGUgaW1tZWRpYXRlbHksIHRoZW4gcGVyZm9ybSBkZWZhdWx0IG5hdmlnYXRpb24gKG9yIGRlbGVnYXRlIHRvXG4gICAgLy8gdGhlIHVzZXIncyBjdXN0b20gYG9uQXV0aFJlc3BvbnNlYCBpZiBwcm92aWRlZCkuXG4gICAgY29uc3QgdXNlck9uQXV0aFJlc3BvbnNlID0gY29uZmlnLm9uQXV0aFJlc3BvbnNlO1xuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgTkF1dGhDbGllbnQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgaHR0cEFkYXB0ZXI6IGFkYXB0ZXIsXG4gICAgICBuYXZpZ2F0aW9uSGFuZGxlcixcbiAgICAgIG9uQXV0aFJlc3BvbnNlOiBhc3luYyAocmVzcG9uc2U6IEF1dGhSZXNwb25zZSwgY29udGV4dDogQXV0aFJlc3BvbnNlQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBFbnN1cmUgZ3VhcmRzIGNhbiBzeW5jaHJvbm91c2x5IHNlZSB0aGUgYWN0aXZlIGNoYWxsZW5nZSBiZWZvcmUgbmF2aWdhdGlvbi5cbiAgICAgICAgdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXNwb25zZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIHRoZWlyIG93biBoYW5kbGVyLCBsZXQgdGhlbSB0YWtlIGZ1bGwgY29udHJvbC5cbiAgICAgICAgaWYgKHVzZXJPbkF1dGhSZXNwb25zZSkge1xuICAgICAgICAgIGF3YWl0IHVzZXJPbkF1dGhSZXNwb25zZShyZXNwb25zZSwgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCBuYXZpZ2F0aW9uIGJlaGF2aW9yIChtYXRjaGVzIENoYWxsZW5nZVJvdXRlci5oYW5kbGVBdXRoUmVzcG9uc2UpXG4gICAgICAgIGNvbnN0IHJvdXRlciA9IHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICAgICAgICBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgICAgICAgIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVmZXIgYXBwU3RhdGUgcHJvdmlkZWQgdmlhIGNvbnRleHQgKHNvY2lhbCByZWRpcmVjdCBndWFyZCAvIGV4Y2hhbmdlIGZsb3cpLlxuICAgICAgICAvLyBJTVBPUlRBTlQ6IERvIG5vdCBjb25zdW1lL2NsZWFyIHBlcnNpc3RlZCBPQXV0aCBzdGF0ZSBoZXJlOyBsZWF2ZSBpdCBhdmFpbGFibGVcbiAgICAgICAgLy8gZm9yIGNvbnN1bWVycyB2aWEgZ2V0TGFzdE9hdXRoU3RhdGUoKS5cbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKGNvbnRleHQuYXBwU3RhdGUgPyB7IGFwcFN0YXRlOiBjb250ZXh0LmFwcFN0YXRlIH0gOiB1bmRlZmluZWQsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uQXV0aFN0YXRlQ2hhbmdlOiAodXNlcjogQXV0aFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KEJvb2xlYW4odXNlcikpO1xuICAgICAgICBjb25maWcub25BdXRoU3RhdGVDaGFuZ2U/Lih1c2VyKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBGb3J3YXJkIGFsbCBjbGllbnQgZXZlbnRzIHRvIE9ic2VydmFibGUgc3RyZWFtXG4gICAgdGhpcy5jbGllbnQub24oJyonLCAoZXZlbnQ6IEF1dGhFdmVudCkgPT4ge1xuICAgICAgdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBvbiBjb25zdHJ1Y3Rpb24gKGh5ZHJhdGUgZnJvbSBzdG9yYWdlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGl2ZSBTdGF0ZSBPYnNlcnZhYmxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdXNlciBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPEF1dGhVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVkIHN0YXRlIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgY2hhbGxlbmdlIG9ic2VydmFibGUgKGZvciByZWFjdGl2ZSBjaGFsbGVuZ2UgbmF2aWdhdGlvbikuXG4gICAqL1xuICBnZXQgY2hhbGxlbmdlJCgpOiBPYnNlcnZhYmxlPEF1dGhSZXNwb25zZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIGFsbCBhdXRoIGxpZmVjeWNsZSBldmVudHMgZm9yIGN1c3RvbSBsb2dpYywgYW5hbHl0aWNzLCBvciBVSSB1cGRhdGVzLlxuICAgKi9cbiAgZ2V0IGF1dGhFdmVudHMkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIHVzZXIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgKGxvZ2luLCBzaWdudXAsIHNvY2lhbCBhdXRoKS5cbiAgICovXG4gIGdldCBhdXRoU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDpzdWNjZXNzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGVycm9yIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHMgKGxvZ2luIGVycm9yLCBPQXV0aCBlcnJvciwgZXRjLikuXG4gICAqL1xuICBnZXQgYXV0aEVycm9yJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOmVycm9yJyB8fCBlLnR5cGUgPT09ICdvYXV0aDplcnJvcicpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3luYyBTdGF0ZSBBY2Nlc3NvcnMgKGZvciBndWFyZHMsIHRlbXBsYXRlcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhdXRoZW50aWNhdGVkIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzQXV0aGVudGljYXRlZFN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBnZXRDdXJyZW50VXNlcigpOiBBdXRoVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYWxsZW5nZSAoc3luYykuXG4gICAqL1xuICBnZXRDdXJyZW50Q2hhbGxlbmdlKCk6IEF1dGhSZXNwb25zZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYWxsZW5nZSByb3V0ZXIgZm9yIG1hbnVhbCBuYXZpZ2F0aW9uIGNvbnRyb2wuXG4gICAqIFVzZWZ1bCBmb3IgZ3VhcmRzIHRoYXQgbmVlZCB0byBoYW5kbGUgZXJyb3JzIG9yIGJ1aWxkIGN1c3RvbSBVUkxzLlxuICAgKlxuICAgKiBAcmV0dXJucyBDaGFsbGVuZ2VSb3V0ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb3V0ZXIgPSB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gICAqIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hhbGxlbmdlUm91dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29yZSBBdXRoIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2dpbiB3aXRoIGlkZW50aWZpZXIgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgcGFzcyB0aGUgdG9rZW4gZXhwbGljaXRseS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsIG9yIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgcGFzc3dvcmRcbiAgICogQHBhcmFtIHJlY2FwdGNoYVRva2VuIC0gT3B0aW9uYWwgcmVDQVBUQ0hBIHRva2VuIChmb3IgdjIgbWFudWFsIG1vZGUgb3Igd2hlbiBhdXRvLWdlbmVyYXRpb24gaXMgZGlzYWJsZWQpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZSBCYXNpYyBMb2dpblxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBXaXRoIE1hbnVhbCByZUNBUFRDSEEgKHYyKVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJywgcmVjYXB0Y2hhVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luKGlkZW50aWZpZXI6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgcmVjYXB0Y2hhVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRSZWNhcHRjaGFUb2tlbihyZWNhcHRjaGFUb2tlbiwgJ2xvZ2luJyk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9naW4oaWRlbnRpZmllciwgcGFzc3dvcmQsIHRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ251cCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgaW5jbHVkZSB0b2tlbiBpbiBwYXlsb2FkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFNpZ251cCByZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlIEJhc2ljIFNpZ251cFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLnNpZ251cCh7XG4gICAqICAgZW1haWw6ICduZXdAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFdpdGggTWFudWFsIHJlQ0FQVENIQSAodjIpXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguc2lnbnVwKHtcbiAgICogICBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgcmVjYXB0Y2hhVG9rZW46IHRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWdudXAocGF5bG9hZDogUGFyYW1ldGVyczxOQXV0aENsaWVudFsnc2lnbnVwJ10+WzBdKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICAvLyBBdXRvLWdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbiBmb3IgdjMgaWYgY29uZmlndXJlZCBhbmQgbm90IGFscmVhZHkgcHJvdmlkZWRcbiAgICBjb25zdCBwYXlsb2FkV2l0aFJlY2FwdGNoYSA9IHBheWxvYWQgYXMgeyByZWNhcHRjaGFUb2tlbj86IHN0cmluZyB9O1xuICAgIFxuICAgIGlmICghcGF5bG9hZFdpdGhSZWNhcHRjaGEucmVjYXB0Y2hhVG9rZW4pIHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRSZWNhcHRjaGFUb2tlbih1bmRlZmluZWQsICdzaWdudXAnKTtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICBwYXlsb2FkID0geyAuLi5wYXlsb2FkLCByZWNhcHRjaGFUb2tlbjogdG9rZW4gfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5zaWdudXAocGF5bG9hZCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgY3VycmVudCBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlIC0gSWYgdHJ1ZSwgcmVtb3ZlcyBkZXZpY2UgdHJ1c3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubG9nb3V0KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0KGZvcmdldERldmljZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXQoZm9yZ2V0RGV2aWNlKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuXG4gICAgLy8gQ2xlYXIgQ1NSRiB0b2tlbiBjb29raWUgaWYgaW4gY29va2llcyBtb2RlXG4gICAgLy8gTm90ZTogQmFja2VuZCBzaG91bGQgY2xlYXIgaHR0cE9ubHkgY29va2llcywgYnV0IHdlIGNsZWFyIG5vbi1odHRwT25seSBvbmVzXG4gICAgaWYgKHRoaXMuY29uZmlnLnRva2VuRGVsaXZlcnkgPT09ICdjb29raWVzJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBjc3JmQ29va2llTmFtZSA9IHRoaXMuY29uZmlnLmNzcmY/LmNvb2tpZU5hbWUgPz8gJ25hdXRoX2NzcmZfdG9rZW4nO1xuICAgICAgLy8gRXh0cmFjdCBkb21haW4gZnJvbSBiYXNlVXJsIGlmIHBvc3NpYmxlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS87IGRvbWFpbj0ke3VybC5ob3N0bmFtZX1gO1xuICAgICAgICAvLyBBbHNvIHRyeSB3aXRob3V0IGRvbWFpbiAoZm9yIGxvY2FsaG9zdClcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiBiYXNlVXJsIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGFsbCBzZXNzaW9ucy5cbiAgICpcbiAgICogUmV2b2tlcyBhbGwgYWN0aXZlIHNlc3Npb25zIGZvciB0aGUgY3VycmVudCB1c2VyIGFjcm9zcyBhbGwgZGV2aWNlcy5cbiAgICogT3B0aW9uYWxseSByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgaWYgZm9yZ2V0RGV2aWNlcyBpcyB0cnVlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlcyAtIElmIHRydWUsIGFsc28gcmV2b2tlcyBhbGwgdHJ1c3RlZCBkZXZpY2VzIChkZWZhdWx0OiBmYWxzZSlcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG51bWJlciBvZiBzZXNzaW9ucyByZXZva2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmxvZ291dEFsbCgpO1xuICAgKiBjb25zb2xlLmxvZyhgUmV2b2tlZCAke3Jlc3VsdC5yZXZva2VkQ291bnR9IHNlc3Npb25zYCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0QWxsKGZvcmdldERldmljZXM/OiBib29sZWFuKTogUHJvbWlzZTx7IHJldm9rZWRDb3VudDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcyk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gRXhwbGljaXRseSB1cGRhdGUgYXV0aCBzdGF0ZSBhZnRlciBsb2dvdXRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMuYXV0aC5yZWZyZXNoKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVmcmVzaFRva2VucygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBY2NvdW50IFJlY292ZXJ5IChGb3Jnb3QgUGFzc3dvcmQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgKGZvcmdvdCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBwYXNzd29yZCByZXNldCByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5mb3Jnb3RQYXNzd29yZCgndXNlckBleGFtcGxlLmNvbScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5mb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIGEgcGFzc3dvcmQgcmVzZXQgY29kZSBhbmQgc2V0IGEgbmV3IHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwsIHVzZXJuYW1lLCBvciBwaG9uZVxuICAgKiBAcGFyYW0gY29kZSAtIE9uZS10aW1lIHJlc2V0IGNvZGVcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBjb25maXJtYXRpb24gcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY29uZmlybUZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJywgJzEyMzQ1NicsICdOZXdQYXNzMTIzIScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNvbmZpcm1Gb3Jnb3RQYXNzd29yZChcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY29uZmlybUZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIsIGNvZGUsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwYXNzd29yZCB3aXRoIGNvZGUgb3IgdG9rZW4gKGdlbmVyaWMgbWV0aG9kIGZvciBib3RoIGFkbWluIGFuZCB1c2VyLWluaXRpYXRlZCByZXNldHMpLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlcjpcbiAgICogLSBjb2RlOiBTaG9ydCBudW1lcmljIGNvZGUgZnJvbSBlbWFpbC9TTVMgKDYtMTAgZGlnaXRzKVxuICAgKiAtIHRva2VuOiBMb25nIGhleCB0b2tlbiBmcm9tIHJlc2V0IGxpbmsgKDY0IGNoYXJzKVxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgaWRlbnRpZmllciAoZW1haWwsIHVzZXJuYW1lLCBwaG9uZSlcbiAgICogQHBhcmFtIGNvZGVPclRva2VuIC0gVmVyaWZpY2F0aW9uIGNvZGUgT1IgdG9rZW4gZnJvbSBsaW5rXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFdpdGggY29kZSBmcm9tIGVtYWlsXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXNldFBhc3N3b3JkV2l0aENvZGUoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqXG4gICAqIC8vIFdpdGggdG9rZW4gZnJvbSBsaW5rXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXNldFBhc3N3b3JkV2l0aENvZGUoJ3VzZXJAZXhhbXBsZS5jb20nLCAnNjQtY2hhci10b2tlbicsICdOZXdQYXNzMTIzIScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRXaXRoQ29kZShcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgY29kZU9yVG9rZW46IHN0cmluZyxcbiAgICBuZXdQYXNzd29yZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlc2V0UGFzc3dvcmRXaXRoQ29kZShpZGVudGlmaWVyLCBjb2RlT3JUb2tlbiwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB1c2VyIHBhc3N3b3JkIChyZXF1aXJlcyBjdXJyZW50IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIG9sZFBhc3N3b3JkIC0gQ3VycmVudCBwYXNzd29yZFxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmQgKG11c3QgbWVldCByZXF1aXJlbWVudHMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHBhc3N3b3JkIGlzIGNoYW5nZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQoJ29sZFBhc3N3b3JkMTIzJywgJ25ld1NlY3VyZVBhc3N3b3JkNDU2IScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJvZmlsZSBNYW5hZ2VtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBwcm9maWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGN1cnJlbnQgdXNlciBwcm9maWxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5nZXRQcm9maWxlKCk7XG4gICAqIGNvbnNvbGUubG9nKCdVc2VyIHByb2ZpbGU6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0UHJvZmlsZSgpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFByb2ZpbGUoKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIGZldGNoZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gUHJvZmlsZSBmaWVsZHMgdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgdXBkYXRlZCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnIH0pO1xuICAgKiBjb25zb2xlLmxvZygnUHJvZmlsZSB1cGRhdGVkOicsIHVzZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVByb2ZpbGUodXBkYXRlczogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LnVwZGF0ZVByb2ZpbGUodXBkYXRlcyk7XG4gICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlIHdoZW4gcHJvZmlsZSBpcyB1cGRhdGVkXG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2hhbGxlbmdlIEZsb3cgTWV0aG9kcyAoRXNzZW50aWFsIGZvciBhbnkgYXV0aCBmbG93KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgdG8gYSBjaGFsbGVuZ2UgKFZFUklGWV9FTUFJTCwgVkVSSUZZX1BIT05FLCBNRkFfUkVRVUlSRUQsIGV0Yy4pLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBDaGFsbGVuZ2UgcmVzcG9uc2UgZGF0YVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBuZXh0IGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZXNwb25kVG9DaGFsbGVuZ2Uoe1xuICAgKiAgIHNlc3Npb246IGNoYWxsZW5nZVNlc3Npb24sXG4gICAqICAgdHlwZTogJ1ZFUklGWV9FTUFJTCcsXG4gICAqICAgY29kZTogJzEyMzQ1NicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZTogQ2hhbGxlbmdlUmVzcG9uc2UpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZSk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgY2hhbGxlbmdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc2VuZENvZGUoc2Vzc2lvbik7XG4gICAqIGNvbnNvbGUubG9nKCdDb2RlIHNlbnQgdG86JywgcmVzdWx0LmRlc3RpbmF0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNlbmRDb2RlKHNlc3Npb246IHN0cmluZyk6IFByb21pc2U8eyBkZXN0aW5hdGlvbjogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHNldHVwIGRhdGEgKGZvciBNRkFfU0VUVVBfUkVRVUlSRUQgY2hhbGxlbmdlKS5cbiAgICpcbiAgICogUmV0dXJucyBtZXRob2Qtc3BlY2lmaWMgc2V0dXAgaW5mb3JtYXRpb246XG4gICAqIC0gVE9UUDogeyBzZWNyZXQsIHFyQ29kZSwgbWFudWFsRW50cnlLZXkgfVxuICAgKiAtIFNNUzogeyBtYXNrZWRQaG9uZSB9XG4gICAqIC0gRW1haWw6IHsgbWFza2VkRW1haWwgfVxuICAgKiAtIFBhc3NrZXk6IFdlYkF1dGhuIHJlZ2lzdHJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgJ3RvdHAnKTtcbiAgICogY29uc29sZS5sb2coJ1FSIENvZGU6Jywgc2V0dXBEYXRhLnNldHVwRGF0YS5xckNvZGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFNldHVwRGF0YShzZXNzaW9uOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRTZXR1cERhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldFNldHVwRGF0YSddPlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBjaGFsbGVuZ2UgZGF0YSAoZm9yIE1GQV9SRVFVSVJFRCBjaGFsbGVuZ2UgLSBlLmcuLCBwYXNza2V5IG9wdGlvbnMpLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEBwYXJhbSBtZXRob2QgLSBDaGFsbGVuZ2UgbWV0aG9kXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY2hhbGxlbmdlIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjaGFsbGVuZ2VEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgJ3Bhc3NrZXknKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldENoYWxsZW5nZURhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb24sIG1ldGhvZCBhcyBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydnZXRDaGFsbGVuZ2VEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBzdG9yZWQgY2hhbGxlbmdlICh3aGVuIG5hdmlnYXRpbmcgYXdheSBmcm9tIGNoYWxsZW5nZSBmbG93KS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2hhbGxlbmdlIGlzIGNsZWFyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2xlYXJDaGFsbGVuZ2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjbGVhckNoYWxsZW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5jbGVhclN0b3JlZENoYWxsZW5nZSgpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGFjY2VzcyB0b2tlbiAoSlNPTiBtb2RlIG9ubHkpLlxuICAgKlxuICAgKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGNvbnN1bWVycyB1c2luZyBBbmd1bGFyIGBIdHRwQ2xpZW50YCBkaXJlY3RseVxuICAgKiAob3V0c2lkZSBvZiB0aGUgU0RLIG1ldGhvZHMpIGFuZCByZWx5aW5nIG9uIGFuIGludGVyY2VwdG9yIHRvIGF0dGFjaCBCZWFyZXIgdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyBBY2Nlc3MgdG9rZW4sIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5hdXRoLmdldEFjY2Vzc1Rva2VuKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmdldEFjY2Vzc1Rva2VuKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNvY2lhbCBBdXRoZW50aWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlIHNvY2lhbCBPQXV0aCBsb2dpbiBmbG93LlxuICAgKiBSZWRpcmVjdHMgdGhlIGJyb3dzZXIgdG8gYmFja2VuZCBgL2F1dGgvc29jaWFsLzpwcm92aWRlci9yZWRpcmVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciAoJ2dvb2dsZScsICdhcHBsZScsICdmYWNlYm9vaycpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcmVkaXJlY3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiByZWRpcmVjdCBzdGFydHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubG9naW5XaXRoU29jaWFsKCdnb29nbGUnLCB7IHJldHVyblRvOiAnL2F1dGgvY2FsbGJhY2snIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luV2l0aFNvY2lhbChwcm92aWRlcjogU29jaWFsUHJvdmlkZXIsIG9wdGlvbnM/OiBTb2NpYWxMb2dpbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubG9naW5XaXRoU29jaWFsKHByb3ZpZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNoYW5nZSBhbiBleGNoYW5nZVRva2VuIChmcm9tIHJlZGlyZWN0IGNhbGxiYWNrIFVSTCkgaW50byBhbiBBdXRoUmVzcG9uc2UuXG4gICAqXG4gICAqIFVzZWQgZm9yIGB0b2tlbkRlbGl2ZXJ5OiAnanNvbidgIG9yIGh5YnJpZCBmbG93cyB3aGVyZSB0aGUgYmFja2VuZCByZWRpcmVjdHMgYmFja1xuICAgKiB3aXRoIGBleGNoYW5nZVRva2VuYCBpbnN0ZWFkIG9mIHNldHRpbmcgY29va2llcy5cbiAgICpcbiAgICogQHBhcmFtIGV4Y2hhbmdlVG9rZW4gLSBPbmUtdGltZSBleGNoYW5nZSB0b2tlbiBmcm9tIHRoZSBjYWxsYmFjayBVUkxcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBBdXRoUmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IG5hdGl2ZSBzb2NpYWwgdG9rZW4gKG1vYmlsZSkuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IC0gU29jaWFsIHZlcmlmaWNhdGlvbiByZXF1ZXN0IHdpdGggcHJvdmlkZXIgYW5kIHRva2VuXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU5hdGl2ZVNvY2lhbCh7XG4gICAqICAgcHJvdmlkZXI6ICdnb29nbGUnLFxuICAgKiAgIGlkVG9rZW46IG5hdGl2ZUlkVG9rZW4sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU5hdGl2ZVNvY2lhbChyZXF1ZXN0OiBTb2NpYWxWZXJpZnlSZXF1ZXN0KTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC52ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlua2VkIHNvY2lhbCBhY2NvdW50cy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBsaW5rZWQgYWNjb3VudHMgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhY2NvdW50cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRMaW5rZWRBY2NvdW50cygpO1xuICAgKiBjb25zb2xlLmxvZygnTGlua2VkIHByb3ZpZGVyczonLCBhY2NvdW50cy5wcm92aWRlcnMpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldExpbmtlZEFjY291bnRzKCk6IFByb21pc2U8TGlua2VkQWNjb3VudHNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRMaW5rZWRBY2NvdW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgc29jaWFsIGFjY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciB0byBsaW5rXG4gICAqIEBwYXJhbSBjb2RlIC0gT0F1dGggYXV0aG9yaXphdGlvbiBjb2RlXG4gICAqIEBwYXJhbSBzdGF0ZSAtIE9BdXRoIHN0YXRlIHBhcmFtZXRlclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxpbmtTb2NpYWxBY2NvdW50KCdnb29nbGUnLCBjb2RlLCBzdGF0ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZywgY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyLCBjb2RlLCBzdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVW5saW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gdW5saW5rXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgudW5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdW5saW5rU29jaWFsQWNjb3VudChwcm92aWRlcjogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFzdCBPQXV0aCBhcHBTdGF0ZSBmcm9tIHNvY2lhbCByZWRpcmVjdCBjYWxsYmFjay5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgYXBwU3RhdGUgdGhhdCB3YXMgc3RvcmVkIGR1cmluZyB0aGUgbW9zdCByZWNlbnQgc29jaWFsXG4gICAqIGxvZ2luIHJlZGlyZWN0IGNhbGxiYWNrLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVzdG9yaW5nIFVJIHN0YXRlLFxuICAgKiBhcHBseWluZyBpbnZpdGUgY29kZXMsIG9yIHRyYWNraW5nIHJlZmVycmFsIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBUaGUgc3RhdGUgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIGFmdGVyIHJldHJpZXZhbCB0byBwcmV2ZW50IHJldXNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc3RvcmVkIGFwcFN0YXRlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TGFzdE9hdXRoU3RhdGUoKTtcbiAgICogaWYgKGFwcFN0YXRlKSB7XG4gICAqICAgLy8gQXBwbHkgaW52aXRlIGNvZGUgb3IgcmVzdG9yZSBVSSBzdGF0ZVxuICAgKiAgIGNvbnNvbGUubG9nKCdPQXV0aCBzdGF0ZTonLCBhcHBTdGF0ZSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRMYXN0T2F1dGhTdGF0ZSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TGFzdE9hdXRoU3RhdGUoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBjb25zb2xlLmxvZygnTUZBIGVuYWJsZWQ6Jywgc3RhdHVzLmVuYWJsZWQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYVN0YXR1cygpOiBQcm9taXNlPE1GQVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFTdGF0dXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGRldmljZXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgTUZBIGRldmljZXMgYXJyYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYURldmljZXMoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZmFEZXZpY2VzKCk6IFByb21pc2U8TUZBRGV2aWNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhRGV2aWNlcygpIGFzIFByb21pc2U8TUZBRGV2aWNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIE1GQSBkZXZpY2UgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXR1cE1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXR1cE1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBNRkEgc2V0dXAgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kXG4gICAqIEBwYXJhbSBzZXR1cERhdGEgLSBTZXR1cCBkYXRhIGZyb20gc2V0dXBNZmFEZXZpY2VcbiAgICogQHBhcmFtIGRldmljZU5hbWUgLSBPcHRpb25hbCBkZXZpY2UgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGV2aWNlIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCd0b3RwJywgeyBjb2RlOiAnMTIzNDU2JyB9LCAnTXkgUGhvbmUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlNZmFTZXR1cChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBzZXR1cERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRldmljZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZXZpY2VJZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmVyaWZ5TWZhU2V0dXAobWV0aG9kLCBzZXR1cERhdGEsIGRldmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBNRkEgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byByZW1vdmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZW1vdmVNZmFEZXZpY2UoJ3NtcycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbW92ZU1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZW1vdmVNZmFEZXZpY2UobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJlZmVycmVkIE1GQSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBEZXZpY2UgbWV0aG9kIHRvIHNldCBhcyBwcmVmZXJyZWQgKCd0b3RwJywgJ3NtcycsICdlbWFpbCcsIG9yICdwYXNza2V5JylcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRQcmVmZXJyZWRNZmFNZXRob2QoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kOiAndG90cCcgfCAnc21zJyB8ICdlbWFpbCcgfCAncGFzc2tleScpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0UHJlZmVycmVkTWZhTWV0aG9kKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmFja3VwIGNvZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGJhY2t1cCBjb2RlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5hdXRoLmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0JhY2t1cCBjb2RlczonLCBjb2Rlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRGV2aWNlIFRydXN0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVHJ1c3QgY3VycmVudCBkZXZpY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgdG9rZW5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudHJ1c3REZXZpY2UoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0cnVzdGVkOicsIHJlc3VsdC5kZXZpY2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdHJ1c3REZXZpY2UoKTogUHJvbWlzZTx7IGRldmljZVRva2VuOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC50cnVzdERldmljZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyB0cnVzdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1c3RlZCBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguaXNUcnVzdGVkRGV2aWNlKCk7XG4gICAqIGlmIChyZXN1bHQudHJ1c3RlZCkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdUaGlzIGRldmljZSBpcyB0cnVzdGVkJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBpc1RydXN0ZWREZXZpY2UoKTogUHJvbWlzZTx7IHRydXN0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQXVkaXQgSGlzdG9yeVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBwYWdpbmF0ZWQgYXVkaXQgaGlzdG9yeSBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGF1ZGl0IGhpc3RvcnkgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBoaXN0b3J5ID0gYXdhaXQgdGhpcy5hdXRoLmdldEF1ZGl0SGlzdG9yeSh7XG4gICAqICAgcGFnZTogMSxcbiAgICogICBsaW1pdDogMjAsXG4gICAqICAgZXZlbnRUeXBlczogWydMT0dJTl9TVUNDRVNTJ10sXG4gICAqICAgZXZlbnRTdGF0dXM6IFsnRkFJTFVSRSddLFxuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coJ0F1ZGl0IGhpc3Rvcnk6JywgaGlzdG9yeSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaXRIaXN0b3J5KFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPj4sXG4gICk6IFByb21pc2U8QXVkaXRIaXN0b3J5UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0QXVkaXRIaXN0b3J5KHBhcmFtcyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVzY2FwZSBIYXRjaFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB1bmRlcmx5aW5nIE5BdXRoQ2xpZW50IGZvciBhZHZhbmNlZCBzY2VuYXJpb3MuXG4gICAqXG5cbiAgICogQHJldHVybnMgVGhlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBEZXByZWNhdGVkIC0gdXNlIGRpcmVjdCBtZXRob2RzIGluc3RlYWRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldENsaWVudCgpLmdldE1mYVN0YXR1cygpO1xuICAgKlxuICAgKiAvLyBQcmVmZXJyZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHNcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENsaWVudCgpOiBOQXV0aENsaWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZG1pbiBPcGVyYXRpb25zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQWRtaW4gb3BlcmF0aW9ucyAoaWYgZW5hYmxlZCBpbiBjb25maWcpLlxuICAgKlxuICAgKiBQcm92aWRlcyBhZG1pbi1sZXZlbCB1c2VyIG1hbmFnZW1lbnQgbWV0aG9kczpcbiAgICogLSBVc2VyIENSVUQgb3BlcmF0aW9uc1xuICAgKiAtIFBhc3N3b3JkIG1hbmFnZW1lbnRcbiAgICogLSBTZXNzaW9uIG1hbmFnZW1lbnRcbiAgICogLSBNRkEgbWFuYWdlbWVudFxuICAgKiAtIEF1ZGl0IGhpc3RvcnlcbiAgICpcbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgYWRtaW4gd2FzIG5vdCBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBZG1pbk9wZXJhdGlvbnMgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ2hlY2sgaWYgYWRtaW4gaXMgYXZhaWxhYmxlXG4gICAqIGlmICh0aGlzLmF1dGguYWRtaW4pIHtcbiAgICogICBjb25zdCB1c2VycyA9IGF3YWl0IHRoaXMuYXV0aC5hZG1pbi5nZXRVc2Vycyh7IHBhZ2U6IDEgfSk7XG4gICAqIH1cbiAgICpcbiAgICogLy8gV2l0aCBvcHRpb25hbCBjaGFpbmluZ1xuICAgKiBhd2FpdCB0aGlzLmF1dGguYWRtaW4/LmRlbGV0ZVVzZXIoc3ViKTtcbiAgICpcbiAgICogLy8gQ3JlYXRlIHVzZXJcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmFkbWluPy5jcmVhdGVVc2VyKHtcbiAgICogICBlbWFpbDogJ3VzZXJAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGlzRW1haWxWZXJpZmllZDogdHJ1ZSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0IGFkbWluKCk6IEFkbWluT3BlcmF0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFkbWluO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnRlcm5hbCBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBieSBoeWRyYXRpbmcgc3RhdGUgZnJvbSBzdG9yYWdlLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBvbiBjb25zdHJ1Y3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmluaXRpYWxpemUoKTtcblxuICAgIC8vIEh5ZHJhdGUgY2hhbGxlbmdlIHN0YXRlXG4gICAgY29uc3Qgc3RvcmVkQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0U3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgaWYgKHN0b3JlZENoYWxsZW5nZSkge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQoc3RvcmVkQ2hhbGxlbmdlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3ViamVjdHMgZnJvbSBjbGllbnQgc3RhdGVcbiAgICBjb25zdCB1c2VyID0gdGhpcy5jbGllbnQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBpZiAodXNlcikge1xuICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hhbGxlbmdlIHN0YXRlIGFmdGVyIGF1dGggcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlc3BvbnNlOiBBdXRoUmVzcG9uc2UpOiBBdXRoUmVzcG9uc2Uge1xuICAgIGlmIChyZXNwb25zZS5jaGFsbGVuZ2VOYW1lKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHJlQ0FQVENIQSBIZWxwZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgcmVDQVBUQ0hBIHRva2VuIC0gYXV0by1nZW5lcmF0ZSBmb3IgdjMgb3IgdXNlIHByb3ZpZGVkIHRva2VuLlxuICAgKlxuICAgKiBIYW5kbGVzIHBsYXRmb3JtIGRldGVjdGlvbjpcbiAgICogLSBXZWIgYnJvd3NlcjogR2VuZXJhdGUgdG9rZW4gaWYgZW5hYmxlZCBhbmQgdjNcbiAgICogLSBDYXBhY2l0b3IgbmF0aXZlOiBTa2lwICh1c2UgZGV2aWNlIGF0dGVzdGF0aW9uIGluc3RlYWQpXG4gICAqIC0gU1NSOiBTa2lwXG4gICAqIC0gTWFudWFsIG1vZGUgKHYyIG9yIG1hbnVhbENoYWxsZW5nZT10cnVlKTogUmVxdWlyZXMgZXhwbGljaXQgdG9rZW5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVkVG9rZW4gLSBFeHBsaWNpdGx5IHByb3ZpZGVkIHRva2VuICh2MiBtYW51YWwgbW9kZSlcbiAgICogQHBhcmFtIGFjdGlvbiAtIEFjdGlvbiBuYW1lIGZvciB2MyBhbmFseXRpY3NcbiAgICogQHJldHVybnMgcmVDQVBUQ0hBIHRva2VuIG9yIHVuZGVmaW5lZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZWNhcHRjaGFUb2tlbihwcm92aWRlZFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBJZiB0b2tlbiBleHBsaWNpdGx5IHByb3ZpZGVkLCB1c2UgaXQgKHYyIG1hbnVhbCBtb2RlKVxuICAgIGlmIChwcm92aWRlZFRva2VuKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZWRUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBObyByZUNBUFRDSEEgc2VydmljZSBhdmFpbGFibGVcbiAgICBpZiAoIXRoaXMucmVjYXB0Y2hhU2VydmljZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiByZUNBUFRDSEEgaXMgY29uZmlndXJlZFxuICAgIGNvbnN0IHJlY2FwdGNoYUNvbmZpZyA9IChcbiAgICAgIHRoaXMuY29uZmlnIGFzIHsgcmVjYXB0Y2hhPzogeyBlbmFibGVkPzogYm9vbGVhbjsgdmVyc2lvbj86IHN0cmluZzsgbWFudWFsQ2hhbGxlbmdlPzogYm9vbGVhbiB9IH1cbiAgICApLnJlY2FwdGNoYTtcblxuICAgIGlmICghcmVjYXB0Y2hhQ29uZmlnPy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNraXAgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgcmVDQVBUQ0hBIChTU1IsIENhcGFjaXRvciBuYXRpdmUpXG4gICAgaWYgKHRoaXMucmVjYXB0Y2hhU2VydmljZS5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gdjIgb3IgbWFudWFsIG1vZGUgLSB1c2VyIG11c3QgcHJvdmlkZSB0b2tlbiBleHBsaWNpdGx5XG4gICAgaWYgKHJlY2FwdGNoYUNvbmZpZy52ZXJzaW9uID09PSAndjInIHx8IHJlY2FwdGNoYUNvbmZpZy5tYW51YWxDaGFsbGVuZ2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQXV0by1nZW5lcmF0ZSB0b2tlbiBmb3IgdjMvRW50ZXJwcmlzZVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWNhcHRjaGFTZXJ2aWNlLmV4ZWN1dGUoYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gTG9nIGVycm9yIGJ1dCBkb24ndCBibG9jayBhdXRoZW50aWNhdGlvblxuICAgICAgLy8gU2VydmVyIHdpbGwgZW5mb3JjZSBpZiByZXF1aXJlZFxuICAgICAgY29uc29sZS53YXJuKCdbQXV0aFNlcnZpY2VdIEZhaWxlZCB0byBnZW5lcmF0ZSByZUNBUFRDSEEgdG9rZW46JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
995
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQyxPQUFPLEVBQ0wsV0FBVyxHQXNCWixNQUFNLHVCQUF1QixDQUFDOzs7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBa0JBO0lBQ0E7SUFsQkwsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7Ozs7O09BS0c7SUFDSCxZQUMrQixNQUF5QixFQUN0RCxXQUErQixFQUNYLE1BQWUsRUFDZixnQkFBbUM7UUFEbkMsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFFdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElB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QU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QiwyQ0FBMkM7WUFDM0Msa0NBQWtDO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7d0dBaGhDVSxXQUFXLGtCQWdCWixtQkFBbUI7NEdBaEJsQixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFpQk4sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUUxQixRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7IFJlY2FwdGNoYVNlcnZpY2UgfSBmcm9tICcuLi9saWIvcmVjYXB0Y2hhLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTkF1dGhDbGllbnQsXG4gIE5BdXRoQ2xpZW50Q29uZmlnLFxuICBBdXRoUmVzcG9uc2VDb250ZXh0LFxuICBDaGFsbGVuZ2VSZXNwb25zZSxcbiAgQXV0aFJlc3BvbnNlLFxuICBUb2tlblJlc3BvbnNlLFxuICBBdXRoVXNlcixcbiAgQ29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlLFxuICBVcGRhdGVQcm9maWxlUmVxdWVzdCxcbiAgR2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlLFxuICBHZXRTZXR1cERhdGFSZXNwb25zZSxcbiAgTUZBU3RhdHVzLFxuICBNRkFEZXZpY2UsXG4gIEF1dGhFdmVudCxcbiAgU29jaWFsUHJvdmlkZXIsXG4gIFNvY2lhbExvZ2luT3B0aW9ucyxcbiAgTGlua2VkQWNjb3VudHNSZXNwb25zZSxcbiAgU29jaWFsVmVyaWZ5UmVxdWVzdCxcbiAgQXVkaXRIaXN0b3J5UmVzcG9uc2UsXG4gIEFkbWluT3BlcmF0aW9ucyxcbn0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgYXJvdW5kIE5BdXRoQ2xpZW50IHRoYXQgcHJvdmlkZXMgcHJvbWlzZS1iYXNlZCBhdXRoIG1ldGhvZHMgYW5kIHJlYWN0aXZlIHN0YXRlLlxuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlczpcbiAqIC0gUmVhY3RpdmUgc3RhdGUgKGN1cnJlbnRVc2VyJCwgaXNBdXRoZW50aWNhdGVkJCwgY2hhbGxlbmdlJClcbiAqIC0gQWxsIGNvcmUgYXV0aCBtZXRob2RzIGFzIFByb21pc2VzIChsb2dpbiwgc2lnbnVwLCBsb2dvdXQsIHJlZnJlc2gpXG4gKiAtIFByb2ZpbGUgbWFuYWdlbWVudCAoZ2V0UHJvZmlsZSwgdXBkYXRlUHJvZmlsZSwgY2hhbmdlUGFzc3dvcmQpXG4gKiAtIENoYWxsZW5nZSBmbG93IG1ldGhvZHMgKHJlc3BvbmRUb0NoYWxsZW5nZSwgcmVzZW5kQ29kZSlcbiAqIC0gTUZBIG1hbmFnZW1lbnQgKGdldE1mYVN0YXR1cywgc2V0dXBNZmFEZXZpY2UsIGV0Yy4pXG4gKiAtIFNvY2lhbCBhdXRoZW50aWNhdGlvbiBhbmQgYWNjb3VudCBsaW5raW5nXG4gKiAtIERldmljZSB0cnVzdCBtYW5hZ2VtZW50XG4gKiAtIEF1ZGl0IGhpc3RvcnlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSkge31cbiAqXG4gKiAvLyBSZWFjdGl2ZSBzdGF0ZVxuICogdGhpcy5hdXRoLmN1cnJlbnRVc2VyJC5zdWJzY3JpYmUodXNlciA9PiAuLi4pO1xuICogdGhpcy5hdXRoLmlzQXV0aGVudGljYXRlZCQuc3Vic2NyaWJlKGlzQXV0aCA9PiAuLi4pO1xuICpcbiAqIC8vIEF1dGggb3BlcmF0aW9ucyB3aXRoIGFzeW5jL2F3YWl0XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5sb2dpbihlbWFpbCwgcGFzc3dvcmQpO1xuICpcbiAqIC8vIFByb2ZpbGUgbWFuYWdlbWVudFxuICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJyB9KTtcbiAqXG4gKiAvLyBNRkEgb3BlcmF0aW9uc1xuICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBOQXV0aENsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFVzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbGxlbmdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aEV2ZW50c1N1YmplY3QgPSBuZXcgU3ViamVjdDxBdXRoRXZlbnQ+KCk7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQHBhcmFtIGNvbmZpZyAtIEluamVjdGVkIGNsaWVudCBjb25maWd1cmF0aW9uIChyZXF1aXJlZClcbiAgICogQHBhcmFtIGh0dHBBZGFwdGVyIC0gQW5ndWxhciBIVFRQIGFkYXB0ZXIgZm9yIG1ha2luZyByZXF1ZXN0cyAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSByb3V0ZXIgLSBBbmd1bGFyIFJvdXRlciAob3B0aW9uYWwsIGF1dG9tYXRpY2FsbHkgdXNlZCBmb3IgbmF2aWdhdGlvbiBpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSByZWNhcHRjaGFTZXJ2aWNlIC0gUmVjYXB0Y2hhU2VydmljZSAob3B0aW9uYWwsIGZvciBhdXRvbWF0aWMgdG9rZW4gZ2VuZXJhdGlvbilcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGVyPzogUm91dGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVjYXB0Y2hhU2VydmljZT86IFJlY2FwdGNoYVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGh0dHBBZGFwdGVyIChmcm9tIGNvbmZpZyBvciBpbmplY3RlZClcbiAgICBjb25zdCBhZGFwdGVyID0gY29uZmlnLmh0dHBBZGFwdGVyID8/IGh0dHBBZGFwdGVyO1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSHR0cEFkYXB0ZXIgbm90IGZvdW5kLiBFaXRoZXIgcHJvdmlkZSBodHRwQWRhcHRlciBpbiBOQVVUSF9DTElFTlRfQ09ORklHIG9yIGVuc3VyZSBIdHRwQ2xpZW50IGlzIGF2YWlsYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQXV0b21hdGljIEFuZ3VsYXIgUm91dGVyIGludGVncmF0aW9uXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIElmIFJvdXRlciBpcyBhdmFpbGFibGUgYW5kIG5vIGN1c3RvbSBuYXZpZ2F0aW9uSGFuZGxlciBpcyBwcm92aWRlZCxcbiAgICAvLyBhdXRvbWF0aWNhbGx5IHVzZSBBbmd1bGFyIFJvdXRlcidzIG5hdmlnYXRlQnlVcmwoKSB0byBwcmV2ZW50IHBhZ2UgcmVmcmVzaGVzXG4gICAgY29uc3QgbmF2aWdhdGlvbkhhbmRsZXIgPVxuICAgICAgY29uZmlnLm5hdmlnYXRpb25IYW5kbGVyID8/XG4gICAgICAodGhpcy5yb3V0ZXJcbiAgICAgICAgPyBhc3luYyAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm91dGVyIS5uYXZpZ2F0ZUJ5VXJsKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gSU1QT1JUQU5UOiBDaGFsbGVuZ2Utc3RhdGUgaHlkcmF0aW9uIEJFRk9SRSBuYXZpZ2F0aW9uIChBbmd1bGFyIGd1YXJkIHNhZmV0eSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBgTkF1dGhDbGllbnQubG9naW4oKWAgYXV0by1uYXZpZ2F0ZXMgdmlhIENoYWxsZW5nZVJvdXRlciAqYmVmb3JlKiByZXR1cm5pbmcuXG4gICAgLy8gVGhlIEFuZ3VsYXIgc2FtcGxlIGFwcCB1c2VzIGEgc3luY2hyb25vdXMgZ3VhcmQgKGBjaGFsbGVuZ2VSb3V0ZUd1YXJkYCkgdGhhdFxuICAgIC8vIHJlYWRzIHRoZSBjdXJyZW50IGNoYWxsZW5nZSB2aWEgYEF1dGhTZXJ2aWNlLmdldEN1cnJlbnRDaGFsbGVuZ2UoKWAgKGJhY2tlZCBieVxuICAgIC8vIGBjaGFsbGVuZ2VTdWJqZWN0LnZhbHVlYCkuIElmIG5hdmlnYXRpb24gaGFwcGVucyBiZWZvcmUgYGNoYWxsZW5nZVN1YmplY3RgIGlzXG4gICAgLy8gdXBkYXRlZCwgdGhlIGd1YXJkIGluY29ycmVjdGx5IHJlZGlyZWN0cyBiYWNrIHRvIGAvbG9naW5gLlxuICAgIC8vXG4gICAgLy8gRml4OiBpbnRlcmNlcHQgdGhlIFNESydzIGF1dG8tbmF2aWdhdGlvbiBob29rIChgb25BdXRoUmVzcG9uc2VgKSwgcHVibGlzaCB0aGVcbiAgICAvLyBjaGFsbGVuZ2Ugc3RhdGUgaW1tZWRpYXRlbHksIHRoZW4gcGVyZm9ybSBkZWZhdWx0IG5hdmlnYXRpb24gKG9yIGRlbGVnYXRlIHRvXG4gICAgLy8gdGhlIHVzZXIncyBjdXN0b20gYG9uQXV0aFJlc3BvbnNlYCBpZiBwcm92aWRlZCkuXG4gICAgY29uc3QgdXNlck9uQXV0aFJlc3BvbnNlID0gY29uZmlnLm9uQXV0aFJlc3BvbnNlO1xuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgTkF1dGhDbGllbnQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgaHR0cEFkYXB0ZXI6IGFkYXB0ZXIsXG4gICAgICBuYXZpZ2F0aW9uSGFuZGxlcixcbiAgICAgIG9uQXV0aFJlc3BvbnNlOiBhc3luYyAocmVzcG9uc2U6IEF1dGhSZXNwb25zZSwgY29udGV4dDogQXV0aFJlc3BvbnNlQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBFbnN1cmUgZ3VhcmRzIGNhbiBzeW5jaHJvbm91c2x5IHNlZSB0aGUgYWN0aXZlIGNoYWxsZW5nZSBiZWZvcmUgbmF2aWdhdGlvbi5cbiAgICAgICAgdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXNwb25zZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIHRoZWlyIG93biBoYW5kbGVyLCBsZXQgdGhlbSB0YWtlIGZ1bGwgY29udHJvbC5cbiAgICAgICAgaWYgKHVzZXJPbkF1dGhSZXNwb25zZSkge1xuICAgICAgICAgIGF3YWl0IHVzZXJPbkF1dGhSZXNwb25zZShyZXNwb25zZSwgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCBuYXZpZ2F0aW9uIGJlaGF2aW9yIChtYXRjaGVzIENoYWxsZW5nZVJvdXRlci5oYW5kbGVBdXRoUmVzcG9uc2UpXG4gICAgICAgIGNvbnN0IHJvdXRlciA9IHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICAgICAgICBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgICAgICAgIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVmZXIgYXBwU3RhdGUgcHJvdmlkZWQgdmlhIGNvbnRleHQgKHNvY2lhbCByZWRpcmVjdCBndWFyZCAvIGV4Y2hhbmdlIGZsb3cpLlxuICAgICAgICAvLyBJTVBPUlRBTlQ6IERvIG5vdCBjb25zdW1lL2NsZWFyIHBlcnNpc3RlZCBPQXV0aCBzdGF0ZSBoZXJlOyBsZWF2ZSBpdCBhdmFpbGFibGVcbiAgICAgICAgLy8gZm9yIGNvbnN1bWVycyB2aWEgZ2V0TGFzdE9hdXRoU3RhdGUoKS5cbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKGNvbnRleHQuYXBwU3RhdGUgPyB7IGFwcFN0YXRlOiBjb250ZXh0LmFwcFN0YXRlIH0gOiB1bmRlZmluZWQsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uQXV0aFN0YXRlQ2hhbmdlOiAodXNlcjogQXV0aFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KEJvb2xlYW4odXNlcikpO1xuICAgICAgICBjb25maWcub25BdXRoU3RhdGVDaGFuZ2U/Lih1c2VyKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBGb3J3YXJkIGFsbCBjbGllbnQgZXZlbnRzIHRvIE9ic2VydmFibGUgc3RyZWFtXG4gICAgdGhpcy5jbGllbnQub24oJyonLCAoZXZlbnQ6IEF1dGhFdmVudCkgPT4ge1xuICAgICAgdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBvbiBjb25zdHJ1Y3Rpb24gKGh5ZHJhdGUgZnJvbSBzdG9yYWdlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGl2ZSBTdGF0ZSBPYnNlcnZhYmxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdXNlciBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPEF1dGhVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVkIHN0YXRlIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgY2hhbGxlbmdlIG9ic2VydmFibGUgKGZvciByZWFjdGl2ZSBjaGFsbGVuZ2UgbmF2aWdhdGlvbikuXG4gICAqL1xuICBnZXQgY2hhbGxlbmdlJCgpOiBPYnNlcnZhYmxlPEF1dGhSZXNwb25zZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIGFsbCBhdXRoIGxpZmVjeWNsZSBldmVudHMgZm9yIGN1c3RvbSBsb2dpYywgYW5hbHl0aWNzLCBvciBVSSB1cGRhdGVzLlxuICAgKi9cbiAgZ2V0IGF1dGhFdmVudHMkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIHVzZXIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgKGxvZ2luLCBzaWdudXAsIHNvY2lhbCBhdXRoKS5cbiAgICovXG4gIGdldCBhdXRoU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDpzdWNjZXNzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGVycm9yIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHMgKGxvZ2luIGVycm9yLCBPQXV0aCBlcnJvciwgZXRjLikuXG4gICAqL1xuICBnZXQgYXV0aEVycm9yJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOmVycm9yJyB8fCBlLnR5cGUgPT09ICdvYXV0aDplcnJvcicpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3luYyBTdGF0ZSBBY2Nlc3NvcnMgKGZvciBndWFyZHMsIHRlbXBsYXRlcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhdXRoZW50aWNhdGVkIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzQXV0aGVudGljYXRlZFN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBnZXRDdXJyZW50VXNlcigpOiBBdXRoVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYWxsZW5nZSAoc3luYykuXG4gICAqL1xuICBnZXRDdXJyZW50Q2hhbGxlbmdlKCk6IEF1dGhSZXNwb25zZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYWxsZW5nZSByb3V0ZXIgZm9yIG1hbnVhbCBuYXZpZ2F0aW9uIGNvbnRyb2wuXG4gICAqIFVzZWZ1bCBmb3IgZ3VhcmRzIHRoYXQgbmVlZCB0byBoYW5kbGUgZXJyb3JzIG9yIGJ1aWxkIGN1c3RvbSBVUkxzLlxuICAgKlxuICAgKiBAcmV0dXJucyBDaGFsbGVuZ2VSb3V0ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb3V0ZXIgPSB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gICAqIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hhbGxlbmdlUm91dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29yZSBBdXRoIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2dpbiB3aXRoIGlkZW50aWZpZXIgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgcGFzcyB0aGUgdG9rZW4gZXhwbGljaXRseS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsIG9yIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgcGFzc3dvcmRcbiAgICogQHBhcmFtIHJlY2FwdGNoYVRva2VuIC0gT3B0aW9uYWwgcmVDQVBUQ0hBIHRva2VuIChmb3IgdjIgbWFudWFsIG1vZGUgb3Igd2hlbiBhdXRvLWdlbmVyYXRpb24gaXMgZGlzYWJsZWQpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZSBCYXNpYyBMb2dpblxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBXaXRoIE1hbnVhbCByZUNBUFRDSEEgKHYyKVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJywgcmVjYXB0Y2hhVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luKGlkZW50aWZpZXI6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgcmVjYXB0Y2hhVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRSZWNhcHRjaGFUb2tlbihyZWNhcHRjaGFUb2tlbiwgJ2xvZ2luJyk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9naW4oaWRlbnRpZmllciwgcGFzc3dvcmQsIHRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ251cCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgaW5jbHVkZSB0b2tlbiBpbiBwYXlsb2FkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFNpZ251cCByZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlIEJhc2ljIFNpZ251cFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLnNpZ251cCh7XG4gICAqICAgZW1haWw6ICduZXdAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFdpdGggTWFudWFsIHJlQ0FQVENIQSAodjIpXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguc2lnbnVwKHtcbiAgICogICBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgcmVjYXB0Y2hhVG9rZW46IHRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWdudXAocGF5bG9hZDogUGFyYW1ldGVyczxOQXV0aENsaWVudFsnc2lnbnVwJ10+WzBdKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICAvLyBBdXRvLWdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbiBmb3IgdjMgaWYgY29uZmlndXJlZCBhbmQgbm90IGFscmVhZHkgcHJvdmlkZWRcbiAgICBjb25zdCBwYXlsb2FkV2l0aFJlY2FwdGNoYSA9IHBheWxvYWQgYXMgeyByZWNhcHRjaGFUb2tlbj86IHN0cmluZyB9O1xuXG4gICAgaWYgKCFwYXlsb2FkV2l0aFJlY2FwdGNoYS5yZWNhcHRjaGFUb2tlbikge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFJlY2FwdGNoYVRva2VuKHVuZGVmaW5lZCwgJ3NpZ251cCcpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHBheWxvYWQgPSB7IC4uLnBheWxvYWQsIHJlY2FwdGNoYVRva2VuOiB0b2tlbiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnNpZ251cChwYXlsb2FkKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBjdXJyZW50IHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2UgLSBJZiB0cnVlLCByZW1vdmVzIGRldmljZSB0cnVzdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dvdXQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXQoZm9yZ2V0RGV2aWNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dChmb3JnZXREZXZpY2UpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAvLyBDbGVhciBDU1JGIHRva2VuIGNvb2tpZSBpZiBpbiBjb29raWVzIG1vZGVcbiAgICAvLyBOb3RlOiBCYWNrZW5kIHNob3VsZCBjbGVhciBodHRwT25seSBjb29raWVzLCBidXQgd2UgY2xlYXIgbm9uLWh0dHBPbmx5IG9uZXNcbiAgICBpZiAodGhpcy5jb25maWcudG9rZW5EZWxpdmVyeSA9PT0gJ2Nvb2tpZXMnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGNzcmZDb29raWVOYW1lID0gdGhpcy5jb25maWcuY3NyZj8uY29va2llTmFtZSA/PyAnbmF1dGhfY3NyZl90b2tlbic7XG4gICAgICAvLyBFeHRyYWN0IGRvbWFpbiBmcm9tIGJhc2VVcmwgaWYgcG9zc2libGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9LzsgZG9tYWluPSR7dXJsLmhvc3RuYW1lfWA7XG4gICAgICAgIC8vIEFsc28gdHJ5IHdpdGhvdXQgZG9tYWluIChmb3IgbG9jYWxob3N0KVxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIGJhc2VVcmwgcGFyc2luZyBmYWlsc1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgYWxsIHNlc3Npb25zLlxuICAgKlxuICAgKiBSZXZva2VzIGFsbCBhY3RpdmUgc2Vzc2lvbnMgZm9yIHRoZSBjdXJyZW50IHVzZXIgYWNyb3NzIGFsbCBkZXZpY2VzLlxuICAgKiBPcHRpb25hbGx5IHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyBpZiBmb3JnZXREZXZpY2VzIGlzIHRydWUuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2VzIC0gSWYgdHJ1ZSwgYWxzbyByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbnVtYmVyIG9mIHNlc3Npb25zIHJldm9rZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgubG9nb3V0QWxsKCk7XG4gICAqIGNvbnNvbGUubG9nKGBSZXZva2VkICR7cmVzdWx0LnJldm9rZWRDb3VudH0gc2Vzc2lvbnNgKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcz86IGJvb2xlYW4pOiBQcm9taXNlPHsgcmV2b2tlZENvdW50OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dEFsbChmb3JnZXREZXZpY2VzKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBuZXcgdG9rZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5hdXRoLnJlZnJlc2goKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZWZyZXNoVG9rZW5zKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFjY291bnQgUmVjb3ZlcnkgKEZvcmdvdCBQYXNzd29yZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgcGFzc3dvcmQgcmVzZXQgY29kZSAoZm9yZ290IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHBhc3N3b3JkIHJlc2V0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYSBwYXNzd29yZCByZXNldCBjb2RlIGFuZCBzZXQgYSBuZXcgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEBwYXJhbSBjb2RlIC0gT25lLXRpbWUgcmVzZXQgY29kZVxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGNvbmZpcm1hdGlvbiByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jb25maXJtRm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY29uZmlybUZvcmdvdFBhc3N3b3JkKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDb25maXJtRm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jb25maXJtRm9yZ290UGFzc3dvcmQoaWRlbnRpZmllciwgY29kZSwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhc3N3b3JkIHdpdGggY29kZSBvciB0b2tlbiAoZ2VuZXJpYyBtZXRob2QgZm9yIGJvdGggYWRtaW4gYW5kIHVzZXItaW5pdGlhdGVkIHJlc2V0cykuXG4gICAqXG4gICAqIEFjY2VwdHMgZWl0aGVyOlxuICAgKiAtIGNvZGU6IFNob3J0IG51bWVyaWMgY29kZSBmcm9tIGVtYWlsL1NNUyAoNi0xMCBkaWdpdHMpXG4gICAqIC0gdG9rZW46IExvbmcgaGV4IHRva2VuIGZyb20gcmVzZXQgbGluayAoNjQgY2hhcnMpXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBpZGVudGlmaWVyIChlbWFpbCwgdXNlcm5hbWUsIHBob25lKVxuICAgKiBAcGFyYW0gY29kZU9yVG9rZW4gLSBWZXJpZmljYXRpb24gY29kZSBPUiB0b2tlbiBmcm9tIGxpbmtcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gV2l0aCBjb2RlIGZyb20gZW1haWxcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICcxMjM0NTYnLCAnTmV3UGFzczEyMyEnKTtcbiAgICpcbiAgICogLy8gV2l0aCB0b2tlbiBmcm9tIGxpbmtcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICc2NC1jaGFyLXRva2VuJywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzZXRQYXNzd29yZFdpdGhDb2RlKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlT3JUb2tlbjogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZFdpdGhDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZXRQYXNzd29yZFdpdGhDb2RlKGlkZW50aWZpZXIsIGNvZGVPclRva2VuLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHVzZXIgcGFzc3dvcmQgKHJlcXVpcmVzIGN1cnJlbnQgcGFzc3dvcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gb2xkUGFzc3dvcmQgLSBDdXJyZW50IHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZCAobXVzdCBtZWV0IHJlcXVpcmVtZW50cylcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcGFzc3dvcmQgaXMgY2hhbmdlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jaGFuZ2VQYXNzd29yZCgnb2xkUGFzc3dvcmQxMjMnLCAnbmV3U2VjdXJlUGFzc3dvcmQ0NTYhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcm9maWxlIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY3VycmVudCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLmdldFByb2ZpbGUoKTtcbiAgICogY29uc29sZS5sb2coJ1VzZXIgcHJvZmlsZTonLCB1c2VyKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRQcm9maWxlKCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0UHJvZmlsZSgpO1xuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb2ZpbGUgaXMgZmV0Y2hlZFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXMgLSBQcm9maWxlIGZpZWxkcyB0byB1cGRhdGVcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiB1cGRhdGVkIHVzZXIgcHJvZmlsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScgfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcm9maWxlIHVwZGF0ZWQ6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJvZmlsZSh1cGRhdGVzOiBVcGRhdGVQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQudXBkYXRlUHJvZmlsZSh1cGRhdGVzKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIHVwZGF0ZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDaGFsbGVuZ2UgRmxvdyBNZXRob2RzIChFc3NlbnRpYWwgZm9yIGFueSBhdXRoIGZsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVzcG9uZCB0byBhIGNoYWxsZW5nZSAoVkVSSUZZX0VNQUlMLCBWRVJJRllfUEhPTkUsIE1GQV9SRVFVSVJFRCwgZXRjLikuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIENoYWxsZW5nZSByZXNwb25zZSBkYXRhXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIG5leHQgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc3BvbmRUb0NoYWxsZW5nZSh7XG4gICAqICAgc2Vzc2lvbjogY2hhbGxlbmdlU2Vzc2lvbixcbiAgICogICB0eXBlOiAnVkVSSUZZX0VNQUlMJyxcbiAgICogICBjb2RlOiAnMTIzNDU2JyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlOiBDaGFsbGVuZ2VSZXNwb25zZSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBjaGFsbGVuZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGVzdGluYXRpb24gaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgICogY29uc29sZS5sb2coJ0NvZGUgc2VudCB0bzonLCByZXN1bHQuZGVzdGluYXRpb24pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2VuZENvZGUoc2Vzc2lvbjogc3RyaW5nKTogUHJvbWlzZTx7IGRlc3RpbmF0aW9uOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNlbmRDb2RlKHNlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc2V0dXAgZGF0YSAoZm9yIE1GQV9TRVRVUF9SRVFVSVJFRCBjaGFsbGVuZ2UpLlxuICAgKlxuICAgKiBSZXR1cm5zIG1ldGhvZC1zcGVjaWZpYyBzZXR1cCBpbmZvcm1hdGlvbjpcbiAgICogLSBUT1RQOiB7IHNlY3JldCwgcXJDb2RlLCBtYW51YWxFbnRyeUtleSB9XG4gICAqIC0gU01TOiB7IG1hc2tlZFBob25lIH1cbiAgICogLSBFbWFpbDogeyBtYXNrZWRFbWFpbCB9XG4gICAqIC0gUGFzc2tleTogV2ViQXV0aG4gcmVnaXN0cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byBzZXQgdXBcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBzZXR1cCBkYXRhIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2V0dXBEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldFNldHVwRGF0YShzZXNzaW9uLCAndG90cCcpO1xuICAgKiBjb25zb2xlLmxvZygnUVIgQ29kZTonLCBzZXR1cERhdGEuc2V0dXBEYXRhLnFyQ29kZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0U2V0dXBEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldFNldHVwRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldFNldHVwRGF0YShzZXNzaW9uLCBtZXRob2QgYXMgUGFyYW1ldGVyczxOQXV0aENsaWVudFsnZ2V0U2V0dXBEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGNoYWxsZW5nZSBkYXRhIChmb3IgTUZBX1JFUVVJUkVEIGNoYWxsZW5nZSAtIGUuZy4sIHBhc3NrZXkgb3B0aW9ucykuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIENoYWxsZW5nZSBtZXRob2RcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBjaGFsbGVuZ2UgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNoYWxsZW5nZURhdGEgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uLCAncGFzc2tleScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZURhdGEoc2Vzc2lvbjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8R2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldENoYWxsZW5nZURhdGEnXT5bMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBjaGFsbGVuZ2UgKHdoZW4gbmF2aWdhdGluZyBhd2F5IGZyb20gY2hhbGxlbmdlIGZsb3cpLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjaGFsbGVuZ2UgaXMgY2xlYXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jbGVhckNoYWxsZW5nZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNsZWFyQ2hhbGxlbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsZWFyU3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgYWNjZXNzIHRva2VuIChKU09OIG1vZGUgb25seSkuXG4gICAqXG4gICAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29uc3VtZXJzIHVzaW5nIEFuZ3VsYXIgYEh0dHBDbGllbnRgIGRpcmVjdGx5XG4gICAqIChvdXRzaWRlIG9mIHRoZSBTREsgbWV0aG9kcykgYW5kIHJlbHlpbmcgb24gYW4gaW50ZXJjZXB0b3IgdG8gYXR0YWNoIEJlYXJlciB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFjY2VzcyB0b2tlbiwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuZ2V0QWNjZXNzVG9rZW4oKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU29jaWFsIEF1dGhlbnRpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhdGUgc29jaWFsIE9BdXRoIGxvZ2luIGZsb3cuXG4gICAqIFJlZGlyZWN0cyB0aGUgYnJvd3NlciB0byBiYWNrZW5kIGAvYXV0aC9zb2NpYWwvOnByb3ZpZGVyL3JlZGlyZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyICgnZ29vZ2xlJywgJ2FwcGxlJywgJ2ZhY2Vib29rJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCByZWRpcmVjdCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHJlZGlyZWN0IHN0YXJ0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dpbldpdGhTb2NpYWwoJ2dvb2dsZScsIHsgcmV0dXJuVG86ICcvYXV0aC9jYWxsYmFjaycgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9naW5XaXRoU29jaWFsKHByb3ZpZGVyOiBTb2NpYWxQcm92aWRlciwgb3B0aW9ucz86IFNvY2lhbExvZ2luT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5sb2dpbldpdGhTb2NpYWwocHJvdmlkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2hhbmdlIGFuIGV4Y2hhbmdlVG9rZW4gKGZyb20gcmVkaXJlY3QgY2FsbGJhY2sgVVJMKSBpbnRvIGFuIEF1dGhSZXNwb25zZS5cbiAgICpcbiAgICogVXNlZCBmb3IgYHRva2VuRGVsaXZlcnk6ICdqc29uJ2Agb3IgaHlicmlkIGZsb3dzIHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0cyBiYWNrXG4gICAqIHdpdGggYGV4Y2hhbmdlVG9rZW5gIGluc3RlYWQgb2Ygc2V0dGluZyBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZXhjaGFuZ2VUb2tlbiAtIE9uZS10aW1lIGV4Y2hhbmdlIHRva2VuIGZyb20gdGhlIGNhbGxiYWNrIFVSTFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgbmF0aXZlIHNvY2lhbCB0b2tlbiAobW9iaWxlKS5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgLSBTb2NpYWwgdmVyaWZpY2F0aW9uIHJlcXVlc3Qgd2l0aCBwcm92aWRlciBhbmQgdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBBdXRoUmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TmF0aXZlU29jaWFsKHtcbiAgICogICBwcm92aWRlcjogJ2dvb2dsZScsXG4gICAqICAgaWRUb2tlbjogbmF0aXZlSWRUb2tlbixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3Q6IFNvY2lhbFZlcmlmeVJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnZlcmlmeU5hdGl2ZVNvY2lhbChyZXF1ZXN0KTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaW5rZWQgc29jaWFsIGFjY291bnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGxpbmtlZCBhY2NvdW50cyByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGFjY291bnRzID0gYXdhaXQgdGhpcy5hdXRoLmdldExpbmtlZEFjY291bnRzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdMaW5rZWQgcHJvdmlkZXJzOicsIGFjY291bnRzLnByb3ZpZGVycyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TGlua2VkQWNjb3VudHMoKTogUHJvbWlzZTxMaW5rZWRBY2NvdW50c1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldExpbmtlZEFjY291bnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogTGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIGxpbmtcbiAgICogQHBhcmFtIGNvZGUgLSBPQXV0aCBhdXRob3JpemF0aW9uIGNvZGVcbiAgICogQHBhcmFtIHN0YXRlIC0gT0F1dGggc3RhdGUgcGFyYW1ldGVyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScsIGNvZGUsIHN0YXRlKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsaW5rU29jaWFsQWNjb3VudChwcm92aWRlcjogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXIsIGNvZGUsIHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxpbmsgc29jaWFsIGFjY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciB0byB1bmxpbmtcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC51bmxpbmtTb2NpYWxBY2NvdW50KCdnb29nbGUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudW5saW5rU29jaWFsQWNjb3VudChwcm92aWRlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXN0IE9BdXRoIGFwcFN0YXRlIGZyb20gc29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHBTdGF0ZSB0aGF0IHdhcyBzdG9yZWQgZHVyaW5nIHRoZSBtb3N0IHJlY2VudCBzb2NpYWxcbiAgICogbG9naW4gcmVkaXJlY3QgY2FsbGJhY2suIFRoaXMgaXMgdXNlZnVsIGZvciByZXN0b3JpbmcgVUkgc3RhdGUsXG4gICAqIGFwcGx5aW5nIGludml0ZSBjb2Rlcywgb3IgdHJhY2tpbmcgcmVmZXJyYWwgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIFRoZSBzdGF0ZSBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgcmV0cmlldmFsIHRvIHByZXZlbnQgcmV1c2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdG9yZWQgYXBwU3RhdGUsIG9yIG51bGwgaWYgbm9uZSBleGlzdHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICAgKiBpZiAoYXBwU3RhdGUpIHtcbiAgICogICAvLyBBcHBseSBpbnZpdGUgY29kZSBvciByZXN0b3JlIFVJIHN0YXRlXG4gICAqICAgY29uc29sZS5sb2coJ09BdXRoIHN0YXRlOicsIGFwcFN0YXRlKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldExhc3RPYXV0aFN0YXRlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgTWFuYWdlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc3RhdHVzIGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIE1GQSBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdNRkEgZW5hYmxlZDonLCBzdGF0dXMuZW5hYmxlZCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TWZhU3RhdHVzKCk6IFByb21pc2U8TUZBU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldE1mYVN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgZGV2aWNlcyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgZGV2aWNlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhRGV2aWNlcygpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYURldmljZXMoKTogUHJvbWlzZTxNRkFEZXZpY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFEZXZpY2VzKCkgYXMgUHJvbWlzZTxNRkFEZXZpY2VbXT47XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgTUZBIGRldmljZSAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5zZXR1cE1mYURldmljZSgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldHVwTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldHVwTWZhRGV2aWNlKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IE1GQSBzZXR1cCAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2RcbiAgICogQHBhcmFtIHNldHVwRGF0YSAtIFNldHVwIGRhdGEgZnJvbSBzZXR1cE1mYURldmljZVxuICAgKiBAcGFyYW0gZGV2aWNlTmFtZSAtIE9wdGlvbmFsIGRldmljZSBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TWZhU2V0dXAoJ3RvdHAnLCB7IGNvZGU6ICcxMjM0NTYnIH0sICdNeSBQaG9uZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU1mYVNldHVwKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHNldHVwRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGV2aWNlTmFtZT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGRldmljZUlkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC52ZXJpZnlNZmFTZXR1cChtZXRob2QsIHNldHVwRGF0YSwgZGV2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIE1GQSBkZXZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlbW92ZU1mYURldmljZSgnc21zJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlbW92ZU1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwcmVmZXJyZWQgTUZBIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIERldmljZSBtZXRob2QgdG8gc2V0IGFzIHByZWZlcnJlZCAoJ3RvdHAnLCAnc21zJywgJ2VtYWlsJywgb3IgJ3Bhc3NrZXknKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnNldFByZWZlcnJlZE1mYU1ldGhvZCgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldFByZWZlcnJlZE1mYU1ldGhvZChtZXRob2Q6ICd0b3RwJyB8ICdzbXMnIHwgJ2VtYWlsJyB8ICdwYXNza2V5Jyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiYWNrdXAgY29kZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYmFja3VwIGNvZGVzIGFycmF5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICAgKiBjb25zb2xlLmxvZygnQmFja3VwIGNvZGVzOicsIGNvZGVzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGVzOiBbJ0xPR0lOX1NVQ0NFU1MnXSxcbiAgICogICBldmVudFN0YXR1czogWydGQUlMVVJFJ10sXG4gICAqIH0pO1xuICAgKiBjb25zb2xlLmxvZygnQXVkaXQgaGlzdG9yeTonLCBoaXN0b3J5KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBdWRpdEhpc3RvcnkoXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IEFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+PixcbiAgKTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcblxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkbWluIE9wZXJhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBZG1pbiBvcGVyYXRpb25zIChpZiBlbmFibGVkIGluIGNvbmZpZykuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFkbWluLWxldmVsIHVzZXIgbWFuYWdlbWVudCBtZXRob2RzOlxuICAgKiAtIFVzZXIgQ1JVRCBvcGVyYXRpb25zXG4gICAqIC0gUGFzc3dvcmQgbWFuYWdlbWVudFxuICAgKiAtIFNlc3Npb24gbWFuYWdlbWVudFxuICAgKiAtIE1GQSBtYW5hZ2VtZW50XG4gICAqIC0gQXVkaXQgaGlzdG9yeVxuICAgKlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBhZG1pbiB3YXMgbm90IGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEFkbWluT3BlcmF0aW9ucyBpbnN0YW5jZSBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDaGVjayBpZiBhZG1pbiBpcyBhdmFpbGFibGVcbiAgICogaWYgKHRoaXMuYXV0aC5hZG1pbikge1xuICAgKiAgIGNvbnN0IHVzZXJzID0gYXdhaXQgdGhpcy5hdXRoLmFkbWluLmdldFVzZXJzKHsgcGFnZTogMSB9KTtcbiAgICogfVxuICAgKlxuICAgKiAvLyBXaXRoIG9wdGlvbmFsIGNoYWluaW5nXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5hZG1pbj8uZGVsZXRlVXNlcihzdWIpO1xuICAgKlxuICAgKiAvLyBDcmVhdGUgdXNlclxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguYWRtaW4/LmNyZWF0ZVVzZXIoe1xuICAgKiAgIGVtYWlsOiAndXNlckBleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgaXNFbWFpbFZlcmlmaWVkOiB0cnVlLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgYWRtaW4oKTogQWRtaW5PcGVyYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRtaW47XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcmVDQVBUQ0hBIEhlbHBlclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCByZUNBUFRDSEEgdG9rZW4gLSBhdXRvLWdlbmVyYXRlIGZvciB2MyBvciB1c2UgcHJvdmlkZWQgdG9rZW4uXG4gICAqXG4gICAqIEhhbmRsZXMgcGxhdGZvcm0gZGV0ZWN0aW9uOlxuICAgKiAtIFdlYiBicm93c2VyOiBHZW5lcmF0ZSB0b2tlbiBpZiBlbmFibGVkIGFuZCB2M1xuICAgKiAtIENhcGFjaXRvciBuYXRpdmU6IFNraXAgKHVzZSBkZXZpY2UgYXR0ZXN0YXRpb24gaW5zdGVhZClcbiAgICogLSBTU1I6IFNraXBcbiAgICogLSBNYW51YWwgbW9kZSAodjIgb3IgbWFudWFsQ2hhbGxlbmdlPXRydWUpOiBSZXF1aXJlcyBleHBsaWNpdCB0b2tlblxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZWRUb2tlbiAtIEV4cGxpY2l0bHkgcHJvdmlkZWQgdG9rZW4gKHYyIG1hbnVhbCBtb2RlKVxuICAgKiBAcGFyYW0gYWN0aW9uIC0gQWN0aW9uIG5hbWUgZm9yIHYzIGFuYWx5dGljc1xuICAgKiBAcmV0dXJucyByZUNBUFRDSEEgdG9rZW4gb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFJlY2FwdGNoYVRva2VuKHByb3ZpZGVkVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIElmIHRva2VuIGV4cGxpY2l0bHkgcHJvdmlkZWQsIHVzZSBpdCAodjIgbWFudWFsIG1vZGUpXG4gICAgaWYgKHByb3ZpZGVkVG9rZW4pIHtcbiAgICAgIHJldHVybiBwcm92aWRlZFRva2VuO1xuICAgIH1cblxuICAgIC8vIE5vIHJlQ0FQVENIQSBzZXJ2aWNlIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5yZWNhcHRjaGFTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHJlQ0FQVENIQSBpcyBjb25maWd1cmVkXG4gICAgY29uc3QgcmVjYXB0Y2hhQ29uZmlnID0gKFxuICAgICAgdGhpcy5jb25maWcgYXMgeyByZWNhcHRjaGE/OiB7IGVuYWJsZWQ/OiBib29sZWFuOyB2ZXJzaW9uPzogc3RyaW5nOyBtYW51YWxDaGFsbGVuZ2U/OiBib29sZWFuIH0gfVxuICAgICkucmVjYXB0Y2hhO1xuXG4gICAgaWYgKCFyZWNhcHRjaGFDb25maWc/LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCByZUNBUFRDSEEgKFNTUiwgQ2FwYWNpdG9yIG5hdGl2ZSlcbiAgICBpZiAodGhpcy5yZWNhcHRjaGFTZXJ2aWNlLnNob3VsZFNraXAoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyB2MiBvciBtYW51YWwgbW9kZSAtIHVzZXIgbXVzdCBwcm92aWRlIHRva2VuIGV4cGxpY2l0bHlcbiAgICBpZiAocmVjYXB0Y2hhQ29uZmlnLnZlcnNpb24gPT09ICd2MicgfHwgcmVjYXB0Y2hhQ29uZmlnLm1hbnVhbENoYWxsZW5nZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBBdXRvLWdlbmVyYXRlIHRva2VuIGZvciB2My9FbnRlcnByaXNlXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlY2FwdGNoYVNlcnZpY2UuZXhlY3V0ZShhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBMb2cgZXJyb3IgYnV0IGRvbid0IGJsb2NrIGF1dGhlbnRpY2F0aW9uXG4gICAgICAvLyBTZXJ2ZXIgd2lsbCBlbmZvcmNlIGlmIHJlcXVpcmVkXG4gICAgICBjb25zb2xlLndhcm4oJ1tBdXRoU2VydmljZV0gRmFpbGVkIHRvIGdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19
|