@atlasauth/angular 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +108 -0
- package/README.md +1 -1
- package/dist/README.md +1 -1
- package/dist/esm2022/lib/atlas.config.mjs +1 -1
- package/dist/esm2022/lib/atlas.service.mjs +92 -33
- package/dist/esm2022/lib/components/attempt-flow.component.mjs +94 -5
- package/dist/esm2022/lib/components/flow-controller.mjs +130 -7
- package/dist/esm2022/lib/components/sign-in.component.mjs +20 -4
- package/dist/esm2022/lib/components/sign-up-form.component.mjs +432 -0
- package/dist/esm2022/lib/components/sign-up.component.mjs +52 -22
- package/dist/esm2022/lib/directives/captcha-slot.directive.mjs +42 -0
- package/dist/esm2022/lib/i18n.mjs +16 -1
- package/dist/esm2022/public-api.mjs +6 -1
- package/dist/fesm2022/atlasauth-angular.mjs +860 -67
- package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
- package/dist/lib/atlas.config.d.ts +7 -2
- package/dist/lib/atlas.service.d.ts +23 -3
- package/dist/lib/components/attempt-flow.component.d.ts +22 -2
- package/dist/lib/components/flow-controller.d.ts +66 -3
- package/dist/lib/components/sign-in.component.d.ts +3 -1
- package/dist/lib/components/sign-up-form.component.d.ts +47 -0
- package/dist/lib/components/sign-up.component.d.ts +9 -5
- package/dist/lib/directives/captcha-slot.directive.d.ts +19 -0
- package/dist/public-api.d.ts +4 -0
- package/package.json +7 -5
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# @atlasauth/angular changelog
|
|
2
|
+
|
|
3
|
+
## 0.4.0
|
|
4
|
+
- **Safer sign-out.** `AtlasService.signOut(options?: SignOutOptions)` now returns
|
|
5
|
+
`Promise<SignOutResult>` (`{ revoked: boolean; activeSessionId?: string }`; was `Promise<void>` —
|
|
6
|
+
existing `await signOut()` / `.then()` call sites keep working). It runs through the shared
|
|
7
|
+
`SignOutGuard` from `@atlasauth/js`: the session id is recorded as a tombstone (localStorage, per
|
|
8
|
+
Frontend API origin) before the revoke, the revoke is retried once, and a reload, token refresh, a
|
|
9
|
+
sibling tab or a tab opened later never re-adopts a signed-out session — even when the revoke failed
|
|
10
|
+
and the refresh cookie is still valid. A refused session's revoke is retried in the background and
|
|
11
|
+
its tombstone dropped once the server confirms. With no cached token the cookie session is found via
|
|
12
|
+
`GET /v1/client`, so the revoke is never skipped. A parked session the server promoted on revoke
|
|
13
|
+
(`active_session_id`) is adopted. New option `signOut({ strict: true })` rejects with a
|
|
14
|
+
`SignOutError` (`code: 'SIGN_OUT_REVOKE_FAILED'`, `sessionId`, `status`) after the local sign-out
|
|
15
|
+
when the revoke was never confirmed. Another tab signing out of the same session now signs this tab
|
|
16
|
+
out too. `ngOnDestroy()` also stops the cross-tab watch and cancels background re-tries.
|
|
17
|
+
- **Popup OAuth landing.** On startup (browser only), before the redirect-ticket exchange, the service
|
|
18
|
+
calls `completeOAuthPopupLanding()`: on the landing page of a sign-in popup whose opener was severed
|
|
19
|
+
by a Cross-Origin-Opener-Policy (`#atlas_popup_result=…`) it scrubs the fragment, relays the result
|
|
20
|
+
to the opener and closes the window — without redeeming the ticket itself. When no opener takes it,
|
|
21
|
+
it exchanges the ticket like a redirect result (or follows the payload's `continuationUrl`). After a
|
|
22
|
+
successful ticket exchange inside the Atlas popup it calls `closeOAuthPopupAfterSignIn()`, which
|
|
23
|
+
wakes the waiting opener and closes the popup (a no-op in an ordinary tab).
|
|
24
|
+
- **Email delivery in the prebuilt components** (`InstanceSettings.emailDelivery` from
|
|
25
|
+
`GET /v1/appearance`; everything reads as available when the server omits it):
|
|
26
|
+
- `<atlas-sign-up-form>` shows a `signUp.emailUnavailable` notice (`role="alert"`,
|
|
27
|
+
`data-atlas-email-unavailable`) instead of the email + password form when
|
|
28
|
+
`emailDelivery.passwordSignUp` is `false`.
|
|
29
|
+
- `<atlas-sign-in>`'s first-factor step offers `offeredFirstFactors(strategies, emailDelivery)`:
|
|
30
|
+
an "Email me a code" option when `email_code` is offered (hidden while the app cannot send email),
|
|
31
|
+
and the password field unless an emailed code is the only offer.
|
|
32
|
+
- **Added to `AtlasFlowController`:** `firstFactors(): string[]`, `signUpEmailUnavailable(): boolean`,
|
|
33
|
+
`passwordResetAvailable(): boolean`, `prepare(strategy: 'email_code'): Promise<void>` and
|
|
34
|
+
`preparedFactor: WritableSignal<'email_code' | null>`.
|
|
35
|
+
- **Added to `AttemptFlowComponent`:** inputs `firstFactors: string[] | null` and
|
|
36
|
+
`preparedFactor: string | null`, output `chooseFactor: EventEmitter<'email_code'>`; new element class
|
|
37
|
+
`atlas-button-secondary` (`formButtonSecondary`).
|
|
38
|
+
- **Added catalog keys** (en-US): `signUp.emailUnavailable` ("This app can't send email right now. Try
|
|
39
|
+
another sign-in method or contact the app owner." — `EMAIL_UNAVAILABLE_MESSAGE`), `signIn.useEmailCode`.
|
|
40
|
+
- **Added re-exports** from `@atlasauth/js`: `SignOutError` (class) and the types `SignOutResult`,
|
|
41
|
+
`SignOutOptions`, `EmailDelivery`.
|
|
42
|
+
- Requires `@atlasauth/js` 0.8.0.
|
|
43
|
+
|
|
44
|
+
## 0.3.0
|
|
45
|
+
- **`<atlas-sign-up>` now creates accounts.** Its first step is a create-account form (the instance's
|
|
46
|
+
configured sign-up fields, email, password and the legal-consent row) that posts
|
|
47
|
+
`POST /v1/client/sign_ups`; the emailed-code step and the ticket exchange then run through the shared
|
|
48
|
+
flow engine. Previously it rendered the sign-in identifier step and could not create an account.
|
|
49
|
+
- **Captcha renders automatically.** When the instance turns captcha on for a flow, `<atlas-sign-up>` and
|
|
50
|
+
`<atlas-sign-in>` show the provider's widget (Turnstile, hCaptcha, reCAPTCHA v2/v3/Enterprise) in the
|
|
51
|
+
configured mode (`visible`, `managed`, or `invisible` — run on submit), send its token as
|
|
52
|
+
`captcha_token`, answer the sign-in `needs_captcha` step (continuing as soon as it is solved), and on
|
|
53
|
+
`CAPTCHA_REQUIRED` / `CAPTCHA_FAILED` show a localized message and a fresh widget.
|
|
54
|
+
- **Added to `AtlasFlowController`:** `create(values, consent?)`, `loadSettings()`,
|
|
55
|
+
`settings: WritableSignal<InstanceSettings | null>`, `captcha` / `signUpCaptcha: CaptchaController`,
|
|
56
|
+
`captchaDrawn` / `signUpCaptchaDrawn: WritableSignal<boolean>`, and an optional 4th constructor
|
|
57
|
+
argument `t: (key: string) => string` for the captcha messages (defaults to en-US). `destroy()` now
|
|
58
|
+
also removes the captcha widgets.
|
|
59
|
+
- **Added** `SignUpFormComponent` (`<atlas-sign-up-form>`, output `submitSignUp: SignUpFormSubmit`),
|
|
60
|
+
the `SignUpFormSubmit` type, the `AtlasCaptchaSlotDirective` (`[atlasCaptchaSlot]`), the
|
|
61
|
+
`AttemptFlowComponent` input `captcha`, and type re-exports `InstanceSettings`, `PublicSignUpField`,
|
|
62
|
+
`CaptchaController`, `CaptchaFlowKey`, `CaptchaWidgetMode`, `FlowCaptcha` from `@atlasauth/js`.
|
|
63
|
+
- **Added catalog keys** (en-US): `signUp.emailLabel`, `signUp.passwordLabel`, `signUp.optionalField`,
|
|
64
|
+
`signUp.selectPlaceholder`, `signUp.consentAgree`, `signUp.consentNotice`, `signUp.terms`,
|
|
65
|
+
`signUp.privacy`, `signUp.and`, `captcha.prompt`, `captcha.required`, `captcha.failed`.
|
|
66
|
+
- New element classes `atlas-captcha`, `atlas-consent`, `atlas-choices`, `atlas-choice`, `atlas-text`,
|
|
67
|
+
`atlas-link`; the flow's inputs now carry `name` attributes.
|
|
68
|
+
- **`frontendApi` is validated at `provideAtlas()` / `AtlasModule.forRoot()`.** A missing (or non-string) or malformed value now throws an
|
|
69
|
+
`AtlasConfigError` (from `@atlasauth/js`; `code: 'FRONTEND_API_REQUIRED'` or `'FRONTEND_API_INVALID'`)
|
|
70
|
+
instead of silently sending requests to relative URLs on the app's own origin. Accepted: an absolute
|
|
71
|
+
`https:` URL (`http:` only for localhost / local development hosts), or `"same-origin"` / a root-relative path such as `"/atlas"` for a reverse proxy.
|
|
72
|
+
- **Deprecated:** `frontendApi: ""` (the original same-origin spelling) still works as same-origin, with a
|
|
73
|
+
one-time console warning; use `"same-origin"` instead.
|
|
74
|
+
|
|
75
|
+
## 0.2.1
|
|
76
|
+
- **Front-channel logout on sign-out.** `signOut()` now loads the `frontchannel_logout_urls` the
|
|
77
|
+
Frontend API returns (apps signed in with "Sign in with Atlas" through this session) in hidden,
|
|
78
|
+
sandboxed iframes, so those apps clear their sessions in this browser too. It waits until the frames
|
|
79
|
+
load or 5 s pass, never fails the sign-out, only loads `https:` URLs (and `http://localhost`), and
|
|
80
|
+
does nothing during SSR. Pass `signOut({ frontchannel: false })` to skip it.
|
|
81
|
+
|
|
82
|
+
## 0.2.0
|
|
83
|
+
- **Design system.** `atlasRoot` now applies the design configured in the Atlas dashboard
|
|
84
|
+
automatically (fetched in the browser; opt out with `appearance.instanceDesign: false`).
|
|
85
|
+
- **New `appearance.preset` and `appearance.design`** — the same settings and semantics as
|
|
86
|
+
`@atlasauth/react`: dashboard design < `preset` < `variables` < `design`. Invalid values are dropped
|
|
87
|
+
with a development warning and never reach CSS. The `atlasRoot` host gets stable `data-atlas-*`
|
|
88
|
+
attributes and the `--atlas-*` design variables; web fonts are linked from your Frontend API.
|
|
89
|
+
- `AtlasService` gains `appearanceRender()` and `loadInstanceDesign()`.
|
|
90
|
+
- `appearance.variables` / `baseTheme` are unchanged when no design is in play.
|
|
91
|
+
- New dependency: `@atlasauth/design`.
|
|
92
|
+
|
|
93
|
+
## 0.1.3
|
|
94
|
+
- **Metadata.** Added `repository` (monorepo + package directory), `homepage`, and `bugs` so the npm page links back to source.
|
|
95
|
+
|
|
96
|
+
## 0.1.2
|
|
97
|
+
- **Docs fix.** README now references the real published packages `@atlasauth/react` / `@atlasauth/js` (were shown as `@atlas/*`).
|
|
98
|
+
|
|
99
|
+
## 0.1.1
|
|
100
|
+
- First published release.
|
|
101
|
+
- **Setup.** `provideAtlas({ publishableKey, frontendApi, ... })` (or `AtlasModule`) configures the SDK; options are injectable through `ATLAS_OPTIONS`. Requires Angular 17 or later.
|
|
102
|
+
- **`AtlasService`.** Signals and observables for `status`, `user`, `session`, `claims`, `memberships`, `organization`, `isLoaded` and `isSignedIn`, plus `getToken()`, `getProviderToken()`, `has()`, `signOut()`, `setActiveOrganization()` and `reload()`.
|
|
103
|
+
- **Directives.** `*atlasSignedIn`, `*atlasSignedOut`, `*atlasLoading`, `*atlasLoaded` and `*atlasProtect` structural directives, and the `atlasRoot` theming host.
|
|
104
|
+
- **Components.** Sign-in, sign-up, user button, organization switcher, user profile and organization profile components, plus `AttemptFlowComponent` / `AtlasFlowController` for custom flows.
|
|
105
|
+
- `ATLAS_UI` bundles the directives and components for standalone imports.
|
|
106
|
+
- **Route guards.** `atlasGuard` and `atlasChildGuard` protect routes by sign-in state and the same role / permission conditions as `has()`; `AtlasGuardOptions` adds `redirectTo` and `preserveReturnUrl`.
|
|
107
|
+
- Appearance, localization and authorization helpers shared with the other Atlas UI SDKs.
|
|
108
|
+
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ bootstrapApplication(AppComponent, {
|
|
|
30
30
|
providers: [
|
|
31
31
|
provideAtlas({
|
|
32
32
|
publishableKey: 'pk_test_…',
|
|
33
|
-
|
|
33
|
+
frontendApi: 'https://fapi.your-instance.atlasauth.net', // required; 'same-origin' behind a reverse proxy
|
|
34
34
|
// appearance: { baseTheme: 'dark', elements: { formButtonPrimary: 'rounded-xl' } },
|
|
35
35
|
// localization: myCatalog,
|
|
36
36
|
}),
|
package/dist/README.md
CHANGED
|
@@ -30,7 +30,7 @@ bootstrapApplication(AppComponent, {
|
|
|
30
30
|
providers: [
|
|
31
31
|
provideAtlas({
|
|
32
32
|
publishableKey: 'pk_test_…',
|
|
33
|
-
|
|
33
|
+
frontendApi: 'https://fapi.your-instance.atlasauth.net', // required; 'same-origin' behind a reverse proxy
|
|
34
34
|
// appearance: { baseTheme: 'dark', elements: { formButtonPrimary: 'rounded-xl' } },
|
|
35
35
|
// localization: myCatalog,
|
|
36
36
|
}),
|
|
@@ -5,4 +5,4 @@ import { InjectionToken } from '@angular/core';
|
|
|
5
5
|
* and read by {@link AtlasService}. Applications rarely inject this directly.
|
|
6
6
|
*/
|
|
7
7
|
export const ATLAS_OPTIONS = new InjectionToken('ATLAS_OPTIONS');
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdGxhcy5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdDL0M7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBZSxlQUFlLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEFwcGVhcmFuY2UgfSBmcm9tICcuL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHR5cGUgeyBDYXRhbG9nIH0gZnJvbSAnLi9pMThuJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQXRsYXMgQW5ndWxhciBTREsg4oCUIHRoZSBBbmd1bGFyIGFuYWxvZ3VlIG9mIHRoZSBwcm9wc1xuICogcGFzc2VkIHRvIFJlYWN0J3MgYDxBdGxhc1Byb3ZpZGVyPmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRsYXNPcHRpb25zIHtcbiAgLyoqIFRoZSBpbnN0YW5jZSdzIHB1Ymxpc2hhYmxlIGtleSAoYHBrX+KApmApLiBSZXF1aXJlZC4gKi9cbiAgcHVibGlzaGFibGVLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSdzIEZyb250ZW5kIEFQSTogYW4gYWJzb2x1dGUgVVJMIHN1Y2ggYXNcbiAgICogYFwiaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29tXCJgLCBvciBgXCJzYW1lLW9yaWdpblwiYCAvIGEgcGF0aCBzdWNoIGFzIGBcIi9hdGxhc1wiYFxuICAgKiBiZWhpbmQgYSByZXZlcnNlIHByb3h5IG9uIHRoZSBhcHAncyBvd24gb3JpZ2luIChyZXF1ZXN0cyB0aGVuIGdvIHRvXG4gICAqIGAvdjEvLi4uYCBvbiB0aGUgYXBwJ3MgaG9zdCkuIFJlcXVpcmVkIGF0IHJ1bnRpbWUg4oCUIGBBdGxhc1NlcnZpY2VgIHRocm93cyBhblxuICAgKiBgQXRsYXNDb25maWdFcnJvcmAgKGBGUk9OVEVORF9BUElfUkVRVUlSRURgIC8gYEZST05URU5EX0FQSV9JTlZBTElEYCkgd2hlblxuICAgKiBpdCBpcyBtaXNzaW5nIG9yIG1hbGZvcm1lZC4gT3B0aW9uYWwgaW4gdGhlIHR5cGUgb25seSBzbyBleGlzdGluZyBjYWxsIHNpdGVzXG4gICAqIGtlZXAgY29tcGlsaW5nLlxuICAgKi9cbiAgZnJvbnRlbmRBcGk/OiBzdHJpbmc7XG4gIC8qKiBEZXNpZ24gdG9rZW5zICsgcGVyLWVsZW1lbnQgY2xhc3Mgb3ZlcnJpZGVzLiBTZWUge0BsaW5rIEFwcGVhcmFuY2V9LiAqL1xuICBhcHBlYXJhbmNlPzogQXBwZWFyYW5jZTtcbiAgLyoqIEEgbG9jYWxpemF0aW9uIGNhdGFsb2cgbWVyZ2VkIG92ZXIgYGVuLVVTYC4gKi9cbiAgbG9jYWxpemF0aW9uPzogQ2F0YWxvZztcbiAgLyoqXG4gICAqIEEgYGZldGNoYCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIG9uZSDigJQgaGFuZHkgZm9yIFNTUlxuICAgKiBvciB0ZXN0cy4gRGVmYXVsdHMgdG8gYGdsb2JhbFRoaXMuZmV0Y2hgLlxuICAgKi9cbiAgZmV0Y2hJbXBsPzogdHlwZW9mIGZldGNoO1xufVxuXG4vKipcbiAqIERJIHRva2VuIGNhcnJ5aW5nIHRoZSByZXNvbHZlZCB7QGxpbmsgQXRsYXNPcHRpb25zfS4gUG9wdWxhdGVkIGJ5XG4gKiB7QGxpbmsgcHJvdmlkZUF0bGFzfSAoc3RhbmRhbG9uZSkgb3Ige0BsaW5rIEF0bGFzTW9kdWxlLmZvclJvb3R9IChOZ01vZHVsZSlcbiAqIGFuZCByZWFkIGJ5IHtAbGluayBBdGxhc1NlcnZpY2V9LiBBcHBsaWNhdGlvbnMgcmFyZWx5IGluamVjdCB0aGlzIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY29uc3QgQVRMQVNfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBdGxhc09wdGlvbnM+KCdBVExBU19PUFRJT05TJyk7XG4iXX0=
|
|
@@ -3,7 +3,7 @@ import { isPlatformBrowser } from '@angular/common';
|
|
|
3
3
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
5
5
|
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
6
|
-
import { FapiClient, TokenCache, getProviderToken as fetchProviderToken, msUntilRefresh, readExpiry, readRedirectResult,
|
|
6
|
+
import { FapiClient, SignOutGuard, TokenCache, closeOAuthPopupAfterSignIn, completeOAuthPopupLanding, getProviderToken as fetchProviderToken, mapOAuthPopupPayload, msUntilRefresh, readExpiry, readRedirectResult, resolveFrontendApi, stripRedirectParams, } from '@atlasauth/js';
|
|
7
7
|
import { evaluate } from '@atlasauth/authz';
|
|
8
8
|
import { ATLAS_OPTIONS } from './atlas.config';
|
|
9
9
|
import { cssVariables, instanceDesignFrom, renderAppearance, resolveTokens, } from './appearance';
|
|
@@ -37,6 +37,14 @@ export class AtlasService {
|
|
|
37
37
|
cache = new TokenCache();
|
|
38
38
|
fapiClient;
|
|
39
39
|
refreshTimer = null;
|
|
40
|
+
/**
|
|
41
|
+
* The sessions this browser signed out of (tombstones in localStorage, per
|
|
42
|
+
* Frontend API origin), the revoke and its background re-tries. Every reload /
|
|
43
|
+
* refresh asks it before adopting a session, so a sign-out the server never
|
|
44
|
+
* confirmed is not undone by the still-valid refresh cookie.
|
|
45
|
+
*/
|
|
46
|
+
guard;
|
|
47
|
+
stopWatchingSignOut = null;
|
|
40
48
|
catalog;
|
|
41
49
|
/**
|
|
42
50
|
* A sign-in attempt handed back by an OAuth redirect that still needs a second
|
|
@@ -86,7 +94,11 @@ export class AtlasService {
|
|
|
86
94
|
constructor() {
|
|
87
95
|
const options = this.options;
|
|
88
96
|
this.publishableKey = options.publishableKey;
|
|
89
|
-
|
|
97
|
+
// Throws an `AtlasConfigError` on a missing/invalid value rather than quietly
|
|
98
|
+
// sending every request to a relative path on the app's origin.
|
|
99
|
+
this.baseUrl = resolveFrontendApi(options.frontendApi, {
|
|
100
|
+
component: 'provideAtlas() / AtlasModule.forRoot()',
|
|
101
|
+
});
|
|
90
102
|
this.doFetch = options.fetchImpl ?? ((...args) => fetch(...args));
|
|
91
103
|
this.catalog = options.localization ? withFallback(options.localization) : EN_US;
|
|
92
104
|
this.fapiClient = new FapiClient({
|
|
@@ -94,6 +106,10 @@ export class AtlasService {
|
|
|
94
106
|
baseUrl: this.baseUrl,
|
|
95
107
|
fetchImpl: this.doFetch,
|
|
96
108
|
});
|
|
109
|
+
this.guard = new SignOutGuard({
|
|
110
|
+
request: (path, init) => this.call(path, init),
|
|
111
|
+
frontendApi: this.baseUrl,
|
|
112
|
+
});
|
|
97
113
|
// Captured synchronously (not in an async init) so it is available before any
|
|
98
114
|
// flow component reads it: a needs_second_factor redirect carries a status but
|
|
99
115
|
// no ticket, and that is what the 2FA resume seeds from.
|
|
@@ -101,10 +117,19 @@ export class AtlasService {
|
|
|
101
117
|
// Boot once, browser only. On the server there is no cookie jar to read a
|
|
102
118
|
// session from, so we leave the state at `loading` and let hydration boot it.
|
|
103
119
|
if (this.isBrowser) {
|
|
120
|
+
// Another tab signed out of THIS session (its tombstone reached the shared
|
|
121
|
+
// store): drop the token and re-check, which then refuses the session.
|
|
122
|
+
this.stopWatchingSignOut = this.guard.watch(() => this.cache.peek()?.sessionId ?? this._session.value?.id, () => {
|
|
123
|
+
this.cache.clear();
|
|
124
|
+
void this.reload();
|
|
125
|
+
});
|
|
104
126
|
void this.boot();
|
|
105
127
|
}
|
|
106
128
|
}
|
|
107
129
|
ngOnDestroy() {
|
|
130
|
+
this.stopWatchingSignOut?.();
|
|
131
|
+
this.stopWatchingSignOut = null;
|
|
132
|
+
this.guard.dispose();
|
|
108
133
|
this.clearRefreshTimer();
|
|
109
134
|
this._status.complete();
|
|
110
135
|
this._user.complete();
|
|
@@ -183,25 +208,27 @@ export class AtlasService {
|
|
|
183
208
|
has(condition) {
|
|
184
209
|
return evaluate(this._claims.value, condition).allowed;
|
|
185
210
|
}
|
|
186
|
-
/**
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
this.
|
|
202
|
-
this.
|
|
203
|
-
this.
|
|
204
|
-
this.
|
|
211
|
+
/**
|
|
212
|
+
* Revoke the current session server-side and drop all local auth state.
|
|
213
|
+
*
|
|
214
|
+
* The session id is remembered before the revoke (a tombstone shared by every
|
|
215
|
+
* tab), so a reload, a token refresh, a sibling tab or a tab opened later never
|
|
216
|
+
* re-adopts it — even when the revoke failed (it is retried once, then again in
|
|
217
|
+
* the background) and the refresh cookie is still valid. Resolves
|
|
218
|
+
* `{ revoked, activeSessionId? }`; with `{ strict: true }` an unconfirmed revoke
|
|
219
|
+
* rejects with a `SignOutError` instead (after the local sign-out). A parked
|
|
220
|
+
* session the server promoted on revoke is adopted. Front-channel logout runs
|
|
221
|
+
* unless `{ frontchannel: false }`.
|
|
222
|
+
*/
|
|
223
|
+
async signOut(options = {}) {
|
|
224
|
+
// With no cached token the guard finds the cookie session itself
|
|
225
|
+
// (GET /v1/client), so a missing JWT never skips the revoke.
|
|
226
|
+
const sessionId = this.cache.peek()?.sessionId ?? this._session.value?.id ?? null;
|
|
227
|
+
const attempt = await this.guard.revoke(sessionId, options);
|
|
228
|
+
this.clearLocalState();
|
|
229
|
+
if (this.guard.promoted(attempt))
|
|
230
|
+
await this.reload();
|
|
231
|
+
return this.guard.settle(attempt, options);
|
|
205
232
|
}
|
|
206
233
|
/**
|
|
207
234
|
* Switch the active organization (or `null` for the personal account). The
|
|
@@ -229,14 +256,10 @@ export class AtlasService {
|
|
|
229
256
|
if (!response.ok)
|
|
230
257
|
throw new Error('boot failed');
|
|
231
258
|
const body = (await response.json());
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
this.
|
|
236
|
-
this._user.next(null);
|
|
237
|
-
this._session.next(null);
|
|
238
|
-
this._claims.next(null);
|
|
239
|
-
this._memberships.next([]);
|
|
259
|
+
// A session this browser signed out of is never re-adopted from the
|
|
260
|
+
// refresh cookie; the guard re-tries its revoke in the background.
|
|
261
|
+
if (!body.session || !body.user || this.guard.refuse(body.session.id)) {
|
|
262
|
+
this.clearLocalState();
|
|
240
263
|
return;
|
|
241
264
|
}
|
|
242
265
|
this._user.next(body.user);
|
|
@@ -264,17 +287,41 @@ export class AtlasService {
|
|
|
264
287
|
* has no ticket, so nothing is exchanged and the app boots signed-out.
|
|
265
288
|
*/
|
|
266
289
|
async boot() {
|
|
267
|
-
const
|
|
290
|
+
const fromUrl = readRedirectResult(window.location.search);
|
|
291
|
+
let result = fromUrl;
|
|
292
|
+
// §oauth popup mode: this page may be the landing of a sign-in popup whose
|
|
293
|
+
// opener a Cross-Origin-Opener-Policy severed (`#atlas_popup_result=…`).
|
|
294
|
+
// The result is relayed to the opener, which redeems the ticket, and this
|
|
295
|
+
// window closes. If no opener takes it (its tab is gone), finish here like
|
|
296
|
+
// a redirect.
|
|
297
|
+
const landing = await completeOAuthPopupLanding().catch(() => null);
|
|
298
|
+
if (landing && !landing.delivered) {
|
|
299
|
+
const outcome = mapOAuthPopupPayload(landing.payload);
|
|
300
|
+
if (outcome?.ticket && outcome.attemptId) {
|
|
301
|
+
result = { attemptId: outcome.attemptId, ticket: outcome.ticket };
|
|
302
|
+
}
|
|
303
|
+
else if (outcome?.continuationUrl) {
|
|
304
|
+
// A second factor / connect step / provider error: the redirect flow's page.
|
|
305
|
+
window.location.replace(outcome.continuationUrl);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
let exchanged = false;
|
|
268
310
|
if (result?.ticket) {
|
|
269
|
-
await this.call('/v1/client/tickets/exchange', {
|
|
311
|
+
const response = await this.call('/v1/client/tickets/exchange', {
|
|
270
312
|
method: 'POST',
|
|
271
313
|
body: JSON.stringify({ attempt_id: result.attemptId, ticket: result.ticket }),
|
|
272
314
|
}).catch(() => undefined);
|
|
315
|
+
exchanged = !!response?.ok;
|
|
273
316
|
}
|
|
274
|
-
if (
|
|
317
|
+
if (fromUrl) {
|
|
275
318
|
window.history.replaceState({}, document.title, stripRedirectParams(window.location.href));
|
|
276
319
|
}
|
|
277
320
|
await this.reload();
|
|
321
|
+
// Signed in inside the Atlas popup (the redirect flow ran in it): hand back
|
|
322
|
+
// to the waiting opener and close. A no-op in an ordinary tab.
|
|
323
|
+
if (exchanged)
|
|
324
|
+
void closeOAuthPopupAfterSignIn();
|
|
278
325
|
}
|
|
279
326
|
readPendingAttempt() {
|
|
280
327
|
const result = readRedirectResult(window.location.search);
|
|
@@ -296,6 +343,9 @@ export class AtlasService {
|
|
|
296
343
|
});
|
|
297
344
|
}
|
|
298
345
|
applyToken(jwt, sessionId) {
|
|
346
|
+
// An in-flight refresh must not resurrect a session signed out meanwhile.
|
|
347
|
+
if (this.guard.isSignedOut(sessionId))
|
|
348
|
+
return;
|
|
299
349
|
const expiresAt = readExpiry(jwt);
|
|
300
350
|
if (!expiresAt)
|
|
301
351
|
return;
|
|
@@ -321,6 +371,15 @@ export class AtlasService {
|
|
|
321
371
|
await this.reload();
|
|
322
372
|
}
|
|
323
373
|
}
|
|
374
|
+
clearLocalState() {
|
|
375
|
+
this.clearRefreshTimer();
|
|
376
|
+
this.cache.clear();
|
|
377
|
+
this._status.next('signed_out');
|
|
378
|
+
this._user.next(null);
|
|
379
|
+
this._session.next(null);
|
|
380
|
+
this._claims.next(null);
|
|
381
|
+
this._memberships.next([]);
|
|
382
|
+
}
|
|
324
383
|
/** §7.4: proactive, jittered refresh scheduled from the token's own expiry. */
|
|
325
384
|
scheduleRefresh() {
|
|
326
385
|
this.clearRefreshTimer();
|
|
@@ -357,4 +416,4 @@ function decodeClaims(jwt) {
|
|
|
357
416
|
return null;
|
|
358
417
|
}
|
|
359
418
|
}
|
|
360
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUVuQixpQ0FBaUMsR0FFbEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FJZCxNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBZ0IsTUFBTSxRQUFRLENBQUM7O0FBUzNEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE1BQU0sT0FBTyxZQUFZO0lBQ04sT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxJ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LENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQyxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDckMsQ0FBQztJQUNyQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE9uRGVzdHJveSxcbiAgUExBVEZPUk1fSUQsXG4gIFNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEZhcGlDbGllbnQsXG4gIFRva2VuQ2FjaGUsXG4gIGdldFByb3ZpZGVyVG9rZW4gYXMgZmV0Y2hQcm92aWRlclRva2VuLFxuICBtc1VudGlsUmVmcmVzaCxcbiAgcmVhZEV4cGlyeSxcbiAgcmVhZFJlZGlyZWN0UmVzdWx0LFxuICBzdHJpcFJlZGlyZWN0UGFyYW1zLFxuICB0eXBlIFByb3ZpZGVyVG9rZW4sXG4gIHJ1bkZyb250Q2hhbm5lbExvZ291dEZyb21SZXNwb25zZSxcbiAgdHlwZSBTaWduT3V0T3B0aW9ucyxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZSwgdHlwZSBQcm90ZWN0Q29uZGl0aW9uIH0gZnJvbSAnQGF0bGFzYXV0aC9hdXRoeic7XG5pbXBvcnQgeyBBVExBU19PUFRJT05TIH0gZnJvbSAnLi9hdGxhcy5jb25maWcnO1xuaW1wb3J0IHtcbiAgY3NzVmFyaWFibGVzLFxuICBpbnN0YW5jZURlc2lnbkZyb20sXG4gIHJlbmRlckFwcGVhcmFuY2UsXG4gIHJlc29sdmVUb2tlbnMsXG4gIHR5cGUgQXBwZWFyYW5jZSxcbiAgdHlwZSBBcHBlYXJhbmNlUmVuZGVyLFxuICB0eXBlIEluc3RhbmNlRGVzaWduLFxufSBmcm9tICcuL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgRU5fVVMsIHdpdGhGYWxsYmFjaywgdHlwZSBDYXRhbG9nIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB0eXBlIHtcbiAgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwLFxuICBBdGxhc1Nlc3Npb24sXG4gIEF0bGFzVXNlcixcbiAgQXV0aFN0YXR1cyxcbiAgU2Vzc2lvbkNsYWltcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogYEF0bGFzU2VydmljZWAg4oCUIHRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgPEF0bGFzUHJvdmlkZXI+YCArIGhvb2tzLlxuICpcbiAqIEl0IGhvbGRzIGV4YWN0bHkgb25lIHRoaW5nIHRoYXQgbWF0dGVycyBpbiBtZW1vcnk6IHRoZSBzaG9ydC1saXZlZCBKV1QsIGluIGFcbiAqIHtAbGluayBUb2tlbkNhY2hlfS4gTm90IGxvY2FsU3RvcmFnZSwgbm90IGEgY29va2llIHRoaXMgY29kZSB3cml0ZXMg4oCUIHRoZVxuICogcmVmcmVzaCB0b2tlbiBpcyBIdHRwT25seSBzbyBicm93c2VyIHNjcmlwdCBuZXZlciB0b3VjaGVzIGl0LCBhbmQgdGhlIEpXVFxuICogbGl2ZXMgb25seSBhcyBsb25nIGFzIHRoZSB0YWIuIEFueXRoaW5nIHBlcnNpc3RlZCB3b3VsZCBzdXJ2aXZlIHRoZSB0YWIgYW5kXG4gKiBiZWNvbWUgdGhlIGZpcnN0IHRoaW5nIGFuIFhTUyByZWFkcy5cbiAqXG4gKiBSZWFjdGl2ZSBhdXRoIHN0YXRlIGlzIGV4cG9zZWQgdHdvIHdheXMgc28gY2FsbGVycyBjYW4gcGljayB0aGVpciBpZGlvbTpcbiAqICAtIFJ4SlMgb2JzZXJ2YWJsZXMgKGB1c2VyJGAsIGBzZXNzaW9uJGAsIGBpc1NpZ25lZEluJGAsIOKApikg4oCUIHRoZSBwcmltYXJ5IEFQSSxcbiAqICAgIHRoZSBhbmFsb2d1ZSBvZiB0aGUgUmVhY3QgaG9va3MnIHJldHVybiB2YWx1ZXMuXG4gKiAgLSBBbmd1bGFyIHNpZ25hbHMgKGB1c2VyYCwgYHNlc3Npb25gLCBgaXNTaWduZWRJbmAsIOKApikg4oCUIHRoZSBzYW1lIHZhbHVlcyBhc1xuICogICAgYFNpZ25hbDxUPmAsIGZvciB0ZW1wbGF0ZXMgYW5kIGBjb21wdXRlZCgpYC5cbiAqXG4gKiBUaGUgaW1wZXJhdGl2ZSBtZXRob2RzIChgc2lnbk91dGAsIGBnZXRUb2tlbmAsIGBnZXRQcm92aWRlclRva2VuYCxcbiAqIGBzZXRBY3RpdmVPcmdhbml6YXRpb25gLCBgcmVsb2FkYCkgbWlycm9yIHRoZSBhY3Rpb25zIHRoZSBob29rcyByZXR1cm4uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXRsYXNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KEFUTEFTX09QVElPTlMpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGlzaGFibGVLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkb0ZldGNoOiB0eXBlb2YgZmV0Y2g7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBUb2tlbkNhY2hlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFwaUNsaWVudDogRmFwaUNsaWVudDtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nOiBDYXRhbG9nO1xuXG4gIC8qKlxuICAgKiBBIHNpZ24taW4gYXR0ZW1wdCBoYW5kZWQgYmFjayBieSBhbiBPQXV0aCByZWRpcmVjdCB0aGF0IHN0aWxsIG5lZWRzIGEgc2Vjb25kXG4gICAqIGZhY3RvciAobm8gc2Vzc2lvbiB3YXMgaXNzdWVkKS4gTnVsbCBpbiB0aGUgb3JkaW5hcnkgY2FzZTsgdGhlIGA8YXRsYXMtc2lnbi1pbj5gXG4gICAqIGZsb3cgc2VlZHMgaXRzZWxmIGZyb20gdGhpcyBzbyB0aGUgdXNlciByZXN1bWVzIGF0IHRoZSAyRkEgc3RlcC4gQ2FwdHVyZWRcbiAgICogb25jZSwgc3luY2hyb25vdXNseSwgYXQgY29uc3RydWN0aW9uIOKAlCBiZWZvcmUgYW55IGZsb3cgY29tcG9uZW50IHJlYWRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ0F0dGVtcHQ6IHsgaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGw7XG5cbiAgLy8gLS0tIFJlYWN0aXZlIHN0YXRlIChzb3VyY2Ugb2YgdHJ1dGgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXR1cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFN0YXR1cz4oJ2xvYWRpbmcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNVc2VyIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Nlc3Npb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzU2Vzc2lvbiB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFpbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25DbGFpbXMgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWVtYmVyc2hpcHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPihbXSk7XG5cbiAgLyoqIFRoZSB0aHJlZS1zdGF0ZSBhdXRoIGxpZmVjeWNsZTogYGxvYWRpbmdgIOKGkiBgc2lnbmVkX2luYCB8IGBzaWduZWRfb3V0YC4gKi9cbiAgcmVhZG9ubHkgc3RhdHVzJDogT2JzZXJ2YWJsZTxBdXRoU3RhdHVzPiA9IHRoaXMuX3N0YXR1cy5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgdXNlciQ6IE9ic2VydmFibGU8QXRsYXNVc2VyIHwgbnVsbD4gPSB0aGlzLl91c2VyLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBzZXNzaW9uJDogT2JzZXJ2YWJsZTxBdGxhc1Nlc3Npb24gfCBudWxsPiA9IHRoaXMuX3Nlc3Npb24uYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IGNsYWltcyQ6IE9ic2VydmFibGU8U2Vzc2lvbkNsYWltcyB8IG51bGw+ID0gdGhpcy5fY2xhaW1zLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBtZW1iZXJzaGlwcyQ6IE9ic2VydmFibGU8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+ID1cbiAgICB0aGlzLl9tZW1iZXJzaGlwcy5hc09ic2VydmFibGUoKTtcblxuICAvKipcbiAgICogVHJ1ZSBvbmNlIHRoZSBTREsgaGFzIGZpbmlzaGVkIGl0cyBmaXJzdCBib290LiBEaXN0aW5ndWlzaGluZyBcInN0aWxsIGxvYWRpbmdcIlxuICAgKiBmcm9tIFwic2lnbmVkIG91dFwiIGlzIHdoYXQgbGV0cyBhIHRlbXBsYXRlIGF2b2lkIHRoZSBmbGFzaCBvZiBhIHNpZ24taW4gZm9ybVxuICAgKiBvbiBldmVyeSBwYWdlIGxvYWQuXG4gICAqL1xuICByZWFkb25seSBpc0xvYWRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBtYXAoKHMpID0+IHMgIT09ICdsb2FkaW5nJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgKTtcblxuICByZWFkb25seSBpc1NpZ25lZEluJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgocykgPT4gcyA9PT0gJ3NpZ25lZF9pbicpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICk7XG5cbiAgLyoqIFRoZSBhY3RpdmUgb3JnYW5pemF0aW9uIG1lbWJlcnNoaXAsIGRlcml2ZWQgZnJvbSB0aGUgdG9rZW4ncyBgb3JnX2lkYCBjbGFpbS4gKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLFxuICAgIHRoaXMuX2NsYWltcyxcbiAgXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW21lbWJlcnNoaXBzLCBjbGFpbXNdKSA9PlxuICAgICAgICBtZW1iZXJzaGlwcy5maW5kKChtKSA9PiBtLm9yZ2FuaXphdGlvbi5pZCA9PT0gY2xhaW1zPy5vcmdfaWQpID8/IG51bGwsXG4gICAgKSxcbiAgKTtcblxuICAvLyAtLS0gU2lnbmFsIG1pcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcmVhZG9ubHkgc3RhdHVzOiBTaWduYWw8QXV0aFN0YXR1cz4gPSB0b1NpZ25hbCh0aGlzLnN0YXR1cyQsIHsgaW5pdGlhbFZhbHVlOiAnbG9hZGluZycgfSk7XG4gIHJlYWRvbmx5IHVzZXI6IFNpZ25hbDxBdGxhc1VzZXIgfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMudXNlciQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBzZXNzaW9uOiBTaWduYWw8QXRsYXNTZXNzaW9uIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLnNlc3Npb24kLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgY2xhaW1zOiBTaWduYWw8U2Vzc2lvbkNsYWltcyB8IG51bGw+ID0gdG9TaWduYWwodGhpcy5jbGFpbXMkLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcHM6IFNpZ25hbDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4gPSB0b1NpZ25hbCh0aGlzLm1lbWJlcnNoaXBzJCwge1xuICAgIGluaXRpYWxWYWx1ZTogW10gYXMgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10sXG4gIH0pO1xuICByZWFkb25seSBpc0xvYWRlZDogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0dXMoKSAhPT0gJ2xvYWRpbmcnKTtcbiAgcmVhZG9ubHkgaXNTaWduZWRJbjogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0dXMoKSA9PT0gJ3NpZ25lZF9pbicpO1xuICByZWFkb25seSBvcmdhbml6YXRpb246IFNpZ25hbDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBvcmdJZCA9IHRoaXMuY2xhaW1zKCk/Lm9yZ19pZDtcbiAgICByZXR1cm4gdGhpcy5tZW1iZXJzaGlwcygpLmZpbmQoKG0pID0+IG0ub3JnYW5pemF0aW9uLmlkID09PSBvcmdJZCkgPz8gbnVsbDtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLnB1Ymxpc2hhYmxlS2V5ID0gb3B0aW9ucy5wdWJsaXNoYWJsZUtleTtcbiAgICB0aGlzLmJhc2VVcmwgPSBvcHRpb25zLmZyb250ZW5kQXBpID8/ICcnO1xuICAgIHRoaXMuZG9GZXRjaCA9IG9wdGlvbnMuZmV0Y2hJbXBsID8/ICgoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgZmV0Y2g+KSA9PiBmZXRjaCguLi5hcmdzKSk7XG5cbiAgICB0aGlzLmNhdGFsb2cgPSBvcHRpb25zLmxvY2FsaXphdGlvbiA/IHdpdGhGYWxsYmFjayhvcHRpb25zLmxvY2FsaXphdGlvbikgOiBFTl9VUztcblxuICAgIHRoaXMuZmFwaUNsaWVudCA9IG5ldyBGYXBpQ2xpZW50KHtcbiAgICAgIHB1Ymxpc2hhYmxlS2V5OiB0aGlzLnB1Ymxpc2hhYmxlS2V5LFxuICAgICAgYmFzZVVybDogdGhpcy5iYXNlVXJsLFxuICAgICAgZmV0Y2hJbXBsOiB0aGlzLmRvRmV0Y2gsXG4gICAgfSk7XG5cbiAgICAvLyBDYXB0dXJlZCBzeW5jaHJvbm91c2x5IChub3QgaW4gYW4gYXN5bmMgaW5pdCkgc28gaXQgaXMgYXZhaWxhYmxlIGJlZm9yZSBhbnlcbiAgICAvLyBmbG93IGNvbXBvbmVudCByZWFkcyBpdDogYSBuZWVkc19zZWNvbmRfZmFjdG9yIHJlZGlyZWN0IGNhcnJpZXMgYSBzdGF0dXMgYnV0XG4gICAgLy8gbm8gdGlja2V0LCBhbmQgdGhhdCBpcyB3aGF0IHRoZSAyRkEgcmVzdW1lIHNlZWRzIGZyb20uXG4gICAgdGhpcy5wZW5kaW5nQXR0ZW1wdCA9IHRoaXMuaXNCcm93c2VyID8gdGhpcy5yZWFkUGVuZGluZ0F0dGVtcHQoKSA6IG51bGw7XG5cbiAgICAvLyBCb290IG9uY2UsIGJyb3dzZXIgb25seS4gT24gdGhlIHNlcnZlciB0aGVyZSBpcyBubyBjb29raWUgamFyIHRvIHJlYWQgYVxuICAgIC8vIHNlc3Npb24gZnJvbSwgc28gd2UgbGVhdmUgdGhlIHN0YXRlIGF0IGBsb2FkaW5nYCBhbmQgbGV0IGh5ZHJhdGlvbiBib290IGl0LlxuICAgIGlmICh0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgdm9pZCB0aGlzLmJvb3QoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5fc3RhdHVzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fdXNlci5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3Nlc3Npb24uY29tcGxldGUoKTtcbiAgICB0aGlzLl9jbGFpbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl9tZW1iZXJzaGlwcy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gLS0tIENvbmZpZ3VyYXRpb24gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGdldCBhcHBlYXJhbmNlKCk6IEFwcGVhcmFuY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXBwZWFyYW5jZTtcbiAgfVxuXG4gIGdldCBsb2NhbGl6YXRpb24oKTogQ2F0YWxvZyB7XG4gICAgcmV0dXJuIHRoaXMuY2F0YWxvZztcbiAgfVxuXG4gIGdldCBmcm9udGVuZEFwaSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VVcmw7XG4gIH1cblxuICAvKiogVG9rZW5zIGFzIENTUyBjdXN0b20gcHJvcGVydGllcywgZm9yIGEgaG9zdCBlbGVtZW50IHRvIGluaGVyaXQuICovXG4gIGFwcGVhcmFuY2VWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGNzc1ZhcmlhYmxlcyhyZXNvbHZlVG9rZW5zKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGwgYXBwZWFyYW5jZSByZW5kZXIgZm9yIGEgcm9vdCBlbGVtZW50OiBpbmxpbmUgdmFyaWFibGVzLCB0aGVcbiAgICogYGRhdGEtYXRsYXMtKmAgYXR0cmlidXRlcyBhbmQgdGhlIGRlc2lnbiBzdHlsZXNoZWV0LiBQYXNzIHRoZSBkYXNoYm9hcmRcbiAgICogZGVzaWduIChmcm9tIHtAbGluayBsb2FkSW5zdGFuY2VEZXNpZ259KSB0byBsYXllciBjb2RlIG92ZXJyaWRlcyBvbiBpdCDigJRcbiAgICogdGhlIHNhbWUgc2VtYW50aWNzIGFzIGBAYXRsYXNhdXRoL3JlYWN0YC5cbiAgICovXG4gIGFwcGVhcmFuY2VSZW5kZXIoaW5zdGFuY2VEZXNpZ24/OiBJbnN0YW5jZURlc2lnbiB8IG51bGwpOiBBcHBlYXJhbmNlUmVuZGVyIHtcbiAgICByZXR1cm4gcmVuZGVyQXBwZWFyYW5jZSh0aGlzLm9wdGlvbnMuYXBwZWFyYW5jZSwgaW5zdGFuY2VEZXNpZ24gPz8gbnVsbCwge1xuICAgICAgZnJvbnRlbmRBcGk6IHRoaXMuYmFzZVVybCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVzaWduIGNvbmZpZ3VyZWQgaW4gdGhlIEF0bGFzIGRhc2hib2FyZCAoYEdFVCAvdjEvYXBwZWFyYW5jZWApLCBvciBudWxsXG4gICAqIHdoZW4gdGhlcmUgaXMgbm9uZSwgaXQgY2Fubm90IGJlIHJlYWQsIG9yIHRoZSBhcHAgb3B0ZWQgb3V0IHdpdGhcbiAgICogYGFwcGVhcmFuY2UuaW5zdGFuY2VEZXNpZ246IGZhbHNlYC5cbiAgICovXG4gIGFzeW5jIGxvYWRJbnN0YW5jZURlc2lnbigpOiBQcm9taXNlPEluc3RhbmNlRGVzaWduIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXBwZWFyYW5jZT8uaW5zdGFuY2VEZXNpZ24gPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoJy92MS9hcHBlYXJhbmNlJyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2Uub2sgPyBpbnN0YW5jZURlc2lnbkZyb20oYXdhaXQgcmVzcG9uc2UuanNvbigpKSA6IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogQSBmcmVzaCB7QGxpbmsgRmFwaUNsaWVudH0gZm9yIGRyaXZpbmcgYSBzaWduLWluL3NpZ24tdXAgZmxvdy4gKi9cbiAgY3JlYXRlRmFwaUNsaWVudCgpOiBGYXBpQ2xpZW50IHtcbiAgICByZXR1cm4gbmV3IEZhcGlDbGllbnQoeyBwdWJsaXNoYWJsZUtleTogdGhpcy5wdWJsaXNoYWJsZUtleSwgYmFzZVVybDogdGhpcy5iYXNlVXJsIH0pO1xuICB9XG5cbiAgLy8gLS0tIEltcGVyYXRpdmUgQVBJIChtaXJyb3JzIHRoZSBSZWFjdCBob29rcycgYWN0aW9ucykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzZXNzaW9uJ3MgSldULCBhbHdheXMgZnJlc2g6IGlmIHRoZSBjYWNoZWQgdG9rZW4gaXMgd2l0aGluIDVzIG9mXG4gICAqIGV4cGlyeSBpdCBpcyByZWZyZXNoZWQgZmlyc3QgcmF0aGVyIHRoYW4gaGFuZGVkIG92ZXIuIE51bGwgd2hlbiBzaWduZWQgb3V0LlxuICAgKi9cbiAgYXN5bmMgZ2V0VG9rZW4oKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgdXNhYmxlID0gdGhpcy5jYWNoZS5nZXQoNV8wMDApO1xuICAgIGlmICh1c2FibGUpIHJldHVybiB1c2FibGUuand0O1xuXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KDVfMDAwKT8uand0ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpZ25lZC1pbiB1c2VyJ3MgT1dOIGxpdmUgYWNjZXNzIHRva2VuIGF0IGEgY29ubmVjdGVkIHByb3ZpZGVyIChHb29nbGUsXG4gICAqIEdpdEh1Yiwg4oCmKSwgc28gdGhlIGFwcCBjYW4gY2FsbCB0aGF0IHByb3ZpZGVyJ3MgQVBJIGZyb20gdGhlIGJyb3dzZXIuIE51bGxcbiAgICogd2hlbiB0aGVyZSBpcyBubyB1c2FibGUgdG9rZW4g4oCUIG5vIGxpbmtlZCBhY2NvdW50LCBvciB0aGUgcHJvdmlkZXIgZ3JhbnRlZCAvXG4gICAqIGtlcHQgbm9uZS4gVGhlIHNlcnZlciByZWZyZXNoZXMgYSBzdGFsZSB0b2tlbiBvbiByZWFkOyB0aGUgcmVmcmVzaCB0b2tlbiBpc1xuICAgKiBuZXZlciBleHBvc2VkLlxuICAgKi9cbiAgZ2V0UHJvdmlkZXJUb2tlbihwcm92aWRlcjogc3RyaW5nKTogUHJvbWlzZTxQcm92aWRlclRva2VuIHwgbnVsbD4ge1xuICAgIHJldHVybiBmZXRjaFByb3ZpZGVyVG9rZW4odGhpcy5mYXBpQ2xpZW50LCBwcm92aWRlcik7XG4gIH1cblxuICAvKiogSW1wZXJhdGl2ZSBgaGFzKClgIOKAlCB0aGUgc2FtZSBldmFsdWF0aW9uIGAqYXRsYXNQcm90ZWN0YCByZW5kZXJzIG9uLiAqL1xuICBoYXMoY29uZGl0aW9uOiBQcm90ZWN0Q29uZGl0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2YWx1YXRlKHRoaXMuX2NsYWltcy52YWx1ZSwgY29uZGl0aW9uKS5hbGxvd2VkO1xuICB9XG5cbiAgLyoqIFJldm9rZSB0aGUgY3VycmVudCBzZXNzaW9uIHNlcnZlci1zaWRlIGFuZCBkcm9wIGFsbCBsb2NhbCBhdXRoIHN0YXRlLiAqL1xuICBhc3luYyBzaWduT3V0KG9wdGlvbnM/OiBTaWduT3V0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgY29uc3QgcmV2b2tlZCA9IGF3YWl0IHRoaXMuY2FsbChgL3YxL2NsaWVudC9zZXNzaW9ucy8ke2N1cnJlbnQuc2Vzc2lvbklkfS9yZXZva2VgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIC8vIE9JREMgRnJvbnQtQ2hhbm5lbCBMb2dvdXQ6IGxldCB0aGUgYXBwcyBzaWduZWQgaW4gdGhyb3VnaCB0aGlzIHNlc3Npb25cbiAgICAgIC8vIGNsZWFyIHRoZWlycyBpbiB0aGlzIGJyb3dzZXIgKGhpZGRlbiBpZnJhbWVzLCBjYXBwZWQgYXQgNSBzKS4gQmVzdC1lZmZvcnQuXG4gICAgICBpZiAob3B0aW9ucz8uZnJvbnRjaGFubmVsICE9PSBmYWxzZSkgYXdhaXQgcnVuRnJvbnRDaGFubmVsTG9nb3V0RnJvbVJlc3BvbnNlKHJldm9rZWQpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfb3V0Jyk7XG4gICAgdGhpcy5fdXNlci5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3Nlc3Npb24ubmV4dChudWxsKTtcbiAgICB0aGlzLl9jbGFpbXMubmV4dChudWxsKTtcbiAgICB0aGlzLl9tZW1iZXJzaGlwcy5uZXh0KFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKG9yIGBudWxsYCBmb3IgdGhlIHBlcnNvbmFsIGFjY291bnQpLiBUaGVcbiAgICogbmV3IHRva2VuIGNhcnJpZXMgdGhlIG5ldyBvcmcgY2xhaW1zLCBzbyB0aGUgYXBwJ3MgcGVybWlzc2lvbiBjaGVja3MgdXBkYXRlXG4gICAqIHdpdGhvdXQgYSByZS1sb2dpbi5cbiAgICovXG4gIGFzeW5jIHNldEFjdGl2ZU9yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKGAvdjEvY2xpZW50L3Nlc3Npb25zLyR7Y3VycmVudC5zZXNzaW9uSWR9L3RvdWNoYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGl2ZV9vcmdhbml6YXRpb25faWQ6IG9yZ2FuaXphdGlvbklkIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHJldHVybjtcblxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGp3dDogc3RyaW5nIH07XG4gICAgdGhpcy5hcHBseVRva2VuKGJvZHkuand0LCBjdXJyZW50LnNlc3Npb25JZCk7XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIC8qKiBSZS1yZWFkIGAvdjEvY2xpZW50YDogcmVmcmVzaCB1c2VyLCBzZXNzaW9uLCBtZW1iZXJzaGlwcyBhbmQgc3RhdHVzLiAqL1xuICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKCcvdjEvY2xpZW50Jyk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ2Jvb3QgZmFpbGVkJyk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICAgIHNlc3Npb246IEF0bGFzU2Vzc2lvbiB8IG51bGw7XG4gICAgICAgIHVzZXI6IEF0bGFzVXNlciB8IG51bGw7XG4gICAgICAgIGp3dD86IHN0cmluZztcbiAgICAgICAgb3JnYW5pemF0aW9uX21lbWJlcnNoaXBzPzogQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW107XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWJvZHkuc2Vzc2lvbiB8fCAhYm9keS51c2VyKSB7XG4gICAgICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX291dCcpO1xuICAgICAgICB0aGlzLl91c2VyLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuX3Nlc3Npb24ubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5fY2xhaW1zLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3VzZXIubmV4dChib2R5LnVzZXIpO1xuICAgICAgdGhpcy5fc2Vzc2lvbi5uZXh0KGJvZHkuc2Vzc2lvbik7XG4gICAgICB0aGlzLl9tZW1iZXJzaGlwcy5uZXh0KGJvZHkub3JnYW5pemF0aW9uX21lbWJlcnNoaXBzID8/IFtdKTtcbiAgICAgIGlmIChib2R5Lmp3dCkgdGhpcy5hcHBseVRva2VuKGJvZHkuand0LCBib2R5LnNlc3Npb24uaWQpO1xuICAgICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9pbicpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlZnJlc2goKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgZmFpbGVkIGJvb3QgaXMgTk9UIHNpZ25lZC1vdXQuIFJlbmRlcmluZyBhIHNpZ24taW4gZm9ybSBiZWNhdXNlIHRoZVxuICAgICAgLy8gbmV0d29yayBoaWNjdXBlZCB0aHJvd3MgYXdheSBhIHBlcmZlY3RseSBnb29kIHNlc3Npb24gYW5kIGZvcmNlcyBhXG4gICAgICAvLyBuZWVkbGVzcyByZS1hdXRoZW50aWNhdGlvbi4gT25seSBwcm9tb3RlIGxvYWRpbmcg4oaSIHNpZ25lZF9vdXQuXG4gICAgICBpZiAodGhpcy5fc3RhdHVzLnZhbHVlID09PSAnbG9hZGluZycpIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfb3V0Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIEludGVybmFscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiDCpzYuMyBzdGVwIDM6IGNvbXBsZXRlIGEgcmVkaXJlY3QtYmFzZWQgc2lnbi1pbiwgdGhlbiBib290LiBBbiBPQXV0aCBvclxuICAgKiBob3N0ZWQtcGFnZSBmbG93IGxhbmRzIGJhY2sgd2l0aCBhIG9uZS10aW1lIHRpY2tldCBpbiB0aGUgVVJMOyBleGNoYW5nZSBpdFxuICAgKiBmb3IgY29va2llcywgc2NydWIgdGhlIFVSTCBzbyBhIHJlbG9hZCBjYW5ub3QgcmVwbGF5IGl0LCBUSEVOIHJlYWQgdGhlXG4gICAqIHNlc3Npb24uIEEgcmVkaXJlY3QgY2Fycnlpbmcgb25seSBhIHN0YXR1cyAoYSBzZWNvbmQgZmFjdG9yIGlzIHN0aWxsIG93ZWQpXG4gICAqIGhhcyBubyB0aWNrZXQsIHNvIG5vdGhpbmcgaXMgZXhjaGFuZ2VkIGFuZCB0aGUgYXBwIGJvb3RzIHNpZ25lZC1vdXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVhZFJlZGlyZWN0UmVzdWx0KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gICAgaWYgKHJlc3VsdD8udGlja2V0KSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGwoJy92MS9jbGllbnQvdGlja2V0cy9leGNoYW5nZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXR0ZW1wdF9pZDogcmVzdWx0LmF0dGVtcHRJZCwgdGlja2V0OiByZXN1bHQudGlja2V0IH0pLFxuICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgc3RyaXBSZWRpcmVjdFBhcmFtcyh3aW5kb3cubG9jYXRpb24uaHJlZikpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkUGVuZGluZ0F0dGVtcHQoKTogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVhZFJlZGlyZWN0UmVzdWx0KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIHJldHVybiByZXN1bHQ/LnN0YXR1cyAmJiAhcmVzdWx0LnRpY2tldFxuICAgICAgPyB7IGlkOiByZXN1bHQuYXR0ZW1wdElkLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMgfVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxsKHBhdGg6IHN0cmluZywgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmRvRmV0Y2goYCR7dGhpcy5iYXNlVXJsfSR7cGF0aH1gLCB7XG4gICAgICAuLi5pbml0LFxuICAgICAgLy8gQ29va2llcyBjYXJyeSB0aGUgc2Vzc2lvbjsgYSByZXF1ZXN0IHdpdGhvdXQgdGhpcyBpcyBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgICAgLy8gZnJvbSBiZWluZyBzaWduZWQgb3V0LlxuICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ3gtcHVibGlzaGFibGUta2V5JzogdGhpcy5wdWJsaXNoYWJsZUtleSxcbiAgICAgICAgLi4uKGluaXQ/LmJvZHkgPyB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSA6IHt9KSxcbiAgICAgICAgLi4uaW5pdD8uaGVhZGVycyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VG9rZW4oand0OiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gcmVhZEV4cGlyeShqd3QpO1xuICAgIGlmICghZXhwaXJlc0F0KSByZXR1cm47XG5cbiAgICB0aGlzLmNhY2hlLnNldCh7IGp3dCwgZXhwaXJlc0F0LCBzZXNzaW9uSWQgfSk7XG4gICAgdGhpcy5fY2xhaW1zLm5leHQoZGVjb2RlQ2xhaW1zKGp3dCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbChgL3YxL2NsaWVudC9zZXNzaW9ucy8ke2N1cnJlbnQuc2Vzc2lvbklkfS90b2tlbnNgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ3JlZnJlc2ggZmFpbGVkJyk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGp3dDogc3RyaW5nOyBzZXNzaW9uX2lkOiBzdHJpbmcgfTtcbiAgICAgIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgYm9keS5zZXNzaW9uX2lkKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgc2Vzc2lvbiBtYXkgZ2VudWluZWx5IGJlIGdvbmUuIFJlLWJvb3QgcmF0aGVyIHRoYW4gZ3Vlc3MuXG4gICAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiDCpzcuNDogcHJvYWN0aXZlLCBqaXR0ZXJlZCByZWZyZXNoIHNjaGVkdWxlZCBmcm9tIHRoZSB0b2tlbidzIG93biBleHBpcnkuICovXG4gIHByaXZhdGUgc2NoZWR1bGVSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICBpZiAodGhpcy5fc3RhdHVzLnZhbHVlICE9PSAnc2lnbmVkX2luJykgcmV0dXJuO1xuXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoIXRva2VuKSByZXR1cm47XG5cbiAgICBjb25zdCBkZWxheSA9IG1zVW50aWxSZWZyZXNoKHsgdG9rZW4sIG5vdzogRGF0ZS5ub3coKSB9KTtcbiAgICB0aGlzLnJlZnJlc2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnJlZnJlc2goKSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcik7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKiBEZWNvZGUgYSBKV1QgcGF5bG9hZCB3aXRob3V0IHZlcmlmeWluZyBpdCDigJQgYSBzY2hlZHVsaW5nL1VJIGhpbnQgb25seS4gKi9cbmZ1bmN0aW9uIGRlY29kZUNsYWltcyhqd3Q6IHN0cmluZyk6IFNlc3Npb25DbGFpbXMgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSBqd3Quc3BsaXQoJy4nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICBhdG9iKHBhcnRzWzFdIS5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpKSxcbiAgICApIGFzIFNlc3Npb25DbGFpbXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
|
|
419
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEdBS3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQXlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixhQUFhLEdBSWQsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQWdCLE1BQU0sUUFBUSxDQUFDOztBQVMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsVUFBVSxHQUFHLE1BQU0s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SUQsXG4gIFNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEZhcGlDbGllbnQsXG4gIFNpZ25PdXRHdWFyZCxcbiAgVG9rZW5DYWNoZSxcbiAgY2xvc2VPQXV0aFBvcHVwQWZ0ZXJTaWduSW4sXG4gIGNvbXBsZXRlT0F1dGhQb3B1cExhbmRpbmcsXG4gIGdldFByb3ZpZGVyVG9rZW4gYXMgZmV0Y2hQcm92aWRlclRva2VuLFxuICBtYXBPQXV0aFBvcHVwUGF5bG9hZCxcbiAgbXNVbnRpbFJlZnJlc2gsXG4gIHJlYWRFeHBpcnksXG4gIHJlYWRSZWRpcmVjdFJlc3VsdCxcbiAgcmVzb2x2ZUZyb250ZW5kQXBpLFxuICBzdHJpcFJlZGlyZWN0UGFyYW1zLFxuICB0eXBlIFByb3ZpZGVyVG9rZW4sXG4gIHR5cGUgUmVkaXJlY3RSZXN1bHQsXG4gIHR5cGUgU2lnbk91dE9wdGlvbnMsXG4gIHR5cGUgU2lnbk91dFJlc3VsdCxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZSwgdHlwZSBQcm90ZWN0Q29uZGl0aW9uIH0gZnJvbSAnQGF0bGFzYXV0aC9hdXRoeic7XG5pbXBvcnQgeyBBVExBU19PUFRJT05TIH0gZnJvbSAnLi9hdGxhcy5jb25maWcnO1xuaW1wb3J0IHtcbiAgY3NzVmFyaWFibGVzLFxuICBpbnN0YW5jZURlc2lnbkZyb20sXG4gIHJlbmRlckFwcGVhcmFuY2UsXG4gIHJlc29sdmVUb2tlbnMsXG4gIHR5cGUgQXBwZWFyYW5jZSxcbiAgdHlwZSBBcHBlYXJhbmNlUmVuZGVyLFxuICB0eXBlIEluc3RhbmNlRGVzaWduLFxufSBmcm9tICcuL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgRU5fVVMsIHdpdGhGYWxsYmFjaywgdHlwZSBDYXRhbG9nIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB0eXBlIHtcbiAgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwLFxuICBBdGxhc1Nlc3Npb24sXG4gIEF0bGFzVXNlcixcbiAgQXV0aFN0YXR1cyxcbiAgU2Vzc2lvbkNsYWltcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogYEF0bGFzU2VydmljZWAg4oCUIHRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgPEF0bGFzUHJvdmlkZXI+YCArIGhvb2tzLlxuICpcbiAqIEl0IGhvbGRzIGV4YWN0bHkgb25lIHRoaW5nIHRoYXQgbWF0dGVycyBpbiBtZW1vcnk6IHRoZSBzaG9ydC1saXZlZCBKV1QsIGluIGFcbiAqIHtAbGluayBUb2tlbkNhY2hlfS4gTm90IGxvY2FsU3RvcmFnZSwgbm90IGEgY29va2llIHRoaXMgY29kZSB3cml0ZXMg4oCUIHRoZVxuICogcmVmcmVzaCB0b2tlbiBpcyBIdHRwT25seSBzbyBicm93c2VyIHNjcmlwdCBuZXZlciB0b3VjaGVzIGl0LCBhbmQgdGhlIEpXVFxuICogbGl2ZXMgb25seSBhcyBsb25nIGFzIHRoZSB0YWIuIEFueXRoaW5nIHBlcnNpc3RlZCB3b3VsZCBzdXJ2aXZlIHRoZSB0YWIgYW5kXG4gKiBiZWNvbWUgdGhlIGZpcnN0IHRoaW5nIGFuIFhTUyByZWFkcy5cbiAqXG4gKiBSZWFjdGl2ZSBhdXRoIHN0YXRlIGlzIGV4cG9zZWQgdHdvIHdheXMgc28gY2FsbGVycyBjYW4gcGljayB0aGVpciBpZGlvbTpcbiAqICAtIFJ4SlMgb2JzZXJ2YWJsZXMgKGB1c2VyJGAsIGBzZXNzaW9uJGAsIGBpc1NpZ25lZEluJGAsIOKApikg4oCUIHRoZSBwcmltYXJ5IEFQSSxcbiAqICAgIHRoZSBhbmFsb2d1ZSBvZiB0aGUgUmVhY3QgaG9va3MnIHJldHVybiB2YWx1ZXMuXG4gKiAgLSBBbmd1bGFyIHNpZ25hbHMgKGB1c2VyYCwgYHNlc3Npb25gLCBgaXNTaWduZWRJbmAsIOKApikg4oCUIHRoZSBzYW1lIHZhbHVlcyBhc1xuICogICAgYFNpZ25hbDxUPmAsIGZvciB0ZW1wbGF0ZXMgYW5kIGBjb21wdXRlZCgpYC5cbiAqXG4gKiBUaGUgaW1wZXJhdGl2ZSBtZXRob2RzIChgc2lnbk91dGAsIGBnZXRUb2tlbmAsIGBnZXRQcm92aWRlclRva2VuYCxcbiAqIGBzZXRBY3RpdmVPcmdhbml6YXRpb25gLCBgcmVsb2FkYCkgbWlycm9yIHRoZSBhY3Rpb25zIHRoZSBob29rcyByZXR1cm4uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXRsYXNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KEFUTEFTX09QVElPTlMpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGlzaGFibGVLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkb0ZldGNoOiB0eXBlb2YgZmV0Y2g7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBUb2tlbkNhY2hlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFwaUNsaWVudDogRmFwaUNsaWVudDtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXNzaW9ucyB0aGlzIGJyb3dzZXIgc2lnbmVkIG91dCBvZiAodG9tYnN0b25lcyBpbiBsb2NhbFN0b3JhZ2UsIHBlclxuICAgKiBGcm9udGVuZCBBUEkgb3JpZ2luKSwgdGhlIHJldm9rZSBhbmQgaXRzIGJhY2tncm91bmQgcmUtdHJpZXMuIEV2ZXJ5IHJlbG9hZCAvXG4gICAqIHJlZnJlc2ggYXNrcyBpdCBiZWZvcmUgYWRvcHRpbmcgYSBzZXNzaW9uLCBzbyBhIHNpZ24tb3V0IHRoZSBzZXJ2ZXIgbmV2ZXJcbiAgICogY29uZmlybWVkIGlzIG5vdCB1bmRvbmUgYnkgdGhlIHN0aWxsLXZhbGlkIHJlZnJlc2ggY29va2llLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBndWFyZDogU2lnbk91dEd1YXJkO1xuICBwcml2YXRlIHN0b3BXYXRjaGluZ1NpZ25PdXQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2F0YWxvZzogQ2F0YWxvZztcblxuICAvKipcbiAgICogQSBzaWduLWluIGF0dGVtcHQgaGFuZGVkIGJhY2sgYnkgYW4gT0F1dGggcmVkaXJlY3QgdGhhdCBzdGlsbCBuZWVkcyBhIHNlY29uZFxuICAgKiBmYWN0b3IgKG5vIHNlc3Npb24gd2FzIGlzc3VlZCkuIE51bGwgaW4gdGhlIG9yZGluYXJ5IGNhc2U7IHRoZSBgPGF0bGFzLXNpZ24taW4+YFxuICAgKiBmbG93IHNlZWRzIGl0c2VsZiBmcm9tIHRoaXMgc28gdGhlIHVzZXIgcmVzdW1lcyBhdCB0aGUgMkZBIHN0ZXAuIENhcHR1cmVkXG4gICAqIG9uY2UsIHN5bmNocm9ub3VzbHksIGF0IGNvbnN0cnVjdGlvbiDigJQgYmVmb3JlIGFueSBmbG93IGNvbXBvbmVudCByZWFkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBlbmRpbmdBdHRlbXB0OiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsO1xuXG4gIC8vIC0tLSBSZWFjdGl2ZSBzdGF0ZSAoc291cmNlIG9mIHRydXRoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0dXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhTdGF0dXM+KCdsb2FkaW5nJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3VzZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzVXNlciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXNzaW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc1Nlc3Npb24gfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xhaW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lbWJlcnNoaXBzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4oW10pO1xuXG4gIC8qKiBUaGUgdGhyZWUtc3RhdGUgYXV0aCBsaWZlY3ljbGU6IGBsb2FkaW5nYCDihpIgYHNpZ25lZF9pbmAgfCBgc2lnbmVkX291dGAuICovXG4gIHJlYWRvbmx5IHN0YXR1cyQ6IE9ic2VydmFibGU8QXV0aFN0YXR1cz4gPSB0aGlzLl9zdGF0dXMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHVzZXIkOiBPYnNlcnZhYmxlPEF0bGFzVXNlciB8IG51bGw+ID0gdGhpcy5fdXNlci5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgc2Vzc2lvbiQ6IE9ic2VydmFibGU8QXRsYXNTZXNzaW9uIHwgbnVsbD4gPSB0aGlzLl9zZXNzaW9uLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBjbGFpbXMkOiBPYnNlcnZhYmxlPFNlc3Npb25DbGFpbXMgfCBudWxsPiA9IHRoaXMuX2NsYWltcy5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcHMkOiBPYnNlcnZhYmxlPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPiA9XG4gICAgdGhpcy5fbWVtYmVyc2hpcHMuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqXG4gICAqIFRydWUgb25jZSB0aGUgU0RLIGhhcyBmaW5pc2hlZCBpdHMgZmlyc3QgYm9vdC4gRGlzdGluZ3Vpc2hpbmcgXCJzdGlsbCBsb2FkaW5nXCJcbiAgICogZnJvbSBcInNpZ25lZCBvdXRcIiBpcyB3aGF0IGxldHMgYSB0ZW1wbGF0ZSBhdm9pZCB0aGUgZmxhc2ggb2YgYSBzaWduLWluIGZvcm1cbiAgICogb24gZXZlcnkgcGFnZSBsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNMb2FkZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgbWFwKChzKSA9PiBzICE9PSAnbG9hZGluZycpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNTaWduZWRJbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBtYXAoKHMpID0+IHMgPT09ICdzaWduZWRfaW4nKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICApO1xuXG4gIC8qKiBUaGUgYWN0aXZlIG9yZ2FuaXphdGlvbiBtZW1iZXJzaGlwLCBkZXJpdmVkIGZyb20gdGhlIHRva2VuJ3MgYG9yZ19pZGAgY2xhaW0uICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbiQ6IE9ic2VydmFibGU8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwIHwgbnVsbD4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9tZW1iZXJzaGlwcyxcbiAgICB0aGlzLl9jbGFpbXMsXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFttZW1iZXJzaGlwcywgY2xhaW1zXSkgPT5cbiAgICAgICAgbWVtYmVyc2hpcHMuZmluZCgobSkgPT4gbS5vcmdhbml6YXRpb24uaWQgPT09IGNsYWltcz8ub3JnX2lkKSA/PyBudWxsLFxuICAgICksXG4gICk7XG5cbiAgLy8gLS0tIFNpZ25hbCBtaXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHJlYWRvbmx5IHN0YXR1czogU2lnbmFsPEF1dGhTdGF0dXM+ID0gdG9TaWduYWwodGhpcy5zdGF0dXMkLCB7IGluaXRpYWxWYWx1ZTogJ2xvYWRpbmcnIH0pO1xuICByZWFkb25seSB1c2VyOiBTaWduYWw8QXRsYXNVc2VyIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLnVzZXIkLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogU2lnbmFsPEF0bGFzU2Vzc2lvbiB8IG51bGw+ID0gdG9TaWduYWwodGhpcy5zZXNzaW9uJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IGNsYWltczogU2lnbmFsPFNlc3Npb25DbGFpbXMgfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMuY2xhaW1zJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBzOiBTaWduYWw8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+ID0gdG9TaWduYWwodGhpcy5tZW1iZXJzaGlwcyQsIHtcbiAgICBpbml0aWFsVmFsdWU6IFtdIGFzIEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdLFxuICB9KTtcbiAgcmVhZG9ubHkgaXNMb2FkZWQ6IFNpZ25hbDxib29sZWFuPiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdHVzKCkgIT09ICdsb2FkaW5nJyk7XG4gIHJlYWRvbmx5IGlzU2lnbmVkSW46IFNpZ25hbDxib29sZWFuPiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdHVzKCkgPT09ICdzaWduZWRfaW4nKTtcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBTaWduYWw8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwIHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3JnSWQgPSB0aGlzLmNsYWltcygpPy5vcmdfaWQ7XG4gICAgcmV0dXJuIHRoaXMubWVtYmVyc2hpcHMoKS5maW5kKChtKSA9PiBtLm9yZ2FuaXphdGlvbi5pZCA9PT0gb3JnSWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy5wdWJsaXNoYWJsZUtleSA9IG9wdGlvbnMucHVibGlzaGFibGVLZXk7XG4gICAgLy8gVGhyb3dzIGFuIGBBdGxhc0NvbmZpZ0Vycm9yYCBvbiBhIG1pc3NpbmcvaW52YWxpZCB2YWx1ZSByYXRoZXIgdGhhbiBxdWlldGx5XG4gICAgLy8gc2VuZGluZyBldmVyeSByZXF1ZXN0IHRvIGEgcmVsYXRpdmUgcGF0aCBvbiB0aGUgYXBwJ3Mgb3JpZ2luLlxuICAgIHRoaXMuYmFzZVVybCA9IHJlc29sdmVGcm9udGVuZEFwaShvcHRpb25zLmZyb250ZW5kQXBpLCB7XG4gICAgICBjb21wb25lbnQ6ICdwcm92aWRlQXRsYXMoKSAvIEF0bGFzTW9kdWxlLmZvclJvb3QoKScsXG4gICAgfSk7XG4gICAgdGhpcy5kb0ZldGNoID0gb3B0aW9ucy5mZXRjaEltcGwgPz8gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBmZXRjaD4pID0+IGZldGNoKC4uLmFyZ3MpKTtcblxuICAgIHRoaXMuY2F0YWxvZyA9IG9wdGlvbnMubG9jYWxpemF0aW9uID8gd2l0aEZhbGxiYWNrKG9wdGlvbnMubG9jYWxpemF0aW9uKSA6IEVOX1VTO1xuXG4gICAgdGhpcy5mYXBpQ2xpZW50ID0gbmV3IEZhcGlDbGllbnQoe1xuICAgICAgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICBmZXRjaEltcGw6IHRoaXMuZG9GZXRjaCxcbiAgICB9KTtcblxuICAgIHRoaXMuZ3VhcmQgPSBuZXcgU2lnbk91dEd1YXJkKHtcbiAgICAgIHJlcXVlc3Q6IChwYXRoLCBpbml0KSA9PiB0aGlzLmNhbGwocGF0aCwgaW5pdCksXG4gICAgICBmcm9udGVuZEFwaTogdGhpcy5iYXNlVXJsLFxuICAgIH0pO1xuXG4gICAgLy8gQ2FwdHVyZWQgc3luY2hyb25vdXNseSAobm90IGluIGFuIGFzeW5jIGluaXQpIHNvIGl0IGlzIGF2YWlsYWJsZSBiZWZvcmUgYW55XG4gICAgLy8gZmxvdyBjb21wb25lbnQgcmVhZHMgaXQ6IGEgbmVlZHNfc2Vjb25kX2ZhY3RvciByZWRpcmVjdCBjYXJyaWVzIGEgc3RhdHVzIGJ1dFxuICAgIC8vIG5vIHRpY2tldCwgYW5kIHRoYXQgaXMgd2hhdCB0aGUgMkZBIHJlc3VtZSBzZWVkcyBmcm9tLlxuICAgIHRoaXMucGVuZGluZ0F0dGVtcHQgPSB0aGlzLmlzQnJvd3NlciA/IHRoaXMucmVhZFBlbmRpbmdBdHRlbXB0KCkgOiBudWxsO1xuXG4gICAgLy8gQm9vdCBvbmNlLCBicm93c2VyIG9ubHkuIE9uIHRoZSBzZXJ2ZXIgdGhlcmUgaXMgbm8gY29va2llIGphciB0byByZWFkIGFcbiAgICAvLyBzZXNzaW9uIGZyb20sIHNvIHdlIGxlYXZlIHRoZSBzdGF0ZSBhdCBgbG9hZGluZ2AgYW5kIGxldCBoeWRyYXRpb24gYm9vdCBpdC5cbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIC8vIEFub3RoZXIgdGFiIHNpZ25lZCBvdXQgb2YgVEhJUyBzZXNzaW9uIChpdHMgdG9tYnN0b25lIHJlYWNoZWQgdGhlIHNoYXJlZFxuICAgICAgLy8gc3RvcmUpOiBkcm9wIHRoZSB0b2tlbiBhbmQgcmUtY2hlY2ssIHdoaWNoIHRoZW4gcmVmdXNlcyB0aGUgc2Vzc2lvbi5cbiAgICAgIHRoaXMuc3RvcFdhdGNoaW5nU2lnbk91dCA9IHRoaXMuZ3VhcmQud2F0Y2goXG4gICAgICAgICgpID0+IHRoaXMuY2FjaGUucGVlaygpPy5zZXNzaW9uSWQgPz8gdGhpcy5fc2Vzc2lvbi52YWx1ZT8uaWQsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdm9pZCB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHZvaWQgdGhpcy5ib290KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wV2F0Y2hpbmdTaWduT3V0Py4oKTtcbiAgICB0aGlzLnN0b3BXYXRjaGluZ1NpZ25PdXQgPSBudWxsO1xuICAgIHRoaXMuZ3VhcmQuZGlzcG9zZSgpO1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLl9zdGF0dXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91c2VyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NsYWltcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyAtLS0gQ29uZmlndXJhdGlvbiBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgZ2V0IGFwcGVhcmFuY2UoKTogQXBwZWFyYW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlO1xuICB9XG5cbiAgZ2V0IGxvY2FsaXphdGlvbigpOiBDYXRhbG9nIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nO1xuICB9XG5cbiAgZ2V0IGZyb250ZW5kQXBpKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybDtcbiAgfVxuXG4gIC8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgYSBob3N0IGVsZW1lbnQgdG8gaW5oZXJpdC4gKi9cbiAgYXBwZWFyYW5jZVZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gY3NzVmFyaWFibGVzKHJlc29sdmVUb2tlbnModGhpcy5vcHRpb25zLmFwcGVhcmFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBhcHBlYXJhbmNlIHJlbmRlciBmb3IgYSByb290IGVsZW1lbnQ6IGlubGluZSB2YXJpYWJsZXMsIHRoZVxuICAgKiBgZGF0YS1hdGxhcy0qYCBhdHRyaWJ1dGVzIGFuZCB0aGUgZGVzaWduIHN0eWxlc2hlZXQuIFBhc3MgdGhlIGRhc2hib2FyZFxuICAgKiBkZXNpZ24gKGZyb20ge0BsaW5rIGxvYWRJbnN0YW5jZURlc2lnbn0pIHRvIGxheWVyIGNvZGUgb3ZlcnJpZGVzIG9uIGl0IOKAlFxuICAgKiB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgYEBhdGxhc2F1dGgvcmVhY3RgLlxuICAgKi9cbiAgYXBwZWFyYW5jZVJlbmRlcihpbnN0YW5jZURlc2lnbj86IEluc3RhbmNlRGVzaWduIHwgbnVsbCk6IEFwcGVhcmFuY2VSZW5kZXIge1xuICAgIHJldHVybiByZW5kZXJBcHBlYXJhbmNlKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlLCBpbnN0YW5jZURlc2lnbiA/PyBudWxsLCB7XG4gICAgICBmcm9udGVuZEFwaTogdGhpcy5iYXNlVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpZ24gY29uZmlndXJlZCBpbiB0aGUgQXRsYXMgZGFzaGJvYXJkIChgR0VUIC92MS9hcHBlYXJhbmNlYCksIG9yIG51bGxcbiAgICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBjYW5ub3QgYmUgcmVhZCwgb3IgdGhlIGFwcCBvcHRlZCBvdXQgd2l0aFxuICAgKiBgYXBwZWFyYW5jZS5pbnN0YW5jZURlc2lnbjogZmFsc2VgLlxuICAgKi9cbiAgYXN5bmMgbG9hZEluc3RhbmNlRGVzaWduKCk6IFByb21pc2U8SW5zdGFuY2VEZXNpZ24gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlPy5pbnN0YW5jZURlc2lnbiA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbCgnL3YxL2FwcGVhcmFuY2UnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5vayA/IGluc3RhbmNlRGVzaWduRnJvbShhd2FpdCByZXNwb25zZS5qc29uKCkpIDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIGZyZXNoIHtAbGluayBGYXBpQ2xpZW50fSBmb3IgZHJpdmluZyBhIHNpZ24taW4vc2lnbi11cCBmbG93LiAqL1xuICBjcmVhdGVGYXBpQ2xpZW50KCk6IEZhcGlDbGllbnQge1xuICAgIHJldHVybiBuZXcgRmFwaUNsaWVudCh7IHB1Ymxpc2hhYmxlS2V5OiB0aGlzLnB1Ymxpc2hhYmxlS2V5LCBiYXNlVXJsOiB0aGlzLmJhc2VVcmwgfSk7XG4gIH1cblxuICAvLyAtLS0gSW1wZXJhdGl2ZSBBUEkgKG1pcnJvcnMgdGhlIFJlYWN0IGhvb2tzJyBhY3Rpb25zKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlc3Npb24ncyBKV1QsIGFsd2F5cyBmcmVzaDogaWYgdGhlIGNhY2hlZCB0b2tlbiBpcyB3aXRoaW4gNXMgb2ZcbiAgICogZXhwaXJ5IGl0IGlzIHJlZnJlc2hlZCBmaXJzdCByYXRoZXIgdGhhbiBoYW5kZWQgb3Zlci4gTnVsbCB3aGVuIHNpZ25lZCBvdXQuXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCB1c2FibGUgPSB0aGlzLmNhY2hlLmdldCg1XzAwMCk7XG4gICAgaWYgKHVzYWJsZSkgcmV0dXJuIHVzYWJsZS5qd3Q7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoNV8wMDApPy5qd3QgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmVkLWluIHVzZXIncyBPV04gbGl2ZSBhY2Nlc3MgdG9rZW4gYXQgYSBjb25uZWN0ZWQgcHJvdmlkZXIgKEdvb2dsZSxcbiAgICogR2l0SHViLCDigKYpLCBzbyB0aGUgYXBwIGNhbiBjYWxsIHRoYXQgcHJvdmlkZXIncyBBUEkgZnJvbSB0aGUgYnJvd3Nlci4gTnVsbFxuICAgKiB3aGVuIHRoZXJlIGlzIG5vIHVzYWJsZSB0b2tlbiDigJQgbm8gbGlua2VkIGFjY291bnQsIG9yIHRoZSBwcm92aWRlciBncmFudGVkIC9cbiAgICoga2VwdCBub25lLiBUaGUgc2VydmVyIHJlZnJlc2hlcyBhIHN0YWxlIHRva2VuIG9uIHJlYWQ7IHRoZSByZWZyZXNoIHRva2VuIGlzXG4gICAqIG5ldmVyIGV4cG9zZWQuXG4gICAqL1xuICBnZXRQcm92aWRlclRva2VuKHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPFByb3ZpZGVyVG9rZW4gfCBudWxsPiB7XG4gICAgcmV0dXJuIGZldGNoUHJvdmlkZXJUb2tlbih0aGlzLmZhcGlDbGllbnQsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKiBJbXBlcmF0aXZlIGBoYXMoKWAg4oCUIHRoZSBzYW1lIGV2YWx1YXRpb24gYCphdGxhc1Byb3RlY3RgIHJlbmRlcnMgb24uICovXG4gIGhhcyhjb25kaXRpb246IFByb3RlY3RDb25kaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZhbHVhdGUodGhpcy5fY2xhaW1zLnZhbHVlLCBjb25kaXRpb24pLmFsbG93ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlIHRoZSBjdXJyZW50IHNlc3Npb24gc2VydmVyLXNpZGUgYW5kIGRyb3AgYWxsIGxvY2FsIGF1dGggc3RhdGUuXG4gICAqXG4gICAqIFRoZSBzZXNzaW9uIGlkIGlzIHJlbWVtYmVyZWQgYmVmb3JlIHRoZSByZXZva2UgKGEgdG9tYnN0b25lIHNoYXJlZCBieSBldmVyeVxuICAgKiB0YWIpLCBzbyBhIHJlbG9hZCwgYSB0b2tlbiByZWZyZXNoLCBhIHNpYmxpbmcgdGFiIG9yIGEgdGFiIG9wZW5lZCBsYXRlciBuZXZlclxuICAgKiByZS1hZG9wdHMgaXQg4oCUIGV2ZW4gd2hlbiB0aGUgcmV2b2tlIGZhaWxlZCAoaXQgaXMgcmV0cmllZCBvbmNlLCB0aGVuIGFnYWluIGluXG4gICAqIHRoZSBiYWNrZ3JvdW5kKSBhbmQgdGhlIHJlZnJlc2ggY29va2llIGlzIHN0aWxsIHZhbGlkLiBSZXNvbHZlc1xuICAgKiBgeyByZXZva2VkLCBhY3RpdmVTZXNzaW9uSWQ/IH1gOyB3aXRoIGB7IHN0cmljdDogdHJ1ZSB9YCBhbiB1bmNvbmZpcm1lZCByZXZva2VcbiAgICogcmVqZWN0cyB3aXRoIGEgYFNpZ25PdXRFcnJvcmAgaW5zdGVhZCAoYWZ0ZXIgdGhlIGxvY2FsIHNpZ24tb3V0KS4gQSBwYXJrZWRcbiAgICogc2Vzc2lvbiB0aGUgc2VydmVyIHByb21vdGVkIG9uIHJldm9rZSBpcyBhZG9wdGVkLiBGcm9udC1jaGFubmVsIGxvZ291dCBydW5zXG4gICAqIHVubGVzcyBgeyBmcm9udGNoYW5uZWw6IGZhbHNlIH1gLlxuICAgKi9cbiAgYXN5bmMgc2lnbk91dChvcHRpb25zOiBTaWduT3V0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduT3V0UmVzdWx0PiB7XG4gICAgLy8gV2l0aCBubyBjYWNoZWQgdG9rZW4gdGhlIGd1YXJkIGZpbmRzIHRoZSBjb29raWUgc2Vzc2lvbiBpdHNlbGZcbiAgICAvLyAoR0VUIC92MS9jbGllbnQpLCBzbyBhIG1pc3NpbmcgSldUIG5ldmVyIHNraXBzIHRoZSByZXZva2UuXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5jYWNoZS5wZWVrKCk/LnNlc3Npb25JZCA/PyB0aGlzLl9zZXNzaW9uLnZhbHVlPy5pZCA/PyBudWxsO1xuICAgIGNvbnN0IGF0dGVtcHQgPSBhd2FpdCB0aGlzLmd1YXJkLnJldm9rZShzZXNzaW9uSWQsIG9wdGlvbnMpO1xuICAgIHRoaXMuY2xlYXJMb2NhbFN0YXRlKCk7XG4gICAgaWYgKHRoaXMuZ3VhcmQucHJvbW90ZWQoYXR0ZW1wdCkpIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3VhcmQuc2V0dGxlKGF0dGVtcHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAob3IgYG51bGxgIGZvciB0aGUgcGVyc29uYWwgYWNjb3VudCkuIFRoZVxuICAgKiBuZXcgdG9rZW4gY2FycmllcyB0aGUgbmV3IG9yZyBjbGFpbXMsIHNvIHRoZSBhcHAncyBwZXJtaXNzaW9uIGNoZWNrcyB1cGRhdGVcbiAgICogd2l0aG91dCBhIHJlLWxvZ2luLlxuICAgKi9cbiAgYXN5bmMgc2V0QWN0aXZlT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG91Y2hgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aXZlX29yZ2FuaXphdGlvbl9pZDogb3JnYW5pemF0aW9uSWQgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuO1xuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmcgfTtcbiAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGN1cnJlbnQuc2Vzc2lvbklkKTtcbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqIFJlLXJlYWQgYC92MS9jbGllbnRgOiByZWZyZXNoIHVzZXIsIHNlc3Npb24sIG1lbWJlcnNoaXBzIGFuZCBzdGF0dXMuICovXG4gIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoJy92MS9jbGllbnQnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignYm9vdCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgc2Vzc2lvbjogQXRsYXNTZXNzaW9uIHwgbnVsbDtcbiAgICAgICAgdXNlcjogQXRsYXNVc2VyIHwgbnVsbDtcbiAgICAgICAgand0Pzogc3RyaW5nO1xuICAgICAgICBvcmdhbml6YXRpb25fbWVtYmVyc2hpcHM/OiBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEEgc2Vzc2lvbiB0aGlzIGJyb3dzZXIgc2lnbmVkIG91dCBvZiBpcyBuZXZlciByZS1hZG9wdGVkIGZyb20gdGhlXG4gICAgICAvLyByZWZyZXNoIGNvb2tpZTsgdGhlIGd1YXJkIHJlLXRyaWVzIGl0cyByZXZva2UgaW4gdGhlIGJhY2tncm91bmQuXG4gICAgICBpZiAoIWJvZHkuc2Vzc2lvbiB8fCAhYm9keS51c2VyIHx8IHRoaXMuZ3VhcmQucmVmdXNlKGJvZHkuc2Vzc2lvbi5pZCkpIHtcbiAgICAgICAgdGhpcy5jbGVhckxvY2FsU3RhdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91c2VyLm5leHQoYm9keS51c2VyKTtcbiAgICAgIHRoaXMuX3Nlc3Npb24ubmV4dChib2R5LnNlc3Npb24pO1xuICAgICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChib2R5Lm9yZ2FuaXphdGlvbl9tZW1iZXJzaGlwcyA/PyBbXSk7XG4gICAgICBpZiAoYm9keS5qd3QpIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgYm9keS5zZXNzaW9uLmlkKTtcbiAgICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfaW4nKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIGZhaWxlZCBib290IGlzIE5PVCBzaWduZWQtb3V0LiBSZW5kZXJpbmcgYSBzaWduLWluIGZvcm0gYmVjYXVzZSB0aGVcbiAgICAgIC8vIG5ldHdvcmsgaGljY3VwZWQgdGhyb3dzIGF3YXkgYSBwZXJmZWN0bHkgZ29vZCBzZXNzaW9uIGFuZCBmb3JjZXMgYVxuICAgICAgLy8gbmVlZGxlc3MgcmUtYXV0aGVudGljYXRpb24uIE9ubHkgcHJvbW90ZSBsb2FkaW5nIOKGkiBzaWduZWRfb3V0LlxuICAgICAgaWYgKHRoaXMuX3N0YXR1cy52YWx1ZSA9PT0gJ2xvYWRpbmcnKSB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX291dCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBJbnRlcm5hbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogwqc2LjMgc3RlcCAzOiBjb21wbGV0ZSBhIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4sIHRoZW4gYm9vdC4gQW4gT0F1dGggb3JcbiAgICogaG9zdGVkLXBhZ2UgZmxvdyBsYW5kcyBiYWNrIHdpdGggYSBvbmUtdGltZSB0aWNrZXQgaW4gdGhlIFVSTDsgZXhjaGFuZ2UgaXRcbiAgICogZm9yIGNvb2tpZXMsIHNjcnViIHRoZSBVUkwgc28gYSByZWxvYWQgY2Fubm90IHJlcGxheSBpdCwgVEhFTiByZWFkIHRoZVxuICAgKiBzZXNzaW9uLiBBIHJlZGlyZWN0IGNhcnJ5aW5nIG9ubHkgYSBzdGF0dXMgKGEgc2Vjb25kIGZhY3RvciBpcyBzdGlsbCBvd2VkKVxuICAgKiBoYXMgbm8gdGlja2V0LCBzbyBub3RoaW5nIGlzIGV4Y2hhbmdlZCBhbmQgdGhlIGFwcCBib290cyBzaWduZWQtb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZyb21VcmwgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgbGV0IHJlc3VsdDogUmVkaXJlY3RSZXN1bHQgfCBudWxsID0gZnJvbVVybDtcblxuICAgIC8vIMKnb2F1dGggcG9wdXAgbW9kZTogdGhpcyBwYWdlIG1heSBiZSB0aGUgbGFuZGluZyBvZiBhIHNpZ24taW4gcG9wdXAgd2hvc2VcbiAgICAvLyBvcGVuZXIgYSBDcm9zcy1PcmlnaW4tT3BlbmVyLVBvbGljeSBzZXZlcmVkIChgI2F0bGFzX3BvcHVwX3Jlc3VsdD3igKZgKS5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIHJlbGF5ZWQgdG8gdGhlIG9wZW5lciwgd2hpY2ggcmVkZWVtcyB0aGUgdGlja2V0LCBhbmQgdGhpc1xuICAgIC8vIHdpbmRvdyBjbG9zZXMuIElmIG5vIG9wZW5lciB0YWtlcyBpdCAoaXRzIHRhYiBpcyBnb25lKSwgZmluaXNoIGhlcmUgbGlrZVxuICAgIC8vIGEgcmVkaXJlY3QuXG4gICAgY29uc3QgbGFuZGluZyA9IGF3YWl0IGNvbXBsZXRlT0F1dGhQb3B1cExhbmRpbmcoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBpZiAobGFuZGluZyAmJiAhbGFuZGluZy5kZWxpdmVyZWQpIHtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBtYXBPQXV0aFBvcHVwUGF5bG9hZChsYW5kaW5nLnBheWxvYWQpO1xuICAgICAgaWYgKG91dGNvbWU/LnRpY2tldCAmJiBvdXRjb21lLmF0dGVtcHRJZCkge1xuICAgICAgICByZXN1bHQgPSB7IGF0dGVtcHRJZDogb3V0Y29tZS5hdHRlbXB0SWQsIHRpY2tldDogb3V0Y29tZS50aWNrZXQgfTtcbiAgICAgIH0gZWxzZSBpZiAob3V0Y29tZT8uY29udGludWF0aW9uVXJsKSB7XG4gICAgICAgIC8vIEEgc2Vjb25kIGZhY3RvciAvIGNvbm5lY3Qgc3RlcCAvIHByb3ZpZGVyIGVycm9yOiB0aGUgcmVkaXJlY3QgZmxvdydzIHBhZ2UuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKG91dGNvbWUuY29udGludWF0aW9uVXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBleGNoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAocmVzdWx0Py50aWNrZXQpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF0dGVtcHRfaWQ6IHJlc3VsdC5hdHRlbXB0SWQsIHRpY2tldDogcmVzdWx0LnRpY2tldCB9KSxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICBleGNoYW5nZWQgPSAhIXJlc3BvbnNlPy5vaztcbiAgICB9XG4gICAgaWYgKGZyb21VcmwpIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgZG9jdW1lbnQudGl0bGUsIHN0cmlwUmVkaXJlY3RQYXJhbXMod2luZG93LmxvY2F0aW9uLmhyZWYpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICAvLyBTaWduZWQgaW4gaW5zaWRlIHRoZSBBdGxhcyBwb3B1cCAodGhlIHJlZGlyZWN0IGZsb3cgcmFuIGluIGl0KTogaGFuZCBiYWNrXG4gICAgLy8gdG8gdGhlIHdhaXRpbmcgb3BlbmVyIGFuZCBjbG9zZS4gQSBuby1vcCBpbiBhbiBvcmRpbmFyeSB0YWIuXG4gICAgaWYgKGV4Y2hhbmdlZCkgdm9pZCBjbG9zZU9BdXRoUG9wdXBBZnRlclNpZ25JbigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkUGVuZGluZ0F0dGVtcHQoKTogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVhZFJlZGlyZWN0UmVzdWx0KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIHJldHVybiByZXN1bHQ/LnN0YXR1cyAmJiAhcmVzdWx0LnRpY2tldFxuICAgICAgPyB7IGlkOiByZXN1bHQuYXR0ZW1wdElkLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMgfVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxsKHBhdGg6IHN0cmluZywgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmRvRmV0Y2goYCR7dGhpcy5iYXNlVXJsfSR7cGF0aH1gLCB7XG4gICAgICAuLi5pbml0LFxuICAgICAgLy8gQ29va2llcyBjYXJyeSB0aGUgc2Vzc2lvbjsgYSByZXF1ZXN0IHdpdGhvdXQgdGhpcyBpcyBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgICAgLy8gZnJvbSBiZWluZyBzaWduZWQgb3V0LlxuICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ3gtcHVibGlzaGFibGUta2V5JzogdGhpcy5wdWJsaXNoYWJsZUtleSxcbiAgICAgICAgLi4uKGluaXQ/LmJvZHkgPyB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSA6IHt9KSxcbiAgICAgICAgLi4uaW5pdD8uaGVhZGVycyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VG9rZW4oand0OiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQW4gaW4tZmxpZ2h0IHJlZnJlc2ggbXVzdCBub3QgcmVzdXJyZWN0IGEgc2Vzc2lvbiBzaWduZWQgb3V0IG1lYW53aGlsZS5cbiAgICBpZiAodGhpcy5ndWFyZC5pc1NpZ25lZE91dChzZXNzaW9uSWQpKSByZXR1cm47XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gcmVhZEV4cGlyeShqd3QpO1xuICAgIGlmICghZXhwaXJlc0F0KSByZXR1cm47XG5cbiAgICB0aGlzLmNhY2hlLnNldCh7IGp3dCwgZXhwaXJlc0F0LCBzZXNzaW9uSWQgfSk7XG4gICAgdGhpcy5fY2xhaW1zLm5leHQoZGVjb2RlQ2xhaW1zKGp3dCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbChgL3YxL2NsaWVudC9zZXNzaW9ucy8ke2N1cnJlbnQuc2Vzc2lvbklkfS90b2tlbnNgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ3JlZnJlc2ggZmFpbGVkJyk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGp3dDogc3RyaW5nOyBzZXNzaW9uX2lkOiBzdHJpbmcgfTtcbiAgICAgIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgYm9keS5zZXNzaW9uX2lkKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgc2Vzc2lvbiBtYXkgZ2VudWluZWx5IGJlIGdvbmUuIFJlLWJvb3QgcmF0aGVyIHRoYW4gZ3Vlc3MuXG4gICAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJMb2NhbFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB0aGlzLl91c2VyLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KG51bGwpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoW10pO1xuICB9XG5cbiAgLyoqIMKnNy40OiBwcm9hY3RpdmUsIGppdHRlcmVkIHJlZnJlc2ggc2NoZWR1bGVkIGZyb20gdGhlIHRva2VuJ3Mgb3duIGV4cGlyeS4gKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgIT09ICdzaWduZWRfaW4nKSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghdG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IGRlbGF5ID0gbXNVbnRpbFJlZnJlc2goeyB0b2tlbiwgbm93OiBEYXRlLm5vdygpIH0pO1xuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucmVmcmVzaCgpLCBkZWxheSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIERlY29kZSBhIEpXVCBwYXlsb2FkIHdpdGhvdXQgdmVyaWZ5aW5nIGl0IOKAlCBhIHNjaGVkdWxpbmcvVUkgaGludCBvbmx5LiAqL1xuZnVuY3Rpb24gZGVjb2RlQ2xhaW1zKGp3dDogc3RyaW5nKTogU2Vzc2lvbkNsYWltcyB8IG51bGwge1xuICBjb25zdCBwYXJ0cyA9IGp3dC5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgIGF0b2IocGFydHNbMV0hLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLFxuICAgICkgYXMgU2Vzc2lvbkNsYWltcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
|