@ngrdt/router 0.0.17 → 0.0.18

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.
Files changed (33) hide show
  1. package/README.md +254 -254
  2. package/fesm2022/ngrdt-router.mjs +90 -23
  3. package/fesm2022/ngrdt-router.mjs.map +1 -1
  4. package/index.d.ts +416 -12
  5. package/package.json +1 -3
  6. package/esm2022/index.mjs +0 -13
  7. package/esm2022/lib/directives/rdt-any-route-active.directive.mjs +0 -126
  8. package/esm2022/lib/directives/rdt-router-link.directive.mjs +0 -69
  9. package/esm2022/lib/guards/global-route-guard.service.mjs +0 -51
  10. package/esm2022/lib/guards/prevent-data-loss.guard.mjs +0 -7
  11. package/esm2022/lib/rdt-route/constants.mjs +0 -5
  12. package/esm2022/lib/rdt-route/rdt-angular-route.mjs +0 -196
  13. package/esm2022/lib/rdt-route/rdt-route-builder.mjs +0 -112
  14. package/esm2022/lib/rdt-route/rdt-route.mjs +0 -308
  15. package/esm2022/lib/rdt-route/utils.mjs +0 -15
  16. package/esm2022/lib/services/rdt-cannot-be-entered.token.mjs +0 -7
  17. package/esm2022/lib/services/rdt-confirm-data-loss.service.mjs +0 -11
  18. package/esm2022/lib/services/rdt-router.service.mjs +0 -161
  19. package/esm2022/lib/services/rdt-routes.token.mjs +0 -3
  20. package/esm2022/ngrdt-router.mjs +0 -5
  21. package/lib/directives/rdt-any-route-active.directive.d.ts +0 -34
  22. package/lib/directives/rdt-router-link.directive.d.ts +0 -23
  23. package/lib/guards/global-route-guard.service.d.ts +0 -10
  24. package/lib/guards/prevent-data-loss.guard.d.ts +0 -2
  25. package/lib/rdt-route/constants.d.ts +0 -3
  26. package/lib/rdt-route/rdt-angular-route.d.ts +0 -29
  27. package/lib/rdt-route/rdt-route-builder.d.ts +0 -46
  28. package/lib/rdt-route/rdt-route.d.ts +0 -138
  29. package/lib/rdt-route/utils.d.ts +0 -21
  30. package/lib/services/rdt-cannot-be-entered.token.d.ts +0 -7
  31. package/lib/services/rdt-confirm-data-loss.service.d.ts +0 -9
  32. package/lib/services/rdt-router.service.d.ts +0 -61
  33. package/lib/services/rdt-routes.token.d.ts +0 -3
package/index.d.ts CHANGED
@@ -1,12 +1,416 @@
1
- export * from './lib/services/rdt-cannot-be-entered.token';
2
- export * from './lib/services/rdt-confirm-data-loss.service';
3
- export * from './lib/services/rdt-router.service';
4
- export * from './lib/services/rdt-routes.token';
5
- export * from './lib/rdt-route/constants';
6
- export * from './lib/rdt-route/rdt-angular-route';
7
- export * from './lib/rdt-route/rdt-route';
8
- export * from './lib/rdt-route/rdt-route-builder';
9
- export * from './lib/directives/rdt-any-route-active.directive';
10
- export * from './lib/directives/rdt-router-link.directive';
11
- export * from './lib/guards/global-route-guard.service';
12
- export * from './lib/guards/prevent-data-loss.guard';
1
+ import * as i0 from '@angular/core';
2
+ import { Type, Injector, InjectionToken, OnInit, OnChanges, SimpleChanges } from '@angular/core';
3
+ import * as i1 from '@angular/router';
4
+ import { LoadChildrenCallback, Route, ResolveFn, CanActivateFn, CanDeactivateFn, CanActivateChildFn, RunGuardsAndResolvers, Params, Data, NavigationEnd, IsActiveMatchOptions, Router } from '@angular/router';
5
+ import { Observable } from 'rxjs';
6
+
7
+ declare class RdtAngularRoute<T extends object> {
8
+ private route;
9
+ private children;
10
+ private loadChildren?;
11
+ private component?;
12
+ private providers;
13
+ private resolvers;
14
+ private canActivate;
15
+ private canActivateChild;
16
+ private canDeactivate;
17
+ private runGuardsAndResolvers?;
18
+ private data?;
19
+ constructor(route: RdtRoute<T>);
20
+ provide(...providers: Type<unknown>[]): this;
21
+ withModule(callback: LoadChildrenCallback): this;
22
+ /**
23
+ * @deprecated Use withModule() instead.
24
+ */
25
+ setModule(callback: LoadChildrenCallback): this;
26
+ withComponent(comp: Type<any>): this;
27
+ /**
28
+ * @deprecated Use withComponent() instead.
29
+ */
30
+ setComponent(comp: Type<any>): this;
31
+ withChildren(...routes: Route[]): this;
32
+ /**
33
+ * @deprecated Use withChildren() instead.
34
+ */
35
+ setChildren(...routes: Route[]): this;
36
+ addResolve(paramName: string, resolver: ResolveFn<unknown>): this;
37
+ addCanActivate(...fns: CanActivateFn[]): this;
38
+ addCanDeactivate(...fns: CanDeactivateFn<any>[]): this;
39
+ addCanActivateChild(...fns: CanActivateChildFn[]): this;
40
+ withRunGuardsAndResolvers(value: RunGuardsAndResolvers): this;
41
+ /**
42
+ * @deprecated Use withRunGuardsAndResolvers() instead.
43
+ */
44
+ setRunGuardsAndResolvers(value: RunGuardsAndResolvers): this;
45
+ build(): Route;
46
+ private getCanMatch;
47
+ private checkChildrenMatch;
48
+ }
49
+
50
+ declare function ALWAYS_TRUE(): boolean;
51
+ declare class RdtRoute<T extends object = any> {
52
+ protected orderedParams: string[];
53
+ protected _paramMap: ParamTypeMap<T>;
54
+ protected _regex: RegExp | null;
55
+ protected paramMappings: ParamMapping[];
56
+ protected _staticParams: Partial<T>;
57
+ protected _queryParams: Params;
58
+ protected _stateParams: Params;
59
+ protected _data: Data;
60
+ protected _name: string;
61
+ protected _path: string;
62
+ protected _parent: RdtRoute | null;
63
+ protected _children: RdtRoute[];
64
+ protected _entryDisabled: boolean;
65
+ protected _canBeEntered: () => boolean;
66
+ protected _built: boolean;
67
+ private _absoluteRegex?;
68
+ /**
69
+ * Map of parameters and their types.
70
+ */
71
+ get paramMap(): Readonly<ParamTypeMap<T>>;
72
+ /**
73
+ * Human readable name for display in breadcrumbs, title, etc.
74
+ */
75
+ get name(): string;
76
+ /**
77
+ * Path of the route relative to parent route.
78
+ */
79
+ get path(): string;
80
+ /**
81
+ * Parent route.
82
+ */
83
+ get parent(): RdtRoute<any> | null;
84
+ /**
85
+ * Child routes.
86
+ */
87
+ get children(): RdtRoute<any>[];
88
+ /**
89
+ * Absolute path of parent route or '/' if there is no parent.
90
+ * Hostname excluded.
91
+ */
92
+ get basePath(): string;
93
+ /**
94
+ * Absolute path of the route. Hostname excluded.
95
+ */
96
+ get absolutePath(): string;
97
+ /**
98
+ * Regular expression route path relative to parent route.
99
+ * Hostname excluded.
100
+ */
101
+ get regex(): RegExp | null;
102
+ /**
103
+ * Regular expression to match only this route (not children
104
+ * or parent routes). Hostname excluded.
105
+ */
106
+ get absoluteRegex(): RegExp;
107
+ /**
108
+ * Denotes disabled route entry.
109
+ * If true, route should have no NgModule
110
+ * or component and only serves as virtual module
111
+ * for breadcrumb.
112
+ */
113
+ get entryDisabled(): boolean;
114
+ /**
115
+ * Statically set state params used when navigating to this instance.
116
+ */
117
+ get stateParams(): Params;
118
+ /**
119
+ * Statically set query params used when navigating to this instance.
120
+ */
121
+ get queryParams(): Params;
122
+ /**
123
+ * @param url Absolute path to test.
124
+ * @returns True if url matches this route.
125
+ */
126
+ testUrl(url: string): boolean;
127
+ /**
128
+ * Statically set parameters used when navigating to this instance.
129
+ */
130
+ get staticParams(): Partial<T>;
131
+ get hasCanBeEnteredGuard(): boolean;
132
+ /**
133
+ * Data that is passed to Angular route definition.
134
+ */
135
+ get data(): Data;
136
+ /**
137
+ * Meta guard that is used by [rdtRouterLink] and RdtMenu
138
+ * to determine if route can be entered.
139
+ * @param injector Environment or custom injector.
140
+ * @returns True if route can be entered.
141
+ */
142
+ canBeEntered(injector?: Injector): boolean;
143
+ /**
144
+ * Extracts url parameters from absolute path for this path and each parent.
145
+ */
146
+ parseAbsoluteUrl(url: string): RdtReadonlyParameters | null;
147
+ private fill;
148
+ /**
149
+ * Fills parameters in path with values from paramMap.
150
+ * Use withStaticParams() beforehand in case parent paths contain parameters.
151
+ * @param paramMap Must contain all parameters for this route.
152
+ * @returns Absolute path.
153
+ */
154
+ createAbsoluteUrl(paramMap?: Partial<T>): string;
155
+ createRelativeUrl(paramMap?: Partial<T>): string;
156
+ private createUrl;
157
+ toAngularRoute(): RdtAngularRoute<T>;
158
+ /**
159
+ * Provides static mapping for parameter names tableName -> urlName.
160
+ * Returns new instance of RdtRoute<T> that is clone of
161
+ * this route and its parents (NOT children).
162
+ * @returns Clone of this route with mapped parameter names.
163
+ */
164
+ withParamMappings(mappings: ParamMapping[]): RdtRoute<T>;
165
+ /**
166
+ * Sets static parameters for this route.
167
+ * @param params Static parameters for this route.
168
+ * @returns Clone of this with static parameters set.
169
+ */
170
+ withStaticParams(params: T): RdtRoute<T>;
171
+ withStaticParams<T2 extends object>(route: RdtRoute<T2>, params: T2): RdtRoute<T>;
172
+ withQueryParams(queryParams: Params): RdtRoute<T>;
173
+ withStateParams(stateParams: Params): RdtRoute<T>;
174
+ /**
175
+ * @returns Partial of object that only contains properties necessary to create this route.
176
+ */
177
+ extractRouteParams(row: T): Partial<T>;
178
+ /**
179
+ * @returns New instance of RdtRoute<T> that is clone of
180
+ * this route and its parents (NOT children).
181
+ */
182
+ clone(): RdtRoute<T>;
183
+ }
184
+
185
+ type ParamTypeMap<T> = {
186
+ [key in keyof T]?: 'string' | 'number';
187
+ };
188
+ interface ParamMapping {
189
+ urlName: string;
190
+ tableName: string;
191
+ }
192
+ interface StaticRouteParams {
193
+ [absolutePath: string]: object;
194
+ }
195
+ type RdtRedirectReturnType = string | void | undefined;
196
+ type RdtRedirectFn = (currentPath: string, targetPath: string, targetRoute: RdtRoute) => RdtRedirectReturnType;
197
+ declare class RdtReadonlyParameters {
198
+ protected readonly params: StaticRouteParams;
199
+ constructor(params?: StaticRouteParams);
200
+ get<T extends object>(route: RdtRoute<T>): Partial<T> | null;
201
+ }
202
+
203
+ /**
204
+ * Injection token that defines behavior when route cannot be entered (canBeEntered returns false).
205
+ * If value is undefined, route will be redirected to ''.
206
+ */
207
+ declare const RDT_CANNOT_BE_ENTERED_PROVIDER: InjectionToken<RdtRedirectFn | RdtRedirectReturnType>;
208
+
209
+ declare const RDT_CONFIRM_DATA_LOSS_SERVICE: InjectionToken<RdtConfirmDataLossService>;
210
+ declare abstract class RdtConfirmDataLossService {
211
+ abstract confirmDataLoss(): Observable<boolean>;
212
+ }
213
+ declare class RdtConfirmDataLossServiceAlert extends RdtConfirmDataLossService {
214
+ confirmDataLoss(): Observable<boolean>;
215
+ }
216
+
217
+ interface RdtNavigateExtras {
218
+ state?: Params;
219
+ query?: Params;
220
+ target?: '_blank' | '_self' | '_parent' | '_top';
221
+ replaceUrl?: boolean;
222
+ }
223
+ declare class RdtRouterService {
224
+ readonly allRoutes: RdtRoute<any>[] | null;
225
+ private readonly location;
226
+ private readonly router;
227
+ private readonly baseHref;
228
+ private _previousUrl;
229
+ private _currentUrl;
230
+ get previousUrl(): string | null;
231
+ get currentUrl(): string | null;
232
+ parsePreviousUrl(): {
233
+ route: RdtRoute<any>;
234
+ params: RdtReadonlyParameters;
235
+ } | null;
236
+ parseCurrentUrl(): {
237
+ route: RdtRoute<any>;
238
+ params: RdtReadonlyParameters;
239
+ } | null;
240
+ readonly navigationEnd$: Observable<NavigationEnd>;
241
+ readonly nextNavigationEnd$: Observable<NavigationEnd>;
242
+ constructor();
243
+ /**
244
+ * @returns window.history.state extended by state parameters passed from parent window.
245
+ */
246
+ getHistoryState(): any;
247
+ /**
248
+ * Navigates to the specified route.
249
+ * @param link Route to navigate to.
250
+ * @param params Parameter of route passed as first argument.
251
+ * @param extras Allows you to specify additional parameters for navigation. These extras have higher priority than those defined in the route.
252
+ * @returns Promise that resolves when navigation is complete.
253
+ */
254
+ navigate<T extends object>(link: RdtRoute<T>, params?: Partial<T>, extras?: RdtNavigateExtras): Promise<boolean>;
255
+ navigateHome(extras?: RdtNavigateExtras): Promise<boolean>;
256
+ navigateBack(extras?: RdtNavigateExtras): Promise<boolean> | null;
257
+ /**
258
+ * This method will try to find matching route for given absolute URL, extract its parameters and return them.
259
+ * If no route matches the URL, it returns null. Parameters are extracted only for the last matching route, not ancestors.
260
+ * @param url Absolute URL to parse (e.g. '/home/details/123?query=abc').
261
+ * @returns Object containing the matching route and its parameters, or null if no route is matching.
262
+ */
263
+ parseAbsoluteUrl(url?: string): {
264
+ route: RdtRoute<any>;
265
+ params: RdtReadonlyParameters;
266
+ } | null;
267
+ extractAllParams(currentRoute?: RdtRoute): RdtReadonlyParameters | null;
268
+ isParentOfCurrentLocation(route: RdtRoute): boolean;
269
+ removeQueryParams(...paramNames: string[]): void;
270
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtRouterService, never>;
271
+ static ɵprov: i0.ɵɵInjectableDeclaration<RdtRouterService>;
272
+ }
273
+
274
+ declare const RDT_ROUTES_PROVIDER: InjectionToken<RdtRoute<any>[]>;
275
+
276
+ declare enum RdtNavigationSource {
277
+ BREADCRUMB = "breadcrumb"
278
+ }
279
+
280
+ declare class RdtRouteBuilder<T extends object = any> extends RdtRoute<T> {
281
+ /**
282
+ * CanBeEntered function is synchronous function which
283
+ * lets framework hide menu buttons and disable links.
284
+ * Function is run in environment injection context, so
285
+ * you can inject global services, tokens, etc.
286
+ * @param fn
287
+ */
288
+ withCanBeEntered(fn: () => boolean): this;
289
+ /**
290
+ * @deprecated Use withCanBeEntered() instead.
291
+ */
292
+ setCanBeEntered(fn: () => boolean): this;
293
+ /**
294
+ * Entry disabled route will generate disabled breadcrumb.
295
+ * It should not have any component nor module added to it.
296
+ * @param value
297
+ * @returns
298
+ */
299
+ withEntryDisabled(value?: boolean): this;
300
+ /**
301
+ * @deprecated Use withEntryDisabled() instead.
302
+ */
303
+ setEntryDisabled(value?: boolean): this;
304
+ /**
305
+ * Sets path relative to parent. It is defined the same way as Angular route path including parameters.
306
+ * You need to call setParam() for each parameter you use in the path.
307
+ */
308
+ withPath(path: string): this;
309
+ /**
310
+ * @deprecated Use withPath() instead.
311
+ */
312
+ setPath(path: string): this;
313
+ /**
314
+ * Sets Angular route data.
315
+ * @param data Angular route data object. Breadcrumb key is merged into it.
316
+ */
317
+ withData(data: Data): this;
318
+ /**
319
+ * @deprecated Use withData() instead.
320
+ */
321
+ setData(data: Data): this;
322
+ /**
323
+ * Defines parameter type and lets framework parse it.
324
+ * @param paramName
325
+ * @param type
326
+ */
327
+ withParam(paramName: keyof T, type: 'string' | 'number'): this;
328
+ /**
329
+ * @deprecated Use withParam() instead.
330
+ */
331
+ setParam(paramName: keyof T, type: 'string' | 'number'): this;
332
+ /**
333
+ * Sets name to display in breadcrumb, etc.
334
+ */
335
+ withName(name: string): this;
336
+ /**
337
+ * @deprecated Use withName() instead.
338
+ */
339
+ setName(name: string): this;
340
+ /**
341
+ * Call .build() on children before you call this method!
342
+ */
343
+ withChildren(...children: RdtRoute[]): this;
344
+ /**
345
+ * @deprecated Use withChildren() instead.
346
+ */
347
+ setChildren(...children: RdtRoute[]): this;
348
+ build(): RdtRoute<T>;
349
+ private setRegex;
350
+ private static readonly groups;
351
+ }
352
+
353
+ /**
354
+ * Directive that appends class to host if any of the watched routes is active.
355
+ */
356
+ declare class RdtAnyRouteActiveDirective implements OnInit, OnChanges {
357
+ private readonly destroyRef;
358
+ private readonly router;
359
+ private readonly renderer;
360
+ private readonly elRef;
361
+ set anyRouteActive(data: string[] | string);
362
+ watchedRoutes: (string | string[])[];
363
+ set anyRouteActiveOptions(value: {
364
+ exact: boolean;
365
+ } | IsActiveMatchOptions);
366
+ private _anyRouteActiveOptions;
367
+ ariaCurrentWhenActive?: 'page' | 'step' | 'location' | 'date' | 'time' | true | false;
368
+ get isActive(): boolean;
369
+ private _isActive;
370
+ private classes;
371
+ ngOnInit(): void;
372
+ ngOnChanges(changes: SimpleChanges): void;
373
+ update(): void;
374
+ private setAriaCurrent;
375
+ private setClasses;
376
+ private addClass;
377
+ private removeClass;
378
+ private listenRouterEvents;
379
+ private parseClasses;
380
+ private parseOptions;
381
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtAnyRouteActiveDirective, never>;
382
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RdtAnyRouteActiveDirective, "[rdtAnyRouteActive]", never, { "anyRouteActive": { "alias": "rdtAnyRouteActive"; "required": true; }; "watchedRoutes": { "alias": "watchedRoutes"; "required": true; }; "anyRouteActiveOptions": { "alias": "anyRouteActiveOptions"; "required": false; }; "ariaCurrentWhenActive": { "alias": "ariaCurrentWhenActive"; "required": false; }; }, {}, never, never, true, never>;
383
+ }
384
+
385
+ declare class RdtRouterLinkDirective<T extends object> implements OnInit, OnChanges {
386
+ private readonly routerLinkRef;
387
+ private readonly envInjector;
388
+ route: RdtRoute<T>;
389
+ target: '_blank' | '_self' | '_parent' | '_top';
390
+ params?: Partial<T>;
391
+ queryParams?: Params;
392
+ stateParams?: Params;
393
+ disabled: boolean;
394
+ ngOnInit(): void;
395
+ ngOnChanges(): void;
396
+ private update;
397
+ private setLink;
398
+ private disableLink;
399
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtRouterLinkDirective<any>, never>;
400
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RdtRouterLinkDirective<any>, "[rdtRouterLink]", never, { "route": { "alias": "rdtRouterLink"; "required": true; }; "target": { "alias": "target"; "required": false; }; "params": { "alias": "params"; "required": false; }; "queryParams": { "alias": "queryParams"; "required": false; }; "stateParams": { "alias": "stateParams"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, [{ directive: typeof i1.RouterLink; inputs: { "target": "target"; }; outputs: {}; }]>;
401
+ static ngAcceptInputType_disabled: unknown;
402
+ }
403
+
404
+ declare class GlobalRouteGuardService {
405
+ private router;
406
+ constructor(router: Router);
407
+ ensureGlobalGuards(): void;
408
+ private ensureCanDeactivateGuards;
409
+ static ɵfac: i0.ɵɵFactoryDeclaration<GlobalRouteGuardService, never>;
410
+ static ɵprov: i0.ɵɵInjectableDeclaration<GlobalRouteGuardService>;
411
+ }
412
+
413
+ declare const preventDataLossGuardFn: CanDeactivateFn<any>;
414
+
415
+ export { ALWAYS_TRUE, GlobalRouteGuardService, RDT_CANNOT_BE_ENTERED_PROVIDER, RDT_CONFIRM_DATA_LOSS_SERVICE, RDT_ROUTES_PROVIDER, RdtAngularRoute, RdtAnyRouteActiveDirective, RdtConfirmDataLossService, RdtConfirmDataLossServiceAlert, RdtNavigationSource, RdtRoute, RdtRouteBuilder, RdtRouterLinkDirective, RdtRouterService, preventDataLossGuardFn };
416
+ export type { RdtNavigateExtras };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngrdt/router",
3
- "version": "v0.0.17",
3
+ "version": "v0.0.18",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=18.2.0",
6
6
  "@angular/core": ">=18.2.0",
@@ -18,8 +18,6 @@
18
18
  },
19
19
  ".": {
20
20
  "types": "./index.d.ts",
21
- "esm2022": "./esm2022/ngrdt-router.mjs",
22
- "esm": "./esm2022/ngrdt-router.mjs",
23
21
  "default": "./fesm2022/ngrdt-router.mjs"
24
22
  }
25
23
  },
package/esm2022/index.mjs DELETED
@@ -1,13 +0,0 @@
1
- export * from './lib/services/rdt-cannot-be-entered.token';
2
- export * from './lib/services/rdt-confirm-data-loss.service';
3
- export * from './lib/services/rdt-router.service';
4
- export * from './lib/services/rdt-routes.token';
5
- export * from './lib/rdt-route/constants';
6
- export * from './lib/rdt-route/rdt-angular-route';
7
- export * from './lib/rdt-route/rdt-route';
8
- export * from './lib/rdt-route/rdt-route-builder';
9
- export * from './lib/directives/rdt-any-route-active.directive';
10
- export * from './lib/directives/rdt-router-link.directive';
11
- export * from './lib/guards/global-route-guard.service';
12
- export * from './lib/guards/prevent-data-loss.guard';
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9AbmdyZHQvcm91dGVyL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsbUNBQW1DLENBQUM7QUFFbEQsY0FBYyxpREFBaUQsQ0FBQztBQUNoRSxjQUFjLDRDQUE0QyxDQUFDO0FBRTNELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3JkdC1jYW5ub3QtYmUtZW50ZXJlZC50b2tlbic7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3JkdC1jb25maXJtLWRhdGEtbG9zcy5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvcmR0LXJvdXRlci5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvcmR0LXJvdXRlcy50b2tlbic7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZHQtcm91dGUvY29uc3RhbnRzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvcmR0LXJvdXRlL3JkdC1hbmd1bGFyLXJvdXRlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvcmR0LXJvdXRlL3JkdC1yb3V0ZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JkdC1yb3V0ZS9yZHQtcm91dGUtYnVpbGRlcic7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL3JkdC1hbnktcm91dGUtYWN0aXZlLmRpcmVjdGl2ZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvcmR0LXJvdXRlci1saW5rLmRpcmVjdGl2ZSc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9ndWFyZHMvZ2xvYmFsLXJvdXRlLWd1YXJkLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9ndWFyZHMvcHJldmVudC1kYXRhLWxvc3MuZ3VhcmQnO1xyXG4iXX0=
@@ -1,126 +0,0 @@
1
- import { DestroyRef, Directive, ElementRef, Input, Renderer2, inject, } from '@angular/core';
2
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { NavigationEnd, Router, RouterModule, } from '@angular/router';
4
- import { filter } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- const EXACT_TRUE_OPTS = {
7
- paths: 'exact',
8
- queryParams: 'exact',
9
- fragment: 'ignored',
10
- matrixParams: 'ignored',
11
- };
12
- const EXACT_FALSE_OPTS = {
13
- paths: 'subset',
14
- queryParams: 'subset',
15
- fragment: 'ignored',
16
- matrixParams: 'ignored',
17
- };
18
- /**
19
- * Directive that appends class to host if any of the watched routes is active.
20
- */
21
- export class RdtAnyRouteActiveDirective {
22
- destroyRef = inject(DestroyRef);
23
- router = inject(Router);
24
- renderer = inject(Renderer2);
25
- elRef = inject(ElementRef);
26
- set anyRouteActive(data) {
27
- this.classes = this.parseClasses(data);
28
- }
29
- watchedRoutes = [];
30
- set anyRouteActiveOptions(value) {
31
- this._anyRouteActiveOptions = this.parseOptions(value);
32
- }
33
- _anyRouteActiveOptions = EXACT_FALSE_OPTS;
34
- ariaCurrentWhenActive;
35
- get isActive() {
36
- return this._isActive;
37
- }
38
- _isActive = false;
39
- classes = [];
40
- ngOnInit() {
41
- this.update();
42
- this.listenRouterEvents();
43
- }
44
- ngOnChanges(changes) {
45
- if (changes['anyRouteActive']?.previousValue) {
46
- const prev = this.parseClasses(changes['anyRouteActive'].previousValue);
47
- prev.forEach((c) => this.removeClass(c));
48
- }
49
- this.update();
50
- }
51
- update() {
52
- this._isActive = this.watchedRoutes.some((route) => {
53
- const param = typeof route === 'string' ? route : this.router.createUrlTree(route);
54
- return this.router.isActive(param, this._anyRouteActiveOptions);
55
- });
56
- this.setClasses();
57
- this.setAriaCurrent();
58
- }
59
- setAriaCurrent() {
60
- const el = this.elRef.nativeElement;
61
- if (this._isActive && this.ariaCurrentWhenActive !== undefined) {
62
- const value = this.ariaCurrentWhenActive.toString();
63
- this.renderer.setAttribute(el, 'aria-current', value);
64
- }
65
- else {
66
- this.renderer.removeAttribute(el, 'aria-current');
67
- }
68
- }
69
- setClasses() {
70
- if (this._isActive) {
71
- this.classes.forEach((c) => this.addClass(c));
72
- }
73
- else {
74
- this.classes.forEach((c) => this.removeClass(c));
75
- }
76
- }
77
- addClass(className) {
78
- this.renderer.addClass(this.elRef.nativeElement, className);
79
- }
80
- removeClass(className) {
81
- this.renderer.removeClass(this.elRef.nativeElement, className);
82
- }
83
- listenRouterEvents() {
84
- this.router.events
85
- .pipe(filter((ev) => ev instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef))
86
- .subscribe(() => this.update());
87
- }
88
- parseClasses(data) {
89
- const classes = Array.isArray(data) ? data : data.split(' ');
90
- return classes.filter((c) => !!c);
91
- }
92
- parseOptions(input) {
93
- if ('exact' in input) {
94
- if (input.exact) {
95
- return EXACT_TRUE_OPTS;
96
- }
97
- else {
98
- return EXACT_FALSE_OPTS;
99
- }
100
- }
101
- else {
102
- return input;
103
- }
104
- }
105
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtAnyRouteActiveDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
106
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: RdtAnyRouteActiveDirective, isStandalone: true, selector: "[rdtAnyRouteActive]", inputs: { anyRouteActive: ["rdtAnyRouteActive", "anyRouteActive"], watchedRoutes: "watchedRoutes", anyRouteActiveOptions: "anyRouteActiveOptions", ariaCurrentWhenActive: "ariaCurrentWhenActive" }, providers: [RouterModule], usesOnChanges: true, ngImport: i0 });
107
- }
108
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtAnyRouteActiveDirective, decorators: [{
109
- type: Directive,
110
- args: [{
111
- selector: '[rdtAnyRouteActive]',
112
- standalone: true,
113
- providers: [RouterModule],
114
- }]
115
- }], propDecorators: { anyRouteActive: [{
116
- type: Input,
117
- args: [{ required: true, alias: 'rdtAnyRouteActive' }]
118
- }], watchedRoutes: [{
119
- type: Input,
120
- args: [{ required: true }]
121
- }], anyRouteActiveOptions: [{
122
- type: Input
123
- }], ariaCurrentWhenActive: [{
124
- type: Input
125
- }] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LWFueS1yb3V0ZS1hY3RpdmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL2RpcmVjdGl2ZXMvcmR0LWFueS1yb3V0ZS1hY3RpdmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBR0wsU0FBUyxFQUVULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBRUwsYUFBYSxFQUNiLE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUU5QixNQUFNLGVBQWUsR0FBeUI7SUFDNUMsS0FBSyxFQUFFLE9BQU87SUFDZCxXQUFXLEVBQUUsT0FBTztJQUNwQixRQUFRLEVBQUUsU0FBUztJQUNuQixZQUFZLEVBQUUsU0FBUztDQUN4QixDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBeUI7SUFDN0MsS0FBSyxFQUFFLFFBQVE7SUFDZixXQUFXLEVBQUUsUUFBUTtJQUNyQixRQUFRLEVBQUUsU0FBUztJQUNuQixZQUFZLEVBQUUsU0FBUztDQUN4QixDQUFDO0FBRUY7O0dBRUc7QUFNSCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3BCLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QixRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLEtBQUssR0FBNEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJFLElBQ0ksY0FBYyxDQUFDLElBQXVCO1FBQ3hDLElB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QUEwQix1UUFGMUIsQ0FBQyxZQUFZLENBQUM7OzJGQUVkLDBCQUEwQjtrQkFMdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUMxQjs4QkFRSyxjQUFjO3NCQURqQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7Z0JBTXJELGFBQWE7c0JBRFosS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBSXJCLHFCQUFxQjtzQkFEeEIsS0FBSztnQkFPTixxQkFBcUI7c0JBRHBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERlc3Ryb3lSZWYsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBpbmplY3QsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHtcclxuICBJc0FjdGl2ZU1hdGNoT3B0aW9ucyxcclxuICBOYXZpZ2F0aW9uRW5kLFxyXG4gIFJvdXRlcixcclxuICBSb3V0ZXJNb2R1bGUsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XHJcblxyXG5jb25zdCBFWEFDVF9UUlVFX09QVFM6IElzQWN0aXZlTWF0Y2hPcHRpb25zID0ge1xyXG4gIHBhdGhzOiAnZXhhY3QnLFxyXG4gIHF1ZXJ5UGFyYW1zOiAnZXhhY3QnLFxyXG4gIGZyYWdtZW50OiAnaWdub3JlZCcsXHJcbiAgbWF0cml4UGFyYW1zOiAnaWdub3JlZCcsXHJcbn07XHJcblxyXG5jb25zdCBFWEFDVF9GQUxTRV9PUFRTOiBJc0FjdGl2ZU1hdGNoT3B0aW9ucyA9IHtcclxuICBwYXRoczogJ3N1YnNldCcsXHJcbiAgcXVlcnlQYXJhbXM6ICdzdWJzZXQnLFxyXG4gIGZyYWdtZW50OiAnaWdub3JlZCcsXHJcbiAgbWF0cml4UGFyYW1zOiAnaWdub3JlZCcsXHJcbn07XHJcblxyXG4vKipcclxuICogRGlyZWN0aXZlIHRoYXQgYXBwZW5kcyBjbGFzcyB0byBob3N0IGlmIGFueSBvZiB0aGUgd2F0Y2hlZCByb3V0ZXMgaXMgYWN0aXZlLlxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbcmR0QW55Um91dGVBY3RpdmVdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHByb3ZpZGVyczogW1JvdXRlck1vZHVsZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZHRBbnlSb3V0ZUFjdGl2ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XHJcblxyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlLCBhbGlhczogJ3JkdEFueVJvdXRlQWN0aXZlJyB9KVxyXG4gIHNldCBhbnlSb3V0ZUFjdGl2ZShkYXRhOiBzdHJpbmdbXSB8IHN0cmluZykge1xyXG4gICAgdGhpcy5jbGFzc2VzID0gdGhpcy5wYXJzZUNsYXNzZXMoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gIHdhdGNoZWRSb3V0ZXM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBhbnlSb3V0ZUFjdGl2ZU9wdGlvbnModmFsdWU6IHsgZXhhY3Q6IGJvb2xlYW4gfSB8IElzQWN0aXZlTWF0Y2hPcHRpb25zKSB7XHJcbiAgICB0aGlzLl9hbnlSb3V0ZUFjdGl2ZU9wdGlvbnMgPSB0aGlzLnBhcnNlT3B0aW9ucyh2YWx1ZSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FueVJvdXRlQWN0aXZlT3B0aW9uczogSXNBY3RpdmVNYXRjaE9wdGlvbnMgPSBFWEFDVF9GQUxTRV9PUFRTO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGFyaWFDdXJyZW50V2hlbkFjdGl2ZT86XHJcbiAgICB8ICdwYWdlJ1xyXG4gICAgfCAnc3RlcCdcclxuICAgIHwgJ2xvY2F0aW9uJ1xyXG4gICAgfCAnZGF0ZSdcclxuICAgIHwgJ3RpbWUnXHJcbiAgICB8IHRydWVcclxuICAgIHwgZmFsc2U7XHJcblxyXG4gIGdldCBpc0FjdGl2ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfaXNBY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICB0aGlzLmxpc3RlblJvdXRlckV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2FueVJvdXRlQWN0aXZlJ10/LnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgY29uc3QgcHJldiA9IHRoaXMucGFyc2VDbGFzc2VzKGNoYW5nZXNbJ2FueVJvdXRlQWN0aXZlJ10ucHJldmlvdXNWYWx1ZSk7XHJcbiAgICAgIHByZXYuZm9yRWFjaCgoYykgPT4gdGhpcy5yZW1vdmVDbGFzcyhjKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIHRoaXMuX2lzQWN0aXZlID0gdGhpcy53YXRjaGVkUm91dGVzLnNvbWUoKHJvdXRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtID1cclxuICAgICAgICB0eXBlb2Ygcm91dGUgPT09ICdzdHJpbmcnID8gcm91dGUgOiB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKHJvdXRlKTtcclxuICAgICAgcmV0dXJuIHRoaXMucm91dGVyLmlzQWN0aXZlKHBhcmFtLCB0aGlzLl9hbnlSb3V0ZUFjdGl2ZU9wdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNldENsYXNzZXMoKTtcclxuICAgIHRoaXMuc2V0QXJpYUN1cnJlbnQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0QXJpYUN1cnJlbnQoKSB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICBpZiAodGhpcy5faXNBY3RpdmUgJiYgdGhpcy5hcmlhQ3VycmVudFdoZW5BY3RpdmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuYXJpYUN1cnJlbnRXaGVuQWN0aXZlLnRvU3RyaW5nKCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCAnYXJpYS1jdXJyZW50JywgdmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUoZWwsICdhcmlhLWN1cnJlbnQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q2xhc3NlcygpIHtcclxuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xyXG4gICAgICB0aGlzLmNsYXNzZXMuZm9yRWFjaCgoYykgPT4gdGhpcy5hZGRDbGFzcyhjKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsYXNzZXMuZm9yRWFjaCgoYykgPT4gdGhpcy5yZW1vdmVDbGFzcyhjKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaXN0ZW5Sb3V0ZXJFdmVudHMoKSB7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKChldikgPT4gZXYgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcclxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGUoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnNlQ2xhc3NlcyhkYXRhOiBzdHJpbmdbXSB8IHN0cmluZykge1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogZGF0YS5zcGxpdCgnICcpO1xyXG4gICAgcmV0dXJuIGNsYXNzZXMuZmlsdGVyKChjKSA9PiAhIWMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZU9wdGlvbnMoaW5wdXQ6IHsgZXhhY3Q6IGJvb2xlYW4gfSB8IElzQWN0aXZlTWF0Y2hPcHRpb25zKSB7XHJcbiAgICBpZiAoJ2V4YWN0JyBpbiBpbnB1dCkge1xyXG4gICAgICBpZiAoaW5wdXQuZXhhY3QpIHtcclxuICAgICAgICByZXR1cm4gRVhBQ1RfVFJVRV9PUFRTO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBFWEFDVF9GQUxTRV9PUFRTO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==