ng-http-caching 15.2.1 → 15.2.3
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 +2 -2
- package/esm2020/lib/ng-http-caching-interceptor.service.mjs +2 -2
- package/esm2020/lib/ng-http-caching.service.mjs +26 -5
- package/esm2020/lib/storage/ng-http-caching-browser-storage.mjs +10 -11
- package/esm2020/lib/storage/ng-http-caching-memory-storage.mjs +1 -1
- package/esm2020/lib/storage/ng-http-caching-storage.interface.mjs +1 -1
- package/fesm2015/ng-http-caching.mjs +35 -15
- package/fesm2015/ng-http-caching.mjs.map +1 -1
- package/fesm2020/ng-http-caching.mjs +35 -15
- package/fesm2020/ng-http-caching.mjs.map +1 -1
- package/lib/ng-http-caching.service.d.ts +84 -8
- package/lib/storage/ng-http-caching-browser-storage.d.ts +5 -5
- package/lib/storage/ng-http-caching-memory-storage.d.ts +1 -1
- package/lib/storage/ng-http-caching-storage.interface.d.ts +22 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,10 +72,10 @@ const ngHttpCachingConfig: NgHttpCachingConfig = {
|
|
|
72
72
|
BrowserModule,
|
|
73
73
|
AppRoutingModule,
|
|
74
74
|
HttpClientModule,
|
|
75
|
-
NgHttpCachingModule.forRoot(ngHttpCachingConfig)
|
|
75
|
+
NgHttpCachingModule.forRoot(ngHttpCachingConfig)
|
|
76
76
|
],
|
|
77
77
|
providers: [],
|
|
78
|
-
bootstrap: [AppComponent]
|
|
78
|
+
bootstrap: [AppComponent]
|
|
79
79
|
],
|
|
80
80
|
})
|
|
81
81
|
export class AppModule { }
|
|
@@ -26,7 +26,7 @@ export class NgHttpCachingInterceptorService {
|
|
|
26
26
|
const cachedObservable = this.cacheService.getFromQueue(req);
|
|
27
27
|
if (cachedObservable) {
|
|
28
28
|
// console.log('cachedObservable');
|
|
29
|
-
return
|
|
29
|
+
return cachedObservable;
|
|
30
30
|
}
|
|
31
31
|
// Checked if there is cached response for this request
|
|
32
32
|
const cachedResponse = this.cacheService.getFromCache(req);
|
|
@@ -68,4 +68,4 @@ NgHttpCachingInterceptorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion
|
|
|
68
68
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: NgHttpCachingInterceptorService, decorators: [{
|
|
69
69
|
type: Injectable
|
|
70
70
|
}], ctorParameters: function () { return [{ type: i1.NgHttpCachingService }]; } });
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmctaW50ZXJjZXB0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdELFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUF3Qix3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFFM0Y7O0dBRUc7QUFDSCxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUksS0FBUTtJQUN2QixNQUFNLEtBQUssQ0FBQztBQUNkLENBQUM7QUFHRCxNQUFNLE9BQU8sK0JBQStCO0lBRTFDLFlBQTZCLFlBQWtDO1FBQWxDLGlCQUFZLEdBQVosWUFBWSxDQUFzQjtJQUFJLENBQUM7SUFFcEUsU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFDaEQsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFMUIsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsd0RBQXdEO1FBQ3hELE1BQU0sZ0JBQWdCLEdBQTJDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JHLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsbUNBQW1DO1lBQ25DLE9BQU8sZ0JBQWdCLENBQUM7U0FDekI7UUFFRCx1REFBdUQ7UUFDdkQsTUFBTSxjQUFjLEdBQWtDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFGLElBQUksY0FBYyxFQUFFO1lBQ2xCLGlDQUFpQztZQUNqQyxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDOUQ7UUFFRCxpREFBaUQ7UUFDakQsc0RBQXNEO1FBQ3RELG1DQUFtQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRTtnQkFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2xEO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLHlCQUF5QjtZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsRUFDRixLQUFLLEVBQUUsQ0FDUixDQUFDO1FBRUYsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNsRCxJQUFJLE1BQU0sR0FBcUIsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNDLDBDQUEwQztRQUMxQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUN0RCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7Z0JBQzVDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2pGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7NEhBN0RVLCtCQUErQjtnSUFBL0IsK0JBQStCOzJGQUEvQiwrQkFBK0I7a0JBRDNDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgYXNhcFNjaGVkdWxlciwgT2JzZXJ2YWJsZSwgc2NoZWR1bGVkIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgZmluYWxpemUsIHNoYXJlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBOZ0h0dHBDYWNoaW5nU2VydmljZSwgTmdIdHRwQ2FjaGluZ0hlYWRlcnNMaXN0IH0gZnJvbSAnLi9uZy1odHRwLWNhY2hpbmcuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvaXNzdWVzLzcyNDFcclxuICovXHJcbmZ1bmN0aW9uKiBfb2Y8VD4odmFsdWU6IFQpOiBHZW5lcmF0b3I8VD4ge1xyXG4gIHlpZWxkIHZhbHVlO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZ0h0dHBDYWNoaW5nSW50ZXJjZXB0b3JTZXJ2aWNlIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjYWNoZVNlcnZpY2U6IE5nSHR0cENhY2hpbmdTZXJ2aWNlKSB7IH1cclxuXHJcbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICAvLyBydW4gZ2FyYmFnZSBjb2xsZWN0b3JcclxuICAgIHRoaXMuY2FjaGVTZXJ2aWNlLnJ1bkdjKCk7XHJcblxyXG4gICAgLy8gRG9uJ3QgY2FjaGUgaWYgaXQncyBub3QgY2FjaGVhYmxlXHJcbiAgICBpZiAoIXRoaXMuY2FjaGVTZXJ2aWNlLmlzQ2FjaGVhYmxlKHJlcSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QocmVxLCBuZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVja2VkIGlmIHRoZXJlIGlzIHBlbmRpbmcgcmVzcG9uc2UgZm9yIHRoaXMgcmVxdWVzdFxyXG4gICAgY29uc3QgY2FjaGVkT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4gfCB1bmRlZmluZWQgPSB0aGlzLmNhY2hlU2VydmljZS5nZXRGcm9tUXVldWUocmVxKTtcclxuICAgIGlmIChjYWNoZWRPYnNlcnZhYmxlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWNoZWRPYnNlcnZhYmxlJyk7XHJcbiAgICAgIHJldHVybiBjYWNoZWRPYnNlcnZhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrZWQgaWYgdGhlcmUgaXMgY2FjaGVkIHJlc3BvbnNlIGZvciB0aGlzIHJlcXVlc3RcclxuICAgIGNvbnN0IGNhY2hlZFJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PiB8IHVuZGVmaW5lZCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldEZyb21DYWNoZShyZXEpO1xyXG4gICAgaWYgKGNhY2hlZFJlc3BvbnNlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWNoZWRSZXNwb25zZScpO1xyXG4gICAgICByZXR1cm4gc2NoZWR1bGVkKF9vZihjYWNoZWRSZXNwb25zZS5jbG9uZSgpKSwgYXNhcFNjaGVkdWxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIHJlcXVlc3Qgb2YgZ29pbmcgdGhyb3VnaCBmb3IgZmlyc3QgdGltZVxyXG4gICAgLy8gdGhlbiBsZXQgdGhlIHJlcXVlc3QgcHJvY2VlZCBhbmQgY2FjaGUgdGhlIHJlc3BvbnNlXHJcbiAgICAvLyBjb25zb2xlLmxvZygnc2VuZFJlcXVlc3QnLCByZXEpO1xyXG4gICAgY29uc3Qgc2hhcmVkID0gdGhpcy5zZW5kUmVxdWVzdChyZXEsIG5leHQpLnBpcGUoXHJcbiAgICAgIHRhcChldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5hZGRUb0NhY2hlKHJlcSwgZXZlbnQuY2xvbmUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vIGRlbGV0ZSBwZW5kaW5nIHJlcXVlc3RcclxuICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5kZWxldGVGcm9tUXVldWUocmVxKTtcclxuICAgICAgfSksXHJcbiAgICAgIHNoYXJlKClcclxuICAgICk7XHJcblxyXG4gICAgLy8gYWRkIHBlbmRpbmcgcmVxdWVzdCB0byBxdWV1ZSBmb3IgY2FjaGUgcGFyYWxsZWxsIHJlcXVlc3RcclxuICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmFkZFRvUXVldWUocmVxLCBzaGFyZWQpO1xyXG5cclxuICAgIHJldHVybiBzaGFyZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kIGh0dHAgcmVxdWVzdCAobmV4dCBoYW5kbGVyKVxyXG4gICAqL1xyXG4gIHNlbmRSZXF1ZXN0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICBsZXQgY2xvbmVkOiBIdHRwUmVxdWVzdDxhbnk+ID0gcmVxLmNsb25lKCk7XHJcbiAgICAvLyB0cmltIGN1c3RvbSBoZWFkZXJzIGJlZm9yZSBzZW5kIHJlcXVlc3RcclxuICAgIE5nSHR0cENhY2hpbmdIZWFkZXJzTGlzdC5mb3JFYWNoKG5nSHR0cENhY2hpbmdIZWFkZXJzID0+IHtcclxuICAgICAgaWYgKGNsb25lZC5oZWFkZXJzLmhhcyhuZ0h0dHBDYWNoaW5nSGVhZGVycykpIHtcclxuICAgICAgICBjbG9uZWQgPSBjbG9uZWQuY2xvbmUoeyBoZWFkZXJzOiBjbG9uZWQuaGVhZGVycy5kZWxldGUobmdIdHRwQ2FjaGluZ0hlYWRlcnMpIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBuZXh0LmhhbmRsZShjbG9uZWQpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -4,14 +4,33 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
export const NG_HTTP_CACHING_CONFIG = new InjectionToken('ng-http-caching.config');
|
|
5
5
|
export var NgHttpCachingStrategy;
|
|
6
6
|
(function (NgHttpCachingStrategy) {
|
|
7
|
+
/**
|
|
8
|
+
* All request are cacheable if HTTP method is into `allowedMethod`
|
|
9
|
+
*/
|
|
7
10
|
NgHttpCachingStrategy["ALLOW_ALL"] = "ALLOW_ALL";
|
|
11
|
+
/**
|
|
12
|
+
* Only the request with `X-NG-HTTP-CACHING-ALLOW-CACHE` header are cacheable if HTTP method is into `allowedMethod`
|
|
13
|
+
*/
|
|
8
14
|
NgHttpCachingStrategy["DISALLOW_ALL"] = "DISALLOW_ALL";
|
|
9
15
|
})(NgHttpCachingStrategy || (NgHttpCachingStrategy = {}));
|
|
10
16
|
export var NgHttpCachingHeaders;
|
|
11
17
|
(function (NgHttpCachingHeaders) {
|
|
18
|
+
/**
|
|
19
|
+
* Request is cacheable if HTTP method is into `allowedMethod`
|
|
20
|
+
*/
|
|
12
21
|
NgHttpCachingHeaders["ALLOW_CACHE"] = "X-NG-HTTP-CACHING-ALLOW-CACHE";
|
|
22
|
+
/**
|
|
23
|
+
* Request isn't cacheable
|
|
24
|
+
*/
|
|
13
25
|
NgHttpCachingHeaders["DISALLOW_CACHE"] = "X-NG-HTTP-CACHING-DISALLOW-CACHE";
|
|
26
|
+
/**
|
|
27
|
+
* Specific cache lifetime for the request
|
|
28
|
+
*/
|
|
14
29
|
NgHttpCachingHeaders["LIFETIME"] = "X-NG-HTTP-CACHING-LIFETIME";
|
|
30
|
+
/**
|
|
31
|
+
* You can tag multiple request by adding this header with the same tag and
|
|
32
|
+
* using `NgHttpCachingService.clearCacheByTag(tag: string)` for delete all the tagged request
|
|
33
|
+
*/
|
|
15
34
|
NgHttpCachingHeaders["TAG"] = "X-NG-HTTP-CACHING-TAG";
|
|
16
35
|
})(NgHttpCachingHeaders || (NgHttpCachingHeaders = {}));
|
|
17
36
|
export const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);
|
|
@@ -80,7 +99,6 @@ export class NgHttpCachingService {
|
|
|
80
99
|
* Add response to cache
|
|
81
100
|
*/
|
|
82
101
|
addToCache(req, res) {
|
|
83
|
-
const key = this.getKey(req);
|
|
84
102
|
const entry = {
|
|
85
103
|
url: req.urlWithParams,
|
|
86
104
|
response: res,
|
|
@@ -89,6 +107,7 @@ export class NgHttpCachingService {
|
|
|
89
107
|
version: this.config.version,
|
|
90
108
|
};
|
|
91
109
|
if (this.isValid(entry)) {
|
|
110
|
+
const key = this.getKey(req);
|
|
92
111
|
this.config.store.set(key, entry);
|
|
93
112
|
return true;
|
|
94
113
|
}
|
|
@@ -117,7 +136,7 @@ export class NgHttpCachingService {
|
|
|
117
136
|
* Clear the cache by regex
|
|
118
137
|
*/
|
|
119
138
|
clearCacheByRegex(regex) {
|
|
120
|
-
this.config.store.forEach((
|
|
139
|
+
this.config.store.forEach((_, key) => {
|
|
121
140
|
if (regex.test(key)) {
|
|
122
141
|
this.clearCacheByKey(key);
|
|
123
142
|
}
|
|
@@ -230,7 +249,9 @@ export class NgHttpCachingService {
|
|
|
230
249
|
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
231
250
|
}
|
|
232
251
|
/**
|
|
233
|
-
* Return the cache key
|
|
252
|
+
* Return the cache key.
|
|
253
|
+
* Default key is http method plus url with query parameters, eg.:
|
|
254
|
+
* `GET@https://github.com/nigrosimone/ng-http-caching`
|
|
234
255
|
*/
|
|
235
256
|
getKey(req) {
|
|
236
257
|
// if user provide custom method, use it
|
|
@@ -241,7 +262,7 @@ export class NgHttpCachingService {
|
|
|
241
262
|
return result;
|
|
242
263
|
}
|
|
243
264
|
}
|
|
244
|
-
// default key
|
|
265
|
+
// default key is req.method plus url with query parameters
|
|
245
266
|
return req.method + '@' + req.urlWithParams;
|
|
246
267
|
}
|
|
247
268
|
/**
|
|
@@ -305,4 +326,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
|
|
|
305
326
|
}, {
|
|
306
327
|
type: Optional
|
|
307
328
|
}] }]; } });
|
|
308
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJakcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMENBQTBDLENBQUM7O0FBVXRGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUN0RCx3QkFBd0IsQ0FDekIsQ0FBQztBQUVGLE1BQU0sQ0FBTixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsZ0RBQXVCLENBQUE7SUFDdkIsc0RBQTZCLENBQUE7QUFDL0IsQ0FBQyxFQUhXLHFCQUFxQixLQUFyQixxQkFBcUIsUUFHaEM7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFLWDtBQUxELFdBQVksb0JBQW9CO0lBQzlCLHFFQUE2QyxDQUFBO0lBQzdDLDJFQUFtRCxDQUFBO0lBQ25ELCtEQUF1QyxDQUFBO0lBQ3ZDLHFEQUE2QixDQUFBO0FBQy9CLENBQUMsRUFMVyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBSy9CO0FBRUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQztBQUNqRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLHlC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Q0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFFLE1BQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsT0FBTyxNQUFxQixDQUFDO0lBQy9CLENBQUM7O2lIQTFTVSxvQkFBb0Isa0JBV3JCLHNCQUFzQjtxSEFYckIsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7OzBCQVlOLE1BQU07MkJBQUMsc0JBQXNCOzswQkFBRyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdCwgT3B0aW9uYWwsIFZFUlNJT04sIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL2ludGVybmFsL09ic2VydmFibGUnO1xyXG5pbXBvcnQgeyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB9IGZyb20gJy4vc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctc3RvcmFnZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBOZ0h0dHBDYWNoaW5nTWVtb3J5U3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctbWVtb3J5LXN0b3JhZ2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOZ0h0dHBDYWNoaW5nRW50cnk8SyA9IGFueSwgVCA9IGFueT4ge1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8VD47XHJcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8Sz47XHJcbiAgYWRkZWRUaW1lOiBudW1iZXI7XHJcbiAgdmVyc2lvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ0h0dHBDYWNoaW5nQ29uZmlnPihcclxuICAnbmctaHR0cC1jYWNoaW5nLmNvbmZpZydcclxuKTtcclxuXHJcbmV4cG9ydCBlbnVtIE5nSHR0cENhY2hpbmdTdHJhdGVneSB7XHJcbiAgQUxMT1dfQUxMID0gJ0FMTE9XX0FMTCcsXHJcbiAgRElTQUxMT1dfQUxMID0gJ0RJU0FMTE9XX0FMTCdcclxufVxyXG5cclxuZXhwb3J0IGVudW0gTmdIdHRwQ2FjaGluZ0hlYWRlcnMge1xyXG4gIEFMTE9XX0NBQ0hFID0gJ1gtTkctSFRUUC1DQUNISU5HLUFMTE9XLUNBQ0hFJyxcclxuICBESVNBTExPV19DQUNIRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1ESVNBTExPVy1DQUNIRScsXHJcbiAgTElGRVRJTUUgPSAnWC1ORy1IVFRQLUNBQ0hJTkctTElGRVRJTUUnLFxyXG4gIFRBRyA9ICdYLU5HLUhUVFAtQ0FDSElORy1UQUcnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBOZ0h0dHBDYWNoaW5nSGVhZGVyc0xpc3QgPSBPYmplY3QudmFsdWVzKE5nSHR0cENhY2hpbmdIZWFkZXJzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfU0VDT05EX0lOX01TID0gMTAwMDtcclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19NSU5VVEVfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfU0VDT05EX0lOX01TICogNjA7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfSE9VUl9JTl9NUyA9IE5HX0hUVFBfQ0FDSElOR19NSU5VVEVfSU5fTVMgKiA2MDtcclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19EQVlfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfSE9VUl9JTl9NUyAqIDI0O1xyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX1dFRUtfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfREFZX0lOX01TICogNztcclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19NT05USF9JTl9NUyA9IE5HX0hUVFBfQ0FDSElOR19EQVlfSU5fTVMgKiAzMDtcclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19ZRUFSX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX0RBWV9JTl9NUyAqIDM2NTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ0NvbmZpZyB7XHJcbiAgc3RvcmU/OiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZTtcclxuICBsaWZldGltZT86IG51bWJlcjtcclxuICBhbGxvd2VkTWV0aG9kPzogc3RyaW5nW107XHJcbiAgY2FjaGVTdHJhdGVneT86IE5nSHR0cENhY2hpbmdTdHJhdGVneTtcclxuICB2ZXJzaW9uPzogc3RyaW5nO1xyXG4gIGlzRXhwaXJlZD86IDxLLCBUPihlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIGlzQ2FjaGVhYmxlPzogPEs+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgZ2V0S2V5PzogPEs+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBpc1ZhbGlkPzogPEssIFQ+KGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ0RlZmF1bHRDb25maWcgZXh0ZW5kcyBOZ0h0dHBDYWNoaW5nQ29uZmlnIHtcclxuICBzdG9yZTogTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2U7XHJcbiAgbGlmZXRpbWU6IG51bWJlcjtcclxuICBhbGxvd2VkTWV0aG9kOiBzdHJpbmdbXTtcclxuICBjYWNoZVN0cmF0ZWd5OiBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3k7XHJcbiAgdmVyc2lvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQ6IE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnID0ge1xyXG4gIHN0b3JlOiBuZXcgTmdIdHRwQ2FjaGluZ01lbW9yeVN0b3JhZ2UoKSxcclxuICBsaWZldGltZTogTkdfSFRUUF9DQUNISU5HX0hPVVJfSU5fTVMsXHJcbiAgdmVyc2lvbjogVkVSU0lPTi5tYWpvcixcclxuICBhbGxvd2VkTWV0aG9kOiBbJ0dFVCcsICdIRUFEJ10sXHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkFMTE9XX0FMTCxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSBxdWV1ZSA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjb25maWc6IE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnO1xyXG5cclxuICBwcml2YXRlIGdjTG9jayA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGRldk1vZGU6IGJvb2xlYW4gPSBpc0Rldk1vZGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KE5HX0hUVFBfQ0FDSElOR19DT05GSUcpIEBPcHRpb25hbCgpIGNvbmZpZzogTmdIdHRwQ2FjaGluZ0NvbmZpZ1xyXG4gICkge1xyXG4gICAgaWYgKGNvbmZpZykge1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQsIC4uLmNvbmZpZyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLk5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0IH07XHJcbiAgICB9XHJcbiAgICAvLyBzdGFydCBjYWNoZSBjbGVhblxyXG4gICAgdGhpcy5ydW5HYygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjb25maWdcclxuICAgKi9cclxuICBnZXRDb25maWcoKTogTmdIdHRwQ2FjaGluZ0NvbmZpZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIHF1ZXVlIG1hcFxyXG4gICAqL1xyXG4gIGdldFF1ZXVlKCk6IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWV1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgY2FjaGUgc3RvcmVcclxuICAgKi9cclxuICBnZXRTdG9yZSgpOiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc3RvcmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gcmVzcG9uc2UgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGdldEZyb21DYWNoZTxLLCBUPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogUmVhZG9ubHk8SHR0cFJlc3BvbnNlPFQ+PiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBjYWNoZWQ6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPiB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlnLnN0b3JlLmdldDxLLCBUPihrZXkpO1xyXG5cclxuICAgIGlmICghY2FjaGVkKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNFeHBpcmVkKGNhY2hlZCkpIHtcclxuICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kZWVwRnJlZXplKGNhY2hlZC5yZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgcmVzcG9uc2UgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb0NhY2hlPEssIFQ+KHJlcTogSHR0cFJlcXVlc3Q8Sz4sIHJlczogSHR0cFJlc3BvbnNlPFQ+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+ID0ge1xyXG4gICAgICB1cmw6IHJlcS51cmxXaXRoUGFyYW1zLFxyXG4gICAgICByZXNwb25zZTogcmVzLFxyXG4gICAgICByZXF1ZXN0OiByZXEsXHJcbiAgICAgIGFkZGVkVGltZTogRGF0ZS5ub3coKSxcclxuICAgICAgdmVyc2lvbjogdGhpcy5jb25maWcudmVyc2lvbixcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkKGVudHJ5KSkge1xyXG4gICAgICB0aGlzLmNvbmZpZy5zdG9yZS5zZXQoa2V5LCBlbnRyeSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIHJlc3BvbnNlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBkZWxldGVGcm9tQ2FjaGU8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGVcclxuICAgKi9cclxuICBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcuc3RvcmUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSBrZXlcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zdG9yZS5kZWxldGUoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSByZWdleFxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeVJlZ2V4PEssIFQ+KHJlZ2V4OiBSZWdFeHApOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2g8SywgVD4oKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4sIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmIChyZWdleC50ZXN0KGtleSkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSBUQUdcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlUYWc8SywgVD4odGFnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2g8SywgVD4oKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4sIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhZ0hlYWRlciA9IGVudHJ5LnJlcXVlc3QuaGVhZGVycy5nZXQoTmdIdHRwQ2FjaGluZ0hlYWRlcnMuVEFHKTtcclxuICAgICAgaWYgKHRhZ0hlYWRlciAmJiB0YWdIZWFkZXIuc3BsaXQoJywnKS5pbmNsdWRlcyh0YWcpKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSdW4gZ2FyYmFnZSBjb2xsZWN0b3IgKGRlbGV0ZSBleHBpcmVkIGNhY2hlIGVudHJ5KVxyXG4gICAqL1xyXG4gIHJ1bkdjPEssIFQ+KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZ2NMb2NrKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2NMb2NrID0gdHJ1ZTtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2g8SywgVD4oKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4sIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRXhwaXJlZChlbnRyeSkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2NMb2NrID0gZmFsc2U7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIGNhY2hlIGVudHJ5IGlzIGV4cGlyZWRcclxuICAgKi9cclxuICBpc0V4cGlyZWQ8SywgVD4oZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPik6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0V4cGlyZWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWcuaXNFeHBpcmVkKGVudHJ5KTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjb25maWcvZGVmYXVsdCBsaWZldGltZVxyXG4gICAgbGV0IGxpZmV0aW1lOiBudW1iZXIgPSB0aGlzLmNvbmZpZy5saWZldGltZTtcclxuICAgIC8vIHJlcXVlc3QgaGFzIG93biBsaWZldGltZVxyXG4gICAgY29uc3QgaGVhZGVyTGlmZXRpbWUgPSBlbnRyeS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KE5nSHR0cENhY2hpbmdIZWFkZXJzLkxJRkVUSU1FKTtcclxuICAgIGlmIChoZWFkZXJMaWZldGltZSkge1xyXG4gICAgICBsaWZldGltZSA9ICtoZWFkZXJMaWZldGltZTtcclxuICAgIH1cclxuICAgIC8vIG5ldmVyIGV4cGlyZSBpZiAwXHJcbiAgICBpZiAobGlmZXRpbWUgPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gd3JvbmcgbGlmZXRpbWVcclxuICAgIGlmIChsaWZldGltZSA8IDAgfHwgaXNOYU4obGlmZXRpbWUpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGlmZXRpbWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgMCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVudHJ5LmFkZGVkVGltZSArIGxpZmV0aW1lIDwgRGF0ZS5ub3coKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIGNhY2hlIGVudHJ5IGlzIHZhbGlkIGZvciBzdG9yZSBpbiB0aGUgY2FjaGVcclxuICAgKi9cclxuICBpc1ZhbGlkPEssIFQ+KGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pOiBib29sZWFuIHtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc1ZhbGlkKGVudHJ5KTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBkaWZmZXJlbnQgdmVyc2lvblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnZlcnNpb24gIT09IGVudHJ5LnZlcnNpb24pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBjYWNoZWFibGVcclxuICAgKi9cclxuICBpc0NhY2hlYWJsZTxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogYm9vbGVhbiB7XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmlzQ2FjaGVhYmxlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmlzQ2FjaGVhYmxlKHJlcSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcmVxdWVzdCBoYXMgZGlzYWxsb3cgY2FjaGUgaGVhZGVyXHJcbiAgICBpZiAocmVxLmhlYWRlcnMuaGFzKE5nSHR0cENhY2hpbmdIZWFkZXJzLkRJU0FMTE9XX0NBQ0hFKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBzdHJhdGVneSBpcyBkaXNhbGxvdyBhbGwuLi5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5jYWNoZVN0cmF0ZWd5ID09PSBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kuRElTQUxMT1dfQUxMKSB7XHJcbiAgICAgIC8vIHJlcXVlc3QgaXNuJ3QgYWxsb3dlZCBpZiBjb21lIHdpdGhvdXQgYWxsb3cgaGVhZGVyXHJcbiAgICAgIGlmICghcmVxLmhlYWRlcnMuaGFzKE5nSHR0cENhY2hpbmdIZWFkZXJzLkFMTE9XX0NBQ0hFKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaWYgYWxsb3dlZCBtZXRob2QgaXMgb25seSBBTEwsIGFsbG93IGFsbCBodHRwIG1ldGhvc1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmFsbG93ZWRNZXRob2QubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kWzBdID09PSAnQUxMJykge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyByZXF1ZXN0IGlzIGFsbG93ZWQgaWYgbWV0aG9kIGlzIGluIGFsbG93ZWRNZXRob2RcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kLmluZGV4T2YocmVxLm1ldGhvZCkgIT09IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjYWNoZSBrZXlcclxuICAgKi9cclxuICBnZXRLZXk8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IHN0cmluZyB7XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmdldEtleSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5nZXRLZXkocmVxKTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBkZWZhdWx0IGtleSBpZCBpcyByZXEubWV0aG9kIHBsdXMgdXJsIHdpdGggcXVlcnkgcGFyYW1ldGVyc1xyXG4gICAgcmV0dXJuIHJlcS5tZXRob2QgKyAnQCcgKyByZXEudXJsV2l0aFBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBvYnNlcnZhYmxlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBnZXRGcm9tUXVldWU8SywgVD4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBjYWNoZWQ6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PiB8IHVuZGVmaW5lZCA9IHRoaXMucXVldWUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FjaGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIG9ic2VydmFibGUgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb1F1ZXVlPEssIFQ+KHJlcTogSHR0cFJlcXVlc3Q8Sz4sIG9iczogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+KTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICB0aGlzLnF1ZXVlLnNldChrZXksIG9icyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgb2JzZXJ2YWJsZSBmcm9tIGNhY2hlXHJcbiAgICovXHJcbiAgZGVsZXRlRnJvbVF1ZXVlPEs+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVjdXJzaXZlbHkgT2JqZWN0LmZyZWV6ZSBzaW1wbGUgSmF2YXNjcmlwdCBzdHJ1Y3R1cmVzIGNvbnNpc3Rpbmcgb2YgcGxhaW4gb2JqZWN0cywgYXJyYXlzLCBhbmQgcHJpbWl0aXZlcy5cclxuICAgKiBNYWtlIHRoZSBkYXRhIGltbXV0YWJsZS5cclxuICAgKiBAcmV0dXJucyBpbW11dGFibGUgb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWVwRnJlZXplPFM+KG9iamVjdDogUyk6IFJlYWRvbmx5PFM+IHtcclxuICAgIC8vIE5vIGZyZWV6aW5nIGluIHByb2R1Y3Rpb24gKGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UpLlxyXG4gICAgaWYgKCF0aGlzLmRldk1vZGUgfHwgIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gb2JqZWN0IGFzIFJlYWRvbmx5PFM+O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoZW4gYWxyZWFkeSBmcm96ZW4sIHdlIGFzc3VtZSBpdHMgY2hpbGRyZW4gYXJlIGZyb3plbiAoZm9yIGJldHRlciBwZXJmb3JtYW5jZSkuXHJcbiAgICAvLyBUaGlzIHNob3VsZCBiZSB0cnVlIGlmIHlvdSBhbHdheXMgdXNlIGBkZWVwRnJlZXplYCB0byBmcmVlemUgb2JqZWN0cy5cclxuICAgIC8vXHJcbiAgICAvLyBOb3RlIHRoYXQgT2JqZWN0LmlzRnJvemVuIHdpbGwgYWxzbyByZXR1cm4gYHRydWVgIGZvciBwcmltaXRpdmVzIChudW1iZXJzLFxyXG4gICAgLy8gc3RyaW5ncywgYm9vbGVhbnMsIHVuZGVmaW5lZCwgbnVsbCksIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZm9yXHJcbiAgICAvLyB0aG9zZSBleHBsaWNpdGx5LlxyXG4gICAgaWYgKE9iamVjdC5pc0Zyb3plbihvYmplY3QpKSB7XHJcbiAgICAgIHJldHVybiBvYmplY3QgYXMgUmVhZG9ubHk8Uz47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGVpdGhlciBhbiBhcnJheSBvciBwbGFpbiBvYmplY3QsIHNvXHJcbiAgICAvLyBqdXN0IGZyZWV6ZSBpdCBhbmQgcmVjdXJzZSBvbiBpdHMgdmFsdWVzLlxyXG4gICAgT2JqZWN0LmZyZWV6ZShvYmplY3QpO1xyXG4gICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGtleSA9PiB0aGlzLmRlZXBGcmVlemUoKG9iamVjdCBhcyBhbnkpW2tleV0pKTtcclxuXHJcbiAgICByZXR1cm4gb2JqZWN0IGFzIFJlYWRvbmx5PFM+O1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJakcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMENBQTBDLENBQUM7O0FBeUJ0RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFRixNQUFNLENBQU4sSUFBWSxxQkFTWDtBQVRELFdBQVkscUJBQXFCO0lBQy9COztPQUVHO0lBQ0gsZ0RBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCxzREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBVFcscUJBQXFCLEtBQXJCLHFCQUFxQixRQVNoQztBQUVELE1BQU0sQ0FBTixJQUFZLG9CQWtCWDtBQWxCRCxXQUFZLG9CQUFvQjtJQUM5Qjs7T0FFRztJQUNILHFFQUE2QyxDQUFBO0lBQzdDOztPQUVHO0lBQ0gsMkVBQW1ELENBQUE7SUFDbkQ7O09BRUc7SUFDSCwrREFBdUMsQ0FBQTtJQUN2Qzs7O09BR0c7SUFDSCxxREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBbEJXLG9CQUFvQixLQUFwQixvQkFBb0IsUUFrQi9CO0FBRUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQztBQUNqRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7QUFDOUUs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NUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUUsTUFBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRSxPQUFPLE1BQXFCLENBQUM7SUFDL0IsQ0FBQzs7aUhBNVNVLG9CQUFvQixrQkFXckIsc0JBQXNCO3FIQVhyQixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVTs7MEJBWU4sTUFBTTsyQkFBQyxzQkFBc0I7OzBCQUFHLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0LCBPcHRpb25hbCwgVkVSU0lPTiwgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvT2JzZXJ2YWJsZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIH0gZnJvbSAnLi9zdG9yYWdlL25nLWh0dHAtY2FjaGluZy1zdG9yYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdNZW1vcnlTdG9yYWdlIH0gZnJvbSAnLi9zdG9yYWdlL25nLWh0dHAtY2FjaGluZy1tZW1vcnktc3RvcmFnZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nSHR0cENhY2hpbmdFbnRyeTxLID0gYW55LCBUID0gYW55PiB7XHJcbiAgLyoqXHJcbiAgICogVVJMXHJcbiAgICovXHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogSHR0cFJlc3BvbnNlXHJcbiAgICovXHJcbiAgcmVzcG9uc2U6IEh0dHBSZXNwb25zZTxUPjtcclxuICAvKipcclxuICAgKiBIdHRwUmVxdWVzdFxyXG4gICAqL1xyXG4gIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PEs+O1xyXG4gIC8qKlxyXG4gICAqIFRpbWVzdGFtIG9mIGFkZCB0byBjYWNoZSB0aW1lXHJcbiAgICovXHJcbiAgYWRkZWRUaW1lOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQ2FjaGUgdmVyc2lvblxyXG4gICAqL1xyXG4gIHZlcnNpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdIdHRwQ2FjaGluZ0NvbmZpZz4oXHJcbiAgJ25nLWh0dHAtY2FjaGluZy5jb25maWcnXHJcbik7XHJcblxyXG5leHBvcnQgZW51bSBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kge1xyXG4gIC8qKlxyXG4gICAqIEFsbCByZXF1ZXN0IGFyZSBjYWNoZWFibGUgaWYgSFRUUCBtZXRob2QgaXMgaW50byBgYWxsb3dlZE1ldGhvZGBcclxuICAgKi9cclxuICBBTExPV19BTEwgPSAnQUxMT1dfQUxMJyxcclxuICAvKipcclxuICAgKiBPbmx5IHRoZSByZXF1ZXN0IHdpdGggYFgtTkctSFRUUC1DQUNISU5HLUFMTE9XLUNBQ0hFYCBoZWFkZXIgYXJlIGNhY2hlYWJsZSBpZiBIVFRQIG1ldGhvZCBpcyBpbnRvIGBhbGxvd2VkTWV0aG9kYFxyXG4gICAqL1xyXG4gIERJU0FMTE9XX0FMTCA9ICdESVNBTExPV19BTEwnXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE5nSHR0cENhY2hpbmdIZWFkZXJzIHtcclxuICAvKipcclxuICAgKiBSZXF1ZXN0IGlzIGNhY2hlYWJsZSBpZiBIVFRQIG1ldGhvZCBpcyBpbnRvIGBhbGxvd2VkTWV0aG9kYFxyXG4gICAqL1xyXG4gIEFMTE9XX0NBQ0hFID0gJ1gtTkctSFRUUC1DQUNISU5HLUFMTE9XLUNBQ0hFJyxcclxuICAvKipcclxuICAgKiBSZXF1ZXN0IGlzbid0IGNhY2hlYWJsZVxyXG4gICAqL1xyXG4gIERJU0FMTE9XX0NBQ0hFID0gJ1gtTkctSFRUUC1DQUNISU5HLURJU0FMTE9XLUNBQ0hFJyxcclxuICAvKipcclxuICAgKiBTcGVjaWZpYyBjYWNoZSBsaWZldGltZSBmb3IgdGhlIHJlcXVlc3RcclxuICAgKi9cclxuICBMSUZFVElNRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1MSUZFVElNRScsXHJcbiAgLyoqXHJcbiAgICogWW91IGNhbiB0YWcgbXVsdGlwbGUgcmVxdWVzdCBieSBhZGRpbmcgdGhpcyBoZWFkZXIgd2l0aCB0aGUgc2FtZSB0YWcgYW5kIFxyXG4gICAqIHVzaW5nIGBOZ0h0dHBDYWNoaW5nU2VydmljZS5jbGVhckNhY2hlQnlUYWcodGFnOiBzdHJpbmcpYCBmb3IgZGVsZXRlIGFsbCB0aGUgdGFnZ2VkIHJlcXVlc3RcclxuICAgKi9cclxuICBUQUcgPSAnWC1ORy1IVFRQLUNBQ0hJTkctVEFHJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTmdIdHRwQ2FjaGluZ0hlYWRlcnNMaXN0ID0gT2JqZWN0LnZhbHVlcyhOZ0h0dHBDYWNoaW5nSGVhZGVycyk7XHJcblxyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX1NFQ09ORF9JTl9NUyA9IDEwMDA7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfTUlOVVRFX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX1NFQ09ORF9JTl9NUyAqIDYwO1xyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX0hPVVJfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfTUlOVVRFX0lOX01TICogNjA7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfREFZX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX0hPVVJfSU5fTVMgKiAyNDtcclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19XRUVLX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX0RBWV9JTl9NUyAqIDc7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfTU9OVEhfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfREFZX0lOX01TICogMzA7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfWUVBUl9JTl9NUyA9IE5HX0hUVFBfQ0FDSElOR19EQVlfSU5fTVMgKiAzNjU7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nSHR0cENhY2hpbmdDb25maWcge1xyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgY2FjaGUgc3RvcmUuIFlvdSBjYW4gaW1wbGVtZW50IHlvdXIgY3VzdG9tIHN0b3JlIGJ5IGltcGxlbWVudCB0aGUgYE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlYCBpbnRlcmZhY2UsIGVnLjpcclxuICAgKi9cclxuICBzdG9yZT86IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIC8qKlxyXG4gICAqIE51bWJlciBvZiBtaWxsaXNlY29uZCB0aGF0IGEgcmVzcG9uc2UgaXMgc3RvcmVkIGluIHRoZSBjYWNoZS4gXHJcbiAgICogWW91IGNhbiBzZXQgc3BlY2lmaWMgXCJsaWZldGltZVwiIGZvciBlYWNoIHJlcXVlc3QgYnkgYWRkIHRoZSBoZWFkZXIgYFgtTkctSFRUUC1DQUNISU5HLUxJRkVUSU1FYCAoc2VlIGV4YW1wbGUgYmVsb3cpLlxyXG4gICAqL1xyXG4gIGxpZmV0aW1lPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIGFsbG93ZWQgSFRUUCBtZXRob2RzIHRvIGNhY2hlLiBcclxuICAgKiBZb3UgY2FuIGFsbG93IG11bHRpcGxlIG1ldGhvZHMsIGVnLjogYFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdIRUFEJ11gIG9yIFxyXG4gICAqIGFsbG93IGFsbCBtZXRob2RzIGJ5OiBgWydBTEwnXWAuIElmIGBhbGxvd2VkTWV0aG9kYCBpcyBhbiBlbXB0eSBhcnJheSAoYFtdYCksIG5vIHJlc3BvbnNlIGFyZSBjYWNoZWQuXHJcbiAgICogKldhcm5pbmchKiBgTmdIdHRwQ2FjaGluZ2AgdXNlIHRoZSBmdWxsIHVybCAodXJsIHdpdGggcXVlcnkgcGFyYW1ldGVycykgYXMgdW5pcXVlIGtleSBmb3IgdGhlIGNhY2hlZCByZXNwb25zZSxcclxuICAgKiB0aGlzIGlzIGNvcnJlY3QgZm9yIHRoZSBgR0VUYCByZXF1ZXN0IGJ1dCBpcyBfcG90ZW50aWFsbHlfIHdyb25nIGZvciBvdGhlciB0eXBlIG9mIHJlcXVlc3QgKGVnLiBgUE9TVGAsIGBQVVRgKS4gXHJcbiAgICogWW91IGNhbiBzZXQgYSBkaWZmZXJlbnQgXCJrZXlcIiBieSBjdXN0b21pemluZyB0aGUgYGdldEtleWAgY29uZmlnIG1ldGhvZCAoc2VlIGBnZXRLZXlgIHNlY3Rpb24pLlxyXG4gICAqL1xyXG4gIGFsbG93ZWRNZXRob2Q/OiBzdHJpbmdbXTtcclxuICAvKipcclxuICAgKiBTZXQgdGhlIGNhY2hlIHN0cmF0ZWd5LCBwb3NzaWJsZSBzdHJhdGVnaWVzIGFyZTpcclxuICAgKiAtIGBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kuQUxMT1dfQUxMYDogQWxsIHJlcXVlc3QgYXJlIGNhY2hlYWJsZSBpZiBIVFRQIG1ldGhvZCBpcyBpbnRvIGBhbGxvd2VkTWV0aG9kYDtcclxuICAgKiAtIGBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kuRElTQUxMT1dfQUxMYDogT25seSB0aGUgcmVxdWVzdCB3aXRoIGBYLU5HLUhUVFAtQ0FDSElORy1BTExPVy1DQUNIRWAgaGVhZGVyIGFyZSBjYWNoZWFibGUgaWYgSFRUUCBtZXRob2QgaXMgaW50byBgYWxsb3dlZE1ldGhvZGA7XHJcbiAgICovXHJcbiAgY2FjaGVTdHJhdGVneT86IE5nSHR0cENhY2hpbmdTdHJhdGVneTtcclxuICAvKipcclxuICAgKiBDYWNoZSB2ZXJzaW9uLiBXaGVuIHlvdSBoYXZlIGEgYnJlYWtpbmcgY2hhbmdlLCBjaGFuZ2UgdGhlIHZlcnNpb24sIGFuZCBpdCdsbCBkZWxldGUgdGhlIGN1cnJlbnQgY2FjaGUgYXV0b21hdGljYWxseS5cclxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBBbmd1bGFyIG1ham9yIHZlcnNpb24gKGVnLiAxMyksIGluIHRoaXMgd2F5LCB0aGUgY2FjaGUgaXMgaW52YWxpdGFkZWQgb24gZXZlcnkgQW5ndWxhciB1cGdyYWRlLlxyXG4gICAqL1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm4gYHRydWVgIHRoZSByZXF1ZXN0IGlzIGV4cGlyZWQgYW5kIGEgbmV3IHJlcXVlc3QgaXMgc2VuZCB0byBiYWNrZW5kLCBpZiByZXR1cm4gYGZhbHNlYCBpc24ndCBleHBpcmVkLiBcclxuICAgKiBJZiB0aGUgcmVzdWx0IGlzIGB1bmRlZmluZWRgLCB0aGUgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZC5cclxuICAgKi9cclxuICBpc0V4cGlyZWQ/OiA8SywgVD4oZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICAvKipcclxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybiBgdHJ1ZWAgdGhlIHJlcXVlc3QgaXMgY2FjaGVhYmxlLCBpZiByZXR1cm4gYGZhbHNlYCBpc24ndCBjYWNoZWFibGUuIFxyXG4gICAqIElmIHRoZSByZXN1bHQgaXMgYHVuZGVmaW5lZGAsIHRoZSBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkLlxyXG4gICAqL1xyXG4gIGlzQ2FjaGVhYmxlPzogPEs+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiByZXR1cm4gdGhlIHVuaXF1ZSBrZXkgKGBzdHJpbmdgKSBmb3Igc3RvcmUgdGhlIHJlc3BvbnNlIGludG8gdGhlIGNhY2hlLiBcclxuICAgKiBJZiB0aGUgcmVzdWx0IGlzIGB1bmRlZmluZWRgLCB0aGUgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZC5cclxuICAgKi9cclxuICBnZXRLZXk/OiA8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPikgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8qKlxyXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJuIGB0cnVlYCB0aGUgY2FjaGUgZW50cnkgaXMgdmFsaWQgYW5kIGNhbiBiZSBzdHJvcmVkLCBpZiByZXR1cm4gYGZhbHNlYCBpc24ndCB2YWxpZC4gXHJcbiAgICogSWYgdGhlIHJlc3VsdCBpcyBgdW5kZWZpbmVkYCwgdGhlIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWQuXHJcbiAgICovXHJcbiAgaXNWYWxpZD86IDxLLCBUPihlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnIGV4dGVuZHMgTmdIdHRwQ2FjaGluZ0NvbmZpZyB7XHJcbiAgc3RvcmU6IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIGxpZmV0aW1lOiBudW1iZXI7XHJcbiAgYWxsb3dlZE1ldGhvZDogc3RyaW5nW107XHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5O1xyXG4gIHZlcnNpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0OiBSZWFkb25seTxOZ0h0dHBDYWNoaW5nRGVmYXVsdENvbmZpZz4gPSB7XHJcbiAgc3RvcmU6IG5ldyBOZ0h0dHBDYWNoaW5nTWVtb3J5U3RvcmFnZSgpLFxyXG4gIGxpZmV0aW1lOiBOR19IVFRQX0NBQ0hJTkdfSE9VUl9JTl9NUyxcclxuICB2ZXJzaW9uOiBWRVJTSU9OLm1ham9yLFxyXG4gIGFsbG93ZWRNZXRob2Q6IFsnR0VUJywgJ0hFQUQnXSxcclxuICBjYWNoZVN0cmF0ZWd5OiBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kuQUxMT1dfQUxMLFxyXG59O1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmdIdHRwQ2FjaGluZ1NlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+PigpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTmdIdHRwQ2FjaGluZ0RlZmF1bHRDb25maWc7XHJcblxyXG4gIHByaXZhdGUgZ2NMb2NrID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZGV2TW9kZTogYm9vbGVhbiA9IGlzRGV2TW9kZSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTkdfSFRUUF9DQUNISU5HX0NPTkZJRykgQE9wdGlvbmFsKCkgY29uZmlnOiBSZWFkb25seTxOZ0h0dHBDYWNoaW5nQ29uZmlnPlxyXG4gICkge1xyXG4gICAgaWYgKGNvbmZpZykge1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQsIC4uLmNvbmZpZyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLk5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0IH07XHJcbiAgICB9XHJcbiAgICAvLyBzdGFydCBjYWNoZSBjbGVhblxyXG4gICAgdGhpcy5ydW5HYygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjb25maWdcclxuICAgKi9cclxuICBnZXRDb25maWcoKTogUmVhZG9ubHk8TmdIdHRwQ2FjaGluZ0NvbmZpZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBxdWV1ZSBtYXBcclxuICAgKi9cclxuICBnZXRRdWV1ZSgpOiBSZWFkb25seTxNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjYWNoZSBzdG9yZVxyXG4gICAqL1xyXG4gIGdldFN0b3JlKCk6IFJlYWRvbmx5PE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc3RvcmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gcmVzcG9uc2UgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGdldEZyb21DYWNoZTxLLCBUPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogUmVhZG9ubHk8SHR0cFJlc3BvbnNlPFQ+PiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBjYWNoZWQ6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPiB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlnLnN0b3JlLmdldDxLLCBUPihrZXkpO1xyXG5cclxuICAgIGlmICghY2FjaGVkKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNFeHBpcmVkKGNhY2hlZCkpIHtcclxuICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kZWVwRnJlZXplKGNhY2hlZC5yZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgcmVzcG9uc2UgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb0NhY2hlPEssIFQ+KHJlcTogSHR0cFJlcXVlc3Q8Sz4sIHJlczogSHR0cFJlc3BvbnNlPFQ+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+ID0ge1xyXG4gICAgICB1cmw6IHJlcS51cmxXaXRoUGFyYW1zLFxyXG4gICAgICByZXNwb25zZTogcmVzLFxyXG4gICAgICByZXF1ZXN0OiByZXEsXHJcbiAgICAgIGFkZGVkVGltZTogRGF0ZS5ub3coKSxcclxuICAgICAgdmVyc2lvbjogdGhpcy5jb25maWcudmVyc2lvbixcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkKGVudHJ5KSkge1xyXG4gICAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICAgIHRoaXMuY29uZmlnLnN0b3JlLnNldChrZXksIGVudHJ5KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgcmVzcG9uc2UgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGRlbGV0ZUZyb21DYWNoZTxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICByZXR1cm4gdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZVxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZy5zdG9yZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlIGJ5IGtleVxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnN0b3JlLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlIGJ5IHJlZ2V4XHJcbiAgICovXHJcbiAgY2xlYXJDYWNoZUJ5UmVnZXg8SywgVD4ocmVnZXg6IFJlZ0V4cCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcuc3RvcmUuZm9yRWFjaDxLLCBUPigoXzogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGUgYnkgVEFHXHJcbiAgICovXHJcbiAgY2xlYXJDYWNoZUJ5VGFnPEssIFQ+KHRhZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZy5zdG9yZS5mb3JFYWNoPEssIFQ+KChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCB0YWdIZWFkZXIgPSBlbnRyeS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KE5nSHR0cENhY2hpbmdIZWFkZXJzLlRBRyk7XHJcbiAgICAgIGlmICh0YWdIZWFkZXIgJiYgdGFnSGVhZGVyLnNwbGl0KCcsJykuaW5jbHVkZXModGFnKSkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUnVuIGdhcmJhZ2UgY29sbGVjdG9yIChkZWxldGUgZXhwaXJlZCBjYWNoZSBlbnRyeSlcclxuICAgKi9cclxuICBydW5HYzxLLCBUPigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmdjTG9jaykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdjTG9jayA9IHRydWU7XHJcbiAgICB0aGlzLmNvbmZpZy5zdG9yZS5mb3JFYWNoPEssIFQ+KChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc0V4cGlyZWQoZW50cnkpKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdjTG9jayA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBjYWNoZSBlbnRyeSBpcyBleHBpcmVkXHJcbiAgICovXHJcbiAgaXNFeHBpcmVkPEssIFQ+KGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pOiBib29sZWFuIHtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuaXNFeHBpcmVkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmlzRXhwaXJlZChlbnRyeSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY29uZmlnL2RlZmF1bHQgbGlmZXRpbWVcclxuICAgIGxldCBsaWZldGltZTogbnVtYmVyID0gdGhpcy5jb25maWcubGlmZXRpbWU7XHJcbiAgICAvLyByZXF1ZXN0IGhhcyBvd24gbGlmZXRpbWVcclxuICAgIGNvbnN0IGhlYWRlckxpZmV0aW1lID0gZW50cnkucmVxdWVzdC5oZWFkZXJzLmdldChOZ0h0dHBDYWNoaW5nSGVhZGVycy5MSUZFVElNRSk7XHJcbiAgICBpZiAoaGVhZGVyTGlmZXRpbWUpIHtcclxuICAgICAgbGlmZXRpbWUgPSAraGVhZGVyTGlmZXRpbWU7XHJcbiAgICB9XHJcbiAgICAvLyBuZXZlciBleHBpcmUgaWYgMFxyXG4gICAgaWYgKGxpZmV0aW1lID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIHdyb25nIGxpZmV0aW1lXHJcbiAgICBpZiAobGlmZXRpbWUgPCAwIHx8IGlzTmFOKGxpZmV0aW1lKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpZmV0aW1lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIDAnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbnRyeS5hZGRlZFRpbWUgKyBsaWZldGltZSA8IERhdGUubm93KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBjYWNoZSBlbnRyeSBpcyB2YWxpZCBmb3Igc3RvcmUgaW4gdGhlIGNhY2hlXHJcbiAgICovXHJcbiAgaXNWYWxpZDxLLCBUPihlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+KTogYm9vbGVhbiB7XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmlzVmFsaWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWcuaXNWYWxpZChlbnRyeSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZGlmZmVyZW50IHZlcnNpb25cclxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uICE9PSBlbnRyeS52ZXJzaW9uKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRydWUgaWYgdGhlIHJlcXVlc3QgaXMgY2FjaGVhYmxlXHJcbiAgICovXHJcbiAgaXNDYWNoZWFibGU8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHJlcXVlc3QgaGFzIGRpc2FsbG93IGNhY2hlIGhlYWRlclxyXG4gICAgaWYgKHJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5ESVNBTExPV19DQUNIRSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gc3RyYXRlZ3kgaXMgZGlzYWxsb3cgYWxsLi4uXHJcbiAgICBpZiAodGhpcy5jb25maWcuY2FjaGVTdHJhdGVneSA9PT0gTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkRJU0FMTE9XX0FMTCkge1xyXG4gICAgICAvLyByZXF1ZXN0IGlzbid0IGFsbG93ZWQgaWYgY29tZSB3aXRob3V0IGFsbG93IGhlYWRlclxyXG4gICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5BTExPV19DQUNIRSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIGFsbG93ZWQgbWV0aG9kIGlzIG9ubHkgQUxMLCBhbGxvdyBhbGwgaHR0cCBtZXRob3NcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBpZiAodGhpcy5jb25maWcuYWxsb3dlZE1ldGhvZFswXSA9PT0gJ0FMTCcpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcmVxdWVzdCBpcyBhbGxvd2VkIGlmIG1ldGhvZCBpcyBpbiBhbGxvd2VkTWV0aG9kXHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWxsb3dlZE1ldGhvZC5pbmRleE9mKHJlcS5tZXRob2QpICE9PSAtMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgY2FjaGUga2V5LlxyXG4gICAqIERlZmF1bHQga2V5IGlzIGh0dHAgbWV0aG9kIHBsdXMgdXJsIHdpdGggcXVlcnkgcGFyYW1ldGVycywgZWcuOlxyXG4gICAqIGBHRVRAaHR0cHM6Ly9naXRodWIuY29tL25pZ3Jvc2ltb25lL25nLWh0dHAtY2FjaGluZ2BcclxuICAgKi9cclxuICBnZXRLZXk8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IHN0cmluZyB7XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmdldEtleSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5nZXRLZXkocmVxKTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBkZWZhdWx0IGtleSBpcyByZXEubWV0aG9kIHBsdXMgdXJsIHdpdGggcXVlcnkgcGFyYW1ldGVyc1xyXG4gICAgcmV0dXJuIHJlcS5tZXRob2QgKyAnQCcgKyByZXEudXJsV2l0aFBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBvYnNlcnZhYmxlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBnZXRGcm9tUXVldWU8SywgVD4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBjYWNoZWQ6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PiB8IHVuZGVmaW5lZCA9IHRoaXMucXVldWUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FjaGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIG9ic2VydmFibGUgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb1F1ZXVlPEssIFQ+KHJlcTogSHR0cFJlcXVlc3Q8Sz4sIG9iczogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+KTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICB0aGlzLnF1ZXVlLnNldChrZXksIG9icyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgb2JzZXJ2YWJsZSBmcm9tIGNhY2hlXHJcbiAgICovXHJcbiAgZGVsZXRlRnJvbVF1ZXVlPEs+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVjdXJzaXZlbHkgT2JqZWN0LmZyZWV6ZSBzaW1wbGUgSmF2YXNjcmlwdCBzdHJ1Y3R1cmVzIGNvbnNpc3Rpbmcgb2YgcGxhaW4gb2JqZWN0cywgYXJyYXlzLCBhbmQgcHJpbWl0aXZlcy5cclxuICAgKiBNYWtlIHRoZSBkYXRhIGltbXV0YWJsZS5cclxuICAgKiBAcmV0dXJucyBpbW11dGFibGUgb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWVwRnJlZXplPFM+KG9iamVjdDogUyk6IFJlYWRvbmx5PFM+IHtcclxuICAgIC8vIE5vIGZyZWV6aW5nIGluIHByb2R1Y3Rpb24gKGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UpLlxyXG4gICAgaWYgKCF0aGlzLmRldk1vZGUgfHwgIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gb2JqZWN0IGFzIFJlYWRvbmx5PFM+O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoZW4gYWxyZWFkeSBmcm96ZW4sIHdlIGFzc3VtZSBpdHMgY2hpbGRyZW4gYXJlIGZyb3plbiAoZm9yIGJldHRlciBwZXJmb3JtYW5jZSkuXHJcbiAgICAvLyBUaGlzIHNob3VsZCBiZSB0cnVlIGlmIHlvdSBhbHdheXMgdXNlIGBkZWVwRnJlZXplYCB0byBmcmVlemUgb2JqZWN0cy5cclxuICAgIC8vXHJcbiAgICAvLyBOb3RlIHRoYXQgT2JqZWN0LmlzRnJvemVuIHdpbGwgYWxzbyByZXR1cm4gYHRydWVgIGZvciBwcmltaXRpdmVzIChudW1iZXJzLFxyXG4gICAgLy8gc3RyaW5ncywgYm9vbGVhbnMsIHVuZGVmaW5lZCwgbnVsbCksIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZm9yXHJcbiAgICAvLyB0aG9zZSBleHBsaWNpdGx5LlxyXG4gICAgaWYgKE9iamVjdC5pc0Zyb3plbihvYmplY3QpKSB7XHJcbiAgICAgIHJldHVybiBvYmplY3QgYXMgUmVhZG9ubHk8Uz47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGVpdGhlciBhbiBhcnJheSBvciBwbGFpbiBvYmplY3QsIHNvXHJcbiAgICAvLyBqdXN0IGZyZWV6ZSBpdCBhbmQgcmVjdXJzZSBvbiBpdHMgdmFsdWVzLlxyXG4gICAgT2JqZWN0LmZyZWV6ZShvYmplY3QpO1xyXG4gICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGtleSA9PiB0aGlzLmRlZXBGcmVlemUoKG9iamVjdCBhcyBhbnkpW2tleV0pKTtcclxuXHJcbiAgICByZXR1cm4gb2JqZWN0IGFzIFJlYWRvbmx5PFM+O1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';
|
|
2
2
|
const KEY_PREFIX = 'NgHttpCaching::';
|
|
3
|
-
export
|
|
3
|
+
export const serializeRequest = (req) => {
|
|
4
4
|
const request = req.clone(); // Make a clone, useful for doing destructive things
|
|
5
5
|
return JSON.stringify({
|
|
6
6
|
headers: Object.fromEntries(// Just a helper to make this into an object, not really required but makes the output nicer
|
|
@@ -17,8 +17,8 @@ export function serializeRequest(req) {
|
|
|
17
17
|
respnseType: request.responseType,
|
|
18
18
|
body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone
|
|
19
19
|
});
|
|
20
|
-
}
|
|
21
|
-
export
|
|
20
|
+
};
|
|
21
|
+
export const serializeResponse = (res) => {
|
|
22
22
|
const response = res.clone();
|
|
23
23
|
return JSON.stringify({
|
|
24
24
|
headers: Object.fromEntries(// Just a helper to make this into an object, not really required but makes the output nicer
|
|
@@ -28,14 +28,13 @@ export function serializeResponse(res) {
|
|
|
28
28
|
status: response.status,
|
|
29
29
|
statusText: response.statusText,
|
|
30
30
|
url: response.url,
|
|
31
|
-
body: response // Serialize the body, all well and good since we are working on a clone
|
|
31
|
+
body: response.body // Serialize the body, all well and good since we are working on a clone
|
|
32
32
|
});
|
|
33
|
-
}
|
|
34
|
-
export
|
|
33
|
+
};
|
|
34
|
+
export const deserializeRequest = (req) => {
|
|
35
35
|
const request = JSON.parse(req);
|
|
36
36
|
const headers = new HttpHeaders(request.headers);
|
|
37
37
|
const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs
|
|
38
|
-
// tslint:disable-next-line: forin
|
|
39
38
|
for (const parameter in request.params) {
|
|
40
39
|
request.params[parameter].forEach((paramValue) => params.append(parameter, paramValue));
|
|
41
40
|
}
|
|
@@ -45,8 +44,8 @@ export function deserializeRequest(req) {
|
|
|
45
44
|
responseType: request.responseType,
|
|
46
45
|
withCredentials: request.withCredentials
|
|
47
46
|
});
|
|
48
|
-
}
|
|
49
|
-
export
|
|
47
|
+
};
|
|
48
|
+
export const deserializeResponse = (res) => {
|
|
50
49
|
const response = JSON.parse(res);
|
|
51
50
|
return new HttpResponse({
|
|
52
51
|
url: response.url,
|
|
@@ -55,7 +54,7 @@ export function deserializeResponse(res) {
|
|
|
55
54
|
status: response.status,
|
|
56
55
|
statusText: response.statusText,
|
|
57
56
|
});
|
|
58
|
-
}
|
|
57
|
+
};
|
|
59
58
|
export class NgHttpCachingBrowserStorage {
|
|
60
59
|
constructor(storage) {
|
|
61
60
|
this.storage = storage;
|
|
@@ -121,4 +120,4 @@ export class NgHttpCachingBrowserStorage {
|
|
|
121
120
|
}));
|
|
122
121
|
}
|
|
123
122
|
}
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckMsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQXFCO0lBQ2xELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLG9EQUFvRDtJQUNqRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUUsNEZBQTRGO1FBQ3JILE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLHlCQUF5QjtRQUNqRCxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzREFBc0Q7U0FDN0csQ0FDSjtRQUNELE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUUsNEZBQTRGO1FBQ3BILE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLHlCQUF5QjtRQUNqRCxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FB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QUFLLENBQUMsT0FBTyxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztTQUNiLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIH0gZnJvbSAnLi9uZy1odHRwLWNhY2hpbmctc3RvcmFnZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBOZ0h0dHBDYWNoaW5nRW50cnkgfSBmcm9tICcuLi9uZy1odHRwLWNhY2hpbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuY29uc3QgS0VZX1BSRUZJWCA9ICdOZ0h0dHBDYWNoaW5nOjonO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlcXVlc3QocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSByZXEuY2xvbmUoKTsgLy8gTWFrZSBhIGNsb25lLCB1c2VmdWwgZm9yIGRvaW5nIGRlc3RydWN0aXZlIHRoaW5nc1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoIC8vIEp1c3QgYSBoZWxwZXIgdG8gbWFrZSB0aGlzIGludG8gYW4gb2JqZWN0LCBub3QgcmVhbGx5IHJlcXVpcmVkIGJ1dCBtYWtlcyB0aGUgb3V0cHV0IG5pY2VyXHJcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5rZXlzKCkubWFwKCAvLyBHZXQgYWxsIG9mIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IFtrZXksIHJlcXVlc3QuaGVhZGVycy5nZXRBbGwoa2V5KV0gLy8gR2V0IGFsbCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsIC8vIFRoZSBSZXF1ZXN0IE1ldGhvZCwgZS5nLiBHRVQsIFBPU1QsIERFTEVURVxyXG4gICAgICAgIHVybDogcmVxdWVzdC51cmwsIC8vIFRoZSBVUkxcclxuICAgICAgICBwYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVxdWVzdC5oZWFkZXJzLmdldEFsbChrZXkpXSAvLyBHZXQgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksIC8vIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnNcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzLCAvLyBXaGV0aGVyIGNyZWRlbnRpYWxzIGFyZSBiZWluZyBzZW50XHJcbiAgICAgICAgcmVzcG5zZVR5cGU6IHJlcXVlc3QucmVzcG9uc2VUeXBlLCAvLyBUaGUgcmVzcG9uc2UgdHlwZVxyXG4gICAgICAgIGJvZHk6IHJlcXVlc3Quc2VyaWFsaXplQm9keSgpIC8vIFNlcmlhbGl6ZSB0aGUgYm9keSwgYWxsIHdlbGwgYW5kIGdvb2Qgc2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gYSBjbG9uZVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZXNwb25zZShyZXM6IEh0dHBSZXNwb25zZTxhbnk+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzLmNsb25lKCk7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkubWFwKCAvLyBHZXQgYWxsIG9mIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IFtrZXksIHJlc3BvbnNlLmhlYWRlcnMuZ2V0QWxsKGtleSldIC8vIEdldCBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSxcclxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgICAgIHVybDogcmVzcG9uc2UudXJsLFxyXG4gICAgICAgIGJvZHk6IHJlc3BvbnNlIC8vIFNlcmlhbGl6ZSB0aGUgYm9keSwgYWxsIHdlbGwgYW5kIGdvb2Qgc2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gYSBjbG9uZVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVJlcXVlc3Q8VCA9IGFueT4ocmVxOiBzdHJpbmcpOiBIdHRwUmVxdWVzdDxUPiB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gSlNPTi5wYXJzZShyZXEpO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpO1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTsgLy8gUHJvYmFibHkgc29tZSB3YXkgdG8gbWFrZSB0aGlzIGEgb25lLWxpbmVyLCBidXQgYWxhcywgdGhlcmUgYXJlIG5vIGdvb2QgZG9jc1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBmb3JpblxyXG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgaW4gcmVxdWVzdC5wYXJhbXMpIHtcclxuICAgICAgICByZXF1ZXN0LnBhcmFtc1twYXJhbWV0ZXJdLmZvckVhY2goKHBhcmFtVmFsdWU6IHN0cmluZykgPT4gcGFyYW1zLmFwcGVuZChwYXJhbWV0ZXIsIHBhcmFtVmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgSHR0cFJlcXVlc3QocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QudXJsLCByZXF1ZXN0LmJvZHksIHtcclxuICAgICAgICBoZWFkZXJzLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICByZXNwb25zZVR5cGU6IHJlcXVlc3QucmVzcG9uc2VUeXBlLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogcmVxdWVzdC53aXRoQ3JlZGVudGlhbHNcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVSZXNwb25zZTxUID0gYW55PihyZXM6IHN0cmluZyk6IEh0dHBSZXNwb25zZTxUPiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzKTtcclxuICAgIHJldHVybiBuZXcgSHR0cFJlc3BvbnNlPFQ+KHtcclxuICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCxcclxuICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgYm9keTogcmVzcG9uc2UuYm9keSxcclxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZ0h0dHBDYWNoaW5nQnJvd3NlclN0b3JhZ2UgaW1wbGVtZW50cyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSkgeyB9XHJcblxyXG4gICAgZ2V0IHNpemUoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlID0gdGhpcy5zdG9yYWdlLmxlbmd0aDsgaSA8IGU7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2Uua2V5KGkpO1xyXG4gICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgZSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPCBlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlLmtleShpKTtcclxuICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShLRVlfUFJFRklYICsga2V5KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IE5nSHR0cENhY2hpbmdFbnRyeSwga2V5OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICAvLyBpdGVyYXRlIHRoaXMuc3RvcmFnZVxyXG4gICAgICAgIGNvbnN0IGxlblByZWZpeCA9IEtFWV9QUkVGSVgubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlID0gdGhpcy5zdG9yYWdlLmxlbmd0aDsgaSA8IGU7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2Uua2V5KGkpO1xyXG4gICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGtleS5zdWJzdHJpbmcobGVuUHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKHZhbHVlLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldChrZXk6IHN0cmluZyk6IE5nSHR0cENhY2hpbmdFbnRyeSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKEtFWV9QUkVGSVggKyBrZXkpO1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEl0ZW06IFN0b3JhZ2VFbnRyeSA9IEpTT04ucGFyc2UoaXRlbSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHBhcnNlZEl0ZW0udXJsLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IGRlc2VyaWFsaXplUmVzcG9uc2UocGFyc2VkSXRlbS5yZXNwb25zZSksXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiBkZXNlcmlhbGl6ZVJlcXVlc3QocGFyc2VkSXRlbS5yZXF1ZXN0KSxcclxuICAgICAgICAgICAgICAgIGFkZGVkVGltZTogcGFyc2VkSXRlbS5hZGRlZFRpbWUsXHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBwYXJzZWRJdGVtLnZlcnNpb25cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldEl0ZW0oS0VZX1BSRUZJWCArIGtleSkgIT09IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShLRVlfUFJFRklYICsga2V5LCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIHVybDogdmFsdWUudXJsLFxyXG4gICAgICAgICAgICByZXNwb25zZTogc2VyaWFsaXplUmVzcG9uc2UodmFsdWUucmVzcG9uc2UpLFxyXG4gICAgICAgICAgICByZXF1ZXN0OiBzZXJpYWxpemVSZXF1ZXN0KHZhbHVlLnJlcXVlc3QpLFxyXG4gICAgICAgICAgICBhZGRlZFRpbWU6IHZhbHVlLmFkZGVkVGltZVxyXG4gICAgICAgIH0gYXMgU3RvcmFnZUVudHJ5KSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBTdG9yYWdlRW50cnkge1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICByZXNwb25zZTogc3RyaW5nO1xyXG4gICAgcmVxdWVzdDogc3RyaW5nO1xyXG4gICAgYWRkZWRUaW1lOiBudW1iZXI7XHJcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XHJcbn1cclxuIl19
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFxQixFQUFVLEVBQUU7SUFDOUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsb0RBQW9EO0lBQ2pGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBRSw0RkFBNEY7UUFDckgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUseUJBQXlCO1FBQ2pELENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtTQUM3RyxDQUNKO1FBQ0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztRQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBRSw0RkFBNEY7UUFDcEgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUseUJBQXlCO1FBQ2pELENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FB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QUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztTQUNiLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIH0gZnJvbSAnLi9uZy1odHRwLWNhY2hpbmctc3RvcmFnZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBOZ0h0dHBDYWNoaW5nRW50cnkgfSBmcm9tICcuLi9uZy1odHRwLWNhY2hpbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuY29uc3QgS0VZX1BSRUZJWCA9ICdOZ0h0dHBDYWNoaW5nOjonO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZVJlcXVlc3QgPSAocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSByZXEuY2xvbmUoKTsgLy8gTWFrZSBhIGNsb25lLCB1c2VmdWwgZm9yIGRvaW5nIGRlc3RydWN0aXZlIHRoaW5nc1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoIC8vIEp1c3QgYSBoZWxwZXIgdG8gbWFrZSB0aGlzIGludG8gYW4gb2JqZWN0LCBub3QgcmVhbGx5IHJlcXVpcmVkIGJ1dCBtYWtlcyB0aGUgb3V0cHV0IG5pY2VyXHJcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5rZXlzKCkubWFwKCAvLyBHZXQgYWxsIG9mIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IFtrZXksIHJlcXVlc3QuaGVhZGVycy5nZXRBbGwoa2V5KV0gLy8gR2V0IGFsbCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsIC8vIFRoZSBSZXF1ZXN0IE1ldGhvZCwgZS5nLiBHRVQsIFBPU1QsIERFTEVURVxyXG4gICAgICAgIHVybDogcmVxdWVzdC51cmwsIC8vIFRoZSBVUkxcclxuICAgICAgICBwYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVxdWVzdC5oZWFkZXJzLmdldEFsbChrZXkpXSAvLyBHZXQgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksIC8vIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnNcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzLCAvLyBXaGV0aGVyIGNyZWRlbnRpYWxzIGFyZSBiZWluZyBzZW50XHJcbiAgICAgICAgcmVzcG5zZVR5cGU6IHJlcXVlc3QucmVzcG9uc2VUeXBlLCAvLyBUaGUgcmVzcG9uc2UgdHlwZVxyXG4gICAgICAgIGJvZHk6IHJlcXVlc3Quc2VyaWFsaXplQm9keSgpIC8vIFNlcmlhbGl6ZSB0aGUgYm9keSwgYWxsIHdlbGwgYW5kIGdvb2Qgc2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gYSBjbG9uZVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzZXJpYWxpemVSZXNwb25zZSA9IChyZXM6IEh0dHBSZXNwb25zZTxhbnk+KTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzLmNsb25lKCk7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkubWFwKCAvLyBHZXQgYWxsIG9mIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IFtrZXksIHJlc3BvbnNlLmhlYWRlcnMuZ2V0QWxsKGtleSldIC8vIEdldCBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSxcclxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgICAgIHVybDogcmVzcG9uc2UudXJsLFxyXG4gICAgICAgIGJvZHk6IHJlc3BvbnNlLmJvZHkgLy8gU2VyaWFsaXplIHRoZSBib2R5LCBhbGwgd2VsbCBhbmQgZ29vZCBzaW5jZSB3ZSBhcmUgd29ya2luZyBvbiBhIGNsb25lXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlc2VyaWFsaXplUmVxdWVzdCA9IDxUID0gYW55PihyZXE6IHN0cmluZyk6IEh0dHBSZXF1ZXN0PFQ+ID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBKU09OLnBhcnNlKHJlcSk7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHJlcXVlc3QuaGVhZGVycyk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpOyAvLyBQcm9iYWJseSBzb21lIHdheSB0byBtYWtlIHRoaXMgYSBvbmUtbGluZXIsIGJ1dCBhbGFzLCB0aGVyZSBhcmUgbm8gZ29vZCBkb2NzXHJcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBpbiByZXF1ZXN0LnBhcmFtcykge1xyXG4gICAgICAgIHJlcXVlc3QucGFyYW1zW3BhcmFtZXRlcl0uZm9yRWFjaCgocGFyYW1WYWx1ZTogc3RyaW5nKSA9PiBwYXJhbXMuYXBwZW5kKHBhcmFtZXRlciwgcGFyYW1WYWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVxdWVzdChyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHJlcXVlc3QuYm9keSwge1xyXG4gICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogcmVxdWVzdC5yZXNwb25zZVR5cGUsXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiByZXF1ZXN0LndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZXNlcmlhbGl6ZVJlc3BvbnNlID0gPFQgPSBhbnk+KHJlczogc3RyaW5nKTogSHR0cFJlc3BvbnNlPFQ+ID0+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXMpO1xyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2U8VD4oe1xyXG4gICAgICAgIHVybDogcmVzcG9uc2UudXJsLFxyXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKSxcclxuICAgICAgICBib2R5OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdCcm93c2VyU3RvcmFnZSBpbXBsZW1lbnRzIE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UpIHsgfVxyXG5cclxuICAgIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgZSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPCBlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlLmtleShpKTtcclxuICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGUgPSB0aGlzLnN0b3JhZ2UubGVuZ3RoOyBpIDwgZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc3RvcmFnZS5rZXkoaSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkgJiYga2V5LnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oS0VZX1BSRUZJWCArIGtleSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IE5nSHR0cENhY2hpbmdFbnRyeSwga2V5OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICAvLyBpdGVyYXRlIHRoaXMuc3RvcmFnZVxyXG4gICAgICAgIGNvbnN0IGxlblByZWZpeCA9IEtFWV9QUkVGSVgubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlID0gdGhpcy5zdG9yYWdlLmxlbmd0aDsgaSA8IGU7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2Uua2V5KGkpO1xyXG4gICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGtleS5zdWJzdHJpbmcobGVuUHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKHZhbHVlLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldChrZXk6IHN0cmluZyk6IFJlYWRvbmx5PE5nSHR0cENhY2hpbmdFbnRyeT4gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShLRVlfUFJFRklYICsga2V5KTtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRJdGVtOiBTdG9yYWdlRW50cnkgPSBKU09OLnBhcnNlKGl0ZW0pO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdXJsOiBwYXJzZWRJdGVtLnVybCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBkZXNlcmlhbGl6ZVJlc3BvbnNlKHBhcnNlZEl0ZW0ucmVzcG9uc2UpLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogZGVzZXJpYWxpemVSZXF1ZXN0KHBhcnNlZEl0ZW0ucmVxdWVzdCksXHJcbiAgICAgICAgICAgICAgICBhZGRlZFRpbWU6IHBhcnNlZEl0ZW0uYWRkZWRUaW1lLFxyXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogcGFyc2VkSXRlbS52ZXJzaW9uXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRJdGVtKEtFWV9QUkVGSVggKyBrZXkpICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogTmdIdHRwQ2FjaGluZ0VudHJ5KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oS0VZX1BSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICB1cmw6IHZhbHVlLnVybCxcclxuICAgICAgICAgICAgcmVzcG9uc2U6IHNlcmlhbGl6ZVJlc3BvbnNlKHZhbHVlLnJlc3BvbnNlKSxcclxuICAgICAgICAgICAgcmVxdWVzdDogc2VyaWFsaXplUmVxdWVzdCh2YWx1ZS5yZXF1ZXN0KSxcclxuICAgICAgICAgICAgYWRkZWRUaW1lOiB2YWx1ZS5hZGRlZFRpbWVcclxuICAgICAgICB9IGFzIFN0b3JhZ2VFbnRyeSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgU3RvcmFnZUVudHJ5IHtcclxuICAgIHVybDogc3RyaW5nO1xyXG4gICAgcmVzcG9uc2U6IHN0cmluZztcclxuICAgIHJlcXVlc3Q6IHN0cmluZztcclxuICAgIGFkZGVkVGltZTogbnVtYmVyO1xyXG4gICAgdmVyc2lvbjogc3RyaW5nO1xyXG59XHJcbiJdfQ==
|
|
@@ -24,4 +24,4 @@ export class NgHttpCachingMemoryStorage {
|
|
|
24
24
|
this.store.set(key, value);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLW1lbW9yeS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaHR0cC1jYWNoaW5nL3NyYy9saWIvc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctbWVtb3J5LXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLDBCQUEwQjtJQUF2QztRQU1ZLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBd0MsQ0FBQztJQXlCcEUsQ0FBQztJQTdCRyxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFJRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxPQUFPLENBQU8sVUFBa0U7UUFDNUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsR0FBRyxDQUFPLEdBQVc7UUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxHQUFHLENBQU8sR0FBVyxFQUFFLEtBQStCO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB9IGZyb20gJy4vbmctaHR0cC1jYWNoaW5nLXN0b3JhZ2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ0VudHJ5IH0gZnJvbSAnLi4vbmctaHR0cC1jYWNoaW5nLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdNZW1vcnlTdG9yYWdlIGltcGxlbWVudHMgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2Uge1xyXG5cclxuICAgIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0b3JlID0gbmV3IE1hcDxzdHJpbmcsIE5nSHR0cENhY2hpbmdFbnRyeTxhbnksIGFueT4+KCk7XHJcblxyXG4gICAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvckVhY2g8SywgVD4oY2FsbGJhY2tmbjogKHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4sIGtleTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZm9yRWFjaChjYWxsYmFja2ZuKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQ8SywgVD4oa2V5OiBzdHJpbmcpOiBSZWFkb25seTxOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4+IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQ8SywgVD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3JlLnNldChrZXksIHZhbHVlKTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLXN0b3JhZ2UuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaHR0cC1jYWNoaW5nL3NyYy9saWIvc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctc3RvcmFnZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSHR0cENhY2hpbmdFbnRyeSB9IGZyb20gJy4uL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBjYWNoZWQgZW50cmllcy5cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBjbGVhcigpOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlIHRoZSBjaGFjaGUgZW50cnkgZm9yIHRoZSBwcm92aWRlZCBrZXkuXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZm9yRWFjaCgpIG1ldGhvZCBleGVjdXRlcyBhIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggY2hhY2hlIGVudHJ5LlxyXG4gICAgICovXHJcbiAgICBmb3JFYWNoPEsgPSBhbnksIFQgPSBhbnk+KGNhbGxiYWNrZm46ICh2YWx1ZTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+LCBrZXk6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGNoYWNoZSBlbnRyeSBmb3IgdGhlIHByb3ZpZGVkIGtleS5cclxuICAgICAqL1xyXG4gICAgZ2V0PEsgPSBhbnksIFQgPSBhbnk+KGtleTogc3RyaW5nKTogUmVhZG9ubHk8TmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBjYWNoZSBlbnRyeSBleGlzdHMgdGhlIHByb3ZpZGVkIGtleS5cclxuICAgICAqL1xyXG4gICAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY2hhY2hlIGVudHJ5IGZvciB0aGUgcHJvdmlkZWQga2V5LlxyXG4gICAgICovXHJcbiAgICBzZXQ8SyA9IGFueSwgVCA9IGFueT4oa2V5OiBzdHJpbmcsIHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pOiB2b2lkO1xyXG59XHJcbiJdfQ==
|
|
@@ -34,14 +34,33 @@ class NgHttpCachingMemoryStorage {
|
|
|
34
34
|
const NG_HTTP_CACHING_CONFIG = new InjectionToken('ng-http-caching.config');
|
|
35
35
|
var NgHttpCachingStrategy;
|
|
36
36
|
(function (NgHttpCachingStrategy) {
|
|
37
|
+
/**
|
|
38
|
+
* All request are cacheable if HTTP method is into `allowedMethod`
|
|
39
|
+
*/
|
|
37
40
|
NgHttpCachingStrategy["ALLOW_ALL"] = "ALLOW_ALL";
|
|
41
|
+
/**
|
|
42
|
+
* Only the request with `X-NG-HTTP-CACHING-ALLOW-CACHE` header are cacheable if HTTP method is into `allowedMethod`
|
|
43
|
+
*/
|
|
38
44
|
NgHttpCachingStrategy["DISALLOW_ALL"] = "DISALLOW_ALL";
|
|
39
45
|
})(NgHttpCachingStrategy || (NgHttpCachingStrategy = {}));
|
|
40
46
|
var NgHttpCachingHeaders;
|
|
41
47
|
(function (NgHttpCachingHeaders) {
|
|
48
|
+
/**
|
|
49
|
+
* Request is cacheable if HTTP method is into `allowedMethod`
|
|
50
|
+
*/
|
|
42
51
|
NgHttpCachingHeaders["ALLOW_CACHE"] = "X-NG-HTTP-CACHING-ALLOW-CACHE";
|
|
52
|
+
/**
|
|
53
|
+
* Request isn't cacheable
|
|
54
|
+
*/
|
|
43
55
|
NgHttpCachingHeaders["DISALLOW_CACHE"] = "X-NG-HTTP-CACHING-DISALLOW-CACHE";
|
|
56
|
+
/**
|
|
57
|
+
* Specific cache lifetime for the request
|
|
58
|
+
*/
|
|
44
59
|
NgHttpCachingHeaders["LIFETIME"] = "X-NG-HTTP-CACHING-LIFETIME";
|
|
60
|
+
/**
|
|
61
|
+
* You can tag multiple request by adding this header with the same tag and
|
|
62
|
+
* using `NgHttpCachingService.clearCacheByTag(tag: string)` for delete all the tagged request
|
|
63
|
+
*/
|
|
45
64
|
NgHttpCachingHeaders["TAG"] = "X-NG-HTTP-CACHING-TAG";
|
|
46
65
|
})(NgHttpCachingHeaders || (NgHttpCachingHeaders = {}));
|
|
47
66
|
const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);
|
|
@@ -110,7 +129,6 @@ class NgHttpCachingService {
|
|
|
110
129
|
* Add response to cache
|
|
111
130
|
*/
|
|
112
131
|
addToCache(req, res) {
|
|
113
|
-
const key = this.getKey(req);
|
|
114
132
|
const entry = {
|
|
115
133
|
url: req.urlWithParams,
|
|
116
134
|
response: res,
|
|
@@ -119,6 +137,7 @@ class NgHttpCachingService {
|
|
|
119
137
|
version: this.config.version,
|
|
120
138
|
};
|
|
121
139
|
if (this.isValid(entry)) {
|
|
140
|
+
const key = this.getKey(req);
|
|
122
141
|
this.config.store.set(key, entry);
|
|
123
142
|
return true;
|
|
124
143
|
}
|
|
@@ -147,7 +166,7 @@ class NgHttpCachingService {
|
|
|
147
166
|
* Clear the cache by regex
|
|
148
167
|
*/
|
|
149
168
|
clearCacheByRegex(regex) {
|
|
150
|
-
this.config.store.forEach((
|
|
169
|
+
this.config.store.forEach((_, key) => {
|
|
151
170
|
if (regex.test(key)) {
|
|
152
171
|
this.clearCacheByKey(key);
|
|
153
172
|
}
|
|
@@ -260,7 +279,9 @@ class NgHttpCachingService {
|
|
|
260
279
|
return this.config.allowedMethod.indexOf(req.method) !== -1;
|
|
261
280
|
}
|
|
262
281
|
/**
|
|
263
|
-
* Return the cache key
|
|
282
|
+
* Return the cache key.
|
|
283
|
+
* Default key is http method plus url with query parameters, eg.:
|
|
284
|
+
* `GET@https://github.com/nigrosimone/ng-http-caching`
|
|
264
285
|
*/
|
|
265
286
|
getKey(req) {
|
|
266
287
|
// if user provide custom method, use it
|
|
@@ -271,7 +292,7 @@ class NgHttpCachingService {
|
|
|
271
292
|
return result;
|
|
272
293
|
}
|
|
273
294
|
}
|
|
274
|
-
// default key
|
|
295
|
+
// default key is req.method plus url with query parameters
|
|
275
296
|
return req.method + '@' + req.urlWithParams;
|
|
276
297
|
}
|
|
277
298
|
/**
|
|
@@ -359,7 +380,7 @@ class NgHttpCachingInterceptorService {
|
|
|
359
380
|
const cachedObservable = this.cacheService.getFromQueue(req);
|
|
360
381
|
if (cachedObservable) {
|
|
361
382
|
// console.log('cachedObservable');
|
|
362
|
-
return
|
|
383
|
+
return cachedObservable;
|
|
363
384
|
}
|
|
364
385
|
// Checked if there is cached response for this request
|
|
365
386
|
const cachedResponse = this.cacheService.getFromCache(req);
|
|
@@ -440,7 +461,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
|
|
|
440
461
|
}] });
|
|
441
462
|
|
|
442
463
|
const KEY_PREFIX = 'NgHttpCaching::';
|
|
443
|
-
|
|
464
|
+
const serializeRequest = (req) => {
|
|
444
465
|
const request = req.clone(); // Make a clone, useful for doing destructive things
|
|
445
466
|
return JSON.stringify({
|
|
446
467
|
headers: Object.fromEntries(// Just a helper to make this into an object, not really required but makes the output nicer
|
|
@@ -457,8 +478,8 @@ function serializeRequest(req) {
|
|
|
457
478
|
respnseType: request.responseType,
|
|
458
479
|
body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone
|
|
459
480
|
});
|
|
460
|
-
}
|
|
461
|
-
|
|
481
|
+
};
|
|
482
|
+
const serializeResponse = (res) => {
|
|
462
483
|
const response = res.clone();
|
|
463
484
|
return JSON.stringify({
|
|
464
485
|
headers: Object.fromEntries(// Just a helper to make this into an object, not really required but makes the output nicer
|
|
@@ -468,14 +489,13 @@ function serializeResponse(res) {
|
|
|
468
489
|
status: response.status,
|
|
469
490
|
statusText: response.statusText,
|
|
470
491
|
url: response.url,
|
|
471
|
-
body: response // Serialize the body, all well and good since we are working on a clone
|
|
492
|
+
body: response.body // Serialize the body, all well and good since we are working on a clone
|
|
472
493
|
});
|
|
473
|
-
}
|
|
474
|
-
|
|
494
|
+
};
|
|
495
|
+
const deserializeRequest = (req) => {
|
|
475
496
|
const request = JSON.parse(req);
|
|
476
497
|
const headers = new HttpHeaders(request.headers);
|
|
477
498
|
const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs
|
|
478
|
-
// tslint:disable-next-line: forin
|
|
479
499
|
for (const parameter in request.params) {
|
|
480
500
|
request.params[parameter].forEach((paramValue) => params.append(parameter, paramValue));
|
|
481
501
|
}
|
|
@@ -485,8 +505,8 @@ function deserializeRequest(req) {
|
|
|
485
505
|
responseType: request.responseType,
|
|
486
506
|
withCredentials: request.withCredentials
|
|
487
507
|
});
|
|
488
|
-
}
|
|
489
|
-
|
|
508
|
+
};
|
|
509
|
+
const deserializeResponse = (res) => {
|
|
490
510
|
const response = JSON.parse(res);
|
|
491
511
|
return new HttpResponse({
|
|
492
512
|
url: response.url,
|
|
@@ -495,7 +515,7 @@ function deserializeResponse(res) {
|
|
|
495
515
|
status: response.status,
|
|
496
516
|
statusText: response.statusText,
|
|
497
517
|
});
|
|
498
|
-
}
|
|
518
|
+
};
|
|
499
519
|
class NgHttpCachingBrowserStorage {
|
|
500
520
|
constructor(storage) {
|
|
501
521
|
this.storage = storage;
|