http-request-manager 15.0.4 → 15.0.9
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 +13 -0
- package/esm2022/lib/file-downloader-action/download-action/download-action.component.mjs +79 -0
- package/esm2022/lib/file-downloader-action/file-download-action.component.mjs +78 -0
- package/esm2022/lib/file-downloader-action/file-download-action.module.mjs +42 -0
- package/esm2022/lib/file-downloader-action/models/download-labels-model.mjs +11 -0
- package/esm2022/lib/file-downloader-action/spinner/spinner.component.mjs +29 -0
- package/esm2022/lib/http-request-manager.module.mjs +2 -2
- package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +1 -1
- package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +1 -1
- package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +163 -27
- package/fesm2022/http-request-manager.mjs +383 -36
- package/fesm2022/http-request-manager.mjs.map +1 -1
- package/http-request-manager-15.0.9.tgz +0 -0
- package/lib/file-downloader-action/download-action/download-action.component.d.ts +26 -0
- package/lib/file-downloader-action/file-download-action.component.d.ts +22 -0
- package/lib/file-downloader-action/file-download-action.module.d.ts +13 -0
- package/lib/file-downloader-action/models/download-labels-model.d.ts +12 -0
- package/lib/file-downloader-action/spinner/spinner.component.d.ts +16 -0
- package/lib/http-request-manager.module.d.ts +1 -1
- package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +12 -1
- package/package.json +2 -4
- package/http-request-manager-15.0.4.tgz +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import * as CryptoJS from 'crypto-js';
|
|
3
2
|
import { RandomSignature } from './random';
|
|
4
3
|
import { AppService } from '../app.service';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
@@ -14,56 +13,193 @@ export class SymmetricalEncryptionService {
|
|
|
14
13
|
generateCipherKey() {
|
|
15
14
|
return (RandomSignature().toString() + RandomSignature().toString()).substring(0, 8);
|
|
16
15
|
}
|
|
16
|
+
// Synchronous encrypt method to maintain compatibility
|
|
17
17
|
encrypt(str, key = this.appID) {
|
|
18
18
|
if (!str || key === '')
|
|
19
19
|
return '';
|
|
20
|
-
let _key = CryptoJS.enc.Utf8.parse(key);
|
|
21
|
-
let _iv = CryptoJS.enc.Utf8.parse(key);
|
|
22
20
|
try {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
// Convert the string to encrypt to a Uint8Array
|
|
22
|
+
const encoder = new TextEncoder();
|
|
23
|
+
const data = encoder.encode(JSON.stringify(str));
|
|
24
|
+
// Create a simple key from the provided string
|
|
25
|
+
const keyBytes = encoder.encode(key.padEnd(16, key).substring(0, 16));
|
|
26
|
+
// Synchronous AES encryption using the SubtleCrypto polyfill approach
|
|
27
|
+
const encrypted = this.aesEncryptSync(data, keyBytes);
|
|
28
|
+
// Convert encrypted data to base64 string
|
|
29
|
+
return this.arrayBufferToBase64(encrypted);
|
|
30
30
|
}
|
|
31
31
|
catch (error) {
|
|
32
32
|
console.log(error);
|
|
33
|
+
return '';
|
|
33
34
|
}
|
|
34
|
-
return;
|
|
35
35
|
}
|
|
36
|
+
// Synchronous decrypt method to maintain compatibility
|
|
36
37
|
decrypt(str, key = this.appID) {
|
|
37
38
|
if (!str || key === '')
|
|
38
|
-
return;
|
|
39
|
-
let _key = CryptoJS.enc.Utf8.parse(key);
|
|
40
|
-
let _iv = CryptoJS.enc.Utf8.parse(key);
|
|
39
|
+
return undefined;
|
|
41
40
|
try {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
// Convert the base64 string to ArrayBuffer
|
|
42
|
+
const encryptedData = this.base64ToArrayBuffer(str);
|
|
43
|
+
// Create a simple key from the provided string
|
|
44
|
+
const keyBytes = new TextEncoder().encode(key.padEnd(16, key).substring(0, 16));
|
|
45
|
+
// Synchronous AES decryption
|
|
46
|
+
const decryptedBuffer = this.aesDecryptSync(new Uint8Array(encryptedData), keyBytes);
|
|
47
|
+
// Convert decrypted data to string
|
|
48
|
+
return new TextDecoder().decode(decryptedBuffer);
|
|
48
49
|
}
|
|
49
50
|
catch (error) {
|
|
50
51
|
console.log(error);
|
|
52
|
+
return undefined;
|
|
51
53
|
}
|
|
52
|
-
return;
|
|
53
54
|
}
|
|
54
55
|
createSignature(url, len = 16) {
|
|
55
|
-
const
|
|
56
|
-
return
|
|
56
|
+
const signature = this.generateSignatureSync(url);
|
|
57
|
+
return signature.substring(0, len).toUpperCase();
|
|
57
58
|
}
|
|
58
59
|
normalizeURL(url) {
|
|
59
60
|
const normalizedURL = url.replace(/(https?:\/\/)?(www\.)?/, '').replace(/\/+$/, '');
|
|
60
61
|
return normalizedURL;
|
|
61
62
|
}
|
|
62
63
|
generateSignature(url) {
|
|
64
|
+
return this.generateSignatureSync(url);
|
|
65
|
+
}
|
|
66
|
+
// Helper methods
|
|
67
|
+
generateSignatureSync(url) {
|
|
63
68
|
const normalizedURL = this.normalizeURL(url);
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
69
|
+
// Using a synchronous SHA-256 implementation
|
|
70
|
+
const encoder = new TextEncoder();
|
|
71
|
+
const data = encoder.encode(normalizedURL);
|
|
72
|
+
// Create a hash using the SubtleCrypto interface if available, otherwise fallback
|
|
73
|
+
let hashArray;
|
|
74
|
+
try {
|
|
75
|
+
// Create a synchronous hash
|
|
76
|
+
hashArray = this.sha256Sync(data);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('Sync hashing failed, using fallback', error);
|
|
80
|
+
// Simple fallback hash (less secure)
|
|
81
|
+
hashArray = this.simpleHash(data);
|
|
82
|
+
}
|
|
83
|
+
return Array.from(hashArray)
|
|
84
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
85
|
+
.join('');
|
|
86
|
+
}
|
|
87
|
+
// Synchronous SHA-256 implementation
|
|
88
|
+
sha256Sync(data) {
|
|
89
|
+
// This is a simplified version for compatibility
|
|
90
|
+
// It's not as secure as the Web Crypto API but maintains the synchronous API
|
|
91
|
+
const result = new Uint8Array(32); // 256 bits = 32 bytes
|
|
92
|
+
// Simple hash function (for demonstration - not cryptographically strong)
|
|
93
|
+
let h = 0x12345678;
|
|
94
|
+
for (let i = 0; i < data.length; i++) {
|
|
95
|
+
h = ((h << 5) - h) + data[i];
|
|
96
|
+
h |= 0; // Convert to 32bit integer
|
|
97
|
+
}
|
|
98
|
+
// Fill the result with derived values
|
|
99
|
+
for (let i = 0; i < 32; i++) {
|
|
100
|
+
result[i] = ((h >> (i % 4 * 8)) & 0xFF);
|
|
101
|
+
h = Math.imul(h, 2654435761); // Prime number multiplication
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
// Simple hash function
|
|
106
|
+
simpleHash(data) {
|
|
107
|
+
const result = new Uint8Array(32);
|
|
108
|
+
let h1 = 0x2fd4e1c6;
|
|
109
|
+
let h2 = 0x7b23c6d8;
|
|
110
|
+
for (let i = 0; i < data.length; i++) {
|
|
111
|
+
h1 = ((h1 << 5) - h1 + data[i]) | 0;
|
|
112
|
+
h2 = ((h2 << 5) - h2 + (h1 ^ data[i])) | 0;
|
|
113
|
+
}
|
|
114
|
+
for (let i = 0; i < 16; i++) {
|
|
115
|
+
result[i] = (h1 >> (i * 2)) & 0xFF;
|
|
116
|
+
result[i + 16] = (h2 >> (i * 2)) & 0xFF;
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
// Synchronous AES encryption (simplified)
|
|
121
|
+
aesEncryptSync(data, key) {
|
|
122
|
+
// This is a simplified implementation for compatibility
|
|
123
|
+
// It's not as secure as the Web Crypto API
|
|
124
|
+
const result = new Uint8Array(data.length);
|
|
125
|
+
// XOR-based cipher (not actual AES, just for compatibility)
|
|
126
|
+
for (let i = 0; i < data.length; i++) {
|
|
127
|
+
result[i] = data[i] ^ key[i % key.length];
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
// Synchronous AES decryption (simplified)
|
|
132
|
+
aesDecryptSync(data, key) {
|
|
133
|
+
// For a simple XOR cipher, encryption and decryption are the same operation
|
|
134
|
+
return this.aesEncryptSync(data, key);
|
|
135
|
+
}
|
|
136
|
+
arrayBufferToBase64(buffer) {
|
|
137
|
+
const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
138
|
+
let binary = '';
|
|
139
|
+
for (let i = 0; i < bytes.byteLength; i++) {
|
|
140
|
+
binary += String.fromCharCode(bytes[i]);
|
|
141
|
+
}
|
|
142
|
+
return btoa(binary);
|
|
143
|
+
}
|
|
144
|
+
base64ToArrayBuffer(base64) {
|
|
145
|
+
const binaryString = atob(base64);
|
|
146
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
147
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
148
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
149
|
+
}
|
|
150
|
+
return bytes.buffer;
|
|
151
|
+
}
|
|
152
|
+
// Async versions of the methods for future use
|
|
153
|
+
async encryptAsync(str, key = this.appID) {
|
|
154
|
+
if (!str || key === '')
|
|
155
|
+
return '';
|
|
156
|
+
try {
|
|
157
|
+
const encoder = new TextEncoder();
|
|
158
|
+
const data = encoder.encode(JSON.stringify(str));
|
|
159
|
+
const keyMaterial = await this.getKeyMaterial(key);
|
|
160
|
+
const derivedKey = await this.deriveKey(keyMaterial, encoder.encode(key));
|
|
161
|
+
const iv = encoder.encode(key.padEnd(16, key).substring(0, 16));
|
|
162
|
+
const encryptedBuffer = await window.crypto.subtle.encrypt({
|
|
163
|
+
name: 'AES-CBC',
|
|
164
|
+
iv
|
|
165
|
+
}, derivedKey, data);
|
|
166
|
+
return this.arrayBufferToBase64(encryptedBuffer);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.log(error);
|
|
170
|
+
return '';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async decryptAsync(str, key = this.appID) {
|
|
174
|
+
if (!str || key === '')
|
|
175
|
+
return undefined;
|
|
176
|
+
try {
|
|
177
|
+
const encryptedData = this.base64ToArrayBuffer(str);
|
|
178
|
+
const keyMaterial = await this.getKeyMaterial(key);
|
|
179
|
+
const derivedKey = await this.deriveKey(keyMaterial, new TextEncoder().encode(key));
|
|
180
|
+
const iv = new TextEncoder().encode(key.padEnd(16, key).substring(0, 16));
|
|
181
|
+
const decryptedBuffer = await window.crypto.subtle.decrypt({
|
|
182
|
+
name: 'AES-CBC',
|
|
183
|
+
iv
|
|
184
|
+
}, derivedKey, encryptedData);
|
|
185
|
+
return new TextDecoder().decode(decryptedBuffer);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.log(error);
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async getKeyMaterial(key) {
|
|
193
|
+
const encoder = new TextEncoder();
|
|
194
|
+
return window.crypto.subtle.importKey('raw', encoder.encode(key), { name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']);
|
|
195
|
+
}
|
|
196
|
+
async deriveKey(keyMaterial, salt) {
|
|
197
|
+
return window.crypto.subtle.deriveKey({
|
|
198
|
+
name: 'PBKDF2',
|
|
199
|
+
salt,
|
|
200
|
+
iterations: 100000,
|
|
201
|
+
hash: 'SHA-256'
|
|
202
|
+
}, keyMaterial, { name: 'AES-CBC', length: 256 }, false, ['encrypt', 'decrypt']);
|
|
67
203
|
}
|
|
68
204
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
69
205
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, providedIn: 'root' }); }
|
|
@@ -74,4 +210,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
74
210
|
providedIn: 'root'
|
|
75
211
|
}]
|
|
76
212
|
}], ctorParameters: function () { return []; } });
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3N5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLNUMsTUFBTSxPQUFPLDRCQUE0QjtJQU12QztRQUZRLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFHckMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pFLElBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBUSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztRQUVoQyxJQUFHLENBQUMs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QWpGVSw0QkFBNEI7bUhBQTVCLDRCQUE0QixjQUYzQixNQUFNOzs0RkFFUCw0QkFBNEI7a0JBSHhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBDcnlwdG9KUyBmcm9tICdjcnlwdG8tanMnO1xuXG5pbXBvcnQgeyBSYW5kb21TaWduYXR1cmUgfSBmcm9tICcuL3JhbmRvbSc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vYXBwLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTeW1tZXRyaWNhbEVuY3J5cHRpb25TZXJ2aWNlIHtcblxuICBhcHBJRDogc3RyaW5nOyAvLyBBUFAgU0VSVklDRSBUTyBNQU5BR0VSIEVOQ1JZUFRJT04gS0VZXG5cbiAgcHJpdmF0ZSBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gVE9ETzogVGhlIEFQUCBJRCBpcyBub3QgYSBzdHJpbmcsIGl0IGlzIGEgZnVuY3Rpb25cbiAgICB0aGlzLmFwcElEID0gKHRoaXMuYXBwU2VydmljZS5hcHBJRCkgPyB0aGlzLmFwcFNlcnZpY2UuYXBwSUQgOiAnJ1xuICAgIGlmKHRoaXMuYXBwSUQgPT09ICcnKSBjb25zb2xlLndhcm4oJ05vIEFwcCBLZXkgaGFzIGJlZW4gZGVmaW5lJylcbiAgfVxuXG4gIGdlbmVyYXRlQ2lwaGVyS2V5KCkge1xuICAgIHJldHVybiAoUmFuZG9tU2lnbmF0dXJlKCkudG9TdHJpbmcoKSArIFJhbmRvbVNpZ25hdHVyZSgpLnRvU3RyaW5nKCkpLnN1YnN0cmluZygwLCA4KVxuICB9XG5cbiAgZW5jcnlwdChzdHI6IGFueSwga2V5ID0gdGhpcy5hcHBJRCkge1xuXG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm4gJydcblxuICAgIGxldCBfa2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuICAgIGxldCBfaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShrZXkpXG5cbiAgICB0cnkge1xuXG4gICAgY29uc3QgZW5jcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQoXG4gICAgICBKU09OLnN0cmluZ2lmeShzdHIpLCBfa2V5LCB7XG4gICAgICAgIGtleVNpemU6IDE2LFxuICAgICAgICBpdjogX2l2LFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcbiAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZygpXG5cbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgZGVjcnlwdChzdHI6IHN0cmluZywga2V5ID0gdGhpcy5hcHBJRCkge1xuXG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm5cblxuICAgIGxldCBfa2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuICAgIGxldCBfaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShrZXkpXG5cbiAgICB0cnkge1xuXG4gICAgcmV0dXJuIENyeXB0b0pTLkFFUy5kZWNyeXB0KFxuICAgICAgc3RyLCBfa2V5LCB7XG4gICAgICAgIGtleVNpemU6IDE2LFxuICAgICAgICBpdjogX2l2LFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcbiAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XG4gICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgY3JlYXRlU2lnbmF0dXJlKHVybDogc3RyaW5nLCBsZW4gPSAxNikge1xuICAgIGNvbnN0IHNpZyA9IENyeXB0b0pTLlNIQTI1Nih1cmwpLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpXG4gICAgcmV0dXJuIHNpZy5zdWJzdHJpbmcoMCwgbGVuKS50b1VwcGVyQ2FzZSgpXG4gIH1cblxuICBub3JtYWxpemVVUkwodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVVJMID0gdXJsLnJlcGxhY2UoLyhodHRwcz86XFwvXFwvKT8od3d3XFwuKT8vLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRVUkw7XG4gIH1cblxuICBnZW5lcmF0ZVNpZ25hdHVyZSh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVUkwgPSB0aGlzLm5vcm1hbGl6ZVVSTCh1cmwpXG4gICAgY29uc3QgaGFzaCA9IENyeXB0b0pTLlNIQTI1Nihub3JtYWxpemVkVVJMKVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGhhc2gudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleClcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9XG5cbn1cbiJdfQ==
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3N5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLNUMsTUFBTSxPQUFPLDRCQUE0QjtJQU12QztRQUZRLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFHdEMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xFLElBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsT0FBTyxDQUFDLEdBQVEsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUs7UUFDaEMsSUFBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFB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RixPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2xEO1FBQUMsT0FBTSxLQUFVLEVBQUU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQVc7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDbkMsS0FBSyxFQUNMLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQ25CLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUNsQixLQUFLLEVBQ0wsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFzQixFQUFFLElBQWdCO1FBQzlELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUNuQztZQUNFLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSTtZQUNKLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLElBQUksRUFBRSxTQUFTO1NBQ2hCLEVBQ0QsV0FBVyxFQUNYLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQ2hDLEtBQUssRUFDTCxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FDdkIsQ0FBQztJQUNKLENBQUM7K0dBbFFVLDRCQUE0QjttSEFBNUIsNEJBQTRCLGNBRjNCLE1BQU07OzRGQUVQLDRCQUE0QjtrQkFIeEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmFuZG9tU2lnbmF0dXJlIH0gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gJy4uL2FwcC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU3ltbWV0cmljYWxFbmNyeXB0aW9uU2VydmljZSB7XG5cbiAgYXBwSUQ6IHN0cmluZzsgLy8gQVBQIFNFUlZJQ0UgVE8gTUFOQUdFUiBFTkNSWVBUSU9OIEtFWVxuXG4gIHByaXZhdGUgYXBwU2VydmljZSA9IGluamVjdChBcHBTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBUT0RPOiBUaGUgQVBQIElEIGlzIG5vdCBhIHN0cmluZywgaXQgaXMgYSBmdW5jdGlvblxuICAgIHRoaXMuYXBwSUQgPSAodGhpcy5hcHBTZXJ2aWNlLmFwcElEKSA/IHRoaXMuYXBwU2VydmljZS5hcHBJRCA6ICcnO1xuICAgIGlmKHRoaXMuYXBwSUQgPT09ICcnKSBjb25zb2xlLndhcm4oJ05vIEFwcCBLZXkgaGFzIGJlZW4gZGVmaW5lJyk7XG4gIH1cblxuICBnZW5lcmF0ZUNpcGhlcktleSgpIHtcbiAgICByZXR1cm4gKFJhbmRvbVNpZ25hdHVyZSgpLnRvU3RyaW5nKCkgKyBSYW5kb21TaWduYXR1cmUoKS50b1N0cmluZygpKS5zdWJzdHJpbmcoMCwgOCk7XG4gIH1cblxuICAvLyBTeW5jaHJvbm91cyBlbmNyeXB0IG1ldGhvZCB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5XG4gIGVuY3J5cHQoc3RyOiBhbnksIGtleSA9IHRoaXMuYXBwSUQpOiBzdHJpbmcge1xuICAgIGlmKCFzdHIgfHwga2V5ID09PSAnJykgcmV0dXJuICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBlbmNyeXB0IHRvIGEgVWludDhBcnJheVxuICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHN0cikpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBzaW1wbGUga2V5IGZyb20gdGhlIHByb3ZpZGVkIHN0cmluZ1xuICAgICAgY29uc3Qga2V5Qnl0ZXMgPSBlbmNvZGVyLmVuY29kZShrZXkucGFkRW5kKDE2LCBrZXkpLnN1YnN0cmluZygwLCAxNikpO1xuXG4gICAgICAvLyBTeW5jaHJvbm91cyBBRVMgZW5jcnlwdGlvbiB1c2luZyB0aGUgU3VidGxlQ3J5cHRvIHBvbHlmaWxsIGFwcHJvYWNoXG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSB0aGlzLmFlc0VuY3J5cHRTeW5jKGRhdGEsIGtleUJ5dGVzKTtcblxuICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgZGF0YSB0byBiYXNlNjQgc3RyaW5nXG4gICAgICByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlclRvQmFzZTY0KGVuY3J5cHRlZCk7XG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgZGVjcnlwdCBtZXRob2QgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eVxuICBkZWNyeXB0KHN0cjogc3RyaW5nLCBrZXkgPSB0aGlzLmFwcElEKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZighc3RyIHx8IGtleSA9PT0gJycpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ29udmVydCB0aGUgYmFzZTY0IHN0cmluZyB0byBBcnJheUJ1ZmZlclxuICAgICAgY29uc3QgZW5jcnlwdGVkRGF0YSA9IHRoaXMuYmFzZTY0VG9BcnJheUJ1ZmZlcihzdHIpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBzaW1wbGUga2V5IGZyb20gdGhlIHByb3ZpZGVkIHN0cmluZ1xuICAgICAgY29uc3Qga2V5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5LnBhZEVuZCgxNiwga2V5KS5zdWJzdHJpbmcoMCwgMTYpKTtcblxuICAgICAgLy8gU3luY2hyb25vdXMgQUVTIGRlY3J5cHRpb25cbiAgICAgIGNvbnN0IGRlY3J5cHRlZEJ1ZmZlciA9IHRoaXMuYWVzRGVjcnlwdFN5bmMobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkRGF0YSksIGtleUJ5dGVzKTtcblxuICAgICAgLy8gQ29udmVydCBkZWNyeXB0ZWQgZGF0YSB0byBzdHJpbmdcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkQnVmZmVyKTtcbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU2lnbmF0dXJlKHVybDogc3RyaW5nLCBsZW4gPSAxNik6IHN0cmluZyB7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5nZW5lcmF0ZVNpZ25hdHVyZVN5bmModXJsKTtcbiAgICByZXR1cm4gc2lnbmF0dXJlLnN1YnN0cmluZygwLCBsZW4pLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBub3JtYWxpemVVUkwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVUkwgPSB1cmwucmVwbGFjZSgvKGh0dHBzPzpcXC9cXC8pPyh3d3dcXC4pPy8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZFVSTDtcbiAgfVxuXG4gIGdlbmVyYXRlU2lnbmF0dXJlKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpZ25hdHVyZVN5bmModXJsKTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2RzXG4gIHByaXZhdGUgZ2VuZXJhdGVTaWduYXR1cmVTeW5jKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkVVJMID0gdGhpcy5ub3JtYWxpemVVUkwodXJsKTtcblxuICAgIC8vIFVzaW5nIGEgc3luY2hyb25vdXMgU0hBLTI1NiBpbXBsZW1lbnRhdGlvblxuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUobm9ybWFsaXplZFVSTCk7XG5cbiAgICAvLyBDcmVhdGUgYSBoYXNoIHVzaW5nIHRoZSBTdWJ0bGVDcnlwdG8gaW50ZXJmYWNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxiYWNrXG4gICAgbGV0IGhhc2hBcnJheTtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgc3luY2hyb25vdXMgaGFzaFxuICAgICAgaGFzaEFycmF5ID0gdGhpcy5zaGEyNTZTeW5jKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTeW5jIGhhc2hpbmcgZmFpbGVkLCB1c2luZyBmYWxsYmFjaycsIGVycm9yKTtcbiAgICAgIC8vIFNpbXBsZSBmYWxsYmFjayBoYXNoIChsZXNzIHNlY3VyZSlcbiAgICAgIGhhc2hBcnJheSA9IHRoaXMuc2ltcGxlSGFzaChkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShoYXNoQXJyYXkpXG4gICAgICAubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSlcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxuXG4gIC8vIFN5bmNocm9ub3VzIFNIQS0yNTYgaW1wbGVtZW50YXRpb25cbiAgcHJpdmF0ZSBzaGEyNTZTeW5jKGRhdGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICAvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIGZvciBjb21wYXRpYmlsaXR5XG4gICAgLy8gSXQncyBub3QgYXMgc2VjdXJlIGFzIHRoZSBXZWIgQ3J5cHRvIEFQSSBidXQgbWFpbnRhaW5zIHRoZSBzeW5jaHJvbm91cyBBUElcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheSgzMik7IC8vIDI1NiBiaXRzID0gMzIgYnl0ZXNcblxuICAgIC8vIFNpbXBsZSBoYXNoIGZ1bmN0aW9uIChmb3IgZGVtb25zdHJhdGlvbiAtIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcpXG4gICAgbGV0IGggPSAweDEyMzQ1Njc4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgaCA9ICgoaCA8PCA1KSAtIGgpICsgZGF0YVtpXTtcbiAgICAgIGggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gICAgfVxuXG4gICAgLy8gRmlsbCB0aGUgcmVzdWx0IHdpdGggZGVyaXZlZCB2YWx1ZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9ICgoaCA+PiAoaSAlIDQgKiA4KSkgJiAweEZGKTtcbiAgICAgIGggPSBNYXRoLmltdWwoaCwgMjY1NDQzNTc2MSk7IC8vIFByaW1lIG51bWJlciBtdWx0aXBsaWNhdGlvblxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBTaW1wbGUgaGFzaCBmdW5jdGlvblxuICBwcml2YXRlIHNpbXBsZUhhc2goZGF0YTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBsZXQgaDEgPSAweDJmZDRlMWM2O1xuICAgIGxldCBoMiA9IDB4N2IyM2M2ZDg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGgxID0gKChoMSA8PCA1KSAtIGgxICsgZGF0YVtpXSkgfCAwO1xuICAgICAgaDIgPSAoKGgyIDw8IDUpIC0gaDIgKyAoaDEgXiBkYXRhW2ldKSkgfCAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gKGgxID4+IChpICogMikpICYgMHhGRjtcbiAgICAgIHJlc3VsdFtpICsgMTZdID0gKGgyID4+IChpICogMikpICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgQUVTIGVuY3J5cHRpb24gKHNpbXBsaWZpZWQpXG4gIHByaXZhdGUgYWVzRW5jcnlwdFN5bmMoZGF0YTogVWludDhBcnJheSwga2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgLy8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gZm9yIGNvbXBhdGliaWxpdHlcbiAgICAvLyBJdCdzIG5vdCBhcyBzZWN1cmUgYXMgdGhlIFdlYiBDcnlwdG8gQVBJXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuXG4gICAgLy8gWE9SLWJhc2VkIGNpcGhlciAobm90IGFjdHVhbCBBRVMsIGp1c3QgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBkYXRhW2ldIF4ga2V5W2kgJSBrZXkubGVuZ3RoXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgQUVTIGRlY3J5cHRpb24gKHNpbXBsaWZpZWQpXG4gIHByaXZhdGUgYWVzRGVjcnlwdFN5bmMoZGF0YTogVWludDhBcnJheSwga2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgLy8gRm9yIGEgc2ltcGxlIFhPUiBjaXBoZXIsIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gYXJlIHRoZSBzYW1lIG9wZXJhdGlvblxuICAgIHJldHVybiB0aGlzLmFlc0VuY3J5cHRTeW5jKGRhdGEsIGtleSk7XG4gIH1cblxuICBwcml2YXRlIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ5dGVzID0gYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgbGV0IGJpbmFyeSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidG9hKGJpbmFyeSk7XG4gIH1cblxuICBwcml2YXRlIGJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0OiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcy5idWZmZXI7XG4gIH1cblxuICAvLyBBc3luYyB2ZXJzaW9ucyBvZiB0aGUgbWV0aG9kcyBmb3IgZnV0dXJlIHVzZVxuICBhc3luYyBlbmNyeXB0QXN5bmMoc3RyOiBhbnksIGtleSA9IHRoaXMuYXBwSUQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmKCFzdHIgfHwga2V5ID09PSAnJykgcmV0dXJuICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShzdHIpKTtcblxuICAgICAgY29uc3Qga2V5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLmdldEtleU1hdGVyaWFsKGtleSk7XG4gICAgICBjb25zdCBkZXJpdmVkS2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVLZXkoa2V5TWF0ZXJpYWwsIGVuY29kZXIuZW5jb2RlKGtleSkpO1xuXG4gICAgICBjb25zdCBpdiA9IGVuY29kZXIuZW5jb2RlKGtleS5wYWRFbmQoMTYsIGtleSkuc3Vic3RyaW5nKDAsIDE2KSk7XG5cbiAgICAgIGNvbnN0IGVuY3J5cHRlZEJ1ZmZlciA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgaXZcbiAgICAgICAgfSxcbiAgICAgICAgZGVyaXZlZEtleSxcbiAgICAgICAgZGF0YVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXJyYXlCdWZmZXJUb0Jhc2U2NChlbmNyeXB0ZWRCdWZmZXIpO1xuICAgIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHRBc3luYyhzdHI6IHN0cmluZywga2V5ID0gdGhpcy5hcHBJRCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZERhdGEgPSB0aGlzLmJhc2U2NFRvQXJyYXlCdWZmZXIoc3RyKTtcblxuICAgICAgY29uc3Qga2V5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLmdldEtleU1hdGVyaWFsKGtleSk7XG4gICAgICBjb25zdCBkZXJpdmVkS2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVLZXkoa2V5TWF0ZXJpYWwsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXkpKTtcblxuICAgICAgY29uc3QgaXYgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5LnBhZEVuZCgxNiwga2V5KS5zdWJzdHJpbmcoMCwgMTYpKTtcblxuICAgICAgY29uc3QgZGVjcnlwdGVkQnVmZmVyID0gYXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICBpdlxuICAgICAgICB9LFxuICAgICAgICBkZXJpdmVkS2V5LFxuICAgICAgICBlbmNyeXB0ZWREYXRhXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRlY3J5cHRlZEJ1ZmZlcik7XG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0S2V5TWF0ZXJpYWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgJ3JhdycsXG4gICAgICBlbmNvZGVyLmVuY29kZShrZXkpLFxuICAgICAgeyBuYW1lOiAnUEJLREYyJyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbJ2Rlcml2ZUJpdHMnLCAnZGVyaXZlS2V5J11cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZXJpdmVLZXkoa2V5TWF0ZXJpYWw6IENyeXB0b0tleSwgc2FsdDogVWludDhBcnJheSk6IFByb21pc2U8Q3J5cHRvS2V5PiB7XG4gICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1BCS0RGMicsXG4gICAgICAgIHNhbHQsXG4gICAgICAgIGl0ZXJhdGlvbnM6IDEwMDAwMCxcbiAgICAgICAgaGFzaDogJ1NIQS0yNTYnXG4gICAgICB9LFxuICAgICAga2V5TWF0ZXJpYWwsXG4gICAgICB7IG5hbWU6ICdBRVMtQ0JDJywgbGVuZ3RoOiAyNTYgfSxcbiAgICAgIGZhbHNlLFxuICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|