@libs-ui/utils 0.1.1-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/base64.d.ts +5 -0
- package/cache.d.ts +42 -0
- package/color.d.ts +11 -0
- package/communicate-micro.d.ts +16 -0
- package/constants.d.ts +10 -0
- package/crypto-3rd.d.ts +7 -0
- package/crypto.d.ts +8 -0
- package/dangerous-object.d.ts +79 -0
- package/date.d.ts +44 -0
- package/dom.d.ts +52 -0
- package/download.d.ts +3 -0
- package/esm2022/base64.mjs +43 -0
- package/esm2022/cache.mjs +388 -0
- package/esm2022/color.mjs +133 -0
- package/esm2022/communicate-micro.mjs +149 -0
- package/esm2022/constants.mjs +11 -0
- package/esm2022/crypto-3rd.mjs +38 -0
- package/esm2022/crypto.mjs +41 -0
- package/esm2022/dangerous-object.mjs +149 -0
- package/esm2022/date.mjs +191 -0
- package/esm2022/dom.mjs +256 -0
- package/esm2022/download.mjs +41 -0
- package/esm2022/file.mjs +90 -0
- package/esm2022/format-number.mjs +66 -0
- package/esm2022/format-text.mjs +149 -0
- package/esm2022/function-check-embed-frame.mjs +10 -0
- package/esm2022/get-smart-axis-scale.mjs +174 -0
- package/esm2022/helpers.mjs +651 -0
- package/esm2022/http-params.mjs +80 -0
- package/esm2022/index.mjs +30 -0
- package/esm2022/inject-token.mjs +5 -0
- package/esm2022/key-cache.mjs +31 -0
- package/esm2022/key-code.mjs +123 -0
- package/esm2022/language.mjs +70 -0
- package/esm2022/libs-ui-utils.mjs +5 -0
- package/esm2022/pattern.mjs +62 -0
- package/esm2022/random.mjs +42 -0
- package/esm2022/two-way-signal-object.mjs +131 -0
- package/esm2022/uri.mjs +25 -0
- package/esm2022/url-search-params.mjs +99 -0
- package/esm2022/uuid.mjs +18 -0
- package/esm2022/xss-filter.mjs +10 -0
- package/fesm2022/libs-ui-utils.mjs +3234 -0
- package/fesm2022/libs-ui-utils.mjs.map +1 -0
- package/file.d.ts +18 -0
- package/format-number.d.ts +2 -0
- package/format-text.d.ts +11 -0
- package/function-check-embed-frame.d.ts +2 -0
- package/get-smart-axis-scale.d.ts +34 -0
- package/helpers.d.ts +270 -0
- package/http-params.d.ts +37 -0
- package/index.d.ts +29 -0
- package/inject-token.d.ts +4 -0
- package/key-cache.d.ts +1 -0
- package/key-code.d.ts +122 -0
- package/language.d.ts +37 -0
- package/package.json +29 -0
- package/pattern.d.ts +20 -0
- package/random.d.ts +3 -0
- package/two-way-signal-object.d.ts +15 -0
- package/uri.d.ts +5 -0
- package/url-search-params.d.ts +25 -0
- package/uuid.d.ts +1 -0
- package/xss-filter.d.ts +3 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/* eslint-disable no-async-promise-executor */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { UtilsCommunicateMicro } from './communicate-micro';
|
|
4
|
+
import { decrypt, encrypt, md5 } from './crypto';
|
|
5
|
+
import { getPlatFromBrowser } from './dom';
|
|
6
|
+
import { isEmbedFrame } from './function-check-embed-frame';
|
|
7
|
+
import { get, isNil } from './helpers';
|
|
8
|
+
import { UtilsLanguageConstants } from './language';
|
|
9
|
+
import { uuid } from './uuid';
|
|
10
|
+
export class UtilsCache {
|
|
11
|
+
static CACHE_EXPIRE_TIME_DEFAULT = 5 * 60;
|
|
12
|
+
static CACHE_EXPIRE_NONE = -1;
|
|
13
|
+
static idService = uuid();
|
|
14
|
+
static typeKeyClearLocalStorage = 'LIBS_UI_CLEAR_LOCAL_STORAGE_EVENT';
|
|
15
|
+
static languageKeyCache = 'SR3xQKxHgffiCevPQRralg';
|
|
16
|
+
static listKeyKeepWhenClearALll = Array();
|
|
17
|
+
static initdEvent;
|
|
18
|
+
static storage;
|
|
19
|
+
static dbName = 'libs-ui-cache';
|
|
20
|
+
static itemIndexByKey = 'key';
|
|
21
|
+
static dbVersion = 1;
|
|
22
|
+
static db = null;
|
|
23
|
+
static init(config) {
|
|
24
|
+
if (this.initdEvent) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.initdEvent = true;
|
|
28
|
+
if (config.indexedDBName) {
|
|
29
|
+
this.dbName = config.indexedDBName;
|
|
30
|
+
}
|
|
31
|
+
if (config.typeKeyClearLocalStorage) {
|
|
32
|
+
this.typeKeyClearLocalStorage = config.typeKeyClearLocalStorage;
|
|
33
|
+
}
|
|
34
|
+
if (config.listKeyKeepWhenClearAll) {
|
|
35
|
+
this.listKeyKeepWhenClearALll = config.listKeyKeepWhenClearAll;
|
|
36
|
+
}
|
|
37
|
+
if (config.languageKeyCache) {
|
|
38
|
+
this.languageKeyCache = config.languageKeyCache;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
static setLang(lang) {
|
|
42
|
+
if (!UtilsLanguageConstants.isSupported(lang)) {
|
|
43
|
+
throw Error(`Language not support ${lang}`);
|
|
44
|
+
}
|
|
45
|
+
this.Set(this.languageKeyCache, lang, this.CACHE_EXPIRE_NONE);
|
|
46
|
+
}
|
|
47
|
+
static getLang() {
|
|
48
|
+
return this.Get(this.languageKeyCache, UtilsLanguageConstants.defaultLang);
|
|
49
|
+
}
|
|
50
|
+
static openDB() {
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
const request = indexedDB.open(this.dbName, this.dbVersion);
|
|
53
|
+
request.onupgradeneeded = (event) => {
|
|
54
|
+
const db = event.target.result;
|
|
55
|
+
if (!db.objectStoreNames.contains(this.dbName)) {
|
|
56
|
+
const objectStore = db.createObjectStore(this.dbName, { keyPath: this.itemIndexByKey });
|
|
57
|
+
objectStore.createIndex(this.itemIndexByKey, this.itemIndexByKey, { unique: true });
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
request.onsuccess = () => {
|
|
61
|
+
this.db = request.result;
|
|
62
|
+
resolve(true);
|
|
63
|
+
};
|
|
64
|
+
request.onerror = (event) => {
|
|
65
|
+
console.trace('Error opening IndexedDB:', event);
|
|
66
|
+
resolve(false);
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
static async getObjectStore() {
|
|
71
|
+
if (!this.db) {
|
|
72
|
+
await this.openDB();
|
|
73
|
+
}
|
|
74
|
+
const transaction = this.db?.transaction([this.dbName], 'readwrite');
|
|
75
|
+
if (!transaction) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return transaction.objectStore(this.dbName);
|
|
79
|
+
}
|
|
80
|
+
static get LocalStorage() {
|
|
81
|
+
try {
|
|
82
|
+
if (typeof window.localStorage !== 'undefined') {
|
|
83
|
+
const OS = getPlatFromBrowser();
|
|
84
|
+
if (OS.includes('Safari') && parseFloat(OS.split(' ').pop() || '0') >= 16) {
|
|
85
|
+
return this.getLocalStorageFakeOnSafari();
|
|
86
|
+
}
|
|
87
|
+
return localStorage;
|
|
88
|
+
}
|
|
89
|
+
return this.getLocalStorageFake();
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
console.trace(`LocalStorage `, error);
|
|
93
|
+
return this.getLocalStorageFake();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
static getLocalStorageFakeOnSafari() {
|
|
97
|
+
if (typeof window.localStorage !== 'undefined' && !this.storage && Object.keys(localStorage).length) {
|
|
98
|
+
this.storage = { ...localStorage };
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
setItem: (key, value) => {
|
|
102
|
+
localStorage.setItem(key, value);
|
|
103
|
+
this.storage[key] = value;
|
|
104
|
+
},
|
|
105
|
+
getItem: (key) => {
|
|
106
|
+
const value = localStorage.getItem(key);
|
|
107
|
+
if (value) {
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
if (!this.storage || isNil(this.storage[key])) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
localStorage.setItem(key, this.storage[key]);
|
|
114
|
+
return this.storage?.[key];
|
|
115
|
+
},
|
|
116
|
+
removeItem: (key) => {
|
|
117
|
+
delete this.storage?.[key];
|
|
118
|
+
localStorage.removeItem(key);
|
|
119
|
+
},
|
|
120
|
+
clear: () => {
|
|
121
|
+
this.storage = {};
|
|
122
|
+
localStorage.clear();
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
static getLocalStorageFake() {
|
|
127
|
+
if (!this.storage) {
|
|
128
|
+
this.storage = {};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
setItem: (key, value) => {
|
|
132
|
+
this.storage[key] = value;
|
|
133
|
+
},
|
|
134
|
+
getItem: (key) => {
|
|
135
|
+
return this.storage?.[key];
|
|
136
|
+
},
|
|
137
|
+
removeItem: (key) => {
|
|
138
|
+
delete this.storage?.[key];
|
|
139
|
+
},
|
|
140
|
+
clear: () => {
|
|
141
|
+
this.storage = {};
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
static async GetAsync(key, default_value, isKeyMD5 = false) {
|
|
146
|
+
key = isKeyMD5 ? key : md5(key);
|
|
147
|
+
return new Promise(async (resolve) => {
|
|
148
|
+
const objectStore = await this.getObjectStore();
|
|
149
|
+
if (!objectStore) {
|
|
150
|
+
return resolve(default_value);
|
|
151
|
+
}
|
|
152
|
+
const request = objectStore.get(key);
|
|
153
|
+
request.onsuccess = () => {
|
|
154
|
+
if (!request.result) {
|
|
155
|
+
return resolve(default_value);
|
|
156
|
+
}
|
|
157
|
+
const data = JSON.parse(decrypt(request.result.value));
|
|
158
|
+
if (data.expire === this.CACHE_EXPIRE_NONE) {
|
|
159
|
+
return resolve(data.json);
|
|
160
|
+
}
|
|
161
|
+
const currentMillisecond = new Date().valueOf() / 1000;
|
|
162
|
+
if (data.expire < currentMillisecond) {
|
|
163
|
+
return resolve(default_value);
|
|
164
|
+
}
|
|
165
|
+
return resolve(data.json);
|
|
166
|
+
};
|
|
167
|
+
request.onerror = () => {
|
|
168
|
+
console.trace(`Get key ${key} Error, return default value: ${default_value}`);
|
|
169
|
+
return resolve(default_value);
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
static Get(key, default_value) {
|
|
174
|
+
// support cho những file không thể inject UtilsCache
|
|
175
|
+
if (!key) {
|
|
176
|
+
return this.GetDefaultValueBySpecificKey(key, default_value);
|
|
177
|
+
}
|
|
178
|
+
const cachedData = this.LocalStorage.getItem(key);
|
|
179
|
+
if (!cachedData) {
|
|
180
|
+
return this.GetDefaultValueBySpecificKey(key, default_value);
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const data = JSON.parse(decrypt(cachedData));
|
|
184
|
+
if (data.expire === this.CACHE_EXPIRE_NONE) {
|
|
185
|
+
return data.value ?? default_value;
|
|
186
|
+
}
|
|
187
|
+
const currentMillisecond = new Date().valueOf() / 1000;
|
|
188
|
+
if (data.expire < currentMillisecond) {
|
|
189
|
+
return this.GetDefaultValueBySpecificKey(key, default_value);
|
|
190
|
+
}
|
|
191
|
+
return data.value;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.trace(`Get key ${key} Error, return default value: ${default_value}`, error);
|
|
195
|
+
return this.GetDefaultValueBySpecificKey(key, default_value);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
static GetDefaultValueBySpecificKey(key, default_value) {
|
|
199
|
+
return default_value;
|
|
200
|
+
}
|
|
201
|
+
static async SetAsync(key, value, expireTimeBySecond = this.CACHE_EXPIRE_TIME_DEFAULT, isKeyMD5 = false) {
|
|
202
|
+
// support inject UtilsCache
|
|
203
|
+
return new Promise(async (resolve) => {
|
|
204
|
+
const objectStore = await this.getObjectStore();
|
|
205
|
+
key = isKeyMD5 ? key : md5(key);
|
|
206
|
+
try {
|
|
207
|
+
const currentMillisecond = expireTimeBySecond === this.CACHE_EXPIRE_NONE ? this.CACHE_EXPIRE_NONE : new Date().valueOf() / 1000 + expireTimeBySecond;
|
|
208
|
+
const data = {
|
|
209
|
+
value: encrypt(JSON.stringify({ json: value, expire: currentMillisecond })),
|
|
210
|
+
};
|
|
211
|
+
data[this.itemIndexByKey] = key;
|
|
212
|
+
if (!objectStore) {
|
|
213
|
+
console.trace(`Can not open object store`);
|
|
214
|
+
return resolve({ key, messageError: 'Can not open object store' });
|
|
215
|
+
}
|
|
216
|
+
const request = objectStore?.put(data);
|
|
217
|
+
request.onsuccess = () => {
|
|
218
|
+
console.log(`Set key ${key} Success`);
|
|
219
|
+
resolve(request.result);
|
|
220
|
+
};
|
|
221
|
+
request.onerror = (error) => {
|
|
222
|
+
console.trace(`Set key ${key} Error`);
|
|
223
|
+
resolve({ key, messageError: get(error, 'message') });
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
console.trace(`Set key ${key} Error`);
|
|
228
|
+
resolve({ key, messageError: get(error, 'message') });
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
static Set(key, value, expireTimeBySecond = this.CACHE_EXPIRE_TIME_DEFAULT) {
|
|
233
|
+
// support cho những file không inject UtilsCache
|
|
234
|
+
const currentMillisecond = expireTimeBySecond === this.CACHE_EXPIRE_NONE ? this.CACHE_EXPIRE_NONE : new Date().valueOf() / 1000 + expireTimeBySecond;
|
|
235
|
+
const data = {
|
|
236
|
+
value: value,
|
|
237
|
+
expire: currentMillisecond,
|
|
238
|
+
};
|
|
239
|
+
try {
|
|
240
|
+
this.LocalStorage.setItem(key, encrypt(JSON.stringify(data)));
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
console.trace(`Set key ${key} Error`, error);
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
static async ClearAsync(key, isMD5 = false) {
|
|
249
|
+
return new Promise(async (resolve) => {
|
|
250
|
+
const objectStore = await this.getObjectStore();
|
|
251
|
+
if (!objectStore) {
|
|
252
|
+
return resolve();
|
|
253
|
+
}
|
|
254
|
+
const request = objectStore.delete(isMD5 ? key : md5(key));
|
|
255
|
+
request.onsuccess = () => {
|
|
256
|
+
resolve({ clearSuccess: true });
|
|
257
|
+
};
|
|
258
|
+
request.onerror = (event) => {
|
|
259
|
+
console.trace('Error deleting Key:', get(event.target.error, 'message'));
|
|
260
|
+
resolve({ messageError: get(event.target.error, 'message'), clearSuccess: false });
|
|
261
|
+
};
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
static Clear(key) {
|
|
265
|
+
if (key.includes('kc-callback-')) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this.LocalStorage.removeItem(key);
|
|
269
|
+
}
|
|
270
|
+
static ClearAllAsync() {
|
|
271
|
+
return new Promise(async (resolve) => {
|
|
272
|
+
const objectStore = await this.getObjectStore();
|
|
273
|
+
if (!objectStore) {
|
|
274
|
+
return resolve();
|
|
275
|
+
}
|
|
276
|
+
const request = objectStore.clear();
|
|
277
|
+
request.onsuccess = () => {
|
|
278
|
+
console.log('clear all successfully');
|
|
279
|
+
resolve({ clearSuccess: true });
|
|
280
|
+
};
|
|
281
|
+
request.onerror = (event) => {
|
|
282
|
+
console.trace('Error deleting key:', get(event.target.error, 'message'));
|
|
283
|
+
resolve({ messageError: get(event.target.error, 'message'), clearSuccess: false });
|
|
284
|
+
};
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
static ClearAll() {
|
|
288
|
+
if (isEmbedFrame()) {
|
|
289
|
+
const data = {
|
|
290
|
+
type: this.typeKeyClearLocalStorage,
|
|
291
|
+
response: {
|
|
292
|
+
idEvent: this.idService,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
UtilsCommunicateMicro.PostMessageToParent(data);
|
|
296
|
+
}
|
|
297
|
+
const keys = [...this.listKeyKeepWhenClearALll];
|
|
298
|
+
Object.keys(this.LocalStorage).forEach((key) => {
|
|
299
|
+
if (key.includes('kc-callback-')) {
|
|
300
|
+
keys.push(key);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
const stores = this.GetDataByKeys(Array.from(keys));
|
|
304
|
+
this.LocalStorage.clear();
|
|
305
|
+
this.SetDataByKey(stores);
|
|
306
|
+
}
|
|
307
|
+
static GetDataByKeys(keys) {
|
|
308
|
+
const stores = new Map();
|
|
309
|
+
keys.forEach((key) => {
|
|
310
|
+
if (key.includes('kc-callback-')) {
|
|
311
|
+
stores.set(key, this.LocalStorage.getItem(key));
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
stores.set(key, this.Get(key));
|
|
315
|
+
});
|
|
316
|
+
return stores;
|
|
317
|
+
}
|
|
318
|
+
static SetDataByKey(stores) {
|
|
319
|
+
stores.forEach((value, key) => {
|
|
320
|
+
if (key.includes('kc-callback-')) {
|
|
321
|
+
this.LocalStorage.setItem(key, value);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (key === this.languageKeyCache) {
|
|
325
|
+
return this.setLang(value);
|
|
326
|
+
}
|
|
327
|
+
this.Set(key, value, this.CACHE_EXPIRE_NONE);
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
static DeleteKeyStartWithAsync(keyCacheStartWith, isKeyMD5 = false) {
|
|
331
|
+
return new Promise(async (resolve) => {
|
|
332
|
+
const objectStore = await this.getObjectStore();
|
|
333
|
+
if (!objectStore) {
|
|
334
|
+
return resolve({});
|
|
335
|
+
}
|
|
336
|
+
// Lấy tất cả các keys từ index
|
|
337
|
+
const request = objectStore.getAll();
|
|
338
|
+
keyCacheStartWith = isKeyMD5 ? keyCacheStartWith : md5(keyCacheStartWith);
|
|
339
|
+
request.onsuccess = (e) => {
|
|
340
|
+
const data = e.target.result;
|
|
341
|
+
if (!Array.isArray(data)) {
|
|
342
|
+
return resolve({});
|
|
343
|
+
}
|
|
344
|
+
data.forEach((obj) => {
|
|
345
|
+
if (obj[this.itemIndexByKey].startsWith(keyCacheStartWith)) {
|
|
346
|
+
this.ClearAsync(obj[this.itemIndexByKey], true);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
return resolve({});
|
|
350
|
+
};
|
|
351
|
+
request.onerror = () => {
|
|
352
|
+
return resolve({});
|
|
353
|
+
};
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
static DeleteKeyStartWith(keyCache, isMD5 = false) {
|
|
357
|
+
keyCache = isMD5 ? md5(keyCache) : keyCache;
|
|
358
|
+
const keys = Object.keys(this.LocalStorage);
|
|
359
|
+
if (!keys || !keys.length) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
keys.forEach((key) => {
|
|
363
|
+
if (key.startsWith(keyCache)) {
|
|
364
|
+
this.Clear(key);
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
static DeleteDatabaseIndexDB(dbName) {
|
|
369
|
+
return new Promise((resolve) => {
|
|
370
|
+
dbName = (dbName || this.dbName);
|
|
371
|
+
const request = indexedDB.deleteDatabase(dbName);
|
|
372
|
+
request.onsuccess = () => {
|
|
373
|
+
console.trace('Database deleted successfully');
|
|
374
|
+
resolve({ deleteSuccess: true });
|
|
375
|
+
};
|
|
376
|
+
request.onerror = (event) => {
|
|
377
|
+
const error = event.target.error;
|
|
378
|
+
console.trace('Error deleting database:', error);
|
|
379
|
+
resolve({ messageError: get(error || {}, 'message'), deleteSuccess: false });
|
|
380
|
+
};
|
|
381
|
+
request.onblocked = () => {
|
|
382
|
+
console.trace('Delete request is blocked');
|
|
383
|
+
resolve({ messageError: 'Delete request is blocked', deleteSuccess: false });
|
|
384
|
+
};
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsdURBQXVEO0FBR3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE1BQU0sT0FBTyxVQUFVO0lBQ2QsTUFBTSxDQUFVLHlCQUF5QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbkQsTUFBTSxDQUFVLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sQ0FBVSxTQUFTLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDbkMsTUFBTSxDQUFDLHdCQUF3QixHQUFHLG1DQUFtQyxDQUFDO0lBRXJFLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztJQUNuRCxNQUFNLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDbEQsTUFBTSxDQUFDLFVBQVUsQ0FBVztJQUM1QixNQUFNLENBQUMsT0FBTyxDQUE2QjtJQUMzQyxNQUFNLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQztJQUNoQyxNQUFNLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixNQUFNLENBQUMsU0FBUyxHQUFH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LEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBUyxDQUFDLENBQUM7WUFDN0csQ0FBQyxDQUFDO1lBRUYsT0FBTyxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLDJCQUEyQixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQVMsQ0FBQyxDQUFDO1lBQ3RGLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgSUV2ZW50LCBUWVBFX0xBTkdVQUdFX1NVUFBPUlQgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IFV0aWxzQ29tbXVuaWNhdGVNaWNybyB9IGZyb20gJy4vY29tbXVuaWNhdGUtbWljcm8nO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCwgbWQ1IH0gZnJvbSAnLi9jcnlwdG8nO1xuaW1wb3J0IHsgZ2V0UGxhdEZyb21Ccm93c2VyIH0gZnJvbSAnLi9kb20nO1xuaW1wb3J0IHsgaXNFbWJlZEZyYW1lIH0gZnJvbSAnLi9mdW5jdGlvbi1jaGVjay1lbWJlZC1mcmFtZSc7XG5pbXBvcnQgeyBnZXQsIGlzTmlsIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFV0aWxzTGFuZ3VhZ2VDb25zdGFudHMgfSBmcm9tICcuL2xhbmd1YWdlJztcbmltcG9ydCB7IHV1aWQgfSBmcm9tICcuL3V1aWQnO1xuXG5leHBvcnQgY2xhc3MgVXRpbHNDYWNoZSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0FDSEVfRVhQSVJFX1RJTUVfREVGQVVMVCA9IDUgKiA2MDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDQUNIRV9FWFBJUkVfTk9ORSA9IC0xO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkU2VydmljZSA9IHV1aWQoKTtcbiAgcHVibGljIHN0YXRpYyB0eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2UgPSAnTElCU19VSV9DTEVBUl9MT0NBTF9TVE9SQUdFX0VWRU5UJztcblxuICBwcml2YXRlIHN0YXRpYyBsYW5ndWFnZUtleUNhY2hlID0gJ1NSM3hRS3hIZ2ZmaUNldlBRUnJhbGcnO1xuICBwcml2YXRlIHN0YXRpYyBsaXN0S2V5S2VlcFdoZW5DbGVhckFMbGwgPSBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgc3RhdGljIGluaXRkRXZlbnQ/OiBib29sZWFuO1xuICBwcml2YXRlIHN0YXRpYyBzdG9yYWdlOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcbiAgcHJpdmF0ZSBzdGF0aWMgZGJOYW1lID0gJ2xpYnMtdWktY2FjaGUnO1xuICBwcml2YXRlIHN0YXRpYyBpdGVtSW5kZXhCeUtleSA9ICdrZXknO1xuICBwcml2YXRlIHN0YXRpYyBkYlZlcnNpb24gPSAxO1xuICBwcml2YXRlIHN0YXRpYyBkYjogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgc3RhdGljIGluaXQoY29uZmlnOiB7IGluZGV4ZWREQk5hbWU/OiBzdHJpbmc7IGxhbmd1YWdlS2V5Q2FjaGU/OiBzdHJpbmc7IHR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZT86IHN0cmluZzsgbGlzdEtleUtlZXBXaGVuQ2xlYXJBbGw/OiBBcnJheTxzdHJpbmc+IH0pIHtcbiAgICBpZiAodGhpcy5pbml0ZEV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5pdGRFdmVudCA9IHRydWU7XG4gICAgaWYgKGNvbmZpZy5pbmRleGVkREJOYW1lKSB7XG4gICAgICB0aGlzLmRiTmFtZSA9IGNvbmZpZy5pbmRleGVkREJOYW1lO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZSkge1xuICAgICAgdGhpcy50eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2UgPSBjb25maWcudHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmxpc3RLZXlLZWVwV2hlbkNsZWFyQWxsKSB7XG4gICAgICB0aGlzLmxpc3RLZXlLZWVwV2hlbkNsZWFyQUxsbCA9IGNvbmZpZy5saXN0S2V5S2VlcFdoZW5DbGVhckFsbDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5sYW5ndWFnZUtleUNhY2hlKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlS2V5Q2FjaGUgPSBjb25maWcubGFuZ3VhZ2VLZXlDYWNoZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNldExhbmcobGFuZzogVFlQRV9MQU5HVUFHRV9TVVBQT1JUKSB7XG4gICAgaWYgKCFVdGlsc0xhbmd1YWdlQ29uc3RhbnRzLmlzU3VwcG9ydGVkKGxhbmcpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgTGFuZ3VhZ2Ugbm90IHN1cHBvcnQgJHtsYW5nfWApO1xuICAgIH1cbiAgICB0aGlzLlNldCh0aGlzLmxhbmd1YWdlS2V5Q2FjaGUsIGxhbmcsIHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRMYW5nKCk6IFRZUEVfTEFOR1VBR0VfU1VQUE9SVCB7XG4gICAgcmV0dXJuIHRoaXMuR2V0KHRoaXMubGFuZ3VhZ2VLZXlDYWNoZSwgVXRpbHNMYW5ndWFnZUNvbnN0YW50cy5kZWZhdWx0TGFuZyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvcGVuREIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHRoaXMuZGJWZXJzaW9uKTtcblxuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQ6IElEQlZlcnNpb25DaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuXG4gICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLmRiTmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuZGJOYW1lLCB7IGtleVBhdGg6IHRoaXMuaXRlbUluZGV4QnlLZXkgfSk7XG5cbiAgICAgICAgICBvYmplY3RTdG9yZS5jcmVhdGVJbmRleCh0aGlzLml0ZW1JbmRleEJ5S2V5LCB0aGlzLml0ZW1JbmRleEJ5S2V5LCB7IHVuaXF1ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGIgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBvcGVuaW5nIEluZGV4ZWREQjonLCBldmVudCk7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGdldE9iamVjdFN0b3JlKCkge1xuICAgIGlmICghdGhpcy5kYikge1xuICAgICAgYXdhaXQgdGhpcy5vcGVuREIoKTtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiPy50cmFuc2FjdGlvbihbdGhpcy5kYk5hbWVdLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuZGJOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldCBMb2NhbFN0b3JhZ2UoKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCBPUyA9IGdldFBsYXRGcm9tQnJvd3NlcigpO1xuXG4gICAgICAgIGlmIChPUy5pbmNsdWRlcygnU2FmYXJpJykgJiYgcGFyc2VGbG9hdChPUy5zcGxpdCgnICcpLnBvcCgpIHx8ICcwJykgPj0gMTYpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbFN0b3JhZ2VGYWtlT25TYWZhcmkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldExvY2FsU3RvcmFnZUZha2UoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS50cmFjZShgTG9jYWxTdG9yYWdlIGAsIGVycm9yKTtcbiAgICAgIHJldHVybiB0aGlzLmdldExvY2FsU3RvcmFnZUZha2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRMb2NhbFN0b3JhZ2VGYWtlT25TYWZhcmkoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5zdG9yYWdlICYmIE9iamVjdC5rZXlzKGxvY2FsU3RvcmFnZSkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN0b3JhZ2UgPSB7IC4uLmxvY2FsU3RvcmFnZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3RvcmFnZSB8fCBpc05pbCh0aGlzLnN0b3JhZ2Vba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdGhpcy5zdG9yYWdlW2tleV0gYXMgc3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlPy5ba2V5XTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVJdGVtOiAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3RvcmFnZT8uW2tleV07XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9LFxuICAgICAgY2xlYXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yYWdlID0ge307XG4gICAgICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlRmFrZSgpIHtcbiAgICBpZiAoIXRoaXMuc3RvcmFnZSkge1xuICAgICAgdGhpcy5zdG9yYWdlID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhpcy5zdG9yYWdlW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXRJdGVtOiAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZT8uW2tleV07XG4gICAgICB9LFxuICAgICAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgfSxcbiAgICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBHZXRBc3luYzxUID0gYW55PihrZXk6IHN0cmluZywgZGVmYXVsdF92YWx1ZT86IGFueSwgaXNLZXlNRDUgPSBmYWxzZSk6IFByb21pc2U8VD4ge1xuICAgIGtleSA9IGlzS2V5TUQ1ID8ga2V5IDogbWQ1KGtleSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGRlZmF1bHRfdmFsdWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldChrZXkpO1xuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGRlZmF1bHRfdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRlY3J5cHQocmVxdWVzdC5yZXN1bHQudmFsdWUpKTtcblxuICAgICAgICBpZiAoZGF0YS5leHBpcmUgPT09IHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhLmpzb24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaWxsaXNlY29uZCA9IG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMDtcblxuICAgICAgICBpZiAoZGF0YS5leHBpcmUgPCBjdXJyZW50TWlsbGlzZWNvbmQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlKGRhdGEuanNvbik7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoYEdldCBrZXkgJHtrZXl9IEVycm9yLCByZXR1cm4gZGVmYXVsdCB2YWx1ZTogJHtkZWZhdWx0X3ZhbHVlfWApO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEdldDxUID0gYW55PihrZXk6IHN0cmluZywgZGVmYXVsdF92YWx1ZT86IGFueSk6IFQge1xuICAgIC8vIHN1cHBvcnQgY2hvIG5o4buvbmcgZmlsZSBraMO0bmcgdGjhu4MgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICBpZiAoIWtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgaWYgKCFjYWNoZWREYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkZWNyeXB0KGNhY2hlZERhdGEpKTtcblxuICAgICAgaWYgKGRhdGEuZXhwaXJlID09PSB0aGlzLkNBQ0hFX0VYUElSRV9OT05FKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlID8/IGRlZmF1bHRfdmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAvIDEwMDA7XG5cbiAgICAgIGlmIChkYXRhLmV4cGlyZSA8IGN1cnJlbnRNaWxsaXNlY29uZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLnRyYWNlKGBHZXQga2V5ICR7a2V5fSBFcnJvciwgcmV0dXJuIGRlZmF1bHQgdmFsdWU6ICR7ZGVmYXVsdF92YWx1ZX1gLCBlcnJvcik7XG5cbiAgICAgIHJldHVybiB0aGlzLkdldERlZmF1bHRWYWx1ZUJ5U3BlY2lmaWNLZXkoa2V5LCBkZWZhdWx0X3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEdldERlZmF1bHRWYWx1ZUJ5U3BlY2lmaWNLZXkoa2V5OiBzdHJpbmcsIGRlZmF1bHRfdmFsdWU6IGFueSkge1xuICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBTZXRBc3luYzxUID0gYW55PihrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgZXhwaXJlVGltZUJ5U2Vjb25kID0gdGhpcy5DQUNIRV9FWFBJUkVfVElNRV9ERUZBVUxULCBpc0tleU1ENSA9IGZhbHNlKTogUHJvbWlzZTxUPiB7XG4gICAgLy8gc3VwcG9ydCBpbmplY3QgVXRpbHNDYWNoZVxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCB0aGlzLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGtleSA9IGlzS2V5TUQ1ID8ga2V5IDogbWQ1KGtleSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBleHBpcmVUaW1lQnlTZWNvbmQgPT09IHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUgPyB0aGlzLkNBQ0hFX0VYUElSRV9OT05FIDogbmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwICsgZXhwaXJlVGltZUJ5U2Vjb25kO1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICAgICAgdmFsdWU6IGVuY3J5cHQoSlNPTi5zdHJpbmdpZnkoeyBqc29uOiB2YWx1ZSwgZXhwaXJlOiBjdXJyZW50TWlsbGlzZWNvbmQgfSkpLFxuICAgICAgICB9O1xuICAgICAgICBkYXRhW3RoaXMuaXRlbUluZGV4QnlLZXldID0ga2V5O1xuXG4gICAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgICBjb25zb2xlLnRyYWNlKGBDYW4gbm90IG9wZW4gb2JqZWN0IHN0b3JlYCk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBrZXksIG1lc3NhZ2VFcnJvcjogJ0NhbiBub3Qgb3BlbiBvYmplY3Qgc3RvcmUnIH0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gb2JqZWN0U3RvcmU/LnB1dChkYXRhKTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFNldCBrZXkgJHtrZXl9IFN1Y2Nlc3NgKTtcbiAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzdWx0IGFzIGFueSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS50cmFjZShgU2V0IGtleSAke2tleX0gRXJyb3JgKTtcbiAgICAgICAgICByZXNvbHZlKHsga2V5LCBtZXNzYWdlRXJyb3I6IGdldChlcnJvciBhcyBJRXZlbnQsICdtZXNzYWdlJykgfSBhcyBhbnkpO1xuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShgU2V0IGtleSAke2tleX0gRXJyb3JgKTtcbiAgICAgICAgcmVzb2x2ZSh7IGtleSwgbWVzc2FnZUVycm9yOiBnZXQoZXJyb3IsICdtZXNzYWdlJykgfSBhcyBhbnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIFNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgZXhwaXJlVGltZUJ5U2Vjb25kID0gdGhpcy5DQUNIRV9FWFBJUkVfVElNRV9ERUZBVUxUKTogYm9vbGVhbiB7XG4gICAgLy8gc3VwcG9ydCBjaG8gbmjhu69uZyBmaWxlIGtow7RuZyBpbmplY3QgVXRpbHNDYWNoZVxuICAgIGNvbnN0IGN1cnJlbnRNaWxsaXNlY29uZCA9IGV4cGlyZVRpbWVCeVNlY29uZCA9PT0gdGhpcy5DQUNIRV9FWFBJUkVfTk9ORSA/IHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUgOiBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAvIDEwMDAgKyBleHBpcmVUaW1lQnlTZWNvbmQ7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGV4cGlyZTogY3VycmVudE1pbGxpc2Vjb25kLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIGVuY3J5cHQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLnRyYWNlKGBTZXQga2V5ICR7a2V5fSBFcnJvcmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIENsZWFyQXN5bmMoa2V5OiBzdHJpbmcsIGlzTUQ1ID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZGVsZXRlKGlzTUQ1ID8ga2V5IDogbWQ1KGtleSkpO1xuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh7IGNsZWFyU3VjY2VzczogdHJ1ZSB9IGFzIGFueSk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBkZWxldGluZyBLZXk6JywgZ2V0KChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IsICdtZXNzYWdlJykpO1xuICAgICAgICByZXNvbHZlKHsgbWVzc2FnZUVycm9yOiBnZXQoKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvciwgJ21lc3NhZ2UnKSwgY2xlYXJTdWNjZXNzOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIENsZWFyKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5Mb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDbGVhckFsbEFzeW5jKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCB0aGlzLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmNsZWFyKCk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NsZWFyIGFsbCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgcmVzb2x2ZSh7IGNsZWFyU3VjY2VzczogdHJ1ZSB9IGFzIGFueSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoJ0Vycm9yIGRlbGV0aW5nIGtleTonLCBnZXQoKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvciwgJ21lc3NhZ2UnKSk7XG4gICAgICAgIHJlc29sdmUoeyBtZXNzYWdlRXJyb3I6IGdldCgoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLmVycm9yLCAnbWVzc2FnZScpLCBjbGVhclN1Y2Nlc3M6IGZhbHNlIH0gYXMgYW55KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgQ2xlYXJBbGwoKSB7XG4gICAgaWYgKGlzRW1iZWRGcmFtZSgpKSB7XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICB0eXBlOiB0aGlzLnR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZSxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBpZEV2ZW50OiB0aGlzLmlkU2VydmljZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBVdGlsc0NvbW11bmljYXRlTWljcm8uUG9zdE1lc3NhZ2VUb1BhcmVudChkYXRhKTtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLmxpc3RLZXlLZWVwV2hlbkNsZWFyQUxsbF07XG4gICAgT2JqZWN0LmtleXModGhpcy5Mb2NhbFN0b3JhZ2UpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzdG9yZXMgPSB0aGlzLkdldERhdGFCeUtleXMoQXJyYXkuZnJvbShrZXlzKSk7XG5cbiAgICB0aGlzLkxvY2FsU3RvcmFnZS5jbGVhcigpO1xuXG4gICAgdGhpcy5TZXREYXRhQnlLZXkoc3RvcmVzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIEdldERhdGFCeUtleXMoa2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIGNvbnN0IHN0b3JlcyA9IG5ldyBNYXAoKTtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ2tjLWNhbGxiYWNrLScpKSB7XG4gICAgICAgIHN0b3Jlcy5zZXQoa2V5LCB0aGlzLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN0b3Jlcy5zZXQoa2V5LCB0aGlzLkdldChrZXkpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzdG9yZXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBTZXREYXRhQnlLZXkoc3RvcmVzOiBNYXA8c3RyaW5nLCBhbnk+KSB7XG4gICAgc3RvcmVzLmZvckVhY2goKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKCdrYy1jYWxsYmFjay0nKSkge1xuICAgICAgICB0aGlzLkxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09IHRoaXMubGFuZ3VhZ2VLZXlDYWNoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMYW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuU2V0KGtleSwgdmFsdWUsIHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBEZWxldGVLZXlTdGFydFdpdGhBc3luYyhrZXlDYWNoZVN0YXJ0V2l0aDogc3RyaW5nLCBpc0tleU1ENSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0U3RvcmUoKTtcblxuICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEzhuqV5IHThuqV0IGPhuqMgY8OhYyBrZXlzIHThu6sgaW5kZXhcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5nZXRBbGwoKTtcblxuICAgICAga2V5Q2FjaGVTdGFydFdpdGggPSBpc0tleU1ENSA/IGtleUNhY2hlU3RhcnRXaXRoIDogbWQ1KGtleUNhY2hlU3RhcnRXaXRoKTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlLnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8YW55PjtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgICAgIGlmIChvYmpbdGhpcy5pdGVtSW5kZXhCeUtleV0uc3RhcnRzV2l0aChrZXlDYWNoZVN0YXJ0V2l0aCkpIHtcbiAgICAgICAgICAgIHRoaXMuQ2xlYXJBc3luYyhvYmpbdGhpcy5pdGVtSW5kZXhCeUtleV0sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBEZWxldGVLZXlTdGFydFdpdGgoa2V5Q2FjaGU6IHN0cmluZywgaXNNRDUgPSBmYWxzZSkge1xuICAgIGtleUNhY2hlID0gaXNNRDUgPyBtZDUoa2V5Q2FjaGUpIDoga2V5Q2FjaGU7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuTG9jYWxTdG9yYWdlKTtcblxuICAgIGlmICgha2V5cyB8fCAha2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGtleUNhY2hlKSkge1xuICAgICAgICB0aGlzLkNsZWFyKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIERlbGV0ZURhdGFiYXNlSW5kZXhEQihkYk5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGRiTmFtZSA9IChkYk5hbWUgfHwgdGhpcy5kYk5hbWUpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoZGJOYW1lIGFzIHN0cmluZyk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdEYXRhYmFzZSBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICByZXNvbHZlKHsgZGVsZXRlU3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLmVycm9yO1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBkZWxldGluZyBkYXRhYmFzZTonLCBlcnJvcik7XG4gICAgICAgIHJlc29sdmUoeyBtZXNzYWdlRXJyb3I6IGdldChlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHx8IHt9LCAnbWVzc2FnZScpLCBkZWxldGVTdWNjZXNzOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uYmxvY2tlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS50cmFjZSgnRGVsZXRlIHJlcXVlc3QgaXMgYmxvY2tlZCcpO1xuICAgICAgICByZXNvbHZlKHsgbWVzc2FnZUVycm9yOiAnRGVsZXRlIHJlcXVlc3QgaXMgYmxvY2tlZCcsIGRlbGV0ZVN1Y2Nlc3M6IGZhbHNlIH0gYXMgYW55KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
const step = 20;
|
|
2
|
+
const percent = 0.05;
|
|
3
|
+
export const colorStepContrastFromOrigin = (color, stepNumber) => {
|
|
4
|
+
return colorContrastFromOrigin(color).find((item) => item.step === stepNumber);
|
|
5
|
+
};
|
|
6
|
+
export const colorContrastFromOrigin = (color) => {
|
|
7
|
+
const parsedColorsArray = parseColorValues(color);
|
|
8
|
+
const colors = [];
|
|
9
|
+
let calculatedShades = [];
|
|
10
|
+
let calculatedTints = [];
|
|
11
|
+
if (parsedColorsArray !== null) {
|
|
12
|
+
for (let i = 0; i < parsedColorsArray.length; i++) {
|
|
13
|
+
calculatedShades = calculateShades(parsedColorsArray[i]);
|
|
14
|
+
calculatedTints = calculateTints(parsedColorsArray[i]);
|
|
15
|
+
}
|
|
16
|
+
for (let i = 0; i <= step; i++) {
|
|
17
|
+
colors.push({ step: i * 5, label: `${i * 5}%`, dark: `#${calculatedShades[i]}`, light: `#${calculatedTints[i]}` });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return colors;
|
|
21
|
+
};
|
|
22
|
+
const parseColorValues = (colorValues) => {
|
|
23
|
+
let colorValuesArray = colorValues.match(/\b[0-9A-Fa-f]{3}\b|[0-9A-Fa-f]{6}\b/g);
|
|
24
|
+
if (colorValuesArray) {
|
|
25
|
+
colorValuesArray = colorValuesArray.map((item) => {
|
|
26
|
+
if (item.length === 3) {
|
|
27
|
+
let newItem = item.toString().split('');
|
|
28
|
+
newItem = newItem.reduce((acc, it) => {
|
|
29
|
+
return acc + it + it;
|
|
30
|
+
}, '');
|
|
31
|
+
return newItem;
|
|
32
|
+
}
|
|
33
|
+
return item;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return colorValuesArray;
|
|
37
|
+
};
|
|
38
|
+
const calculateShades = (colorValue) => {
|
|
39
|
+
return calculate(colorValue, rgbShade).concat('000000');
|
|
40
|
+
};
|
|
41
|
+
const calculateTints = (colorValue) => {
|
|
42
|
+
return calculate(colorValue, rgbTint).concat('ffffff');
|
|
43
|
+
};
|
|
44
|
+
const calculate = (colorValue, shadeOrTint) => {
|
|
45
|
+
const color = hexToRGB(colorValue);
|
|
46
|
+
const shadeValues = [];
|
|
47
|
+
for (let i = 0; i < step; i++) {
|
|
48
|
+
shadeValues[i] = rgbToHex(shadeOrTint(color, i));
|
|
49
|
+
}
|
|
50
|
+
return shadeValues;
|
|
51
|
+
};
|
|
52
|
+
const rgbShade = (rgb, i) => {
|
|
53
|
+
return { red: rgb.red * (1 - percent * i), green: rgb.green * (1 - percent * i), blue: rgb.blue * (1 - percent * i) };
|
|
54
|
+
};
|
|
55
|
+
const rgbTint = (rgb, i) => {
|
|
56
|
+
return { red: rgb.red + (255 - rgb.red) * i * percent, green: rgb.green + (255 - rgb.green) * i * percent, blue: rgb.blue + (255 - rgb.blue) * i * percent };
|
|
57
|
+
};
|
|
58
|
+
export const rgbToHex = (rgb) => {
|
|
59
|
+
return intToHex(rgb.red) + intToHex(rgb.green) + intToHex(rgb.blue);
|
|
60
|
+
};
|
|
61
|
+
const hexToRGB = (colorValue) => {
|
|
62
|
+
return { red: parseInt(colorValue.substr(0, 2), 16), green: parseInt(colorValue.substr(2, 2), 16), blue: parseInt(colorValue.substr(4, 2), 16) };
|
|
63
|
+
};
|
|
64
|
+
const intToHex = (rgbint) => {
|
|
65
|
+
return pad(Math.min(Math.max(Math.round(rgbint), 0), 255).toString(16), 2);
|
|
66
|
+
};
|
|
67
|
+
const pad = (number, length) => {
|
|
68
|
+
let str = '' + number;
|
|
69
|
+
while (str.length < length) {
|
|
70
|
+
str = '0' + str;
|
|
71
|
+
}
|
|
72
|
+
return str;
|
|
73
|
+
};
|
|
74
|
+
export const listColorDefine = [
|
|
75
|
+
'#E62222',
|
|
76
|
+
'#B81B1B',
|
|
77
|
+
'#EB4E4E',
|
|
78
|
+
'#F97316',
|
|
79
|
+
'#C75C12',
|
|
80
|
+
'#FA8F45',
|
|
81
|
+
'#FFB700',
|
|
82
|
+
'#CC9200',
|
|
83
|
+
'#FFC533',
|
|
84
|
+
'#84CC16',
|
|
85
|
+
'#6AA312',
|
|
86
|
+
'#9dd645',
|
|
87
|
+
'#00BC62',
|
|
88
|
+
'#00A757',
|
|
89
|
+
'#33DA8A',
|
|
90
|
+
'#06B6D4',
|
|
91
|
+
'#1B59C4',
|
|
92
|
+
'#4E8CF7',
|
|
93
|
+
'#0EA5E9',
|
|
94
|
+
'#1B59C4',
|
|
95
|
+
'#4E8CF7',
|
|
96
|
+
'#226FF5',
|
|
97
|
+
'#1B59C4',
|
|
98
|
+
'#4E8CF7',
|
|
99
|
+
'#6366F1',
|
|
100
|
+
'#4F52C1',
|
|
101
|
+
'#8285F4',
|
|
102
|
+
'#5B04B3',
|
|
103
|
+
'#49038F',
|
|
104
|
+
'#7C36C2',
|
|
105
|
+
'#D946EF',
|
|
106
|
+
'#AE38BF',
|
|
107
|
+
'#E16BF2',
|
|
108
|
+
'#EC4899',
|
|
109
|
+
'#BD3A7A',
|
|
110
|
+
'#F06DAD',
|
|
111
|
+
'#F43F5E',
|
|
112
|
+
'#C3324B',
|
|
113
|
+
'#F6657E',
|
|
114
|
+
'#757380',
|
|
115
|
+
'#5E5C66',
|
|
116
|
+
'#918F99',
|
|
117
|
+
'#202020',
|
|
118
|
+
'#1A1A1A',
|
|
119
|
+
'#4D4D4D',
|
|
120
|
+
];
|
|
121
|
+
export const getColorById = (str) => {
|
|
122
|
+
let hashString = 0;
|
|
123
|
+
if (!str) {
|
|
124
|
+
return '';
|
|
125
|
+
}
|
|
126
|
+
for (let i = 0; i < str.length; i++) {
|
|
127
|
+
const char = str.charCodeAt(i);
|
|
128
|
+
hashString = (hashString << 5) - hashString + char;
|
|
129
|
+
hashString = hashString & hashString;
|
|
130
|
+
}
|
|
131
|
+
return listColorDefine[Math.abs(hashString) % listColorDefine.length];
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jb2xvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBRXJCLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUMsS0FBYSxFQUFFLFVBQWtCLEVBQUUsRUFBRTtJQUMvRSxPQUFPLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQztBQUNqRixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQWEsRUFBbUMsRUFBRTtJQUN4RixNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUN2QixJQUFJLGdCQUFnQixHQUFrQixFQUFFLENBQUM7SUFDekMsSUFBSSxlQUFlLEdBQWtCLEVBQUUsQ0FBQztJQUV4QyxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxlQUFlLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FB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QyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUMvSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtJQUNuQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQUNGLE1BQU0sUUFBUSxHQUFHLENBQUMsVUFBZSxFQUFFLEVBQUU7SUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkosQ0FBQyxDQUFDO0FBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFXLEVBQUUsRUFBRTtJQUMvQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0UsQ0FBQyxDQUFDO0FBRUYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFXLEVBQUUsTUFBVyxFQUFFLEVBQUU7SUFDdkMsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUV0QixPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFrQjtJQUM1QyxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUU7SUFDbEQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBRW5CLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvQixVQUFVLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQztRQUNuRCxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29sb3JDb250cmFzdEZyb21PcmlnaW4ge1xuICBzdGVwOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxpZ2h0OiBzdHJpbmc7XG4gIGRhcms6IHN0cmluZztcbn1cblxuY29uc3Qgc3RlcCA9IDIwO1xuY29uc3QgcGVyY2VudCA9IDAuMDU7XG5cbmV4cG9ydCBjb25zdCBjb2xvclN0ZXBDb250cmFzdEZyb21PcmlnaW4gPSAoY29sb3I6IHN0cmluZywgc3RlcE51bWJlcjogbnVtYmVyKSA9PiB7XG4gIHJldHVybiBjb2xvckNvbnRyYXN0RnJvbU9yaWdpbihjb2xvcikuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGVwID09PSBzdGVwTnVtYmVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb2xvckNvbnRyYXN0RnJvbU9yaWdpbiA9IChjb2xvcjogc3RyaW5nKTogQXJyYXk8SUNvbG9yQ29udHJhc3RGcm9tT3JpZ2luPiA9PiB7XG4gIGNvbnN0IHBhcnNlZENvbG9yc0FycmF5ID0gcGFyc2VDb2xvclZhbHVlcyhjb2xvcik7XG4gIGNvbnN0IGNvbG9yczogYW55ID0gW107XG4gIGxldCBjYWxjdWxhdGVkU2hhZGVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGxldCBjYWxjdWxhdGVkVGludHM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICBpZiAocGFyc2VkQ29sb3JzQXJyYXkgIT09IG51bGwpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZENvbG9yc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjYWxjdWxhdGVkU2hhZGVzID0gY2FsY3VsYXRlU2hhZGVzKHBhcnNlZENvbG9yc0FycmF5W2ldKTtcbiAgICAgIGNhbGN1bGF0ZWRUaW50cyA9IGNhbGN1bGF0ZVRpbnRzKHBhcnNlZENvbG9yc0FycmF5W2ldKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwOyBpKyspIHtcbiAgICAgIGNvbG9ycy5wdXNoKHsgc3RlcDogaSAqIDUsIGxhYmVsOiBgJHtpICogNX0lYCwgZGFyazogYCMke2NhbGN1bGF0ZWRTaGFkZXNbaV19YCwgbGlnaHQ6IGAjJHtjYWxjdWxhdGVkVGludHNbaV19YCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29sb3JzO1xufTtcblxuY29uc3QgcGFyc2VDb2xvclZhbHVlcyA9IChjb2xvclZhbHVlczogYW55KSA9PiB7XG4gIGxldCBjb2xvclZhbHVlc0FycmF5ID0gY29sb3JWYWx1ZXMubWF0Y2goL1xcYlswLTlBLUZhLWZdezN9XFxifFswLTlBLUZhLWZdezZ9XFxiL2cpO1xuXG4gIGlmIChjb2xvclZhbHVlc0FycmF5KSB7XG4gICAgY29sb3JWYWx1ZXNBcnJheSA9IGNvbG9yVmFsdWVzQXJyYXkubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBsZXQgbmV3SXRlbSA9IGl0ZW0udG9TdHJpbmcoKS5zcGxpdCgnJyk7XG5cbiAgICAgICAgbmV3SXRlbSA9IG5ld0l0ZW0ucmVkdWNlKChhY2M6IGFueSwgaXQ6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhY2MgKyBpdCArIGl0O1xuICAgICAgICB9LCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yVmFsdWVzQXJyYXk7XG59O1xuXG5jb25zdCBjYWxjdWxhdGVTaGFkZXMgPSAoY29sb3JWYWx1ZTogYW55KSA9PiB7XG4gIHJldHVybiBjYWxjdWxhdGUoY29sb3JWYWx1ZSwgcmdiU2hhZGUpLmNvbmNhdCgnMDAwMDAwJyk7XG59O1xuXG5jb25zdCBjYWxjdWxhdGVUaW50cyA9IChjb2xvclZhbHVlOiBhbnkpID0+IHtcbiAgcmV0dXJuIGNhbGN1bGF0ZShjb2xvclZhbHVlLCByZ2JUaW50KS5jb25jYXQoJ2ZmZmZmZicpO1xufTtcblxuY29uc3QgY2FsY3VsYXRlID0gKGNvbG9yVmFsdWU6IGFueSwgc2hhZGVPclRpbnQ6IGFueSkgPT4ge1xuICBjb25zdCBjb2xvciA9IGhleFRvUkdCKGNvbG9yVmFsdWUpO1xuICBjb25zdCBzaGFkZVZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcDsgaSsrKSB7XG4gICAgc2hhZGVWYWx1ZXNbaV0gPSByZ2JUb0hleChzaGFkZU9yVGludChjb2xvciwgaSkpO1xuICB9XG5cbiAgcmV0dXJuIHNoYWRlVmFsdWVzO1xufTtcblxuY29uc3QgcmdiU2hhZGUgPSAocmdiOiBhbnksIGk6IGFueSkgPT4ge1xuICByZXR1cm4geyByZWQ6IHJnYi5yZWQgKiAoMSAtIHBlcmNlbnQgKiBpKSwgZ3JlZW46IHJnYi5ncmVlbiAqICgxIC0gcGVyY2VudCAqIGkpLCBibHVlOiByZ2IuYmx1ZSAqICgxIC0gcGVyY2VudCAqIGkpIH07XG59O1xuY29uc3QgcmdiVGludCA9IChyZ2I6IGFueSwgaTogYW55KSA9PiB7XG4gIHJldHVybiB7IHJlZDogcmdiLnJlZCArICgyNTUgLSByZ2IucmVkKSAqIGkgKiBwZXJjZW50LCBncmVlbjogcmdiLmdyZWVuICsgKDI1NSAtIHJnYi5ncmVlbikgKiBpICogcGVyY2VudCwgYmx1ZTogcmdiLmJsdWUgKyAoMjU1IC0gcmdiLmJsdWUpICogaSAqIHBlcmNlbnQgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZ2JUb0hleCA9IChyZ2I6IGFueSkgPT4ge1xuICByZXR1cm4gaW50VG9IZXgocmdiLnJlZCkgKyBpbnRUb0hleChyZ2IuZ3JlZW4pICsgaW50VG9IZXgocmdiLmJsdWUpO1xufTtcbmNvbnN0IGhleFRvUkdCID0gKGNvbG9yVmFsdWU6IGFueSkgPT4ge1xuICByZXR1cm4geyByZWQ6IHBhcnNlSW50KGNvbG9yVmFsdWUuc3Vic3RyKDAsIDIpLCAxNiksIGdyZWVuOiBwYXJzZUludChjb2xvclZhbHVlLnN1YnN0cigyLCAyKSwgMTYpLCBibHVlOiBwYXJzZUludChjb2xvclZhbHVlLnN1YnN0cig0LCAyKSwgMTYpIH07XG59O1xuY29uc3QgaW50VG9IZXggPSAocmdiaW50OiBhbnkpID0+IHtcbiAgcmV0dXJuIHBhZChNYXRoLm1pbihNYXRoLm1heChNYXRoLnJvdW5kKHJnYmludCksIDApLCAyNTUpLnRvU3RyaW5nKDE2KSwgMik7XG59O1xuXG5jb25zdCBwYWQgPSAobnVtYmVyOiBhbnksIGxlbmd0aDogYW55KSA9PiB7XG4gIGxldCBzdHIgPSAnJyArIG51bWJlcjtcblxuICB3aGlsZSAoc3RyLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIHN0ciA9ICcwJyArIHN0cjtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdENvbG9yRGVmaW5lOiBBcnJheTxzdHJpbmc+ID0gW1xuICAnI0U2MjIyMicsXG4gICcjQjgxQjFCJyxcbiAgJyNFQjRFNEUnLFxuICAnI0Y5NzMxNicsXG4gICcjQzc1QzEyJyxcbiAgJyNGQThGNDUnLFxuICAnI0ZGQjcwMCcsXG4gICcjQ0M5MjAwJyxcbiAgJyNGRkM1MzMnLFxuICAnIzg0Q0MxNicsXG4gICcjNkFBMzEyJyxcbiAgJyM5ZGQ2NDUnLFxuICAnIzAwQkM2MicsXG4gICcjMDBBNzU3JyxcbiAgJyMzM0RBOEEnLFxuICAnIzA2QjZENCcsXG4gICcjMUI1OUM0JyxcbiAgJyM0RThDRjcnLFxuICAnIzBFQTVFOScsXG4gICcjMUI1OUM0JyxcbiAgJyM0RThDRjcnLFxuICAnIzIyNkZGNScsXG4gICcjMUI1OUM0JyxcbiAgJyM0RThDRjcnLFxuICAnIzYzNjZGMScsXG4gICcjNEY1MkMxJyxcbiAgJyM4Mjg1RjQnLFxuICAnIzVCMDRCMycsXG4gICcjNDkwMzhGJyxcbiAgJyM3QzM2QzInLFxuICAnI0Q5NDZFRicsXG4gICcjQUUzOEJGJyxcbiAgJyNFMTZCRjInLFxuICAnI0VDNDg5OScsXG4gICcjQkQzQTdBJyxcbiAgJyNGMDZEQUQnLFxuICAnI0Y0M0Y1RScsXG4gICcjQzMzMjRCJyxcbiAgJyNGNjY1N0UnLFxuICAnIzc1NzM4MCcsXG4gICcjNUU1QzY2JyxcbiAgJyM5MThGOTknLFxuICAnIzIwMjAyMCcsXG4gICcjMUExQTFBJyxcbiAgJyM0RDRENEQnLFxuXTtcblxuZXhwb3J0IGNvbnN0IGdldENvbG9yQnlJZCA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCBoYXNoU3RyaW5nID0gMDtcblxuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIGhhc2hTdHJpbmcgPSAoaGFzaFN0cmluZyA8PCA1KSAtIGhhc2hTdHJpbmcgKyBjaGFyO1xuICAgIGhhc2hTdHJpbmcgPSBoYXNoU3RyaW5nICYgaGFzaFN0cmluZztcbiAgfVxuXG4gIHJldHVybiBsaXN0Q29sb3JEZWZpbmVbTWF0aC5hYnMoaGFzaFN0cmluZykgJSBsaXN0Q29sb3JEZWZpbmUubGVuZ3RoXTtcbn07XG4iXX0=
|