@atlasauth/angular 0.1.3 → 0.2.1

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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @atlas/angular
1
+ # @atlasauth/angular
2
2
 
3
3
  The official **Angular** SDK for Atlas — the Angular peer of [`@atlasauth/react`](../react). It wraps the framework-agnostic [`@atlasauth/js`](../js) client and exposes Atlas's reactive auth state, sign-in/up flows, prebuilt UI, authorization directives, and route guards as idiomatic modern Angular (standalone APIs, RxJS **and** Signals, DI).
4
4
 
@@ -9,7 +9,7 @@ Requires **Angular 17+**.
9
9
  ## Install
10
10
 
11
11
  ```bash
12
- pnpm add @atlas/angular
12
+ pnpm add @atlasauth/angular
13
13
  # peers: @angular/core, @angular/common (>=17), rxjs (>=7); @angular/router if you use the guards
14
14
  ```
15
15
 
@@ -22,7 +22,7 @@ pnpm add @atlas/angular
22
22
  ```ts
23
23
  import { bootstrapApplication } from '@angular/platform-browser';
24
24
  import { provideRouter } from '@angular/router';
25
- import { provideAtlas } from '@atlas/angular';
25
+ import { provideAtlas } from '@atlasauth/angular';
26
26
  import { AppComponent } from './app/app.component';
27
27
  import { routes } from './app/routes';
28
28
 
@@ -44,7 +44,7 @@ The service begins booting immediately — completing any OAuth/hosted-page redi
44
44
  ### NgModule
45
45
 
46
46
  ```ts
47
- import { AtlasModule } from '@atlas/angular';
47
+ import { AtlasModule } from '@atlasauth/angular';
48
48
 
49
49
  @NgModule({
50
50
  imports: [AtlasModule.forRoot({ publishableKey: 'pk_test_…' })],
@@ -55,7 +55,7 @@ export class AppModule {}
55
55
  Feature modules `import { AtlasModule }` (no `forRoot`) to use the directives and components. Standalone components import them individually, or spread `ATLAS_UI`:
56
56
 
57
57
  ```ts
58
- import { ATLAS_UI } from '@atlas/angular';
58
+ import { ATLAS_UI } from '@atlasauth/angular';
59
59
 
60
60
  @Component({ standalone: true, imports: [...ATLAS_UI], template: '…' })
61
61
  export class DashboardComponent {}
@@ -162,7 +162,7 @@ Server-driven, rendered in the host DOM (no iframe), themed via the `appearance`
162
162
 
163
163
  ```ts
164
164
  import { Routes } from '@angular/router';
165
- import { atlasGuard } from '@atlas/angular';
165
+ import { atlasGuard } from '@atlasauth/angular';
166
166
 
167
167
  export const routes: Routes = [
168
168
  {
@@ -190,6 +190,6 @@ Like the components, guards are UX, not security — the server enforces the sam
190
190
 
191
191
  ## Build & test
192
192
 
193
- - **Build**: `pnpm --filter @atlas/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
- - **Typecheck**: `pnpm --filter @atlas/angular typecheck`.
193
+ - **Build**: `pnpm --filter @atlasauth/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
+ - **Typecheck**: `pnpm --filter @atlasauth/angular typecheck`.
195
195
  - **Test**: unit specs run under the Angular CLI test runner (Karma/Jasmine or your configured runner). A starter spec lives in `src/lib/atlas.service.spec.ts`.
package/dist/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # @atlas/angular
1
+ # @atlasauth/angular
2
2
 
3
- The official **Angular** SDK for Atlas — the Angular peer of [`@atlas/react`](../react). It wraps the framework-agnostic [`@atlas/js`](../js) client and exposes Atlas's reactive auth state, sign-in/up flows, prebuilt UI, authorization directives, and route guards as idiomatic modern Angular (standalone APIs, RxJS **and** Signals, DI).
3
+ The official **Angular** SDK for Atlas — the Angular peer of [`@atlasauth/react`](../react). It wraps the framework-agnostic [`@atlasauth/js`](../js) client and exposes Atlas's reactive auth state, sign-in/up flows, prebuilt UI, authorization directives, and route guards as idiomatic modern Angular (standalone APIs, RxJS **and** Signals, DI).
4
4
 
5
5
  Requires **Angular 17+**.
6
6
 
@@ -9,7 +9,7 @@ Requires **Angular 17+**.
9
9
  ## Install
10
10
 
11
11
  ```bash
12
- pnpm add @atlas/angular
12
+ pnpm add @atlasauth/angular
13
13
  # peers: @angular/core, @angular/common (>=17), rxjs (>=7); @angular/router if you use the guards
14
14
  ```
15
15
 
@@ -22,7 +22,7 @@ pnpm add @atlas/angular
22
22
  ```ts
23
23
  import { bootstrapApplication } from '@angular/platform-browser';
24
24
  import { provideRouter } from '@angular/router';
25
- import { provideAtlas } from '@atlas/angular';
25
+ import { provideAtlas } from '@atlasauth/angular';
26
26
  import { AppComponent } from './app/app.component';
27
27
  import { routes } from './app/routes';
28
28
 
@@ -44,7 +44,7 @@ The service begins booting immediately — completing any OAuth/hosted-page redi
44
44
  ### NgModule
45
45
 
46
46
  ```ts
47
- import { AtlasModule } from '@atlas/angular';
47
+ import { AtlasModule } from '@atlasauth/angular';
48
48
 
49
49
  @NgModule({
50
50
  imports: [AtlasModule.forRoot({ publishableKey: 'pk_test_…' })],
@@ -55,7 +55,7 @@ export class AppModule {}
55
55
  Feature modules `import { AtlasModule }` (no `forRoot`) to use the directives and components. Standalone components import them individually, or spread `ATLAS_UI`:
56
56
 
57
57
  ```ts
58
- import { ATLAS_UI } from '@atlas/angular';
58
+ import { ATLAS_UI } from '@atlasauth/angular';
59
59
 
60
60
  @Component({ standalone: true, imports: [...ATLAS_UI], template: '…' })
61
61
  export class DashboardComponent {}
@@ -152,7 +152,7 @@ Server-driven, rendered in the host DOM (no iframe), themed via the `appearance`
152
152
  | `<atlas-user-profile>` | `<UserProfile/>` |
153
153
  | `<atlas-organization-profile>` | `<OrganizationProfile/>` |
154
154
 
155
- `<atlas-sign-in>` / `<atlas-sign-up>` run the full multi-step flow (identifier → first factor → 2FA / enrollment → email code → completion, plus magic-link polling), driven entirely by the server-side attempt status through the shared `@atlas/js` engine.
155
+ `<atlas-sign-in>` / `<atlas-sign-up>` run the full multi-step flow (identifier → first factor → 2FA / enrollment → email code → completion, plus magic-link polling), driven entirely by the server-side attempt status through the shared `@atlasauth/js` engine.
156
156
 
157
157
  ---
158
158
 
@@ -162,7 +162,7 @@ Server-driven, rendered in the host DOM (no iframe), themed via the `appearance`
162
162
 
163
163
  ```ts
164
164
  import { Routes } from '@angular/router';
165
- import { atlasGuard } from '@atlas/angular';
165
+ import { atlasGuard } from '@atlasauth/angular';
166
166
 
167
167
  export const routes: Routes = [
168
168
  {
@@ -186,10 +186,10 @@ Like the components, guards are UX, not security — the server enforces the sam
186
186
 
187
187
  ## Theming & i18n
188
188
 
189
- `appearance` accepts design tokens + per-element class overrides and a `baseTheme` (`default`, `dark`, `neobrutalist`); overrides are **appended** to the base classes so your Tailwind/CSS just works. `localization` merges a catalog over `en-US`. Both are identical in shape to `@atlas/react` — see `appearance.ts` and `i18n.ts`, which are shared verbatim.
189
+ `appearance` accepts design tokens + per-element class overrides and a `baseTheme` (`default`, `dark`, `neobrutalist`); overrides are **appended** to the base classes so your Tailwind/CSS just works. `localization` merges a catalog over `en-US`. Both are identical in shape to `@atlasauth/react` — see `appearance.ts` and `i18n.ts`, which are shared verbatim.
190
190
 
191
191
  ## Build & test
192
192
 
193
- - **Build**: `pnpm --filter @atlas/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
- - **Typecheck**: `pnpm --filter @atlas/angular typecheck`.
193
+ - **Build**: `pnpm --filter @atlasauth/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
+ - **Typecheck**: `pnpm --filter @atlasauth/angular typecheck`.
195
195
  - **Test**: unit specs run under the Angular CLI test runner (Karma/Jasmine or your configured runner). A starter spec lives in `src/lib/atlas.service.spec.ts`.
@@ -17,6 +17,8 @@
17
17
  * replacement is a support burden where every override starts by rebuilding the
18
18
  * component's base styles from scratch.
19
19
  */
20
+ import { renderDesignAppearance, } from '@atlasauth/design/runtime';
21
+ export { instanceDesignFrom } from '@atlasauth/design/runtime';
20
22
  export const DEFAULT_TOKENS = {
21
23
  colorPrimary: '#5b5bd6',
22
24
  colorText: '#1c1c1f',
@@ -89,4 +91,37 @@ export function classFor(element, appearance, base) {
89
91
  const override = appearance?.elements?.[element];
90
92
  return override ? `${base} ${override}` : base;
91
93
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZWFyYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBwZWFyYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBd0NILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBMkI7SUFDcEQsWUFBWSxFQUFFLFNBQVM7SUFDdkIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsZUFBZSxFQUFFLFNBQVM7SUFDMUIsV0FBVyxFQUFFLFNBQVM7SUFDdEIsV0FBVyxFQUFFLFNBQVM7SUFDdEIsWUFBWSxFQUFFLEtBQUs7SUFDbkIsVUFBVSxFQUFFLGlFQUFpRTtJQUM3RSxXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUc7SUFDcEIsT0FBTyxFQUFFLGNBQWM7SUFDdkIsSUFBSSxFQUFFO1FBQ0osR0FBRyxjQUFjO1FBQ2pCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFlBQVksRUFBRSxTQUFTO0tBQ3hCO0lBQ0QsWUFBWSxFQUFFO1FBQ1osR0FBRyxjQUFjO1FBQ2pCLFlBQVksRUFBRSxTQUFTO1FBQ3ZCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFlBQVksRUFBRSxLQUFLO1FBQ25CLFVBQVUsRUFBRSx3Q0FBd0M7S0FDckQ7Q0FDd0QsQ0FBQztBQUU1RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFVBQXVCO0lBQ25ELE1BQU0sSUFBSSxHQUFHLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUNuRixNQUFNLFNBQVMsR0FBRyxVQUFVLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUU5QyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDaEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsUUFBUSxDQUFDLEdBQXlCLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUE4QjtJQUN6RCxNQUFNLElBQUksR0FBMkIsRUFBRSxDQUFDO0lBQ3hDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsT0FBbUIsRUFDbkIsVUFBa0MsRUFDbEMsSUFBWTtJQUVaLE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDCpzEwLjMgdGhlbWluZy5cbiAqXG4gKiBcImFwcGVhcmFuY2UgcHJvcDogZGVzaWduIHRva2VucyAoY29sb3JzLCByYWRpdXMsIGZvbnQsIHNwYWNpbmcpICsgcGVyLWVsZW1lbnRcbiAqIGNsYXNzIG92ZXJyaWRlcyAoZWxlbWVudHM6IHsgZm9ybUJ1dHRvblByaW1hcnk6IFwi4oCmXCIgfSkuIE5vIGlmcmFtZSDigJQgY29tcG9uZW50c1xuICogcmVuZGVyIGluIHRoZSBob3N0IERPTSBzbyBUYWlsd2luZC9DU1MganVzdCB3b3Jrcy5cIlxuICpcbiAqIFJlbmRlcmluZyBpbiB0aGUgaG9zdCBET00gaXMgdGhlIGRlY2lzaW9uIGV2ZXJ5dGhpbmcgZWxzZSBmb2xsb3dzIGZyb20uIEFuXG4gKiBpZnJhbWUgd291bGQgaXNvbGF0ZSBzdHlsZXMgcGVyZmVjdGx5IGFuZCBiZSB1bnVzYWJsZTogaXQgY2Fubm90IGJlIHNpemVkIHRvXG4gKiBpdHMgY29udGVudCByZWxpYWJseSwgaXQgYnJlYWtzIHBhc3N3b3JkIG1hbmFnZXJzLCBpdCBicmVha3MgYXV0b2ZpbGwsIGFuZCBhXG4gKiBUYWlsd2luZCBjbGFzcyB0aGUgY3VzdG9tZXIgd3JpdGVzIGhhcyBubyBlZmZlY3QgaW5zaWRlIGl0LiBTaGFyaW5nIHRoZSBET01cbiAqIG1lYW5zIHRoZSBjdXN0b21lcidzIENTUyByZWFjaGVzIG91ciBtYXJrdXAsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGV5IHdhbnRcbiAqIGFuZCB3aGF0IG1ha2VzIGFuIG92ZXJyaWRlIHN5c3RlbSBuZWNlc3NhcnkgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZS5cbiAqXG4gKiBFbGVtZW50IGNsYXNzZXMgYXJlIEFQUEVOREVEIHRvIG91cnMsIG5ldmVyIHJlcGxhY2luZyB0aGVtLiBBIGN1c3RvbWVyIGFkZGluZ1xuICogYGNsYXNzTmFtZT1cInJvdW5kZWQteGxcImAgd2FudHMgYSByb3VuZGVyIGJ1dHRvbiwgbm90IGFuIHVuc3R5bGVkIG9uZSDigJQgYW5kXG4gKiByZXBsYWNlbWVudCBpcyBhIHN1cHBvcnQgYnVyZGVuIHdoZXJlIGV2ZXJ5IG92ZXJyaWRlIHN0YXJ0cyBieSByZWJ1aWxkaW5nIHRoZVxuICogY29tcG9uZW50J3MgYmFzZSBzdHlsZXMgZnJvbSBzY3JhdGNoLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzaWduVG9rZW5zIHtcbiAgY29sb3JQcmltYXJ5Pzogc3RyaW5nO1xuICBjb2xvclRleHQ/OiBzdHJpbmc7XG4gIGNvbG9yQmFja2dyb3VuZD86IHN0cmluZztcbiAgY29sb3JEYW5nZXI/OiBzdHJpbmc7XG4gIGNvbG9yQm9yZGVyPzogc3RyaW5nO1xuICBib3JkZXJSYWRpdXM/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIHNwYWNpbmdVbml0Pzogc3RyaW5nO1xufVxuXG4vKiogRXZlcnkgZWxlbWVudCBhIGN1c3RvbWVyIG1heSB0YXJnZXQuIE5hbWVkIGZvciB3aGF0IGl0IElTLCBub3Qgd2hlcmUgaXQgc2l0cy4gKi9cbmV4cG9ydCB0eXBlIEVsZW1lbnRLZXkgPVxuICB8ICdyb290J1xuICB8ICdjYXJkJ1xuICB8ICdoZWFkZXJUaXRsZSdcbiAgfCAnaGVhZGVyU3VidGl0bGUnXG4gIHwgJ2Zvcm1GaWVsZCdcbiAgfCAnZm9ybUZpZWxkTGFiZWwnXG4gIHwgJ2Zvcm1GaWVsZElucHV0J1xuICB8ICdmb3JtRmllbGRFcnJvcidcbiAgfCAnZm9ybUJ1dHRvblByaW1hcnknXG4gIHwgJ2Zvcm1CdXR0b25TZWNvbmRhcnknXG4gIHwgJ3NvY2lhbEJ1dHRvbidcbiAgfCAnZGl2aWRlclRleHQnXG4gIHwgJ2Zvb3RlckFjdGlvbidcbiAgfCAnYXZhdGFyJ1xuICB8ICdtZW51J1xuICB8ICdtZW51SXRlbSdcbiAgfCAnYmFkZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGVhcmFuY2Uge1xuICAvKiogQSBwcmVidWlsdCB0aGVtZSB0byBzdGFydCBmcm9tLiAqL1xuICBiYXNlVGhlbWU/OiBrZXlvZiB0eXBlb2YgVEhFTUVTO1xuICB2YXJpYWJsZXM/OiBEZXNpZ25Ub2tlbnM7XG4gIGVsZW1lbnRzPzogUGFydGlhbDxSZWNvcmQ8RWxlbWVudEtleSwgc3RyaW5nPj47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RPS0VOUzogUmVxdWlyZWQ8RGVzaWduVG9rZW5zPiA9IHtcbiAgY29sb3JQcmltYXJ5OiAnIzViNWJkNicsXG4gIGNvbG9yVGV4dDogJyMxYzFjMWYnLFxuICBjb2xvckJhY2tncm91bmQ6ICcjZmZmZmZmJyxcbiAgY29sb3JEYW5nZXI6ICcjZDY0NTQ1JyxcbiAgY29sb3JCb3JkZXI6ICcjZTRlNGU5JyxcbiAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgZm9udEZhbWlseTogJ3VpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmJyxcbiAgc3BhY2luZ1VuaXQ6ICc0cHgnLFxufTtcblxuLyoqXG4gKiDCpzEwLjM6IFwicHJlYnVpbHQgdGhlbWVzIHNoaXBwZWQgKGRlZmF1bHQsIGRhcmssIG5lb2JydXRhbGlzdCBhcyBhIGRlbW8gb2YgdGhlXG4gKiBvdmVycmlkZSBzeXN0ZW0pXCIuIE5lb2JydXRhbGlzdCBleGlzdHMgdG8gcHJvdmUgdGhlIHRva2VuIHNldCBpcyBleHByZXNzaXZlXG4gKiBlbm91Z2ggZm9yIGEgdGhlbWUgdGhhdCBsb29rcyBub3RoaW5nIGxpa2UgdGhlIGRlZmF1bHQg4oCUIGEgdGhlbWluZyBzeXN0ZW1cbiAqIHRoYXQgb25seSBwcm9kdWNlcyB0YXN0ZWZ1bCB2YXJpYXRpb25zIG9mIGl0c2VsZiBpcyBub3QgYSB0aGVtaW5nIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRIRU1FUyA9IHtcbiAgZGVmYXVsdDogREVGQVVMVF9UT0tFTlMsXG4gIGRhcms6IHtcbiAgICAuLi5ERUZBVUxUX1RPS0VOUyxcbiAgICBjb2xvclRleHQ6ICcjZTZlOWVmJyxcbiAgICBjb2xvckJhY2tncm91bmQ6ICcjMTQxNzFjJyxcbiAgICBjb2xvckJvcmRlcjogJyMyNDI5MzInLFxuICAgIGNvbG9yUHJpbWFyeTogJyM2ZWE4ZmUnLFxuICB9LFxuICBuZW9icnV0YWxpc3Q6IHtcbiAgICAuLi5ERUZBVUxUX1RPS0VOUyxcbiAgICBjb2xvclByaW1hcnk6ICcjZmZlNjAwJyxcbiAgICBjb2xvclRleHQ6ICcjMDAwMDAwJyxcbiAgICBjb2xvckJhY2tncm91bmQ6ICcjZmZmZmZmJyxcbiAgICBjb2xvckJvcmRlcjogJyMwMDAwMDAnLFxuICAgIGJvcmRlclJhZGl1czogJzBweCcsXG4gICAgZm9udEZhbWlseTogJ1wiQ291cmllciBOZXdcIiwgdWktbW9ub3NwYWNlLCBtb25vc3BhY2UnLFxuICB9LFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVxdWlyZWQ8RGVzaWduVG9rZW5zPj47XG5cbi8qKlxuICogUmVzb2x2ZSB0b2tlbnM6IGRlZmF1bHRzLCB0aGVuIHRoZSBiYXNlIHRoZW1lLCB0aGVuIGV4cGxpY2l0IHZhcmlhYmxlcy5cbiAqXG4gKiBMYXRlciB3aW5zLCBhbmQgYHVuZGVmaW5lZGAgbmV2ZXIgb3ZlcndyaXRlcy4gQSBjdXN0b21lciBzZXR0aW5nIG9uZSB2YXJpYWJsZVxuICogb24gdGhlIGRhcmsgdGhlbWUgZXhwZWN0cyB0aGUgb3RoZXIgZWxldmVuIHRvIHN0YXkgZGFyaywgbm90IHNpbGVudGx5IHJldmVydFxuICogdG8gdGhlIGxpZ2h0IGRlZmF1bHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRva2VucyhhcHBlYXJhbmNlPzogQXBwZWFyYW5jZSk6IFJlcXVpcmVkPERlc2lnblRva2Vucz4ge1xuICBjb25zdCBiYXNlID0gYXBwZWFyYW5jZT8uYmFzZVRoZW1lID8gVEhFTUVTW2FwcGVhcmFuY2UuYmFzZVRoZW1lXSA6IERFRkFVTFRfVE9LRU5TO1xuICBjb25zdCBvdmVycmlkZXMgPSBhcHBlYXJhbmNlPy52YXJpYWJsZXMgPz8ge307XG5cbiAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLkRFRkFVTFRfVE9LRU5TLCAuLi5iYXNlIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlcykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgcmVzb2x2ZWRba2V5IGFzIGtleW9mIERlc2lnblRva2Vuc10gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbi8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgdGhlIGhvc3QgRE9NIHRvIGluaGVyaXQuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzVmFyaWFibGVzKHRva2VuczogUmVxdWlyZWQ8RGVzaWduVG9rZW5zPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB2YXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRva2VucykpIHtcbiAgICAvLyBjYW1lbENhc2Ug4oaSIC0tYXRsYXMta2ViYWItY2FzZSwgd2hpY2ggaXMgd2hhdCBhIGN1c3RvbWVyIHdyaXRlcyBpbiBDU1MuXG4gICAgdmFyc1tgLS1hdGxhcy0ke2tleS5yZXBsYWNlKC9bQS1aXS9nLCAoYykgPT4gYC0ke2MudG9Mb3dlckNhc2UoKX1gKX1gXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB2YXJzO1xufVxuXG4vKipcbiAqIENvbWJpbmUgb3VyIGJhc2UgY2xhc3Mgd2l0aCB0aGUgY3VzdG9tZXIncyBvdmVycmlkZS5cbiAqXG4gKiBBcHBlbmRlZCwgbmV2ZXIgcmVwbGFjZWQg4oCUIGEgY3VzdG9tZXIgYWRkaW5nIGByb3VuZGVkLXhsYCB3YW50cyBhIHJvdW5kZXJcbiAqIGJ1dHRvbiwgbm90IGFuIHVuc3R5bGVkIG9uZS4gVGhlaXJzIGNvbWVzIGxhc3Qgc28gaXQgd2lucyBvbiBlcXVhbFxuICogc3BlY2lmaWNpdHksIHdoaWNoIGlzIHRoZSBiZWhhdmlvdXIgYW55b25lIHdyaXRpbmcgVGFpbHdpbmQgZXhwZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzRm9yKFxuICBlbGVtZW50OiBFbGVtZW50S2V5LFxuICBhcHBlYXJhbmNlOiBBcHBlYXJhbmNlIHwgdW5kZWZpbmVkLFxuICBiYXNlOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBvdmVycmlkZSA9IGFwcGVhcmFuY2U/LmVsZW1lbnRzPy5bZWxlbWVudF07XG4gIHJldHVybiBvdmVycmlkZSA/IGAke2Jhc2V9ICR7b3ZlcnJpZGV9YCA6IGJhc2U7XG59XG4iXX0=
94
+ // ---- the design system ---------------------------------------------------------
95
+ /**
96
+ * The legacy tokens the developer chose EXPLICITLY: a non-default `baseTheme`
97
+ * plus `variables`. Only these map onto a design — the token defaults must not
98
+ * overwrite the dashboard design.
99
+ */
100
+ export function explicitTokens(appearance) {
101
+ const out = {};
102
+ if (appearance?.baseTheme && appearance.baseTheme !== 'default') {
103
+ Object.assign(out, THEMES[appearance.baseTheme]);
104
+ }
105
+ for (const [key, value] of Object.entries(appearance?.variables ?? {})) {
106
+ if (value !== undefined)
107
+ out[key] = value;
108
+ }
109
+ return out;
110
+ }
111
+ /**
112
+ * Turn an `appearance` (+ the instance's dashboard design from the Frontend
113
+ * API) into root attributes and a stylesheet — the same semantics as
114
+ * `@atlasauth/react`. Precedence, lowest first: dashboard design < `preset` <
115
+ * `variables` (and a non-default `baseTheme`) < `design`. Without a dashboard
116
+ * design and without `preset`/`design`, the output is exactly the
117
+ * pre-design-system one: the token variables, no stylesheet, no attributes.
118
+ */
119
+ export function renderAppearance(appearance, instanceDesign, options = {}) {
120
+ return renderDesignAppearance(appearance, instanceDesign, {
121
+ tokens: explicitTokens(appearance),
122
+ legacyStyle: () => cssVariables(resolveTokens(appearance)),
123
+ frontendApi: options.frontendApi,
124
+ warn: options.warn,
125
+ });
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZWFyYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBwZWFyYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUNMLHNCQUFzQixHQUt2QixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBaUQvRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQTJCO0lBQ3BELFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLGVBQWUsRUFBRSxTQUFTO0lBQzFCLFdBQVcsRUFBRSxTQUFTO0lBQ3RCLFdBQVcsRUFBRSxTQUFTO0lBQ3RCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFVBQVUsRUFBRSxpRUFBaUU7SUFDN0UsV0FBVyxFQUFFLEtBQUs7Q0FDbkIsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ3BCLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLElBQUksRUFBRTtRQUNKLEdBQUcsY0FBYztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixZQUFZLEVBQUUsU0FBUztLQUN4QjtJQUNELFlBQVksRUFBRTtRQUNaLEdBQUcsY0FBYztRQUNqQixZQUFZLEVBQUUsU0FBUztRQUN2QixTQUFTLEVBQUUsU0FBUztRQUNwQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixZQUFZLEVBQUUsS0FBSztRQUNuQixVQUFVLEVBQUUsd0NBQXdDO0tBQ3JEO0NBQ3dELENBQUM7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxVQUF1QjtJQUNuRCxNQUFNLElBQUksR0FBRyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDbkYsTUFBTSxTQUFTLEdBQUcsVUFBVSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFFOUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLGNBQWMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ2hELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFFBQVEsQ0FBQyxHQUF5QixDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBOEI7SUFDekQsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztJQUN4QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xELDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDakYsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLE9BQW1CLEVBQ25CLFVBQWtDLEVBQ2xDLElBQVk7SUFFWixNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDakQsQ0FBQztBQUVELG1GQUFtRjtBQUVuRjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxVQUF1QjtJQUNwRCxNQUFNLEdBQUcsR0FBaUIsRUFBRSxDQUFDO0lBQzdCLElBQUksVUFBVSxFQUFFLFNBQVMsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxHQUFHLENBQUMsR0FBeUIsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsVUFBa0MsRUFDbEMsY0FBaUQsRUFDakQsVUFBdUQsRUFBRTtJQUV6RCxPQUFPLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUU7UUFDeEQsTUFBTSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUM7UUFDbEMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDCpzEwLjMgdGhlbWluZy5cbiAqXG4gKiBcImFwcGVhcmFuY2UgcHJvcDogZGVzaWduIHRva2VucyAoY29sb3JzLCByYWRpdXMsIGZvbnQsIHNwYWNpbmcpICsgcGVyLWVsZW1lbnRcbiAqIGNsYXNzIG92ZXJyaWRlcyAoZWxlbWVudHM6IHsgZm9ybUJ1dHRvblByaW1hcnk6IFwi4oCmXCIgfSkuIE5vIGlmcmFtZSDigJQgY29tcG9uZW50c1xuICogcmVuZGVyIGluIHRoZSBob3N0IERPTSBzbyBUYWlsd2luZC9DU1MganVzdCB3b3Jrcy5cIlxuICpcbiAqIFJlbmRlcmluZyBpbiB0aGUgaG9zdCBET00gaXMgdGhlIGRlY2lzaW9uIGV2ZXJ5dGhpbmcgZWxzZSBmb2xsb3dzIGZyb20uIEFuXG4gKiBpZnJhbWUgd291bGQgaXNvbGF0ZSBzdHlsZXMgcGVyZmVjdGx5IGFuZCBiZSB1bnVzYWJsZTogaXQgY2Fubm90IGJlIHNpemVkIHRvXG4gKiBpdHMgY29udGVudCByZWxpYWJseSwgaXQgYnJlYWtzIHBhc3N3b3JkIG1hbmFnZXJzLCBpdCBicmVha3MgYXV0b2ZpbGwsIGFuZCBhXG4gKiBUYWlsd2luZCBjbGFzcyB0aGUgY3VzdG9tZXIgd3JpdGVzIGhhcyBubyBlZmZlY3QgaW5zaWRlIGl0LiBTaGFyaW5nIHRoZSBET01cbiAqIG1lYW5zIHRoZSBjdXN0b21lcidzIENTUyByZWFjaGVzIG91ciBtYXJrdXAsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGV5IHdhbnRcbiAqIGFuZCB3aGF0IG1ha2VzIGFuIG92ZXJyaWRlIHN5c3RlbSBuZWNlc3NhcnkgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZS5cbiAqXG4gKiBFbGVtZW50IGNsYXNzZXMgYXJlIEFQUEVOREVEIHRvIG91cnMsIG5ldmVyIHJlcGxhY2luZyB0aGVtLiBBIGN1c3RvbWVyIGFkZGluZ1xuICogYGNsYXNzTmFtZT1cInJvdW5kZWQteGxcImAgd2FudHMgYSByb3VuZGVyIGJ1dHRvbiwgbm90IGFuIHVuc3R5bGVkIG9uZSDigJQgYW5kXG4gKiByZXBsYWNlbWVudCBpcyBhIHN1cHBvcnQgYnVyZGVuIHdoZXJlIGV2ZXJ5IG92ZXJyaWRlIHN0YXJ0cyBieSByZWJ1aWxkaW5nIHRoZVxuICogY29tcG9uZW50J3MgYmFzZSBzdHlsZXMgZnJvbSBzY3JhdGNoLlxuICovXG5cbmltcG9ydCB7XG4gIHJlbmRlckRlc2lnbkFwcGVhcmFuY2UsXG4gIHR5cGUgQXBwZWFyYW5jZVJlbmRlcixcbiAgdHlwZSBEZXNpZ25BcHBlYXJhbmNlLFxuICB0eXBlIERlc2lnbldhcm4sXG4gIHR5cGUgSW5zdGFuY2VEZXNpZ24sXG59IGZyb20gJ0BhdGxhc2F1dGgvZGVzaWduL3J1bnRpbWUnO1xuXG5leHBvcnQgeyBpbnN0YW5jZURlc2lnbkZyb20gfSBmcm9tICdAYXRsYXNhdXRoL2Rlc2lnbi9ydW50aW1lJztcbmV4cG9ydCB0eXBlIHsgQXBwZWFyYW5jZVJlbmRlciwgQXRsYXNEZXNpZ24sIEluc3RhbmNlRGVzaWduLCBQcmVzZXRJZCB9IGZyb20gJ0BhdGxhc2F1dGgvZGVzaWduL3J1bnRpbWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlc2lnblRva2VucyB7XG4gIGNvbG9yUHJpbWFyeT86IHN0cmluZztcbiAgY29sb3JUZXh0Pzogc3RyaW5nO1xuICBjb2xvckJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGNvbG9yRGFuZ2VyPzogc3RyaW5nO1xuICBjb2xvckJvcmRlcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogc3RyaW5nO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBzcGFjaW5nVW5pdD86IHN0cmluZztcbn1cblxuLyoqIEV2ZXJ5IGVsZW1lbnQgYSBjdXN0b21lciBtYXkgdGFyZ2V0LiBOYW1lZCBmb3Igd2hhdCBpdCBJUywgbm90IHdoZXJlIGl0IHNpdHMuICovXG5leHBvcnQgdHlwZSBFbGVtZW50S2V5ID1cbiAgfCAncm9vdCdcbiAgfCAnY2FyZCdcbiAgfCAnaGVhZGVyVGl0bGUnXG4gIHwgJ2hlYWRlclN1YnRpdGxlJ1xuICB8ICdmb3JtRmllbGQnXG4gIHwgJ2Zvcm1GaWVsZExhYmVsJ1xuICB8ICdmb3JtRmllbGRJbnB1dCdcbiAgfCAnZm9ybUZpZWxkRXJyb3InXG4gIHwgJ2Zvcm1CdXR0b25QcmltYXJ5J1xuICB8ICdmb3JtQnV0dG9uU2Vjb25kYXJ5J1xuICB8ICdzb2NpYWxCdXR0b24nXG4gIHwgJ2RpdmlkZXJUZXh0J1xuICB8ICdmb290ZXJBY3Rpb24nXG4gIHwgJ2F2YXRhcidcbiAgfCAnbWVudSdcbiAgfCAnbWVudUl0ZW0nXG4gIHwgJ2JhZGdlJztcblxuZXhwb3J0IGludGVyZmFjZSBBcHBlYXJhbmNlIGV4dGVuZHMgRGVzaWduQXBwZWFyYW5jZSB7XG4gIC8qKiBBIHByZWJ1aWx0IHRva2VuIHRoZW1lIHRvIHN0YXJ0IGZyb20gKHByZS1kZXNpZ24tc3lzdGVtIHRoZW1lcykuICovXG4gIGJhc2VUaGVtZT86IGtleW9mIHR5cGVvZiBUSEVNRVM7XG4gIC8qKlxuICAgKiBMZWdhY3kgZGVzaWduIHRva2Vucy4gV2l0aG91dCBhIGRlc2lnbiB0aGV5IHNldCB0aGUgYC0tYXRsYXMtKmAgdmFyaWFibGVzXG4gICAqIGV4YWN0bHkgYXMgYmVmb3JlOyB3aXRoIG9uZSB0aGV5IG1hcCBvbnRvIGl0LlxuICAgKi9cbiAgdmFyaWFibGVzPzogRGVzaWduVG9rZW5zO1xuICBlbGVtZW50cz86IFBhcnRpYWw8UmVjb3JkPEVsZW1lbnRLZXksIHN0cmluZz4+O1xuICAvLyBGcm9tIERlc2lnbkFwcGVhcmFuY2U6XG4gIC8vICAgcHJlc2V0PzogUHJlc2V0SWQgICAgICAgICAgICBhIGRlc2lnbiBwcmVzZXQgKHJlcGxhY2VzIHRoZSBkYXNoYm9hcmQgZGVzaWduIGFzIHRoZSBiYXNlKVxuICAvLyAgIGRlc2lnbj86IEF0bGFzRGVzaWduICAgICAgICAgc3RydWN0dXJlZCBvdmVycmlkZXMsIGhpZ2hlc3QgcHJlY2VkZW5jZVxuICAvLyAgIGluc3RhbmNlRGVzaWduPzogYm9vbGVhbiAgICAgYXBwbHkgdGhlIGRhc2hib2FyZCBkZXNpZ24gYXV0b21hdGljYWxseSAoZGVmYXVsdCB0cnVlKVxufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT0tFTlM6IFJlcXVpcmVkPERlc2lnblRva2Vucz4gPSB7XG4gIGNvbG9yUHJpbWFyeTogJyM1YjViZDYnLFxuICBjb2xvclRleHQ6ICcjMWMxYzFmJyxcbiAgY29sb3JCYWNrZ3JvdW5kOiAnI2ZmZmZmZicsXG4gIGNvbG9yRGFuZ2VyOiAnI2Q2NDU0NScsXG4gIGNvbG9yQm9yZGVyOiAnI2U0ZTRlOScsXG4gIGJvcmRlclJhZGl1czogJzhweCcsXG4gIGZvbnRGYW1pbHk6ICd1aS1zYW5zLXNlcmlmLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZicsXG4gIHNwYWNpbmdVbml0OiAnNHB4Jyxcbn07XG5cbi8qKlxuICogwqcxMC4zOiBcInByZWJ1aWx0IHRoZW1lcyBzaGlwcGVkIChkZWZhdWx0LCBkYXJrLCBuZW9icnV0YWxpc3QgYXMgYSBkZW1vIG9mIHRoZVxuICogb3ZlcnJpZGUgc3lzdGVtKVwiLiBOZW9icnV0YWxpc3QgZXhpc3RzIHRvIHByb3ZlIHRoZSB0b2tlbiBzZXQgaXMgZXhwcmVzc2l2ZVxuICogZW5vdWdoIGZvciBhIHRoZW1lIHRoYXQgbG9va3Mgbm90aGluZyBsaWtlIHRoZSBkZWZhdWx0IOKAlCBhIHRoZW1pbmcgc3lzdGVtXG4gKiB0aGF0IG9ubHkgcHJvZHVjZXMgdGFzdGVmdWwgdmFyaWF0aW9ucyBvZiBpdHNlbGYgaXMgbm90IGEgdGhlbWluZyBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBUSEVNRVMgPSB7XG4gIGRlZmF1bHQ6IERFRkFVTFRfVE9LRU5TLFxuICBkYXJrOiB7XG4gICAgLi4uREVGQVVMVF9UT0tFTlMsXG4gICAgY29sb3JUZXh0OiAnI2U2ZTllZicsXG4gICAgY29sb3JCYWNrZ3JvdW5kOiAnIzE0MTcxYycsXG4gICAgY29sb3JCb3JkZXI6ICcjMjQyOTMyJyxcbiAgICBjb2xvclByaW1hcnk6ICcjNmVhOGZlJyxcbiAgfSxcbiAgbmVvYnJ1dGFsaXN0OiB7XG4gICAgLi4uREVGQVVMVF9UT0tFTlMsXG4gICAgY29sb3JQcmltYXJ5OiAnI2ZmZTYwMCcsXG4gICAgY29sb3JUZXh0OiAnIzAwMDAwMCcsXG4gICAgY29sb3JCYWNrZ3JvdW5kOiAnI2ZmZmZmZicsXG4gICAgY29sb3JCb3JkZXI6ICcjMDAwMDAwJyxcbiAgICBib3JkZXJSYWRpdXM6ICcwcHgnLFxuICAgIGZvbnRGYW1pbHk6ICdcIkNvdXJpZXIgTmV3XCIsIHVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlJyxcbiAgfSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIFJlcXVpcmVkPERlc2lnblRva2Vucz4+O1xuXG4vKipcbiAqIFJlc29sdmUgdG9rZW5zOiBkZWZhdWx0cywgdGhlbiB0aGUgYmFzZSB0aGVtZSwgdGhlbiBleHBsaWNpdCB2YXJpYWJsZXMuXG4gKlxuICogTGF0ZXIgd2lucywgYW5kIGB1bmRlZmluZWRgIG5ldmVyIG92ZXJ3cml0ZXMuIEEgY3VzdG9tZXIgc2V0dGluZyBvbmUgdmFyaWFibGVcbiAqIG9uIHRoZSBkYXJrIHRoZW1lIGV4cGVjdHMgdGhlIG90aGVyIGVsZXZlbiB0byBzdGF5IGRhcmssIG5vdCBzaWxlbnRseSByZXZlcnRcbiAqIHRvIHRoZSBsaWdodCBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUb2tlbnMoYXBwZWFyYW5jZT86IEFwcGVhcmFuY2UpOiBSZXF1aXJlZDxEZXNpZ25Ub2tlbnM+IHtcbiAgY29uc3QgYmFzZSA9IGFwcGVhcmFuY2U/LmJhc2VUaGVtZSA/IFRIRU1FU1thcHBlYXJhbmNlLmJhc2VUaGVtZV0gOiBERUZBVUxUX1RPS0VOUztcbiAgY29uc3Qgb3ZlcnJpZGVzID0gYXBwZWFyYW5jZT8udmFyaWFibGVzID8/IHt9O1xuXG4gIGNvbnN0IHJlc29sdmVkID0geyAuLi5ERUZBVUxUX1RPS0VOUywgLi4uYmFzZSB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZXMpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHJlc29sdmVkW2tleSBhcyBrZXlvZiBEZXNpZ25Ub2tlbnNdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKiogVG9rZW5zIGFzIENTUyBjdXN0b20gcHJvcGVydGllcywgZm9yIHRoZSBob3N0IERPTSB0byBpbmhlcml0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc1ZhcmlhYmxlcyh0b2tlbnM6IFJlcXVpcmVkPERlc2lnblRva2Vucz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgdmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0b2tlbnMpKSB7XG4gICAgLy8gY2FtZWxDYXNlIOKGkiAtLWF0bGFzLWtlYmFiLWNhc2UsIHdoaWNoIGlzIHdoYXQgYSBjdXN0b21lciB3cml0ZXMgaW4gQ1NTLlxuICAgIHZhcnNbYC0tYXRsYXMtJHtrZXkucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+IGAtJHtjLnRvTG93ZXJDYXNlKCl9YCl9YF0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFycztcbn1cblxuLyoqXG4gKiBDb21iaW5lIG91ciBiYXNlIGNsYXNzIHdpdGggdGhlIGN1c3RvbWVyJ3Mgb3ZlcnJpZGUuXG4gKlxuICogQXBwZW5kZWQsIG5ldmVyIHJlcGxhY2VkIOKAlCBhIGN1c3RvbWVyIGFkZGluZyBgcm91bmRlZC14bGAgd2FudHMgYSByb3VuZGVyXG4gKiBidXR0b24sIG5vdCBhbiB1bnN0eWxlZCBvbmUuIFRoZWlycyBjb21lcyBsYXN0IHNvIGl0IHdpbnMgb24gZXF1YWxcbiAqIHNwZWNpZmljaXR5LCB3aGljaCBpcyB0aGUgYmVoYXZpb3VyIGFueW9uZSB3cml0aW5nIFRhaWx3aW5kIGV4cGVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0ZvcihcbiAgZWxlbWVudDogRWxlbWVudEtleSxcbiAgYXBwZWFyYW5jZTogQXBwZWFyYW5jZSB8IHVuZGVmaW5lZCxcbiAgYmFzZTogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBhcHBlYXJhbmNlPy5lbGVtZW50cz8uW2VsZW1lbnRdO1xuICByZXR1cm4gb3ZlcnJpZGUgPyBgJHtiYXNlfSAke292ZXJyaWRlfWAgOiBiYXNlO1xufVxuXG4vLyAtLS0tIHRoZSBkZXNpZ24gc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBsZWdhY3kgdG9rZW5zIHRoZSBkZXZlbG9wZXIgY2hvc2UgRVhQTElDSVRMWTogYSBub24tZGVmYXVsdCBgYmFzZVRoZW1lYFxuICogcGx1cyBgdmFyaWFibGVzYC4gT25seSB0aGVzZSBtYXAgb250byBhIGRlc2lnbiDigJQgdGhlIHRva2VuIGRlZmF1bHRzIG11c3Qgbm90XG4gKiBvdmVyd3JpdGUgdGhlIGRhc2hib2FyZCBkZXNpZ24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBsaWNpdFRva2VucyhhcHBlYXJhbmNlPzogQXBwZWFyYW5jZSk6IERlc2lnblRva2VucyB7XG4gIGNvbnN0IG91dDogRGVzaWduVG9rZW5zID0ge307XG4gIGlmIChhcHBlYXJhbmNlPy5iYXNlVGhlbWUgJiYgYXBwZWFyYW5jZS5iYXNlVGhlbWUgIT09ICdkZWZhdWx0Jykge1xuICAgIE9iamVjdC5hc3NpZ24ob3V0LCBUSEVNRVNbYXBwZWFyYW5jZS5iYXNlVGhlbWVdKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcHBlYXJhbmNlPy52YXJpYWJsZXMgPz8ge30pKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIG91dFtrZXkgYXMga2V5b2YgRGVzaWduVG9rZW5zXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHVybiBhbiBgYXBwZWFyYW5jZWAgKCsgdGhlIGluc3RhbmNlJ3MgZGFzaGJvYXJkIGRlc2lnbiBmcm9tIHRoZSBGcm9udGVuZFxuICogQVBJKSBpbnRvIHJvb3QgYXR0cmlidXRlcyBhbmQgYSBzdHlsZXNoZWV0IOKAlCB0aGUgc2FtZSBzZW1hbnRpY3MgYXNcbiAqIGBAYXRsYXNhdXRoL3JlYWN0YC4gUHJlY2VkZW5jZSwgbG93ZXN0IGZpcnN0OiBkYXNoYm9hcmQgZGVzaWduIDwgYHByZXNldGAgPFxuICogYHZhcmlhYmxlc2AgKGFuZCBhIG5vbi1kZWZhdWx0IGBiYXNlVGhlbWVgKSA8IGBkZXNpZ25gLiBXaXRob3V0IGEgZGFzaGJvYXJkXG4gKiBkZXNpZ24gYW5kIHdpdGhvdXQgYHByZXNldGAvYGRlc2lnbmAsIHRoZSBvdXRwdXQgaXMgZXhhY3RseSB0aGVcbiAqIHByZS1kZXNpZ24tc3lzdGVtIG9uZTogdGhlIHRva2VuIHZhcmlhYmxlcywgbm8gc3R5bGVzaGVldCwgbm8gYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckFwcGVhcmFuY2UoXG4gIGFwcGVhcmFuY2U6IEFwcGVhcmFuY2UgfCB1bmRlZmluZWQsXG4gIGluc3RhbmNlRGVzaWduOiBJbnN0YW5jZURlc2lnbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHsgZnJvbnRlbmRBcGk/OiBzdHJpbmc7IHdhcm4/OiBEZXNpZ25XYXJuIH0gPSB7fSxcbik6IEFwcGVhcmFuY2VSZW5kZXIge1xuICByZXR1cm4gcmVuZGVyRGVzaWduQXBwZWFyYW5jZShhcHBlYXJhbmNlLCBpbnN0YW5jZURlc2lnbiwge1xuICAgIHRva2VuczogZXhwbGljaXRUb2tlbnMoYXBwZWFyYW5jZSksXG4gICAgbGVnYWN5U3R5bGU6ICgpID0+IGNzc1ZhcmlhYmxlcyhyZXNvbHZlVG9rZW5zKGFwcGVhcmFuY2UpKSxcbiAgICBmcm9udGVuZEFwaTogb3B0aW9ucy5mcm9udGVuZEFwaSxcbiAgICB3YXJuOiBvcHRpb25zLndhcm4sXG4gIH0pO1xufVxuIl19
@@ -3,10 +3,10 @@ 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, stripRedirectParams, } from '@atlasauth/js';
6
+ import { FapiClient, TokenCache, getProviderToken as fetchProviderToken, msUntilRefresh, readExpiry, readRedirectResult, stripRedirectParams, runFrontChannelLogoutFromResponse, } from '@atlasauth/js';
7
7
  import { evaluate } from '@atlasauth/authz';
8
8
  import { ATLAS_OPTIONS } from './atlas.config';
9
- import { cssVariables, resolveTokens } from './appearance';
9
+ import { cssVariables, instanceDesignFrom, renderAppearance, resolveTokens, } from './appearance';
10
10
  import { EN_US, withFallback } from './i18n';
11
11
  import * as i0 from "@angular/core";
12
12
  /**
@@ -126,6 +126,33 @@ export class AtlasService {
126
126
  appearanceVariables() {
127
127
  return cssVariables(resolveTokens(this.options.appearance));
128
128
  }
129
+ /**
130
+ * The full appearance render for a root element: inline variables, the
131
+ * `data-atlas-*` attributes and the design stylesheet. Pass the dashboard
132
+ * design (from {@link loadInstanceDesign}) to layer code overrides on it —
133
+ * the same semantics as `@atlasauth/react`.
134
+ */
135
+ appearanceRender(instanceDesign) {
136
+ return renderAppearance(this.options.appearance, instanceDesign ?? null, {
137
+ frontendApi: this.baseUrl,
138
+ });
139
+ }
140
+ /**
141
+ * The design configured in the Atlas dashboard (`GET /v1/appearance`), or null
142
+ * when there is none, it cannot be read, or the app opted out with
143
+ * `appearance.instanceDesign: false`.
144
+ */
145
+ async loadInstanceDesign() {
146
+ if (this.options.appearance?.instanceDesign === false)
147
+ return null;
148
+ try {
149
+ const response = await this.call('/v1/appearance');
150
+ return response.ok ? instanceDesignFrom(await response.json()) : null;
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ }
129
156
  /** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */
130
157
  createFapiClient() {
131
158
  return new FapiClient({ publishableKey: this.publishableKey, baseUrl: this.baseUrl });
@@ -157,12 +184,16 @@ export class AtlasService {
157
184
  return evaluate(this._claims.value, condition).allowed;
158
185
  }
159
186
  /** Revoke the current session server-side and drop all local auth state. */
160
- async signOut() {
187
+ async signOut(options) {
161
188
  const current = this.cache.peek();
162
189
  if (current) {
163
- await this.call(`/v1/client/sessions/${current.sessionId}/revoke`, {
190
+ const revoked = await this.call(`/v1/client/sessions/${current.sessionId}/revoke`, {
164
191
  method: 'POST',
165
192
  }).catch(() => undefined);
193
+ // OIDC Front-Channel Logout: let the apps signed in through this session
194
+ // clear theirs in this browser (hidden iframes, capped at 5 s). Best-effort.
195
+ if (options?.frontchannel !== false)
196
+ await runFrontChannelLogoutFromResponse(revoked);
166
197
  }
167
198
  this.clearRefreshTimer();
168
199
  this.cache.clear();
@@ -326,4 +357,4 @@ function decodeClaims(jwt) {
326
357
  return null;
327
358
  }
328
359
  }
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLG1CQUFtQixHQUVwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUF5QixNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBbUIsTUFBTSxjQUFjLENBQUM7QUFDNUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQWdCLE1BQU0sUUFBUSxDQUFDOztBQVMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE9BQU8sQ0FB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QUFDO3dHQTlVVSxZQUFZOzRHQUFaLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBa1ZsQyw2RUFBNkU7QUFDN0UsU0FBUyxZQUFZLENBQUMsR0FBVztJQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDckIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBUb2tlbkNhY2hlLFxuICBnZXRQcm92aWRlclRva2VuIGFzIGZldGNoUHJvdmlkZXJUb2tlbixcbiAgbXNVbnRpbFJlZnJlc2gsXG4gIHJlYWRFeHBpcnksXG4gIHJlYWRSZWRpcmVjdFJlc3VsdCxcbiAgc3RyaXBSZWRpcmVjdFBhcmFtcyxcbiAgdHlwZSBQcm92aWRlclRva2VuLFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IGV2YWx1YXRlLCB0eXBlIFByb3RlY3RDb25kaXRpb24gfSBmcm9tICdAYXRsYXNhdXRoL2F1dGh6JztcbmltcG9ydCB7IEFUTEFTX09QVElPTlMgfSBmcm9tICcuL2F0bGFzLmNvbmZpZyc7XG5pbXBvcnQgeyBjc3NWYXJpYWJsZXMsIHJlc29sdmVUb2tlbnMsIHR5cGUgQXBwZWFyYW5jZSB9IGZyb20gJy4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyBFTl9VUywgd2l0aEZhbGxiYWNrLCB0eXBlIENhdGFsb2cgfSBmcm9tICcuL2kxOG4nO1xuaW1wb3J0IHR5cGUge1xuICBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAsXG4gIEF0bGFzU2Vzc2lvbixcbiAgQXRsYXNVc2VyLFxuICBBdXRoU3RhdHVzLFxuICBTZXNzaW9uQ2xhaW1zLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBgQXRsYXNTZXJ2aWNlYCDigJQgdGhlIEFuZ3VsYXIgcGVlciBvZiBSZWFjdCdzIGA8QXRsYXNQcm92aWRlcj5gICsgaG9va3MuXG4gKlxuICogSXQgaG9sZHMgZXhhY3RseSBvbmUgdGhpbmcgdGhhdCBtYXR0ZXJzIGluIG1lbW9yeTogdGhlIHNob3J0LWxpdmVkIEpXVCwgaW4gYVxuICoge0BsaW5rIFRva2VuQ2FjaGV9LiBOb3QgbG9jYWxTdG9yYWdlLCBub3QgYSBjb29raWUgdGhpcyBjb2RlIHdyaXRlcyDigJQgdGhlXG4gKiByZWZyZXNoIHRva2VuIGlzIEh0dHBPbmx5IHNvIGJyb3dzZXIgc2NyaXB0IG5ldmVyIHRvdWNoZXMgaXQsIGFuZCB0aGUgSldUXG4gKiBsaXZlcyBvbmx5IGFzIGxvbmcgYXMgdGhlIHRhYi4gQW55dGhpbmcgcGVyc2lzdGVkIHdvdWxkIHN1cnZpdmUgdGhlIHRhYiBhbmRcbiAqIGJlY29tZSB0aGUgZmlyc3QgdGhpbmcgYW4gWFNTIHJlYWRzLlxuICpcbiAqIFJlYWN0aXZlIGF1dGggc3RhdGUgaXMgZXhwb3NlZCB0d28gd2F5cyBzbyBjYWxsZXJzIGNhbiBwaWNrIHRoZWlyIGlkaW9tOlxuICogIC0gUnhKUyBvYnNlcnZhYmxlcyAoYHVzZXIkYCwgYHNlc3Npb24kYCwgYGlzU2lnbmVkSW4kYCwg4oCmKSDigJQgdGhlIHByaW1hcnkgQVBJLFxuICogICAgdGhlIGFuYWxvZ3VlIG9mIHRoZSBSZWFjdCBob29rcycgcmV0dXJuIHZhbHVlcy5cbiAqICAtIEFuZ3VsYXIgc2lnbmFscyAoYHVzZXJgLCBgc2Vzc2lvbmAsIGBpc1NpZ25lZEluYCwg4oCmKSDigJQgdGhlIHNhbWUgdmFsdWVzIGFzXG4gKiAgICBgU2lnbmFsPFQ+YCwgZm9yIHRlbXBsYXRlcyBhbmQgYGNvbXB1dGVkKClgLlxuICpcbiAqIFRoZSBpbXBlcmF0aXZlIG1ldGhvZHMgKGBzaWduT3V0YCwgYGdldFRva2VuYCwgYGdldFByb3ZpZGVyVG9rZW5gLFxuICogYHNldEFjdGl2ZU9yZ2FuaXphdGlvbmAsIGByZWxvYWRgKSBtaXJyb3IgdGhlIGFjdGlvbnMgdGhlIGhvb2tzIHJldHVybi5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdGxhc1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoQVRMQVNfT1BUSU9OUyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoYWJsZUtleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvRmV0Y2g6IHR5cGVvZiBmZXRjaDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFRva2VuQ2FjaGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmYXBpQ2xpZW50OiBGYXBpQ2xpZW50O1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2c6IENhdGFsb2c7XG5cbiAgLyoqXG4gICAqIEEgc2lnbi1pbiBhdHRlbXB0IGhhbmRlZCBiYWNrIGJ5IGFuIE9BdXRoIHJlZGlyZWN0IHRoYXQgc3RpbGwgbmVlZHMgYSBzZWNvbmRcbiAgICogZmFjdG9yIChubyBzZXNzaW9uIHdhcyBpc3N1ZWQpLiBOdWxsIGluIHRoZSBvcmRpbmFyeSBjYXNlOyB0aGUgYDxhdGxhcy1zaWduLWluPmBcbiAgICogZmxvdyBzZWVkcyBpdHNlbGYgZnJvbSB0aGlzIHNvIHRoZSB1c2VyIHJlc3VtZXMgYXQgdGhlIDJGQSBzdGVwLiBDYXB0dXJlZFxuICAgKiBvbmNlLCBzeW5jaHJvbm91c2x5LCBhdCBjb25zdHJ1Y3Rpb24g4oCUIGJlZm9yZSBhbnkgZmxvdyBjb21wb25lbnQgcmVhZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nQXR0ZW1wdDogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbDtcblxuICAvLyAtLS0gUmVhY3RpdmUgc3RhdGUgKHNvdXJjZSBvZiB0cnV0aCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdHVzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoU3RhdHVzPignbG9hZGluZycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF91c2VyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc1VzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNTZXNzaW9uIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYWltcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbkNsYWltcyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZW1iZXJzaGlwcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+KFtdKTtcblxuICAvKiogVGhlIHRocmVlLXN0YXRlIGF1dGggbGlmZWN5Y2xlOiBgbG9hZGluZ2Ag4oaSIGBzaWduZWRfaW5gIHwgYHNpZ25lZF9vdXRgLiAqL1xuICByZWFkb25seSBzdGF0dXMkOiBPYnNlcnZhYmxlPEF1dGhTdGF0dXM+ID0gdGhpcy5fc3RhdHVzLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSB1c2VyJDogT2JzZXJ2YWJsZTxBdGxhc1VzZXIgfCBudWxsPiA9IHRoaXMuX3VzZXIuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHNlc3Npb24kOiBPYnNlcnZhYmxlPEF0bGFzU2Vzc2lvbiB8IG51bGw+ID0gdGhpcy5fc2Vzc2lvbi5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgY2xhaW1zJDogT2JzZXJ2YWJsZTxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0aGlzLl9jbGFpbXMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBzJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4gPVxuICAgIHRoaXMuX21lbWJlcnNoaXBzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBUcnVlIG9uY2UgdGhlIFNESyBoYXMgZmluaXNoZWQgaXRzIGZpcnN0IGJvb3QuIERpc3Rpbmd1aXNoaW5nIFwic3RpbGwgbG9hZGluZ1wiXG4gICAqIGZyb20gXCJzaWduZWQgb3V0XCIgaXMgd2hhdCBsZXRzIGEgdGVtcGxhdGUgYXZvaWQgdGhlIGZsYXNoIG9mIGEgc2lnbi1pbiBmb3JtXG4gICAqIG9uIGV2ZXJ5IHBhZ2UgbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzTG9hZGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgocykgPT4gcyAhPT0gJ2xvYWRpbmcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICApO1xuXG4gIHJlYWRvbmx5IGlzU2lnbmVkSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgbWFwKChzKSA9PiBzID09PSAnc2lnbmVkX2luJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgKTtcblxuICAvKiogVGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gbWVtYmVyc2hpcCwgZGVyaXZlZCBmcm9tIHRoZSB0b2tlbidzIGBvcmdfaWRgIGNsYWltLiAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb24kOiBPYnNlcnZhYmxlPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fbWVtYmVyc2hpcHMsXG4gICAgdGhpcy5fY2xhaW1zLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbbWVtYmVyc2hpcHMsIGNsYWltc10pID0+XG4gICAgICAgIG1lbWJlcnNoaXBzLmZpbmQoKG0pID0+IG0ub3JnYW5pemF0aW9uLmlkID09PSBjbGFpbXM/Lm9yZ19pZCkgPz8gbnVsbCxcbiAgICApLFxuICApO1xuXG4gIC8vIC0tLSBTaWduYWwgbWlycm9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICByZWFkb25seSBzdGF0dXM6IFNpZ25hbDxBdXRoU3RhdHVzPiA9IHRvU2lnbmFsKHRoaXMuc3RhdHVzJCwgeyBpbml0aWFsVmFsdWU6ICdsb2FkaW5nJyB9KTtcbiAgcmVhZG9ubHkgdXNlcjogU2lnbmFsPEF0bGFzVXNlciB8IG51bGw+ID0gdG9TaWduYWwodGhpcy51c2VyJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IHNlc3Npb246IFNpZ25hbDxBdGxhc1Nlc3Npb24gfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMuc2Vzc2lvbiQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBjbGFpbXM6IFNpZ25hbDxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLmNsYWltcyQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBtZW1iZXJzaGlwczogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPiA9IHRvU2lnbmFsKHRoaXMubWVtYmVyc2hpcHMkLCB7XG4gICAgaW5pdGlhbFZhbHVlOiBbXSBhcyBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXSxcbiAgfSk7XG4gIHJlYWRvbmx5IGlzTG9hZGVkOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpICE9PSAnbG9hZGluZycpO1xuICByZWFkb25seSBpc1NpZ25lZEluOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpID09PSAnc2lnbmVkX2luJyk7XG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG9yZ0lkID0gdGhpcy5jbGFpbXMoKT8ub3JnX2lkO1xuICAgIHJldHVybiB0aGlzLm1lbWJlcnNoaXBzKCkuZmluZCgobSkgPT4gbS5vcmdhbml6YXRpb24uaWQgPT09IG9yZ0lkKSA/PyBudWxsO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucHVibGlzaGFibGVLZXkgPSBvcHRpb25zLnB1Ymxpc2hhYmxlS2V5O1xuICAgIHRoaXMuYmFzZVVybCA9IG9wdGlvbnMuZnJvbnRlbmRBcGkgPz8gJyc7XG4gICAgdGhpcy5kb0ZldGNoID0gb3B0aW9ucy5mZXRjaEltcGwgPz8gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBmZXRjaD4pID0+IGZldGNoKC4uLmFyZ3MpKTtcblxuICAgIHRoaXMuY2F0YWxvZyA9IG9wdGlvbnMubG9jYWxpemF0aW9uID8gd2l0aEZhbGxiYWNrKG9wdGlvbnMubG9jYWxpemF0aW9uKSA6IEVOX1VTO1xuXG4gICAgdGhpcy5mYXBpQ2xpZW50ID0gbmV3IEZhcGlDbGllbnQoe1xuICAgICAgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICBmZXRjaEltcGw6IHRoaXMuZG9GZXRjaCxcbiAgICB9KTtcblxuICAgIC8vIENhcHR1cmVkIHN5bmNocm9ub3VzbHkgKG5vdCBpbiBhbiBhc3luYyBpbml0KSBzbyBpdCBpcyBhdmFpbGFibGUgYmVmb3JlIGFueVxuICAgIC8vIGZsb3cgY29tcG9uZW50IHJlYWRzIGl0OiBhIG5lZWRzX3NlY29uZF9mYWN0b3IgcmVkaXJlY3QgY2FycmllcyBhIHN0YXR1cyBidXRcbiAgICAvLyBubyB0aWNrZXQsIGFuZCB0aGF0IGlzIHdoYXQgdGhlIDJGQSByZXN1bWUgc2VlZHMgZnJvbS5cbiAgICB0aGlzLnBlbmRpbmdBdHRlbXB0ID0gdGhpcy5pc0Jyb3dzZXIgPyB0aGlzLnJlYWRQZW5kaW5nQXR0ZW1wdCgpIDogbnVsbDtcblxuICAgIC8vIEJvb3Qgb25jZSwgYnJvd3NlciBvbmx5LiBPbiB0aGUgc2VydmVyIHRoZXJlIGlzIG5vIGNvb2tpZSBqYXIgdG8gcmVhZCBhXG4gICAgLy8gc2Vzc2lvbiBmcm9tLCBzbyB3ZSBsZWF2ZSB0aGUgc3RhdGUgYXQgYGxvYWRpbmdgIGFuZCBsZXQgaHlkcmF0aW9uIGJvb3QgaXQuXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB2b2lkIHRoaXMuYm9vdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLl9zdGF0dXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91c2VyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NsYWltcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyAtLS0gQ29uZmlndXJhdGlvbiBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgZ2V0IGFwcGVhcmFuY2UoKTogQXBwZWFyYW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlO1xuICB9XG5cbiAgZ2V0IGxvY2FsaXphdGlvbigpOiBDYXRhbG9nIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nO1xuICB9XG5cbiAgZ2V0IGZyb250ZW5kQXBpKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybDtcbiAgfVxuXG4gIC8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgYSBob3N0IGVsZW1lbnQgdG8gaW5oZXJpdC4gKi9cbiAgYXBwZWFyYW5jZVZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gY3NzVmFyaWFibGVzKHJlc29sdmVUb2tlbnModGhpcy5vcHRpb25zLmFwcGVhcmFuY2UpKTtcbiAgfVxuXG4gIC8qKiBBIGZyZXNoIHtAbGluayBGYXBpQ2xpZW50fSBmb3IgZHJpdmluZyBhIHNpZ24taW4vc2lnbi11cCBmbG93LiAqL1xuICBjcmVhdGVGYXBpQ2xpZW50KCk6IEZhcGlDbGllbnQge1xuICAgIHJldHVybiBuZXcgRmFwaUNsaWVudCh7IHB1Ymxpc2hhYmxlS2V5OiB0aGlzLnB1Ymxpc2hhYmxlS2V5LCBiYXNlVXJsOiB0aGlzLmJhc2VVcmwgfSk7XG4gIH1cblxuICAvLyAtLS0gSW1wZXJhdGl2ZSBBUEkgKG1pcnJvcnMgdGhlIFJlYWN0IGhvb2tzJyBhY3Rpb25zKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlc3Npb24ncyBKV1QsIGFsd2F5cyBmcmVzaDogaWYgdGhlIGNhY2hlZCB0b2tlbiBpcyB3aXRoaW4gNXMgb2ZcbiAgICogZXhwaXJ5IGl0IGlzIHJlZnJlc2hlZCBmaXJzdCByYXRoZXIgdGhhbiBoYW5kZWQgb3Zlci4gTnVsbCB3aGVuIHNpZ25lZCBvdXQuXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCB1c2FibGUgPSB0aGlzLmNhY2hlLmdldCg1XzAwMCk7XG4gICAgaWYgKHVzYWJsZSkgcmV0dXJuIHVzYWJsZS5qd3Q7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoNV8wMDApPy5qd3QgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmVkLWluIHVzZXIncyBPV04gbGl2ZSBhY2Nlc3MgdG9rZW4gYXQgYSBjb25uZWN0ZWQgcHJvdmlkZXIgKEdvb2dsZSxcbiAgICogR2l0SHViLCDigKYpLCBzbyB0aGUgYXBwIGNhbiBjYWxsIHRoYXQgcHJvdmlkZXIncyBBUEkgZnJvbSB0aGUgYnJvd3Nlci4gTnVsbFxuICAgKiB3aGVuIHRoZXJlIGlzIG5vIHVzYWJsZSB0b2tlbiDigJQgbm8gbGlua2VkIGFjY291bnQsIG9yIHRoZSBwcm92aWRlciBncmFudGVkIC9cbiAgICoga2VwdCBub25lLiBUaGUgc2VydmVyIHJlZnJlc2hlcyBhIHN0YWxlIHRva2VuIG9uIHJlYWQ7IHRoZSByZWZyZXNoIHRva2VuIGlzXG4gICAqIG5ldmVyIGV4cG9zZWQuXG4gICAqL1xuICBnZXRQcm92aWRlclRva2VuKHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPFByb3ZpZGVyVG9rZW4gfCBudWxsPiB7XG4gICAgcmV0dXJuIGZldGNoUHJvdmlkZXJUb2tlbih0aGlzLmZhcGlDbGllbnQsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKiBJbXBlcmF0aXZlIGBoYXMoKWAg4oCUIHRoZSBzYW1lIGV2YWx1YXRpb24gYCphdGxhc1Byb3RlY3RgIHJlbmRlcnMgb24uICovXG4gIGhhcyhjb25kaXRpb246IFByb3RlY3RDb25kaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZhbHVhdGUodGhpcy5fY2xhaW1zLnZhbHVlLCBjb25kaXRpb24pLmFsbG93ZWQ7XG4gIH1cblxuICAvKiogUmV2b2tlIHRoZSBjdXJyZW50IHNlc3Npb24gc2VydmVyLXNpZGUgYW5kIGRyb3AgYWxsIGxvY2FsIGF1dGggc3RhdGUuICovXG4gIGFzeW5jIHNpZ25PdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vcmV2b2tlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB0aGlzLl91c2VyLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KG51bGwpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAob3IgYG51bGxgIGZvciB0aGUgcGVyc29uYWwgYWNjb3VudCkuIFRoZVxuICAgKiBuZXcgdG9rZW4gY2FycmllcyB0aGUgbmV3IG9yZyBjbGFpbXMsIHNvIHRoZSBhcHAncyBwZXJtaXNzaW9uIGNoZWNrcyB1cGRhdGVcbiAgICogd2l0aG91dCBhIHJlLWxvZ2luLlxuICAgKi9cbiAgYXN5bmMgc2V0QWN0aXZlT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG91Y2hgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aXZlX29yZ2FuaXphdGlvbl9pZDogb3JnYW5pemF0aW9uSWQgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuO1xuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmcgfTtcbiAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGN1cnJlbnQuc2Vzc2lvbklkKTtcbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqIFJlLXJlYWQgYC92MS9jbGllbnRgOiByZWZyZXNoIHVzZXIsIHNlc3Npb24sIG1lbWJlcnNoaXBzIGFuZCBzdGF0dXMuICovXG4gIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoJy92MS9jbGllbnQnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignYm9vdCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgc2Vzc2lvbjogQXRsYXNTZXNzaW9uIHwgbnVsbDtcbiAgICAgICAgdXNlcjogQXRsYXNVc2VyIHwgbnVsbDtcbiAgICAgICAgand0Pzogc3RyaW5nO1xuICAgICAgICBvcmdhbml6YXRpb25fbWVtYmVyc2hpcHM/OiBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghYm9keS5zZXNzaW9uIHx8ICFib2R5LnVzZXIpIHtcbiAgICAgICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfb3V0Jyk7XG4gICAgICAgIHRoaXMuX3VzZXIubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLl9jbGFpbXMubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXNlci5uZXh0KGJvZHkudXNlcik7XG4gICAgICB0aGlzLl9zZXNzaW9uLm5leHQoYm9keS5zZXNzaW9uKTtcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoYm9keS5vcmdhbml6YXRpb25fbWVtYmVyc2hpcHMgPz8gW10pO1xuICAgICAgaWYgKGJvZHkuand0KSB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGJvZHkuc2Vzc2lvbi5pZCk7XG4gICAgICB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX2luJyk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBmYWlsZWQgYm9vdCBpcyBOT1Qgc2lnbmVkLW91dC4gUmVuZGVyaW5nIGEgc2lnbi1pbiBmb3JtIGJlY2F1c2UgdGhlXG4gICAgICAvLyBuZXR3b3JrIGhpY2N1cGVkIHRocm93cyBhd2F5IGEgcGVyZmVjdGx5IGdvb2Qgc2Vzc2lvbiBhbmQgZm9yY2VzIGFcbiAgICAgIC8vIG5lZWRsZXNzIHJlLWF1dGhlbnRpY2F0aW9uLiBPbmx5IHByb21vdGUgbG9hZGluZyDihpIgc2lnbmVkX291dC5cbiAgICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgPT09ICdsb2FkaW5nJykgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gSW50ZXJuYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIMKnNi4zIHN0ZXAgMzogY29tcGxldGUgYSByZWRpcmVjdC1iYXNlZCBzaWduLWluLCB0aGVuIGJvb3QuIEFuIE9BdXRoIG9yXG4gICAqIGhvc3RlZC1wYWdlIGZsb3cgbGFuZHMgYmFjayB3aXRoIGEgb25lLXRpbWUgdGlja2V0IGluIHRoZSBVUkw7IGV4Y2hhbmdlIGl0XG4gICAqIGZvciBjb29raWVzLCBzY3J1YiB0aGUgVVJMIHNvIGEgcmVsb2FkIGNhbm5vdCByZXBsYXkgaXQsIFRIRU4gcmVhZCB0aGVcbiAgICogc2Vzc2lvbi4gQSByZWRpcmVjdCBjYXJyeWluZyBvbmx5IGEgc3RhdHVzIChhIHNlY29uZCBmYWN0b3IgaXMgc3RpbGwgb3dlZClcbiAgICogaGFzIG5vIHRpY2tldCwgc28gbm90aGluZyBpcyBleGNoYW5nZWQgYW5kIHRoZSBhcHAgYm9vdHMgc2lnbmVkLW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBpZiAocmVzdWx0Py50aWNrZXQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdHRlbXB0X2lkOiByZXN1bHQuYXR0ZW1wdElkLCB0aWNrZXQ6IHJlc3VsdC50aWNrZXQgfSksXG4gICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCBzdHJpcFJlZGlyZWN0UGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQZW5kaW5nQXR0ZW1wdCgpOiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBjb25zdCByZXN1bHQgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHJlc3VsdD8uc3RhdHVzICYmICFyZXN1bHQudGlja2V0XG4gICAgICA/IHsgaWQ6IHJlc3VsdC5hdHRlbXB0SWQsIHN0YXR1czogcmVzdWx0LnN0YXR1cyB9XG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNhbGwocGF0aDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZG9GZXRjaChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWAsIHtcbiAgICAgIC4uLmluaXQsXG4gICAgICAvLyBDb29raWVzIGNhcnJ5IHRoZSBzZXNzaW9uOyBhIHJlcXVlc3Qgd2l0aG91dCB0aGlzIGlzIGluZGlzdGluZ3Vpc2hhYmxlXG4gICAgICAvLyBmcm9tIGJlaW5nIHNpZ25lZCBvdXQuXG4gICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAneC1wdWJsaXNoYWJsZS1rZXknOiB0aGlzLnB1Ymxpc2hhYmxlS2V5LFxuICAgICAgICAuLi4oaW5pdD8uYm9keSA/IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9IDoge30pLFxuICAgICAgICAuLi5pbml0Py5oZWFkZXJzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUb2tlbihqd3Q6IHN0cmluZywgc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSByZWFkRXhwaXJ5KGp3dCk7XG4gICAgaWYgKCFleHBpcmVzQXQpIHJldHVybjtcblxuICAgIHRoaXMuY2FjaGUuc2V0KHsgand0LCBleHBpcmVzQXQsIHNlc3Npb25JZCB9KTtcbiAgICB0aGlzLl9jbGFpbXMubmV4dChkZWNvZGVDbGFpbXMoand0KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKGAvdjEvY2xpZW50L3Nlc3Npb25zLyR7Y3VycmVudC5zZXNzaW9uSWR9L3Rva2Vuc2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcigncmVmcmVzaCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmc7IHNlc3Npb25faWQ6IHN0cmluZyB9O1xuICAgICAgdGhpcy5hcHBseVRva2VuKGJvZHkuand0LCBib2R5LnNlc3Npb25faWQpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlZnJlc2goKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzZXNzaW9uIG1heSBnZW51aW5lbHkgYmUgZ29uZS4gUmUtYm9vdCByYXRoZXIgdGhhbiBndWVzcy5cbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIMKnNy40OiBwcm9hY3RpdmUsIGppdHRlcmVkIHJlZnJlc2ggc2NoZWR1bGVkIGZyb20gdGhlIHRva2VuJ3Mgb3duIGV4cGlyeS4gKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgIT09ICdzaWduZWRfaW4nKSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghdG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IGRlbGF5ID0gbXNVbnRpbFJlZnJlc2goeyB0b2tlbiwgbm93OiBEYXRlLm5vdygpIH0pO1xuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucmVmcmVzaCgpLCBkZWxheSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIERlY29kZSBhIEpXVCBwYXlsb2FkIHdpdGhvdXQgdmVyaWZ5aW5nIGl0IOKAlCBhIHNjaGVkdWxpbmcvVUkgaGludCBvbmx5LiAqL1xuZnVuY3Rpb24gZGVjb2RlQ2xhaW1zKGp3dDogc3RyaW5nKTogU2Vzc2lvbkNsYWltcyB8IG51bGwge1xuICBjb25zdCBwYXJ0cyA9IGp3dC5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgIGF0b2IocGFydHNbMV0hLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLFxuICAgICkgYXMgU2Vzc2lvbkNsYWltcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
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=
@@ -1,4 +1,6 @@
1
- import { Directive, ElementRef, Renderer2, RendererStyleFlags2, inject, } from '@angular/core';
1
+ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
2
+ import { Directive, ElementRef, PLATFORM_ID, Renderer2, inject } from '@angular/core';
3
+ import { applyAppearanceToDom } from '@atlasauth/design/runtime';
2
4
  import { AtlasService } from '../atlas.service';
3
5
  import * as i0 from "@angular/core";
4
6
  /**
@@ -16,18 +18,29 @@ import * as i0 from "@angular/core";
16
18
  * <router-outlet></router-outlet>
17
19
  * </div>
18
20
  * ```
21
+ *
22
+ * With a design (a code-level `appearance.preset` / `appearance.design`, or
23
+ * the dashboard design, fetched in the browser) the host also gets the stable
24
+ * `data-atlas-*` attributes and the design stylesheet is added to `<head>` once.
19
25
  */
20
26
  export class AtlasRootDirective {
21
27
  atlas = inject(AtlasService);
22
28
  el = inject(ElementRef);
23
29
  renderer = inject(Renderer2);
30
+ document = inject(DOCUMENT);
31
+ platformId = inject(PLATFORM_ID);
24
32
  ngOnInit() {
25
- this.renderer.addClass(this.el.nativeElement, 'atlas-root');
26
- const vars = this.atlas.appearanceVariables();
27
- for (const [name, value] of Object.entries(vars)) {
28
- // DashCase so a `--atlas-*` custom property is written verbatim, not camelCased.
29
- this.renderer.setStyle(this.el.nativeElement, name, value, RendererStyleFlags2.DashCase);
30
- }
33
+ const host = this.el.nativeElement;
34
+ this.renderer.addClass(host, 'atlas-root');
35
+ // Custom properties via `style.setProperty` (written verbatim, never camelCased).
36
+ let applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender());
37
+ if (!isPlatformBrowser(this.platformId))
38
+ return;
39
+ void this.atlas.loadInstanceDesign().then((design) => {
40
+ if (!design)
41
+ return;
42
+ applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender(design), applied);
43
+ });
31
44
  }
32
45
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasRootDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
33
46
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AtlasRootDirective, isStandalone: true, selector: "[atlasRoot]", ngImport: i0 });
@@ -39,4 +52,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
39
52
  standalone: true,
40
53
  }]
41
54
  }] });
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMtcm9vdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvYXRsYXMtcm9vdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBRVYsU0FBUyxFQUNULG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUVoRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QixFQUFFLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztJQUNqRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxpRkFBaUY7WUFDakYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRixDQUFDO0lBQ0gsQ0FBQzt3R0FaVSxrQkFBa0I7NEZBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFKOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJTdHlsZUZsYWdzMixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuXG4vKipcbiAqIGBhdGxhc1Jvb3RgIOKAlCBhcHBseSB0aGUgcmVzb2x2ZWQgYXBwZWFyYW5jZSBkZXNpZ24gdG9rZW5zIGFzIGAtLWF0bGFzLSpgIENTU1xuICogY3VzdG9tIHByb3BlcnRpZXMgKGFuZCB0aGUgYGF0bGFzLXJvb3RgIGNsYXNzKSBvbnRvIGl0cyBob3N0IGVsZW1lbnQsIHNvIHRoZVxuICogQXRsYXMgY29tcG9uZW50cyByZW5kZXJlZCBpbnNpZGUgaW5oZXJpdCB0aGVtLlxuICpcbiAqIFJlYWN0IGRvZXMgdGhpcyB3aXRoIHRoZSB3cmFwcGluZyBgPGRpdiBjbGFzc05hbWU9XCJhdGxhcy1yb290XCIgc3R5bGU9e+KApn0+YFxuICogaW5zaWRlIGA8QXRsYXNQcm92aWRlcj5gLiBBbmd1bGFyIGhhcyBubyBzaW5nbGUgd3JhcHBpbmcgZWxlbWVudCwgc28gYVxuICogY29uc3VtZXIgb3B0cyBpbiBieSBwdXR0aW5nIGBhdGxhc1Jvb3RgIG9uIHdoYXRldmVyIGVsZW1lbnQgZW5jbG9zZXMgdGhlXG4gKiBBdGxhcyBVSSAoY29tbW9ubHkgdGhlIGFwcCByb290KTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGF0bGFzUm9vdD5cbiAqICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2F0bGFzUm9vdF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBBdGxhc1Jvb3REaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhdGxhcy1yb290Jyk7XG4gICAgY29uc3QgdmFycyA9IHRoaXMuYXRsYXMuYXBwZWFyYW5jZVZhcmlhYmxlcygpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJzKSkge1xuICAgICAgLy8gRGFzaENhc2Ugc28gYSBgLS1hdGxhcy0qYCBjdXN0b20gcHJvcGVydHkgaXMgd3JpdHRlbiB2ZXJiYXRpbSwgbm90IGNhbWVsQ2FzZWQuXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgbmFtZSwgdmFsdWUsIFJlbmRlcmVyU3R5bGVGbGFnczIuRGFzaENhc2UpO1xuICAgIH1cbiAgfVxufVxuIl19
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMtcm9vdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvYXRsYXMtcm9vdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFVLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFLSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QixFQUFFLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztJQUNqRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVsRCxRQUFRO1FBQ04sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNDLGtGQUFrRjtRQUNsRixJQUFJLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFDaEQsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkQsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUNwQixPQUFPLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBakJVLGtCQUFrQjs0RkFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUo5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIFBMQVRGT1JNX0lELCBSZW5kZXJlcjIsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYXBwbHlBcHBlYXJhbmNlVG9Eb20gfSBmcm9tICdAYXRsYXNhdXRoL2Rlc2lnbi9ydW50aW1lJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuXG4vKipcbiAqIGBhdGxhc1Jvb3RgIOKAlCBhcHBseSB0aGUgcmVzb2x2ZWQgYXBwZWFyYW5jZSBkZXNpZ24gdG9rZW5zIGFzIGAtLWF0bGFzLSpgIENTU1xuICogY3VzdG9tIHByb3BlcnRpZXMgKGFuZCB0aGUgYGF0bGFzLXJvb3RgIGNsYXNzKSBvbnRvIGl0cyBob3N0IGVsZW1lbnQsIHNvIHRoZVxuICogQXRsYXMgY29tcG9uZW50cyByZW5kZXJlZCBpbnNpZGUgaW5oZXJpdCB0aGVtLlxuICpcbiAqIFJlYWN0IGRvZXMgdGhpcyB3aXRoIHRoZSB3cmFwcGluZyBgPGRpdiBjbGFzc05hbWU9XCJhdGxhcy1yb290XCIgc3R5bGU9e+KApn0+YFxuICogaW5zaWRlIGA8QXRsYXNQcm92aWRlcj5gLiBBbmd1bGFyIGhhcyBubyBzaW5nbGUgd3JhcHBpbmcgZWxlbWVudCwgc28gYVxuICogY29uc3VtZXIgb3B0cyBpbiBieSBwdXR0aW5nIGBhdGxhc1Jvb3RgIG9uIHdoYXRldmVyIGVsZW1lbnQgZW5jbG9zZXMgdGhlXG4gKiBBdGxhcyBVSSAoY29tbW9ubHkgdGhlIGFwcCByb290KTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGF0bGFzUm9vdD5cbiAqICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBXaXRoIGEgZGVzaWduIChhIGNvZGUtbGV2ZWwgYGFwcGVhcmFuY2UucHJlc2V0YCAvIGBhcHBlYXJhbmNlLmRlc2lnbmAsIG9yXG4gKiB0aGUgZGFzaGJvYXJkIGRlc2lnbiwgZmV0Y2hlZCBpbiB0aGUgYnJvd3NlcikgdGhlIGhvc3QgYWxzbyBnZXRzIHRoZSBzdGFibGVcbiAqIGBkYXRhLWF0bGFzLSpgIGF0dHJpYnV0ZXMgYW5kIHRoZSBkZXNpZ24gc3R5bGVzaGVldCBpcyBhZGRlZCB0byBgPGhlYWQ+YCBvbmNlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYXRsYXNSb290XScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEF0bGFzUm9vdERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXRsYXMgPSBpbmplY3QoQXRsYXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGhvc3QsICdhdGxhcy1yb290Jyk7XG4gICAgLy8gQ3VzdG9tIHByb3BlcnRpZXMgdmlhIGBzdHlsZS5zZXRQcm9wZXJ0eWAgKHdyaXR0ZW4gdmVyYmF0aW0sIG5ldmVyIGNhbWVsQ2FzZWQpLlxuICAgIGxldCBhcHBsaWVkID0gYXBwbHlBcHBlYXJhbmNlVG9Eb20odGhpcy5kb2N1bWVudCwgaG9zdCwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlUmVuZGVyKCkpO1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5hdGxhcy5sb2FkSW5zdGFuY2VEZXNpZ24oKS50aGVuKChkZXNpZ24pID0+IHtcbiAgICAgIGlmICghZGVzaWduKSByZXR1cm47XG4gICAgICBhcHBsaWVkID0gYXBwbHlBcHBlYXJhbmNlVG9Eb20odGhpcy5kb2N1bWVudCwgaG9zdCwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlUmVuZGVyKGRlc2lnbiksIGFwcGxpZWQpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=