@ngx-pwa/local-storage 18.0.0 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,340 +0,0 @@
1
- import { Injectable } from "@angular/core";
2
- import { Observable, ReplaySubject, of, throwError } from "rxjs";
3
- import { catchError, mergeMap, tap } from "rxjs/operators";
4
- import { IDB_BROKEN_ERROR } from "../databases/exceptions";
5
- import { IndexedDBDatabase } from "../databases/indexeddb-database";
6
- import { LocalDatabase } from "../databases/local-database";
7
- import { LocalStorageDatabase } from "../databases/localstorage-database";
8
- import { MemoryDatabase } from "../databases/memory-database";
9
- import { JSONValidator } from "../validation/json-validator";
10
- import { ValidationError } from "./exceptions";
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "../databases/local-database";
13
- export class StorageMap {
14
- #database;
15
- #jsonValidator;
16
- #notifiers = new Map();
17
- /**
18
- * Constructor params are provided by Angular (but can also be passed manually in tests)
19
- * @param database Storage to use
20
- */
21
- constructor(database) {
22
- this.#database = database;
23
- this.#jsonValidator = new JSONValidator();
24
- }
25
- /**
26
- * **Number of items** in storage, wrapped in an Observable.
27
- *
28
- * Note you do *not* need to unsubscribe (it is a self-completing Observable).
29
- *
30
- * @example
31
- * this.storageMap.size.subscribe((size) => {
32
- * console.log(size);
33
- * });
34
- */
35
- get size() {
36
- return this.#database.size
37
- /* Catch if `indexedDb` is broken */
38
- .pipe(this.#catchIDBBroken(() => this.#database.size));
39
- }
40
- /**
41
- * Tells you which storage engine is used.
42
- *
43
- * *Only useful for interoperability.*
44
- *
45
- * Note that due to some browsers issues in some special contexts
46
- * (like Safari cross-origin iframes),
47
- * **this information may be wrong at initialization,**
48
- * as the storage could fallback from `indexedDB` to `localStorage`
49
- * only after a first read or write operation.
50
- * @returns Storage engine used
51
- *
52
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
53
- *
54
- * @example
55
- * if (this.storageMap.backingEngine === 'indexedDB') {}
56
- */
57
- get backingEngine() {
58
- if (this.#database instanceof IndexedDBDatabase) {
59
- return "indexedDB";
60
- }
61
- else if (this.#database instanceof LocalStorageDatabase) {
62
- return "localStorage";
63
- }
64
- else if (this.#database instanceof MemoryDatabase) {
65
- return "memory";
66
- }
67
- else {
68
- return "unknown";
69
- }
70
- }
71
- /**
72
- * Information about `indexedDB` database.
73
- *
74
- * *Only useful for interoperability.*
75
- *
76
- * @returns `indexedDB` database name, store name and database version.
77
- * **Values will be empty if the storage is not `indexedDB`, so it should be used after an engine check**.
78
- *
79
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
80
- *
81
- * @example
82
- * if (this.storageMap.backingEngine === 'indexedDB') {
83
- * const { database, store, version } = this.storageMap.backingStore;
84
- * }
85
- */
86
- get backingStore() {
87
- return (this.#database instanceof IndexedDBDatabase) ?
88
- this.#database.backingStore :
89
- { database: "", store: "", version: 0 };
90
- }
91
- /**
92
- * Information about `localStorage` fallback storage.
93
- *
94
- * *Only useful for interoperability.*
95
- *
96
- * @returns `localStorage` prefix.
97
- * **Values will be empty if the storage is not `localStorage`, so it should be used after an engine check**.
98
- *
99
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/INTEROPERABILITY.md}
100
- *
101
- * @example
102
- * if (this.storageMap.backingEngine === 'localStorage') {
103
- * const { prefix } = this.storageMap.fallbackBackingStore;
104
- * }
105
- */
106
- get fallbackBackingStore() {
107
- return (this.#database instanceof LocalStorageDatabase) ?
108
- { prefix: this.#database.prefix } :
109
- { prefix: "" };
110
- }
111
- get(key, schema) {
112
- /* Get the data in storage */
113
- return this.#database.get(key).pipe(
114
- /* Check if `indexedDb` is broken */
115
- this.#catchIDBBroken(() => this.#database.get(key)), mergeMap((data) => {
116
- /* No need to validate if the data is empty */
117
- if ((data === undefined) || (data === null)) {
118
- return of(undefined);
119
- }
120
- else if (schema) {
121
- /* Validate data against a JSON schema if provided */
122
- if (!this.#jsonValidator.validate(data, schema)) {
123
- return throwError(() => new ValidationError());
124
- }
125
- /* Data have been checked, so it's OK to cast */
126
- return of(data);
127
- }
128
- /* Cast to unknown as the data wasn't checked */
129
- return of(data);
130
- }));
131
- }
132
- /**
133
- * Store an item in storage.
134
- *
135
- * Note that:
136
- * * you *do* need to subscribe, even if you do not have something specific to do after writing in storage, otherwise nothing happens (because it is how RxJS Observables work),
137
- * * but you do *not* need to unsubscribe (it is a self-completing Observable),
138
- * * setting `null` or `undefined` will remove the item to avoid some browsers issues,
139
- * * you should stick to serializable JSON data, meaning primitive types, arrays and literal objects. Date, Map, Set, Blob and other special structures can cause issues in some scenarios.
140
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/SERIALIZATION.md}
141
- *
142
- * @param key The item's key
143
- * @param data The item's value
144
- * @param schema Optional JSON schema to validate the data
145
- * @returns A RxJS Observable to wait the end of the operation
146
- *
147
- * @example
148
- * this.storageMap.set('key', 'value').subscribe(() => {});
149
- */
150
- set(key, data, schema) {
151
- /* Storing `undefined` or `null` is useless and can cause issues in `indexedDb` in some browsers,
152
- * so removing item instead for all storages to have a consistent API */
153
- if ((data === undefined) || (data === null)) {
154
- return this.delete(key);
155
- }
156
- /* Validate data against a JSON schema if provided */
157
- if (schema && !this.#jsonValidator.validate(data, schema)) {
158
- return throwError(() => new ValidationError());
159
- }
160
- return this.#database.set(key, data).pipe(
161
- /* Catch if `indexedDb` is broken */
162
- this.#catchIDBBroken(() => this.#database.set(key, data)),
163
- /* Notify watchers (must be last because it should only happen if the operation succeeds) */
164
- tap(() => { this.#notify(key, data); }));
165
- }
166
- /**
167
- * Delete an item in storage.
168
- *
169
- * Note that:
170
- * * you *do* need to subscribe, even if you do not have something specific to do after deleting, otherwise nothing happens (because it is how RxJS Observables work),
171
- * * but you do *not* need to unsubscribe (it is a self-completing Observable).
172
- *
173
- * @param key The item's key
174
- * @returns A RxJS Observable to wait the end of the operation
175
- *
176
- * @example
177
- * this.storageMap.delete('key').subscribe(() => {});
178
- */
179
- delete(key) {
180
- return this.#database.delete(key).pipe(
181
- /* Catch if `indexedDb` is broken */
182
- this.#catchIDBBroken(() => this.#database.delete(key)),
183
- /* Notify watchers (must be last because it should only happen if the operation succeeds) */
184
- tap(() => { this.#notify(key, undefined); }));
185
- }
186
- /**
187
- * Delete all items in storage.
188
- *
189
- * Note that:
190
- * * you *do* need to subscribe, even if you do not have something specific to do after clearing, otherwise nothing happens (because it is how RxJS Observables work),
191
- * * but you do *not* need to unsubscribe (it is a self-completing Observable).
192
- *
193
- * @returns A RxJS Observable to wait the end of the operation
194
- *
195
- * @example
196
- * this.storageMap.clear().subscribe(() => {});
197
- */
198
- clear() {
199
- return this.#database.clear().pipe(
200
- /* Catch if `indexedDb` is broken */
201
- this.#catchIDBBroken(() => this.#database.clear()),
202
- /* Notify watchers (must be last because it should only happen if the operation succeeds) */
203
- tap(() => {
204
- for (const key of this.#notifiers.keys()) {
205
- this.#notify(key, undefined);
206
- }
207
- }));
208
- }
209
- /**
210
- * Get all keys stored in storage.
211
- *
212
- * Note **this is an *iterating* Observable**:
213
- * * if there is no key, the `next` callback will not be invoked,
214
- * * if you need to wait the whole operation to end, be sure to act in the `complete` callback,
215
- * as this Observable can emit several values and so will invoke the `next` callback several times,
216
- * * you do *not* need to unsubscribe (it is a self-completing Observable).
217
- *
218
- * @returns A list of the keys wrapped in a RxJS Observable
219
- *
220
- * @example
221
- * this.storageMap.keys().subscribe({
222
- * next: (key) => { console.log(key); },
223
- * complete: () => { console.log('Done'); },
224
- * });
225
- */
226
- keys() {
227
- return this.#database.keys()
228
- /* Catch if `indexedDb` is broken */
229
- .pipe(this.#catchIDBBroken(() => this.#database.keys()));
230
- }
231
- /**
232
- * Tells if a key exists in storage.
233
- *
234
- * Note you do *not* need to unsubscribe (it is a self-completing Observable).
235
- *
236
- * @returns A RxJS Observable telling if the key exists
237
- *
238
- * @example
239
- * this.storageMap.has('key').subscribe((hasKey) => {
240
- * if (hasKey) {}
241
- * });
242
- */
243
- has(key) {
244
- return this.#database.has(key)
245
- /* Catch if `indexedDb` is broken */
246
- .pipe(this.#catchIDBBroken(() => this.#database.has(key)));
247
- }
248
- watch(key, schema) {
249
- /* Check if there is already a notifier */
250
- if (!this.#notifiers.has(key)) {
251
- this.#notifiers.set(key, new ReplaySubject(1));
252
- }
253
- /* Non-null assertion is required because TypeScript doesn't narrow `.has()` yet */
254
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Ensured by the logic
255
- const notifier = this.#notifiers.get(key);
256
- /* Get the current item value */
257
- (schema ? this.get(key, schema) : this.get(key)).subscribe({
258
- next: (result) => {
259
- notifier.next(result);
260
- },
261
- error: (error) => {
262
- notifier.error(error);
263
- },
264
- });
265
- /* Only the public API of the Observable should be returned */
266
- return (schema ?
267
- notifier.asObservable() :
268
- notifier.asObservable());
269
- }
270
- /**
271
- * Notify when a value changes
272
- * @param key The item's key
273
- * @param data The new value
274
- */
275
- #notify(key, value) {
276
- const notifier = this.#notifiers.get(key);
277
- if (notifier) {
278
- notifier.next(value);
279
- }
280
- }
281
- /**
282
- * RxJS operator to catch if `indexedDB` is broken
283
- * @param operationCallback Callback with the operation to redo
284
- */
285
- #catchIDBBroken(operationCallback) {
286
- return catchError((error) => {
287
- /* Check if `indexedDB` is broken based on error message (the specific error class seems to be lost in the process) */
288
- if ((error !== undefined) && (error !== null)
289
- && (typeof error === "object") && ("message" in error)
290
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Required because TypeScript narrowing is not working here
291
- && (error.message === IDB_BROKEN_ERROR)) {
292
- /* When storage is fully disabled in browser (via the "Block all cookies" option),
293
- * just trying to check `localStorage` variable causes a security exception.
294
- * Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118
295
- */
296
- try {
297
- if ("getItem" in localStorage) {
298
- /* Fallback to `localStorage` if available */
299
- this.#database = new LocalStorageDatabase();
300
- }
301
- else {
302
- /* Fallback to memory storage otherwise */
303
- this.#database = new MemoryDatabase();
304
- }
305
- }
306
- catch {
307
- /* Fallback to memory storage otherwise */
308
- this.#database = new MemoryDatabase();
309
- }
310
- /* Redo the operation */
311
- return operationCallback();
312
- }
313
- else {
314
- /* Otherwise, rethrow the error */
315
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
316
- return throwError(() => error);
317
- }
318
- });
319
- }
320
- /**
321
- * THIS METHOD IS FOR INTERNAL PURPOSE ONLY AND MUST NOT BE USED,
322
- * IT CAN BE REMOVED AT ANY TIME AND MESSING WITH IT CAN CAUSE ISSUES
323
- * @private
324
- * @ignore
325
- */
326
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error -- Silence the not used error, it is used in tests
327
- // @ts-ignore
328
- ɵinternalGetDatabase() {
329
- return this.#database;
330
- }
331
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: StorageMap, deps: [{ token: i1.LocalDatabase }], target: i0.ɵɵFactoryTarget.Injectable }); }
332
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: StorageMap, providedIn: "root" }); }
333
- }
334
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: StorageMap, decorators: [{
335
- type: Injectable,
336
- args: [{
337
- providedIn: "root"
338
- }]
339
- }], ctorParameters: () => [{ type: i1.LocalDatabase }] });
340
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1tYXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvbGliL3N0b3JhZ2VzL3N0b3JhZ2UtbWFwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUF5QixNQUFNLE1BQU0sQ0FBQztBQUN4RixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBTzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7QUFLL0MsTUFBTSxPQUFPLFVBQVU7SUFFckIsU0FBUyxDQUFnQjtJQUNoQixjQUFjLENBQWdCO0lBQzlCLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztJQUVoRTs7O09BR0c7SUFDSCxZQUNFLFFBQXVCO1FBRXZCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsSUFBSSxJQUFJO1FBRU4sT0FBTyxJQUFJ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Y29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgb2YsIHRocm93RXJyb3IsIHR5cGUgT3BlcmF0b3JGdW5jdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtZXJnZU1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBJREJfQlJPS0VOX0VSUk9SIH0gZnJvbSBcIi4uL2RhdGFiYXNlcy9leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBJbmRleGVkREJEYXRhYmFzZSB9IGZyb20gXCIuLi9kYXRhYmFzZXMvaW5kZXhlZGRiLWRhdGFiYXNlXCI7XG5pbXBvcnQgeyBMb2NhbERhdGFiYXNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlcy9sb2NhbC1kYXRhYmFzZVwiO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlRGF0YWJhc2UgfSBmcm9tIFwiLi4vZGF0YWJhc2VzL2xvY2Fsc3RvcmFnZS1kYXRhYmFzZVwiO1xuaW1wb3J0IHsgTWVtb3J5RGF0YWJhc2UgfSBmcm9tIFwiLi4vZGF0YWJhc2VzL21lbW9yeS1kYXRhYmFzZVwiO1xuaW1wb3J0IHR5cGUge1xuICBKU09OU2NoZW1hLFxuICBKU09OU2NoZW1hQXJyYXlPZixcbiAgSlNPTlNjaGVtYUJvb2xlYW4sIEpTT05TY2hlbWFJbnRlZ2VyLFxuICBKU09OU2NoZW1hTnVtYmVyLCBKU09OU2NoZW1hU3RyaW5nXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL2pzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyBKU09OVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vanNvbi12YWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlTWFwIHtcblxuICAjZGF0YWJhc2U6IExvY2FsRGF0YWJhc2U7XG4gIHJlYWRvbmx5ICNqc29uVmFsaWRhdG9yOiBKU09OVmFsaWRhdG9yO1xuICByZWFkb25seSAjbm90aWZpZXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlcGxheVN1YmplY3Q8dW5rbm93bj4+KCk7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHBhcmFtcyBhcmUgcHJvdmlkZWQgYnkgQW5ndWxhciAoYnV0IGNhbiBhbHNvIGJlIHBhc3NlZCBtYW51YWxseSBpbiB0ZXN0cylcbiAgICogQHBhcmFtIGRhdGFiYXNlIFN0b3JhZ2UgdG8gdXNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhYmFzZTogTG9jYWxEYXRhYmFzZSxcbiAgKSB7XG4gICAgdGhpcy4jZGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgICB0aGlzLiNqc29uVmFsaWRhdG9yID0gbmV3IEpTT05WYWxpZGF0b3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqKk51bWJlciBvZiBpdGVtcyoqIGluIHN0b3JhZ2UsIHdyYXBwZWQgaW4gYW4gT2JzZXJ2YWJsZS5cbiAgICogXG4gICAqIE5vdGUgeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuc2l6ZS5zdWJzY3JpYmUoKHNpemUpID0+IHtcbiAgICogICBjb25zb2xlLmxvZyhzaXplKTtcbiAgICogfSk7XG4gICAqL1xuICBnZXQgc2l6ZSgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuXG4gICAgcmV0dXJuIHRoaXMuI2RhdGFiYXNlLnNpemVcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2Uuc2l6ZSkpO1xuXG4gIH1cblxuICAvKipcbiAgICogVGVsbHMgeW91IHdoaWNoIHN0b3JhZ2UgZW5naW5lIGlzIHVzZWQuXG4gICAqIFxuICAgKiAqT25seSB1c2VmdWwgZm9yIGludGVyb3BlcmFiaWxpdHkuKlxuICAgKiBcbiAgICogTm90ZSB0aGF0IGR1ZSB0byBzb21lIGJyb3dzZXJzIGlzc3VlcyBpbiBzb21lIHNwZWNpYWwgY29udGV4dHNcbiAgICogKGxpa2UgU2FmYXJpIGNyb3NzLW9yaWdpbiBpZnJhbWVzKSxcbiAgICogKip0aGlzIGluZm9ybWF0aW9uIG1heSBiZSB3cm9uZyBhdCBpbml0aWFsaXphdGlvbiwqKlxuICAgKiBhcyB0aGUgc3RvcmFnZSBjb3VsZCBmYWxsYmFjayBmcm9tIGBpbmRleGVkREJgIHRvIGBsb2NhbFN0b3JhZ2VgXG4gICAqIG9ubHkgYWZ0ZXIgYSBmaXJzdCByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgU3RvcmFnZSBlbmdpbmUgdXNlZFxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL0lOVEVST1BFUkFCSUxJVFkubWR9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGlmICh0aGlzLnN0b3JhZ2VNYXAuYmFja2luZ0VuZ2luZSA9PT0gJ2luZGV4ZWREQicpIHt9XG4gICAqL1xuICBnZXQgYmFja2luZ0VuZ2luZSgpOiBcImluZGV4ZWREQlwiIHwgXCJsb2NhbFN0b3JhZ2VcIiB8IFwibWVtb3J5XCIgfCBcInVua25vd25cIiB7XG5cbiAgICBpZiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBJbmRleGVkREJEYXRhYmFzZSkge1xuXG4gICAgICByZXR1cm4gXCJpbmRleGVkREJcIjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBMb2NhbFN0b3JhZ2VEYXRhYmFzZSkge1xuXG4gICAgICByZXR1cm4gXCJsb2NhbFN0b3JhZ2VcIjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBNZW1vcnlEYXRhYmFzZSkge1xuXG4gICAgICByZXR1cm4gXCJtZW1vcnlcIjtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIHJldHVybiBcInVua25vd25cIjtcblxuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGBpbmRleGVkREJgIGRhdGFiYXNlLlxuICAgKiBcbiAgICogKk9ubHkgdXNlZnVsIGZvciBpbnRlcm9wZXJhYmlsaXR5LipcbiAgICogXG4gICAqIEByZXR1cm5zIGBpbmRleGVkREJgIGRhdGFiYXNlIG5hbWUsIHN0b3JlIG5hbWUgYW5kIGRhdGFiYXNlIHZlcnNpb24uXG4gICAqICoqVmFsdWVzIHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN0b3JhZ2UgaXMgbm90IGBpbmRleGVkREJgLCBzbyBpdCBzaG91bGQgYmUgdXNlZCBhZnRlciBhbiBlbmdpbmUgY2hlY2sqKi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9JTlRFUk9QRVJBQklMSVRZLm1kfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpZiAodGhpcy5zdG9yYWdlTWFwLmJhY2tpbmdFbmdpbmUgPT09ICdpbmRleGVkREInKSB7XG4gICAqICAgY29uc3QgeyBkYXRhYmFzZSwgc3RvcmUsIHZlcnNpb24gfSA9IHRoaXMuc3RvcmFnZU1hcC5iYWNraW5nU3RvcmU7XG4gICAqIH1cbiAgICovXG4gIGdldCBiYWNraW5nU3RvcmUoKTogeyBkYXRhYmFzZTogc3RyaW5nLCBzdG9yZTogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXI7IH0ge1xuXG4gICAgcmV0dXJuICh0aGlzLiNkYXRhYmFzZSBpbnN0YW5jZW9mIEluZGV4ZWREQkRhdGFiYXNlKSA/XG4gICAgICB0aGlzLiNkYXRhYmFzZS5iYWNraW5nU3RvcmUgOlxuICAgICAgeyBkYXRhYmFzZTogXCJcIiwgc3RvcmU6IFwiXCIsIHZlcnNpb246IDAgfTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IGBsb2NhbFN0b3JhZ2VgIGZhbGxiYWNrIHN0b3JhZ2UuXG4gICAqIFxuICAgKiAqT25seSB1c2VmdWwgZm9yIGludGVyb3BlcmFiaWxpdHkuKlxuICAgKiBcbiAgICogQHJldHVybnMgYGxvY2FsU3RvcmFnZWAgcHJlZml4LlxuICAgKiAqKlZhbHVlcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBzdG9yYWdlIGlzIG5vdCBgbG9jYWxTdG9yYWdlYCwgc28gaXQgc2hvdWxkIGJlIHVzZWQgYWZ0ZXIgYW4gZW5naW5lIGNoZWNrKiouXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvYmxvYi9tYWluL2RvY3MvSU5URVJPUEVSQUJJTElUWS5tZH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaWYgKHRoaXMuc3RvcmFnZU1hcC5iYWNraW5nRW5naW5lID09PSAnbG9jYWxTdG9yYWdlJykge1xuICAgKiAgIGNvbnN0IHsgcHJlZml4IH0gPSB0aGlzLnN0b3JhZ2VNYXAuZmFsbGJhY2tCYWNraW5nU3RvcmU7XG4gICAqIH1cbiAgICovXG4gIGdldCBmYWxsYmFja0JhY2tpbmdTdG9yZSgpOiB7IHByZWZpeDogc3RyaW5nOyB9IHtcblxuICAgIHJldHVybiAodGhpcy4jZGF0YWJhc2UgaW5zdGFuY2VvZiBMb2NhbFN0b3JhZ2VEYXRhYmFzZSkgP1xuICAgICAgeyBwcmVmaXg6IHRoaXMuI2RhdGFiYXNlLnByZWZpeCB9IDpcbiAgICAgIHsgcHJlZml4OiBcIlwiIH07XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gaXRlbSB2YWx1ZSBpbiBzdG9yYWdlLlxuICAgKiBcbiAgICogTm90ZSB0aGF0OlxuICAgKiAqIG5vdCBmaW5kaW5nIGFuIGl0ZW0gaXMgbm90IGFuIGVycm9yLCBpdCBzdWNjZWVkcyBidXQgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAgICogKiB5b3UgZG8gKm5vdCogbmVlZCB0byB1bnN1YnNjcmliZSAoaXQgaXMgYSBzZWxmLWNvbXBsZXRpbmcgT2JzZXJ2YWJsZSksXG4gICAqICogeW91IHdpbGwgb25seSBnZXQgKm9uZSogdmFsdWU6IHRoZSBPYnNlcnZhYmxlIGlzIGhlcmUgZm9yIGFzeW5jaHJvbnkgYnV0IGlzICpub3QqIG1lYW50IHRvIGVtaXQgYWdhaW4gd2hlbiB0aGUgc3RvcmVkIGRhdGEgaXMgY2hhbmdlZC4gSWYgeW91IG5lZWQgdG8gd2F0Y2ggdGhlIHZhbHVlLCBzZWUgdGhlIGB3YXRjaGAgbWV0aG9kLlxuICAgKiBcbiAgICogRG8gbm90IGZvcmdldCBpdCBpcyBjbGllbnQtc2lkZSBzdG9yYWdlOiAqKmFsd2F5cyBjaGVjayB0aGUgZGF0YSoqLCBhcyBpdCBjb3VsZCBoYXZlIGJlZW4gZm9yZ2VkLlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL1ZBTElEQVRJT04ubWR9XG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkIEpTT04gc2NoZW1hIHRvIHZhbGlkYXRlIHRoZSBkYXRhXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtJ3MgdmFsdWUgaWYgdGhlIGtleSBleGlzdHMsIGB1bmRlZmluZWRgIG90aGVyd2lzZSwgd3JhcHBlZCBpbiBhIFJ4SlMgT2JzZXJ2YWJsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuZ2V0KCdrZXknLCB7IHR5cGU6ICdzdHJpbmcnIH0pLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAqICAgcmVzdWx0OyAvLyBzdHJpbmcgb3IgdW5kZWZpbmVkXG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbnRlcmZhY2UgVXNlciB7XG4gICAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gICAqICAgbGFzdE5hbWU/OiBzdHJpbmc7XG4gICAqIH1cbiAgICpcbiAgICogY29uc3Qgc2NoZW1hID0ge1xuICAgKiAgIHR5cGU6ICdvYmplY3QnLFxuICAgKiAgIHByb3BlcnRpZXM6IHtcbiAgICogICAgIGZpcnN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgKiAgICAgbGFzdE5hbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICogICB9LFxuICAgKiAgIHJlcXVpcmVkOiBbJ2ZpcnN0TmFtZSddLFxuICAgKiB9IHNhdGlzZmllcyBKU09OU2NoZW1hO1xuICAgKlxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuZ2V0PFVzZXI+KCd1c2VyJywgc2NoZW1hKS5zdWJzY3JpYmUoKHVzZXIpID0+IHtcbiAgICogICBpZiAodXNlcikge1xuICAgKiAgICAgdXNlci5maXJzdE5hbWU7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj47XG4gIGdldDxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hU3RyaW5nKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgZXh0ZW5kcyBudW1iZXIgPSBudW1iZXI+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlcik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIGdldDxUIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFCb29sZWFuKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXSA9IHN0cmluZ1tdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hU3RyaW5nPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzIC0tIEJldHRlciBmb3IgZG9jdW1lbnRhdGlvblxuICBnZXQ8VCBleHRlbmRzIHJlYWRvbmx5IG51bWJlcltdID0gbnVtYmVyW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFJbnRlZ2VyIHwgSlNPTlNjaGVtYU51bWJlcj4pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuaWZpZWQtc2lnbmF0dXJlcyAtLSBCZXR0ZXIgZm9yIGRvY3VtZW50YXRpb25cbiAgZ2V0PFQgZXh0ZW5kcyByZWFkb25seSBib29sZWFuW10gPSBib29sZWFuW10+KGtleTogc3RyaW5nLCBzY2hlbWE6IEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFCb29sZWFuPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIGdldDxUPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgZ2V0PFQgPSB1bmtub3duPihrZXk6IHN0cmluZywgc2NoZW1hPzogSlNPTlNjaGVtYSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuXG4gICAgLyogR2V0IHRoZSBkYXRhIGluIHN0b3JhZ2UgKi9cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuZ2V0KGtleSkucGlwZShcbiAgICAgIC8qIENoZWNrIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2UuZ2V0KGtleSkpLFxuICAgICAgbWVyZ2VNYXAoKGRhdGEpID0+IHtcblxuICAgICAgICAvKiBObyBuZWVkIHRvIHZhbGlkYXRlIGlmIHRoZSBkYXRhIGlzIGVtcHR5ICovXG4gICAgICAgIGlmICgoZGF0YSA9PT0gdW5kZWZpbmVkKSB8fCAoZGF0YSA9PT0gbnVsbCkpIHtcblxuICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hKSB7XG5cbiAgICAgICAgICAvKiBWYWxpZGF0ZSBkYXRhIGFnYWluc3QgYSBKU09OIHNjaGVtYSBpZiBwcm92aWRlZCAqL1xuICAgICAgICAgIGlmICghdGhpcy4janNvblZhbGlkYXRvci52YWxpZGF0ZShkYXRhLCBzY2hlbWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIERhdGEgaGF2ZSBiZWVuIGNoZWNrZWQsIHNvIGl0J3MgT0sgdG8gY2FzdCAqL1xuICAgICAgICAgIHJldHVybiBvZihkYXRhIGFzIFQgfCB1bmRlZmluZWQpO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvKiBDYXN0IHRvIHVua25vd24gYXMgdGhlIGRhdGEgd2Fzbid0IGNoZWNrZWQgKi9cbiAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xuXG4gICAgICB9KSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgYW4gaXRlbSBpbiBzdG9yYWdlLlxuICAgKiBcbiAgICogTm90ZSB0aGF0OlxuICAgKiAqIHlvdSAqZG8qIG5lZWQgdG8gc3Vic2NyaWJlLCBldmVuIGlmIHlvdSBkbyBub3QgaGF2ZSBzb21ldGhpbmcgc3BlY2lmaWMgdG8gZG8gYWZ0ZXIgd3JpdGluZyBpbiBzdG9yYWdlLCBvdGhlcndpc2Ugbm90aGluZyBoYXBwZW5zIChiZWNhdXNlIGl0IGlzIGhvdyBSeEpTIE9ic2VydmFibGVzIHdvcmspLFxuICAgKiAqIGJ1dCB5b3UgZG8gKm5vdCogbmVlZCB0byB1bnN1YnNjcmliZSAoaXQgaXMgYSBzZWxmLWNvbXBsZXRpbmcgT2JzZXJ2YWJsZSksXG4gICAqICogc2V0dGluZyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgd2lsbCByZW1vdmUgdGhlIGl0ZW0gdG8gYXZvaWQgc29tZSBicm93c2VycyBpc3N1ZXMsXG4gICAqICogeW91IHNob3VsZCBzdGljayB0byBzZXJpYWxpemFibGUgSlNPTiBkYXRhLCBtZWFuaW5nIHByaW1pdGl2ZSB0eXBlcywgYXJyYXlzIGFuZCBsaXRlcmFsIG9iamVjdHMuIERhdGUsIE1hcCwgU2V0LCBCbG9iIGFuZCBvdGhlciBzcGVjaWFsIHN0cnVjdHVyZXMgY2FuIGNhdXNlIGlzc3VlcyBpbiBzb21lIHNjZW5hcmlvcy5cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9TRVJJQUxJWkFUSU9OLm1kfVxuICAgKiBcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcGFyYW0gZGF0YSBUaGUgaXRlbSdzIHZhbHVlXG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgSlNPTiBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGRhdGFcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLnNldCgna2V5JywgJ3ZhbHVlJykuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIHNldChrZXk6IHN0cmluZywgZGF0YTogdW5rbm93biwgc2NoZW1hPzogSlNPTlNjaGVtYSk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICAvKiBTdG9yaW5nIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpcyB1c2VsZXNzIGFuZCBjYW4gY2F1c2UgaXNzdWVzIGluIGBpbmRleGVkRGJgIGluIHNvbWUgYnJvd3NlcnMsXG4gICAgICogc28gcmVtb3ZpbmcgaXRlbSBpbnN0ZWFkIGZvciBhbGwgc3RvcmFnZXMgdG8gaGF2ZSBhIGNvbnNpc3RlbnQgQVBJICovXG4gICAgaWYgKChkYXRhID09PSB1bmRlZmluZWQpIHx8IChkYXRhID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgLyogVmFsaWRhdGUgZGF0YSBhZ2FpbnN0IGEgSlNPTiBzY2hlbWEgaWYgcHJvdmlkZWQgKi9cbiAgICBpZiAoc2NoZW1hICYmICF0aGlzLiNqc29uVmFsaWRhdG9yLnZhbGlkYXRlKGRhdGEsIHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2RhdGFiYXNlLnNldChrZXksIGRhdGEpLnBpcGUoXG4gICAgICAvKiBDYXRjaCBpZiBgaW5kZXhlZERiYCBpcyBicm9rZW4gKi9cbiAgICAgIHRoaXMuI2NhdGNoSURCQnJva2VuKCgpID0+IHRoaXMuI2RhdGFiYXNlLnNldChrZXksIGRhdGEpKSxcbiAgICAgIC8qIE5vdGlmeSB3YXRjaGVycyAobXVzdCBiZSBsYXN0IGJlY2F1c2UgaXQgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMpICovXG4gICAgICB0YXAoKCkgPT4geyB0aGlzLiNub3RpZnkoa2V5LCBkYXRhKTsgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gaXRlbSBpbiBzdG9yYWdlLlxuICAgKiBcbiAgICogTm90ZSB0aGF0OlxuICAgKiAqIHlvdSAqZG8qIG5lZWQgdG8gc3Vic2NyaWJlLCBldmVuIGlmIHlvdSBkbyBub3QgaGF2ZSBzb21ldGhpbmcgc3BlY2lmaWMgdG8gZG8gYWZ0ZXIgZGVsZXRpbmcsIG90aGVyd2lzZSBub3RoaW5nIGhhcHBlbnMgKGJlY2F1c2UgaXQgaXMgaG93IFJ4SlMgT2JzZXJ2YWJsZXMgd29yayksXG4gICAqICogYnV0IHlvdSBkbyAqbm90KiBuZWVkIHRvIHVuc3Vic2NyaWJlIChpdCBpcyBhIHNlbGYtY29tcGxldGluZyBPYnNlcnZhYmxlKS5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmRlbGV0ZSgna2V5Jykuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuZGVsZXRlKGtleSkucGlwZShcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgdGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2UuZGVsZXRlKGtleSkpLFxuICAgICAgLyogTm90aWZ5IHdhdGNoZXJzIChtdXN0IGJlIGxhc3QgYmVjYXVzZSBpdCBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcykgKi9cbiAgICAgIHRhcCgoKSA9PiB7IHRoaXMuI25vdGlmeShrZXksIHVuZGVmaW5lZCk7IH0pLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIGl0ZW1zIGluIHN0b3JhZ2UuXG4gICAqIFxuICAgKiBOb3RlIHRoYXQ6XG4gICAqICogeW91ICpkbyogbmVlZCB0byBzdWJzY3JpYmUsIGV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIHNvbWV0aGluZyBzcGVjaWZpYyB0byBkbyBhZnRlciBjbGVhcmluZywgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucyAoYmVjYXVzZSBpdCBpcyBob3cgUnhKUyBPYnNlcnZhYmxlcyB3b3JrKSxcbiAgICogKiBidXQgeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKiBcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmNsZWFyKCkuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICovXG4gIGNsZWFyKCk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuY2xlYXIoKS5waXBlKFxuICAgICAgLyogQ2F0Y2ggaWYgYGluZGV4ZWREYmAgaXMgYnJva2VuICovXG4gICAgICB0aGlzLiNjYXRjaElEQkJyb2tlbigoKSA9PiB0aGlzLiNkYXRhYmFzZS5jbGVhcigpKSxcbiAgICAgIC8qIE5vdGlmeSB3YXRjaGVycyAobXVzdCBiZSBsYXN0IGJlY2F1c2UgaXQgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMpICovXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLiNub3RpZmllcnMua2V5cygpKSB7XG4gICAgICAgICAgdGhpcy4jbm90aWZ5KGtleSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBzdG9yZWQgaW4gc3RvcmFnZS5cbiAgICogXG4gICAqIE5vdGUgKip0aGlzIGlzIGFuICppdGVyYXRpbmcqIE9ic2VydmFibGUqKjpcbiAgICogKiBpZiB0aGVyZSBpcyBubyBrZXksIHRoZSBgbmV4dGAgY2FsbGJhY2sgd2lsbCBub3QgYmUgaW52b2tlZCxcbiAgICogKiBpZiB5b3UgbmVlZCB0byB3YWl0IHRoZSB3aG9sZSBvcGVyYXRpb24gdG8gZW5kLCBiZSBzdXJlIHRvIGFjdCBpbiB0aGUgYGNvbXBsZXRlYCBjYWxsYmFjayxcbiAgICogYXMgdGhpcyBPYnNlcnZhYmxlIGNhbiBlbWl0IHNldmVyYWwgdmFsdWVzIGFuZCBzbyB3aWxsIGludm9rZSB0aGUgYG5leHRgIGNhbGxiYWNrIHNldmVyYWwgdGltZXMsXG4gICAqICogeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKiBcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIHRoZSBrZXlzIHdyYXBwZWQgaW4gYSBSeEpTIE9ic2VydmFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5zdG9yYWdlTWFwLmtleXMoKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChrZXkpID0+IHsgY29uc29sZS5sb2coa2V5KTsgfSxcbiAgICogICBjb21wbGV0ZTogKCkgPT4geyBjb25zb2xlLmxvZygnRG9uZScpOyB9LFxuICAgKiB9KTtcbiAgICovXG4gIGtleXMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiB0aGlzLiNkYXRhYmFzZS5rZXlzKClcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2Uua2V5cygpKSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyBpZiBhIGtleSBleGlzdHMgaW4gc3RvcmFnZS5cbiAgICogXG4gICAqIE5vdGUgeW91IGRvICpub3QqIG5lZWQgdG8gdW5zdWJzY3JpYmUgKGl0IGlzIGEgc2VsZi1jb21wbGV0aW5nIE9ic2VydmFibGUpLlxuICAgKiBcbiAgICogQHJldHVybnMgQSBSeEpTIE9ic2VydmFibGUgdGVsbGluZyBpZiB0aGUga2V5IGV4aXN0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnN0b3JhZ2VNYXAuaGFzKCdrZXknKS5zdWJzY3JpYmUoKGhhc0tleSkgPT4ge1xuICAgKiAgIGlmIChoYXNLZXkpIHt9XG4gICAqIH0pO1xuICAgKi9cbiAgaGFzKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG5cbiAgICByZXR1cm4gdGhpcy4jZGF0YWJhc2UuaGFzKGtleSlcbiAgICAgIC8qIENhdGNoIGlmIGBpbmRleGVkRGJgIGlzIGJyb2tlbiAqL1xuICAgICAgLnBpcGUodGhpcy4jY2F0Y2hJREJCcm9rZW4oKCkgPT4gdGhpcy4jZGF0YWJhc2UuaGFzKGtleSkpKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIGFuIGl0ZW0gdmFsdWUgaW4gc3RvcmFnZS5cbiAgICogXG4gICAqIE5vdGUgdGhhdDpcbiAgICogKiBpdCBpcyBhbiBpbmZpbml0ZSBPYnNlcnZhYmxlLCBkbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlLFxuICAgKiAqIG9ubHkgY2hhbmdlcyBkb25lIHZpYSB0aGlzIGxpYnJhcnkgd2lsbCBiZSB3YXRjaGVkLCBleHRlcm5hbCBjaGFuZ2VzIGluIHN0b3JhZ2UgY2Fubm90IGJlIGRldGVjdGVkLlxuICAgKiBcbiAgICogVGhlIHNpZ25hdHVyZSBoYXMgbWFueSBvdmVybG9hZHMgZHVlIHRvIHZhbGlkYXRpb24sICoqcGxlYXNlIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uLioqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9WQUxJREFUSU9OLm1kXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5IHRvIHdhdGNoXG4gICAqIEBwYXJhbSBzY2hlbWEgT3B0aW9uYWwgSlNPTiBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGluaXRpYWwgdmFsdWVcbiAgICogQHJldHVybnMgQW4gaW5maW5pdGUgT2JzZXJ2YWJsZSBnaXZpbmcgdGhlIGN1cnJlbnQgdmFsdWVcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIENvbXBvbmVudCgpXG4gICAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICogXG4gICAqICAgcHJpdmF0ZSBzdG9yYWdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgKiBcbiAgICogICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICogICAgIHRoaXMuc3RvcmFnZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RvcmFnZU1hcC53YXRjaCgna2V5JywgeyB0eXBlOiAnc3RyaW5nJyB9KS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgKiAgICAgICByZXN1bHQ7IC8vIHN0cmluZyBvciB1bmRlZmluZWRcbiAgICogICAgIH0pO1xuICAgKiAgIH1cbiAgICogXG4gICAqICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAqICAgICB0aGlzLnN0b3JhZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAqICAgfVxuICAgKiBcbiAgICogfVxuICAgKi9cbiAgd2F0Y2goa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+O1xuICB3YXRjaDxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hU3RyaW5nKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCBleHRlbmRzIG51bWJlciA9IG51bWJlcj4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hTnVtYmVyKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCBleHRlbmRzIGJvb2xlYW4gPSBib29sZWFuPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQm9vbGVhbik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIHdhdGNoPFQgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXSA9IHN0cmluZ1tdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hU3RyaW5nPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzIC0tIEJldHRlciBmb3IgZG9jdW1lbnRhdGlvblxuICB3YXRjaDxUIGV4dGVuZHMgcmVhZG9ubHkgbnVtYmVyW10gPSBudW1iZXJbXT4oa2V5OiBzdHJpbmcsIHNjaGVtYTogSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hTnVtYmVyPik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzIC0tIEJldHRlciBmb3IgZG9jdW1lbnRhdGlvblxuICB3YXRjaDxUIGV4dGVuZHMgcmVhZG9ubHkgYm9vbGVhbltdID0gYm9vbGVhbltdPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hQm9vbGVhbj4pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xuICB3YXRjaDxUPihrZXk6IHN0cmluZywgc2NoZW1hOiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbiAgd2F0Y2g8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCBzY2hlbWE/OiBKU09OU2NoZW1hKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG5cbiAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgbm90aWZpZXIgKi9cbiAgICBpZiAoIXRoaXMuI25vdGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgdGhpcy4jbm90aWZpZXJzLnNldChrZXksIG5ldyBSZXBsYXlTdWJqZWN0KDEpKTtcbiAgICB9XG5cbiAgICAvKiBOb24tbnVsbCBhc3NlcnRpb24gaXMgcmVxdWlyZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGRvZXNuJ3QgbmFycm93IGAuaGFzKClgIHlldCAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uIC0tIEVuc3VyZWQgYnkgdGhlIGxvZ2ljXG4gICAgY29uc3Qgbm90aWZpZXIgPSB0aGlzLiNub3RpZmllcnMuZ2V0KGtleSkhO1xuXG4gICAgLyogR2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgKi9cbiAgICAoc2NoZW1hID8gdGhpcy5nZXQ8VD4oa2V5LCBzY2hlbWEpIDogdGhpcy5nZXQoa2V5KSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICAgICAgbm90aWZpZXIubmV4dChyZXN1bHQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgbm90aWZpZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qIE9ubHkgdGhlIHB1YmxpYyBBUEkgb2YgdGhlIE9ic2VydmFibGUgc2hvdWxkIGJlIHJldHVybmVkICovXG4gICAgcmV0dXJuIChzY2hlbWEgP1xuICAgICAgbm90aWZpZXIuYXNPYnNlcnZhYmxlKCkgYXMgT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiA6XG4gICAgICBub3RpZmllci5hc09ic2VydmFibGUoKVxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgd2hlbiBhIHZhbHVlIGNoYW5nZXNcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcGFyYW0gZGF0YSBUaGUgbmV3IHZhbHVlXG4gICAqL1xuICAjbm90aWZ5KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuXG4gICAgY29uc3Qgbm90aWZpZXIgPSB0aGlzLiNub3RpZmllcnMuZ2V0KGtleSk7XG5cbiAgICBpZiAobm90aWZpZXIpIHtcbiAgICAgIG5vdGlmaWVyLm5leHQodmFsdWUpO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIFJ4SlMgb3BlcmF0b3IgdG8gY2F0Y2ggaWYgYGluZGV4ZWREQmAgaXMgYnJva2VuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25DYWxsYmFjayBDYWxsYmFjayB3aXRoIHRoZSBvcGVyYXRpb24gdG8gcmVkb1xuICAgKi9cbiAgI2NhdGNoSURCQnJva2VuPFQ+KG9wZXJhdGlvbkNhbGxiYWNrOiAoKSA9PiBPYnNlcnZhYmxlPFQ+KTogT3BlcmF0b3JGdW5jdGlvbjxULCBUPiB7XG5cbiAgICByZXR1cm4gY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcblxuICAgICAgLyogQ2hlY2sgaWYgYGluZGV4ZWREQmAgaXMgYnJva2VuIGJhc2VkIG9uIGVycm9yIG1lc3NhZ2UgKHRoZSBzcGVjaWZpYyBlcnJvciBjbGFzcyBzZWVtcyB0byBiZSBsb3N0IGluIHRoZSBwcm9jZXNzKSAqL1xuICAgICAgaWYgKChlcnJvciAhPT0gdW5kZWZpbmVkKSAmJiAoZXJyb3IgIT09IG51bGwpXG4gICAgICAgICYmICh0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIpICYmIChcIm1lc3NhZ2VcIiBpbiBlcnJvcilcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAtLSBSZXF1aXJlZCBiZWNhdXNlIFR5cGVTY3JpcHQgbmFycm93aW5nIGlzIG5vdCB3b3JraW5nIGhlcmVcbiAgICAgICAgJiYgKGVycm9yLm1lc3NhZ2UgPT09IElEQl9CUk9LRU5fRVJST1IpKSB7XG5cbiAgICAgICAgLyogV2hlbiBzdG9yYWdlIGlzIGZ1bGx5IGRpc2FibGVkIGluIGJyb3dzZXIgKHZpYSB0aGUgXCJCbG9jayBhbGwgY29va2llc1wiIG9wdGlvbiksXG4gICAgICAgICAqIGp1c3QgdHJ5aW5nIHRvIGNoZWNrIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIGNhdXNlcyBhIHNlY3VyaXR5IGV4Y2VwdGlvbi5cbiAgICAgICAgICogUHJldmVudHMgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9pc3N1ZXMvMTE4XG4gICAgICAgICAqL1xuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgaWYgKFwiZ2V0SXRlbVwiIGluIGxvY2FsU3RvcmFnZSkge1xuXG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBgbG9jYWxTdG9yYWdlYCBpZiBhdmFpbGFibGUgKi9cbiAgICAgICAgICAgIHRoaXMuI2RhdGFiYXNlID0gbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlKCk7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBtZW1vcnkgc3RvcmFnZSBvdGhlcndpc2UgKi9cbiAgICAgICAgICAgIHRoaXMuI2RhdGFiYXNlID0gbmV3IE1lbW9yeURhdGFiYXNlKCk7XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCB7XG5cbiAgICAgICAgICAvKiBGYWxsYmFjayB0byBtZW1vcnkgc3RvcmFnZSBvdGhlcndpc2UgKi9cbiAgICAgICAgICB0aGlzLiNkYXRhYmFzZSA9IG5ldyBNZW1vcnlEYXRhYmFzZSgpO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvKiBSZWRvIHRoZSBvcGVyYXRpb24gKi9cbiAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkNhbGxiYWNrKCk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLyogT3RoZXJ3aXNlLCByZXRocm93IHRoZSBlcnJvciAqL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRISVMgTUVUSE9EIElTIEZPUiBJTlRFUk5BTCBQVVJQT1NFIE9OTFkgQU5EIE1VU1QgTk9UIEJFIFVTRUQsXG4gICAqIElUIENBTiBCRSBSRU1PVkVEIEFUIEFOWSBUSU1FIEFORCBNRVNTSU5HIFdJVEggSVQgQ0FOIENBVVNFIElTU1VFU1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAaWdub3JlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBTaWxlbmNlIHRoZSBub3QgdXNlZCBlcnJvciwgaXQgaXMgdXNlZCBpbiB0ZXN0c1xuICAvLyBAdHMtaWdub3JlXG4gIHByaXZhdGUgybVpbnRlcm5hbEdldERhdGFiYXNlKCk6IExvY2FsRGF0YWJhc2Uge1xuXG4gICAgcmV0dXJuIHRoaXMuI2RhdGFiYXNlO1xuXG4gIH1cblxufVxuIl19
@@ -1,59 +0,0 @@
1
- import { InjectionToken } from "@angular/core";
2
- /**
3
- * Token to provide a prefix to `localStorage` keys.
4
- */
5
- export const LS_PREFIX = new InjectionToken("localStoragePrefix", {
6
- providedIn: "root",
7
- factory: () => ""
8
- });
9
- /**
10
- * Default name used for `indexedDB` database.
11
- */
12
- export const DEFAULT_IDB_DB_NAME = "ngStorage";
13
- /**
14
- * Token to provide `indexedDB` database name.
15
- */
16
- export const IDB_DB_NAME = new InjectionToken("localStorageIDBDBName", {
17
- providedIn: "root",
18
- factory: () => DEFAULT_IDB_DB_NAME
19
- });
20
- /**
21
- * Default version used for `indexedDB` database.
22
- */
23
- export const DEFAULT_IDB_DB_VERSION = 1;
24
- /**
25
- * Token to provide `indexedDB` database version.
26
- * Must be an unsigned **integer**.
27
- */
28
- export const IDB_DB_VERSION = new InjectionToken("localStorageIDBDBVersion", {
29
- providedIn: "root",
30
- factory: () => DEFAULT_IDB_DB_VERSION
31
- });
32
- /**
33
- * Default name used for `indexedDB` object store.
34
- */
35
- export const DEFAULT_IDB_STORE_NAME = "localStorage";
36
- /**
37
- * Token to provide `indexedDB` store name.
38
- * For backward compatibility, the default can't be set now, `IndexedDBDatabase` will do it at runtime.
39
- */
40
- export const IDB_STORE_NAME = new InjectionToken("localStorageIDBStoreName", {
41
- providedIn: "root",
42
- factory: () => DEFAULT_IDB_STORE_NAME
43
- });
44
- /**
45
- * Default value for interoperability with native `indexedDB` and other storage libs,
46
- * by changing how values are stored in `indexedDB` database.
47
- */
48
- export const DEFAULT_IDB_NO_WRAP = true;
49
- /**
50
- * Token to allow interoperability with native `indexedDB` and other storage libs,
51
- * by changing how values are stored in `indexedDB` database.
52
- * Defaults to `true`. Change to `false` for backward compatiblity in existing applications.
53
- * **DO NOT CHANGE THIS BEHAVIOR ONCE IN PRODUCTION**, as it would break with existing data.
54
- */
55
- export const IDB_NO_WRAP = new InjectionToken("localStorageIDBWrap", {
56
- providedIn: "root",
57
- factory: () => DEFAULT_IDB_NO_WRAP
58
- });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3NyYy9saWIvdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVMsb0JBQW9CLEVBQUU7SUFDeEUsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7Q0FDbEIsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQVMsdUJBQXVCLEVBQUU7SUFDN0UsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQjtDQUNuQyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUV4Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsMEJBQTBCLEVBQUU7SUFDbkYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNCQUFzQjtDQUN0QyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLGNBQWMsQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsMEJBQTBCLEVBQUU7SUFDbkYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNCQUFzQjtDQUN0QyxDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFeEM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQVUscUJBQXFCLEVBQUU7SUFDNUUsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQjtDQUNuQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSBhIHByZWZpeCB0byBgbG9jYWxTdG9yYWdlYCBrZXlzLlxuICovXG5leHBvcnQgY29uc3QgTFNfUFJFRklYID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJsb2NhbFN0b3JhZ2VQcmVmaXhcIiwge1xuICBwcm92aWRlZEluOiBcInJvb3RcIixcbiAgZmFjdG9yeTogKCkgPT4gXCJcIlxufSk7XG5cbi8qKlxuICogRGVmYXVsdCBuYW1lIHVzZWQgZm9yIGBpbmRleGVkREJgIGRhdGFiYXNlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JREJfREJfTkFNRSA9IFwibmdTdG9yYWdlXCI7XG5cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSBgaW5kZXhlZERCYCBkYXRhYmFzZSBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgSURCX0RCX05BTUUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImxvY2FsU3RvcmFnZUlEQkRCTmFtZVwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9EQl9OQU1FXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IHZlcnNpb24gdXNlZCBmb3IgYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lEQl9EQl9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBUb2tlbiB0byBwcm92aWRlIGBpbmRleGVkREJgIGRhdGFiYXNlIHZlcnNpb24uXG4gKiBNdXN0IGJlIGFuIHVuc2lnbmVkICoqaW50ZWdlcioqLlxuICovXG5leHBvcnQgY29uc3QgSURCX0RCX1ZFUlNJT04gPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImxvY2FsU3RvcmFnZUlEQkRCVmVyc2lvblwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9EQl9WRVJTSU9OXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IG5hbWUgdXNlZCBmb3IgYGluZGV4ZWREQmAgb2JqZWN0IHN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JREJfU1RPUkVfTkFNRSA9IFwibG9jYWxTdG9yYWdlXCI7XG5cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSBgaW5kZXhlZERCYCBzdG9yZSBuYW1lLlxuICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSBkZWZhdWx0IGNhbid0IGJlIHNldCBub3csIGBJbmRleGVkREJEYXRhYmFzZWAgd2lsbCBkbyBpdCBhdCBydW50aW1lLlxuICovXG5leHBvcnQgY29uc3QgSURCX1NUT1JFX05BTUUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImxvY2FsU3RvcmFnZUlEQlN0b3JlTmFtZVwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9TVE9SRV9OQU1FXG59KTtcblxuLyoqXG4gKiBEZWZhdWx0IHZhbHVlIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggbmF0aXZlIGBpbmRleGVkREJgIGFuZCBvdGhlciBzdG9yYWdlIGxpYnMsXG4gKiBieSBjaGFuZ2luZyBob3cgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lEQl9OT19XUkFQID0gdHJ1ZTtcblxuLyoqXG4gKiBUb2tlbiB0byBhbGxvdyBpbnRlcm9wZXJhYmlsaXR5IHdpdGggbmF0aXZlIGBpbmRleGVkREJgIGFuZCBvdGhlciBzdG9yYWdlIGxpYnMsXG4gKiBieSBjaGFuZ2luZyBob3cgdmFsdWVzIGFyZSBzdG9yZWQgaW4gYGluZGV4ZWREQmAgZGF0YWJhc2UuXG4gKiBEZWZhdWx0cyB0byBgdHJ1ZWAuIENoYW5nZSB0byBgZmFsc2VgIGZvciBiYWNrd2FyZCBjb21wYXRpYmxpdHkgaW4gZXhpc3RpbmcgYXBwbGljYXRpb25zLlxuICogKipETyBOT1QgQ0hBTkdFIFRISVMgQkVIQVZJT1IgT05DRSBJTiBQUk9EVUNUSU9OKiosIGFzIGl0IHdvdWxkIGJyZWFrIHdpdGggZXhpc3RpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IElEQl9OT19XUkFQID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KFwibG9jYWxTdG9yYWdlSURCV3JhcFwiLCB7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxuICBmYWN0b3J5OiAoKSA9PiBERUZBVUxUX0lEQl9OT19XUkFQXG59KTtcblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSBpcyBvbmx5IGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksICoqZG8gbm90IGFkZCBpdCBieSB5b3Vyc2VsZioqXG4gKiBcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlQ29uZmlnIHtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBwcm92aWRlTG9jYWxTdG9yYWdlUHJlZml4KClgIG1ldGhvZCBpbnN0ZWFkXG4gICAqL1xuICBMU1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBwcm92aWRlSW5kZXhlZERCRGF0YUJhc2VOYW1lKClgIG1ldGhvZCBpbnN0ZWFkXG4gICAqL1xuICBJREJEQk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgcHJvdmlkZUluZGV4ZWREQlN0b3JlTmFtZSgpYCBtZXRob2QgaW5zdGVhZFxuICAgKi9cbiAgSURCU3RvcmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHByb3ZpZGVJbmRleGVkREJEYXRhQmFzZVZlcnNpb24oKWAgbWV0aG9kIGluc3RlYWRcbiAgICovXG4gIElEQkRCVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogQWxsb3dzIGludGVyb3BlcmFiaWxpdHkgd2l0aCBuYXRpdmUgYGluZGV4ZWREQmAgYW5kIG90aGVyIHN0b3JhZ2UgbGlicyxcbiAgICogYnkgY2hhbmdpbmcgaG93IHZhbHVlcyBhcmUgc3RvcmVkIGluIGBpbmRleGVkREJgIGRhdGFiYXNlLlxuICAgKiBcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLiBDaGFuZ2UgdG8gYGZhbHNlYCBmb3IgYmFja3dhcmQgY29tcGF0aWJsaXR5IGluIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy5cbiAgICogXG4gICAqICoqRE8gTk9UIENIQU5HRSBUSElTIEJFSEFWSU9SIE9OQ0UgSU4gUFJPRFVDVElPTioqLCBhcyBpdCB3b3VsZCBicmVhayB3aXRoIGV4aXN0aW5nIGRhdGEuXG4gICAqL1xuICBJREJOb1dyYXA/OiBib29sZWFuO1xuXG59XG4iXX0=
@@ -1,5 +0,0 @@
1
- /* All schemas interfaces must have a required and different `type`,
2
- * to create a TypeScript discriminant union type.
3
- * Avoid https://github.com/cyrilletuzi/angular-async-local-storage/issues/64 */
4
- export {};
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2xpYi92YWxpZGF0aW9uL2pzb24tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztnRkFFZ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBBbGwgc2NoZW1hcyBpbnRlcmZhY2VzIG11c3QgaGF2ZSBhIHJlcXVpcmVkIGFuZCBkaWZmZXJlbnQgYHR5cGVgLFxuICogdG8gY3JlYXRlIGEgVHlwZVNjcmlwdCBkaXNjcmltaW5hbnQgdW5pb24gdHlwZS5cbiAqIEF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzY0ICovXG5cbi8qKlxuICogSlNPTiBTY2hlbWEgdG8gZGVzY3JpYmUgYSBib29sZWFuIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFCb29sZWFuIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYSBib29sZWFuIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogXCJib29sZWFuXCI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIHRoaXMuXG4gICAqL1xuICBjb25zdD86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSB0byBkZXNjcmliZSBhIG51bWJlciB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hTnVtYmVyIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYSBudW1lcmljIHZhbHVlLlxuICAgKi9cbiAgdHlwZTogXCJudW1iZXJcIjtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgc3RyaWN0bHkgZXF1YWwgdG8gdGhpcy5cbiAgICovXG4gIGNvbnN0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byBvbmUgb2YgdGhlIHZhbHVlIG9mIGVudW0uXG4gICAqL1xuICBlbnVtPzogcmVhZG9ubHkgbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGEgbXVsdGlwbGUgb2YgeC5cbiAgICogTXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gMC5cbiAgICovXG4gIG11bHRpcGxlT2Y/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGxvd2VyIG9yIGVxdWFsIHRoYW4gdGhpcyBtYXhpbXVtLlxuICAgKi9cbiAgbWF4aW11bT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgc3RyaWN0bHkgbG93ZXIgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBleGNsdXNpdmVNYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgbWluaW11bT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHRoaXMgbWluaW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1pbmltdW0/OiBudW1iZXI7XG5cbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSB0byBkZXNjcmliZSBhbiBpbnRlZ2VyIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFJbnRlZ2VyIHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gaW50ZWdlciB2YWx1ZS5cbiAgICovXG4gIHR5cGU6IFwiaW50ZWdlclwiO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBzdHJpY3RseSBlcXVhbCB0byB0aGlzLlxuICAgKi9cbiAgY29uc3Q/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIG9uZSBvZiB0aGUgdmFsdWUgb2YgZW51bS5cbiAgICovXG4gIGVudW0/OiByZWFkb25seSBudW1iZXJbXTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgYSBtdWx0aXBsZSBvZiB4LlxuICAgKiBNdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLlxuICAgKi9cbiAgbXVsdGlwbGVPZj86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBudW1iZXIgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1heGltdW0uXG4gICAqL1xuICBtYXhpbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBsb3dlciB0aGFuIHRoaXMgbWF4aW11bS5cbiAgICovXG4gIGV4Y2x1c2l2ZU1heGltdW0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbnVtYmVyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGlzIG1pbmltdW0uXG4gICAqL1xuICBtaW5pbXVtPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG51bWJlciBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhpcyBtaW5pbXVtLlxuICAgKi9cbiAgZXhjbHVzaXZlTWluaW11bT86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFTdHJpbmcge1xuXG4gIC8qKlxuICAgKiBUeXBlIGZvciBhIHN0cmluZyB2YWx1ZS5cbiAgICovXG4gIHR5cGU6IFwic3RyaW5nXCI7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHN0cmljdGx5IGVxdWFsIHRvIHRoaXMuXG4gICAqL1xuICBjb25zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgc3RyaWN0bHkgZXF1YWwgdG8gb25lIG9mIHRoZSB2YWx1ZSBvZiBlbnVtLlxuICAgKi9cbiAgZW51bT86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNYXhpdW0gbGVuZ3RoIGZvciBhIHN0cmluZy5cbiAgICogTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGxlbmd0aCBmb3IgYSBzdHJpbmcuXG4gICAqIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkxlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogUGF0dGVybiB0byBtYXRjaCBmb3IgYSBzdHJpbmcuXG4gICAqIE11c3QgYmUgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sICp3aXRob3V0KiB0aGUgYC9gIGRlbGltaXRlcnMuXG4gICAqL1xuICBwYXR0ZXJuPzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogSlNPTiBzY2hlbWEgdG8gZGVzY3JpYmUgYW4gYXJyYXkgb2YgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFBcnJheSB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICovXG4gIHR5cGU6IFwiYXJyYXlcIjtcblxuICAvKipcbiAgICogU2NoZW1hIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheS5cbiAgICovXG4gIGl0ZW1zOiBKU09OU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgbG93ZXIgb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZS5cbiAgICogTXVzdCBiZSBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4SXRlbXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFycmF5IGxlbmd0aCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBvbmx5IGhhdmUgdW5pcXVlIHZhbHVlcy5cbiAgICovXG4gIHVuaXF1ZUl0ZW1zPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHRvIGRlc2NyaWJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZSB2YWx1ZXM6XG4gKiAtIGFycmF5IG9mIGJvb2xlYW5zOiBgSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYUJvb2xlYW4+YCxcbiAqIC0gYXJyYXkgb2YgbnVtYmVyczogYEpTT05TY2hlbWFBcnJheU9mPEpTT05TY2hlbWFOdW1iZXI+YCxcbiAqIC0gYXJyYXkgb2YgaW50ZWdlcnM6IGBKU09OU2NoZW1hQXJyYXlPZjxKU09OU2NoZW1hSW50ZWdlcj5gLFxuICogLSBhcnJheSBvZiBzdHJpbmdzOiBgSlNPTlNjaGVtYUFycmF5T2Y8SlNPTlNjaGVtYVN0cmluZz5gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFBcnJheU9mPFQgZXh0ZW5kcyBKU09OU2NoZW1hQm9vbGVhbiB8IEpTT05TY2hlbWFOdW1iZXIgfCBKU09OU2NoZW1hSW50ZWdlciB8IEpTT05TY2hlbWFTdHJpbmc+IHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxuICAgKi9cbiAgdHlwZTogXCJhcnJheVwiO1xuXG4gIC8qKlxuICAgKiBTY2hlbWEgZm9yIHRoZSB2YWx1ZXMgb2YgYW4gYXJyYXkuXG4gICAqL1xuICBpdGVtczogVDtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgbGVuZ3RoIGlzIGxvd2VyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1heEl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIHZhbHVlLlxuICAgKiBNdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIuXG4gICAqL1xuICBtaW5JdGVtcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXJyYXkgb25seSBoYXZlIHVuaXF1ZSB2YWx1ZXMuXG4gICAqL1xuICB1bmlxdWVJdGVtcz86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBKU09OIHNjaGVtYSB0byBkZXNjcmliZSBhIHR1cGxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFUdXBsZSB7XG5cbiAgLyoqXG4gICAqIFR5cGUgZm9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICovXG4gIHR5cGU6IFwiYXJyYXlcIjtcblxuICAvKipcbiAgICogU2NoZW1hIGZvciB0aGUgdmFsdWVzIG9mIHRoZSB0dXBsZS5cbiAgICovXG4gIGl0ZW1zPzogcmVhZG9ubHkgSlNPTlNjaGVtYVtdO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBsZW5ndGggaXMgbG93ZXIgb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZS5cbiAgICogTXVzdCBiZSBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyLlxuICAgKi9cbiAgbWF4SXRlbXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFycmF5IGxlbmd0aCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuXG4gICAqIE11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci5cbiAgICovXG4gIG1pbkl0ZW1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhcnJheSBvbmx5IGhhdmUgdW5pcXVlIHZhbHVlcy5cbiAgICovXG4gIHVuaXF1ZUl0ZW1zPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEpTT04gc2NoZW1hIHRvIGRlc2NyaWJlIGFuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hT2JqZWN0IHtcblxuICAvKipcbiAgICogVHlwZSBmb3IgYW4gb2JqZWN0LlxuICAgKi9cbiAgdHlwZTogXCJvYmplY3RcIjtcblxuICAvKipcbiAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYW5kIHRoZWlyIGFzc29jaWF0ZWQgSlNPTiBzY2hlbWFzLlxuICAgKi9cbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgSlNPTlNjaGVtYT47XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIG5hbWVzIG9mIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciBhbiBvYmplY3QuXG4gICAqIFByb3BlcnRpZXMgc2V0IGFzIHJlcXVpcmVkIHNob3VsZCBiZSBwcmVzZW50IGluIGBwcm9wZXJ0aWVzYCB0b28uXG4gICAqL1xuICByZXF1aXJlZD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG59XG5cbi8qKlxuICogU3Vic2V0IG9mIHRoZSBKU09OIFNjaGVtYSBzdGFuZGFyZC5cbiAqIFxuICogVHlwZXMgYXJlIGVuZm9yY2VkIHRvIHZhbGlkYXRlIGV2ZXJ5dGhpbmc6IGVhY2ggdmFsdWUgKiptdXN0KiogaGF2ZSBhIGB0eXBlYC5cbiAqIFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9ibG9iL21haW4vZG9jcy9WQUxJREFUSU9OLm1kfVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzY2hlbWEgPSB7IHR5cGU6ICdzdHJpbmcnIH0gc2F0aXNmaWVzIEpTT05TY2hlbWE7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjaGVtYSA9IHsgdHlwZTogJ251bWJlcicgfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0geyB0eXBlOiAnaW50ZWdlcicgfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0geyB0eXBlOiAnYm9vbGVhbicgfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0ge1xuICogICB0eXBlOiAnYXJyYXknLFxuICogICBpdGVtczogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2NoZW1hID0ge1xuICogICB0eXBlOiAnb2JqZWN0JyxcbiAqICAgcHJvcGVydGllczoge1xuICogICAgIGZpcnN0TmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogICAgIGxhc3ROYW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gKiAgIH0sXG4gKiAgIHJlcXVpcmVkOiBbJ2ZpcnN0TmFtZSddLFxuICogfSBzYXRpc2ZpZXMgSlNPTlNjaGVtYTtcbiAqL1xuZXhwb3J0IHR5cGUgSlNPTlNjaGVtYSA9IEpTT05TY2hlbWFTdHJpbmcgfCBKU09OU2NoZW1hTnVtYmVyIHwgSlNPTlNjaGVtYUludGVnZXIgfCBKU09OU2NoZW1hQm9vbGVhbiB8IEpTT05TY2hlbWFBcnJheSB8IEpTT05TY2hlbWFUdXBsZSB8IEpTT05TY2hlbWFPYmplY3Q7XG4iXX0=