@memberjunction/ng-bootstrap 0.0.1 → 3.1.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,45 +1,240 @@
1
1
  # @memberjunction/ng-bootstrap
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
3
+ MemberJunction 3.0 Angular Bootstrap - Encapsulates all Angular authentication and initialization logic into a reusable module.
4
4
 
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
5
+ ## Overview
6
6
 
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
7
+ In MemberJunction 3.0, Angular applications (MJExplorer) become **minimal configuration files** (~15-20 lines) that import all functionality from NPM packages. This package provides the `MJBootstrapModule` and `MJBootstrapComponent` that handle all authentication, GraphQL setup, and application initialization.
8
8
 
9
- ## Purpose
9
+ ## Installation
10
10
 
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@memberjunction/ng-bootstrap`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
11
+ ```bash
12
+ npm install @memberjunction/ng-bootstrap
13
+ ```
15
14
 
16
- ## What is OIDC Trusted Publishing?
15
+ ## Usage
17
16
 
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
17
+ ### Basic Usage (Minimal MJExplorer 3.0)
19
18
 
20
- ## Setup Instructions
19
+ Create your `packages/explorer/src/app/app.module.ts`:
21
20
 
22
- To properly configure OIDC trusted publishing for this package:
21
+ ```typescript
22
+ import { NgModule } from '@angular/core';
23
+ import { BrowserModule } from '@angular/platform-browser';
24
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
23
25
 
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
26
+ import { MJBootstrapModule, MJBootstrapComponent } from '@memberjunction/ng-bootstrap';
27
+ import { MJExplorerModule } from '@memberjunction/ng-explorer-core';
28
+ import { CoreGeneratedFormsModule } from '@memberjunction/ng-core-entity-forms';
29
+ import { GeneratedFormsModule } from '@mycompany/generated-forms';
28
30
 
29
- ## DO NOT USE THIS PACKAGE
31
+ import { environment } from '../environments/environment';
30
32
 
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
33
+ @NgModule({
34
+ imports: [
35
+ BrowserModule,
36
+ BrowserAnimationsModule,
37
+ MJBootstrapModule.forRoot(environment),
38
+ MJExplorerModule,
39
+ CoreGeneratedFormsModule,
40
+ GeneratedFormsModule
41
+ ],
42
+ bootstrap: [MJBootstrapComponent] // Use MJBootstrapComponent as the bootstrap component
43
+ })
44
+ export class AppModule {}
45
+ ```
36
46
 
37
- ## More Information
47
+ **That's it!** Your entire MJExplorer application module in ~15 lines.
38
48
 
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
49
+ ### Environment Configuration
42
50
 
43
- ---
51
+ Create your `packages/explorer/src/environments/environment.ts`:
44
52
 
45
- **Maintained for OIDC setup purposes only**
53
+ ```typescript
54
+ import { MJEnvironmentConfig } from '@memberjunction/ng-bootstrap';
55
+
56
+ export const environment: MJEnvironmentConfig = {
57
+ production: false,
58
+ GRAPHQL_URI: 'http://localhost:4000/graphql',
59
+ GRAPHQL_WS_URI: 'ws://localhost:4000/graphql',
60
+ AUTH_TYPE: 'msal',
61
+ MJ_CORE_SCHEMA_NAME: '__mj',
62
+
63
+ // MSAL configuration
64
+ CLIENT_ID: 'your-client-id',
65
+ TENANT_ID: 'your-tenant-id'
66
+
67
+ // OR Auth0 configuration
68
+ // AUTH0_DOMAIN: 'yourapp.us.auth0.com',
69
+ // AUTH0_CLIENTID: 'your-auth0-client-id'
70
+ };
71
+ ```
72
+
73
+ ## What It Does
74
+
75
+ The `MJBootstrapModule` and `MJBootstrapComponent` handle:
76
+
77
+ 1. **Authentication Flow** - MSAL or Auth0 login/logout with proper token management
78
+ 2. **GraphQL Client Setup** - Configures GraphQL client with WebSocket support
79
+ 3. **Token Refresh** - Automatic token refresh before expiration
80
+ 4. **Metadata Loading** - Loads MemberJunction metadata and entity definitions
81
+ 5. **User Validation** - Checks user access and permissions
82
+ 6. **Error Handling** - Displays appropriate error messages for auth failures
83
+ 7. **Startup Validation** - Runs system validation checks on initialization
84
+ 8. **Navigation** - Handles initial navigation after successful login
85
+
86
+ ## Component Structure
87
+
88
+ The bootstrap component provides a clean template structure:
89
+
90
+ ```html
91
+ <mj-bootstrap>
92
+ <!-- Authenticated: Shows the main shell -->
93
+ <mj-shell *ngIf="authenticated"></mj-shell>
94
+
95
+ <!-- Not authenticated: Shows login screen -->
96
+ <mj-login *ngIf="!authenticated"></mj-login>
97
+
98
+ <!-- Error state: Shows error message -->
99
+ <mj-error *ngIf="hasError"></mj-error>
100
+
101
+ <!-- Validation issues: Shows validation banner -->
102
+ <mj-validation-banner *ngIf="showValidation"></mj-validation-banner>
103
+ </mj-bootstrap>
104
+ ```
105
+
106
+ ## API Reference
107
+
108
+ ### `MJBootstrapModule.forRoot(environment: MJEnvironmentConfig)`
109
+
110
+ Configures the bootstrap module with environment settings.
111
+
112
+ #### Parameters
113
+
114
+ - `environment` - MJEnvironmentConfig object with application settings
115
+
116
+ #### Returns
117
+
118
+ ModuleWithProviders with environment configuration injected
119
+
120
+ ### `MJEnvironmentConfig` Interface
121
+
122
+ ```typescript
123
+ interface MJEnvironmentConfig {
124
+ production: boolean;
125
+ GRAPHQL_URI: string;
126
+ GRAPHQL_WS_URI: string;
127
+ AUTH_TYPE: 'msal' | 'auth0';
128
+ MJ_CORE_SCHEMA_NAME: string;
129
+
130
+ // MSAL-specific (optional)
131
+ CLIENT_ID?: string;
132
+ TENANT_ID?: string;
133
+
134
+ // Auth0-specific (optional)
135
+ AUTH0_DOMAIN?: string;
136
+ AUTH0_CLIENTID?: string;
137
+
138
+ // Additional custom properties
139
+ [key: string]: any;
140
+ }
141
+ ```
142
+
143
+ ## Migration from 2.x
144
+
145
+ In MemberJunction 2.x, your MJExplorer had:
146
+ - `app.component.ts` with ~245 lines of authentication logic
147
+ - `app.module.ts` with ~107 lines of module imports and configuration
148
+
149
+ **Before (2.x):**
150
+ ```typescript
151
+ // app.component.ts - 245 lines of auth/initialization code
152
+ @Component({...})
153
+ export class AppComponent implements OnInit {
154
+ // Complex authentication logic
155
+ // GraphQL setup
156
+ // Error handling
157
+ // Navigation logic
158
+ // ...
159
+ }
160
+
161
+ // app.module.ts - 107 lines of imports and configuration
162
+ @NgModule({
163
+ declarations: [AppComponent, ...],
164
+ imports: [BrowserModule, ...many modules...],
165
+ providers: [...many providers...],
166
+ bootstrap: [AppComponent]
167
+ })
168
+ export class AppModule {}
169
+ ```
170
+
171
+ **After (3.0):**
172
+ ```typescript
173
+ // app.module.ts - ~15 lines total
174
+ @NgModule({
175
+ imports: [
176
+ BrowserModule,
177
+ BrowserAnimationsModule,
178
+ MJBootstrapModule.forRoot(environment),
179
+ MJExplorerModule,
180
+ GeneratedFormsModule
181
+ ],
182
+ bootstrap: [MJBootstrapComponent]
183
+ })
184
+ export class AppModule {}
185
+ ```
186
+
187
+ All the complexity is now encapsulated in this package and updated via NPM.
188
+
189
+ ## Advanced Usage
190
+
191
+ ### Custom Error Handling
192
+
193
+ You can extend the bootstrap component to add custom error handling:
194
+
195
+ ```typescript
196
+ import { MJBootstrapComponent } from '@memberjunction/ng-bootstrap';
197
+
198
+ @Component({
199
+ selector: 'app-custom-bootstrap',
200
+ template: `
201
+ <mj-bootstrap></mj-bootstrap>
202
+ <app-custom-error *ngIf="hasCustomError"></app-custom-error>
203
+ `
204
+ })
205
+ export class CustomBootstrapComponent extends MJBootstrapComponent {
206
+ // Add custom logic
207
+ }
208
+ ```
209
+
210
+ ### Multiple Auth Providers
211
+
212
+ Configure your environment to support both MSAL and Auth0:
213
+
214
+ ```typescript
215
+ export const environment: MJEnvironmentConfig = {
216
+ production: false,
217
+ AUTH_TYPE: 'msal', // Default
218
+
219
+ // MSAL config
220
+ CLIENT_ID: 'msal-client-id',
221
+ TENANT_ID: 'tenant-id',
222
+
223
+ // Auth0 config (fallback)
224
+ AUTH0_DOMAIN: 'yourapp.us.auth0.com',
225
+ AUTH0_CLIENTID: 'auth0-client-id'
226
+ };
227
+ ```
228
+
229
+ ## Benefits
230
+
231
+ - **Zero-copy updates** - `npm update` brings all improvements automatically
232
+ - **No stale code** - Authentication logic stays up-to-date with MJ releases
233
+ - **Minimal surface area** - Fewer lines of code means fewer places for bugs
234
+ - **Standard patterns** - Everyone uses the same authentication flow
235
+ - **Type safety** - Full TypeScript support with proper interfaces
236
+ - **Tested** - Core authentication logic is tested across all MJ applications
237
+
238
+ ## License
239
+
240
+ MIT
package/dist/README.md ADDED
@@ -0,0 +1,240 @@
1
+ # @memberjunction/ng-bootstrap
2
+
3
+ MemberJunction 3.0 Angular Bootstrap - Encapsulates all Angular authentication and initialization logic into a reusable module.
4
+
5
+ ## Overview
6
+
7
+ In MemberJunction 3.0, Angular applications (MJExplorer) become **minimal configuration files** (~15-20 lines) that import all functionality from NPM packages. This package provides the `MJBootstrapModule` and `MJBootstrapComponent` that handle all authentication, GraphQL setup, and application initialization.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @memberjunction/ng-bootstrap
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ### Basic Usage (Minimal MJExplorer 3.0)
18
+
19
+ Create your `packages/explorer/src/app/app.module.ts`:
20
+
21
+ ```typescript
22
+ import { NgModule } from '@angular/core';
23
+ import { BrowserModule } from '@angular/platform-browser';
24
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
25
+
26
+ import { MJBootstrapModule, MJBootstrapComponent } from '@memberjunction/ng-bootstrap';
27
+ import { MJExplorerModule } from '@memberjunction/ng-explorer-core';
28
+ import { CoreGeneratedFormsModule } from '@memberjunction/ng-core-entity-forms';
29
+ import { GeneratedFormsModule } from '@mycompany/generated-forms';
30
+
31
+ import { environment } from '../environments/environment';
32
+
33
+ @NgModule({
34
+ imports: [
35
+ BrowserModule,
36
+ BrowserAnimationsModule,
37
+ MJBootstrapModule.forRoot(environment),
38
+ MJExplorerModule,
39
+ CoreGeneratedFormsModule,
40
+ GeneratedFormsModule
41
+ ],
42
+ bootstrap: [MJBootstrapComponent] // Use MJBootstrapComponent as the bootstrap component
43
+ })
44
+ export class AppModule {}
45
+ ```
46
+
47
+ **That's it!** Your entire MJExplorer application module in ~15 lines.
48
+
49
+ ### Environment Configuration
50
+
51
+ Create your `packages/explorer/src/environments/environment.ts`:
52
+
53
+ ```typescript
54
+ import { MJEnvironmentConfig } from '@memberjunction/ng-bootstrap';
55
+
56
+ export const environment: MJEnvironmentConfig = {
57
+ production: false,
58
+ GRAPHQL_URI: 'http://localhost:4000/graphql',
59
+ GRAPHQL_WS_URI: 'ws://localhost:4000/graphql',
60
+ AUTH_TYPE: 'msal',
61
+ MJ_CORE_SCHEMA_NAME: '__mj',
62
+
63
+ // MSAL configuration
64
+ CLIENT_ID: 'your-client-id',
65
+ TENANT_ID: 'your-tenant-id'
66
+
67
+ // OR Auth0 configuration
68
+ // AUTH0_DOMAIN: 'yourapp.us.auth0.com',
69
+ // AUTH0_CLIENTID: 'your-auth0-client-id'
70
+ };
71
+ ```
72
+
73
+ ## What It Does
74
+
75
+ The `MJBootstrapModule` and `MJBootstrapComponent` handle:
76
+
77
+ 1. **Authentication Flow** - MSAL or Auth0 login/logout with proper token management
78
+ 2. **GraphQL Client Setup** - Configures GraphQL client with WebSocket support
79
+ 3. **Token Refresh** - Automatic token refresh before expiration
80
+ 4. **Metadata Loading** - Loads MemberJunction metadata and entity definitions
81
+ 5. **User Validation** - Checks user access and permissions
82
+ 6. **Error Handling** - Displays appropriate error messages for auth failures
83
+ 7. **Startup Validation** - Runs system validation checks on initialization
84
+ 8. **Navigation** - Handles initial navigation after successful login
85
+
86
+ ## Component Structure
87
+
88
+ The bootstrap component provides a clean template structure:
89
+
90
+ ```html
91
+ <mj-bootstrap>
92
+ <!-- Authenticated: Shows the main shell -->
93
+ <mj-shell *ngIf="authenticated"></mj-shell>
94
+
95
+ <!-- Not authenticated: Shows login screen -->
96
+ <mj-login *ngIf="!authenticated"></mj-login>
97
+
98
+ <!-- Error state: Shows error message -->
99
+ <mj-error *ngIf="hasError"></mj-error>
100
+
101
+ <!-- Validation issues: Shows validation banner -->
102
+ <mj-validation-banner *ngIf="showValidation"></mj-validation-banner>
103
+ </mj-bootstrap>
104
+ ```
105
+
106
+ ## API Reference
107
+
108
+ ### `MJBootstrapModule.forRoot(environment: MJEnvironmentConfig)`
109
+
110
+ Configures the bootstrap module with environment settings.
111
+
112
+ #### Parameters
113
+
114
+ - `environment` - MJEnvironmentConfig object with application settings
115
+
116
+ #### Returns
117
+
118
+ ModuleWithProviders with environment configuration injected
119
+
120
+ ### `MJEnvironmentConfig` Interface
121
+
122
+ ```typescript
123
+ interface MJEnvironmentConfig {
124
+ production: boolean;
125
+ GRAPHQL_URI: string;
126
+ GRAPHQL_WS_URI: string;
127
+ AUTH_TYPE: 'msal' | 'auth0';
128
+ MJ_CORE_SCHEMA_NAME: string;
129
+
130
+ // MSAL-specific (optional)
131
+ CLIENT_ID?: string;
132
+ TENANT_ID?: string;
133
+
134
+ // Auth0-specific (optional)
135
+ AUTH0_DOMAIN?: string;
136
+ AUTH0_CLIENTID?: string;
137
+
138
+ // Additional custom properties
139
+ [key: string]: any;
140
+ }
141
+ ```
142
+
143
+ ## Migration from 2.x
144
+
145
+ In MemberJunction 2.x, your MJExplorer had:
146
+ - `app.component.ts` with ~245 lines of authentication logic
147
+ - `app.module.ts` with ~107 lines of module imports and configuration
148
+
149
+ **Before (2.x):**
150
+ ```typescript
151
+ // app.component.ts - 245 lines of auth/initialization code
152
+ @Component({...})
153
+ export class AppComponent implements OnInit {
154
+ // Complex authentication logic
155
+ // GraphQL setup
156
+ // Error handling
157
+ // Navigation logic
158
+ // ...
159
+ }
160
+
161
+ // app.module.ts - 107 lines of imports and configuration
162
+ @NgModule({
163
+ declarations: [AppComponent, ...],
164
+ imports: [BrowserModule, ...many modules...],
165
+ providers: [...many providers...],
166
+ bootstrap: [AppComponent]
167
+ })
168
+ export class AppModule {}
169
+ ```
170
+
171
+ **After (3.0):**
172
+ ```typescript
173
+ // app.module.ts - ~15 lines total
174
+ @NgModule({
175
+ imports: [
176
+ BrowserModule,
177
+ BrowserAnimationsModule,
178
+ MJBootstrapModule.forRoot(environment),
179
+ MJExplorerModule,
180
+ GeneratedFormsModule
181
+ ],
182
+ bootstrap: [MJBootstrapComponent]
183
+ })
184
+ export class AppModule {}
185
+ ```
186
+
187
+ All the complexity is now encapsulated in this package and updated via NPM.
188
+
189
+ ## Advanced Usage
190
+
191
+ ### Custom Error Handling
192
+
193
+ You can extend the bootstrap component to add custom error handling:
194
+
195
+ ```typescript
196
+ import { MJBootstrapComponent } from '@memberjunction/ng-bootstrap';
197
+
198
+ @Component({
199
+ selector: 'app-custom-bootstrap',
200
+ template: `
201
+ <mj-bootstrap></mj-bootstrap>
202
+ <app-custom-error *ngIf="hasCustomError"></app-custom-error>
203
+ `
204
+ })
205
+ export class CustomBootstrapComponent extends MJBootstrapComponent {
206
+ // Add custom logic
207
+ }
208
+ ```
209
+
210
+ ### Multiple Auth Providers
211
+
212
+ Configure your environment to support both MSAL and Auth0:
213
+
214
+ ```typescript
215
+ export const environment: MJEnvironmentConfig = {
216
+ production: false,
217
+ AUTH_TYPE: 'msal', // Default
218
+
219
+ // MSAL config
220
+ CLIENT_ID: 'msal-client-id',
221
+ TENANT_ID: 'tenant-id',
222
+
223
+ // Auth0 config (fallback)
224
+ AUTH0_DOMAIN: 'yourapp.us.auth0.com',
225
+ AUTH0_CLIENTID: 'auth0-client-id'
226
+ };
227
+ ```
228
+
229
+ ## Benefits
230
+
231
+ - **Zero-copy updates** - `npm update` brings all improvements automatically
232
+ - **No stale code** - Authentication logic stays up-to-date with MJ releases
233
+ - **Minimal surface area** - Fewer lines of code means fewer places for bugs
234
+ - **Standard patterns** - Everyone uses the same authentication flow
235
+ - **Type safety** - Full TypeScript support with proper interfaces
236
+ - **Tested** - Core authentication logic is tested across all MJ applications
237
+
238
+ ## License
239
+
240
+ MIT
@@ -0,0 +1,38 @@
1
+ /**
2
+ * MemberJunction 3.0 Bootstrap Component
3
+ *
4
+ * Minimal placeholder component for future fully encapsulated bootstrap.
5
+ * Currently applications should use MJInitializationService directly in their app.component.
6
+ */
7
+ import { Component, Inject } from '@angular/core';
8
+ import { SetProductionStatus } from '@memberjunction/core';
9
+ import { MJ_ENVIRONMENT } from './bootstrap.types';
10
+ import * as i0 from "@angular/core";
11
+ export class MJBootstrapComponent {
12
+ environment;
13
+ constructor(environment) {
14
+ this.environment = environment;
15
+ }
16
+ ngOnInit() {
17
+ console.log('🚀 MemberJunction 3.0 Bootstrap');
18
+ SetProductionStatus(this.environment.production);
19
+ }
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapComponent, deps: [{ token: MJ_ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
21
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MJBootstrapComponent, selector: "mj-bootstrap", ngImport: i0, template: `
22
+ <div class="mj-bootstrap-container">
23
+ <ng-content></ng-content>
24
+ </div>
25
+ `, isInline: true, styles: [".mj-bootstrap-container{display:block;width:100%;height:100%}\n"] });
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapComponent, decorators: [{
28
+ type: Component,
29
+ args: [{ selector: 'mj-bootstrap', template: `
30
+ <div class="mj-bootstrap-container">
31
+ <ng-content></ng-content>
32
+ </div>
33
+ `, styles: [".mj-bootstrap-container{display:block;width:100%;height:100%}\n"] }]
34
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
35
+ type: Inject,
36
+ args: [MJ_ENVIRONMENT]
37
+ }] }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYm9vdHN0cmFwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBdUIsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBaUJ4RSxNQUFNLE9BQU8sb0JBQW9CO0lBRUc7SUFEbEMsWUFDa0MsV0FBZ0M7UUFBaEMsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO0lBQy9ELENBQUM7SUFFSixRQUFRO1FBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9DLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0FSVSxvQkFBb0Isa0JBRXJCLGNBQWM7NEZBRmIsb0JBQW9CLG9EQWJyQjs7OztHQUlUOzs0RkFTVSxvQkFBb0I7a0JBZmhDLFNBQVM7K0JBQ0UsY0FBYyxZQUNkOzs7O0dBSVQ7OzBCQVdFLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtYmVySnVuY3Rpb24gMy4wIEJvb3RzdHJhcCBDb21wb25lbnRcbiAqXG4gKiBNaW5pbWFsIHBsYWNlaG9sZGVyIGNvbXBvbmVudCBmb3IgZnV0dXJlIGZ1bGx5IGVuY2Fwc3VsYXRlZCBib290c3RyYXAuXG4gKiBDdXJyZW50bHkgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgTUpJbml0aWFsaXphdGlvblNlcnZpY2UgZGlyZWN0bHkgaW4gdGhlaXIgYXBwLmNvbXBvbmVudC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXRQcm9kdWN0aW9uU3RhdHVzIH0gZnJvbSAnQG1lbWJlcmp1bmN0aW9uL2NvcmUnO1xuaW1wb3J0IHsgTUpFbnZpcm9ubWVudENvbmZpZywgTUpfRU5WSVJPTk1FTlQgfSBmcm9tICcuL2Jvb3RzdHJhcC50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21qLWJvb3RzdHJhcCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm1qLWJvb3RzdHJhcC1jb250YWluZXJcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5tai1ib290c3RyYXAtY29udGFpbmVyIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBNSkJvb3RzdHJhcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTUpfRU5WSVJPTk1FTlQpIHByaXZhdGUgZW52aXJvbm1lbnQ6IE1KRW52aXJvbm1lbnRDb25maWdcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnNvbGUubG9nKCfwn5qAIE1lbWJlckp1bmN0aW9uIDMuMCBCb290c3RyYXAnKTtcbiAgICBTZXRQcm9kdWN0aW9uU3RhdHVzKHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,98 @@
1
+ /**
2
+ * MemberJunction 3.0 Bootstrap Module
3
+ *
4
+ * Provides the MJBootstrapComponent and all necessary services for MemberJunction Angular applications.
5
+ * This module encapsulates all the authentication and initialization logic that was previously
6
+ * spread across app.component.ts and app.module.ts.
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * import { LoadGeneratedEntities } from 'mj_generatedentities';
11
+ * LoadGeneratedEntities(); // Prevent tree shaking
12
+ *
13
+ * @NgModule({
14
+ * imports: [
15
+ * BrowserModule,
16
+ * BrowserAnimationsModule,
17
+ * MJBootstrapModule.forRoot(environment),
18
+ * // ... other MJ modules
19
+ * ],
20
+ * bootstrap: [AppComponent]
21
+ * })
22
+ * export class AppModule {}
23
+ * ```
24
+ */
25
+ import { NgModule, APP_INITIALIZER } from '@angular/core';
26
+ import { CommonModule } from '@angular/common';
27
+ import { MJBootstrapComponent } from './bootstrap.component';
28
+ import { MJAuthShellComponent } from './components/auth-shell.component';
29
+ import { MJ_ENVIRONMENT } from './bootstrap.types';
30
+ import { MJAuthBase } from '@memberjunction/ng-auth-services';
31
+ import * as i0 from "@angular/core";
32
+ /**
33
+ * Initialize auth provider before Angular routing starts
34
+ * This ensures auth providers can process OAuth redirect responses before Angular's router
35
+ * consumes the URL hash
36
+ */
37
+ export function initializeAuth(authService) {
38
+ return () => authService.initialize();
39
+ }
40
+ export class MJBootstrapModule {
41
+ /**
42
+ * Configure the bootstrap module with environment settings
43
+ *
44
+ * @param environment - Environment configuration for the application
45
+ * @returns ModuleWithProviders with environment configuration and all services
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * import { environment } from '../environments/environment';
50
+ * import { LoadGeneratedEntities } from 'mj_generatedentities';
51
+ * LoadGeneratedEntities();
52
+ *
53
+ * @NgModule({
54
+ * imports: [
55
+ * MJBootstrapModule.forRoot(environment)
56
+ * ]
57
+ * })
58
+ * export class AppModule {}
59
+ * ```
60
+ */
61
+ static forRoot(environment) {
62
+ return {
63
+ ngModule: MJBootstrapModule,
64
+ providers: [
65
+ { provide: MJ_ENVIRONMENT, useValue: environment },
66
+ // MJInitializationService uses providedIn: 'root'
67
+ {
68
+ provide: APP_INITIALIZER,
69
+ useFactory: initializeAuth,
70
+ deps: [MJAuthBase],
71
+ multi: true
72
+ }
73
+ ]
74
+ };
75
+ }
76
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
77
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, declarations: [MJBootstrapComponent,
78
+ MJAuthShellComponent], imports: [CommonModule], exports: [MJBootstrapComponent,
79
+ MJAuthShellComponent] });
80
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, imports: [CommonModule] });
81
+ }
82
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MJBootstrapModule, decorators: [{
83
+ type: NgModule,
84
+ args: [{
85
+ declarations: [
86
+ MJBootstrapComponent,
87
+ MJAuthShellComponent
88
+ ],
89
+ imports: [
90
+ CommonModule
91
+ ],
92
+ exports: [
93
+ MJBootstrapComponent,
94
+ MJAuthShellComponent
95
+ ]
96
+ }]
97
+ }] });
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYm9vdHN0cmFwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUF1QixlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXpFLE9BQU8sRUFBdUIsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOztBQUU5RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxXQUF1QjtJQUNwRCxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBZUQsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBZ0M7UUFDN0MsT0FBTztZQUNMLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsU0FBUyxFQUFFO2dCQUNULEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO2dCQUNsRCxrREFBa0Q7Z0JBQ2xEO29CQUNFLE9BQU8sRUFBRSxlQUFlO29CQUN4QixVQUFVLEVBQUUsY0FBYztvQkFDMUIsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDO29CQUNsQixLQUFLLEVBQUUsSUFBSTtpQkFDWjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7d0dBbkNVLGlCQUFpQjt5R0FBakIsaUJBQWlCLGlCQVgxQixvQkFBb0I7WUFDcEIsb0JBQW9CLGFBR3BCLFlBQVksYUFHWixvQkFBb0I7WUFDcEIsb0JBQW9CO3lHQUdYLGlCQUFpQixZQVAxQixZQUFZOzs0RkFPSCxpQkFBaUI7a0JBYjdCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3FCQUNyQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTtxQkFDYjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asb0JBQW9CO3dCQUNwQixvQkFBb0I7cUJBQ3JCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1iZXJKdW5jdGlvbiAzLjAgQm9vdHN0cmFwIE1vZHVsZVxuICpcbiAqIFByb3ZpZGVzIHRoZSBNSkJvb3RzdHJhcENvbXBvbmVudCBhbmQgYWxsIG5lY2Vzc2FyeSBzZXJ2aWNlcyBmb3IgTWVtYmVySnVuY3Rpb24gQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKiBUaGlzIG1vZHVsZSBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBhdXRoZW50aWNhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gbG9naWMgdGhhdCB3YXMgcHJldmlvdXNseVxuICogc3ByZWFkIGFjcm9zcyBhcHAuY29tcG9uZW50LnRzIGFuZCBhcHAubW9kdWxlLnRzLlxuICpcbiAqIFVzYWdlOlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgTG9hZEdlbmVyYXRlZEVudGl0aWVzIH0gZnJvbSAnbWpfZ2VuZXJhdGVkZW50aXRpZXMnO1xuICogTG9hZEdlbmVyYXRlZEVudGl0aWVzKCk7IC8vIFByZXZlbnQgdHJlZSBzaGFraW5nXG4gKlxuICogQE5nTW9kdWxlKHtcbiAqICAgaW1wb3J0czogW1xuICogICAgIEJyb3dzZXJNb2R1bGUsXG4gKiAgICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXG4gKiAgICAgTUpCb290c3RyYXBNb2R1bGUuZm9yUm9vdChlbnZpcm9ubWVudCksXG4gKiAgICAgLy8gLi4uIG90aGVyIE1KIG1vZHVsZXNcbiAqICAgXSxcbiAqICAgYm9vdHN0cmFwOiBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzLCBBUFBfSU5JVElBTElaRVIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNSkJvb3RzdHJhcENvbXBvbmVudCB9IGZyb20gJy4vYm9vdHN0cmFwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNSkF1dGhTaGVsbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRoLXNoZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvaW5pdGlhbGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBNSkVudmlyb25tZW50Q29uZmlnLCBNSl9FTlZJUk9OTUVOVCB9IGZyb20gJy4vYm9vdHN0cmFwLnR5cGVzJztcbmltcG9ydCB7IE1KQXV0aEJhc2UgfSBmcm9tICdAbWVtYmVyanVuY3Rpb24vbmctYXV0aC1zZXJ2aWNlcyc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhdXRoIHByb3ZpZGVyIGJlZm9yZSBBbmd1bGFyIHJvdXRpbmcgc3RhcnRzXG4gKiBUaGlzIGVuc3VyZXMgYXV0aCBwcm92aWRlcnMgY2FuIHByb2Nlc3MgT0F1dGggcmVkaXJlY3QgcmVzcG9uc2VzIGJlZm9yZSBBbmd1bGFyJ3Mgcm91dGVyXG4gKiBjb25zdW1lcyB0aGUgVVJMIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVBdXRoKGF1dGhTZXJ2aWNlOiBNSkF1dGhCYXNlKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiAoKSA9PiBhdXRoU2VydmljZS5pbml0aWFsaXplKCk7XG59XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIE1KQm9vdHN0cmFwQ29tcG9uZW50LFxuICAgIE1KQXV0aFNoZWxsQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIE1KQm9vdHN0cmFwQ29tcG9uZW50LFxuICAgIE1KQXV0aFNoZWxsQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTUpCb290c3RyYXBNb2R1bGUge1xuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBib290c3RyYXAgbW9kdWxlIHdpdGggZW52aXJvbm1lbnQgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIGVudmlyb25tZW50IC0gRW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uXG4gICAqIEByZXR1cm5zIE1vZHVsZVdpdGhQcm92aWRlcnMgd2l0aCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGFuZCBhbGwgc2VydmljZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG4gICAqIGltcG9ydCB7IExvYWRHZW5lcmF0ZWRFbnRpdGllcyB9IGZyb20gJ21qX2dlbmVyYXRlZGVudGl0aWVzJztcbiAgICogTG9hZEdlbmVyYXRlZEVudGl0aWVzKCk7XG4gICAqXG4gICAqIEBOZ01vZHVsZSh7XG4gICAqICAgaW1wb3J0czogW1xuICAgKiAgICAgTUpCb290c3RyYXBNb2R1bGUuZm9yUm9vdChlbnZpcm9ubWVudClcbiAgICogICBdXG4gICAqIH0pXG4gICAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgZm9yUm9vdChlbnZpcm9ubWVudDogTUpFbnZpcm9ubWVudENvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TUpCb290c3RyYXBNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE1KQm9vdHN0cmFwTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogTUpfRU5WSVJPTk1FTlQsIHVzZVZhbHVlOiBlbnZpcm9ubWVudCB9LFxuICAgICAgICAvLyBNSkluaXRpYWxpemF0aW9uU2VydmljZSB1c2VzIHByb3ZpZGVkSW46ICdyb290J1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IGluaXRpYWxpemVBdXRoLFxuICAgICAgICAgIGRlcHM6IFtNSkF1dGhCYXNlXSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * Injection token for MJ Environment Configuration
4
+ */
5
+ export const MJ_ENVIRONMENT = new InjectionToken('MJ_ENVIRONMENT');
6
+ /**
7
+ * Injection token for optional startup validation service
8
+ */
9
+ export const MJ_STARTUP_VALIDATION = new InjectionToken('MJ_STARTUP_VALIDATION', {
10
+ providedIn: 'root',
11
+ factory: () => null // Default to null if not provided
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ib290c3RyYXAudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBc0IsZ0JBQWdCLENBQUMsQ0FBQztBQUV4Rjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFvQyx1QkFBdUIsRUFBRTtJQUNsSCxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtDQUFrQztDQUN2RCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgTUogRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY29uc3QgTUpfRU5WSVJPTk1FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48TUpFbnZpcm9ubWVudENvbmZpZz4oJ01KX0VOVklST05NRU5UJyk7XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIGZvciBvcHRpb25hbCBzdGFydHVwIHZhbGlkYXRpb24gc2VydmljZVxuICovXG5leHBvcnQgY29uc3QgTUpfU1RBUlRVUF9WQUxJREFUSU9OID0gbmV3IEluamVjdGlvblRva2VuPE1KU3RhcnR1cFZhbGlkYXRpb25TZXJ2aWNlIHwgbnVsbD4oJ01KX1NUQVJUVVBfVkFMSURBVElPTicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBudWxsIC8vIERlZmF1bHQgdG8gbnVsbCBpZiBub3QgcHJvdmlkZWRcbn0pO1xuXG4vKipcbiAqIE9wdGlvbmFsIGludGVyZmFjZSBmb3Igc3RhcnR1cCB2YWxpZGF0aW9uIHNlcnZpY2VzXG4gKiBBcHBsaWNhdGlvbnMgY2FuIHByb3ZpZGUgdGhlaXIgb3duIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBzdGFydHVwIHZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNSlN0YXJ0dXBWYWxpZGF0aW9uU2VydmljZSB7XG4gIC8qKlxuICAgKiBSdW5zIHZhbGlkYXRpb24gY2hlY2tzIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwXG4gICAqL1xuICB2YWxpZGF0ZVN5c3RlbVNldHVwKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB2YWxpZGF0aW9uIGlzc3VlIGZvciBtaXNzaW5nIHVzZXIgcm9sZXNcbiAgICovXG4gIGFkZE5vUm9sZXNWYWxpZGF0aW9uSXNzdWUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBFbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgTWVtYmVySnVuY3Rpb24gQW5ndWxhciBhcHBsaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNSkVudmlyb25tZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFwcCBpcyBydW5uaW5nIGluIHByb2R1Y3Rpb24gbW9kZVxuICAgKi9cbiAgcHJvZHVjdGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogR3JhcGhRTCBIVFRQIGVuZHBvaW50IFVSTFxuICAgKiBAZXhhbXBsZSAnaHR0cDovL2xvY2FsaG9zdDo0MDAwL2dyYXBocWwnXG4gICAqL1xuICBHUkFQSFFMX1VSSTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFwaFFMIFdlYlNvY2tldCBlbmRwb2ludCBVUkwgZm9yIHN1YnNjcmlwdGlvbnNcbiAgICogQGV4YW1wbGUgJ3dzOi8vbG9jYWxob3N0OjQwMDAvZ3JhcGhxbCdcbiAgICovXG4gIEdSQVBIUUxfV1NfVVJJOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIHR5cGVcbiAgICovXG4gIEFVVEhfVFlQRTogJ21zYWwnIHwgJ2F1dGgwJztcblxuICAvKipcbiAgICogTWVtYmVySnVuY3Rpb24gY29yZSBzY2hlbWEgbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQGRlZmF1bHQgJ19fbWonXG4gICAqL1xuICBNSl9DT1JFX1NDSEVNQV9OQU1FOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1pY3Jvc29mdCBBenVyZSBBRC9FbnRyYSBDbGllbnQgSUQgKGZvciBNU0FMIGF1dGgpXG4gICAqL1xuICBDTElFTlRfSUQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1pY3Jvc29mdCBBenVyZSBBRC9FbnRyYSBUZW5hbnQgSUQgKGZvciBNU0FMIGF1dGgpXG4gICAqL1xuICBURU5BTlRfSUQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGgwIGRvbWFpbiAoZm9yIEF1dGgwIGF1dGgpXG4gICAqIEBleGFtcGxlICdteWFwcC51cy5hdXRoMC5jb20nXG4gICAqL1xuICBBVVRIMF9ET01BSU4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGgwIGNsaWVudCBJRCAoZm9yIEF1dGgwIGF1dGgpXG4gICAqL1xuICBBVVRIMF9DTElFTlRJRD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjdXN0b20gZW52aXJvbm1lbnQgcHJvcGVydGllc1xuICAgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuIl19